学习如何基于相对活力(Vigor)指数设计交易系统
概述
欢迎阅读我系列中的新篇章,详细学习新的技术工具,并用此工具设计一个简单的交易系统。 它是相对活力指数(RVI)指标,我们将全方位涵盖以下主题:
我们将采用 MQL5(MetaQuotes 语言 5)IDE 来编写我们的代码,并用 MetaTrader 5 交易终端来执行我们的交易系统。 如果您作为初学者想提高自己的编码技能,我建议您尝试应用自己将学到的知识,因为实践非常重要。 如果您不知道如何下载和使用 MetaTrader 5 和 MQL5,您可以阅读上一篇文章中的在 MetaEditor 中编写 MQL5 代码的主题。
所有提到的策略仅用于教学目的,故此,您也许会发现它们需要优化,这很正常,因为本文的主要宗旨;这些简单策略都是为了学习其背后的主要概念。 如此,在实盘账户中运用它们之前,您必须对其进行全面的测试,从而确保它们对您的交易有用。
免责声明:所有信息“按原样”提供仅用于教学目的,并非出于交易目的或建议。 这些信息不能保证任何结果。 如果您选择在您的任何交易账户上使用这些材料,您将自行承担风险,您是唯一的责任人。
相对活力指数(Relative Vigor Index)定义
在本主题中,我们将详细学习什么是相对活力指数(RVI)。 它是一个动量和振荡器技术指标。 通过比较其收盘价与开盘价,该指标衡量趋势的强度。 在上升趋势期间,收盘价高于开盘价,但在下跌趋势期间,收盘价低于开盘价。 除此之外,利用简单移动平均线可将结果进行平滑处理。 根据其性质,该 RVI 指标在趋势市场中的表现优于区间周期。 我们可以发现,该 RVI 的计算类似于随机振荡器,但 RVI 是比较其收盘价与开盘价;而随机振荡器则取收盘价与其在特定周期内的价格范围进行比较。 如果我们想手动计算 RVI,我们可以通过以下步骤来完成:
RVI = (CLOSE - OPEN) / (HIGH - LOW)
其中:
CLOSE = 收盘价
OPEN = 开盘价
HIGH = 最高价
LOW = 最低价
但通常,我们所用的 RVI 显示为计算不同分量的两条线,以下是我们如何计算它们。
1- 第一条线计算:
- 提名人计算:
MovAverage = (CLOSE-OPEN) + 2 * (CLOSE-1 - OPEN-1) + 2 * (CLOSE-2 - OPEN-2) + (CLOSE-3 - OPEN-3)
其中:
CLOSE = 当期收盘价
CLOSE 1, CLOSE 2, CLOSE 3 = 1, 2, 和 3 周期前的收盘价
OPEN = 当期开盘价
OPEN 1, OPEN 2, OPEN 3 = 1, 2, 和 3 周期前的开盘价
- 分母计算:
RangeAverage = (HIGH-LOW) + 2 x (HIGH-1 - LOW-1) + 2 x (HIGH-2 - LOW-2) + (HIGH-3 - LOW-3)
其中:
HIGH = 最后最高价
HIGH, HIGH 2, HIGH 3 = 1, 2, 和 3 周期前的最后最高价
LOW = 最后最低价
LOW 1, LOW 2, LOW 3 = 1, 2, 和 3 周期前的最后最低价
- 计算这些平均值的总和,如下所示:
2- 第二条线计算:
RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3)/6
现在,在学习了如何手工计算该指标后,我们知道了该指标背后的主要概念,但以后我们无需手工这样做,因为在 MetaTrader 5 交易终端中它是内置的,我们需要做的就是从可用指标中选择它。 以下是将其插入图表的方法:
打开 MetaTrader 5 终端时 --> 插入 --> 指标 --> 振荡器 --> 相对活力指数
按下相对活力指数后,我们将看到其参数窗口,如下所示:
1- 确定周期。
2- 确定 RVI 线颜色。
3- 确定 RVI 线样式。
4- 确定 RVI 线宽度。
5- 确定信号线颜色。
6- 确定信号线样式。
7- 确定信号线宽度。
确定所有参数后,我们会发现加载的指标与以下内容相同:
正如我们在上一张图表中所见,我们将 RVI 指标加载到图表上,它有两条线围绕零水平振荡。
相对活力指数策略
在学习了 RVI 背后的主要概念之后,我们将学习如何基于其主要概念在简单策略里运用它。 我需要在这里再次确认的是,请您在实盘账户上运行任何策略之前对其进行严格测试,并确保它适合您的交易并可盈利,因为此处的主要概念仅出于教学目,并共享简单策略,您发现它们也许要经过优化才能正常运作。
- 策略一: RVI 交叉 - 上行趋势:
基于此策略,我们需要在特定条件下在上升趋势期间获得买入和平仓信号。 当 RVI 当期值和 RVI 信号当期值大于零轴时,RVI 当期值大于 RVI 信号当期值,这是一个买入信号。 反之亦然,若 RVI 当期值和 RVI 信号当期值低于零轴时,RVI 当期值低于 RVI 信号当期值,这是一个平仓信号。
简而言之,
RVI 值 > 0 且 RVI 信号值 > 0 且 RVI 值 > RVI 信号值 --> 买入
RVI 值 < 0 且 RVI 信号值 < 0 且 RVI 值 < RVI 信号值 --> 平仓
- 策略二: RVI 交叉 - 下行趋势:
基于此策略,我们需要获得与之前的 RVI 交叉 - 上升趋势策略相反的信号,即我们需要获得做空和回补信号。 当 RVI 当期值和 RVI 信号当期值低于零轴时,与此同时,RVI 当期值低于 RVI 信号当期值,这是一个做空信号。 反之亦然,若 RVI 当期值和 RVI 信号当期值高于零轴时,与此同时,RVI 当期值高于 RVI 信号当期值,这是一个回补信号。
简而言之,
RVI 值 < 0 且 RVI 信号值 < 0 且 RVI 值 < RVI 信号值 --> 做空
RVI 值 > 0 且 RVI 信号值 > 0 且 RVI 值 > RVI 信号值 --> 回补
- 策略三:RVI 和 MA 交叉:
基于此策略,我们需要根据特定条件获取买入和卖出信号,因为我们需要在收盘价大于 100 周期移动平均线的同时得到买入信号,与此同时,当期 RVI 值大于当期 RVI 信号值。 在另一种场景下,我们需要在收盘价低于 100 周期移动平均线时得到卖出信号,与此同时,当期 RVI 值低于当期 RVI 信号值。
简而言之,
收盘价 > 100 周期移动平均线,且 RVI 值 > RVI 信号值 --> 买入
收盘价 < 100 周期移动平均线,且 RVI 值 < RVI 信号值 --> 卖出
相对活力指数策略蓝图
在学习了如何在我们提到的策略里运用 RVI 之后,我们将为每个策略创建一个分步蓝图,来帮助我们顺利创建交易系统。
- 策略一: RVI 交叉 - 上行趋势:
根据此策略,我们需要创建一个交易系统,持续检查以下数值,并在上行趋势期间提供买入和平仓信号:
- 当期 RVI 值
- 当期 RVI 信号值、
- RVI 指标的零轴
如果当期 RVI 值大于零轴,当期 RVI 信号值大于零轴,当期 RVI 值大于当期 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:
- 买入信号
- 相对活力指数值
- RVI 信号值
在另一种场景下,如果当期 RVI 值低于零轴,当期 RVI 信号值低于零轴,当期 RVI 值低于当期 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:
- 平仓信号
- 相对活力指数值
- RVI 信号值
以下是此策略的分步蓝图:
- 策略二: RVI 交叉 - 下行趋势:
根据这个策略,我们需要创建一个交易系统,不断检查前一个策略的相同值,可以在下行趋势中为我们提供做空和回补信号:
- 当期 RVI 值
- 当期 RVI 信号值、
- RVI 指标的零轴
但条件会根据所需的信号,略有不同。 如果当期 RVI 值低于零轴,当期 RVI 信号值同时低于零轴,RVI 值低于 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:
- 做空信号
- 相对活力指数值
- RVI 信号值
另一方面,如果当期 RVI 值高于零轴,则当期 RVI 信号值高于零轴,RVI 值高于 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:
- 回补
- 相对活力指数值
- RVI 信号值
以下是该交易系统的蓝图:
- 策略三:RVI & MA 交叉:
根据此策略,我们需要创建一个交易系统,持续检查以下值来提供买入和卖出信号:
- 收盘格
- 100-周期移动平均 (MA)
- 当期 RVI 值
- 当期 RVI 信号值、
如果收盘价高于 100 周期 MA,且当期 RVI 值高于当期 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:
- 买入信号
- 收盘价
- MA 值
- 相对活力指数值
- RVI 信号值
另一方面,如果收盘价低于 100 周期 MA,且当期 RVI 值低于当期 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:
- 卖出信号
- 收盘价
- MA 值
- 相对活力指数值
- RVI 信号值
以下是此策略的蓝图:
相对活力指数交易系统
学习了如何在简单策略里运用 RVI,我们为每个策略创建了分步蓝图,来帮助我们创建交易系统。 现在,我们将为每个提到的策略创建一个交易系统。 首先,我们将创建一个简单交易系统,将当期 RVI 值作为图表上的注释返回,以下是逐步创建此交易系统的代码。
创建两个 double 数据类型的数组,存储 RVI 和 RVI 信号:
double rviArray[]; double rviSignalArray[];
调用 “ArraySetAsSeries” 函数设置数组排序为 AS_SERIES 标志,并返回一个布尔值 true 或 false:
ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true);
调用 iRVI” 函数,定义并返回 RVI 指标的句柄。 其参数为:
- symbol: 确定品种名称,我们将采用(_Symbol) 即应用当前品种。
- period: 设置可用周期,我们将采用(_period)即应用当前时间帧。
- ma_period: 设置均线周期,我们将采用(10)。
int rviDef = iRVI(_Symbol,_Period,10);
调用 “CopyBuffer” 函数从 RVI 指标的缓冲区获取数据。 其参数为:
- indicator_handle: 我们将采用(rviDef,rviDef)里的预定义指标句柄。
- buffer_num: 确定指标缓冲区编号,我们将采用(0,1)。
- start_pos: 确定起始位置,我们将采用(0,0)。
- count: 确定要复制的数量,我们将采用(3,3)。
- buffer[]: 确定要复制的目标数组,我们将采用(rviArray,rviSignalArray)。
CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray);
调用 “NormalizeDouble” 函数定义 RVI 和 RVI 信号的值,以便返回双精度类型的值。 其参数为:
- value: 确定需规范化的数字。 我们将采用 (rviArray[0], rviSignalArray[0])。
- digits: 确定小数点后的位数。 我们将采用(3)。
double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3);
调用 “Comment” 函数返回当前 RVI 指标的值,作为图表上的注释。
Comment("Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal);
完整代码将如下所示:
//+------------------------------------------------------------------+ //| Simple RVI.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double rviArray[]; double rviSignalArray[]; ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); Comment("Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } //+------------------------------------------------------------------+
编译此代码后,我们可以在导航窗口中找到与以下内容相同的智能系统:
双击智能系统,在交易终端中执行它,我们将找到该智能系统的窗口,如下所示:
勾选“允许算法交易”后,按“确定”,我们会发现智能系统已加载到图表上,如下所示:
现在,我们已准备好获得基于此交易系统生成的信号。 因此,我们将得到与以下内容相同的信号:
正如我们在图表左上角所见,我们得到一条带有当期 RVI 值的注释。
- 策略一: RVI 交叉 - 上行趋势:
以下是基于该策略创建的交易系统的完整代码:
//+------------------------------------------------------------------+ //| RVI Crossover - Uptrend.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double rviArray[]; double rviSignalArray[]; ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Close","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } } //+------------------------------------------------------------------+
代码中的差异。
策略条件:
买入信号的情况
if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
平仓的情况
if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Close","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
编译此代码,并以我们在简单 RVI 交易系统中所提相同的方式,在交易终端执行它之后,我们会发现智能系统加载到图表上,如下所示:
然后,我们可以基于此交易系统得到所需的信号,如下所示:
买入信号情况:
正如我们在左上角的图表上所见,我们收到了含有以下值的信号:
- 买入信号
- 相对活力指数值值
- RVI 信号值
平仓信号情况:
正如我们在左上角的图表上所见,我们收到了含有以下值的信号:
- 收盘价
- 相对活力指数值值
- RVI 信号值
很明显,这个信号符合我们根据所提交易策略,及其在上升趋势中的条件所期望的信号。
- 策略二: RVI 交叉 - 下行趋势:
以下是为此交易策略创建交易系统的完整代码:
//+------------------------------------------------------------------+ //| RVI Crossover - Downtrend.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { double rviArray[]; double rviSignalArray[]; ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Short Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Cover","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } } //+------------------------------------------------------------------+
代码中的差异。
策略条件:
做空信号情况
if(rviVal<0 && rviSignalVal<0 && rviVal<rviSignalVal) { Comment("Short Signal","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
回补情况
if(rviVal>0 && rviSignalVal>0 && rviVal>rviSignalVal) { Comment("Cover","\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
在编译,并按我们之前学到的相同方式执行代码之后,我们会发现智能系统加载到图表上,内容如下:
现在,我们已准备好接收基于此策略和交易系统的信号。 以下是来自测试示例的信号:
做空信号情况:
正如我们在左上角的图表上所见,我们收到了含有以下值的信号:
- 做空信号
- 相对活力指数值值
- RVI 信号值
回补情况:
我们所见,我们得到一个含有以下值的信号:
- 回补
- 相对活力指数值值
- RVI 信号值
现在,我们创建了一个基于 RVI 交叉 - 下行趋势策略的交易系统,以便在下行趋势期间生成信号。
- 策略三:RVI & MA 交叉:
以下是为此交易策略创建交易系统的完整代码:
//+------------------------------------------------------------------+ //| RVI & MA Crossover.mq5 | //| Copyright 2022, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2022, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ void OnTick() { MqlRates pArray[]; double maArray[]; double rviArray[]; double rviSignalArray[]; int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(maArray,true); ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true); int rviDef = iRVI(_Symbol,_Period,10); int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE); CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); CopyBuffer(maDef,0,0,3,maArray); double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); double maVal = NormalizeDouble(maArray[0],3); if(pArray[0].close>maVal && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } if(pArray[0].close<maVal && rviVal<rviSignalVal) { Comment("Sell Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); } } //+------------------------------------------------------------------+
代码中的差异。
创建四个数组(pArray,maArray,rviArray,rviSignalArray)。 我们为提到的数组定义 double 数据类型,除了 pArray,我们将其定义为 MqlRates 数据结构,该结构存储有关价格、交易量和点差的信息。
MqlRates pArray[]; double maArray[]; double rviArray[]; double rviSignalArray[];
调用 “ArraySetAsSeries” 函数,为数组设置 AS_SERIES 标志,并返回一个布尔值 true 或 false。 调用 “CopyRates” 函数定义数据,获取 MqlRates 结构的历史数据,其参数为:
- symbol_name: 确定品种名称,我们将采用 _Symbol 即应用当前品种。
- timeframe: 确定周期,我们将采用 _Period 即应用当前周期。
- start_pos: 确定起始位置,我们将采用(0)。
- count: 确定要复制的数据数量,我们将采用(1)。
- rates_array[]: 确定要复制的目标数组,我们将采用 pArray。
int Data=CopyRates(_Symbol,_Period,0,1,pArray); ArraySetAsSeries(maArray,true); ArraySetAsSeries(rviArray,true); ArraySetAsSeries(rviSignalArray,true);
如我们提到的相同,调用 iRVI 函数定义 RVI,并调用 iMA 函数定义移动平均线,返回移动平均线指标的句柄,其参数为:
- symbol: 确定品种名称,我们将采用(_Symbol)
- period: 确定时间帧的周期,我们将采用(_Period)
- ma_period: 确定移动平均线的周期,我们将采用 100
- ma_shift: 确定水平偏移,我们将采用(0)
- ma_method: 确定移动平均线的类型,我们将采用指数型 MA
- applied_price: 确定价格类型,我们将采用收盘价
int rviDef = iRVI(_Symbol,_Period,10); int maDef = iMA(_Symbol,_Period,100,0,MODE_EMA,PRICE_CLOSE);
调用 “CopyBuffer” 函数从 RVI 和 MA 指标的缓冲区获取数据。
CopyBuffer(rviDef,0,0,3,rviArray); CopyBuffer(rviDef,1,0,3,rviSignalArray); CopyBuffer(maDef,0,0,3,maArray);
调用 NormalizeDouble 函数定义 RVI、RVI 信号和 MA 值的常规化数值。
double rviVal = NormalizeDouble(rviArray[0],3); double rviSignalVal = NormalizeDouble(rviSignalArray[0],3); double maVal = NormalizeDouble(maArray[0],3);
策略的条件。
买入信号的情况
if(pArray[0].close>maVal && rviVal>rviSignalVal) { Comment("Buy Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
卖出信号情况
if(pArray[0].close<maVal && rviVal<rviSignalVal) { Comment("Sell Signal","\n", "Closing price is ",pArray[0].close,"\n", "MA Value is ",maVal,"\n", "Relative Vigor Index Value is ",rviVal,"\n", "RVI Signal Value is ",rviSignalVal); }
编译完这段代码,并在终端中执行智能系统之后,我们会发现智能系统附加到图表上,如下所示:
现在,我们可以基于此交易系统获得生成的信号,与以下测试示例相同。
买入信号情况:
正如我们在左上角的上一张图表中所见,我们得到一条含有以下值的信号:
- 买入信号
- 收盘价
- MA 值
- 相对活力指数值
- RVI 信号值
卖出信号情况:
我们得到一条含有以下值的信号:
- 卖出信号
- 收盘价
- MA 值
- 相对活力指数值
- RVI 信号值
现在,我们已为提到的每个策略创建了一个交易系统,并根据其条件自动生成信号。
结束语
在我们通阅了本文前面的主题之后,假设我们已详细学习该指标,并深入理解。 我们学到了它是什么,它测量什么,以及如何手工计算它,从而明白 RVI 指标背后的主要概念。 我们在三个简单策略里学会了如何运用它,它们是:
- RVI 交叉 - 上行趋势: 在上行趋势期间生成买入和平仓信号。
- RVI 交叉 - 下行趋势:在下行趋势期间生成做空和回补信号。
- RVI & MA 交叉:基于特定的交叉技术生成买入和卖出信号。
我们为提到的每个策略设计了一个分步蓝图,来帮助我们顺利轻松地为它们创建交易系统。 我们已为上述每个策略创建了一个交易系统,如此可在 MetaTrader 5 中执行它们后自动生成信号。
我希望您能尝试应用自己所学的知识,如此这般可从本文中获得最大收益,并开发您的编程技能。 我还希望您发现这篇文章对您改善交易结果有用,并获得与文章主题或任何相关主题相关的有用见解。 如果您想阅读更多类似的文章,并从中学习如何基于最流行的技术指标设计交易系统,您可以阅读我在本系列中的其它文章。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/11425