English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
学习如何基于相对活力(Vigor)指数设计交易系统

学习如何基于相对活力(Vigor)指数设计交易系统

MetaTrader 5交易 | 11 一月 2023, 09:32
981 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

欢迎阅读我系列中的新篇章,详细学习新的技术工具,并用此工具设计一个简单的交易系统。 它是相对活力指数(RVI)指标,我们将全方位涵盖以下主题:

  1. 相对活力指数(Relative Vigor Index)定义
  2. 相对活力指数策略
  3. 相对活力指数策略蓝图
  4. 相对活力指数交易系统
  5. 结束语

我们将采用 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 周期前的最后最低价

  • 计算这些平均值的总和,如下所示:

RVI 均化

2- 第二条线计算:

RVIsignal = (RVIaverage + 2 * RVIaverage-1 + 2 * RVIaverage-2 + RVIaverage-3)/6

现在,在学习了如何手工计算该指标后,我们知道了该指标背后的主要概念,但以后我们无需手工这样做,因为在 MetaTrader 5 交易终端中它是内置的,我们需要做的就是从可用指标中选择它。 以下是将其插入图表的方法:

打开 MetaTrader 5 终端时 --> 插入 --> 指标 --> 振荡器 --> 相对活力指数

RVI 插入

按下相对活力指数后,我们将看到其参数窗口,如下所示:

RVI 参数

1- 确定周期。

2- 确定 RVI 线颜色。

3- 确定 RVI 线样式。

4- 确定 RVI 线宽度。

5- 确定信号线颜色。

6- 确定信号线样式。

7- 确定信号线宽度。

确定所有参数后,我们会发现加载的指标与以下内容相同:

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 交叉 - 下行趋势:

基于此策略,我们需要获得与之前的 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 信号值

以下是该交易系统的蓝图:

RVI 交叉 - 下行趋势蓝图

  • 策略三:RVI & MA 交叉:

根据此策略,我们需要创建一个交易系统,持续检查以下值来提供买入和卖出信号:

  • 收盘格
  • 100-周期移动平均 (MA)
  • 当期 RVI 值
  • 当期 RVI 信号值、

如果收盘价高于 100 周期 MA,且当期 RVI 值高于当期 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:

  • 买入信号
  • 收盘价
  • MA 值
  • 相对活力指数值
  • RVI 信号值

另一方面,如果收盘价低于 100 周期 MA,且当期 RVI 值低于当期 RVI 信号值,我们要求交易系统返回以下值作为图表上的注释:

  • 卖出信号
  • 收盘价
  • MA 值
  • 相对活力指数值
  • RVI 信号值

以下是此策略的蓝图:

 RVI, MA 交叉蓝图

相对活力指数交易系统

学习了如何在简单策略里运用 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 nav

双击智能系统,在交易终端中执行它,我们将找到该智能系统的窗口,如下所示:

简单 RVI 窗口

勾选“允许算法交易”后,按“确定”,我们会发现智能系统已加载到图表上,如下所示:

 简单 RVI 加载

现在,我们已准备好获得基于此交易系统生成的信号。 因此,我们将得到与以下内容相同的信号:

简单 RVI 信号

正如我们在图表左上角所见,我们得到一条带有当期 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 交叉 - 上行趋势 - 平仓信号

正如我们在左上角的图表上所见,我们收到了含有以下值的信号:

  • 收盘价
  • 相对活力指数值值
  • 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 交叉 - 下行趋势 - 回补信号

我们所见,我们得到一个含有以下值的信号:

  • 回补
  • 相对活力指数值值
  • 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);
     }

编译完这段代码,并在终端中执行智能系统之后,我们会发现智能系统附加到图表上,如下所示:

 RVI, MA 交叉加载

现在,我们可以基于此交易系统获得生成的信号,与以下测试示例相同。

买入信号情况:

 RVI, MA 交叉 - 买入信号

正如我们在左上角的上一张图表中所见,我们得到一条含有以下值的信号:

  • 买入信号
  • 收盘价
  • MA 值
  • 相对活力指数值
  • RVI 信号值

卖出信号情况:

RVI, MA 交叉 - 做空信号

我们得到一条含有以下值的信号:

  • 卖出信号
  • 收盘价
  • MA 值
  • 相对活力指数值
  • RVI 信号值

现在,我们已为提到的每个策略创建了一个交易系统,并根据其条件自动生成信号。


结束语

在我们通阅了本文前面的主题之后,假设我们已详细学习该指标,并深入理解。 我们学到了它是什么,它测量什么,以及如何手工计算它,从而明白 RVI 指标背后的主要概念。 我们在三个简单策略里学会了如何运用它,它们是:

  • RVI 交叉 - 上行趋势: 在上行趋势期间生成买入和平仓信号。
  • RVI 交叉 - 下行趋势:在下行趋势期间生成做空和回补信号。
  • RVI & MA 交叉:基于特定的交叉技术生成买入和卖出信号。

我们为提到的每个策略设计了一个分步蓝图,来帮助我们顺利轻松地为它们创建交易系统。 我们已为上述每个策略创建了一个交易系统,如此可在 MetaTrader 5 中执行它们后自动生成信号。

我希望您能尝试应用自己所学的知识,如此这般可从本文中获得最大收益,并开发您的编程技能。 我还希望您发现这篇文章对您改善交易结果有用,并获得与文章主题或任何相关主题相关的有用见解。 如果您想阅读更多类似的文章,并从中学习如何基于最流行的技术指标设计交易系统,您可以阅读我在本系列中的其它文章。

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/11425

DoEasy. 控件 (第 18 部分): TabControl 中滚动选项卡的功能 DoEasy. 控件 (第 18 部分): TabControl 中滚动选项卡的功能
在本文中,我将在 TabControl WinForms 对象中放置滚动标题控件的按钮,以防标题栏不适配控件的尺寸。 此外,我还将实现单击裁剪过的选项卡标题时,标题栏的平移。
从头开始开发智能交易系统(第 31 部分):面向未来((IV) 从头开始开发智能交易系统(第 31 部分):面向未来((IV)
我们继续从 EA 中删除单独的部件。 这是本系列中的最后一篇文章。 并且最后要移除的是声音系统。 如果您之前没有关注过这些文章系列,可能会有点困惑。
神经网络变得轻松(第二十九部分):优势扮演者-评价者算法 神经网络变得轻松(第二十九部分):优势扮演者-评价者算法
在本系列的前几篇文章中,我们见识到两种增强的学习算法。 它们中的每一个都有自己的优点和缺点。 正如在这种情况下经常发生的那样,接下来的思路是将这两种方法合并到一个算法,使用两者间的最佳者。 这将弥补它们每种的短处。 本文将讨论其中一种方法。
从头开始开发智能交易系统(第 30 部分):CHART TRADE 当作指标? 从头开始开发智能交易系统(第 30 部分):CHART TRADE 当作指标?
今天我们将再次用到 Chart Trade,但这回它作为一个图表上的指标,或许也可能不在图表上出现。