MQL5学习之RSI指标编写

2024-03-03 03:04
文章标签 学习 编写 指标 mql5 rsi

本文主要是介绍MQL5学习之RSI指标编写,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

研究MT5时发现MQL5这个指标编写功能很强大,应该是碾压国内所有的指标系统,不过这个东西相对复杂很多,比通达信公式不知复杂几许,看起来和C++语法接近,倒是比较适合自己。试着玩一下,发现还是有点难度的。索性记录一下。

学习最快的方式就是拿相对简单的东西七改八改一下,然后看呈现出来的是什么样。

RSI指标是能想到的最简单的指标系统,示例里面有代码,贴出来看看:

//+------------------------------------------------------------------+
//|                                                          RSI.mq5 |
//|                             Copyright 2000-2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2000-2024, MetaQuotes Ltd."
#property link        "https://www.mql5.com"
#property description "Relative Strength Index"
//--- indicator settings
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1 30
#property indicator_level2 70
#property indicator_buffers 3
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  DodgerBlue
//--- input parameters
input int InpPeriodRSI=14; // Period
//--- indicator buffers
double    ExtRSIBuffer[];
double    ExtPosBuffer[];
double    ExtNegBuffer[];int       ExtPeriodRSI;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit(){
//--- check for inputif(InpPeriodRSI<1){ExtPeriodRSI=14;PrintFormat("Incorrect value for input variable InpPeriodRSI = %d. Indicator will use value %d for calculations.",InpPeriodRSI,ExtPeriodRSI);}elseExtPeriodRSI=InpPeriodRSI;
//--- indicator buffers mappingSetIndexBuffer(0,ExtRSIBuffer,INDICATOR_DATA);SetIndexBuffer(1,ExtPosBuffer,INDICATOR_CALCULATIONS);SetIndexBuffer(2,ExtNegBuffer,INDICATOR_CALCULATIONS);
//--- set accuracyIndicatorSetInteger(INDICATOR_DIGITS,2);
//--- sets first bar from what index will be drawnPlotIndexSetInteger(0,PLOT_DRAW_BEGIN,ExtPeriodRSI);
//--- name for DataWindow and indicator subwindow labelIndicatorSetString(INDICATOR_SHORTNAME,"RSI("+string(ExtPeriodRSI)+")");}
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,const int prev_calculated,const int begin,const double &price[]){if(rates_total<=ExtPeriodRSI)return(0);
//--- preliminary calculationsint pos=prev_calculated-1;if(pos<=ExtPeriodRSI){double sum_pos=0.0;double sum_neg=0.0;//--- first RSIPeriod values of the indicator are not calculatedExtRSIBuffer[0]=0.0;ExtPosBuffer[0]=0.0;ExtNegBuffer[0]=0.0;for(int i=1; i<=ExtPeriodRSI; i++){ExtRSIBuffer[i]=0.0;ExtPosBuffer[i]=0.0;ExtNegBuffer[i]=0.0;double diff=price[i]-price[i-1];sum_pos+=(diff>0?diff:0);sum_neg+=(diff<0?-diff:0);}//--- calculate first visible valueExtPosBuffer[ExtPeriodRSI]=sum_pos/ExtPeriodRSI;ExtNegBuffer[ExtPeriodRSI]=sum_neg/ExtPeriodRSI;if(ExtNegBuffer[ExtPeriodRSI]!=0.0)ExtRSIBuffer[ExtPeriodRSI]=100.0-(100.0/(1.0+ExtPosBuffer[ExtPeriodRSI]/ExtNegBuffer[ExtPeriodRSI]));else{if(ExtPosBuffer[ExtPeriodRSI]!=0.0)ExtRSIBuffer[ExtPeriodRSI]=100.0;elseExtRSIBuffer[ExtPeriodRSI]=50.0;}//--- prepare the position value for main calculationpos=ExtPeriodRSI+1;}
//--- the main loop of calculationsfor(int i=pos; i<rates_total && !IsStopped(); i++){double diff=price[i]-price[i-1];ExtPosBuffer[i]=(ExtPosBuffer[i-1]*(ExtPeriodRSI-1)+(diff>0.0?diff:0.0))/ExtPeriodRSI;ExtNegBuffer[i]=(ExtNegBuffer[i-1]*(ExtPeriodRSI-1)+(diff<0.0?-diff:0.0))/ExtPeriodRSI;if(ExtNegBuffer[i]!=0.0)ExtRSIBuffer[i]=100.0-100.0/(1+ExtPosBuffer[i]/ExtNegBuffer[i]);else{if(ExtPosBuffer[i]!=0.0)ExtRSIBuffer[i]=100.0;elseExtRSIBuffer[i]=50.0;}}
//--- OnCalculate done. Return new prev_calculated.return(rates_total);}
//+------------------------------------------------------------------+

嗯,这个代码量有点大,看起来挺头晕的,不过好在只有两个函数,一个为void OnInit(), 看起来像是初始化的地方,一个为int OnCalculate()看起来就是指标计算的地方。

首先要明确我们想针对RSI搞清楚几样:怎样画线,数据从哪里来,怎样显示计算的指标值。这几个搞清楚了,再学其它的应该就很容易了。

首先看:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
  PrintFormat("rates_total=%d, prev_calculated=%d, begin=%d, price[%d]=%f",
          rates_total,prev_calculated, begin, rates_total-1, price[rates_total-1]);

很明显,rates_total表示为K线总数量,price[rates_total-1])表示的为最后一根K线的收盘价

查看RSI定义,整理出公式如下:

//+------------------------------------------------------------------+//| Relative Strength Index                                          |// 设每天向上变动为U,向下变动为D。// 在价格上升的日子:// U = 是日收市价 - 昨日收市价;D = 0// 在价格下跌的日子:// U = 0;D = 昨日收市价 - 是日收市价// 任何情况下,U及D皆不可能为负数;若两天价格相同,则U及D皆等于零。)// RS=EMA(U, n)/EMA(D, n)// RSI=(100-100/(1+RS))//+------------------------------------------------------------------+

由此可见ExtRSIBuffer即为计算所得的RSI值

不过一直没搞清楚指标是怎么画出来的,即圈中所标的蓝线:

虽然颜色是由#property indicator_color1  C'45,30,255'进行改变弄清楚了,看来得研究一下macd,那个画的多一些才能搞明折

这篇关于MQL5学习之RSI指标编写的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/768255

相关文章

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

使用Java编写一个字符脱敏工具类

《使用Java编写一个字符脱敏工具类》这篇文章主要为大家详细介绍了如何使用Java编写一个字符脱敏工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、字符脱敏工具类2、测试工具类3、测试结果1、字符脱敏工具类import lombok.extern.slf4j.Slf4j

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

基于.NET编写工具类解决JSON乱码问题

《基于.NET编写工具类解决JSON乱码问题》在开发过程中,我们经常会遇到JSON数据处理的问题,尤其是在数据传输和解析过程中,很容易出现编码错误导致的乱码问题,下面我们就来编写一个.NET工具类来解... 目录问题背景核心原理工具类实现使用示例总结在开发过程中,我们经常会遇到jsON数据处理的问题,尤其是

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的