English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
学习如何基于柴金(Chaikin)振荡器设计交易系统

学习如何基于柴金(Chaikin)振荡器设计交易系统

MetaTrader 5交易 | 8 十一月 2022, 16:14
1 167 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

这是一篇新文章,是我们关于学习如何基于最流行的技术指标设计交易系统系列文章的完结篇,我们从中学习如何利用新的技术指标(即柴金振荡器)来做到这一点。

我们通读以下主题详细了解此技术指标:

  1. 柴金(Chaikin)振荡器定义
  2. 柴金(Chaikin)振荡器策略
  3. 柴金(Chaikin)振荡器策略蓝图
  4. 柴金(Chaikin)振荡器交易系统
  5. 结束语

通读以前的主题,我们将逐步学习如何基于柴金振荡器创建和设计交易系统。 我们将学习什么是柴金振荡器指标,它测量什么,我们如何手工计算它,从而了解其背后的主要概念,而且我们还可通过柴金振荡器定义主题学习所有内容。 我们通过柴金振荡器策略主题,学习如何基于其背后的基本概念在简单策略里使用该指标。 之后,我们将为每个提到的策略创建一个分步蓝图,来帮助我们基于柴金振荡器策略蓝图的主题平滑地为每个策略创建一个交易系统。 之后,我们将为每个提到的策略创建一个可执行的交易系统,并依靠 MetaTrader 5 自动获取信号,这部分可通读柴金振荡器交易系统主题。

我们将采用 MQL5(MetaQuotes 语言)编写交易策略代码,从而能在 MetaTrader 5 中执行它,能够自动为我们提供信号。 如果您想知道如何下载和使用 MetaTrader 5,并用 MQL5 编写代码,您可以阅读上一篇文章中的在 MetaEditor 中编写 MQL5 的主题。

免责声明:所有信息“按原样”提供仅用于教学目的,并非出于交易目的或建议。 这些信息不能保证任何结果。 如果您选择在您的任何交易账户上使用这些材料,您将自行承担风险,您是唯一的责任人。

现在,我们从基本主题开始阅览文章。


柴金(Chaikin)振荡器定义

在这一部分中,我们将详细学习柴金振荡器指标,由此我们会学到指标背后的基本概念要怎样来理解。 柴金振荡器指标是一个动量指标,它由 Marc Chaikin 创建,很明显该指标的名称是冠以其创建者之名。 它利用移动平均收敛/离散(MACD) 公式衡量累积分布线的动量。 通过测量这种动量,我们就能深入了解累积分布线的方向变化。

如果我们打算手工计算柴金振荡器,来理解更多其背后的概念,我们可以经由以下步骤来做到:

  1. 计算资金流乘数 = ((收盘价 - 最低价) - (最高价 - 收盘价)) / (最高价 - 最低价)
  2. 计算资金流量 = 资金流乘数 * 交易量
  3. 计算累积分布线(ADL)= 前期 ADL + 当期资金流量
  4. 柴金振荡器 =(ADL 的 3 周期 EMA)-(ADL 的 10 周期 EMA)

如今,我们不需要手工计算指标,因为您可以简单地将其插入图表中,因为它已内置在 MetaTrader 5 之中。 您所有要做的只是从可用指标中选择它,但此处我们学习了如何做到这一点,并学习其背后的主要概念。

我们可以在 MetaTrader 5 里点击插入选项卡 --> 指标 --> 振荡器 --> 柴金振荡器,将其插入到图表之中。 下图显示了这些步骤:

柴金振荡器插入

选择柴金振荡器指标之后,我们会发现与以下内容相同的指标参数窗口:

 柴金振荡器参数

1- 确定交易量的类型。

2- 确定快速移动平均线的周期。

3- 确定慢速移动平均线的周期。

4- 确定移动平均线的类型。

5- 确定指标线的颜色。

6- 确定指标线的样式。

7- 确定指标线宽度。

确定前面的参数并按“确定”后,我们会发现指标入到图表之中,如下所示:

柴金振荡器已插入

如我们所见,该指标插入到上一张图片的下部,它表明指标线在零轴上方和下方振荡。


柴金(Chaikin)振荡器策略

在本主题中, 我们将学习基于柴金振荡器指标的主要概念,并加以运用的简单策略。 当我们思考有关如何利用某种技术工具来强化和增强我们的决策时,这将是一种很好的方式,这也是运用技术分析的特征之一。 我还需要在此确认的是,您的真实账户上使用任何策略之前,一定要对其进行测试,从而确保它适合您,特别是如果您使用像本文这样以教学为目标的策略。

  • 策略一: 柴金振荡器交叉:

根据此策略,我们需要依据当前柴金指标值与零轴之间的交叉获得买入或卖出信号。 若当前柴金值高于零轴时,则这是一个买入信号。 在另一种情况下,若当前柴金值低于零轴时,则这是一个卖出信号。

简而言之,

当期柴金值 > 零轴 --> 买入信号。

当期柴金值 < 零轴 --> 卖出信号。

  • 策略二: 柴金振荡器走势:

根据此策略,我们需要依据柴金指标最后的两个值获得曲线走势的信号。 若当期柴金值大于前期值时,这将是上升走势的信号。 反之亦然,若当期柴金值低于前期值时,这将是下降走势的信号。

简单,

当期柴金值 > 前期柴金值 --> 上升走势。

当期柴金值 < 前期柴金值 --> 下降走势。

  • 策略三: 柴金振荡器 - 上行趋势:

基于此策略,在上升趋势期间,我们需要评估当期和前期的高值,以及当期和前期柴金值,并基于其结果来了解是否存在强劲的上升走势,或是看跌背离。 如果当期高点大于前期高点,并且当期柴金大于前期柴金值,则这是上升趋势期间强劲上升的信号。 如果当期高点大于前期高点,并且当期柴金低于前期柴金值,则这是看跌背离的信号。

当期高点 > 前期高点,且当期柴金 > 前期柴金 -->上升趋势中的强劲上升走势。

当期高点 > 前期高点,且当期柴金 < 前期柴金值 --> 看跌背离。

  • 策略四: 柴金振荡器 - 下行趋势:

基于此策略,在下跌趋势期间,我们需要评估当期和前期的低值,以及当期和前期柴金值,并基于其结果来了解是否存在强劲的下跌走势,或是看涨背离。 如果当期低点低于前期低点,并且当期柴金低于前期柴金值,则这是下跌趋势期间强劲下跌的信号。 如果当期低点低于前期低点,并且当期柴金高于前期柴金值,则这是看涨背离的信号。

当期低点 < 前期低点,且当期柴金 < 前期柴金 --> 下跌趋势中的强劲下跌走势。

当期低点 < 前期低点,且当期柴金 > 前期柴金值 --> 看涨背离。


柴金(Chaikin)振荡器策略蓝图

在本主题中,我们将设计一个分步蓝图,以此帮助我们为提到的每个策略创建交易系统,我相信这一步非常重要,因为它可以归纳我们的思路,并以这种实现我们的目标。 现在,我们开始照此执行。

  • 策略一: 柴金振荡器交叉:

根据此策略,我们需要创建一个交易系统,一旦满足特定条件,该系统就会在图表上返回特定注释。 我们要求交易系统在每次逐笔跳价时检查柴金振荡器值,当该值高于零轴时,我们要求交易系统在图表上显示含有买入信号的注释,和当前柴金值,每个值都在单独的一行中。 而在另一种情况下,当柴金值低于零轴时,我们要求交易系统返回含有卖出信号的注释,和当前柴金值,每个值都在单独的一行中。

以下是此蓝图的示意图。

柴金振荡器交叉蓝图

  • 策略二: 柴金振荡器走势:

基于此策略,我们要求交易系统检查两个值,并在每次跳价时判断哪个值更大。 这两个值是当期和前期的柴金振荡器值。 若当期值大于前期值时,我们要求交易系统返回一条注释:柴金振荡器正在上升,当前柴金值,前期柴金值,它们都在单独的一行中。 若当期值低于前期值时,我们要求交易系统返回一条注释:柴金振荡器正在下降,当期柴金值,前期柴金值。

以下是该策略的蓝图示意图。

柴金振荡器走势蓝图

  • 策略三: 柴金振荡器 - 上行趋势:

根据此策略,我们要求交易系统在每次跳价中检查四个值,它们是当期高点、前期高点、当期柴金值和前期柴金值。 在检查这些数值后,我们要求交易系统来判断当期高点和前期高点之间,以及当期和前期柴金值之间哪一个更大。 若当期高点大于前期高点,且当期柴金值大于前期柴金值时,我们要求交易系统在上升趋势中返回含有强烈上升走势的注释,当期高值、前期高值、当期柴金值、和前期柴金值,每个值都在单独的一行中。 在另一种场景下,若当期高点大于前期高点,且当期柴金值低于前期柴金值时,我们要求交易系统在图表上返回一条注释,含有看跌背离、当期高值、前期高值、当期柴金值、前期柴金值,每个值都在单独的一行中。

以下是该策略蓝图的示意图。

柴金振荡器蓝图

  • 策略四: 柴金振荡器 - 下行趋势:

基于此策略,我们要创建一个交易系统,每次跳价连续检查四个数值,这些数值是当期低值、前期低值、当期柴金值和前期柴金值,然后判断当期低值是否低于前期低值,当期柴金值是否低于前期柴金值, 我们要求交易系统在图表上返回含有强烈下跌走势的注释,当期低值、前期低值、当期柴金值和前期柴金值,每个值都在单独的一行中。 在另一种场景下,若当期低点低于前期低点,且当期柴金值高于前期柴金值时,我们要求交易系统在图表上返回一条注释,含有看涨背离、当期低值、前期低值、当期柴金值、前期柴金值,每个值都在单独的一行中。

以下是此蓝图的示意图。

柴金振荡器 - 下跌趋势蓝图

柴金振荡器正在上升

柴金(Chaikin)振荡器交易系统

在这一部分中,我们将学习如何以 MQL5 编程或编码将上述策略转换为交易系统,从而自动操作。 因此,现在我们就着手编写一个简单的交易系统,能自动将图表上的柴金振荡器当期值显示在注释里,我们还将利用此交易系统作为我们上述策略的基础。 如下创建此交易系统。

  • 以 “double” 函数创建柴金振荡器数组,其可表示小数值。 “double” 型是浮点型之一,也是数据类型之一。
double chaiArray[];
  • 调用 “ArraySetAsSeries” 函数为所创建数组设置排列顺序,即从当前数据开始,该函数完成后返回布尔值。 "ArraySetAsSeries" 参数是:
    • 一个数组[]
    • 标志
ArraySetAsSeries(chaiArray,true);
  • 创建一个 chaiDef 整数型变量,调用 “iChaikin” 函数定义柴金振荡器句柄。 此函数返回柴金振荡器指标的句柄。 该函数的参数是:
    • symbol, 设置交易品种名称,默认我们指定应用当前图表的 “_Symbol”。
    • period, 设置时间帧,默认我们指定应用当前时间帧的 “_Period”。
    • fast_ma_period, 设置快速移动的平均长度,我们将默认值设置为 3。
    • slow_ma_period,  设置慢速移动的平均长度,我们将默认值设置为 10。
    • ma_method, 设置移动平均线的类型,我们将使采用指数移动平均线(MODE_EMA)。
    • applied_volume, 设置交易量的类型,我们将采用跳价交易量 (VOLUME_TICK)。
int chaiDef = iChaikin(_Symbol,_Period,3,10,MODE_EMA,VOLUME_TICK);
  • 调用 “CopyBuffer” 函数将价格数据复制到 chaiArray 数组当中,该函数返回成功复制的数据计数,如果出现错误,则返回 -1。 该函数的参数是:
    • indicator_handle, 我们将指定指标定义 “chaiDef”。
    • buffer_num, 设置指标缓冲区编号,我们设置为 0。
    • start_pos, 设置起始位置,我们设置为 0。
    • count, 设置数据复制的数量,我们设置为 3。
    • buffer[], 设定要复制的目标数组,我们将确定 “chaiArray”。
CopyBuffer(chaiDef,0,0,3,chaiArray);
  • 创建 “chaiVal” 双精度型变量后,调用 “NormalizeDouble” 函数获取柴金振荡器值。 "Normalizedouble" 的参数是:
    • value, 确定常规化数字,我们将指定 “chaiArray[0]”,我们将使用 0 作为当前值返回
    • digits, 确定小数点后的保留位数,我们确定为 6。
int chaiVal = NormalizeDouble(chaiArray[0],6);
  • 调用 Comment 函数将当前柴金振荡器值输出到图表上的注释。
Comment("Chaikin Oscillator Value is ",chaiVal);

以下是创建这个简单交易系统的完整代码。

//+------------------------------------------------------------------+
//|                                    Simple Chaikin Oscillator.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 chaiArray[];

   ArraySetAsSeries(chaiArray,true);

   int chaiDef = iChaikin(_Symbol,_Period,3,10,MODE_EMA,VOLUME_TICK);

   CopyBuffer(chaiDef,0,0,3,chaiArray);

   int chaiVal = NormalizeDouble(chaiArray[0],6);

   Comment("Chaikin Oscillator Value is ",chaiVal);

  }
//+------------------------------------------------------------------+

这段代码编译完成之后,我们可在智能系统文件夹的导航器窗口中找到该程序的文件,如下所示。

Nav

当我们需要执行此智能系统时,我们将其拖放到图表上,然后将出现与以下内容相同的程序参数窗口。

简单柴金振荡器窗口

按“确定”后,智能系统将加载到图表上,如下所示。

简单柴金振荡器加载

正如我们在上一张图表的右上角看到的,智能系统被加载到图表上。 然后,我们可以找到生成的信号,如下所示。

柴金振荡器信号

正如我们在前面的测试示例中所看到的,在图表的左上角,我们得到一条含有当前期柴金振荡器值的注释。 如果我们想确保生成的值与 MetaTrader5 中内置指标生成的值相同,我们可以在加载智能系统以后,再插入一个参数相同的内置指标,如此我们就能对比两者的值,如下所示。

柴金振荡器的相同信号

正如我们在图表的右上角看到的,智能系统加载到图表上,在左上角,我们能找到智能系统生成的数值,该值与下面窗口中插入的指标的值相同。

  • 策略一: 柴金振荡器交叉:

以下是基于此策略所创建交易系统的完整代码。

//+------------------------------------------------------------------+
//|                                 Chaikin Oscillator 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()
  {
   double chaiArray[];

   ArraySetAsSeries(chaiArray,true);

   int chaiDef = iChaikin(_Symbol,_Period,3,10,MODE_EMA,VOLUME_TICK);

   CopyBuffer(chaiDef,0,0,3,chaiArray);

   int chaiVal = NormalizeDouble(chaiArray[0],6);
   
   if(chaiVal>0)
   {
   Comment("Buy signal","\n","Chaikin Oscillator Value is ",chaiVal);
   }

   if(chaiVal<0)
   {
   Comment("Sell signal","\n","Chaikin Oscillator Value is ",chaiVal);
   }

  }
//+------------------------------------------------------------------+

此代码中的区别:

柴金振荡器交叉的条件:

若为买入信号的情况,

   if(chaiVal>0)
   {
   Comment("Buy signal","\n","Chaikin Oscillator Value is ",chaiVal);
   }

若为卖出信号的情况,

   if(chaiVal<0)
   {
   Comment("Sell signal","\n","Chaikin Oscillator Value is ",chaiVal);
   }

编译此代码后,我们将在导航器窗口中找到与以下内容相同的智能系统文件。

Nav1

将其拖放到图表上后,智能系统的窗口将如下所示:

柴金振荡器交叉窗口

按“确定”后,智能系统将加载到图表上,如下所示:

柴金振荡器交叉加载

正如我们在右上角看到的,柴金振荡器交叉智能系统加载到图表上,现在我们可以看到依据此策略生成的信号。 下面是一个示例。

若为买入信号的情况,

柴金振荡器交叉 - 买入信号

正如我们在图表的左上角看到的,买入信号是在柴金振荡器值上穿零轴时产生的。

若为卖出信号的情况,

柴金振荡器交叉 - 卖出信号

正如我们在图表的左上角看到的,买入信号是在柴金振荡器值下穿零轴时产生的。

  • 策略二: 柴金振荡器走势:

以下是基于此策略所创建交易系统的完整代码。

//+------------------------------------------------------------------+
//|                                  Chaikin Oscillator Movement.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 chaiArray[];

   ArraySetAsSeries(chaiArray,true);

   int chaiDef = iChaikin(_Symbol,_Period,3,10,MODE_EMA,VOLUME_TICK);

   CopyBuffer(chaiDef,0,0,3,chaiArray);

   int chaiCurrentVal = NormalizeDouble(chaiArray[0],6);
   int chaiPrevVal = NormalizeDouble(chaiArray[1],6);

   if(chaiCurrentVal>chaiPrevVal)
     {
      Comment("Chaikin Oscillator is rising","\n",
              "Chaikin Oscillator Cuurent Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

   if(chaiCurrentVal<chaiPrevVal)
     {
      Comment("Chaikin Oscillator is declining","\n",
              "Chaikin Oscillator Cuurent Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

  }
//+------------------------------------------------------------------+

代码中的差异与以下内容相同:

定义当期和前期的柴金振荡器值。

   int chaiCurrentVal = NormalizeDouble(chaiArray[0],6);
   int chaiPrevVal = NormalizeDouble(chaiArray[1],6);

策略的条件。

在上升的情况下,

   if(chaiCurrentVal>chaiPrevVal)
     {
      Comment("Chaikin Oscillator is rising","\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

在下降的情况下,

   if(chaiCurrentVal<chaiPrevVal)
     {
      Comment("Chaikin Oscillator is declining","\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

编译此代码后,我们可在导航器窗口中找到它,如下所示:

 Nav2

将智能系统拖放到图表上之后,我们找到程序的窗口,如下所示:

柴金振荡器走势窗口

按“确定”后,我们会发现它已加载到图表上,如下所示:

柴金振荡器走势加载

以下是基于此策略生成的信号的示例。

当期数据上升的情况:

柴金振荡器走势 - 当期数据上升信号

前期数据上升的情况:

柴金振荡器走势 - 前期数据上升信号

正如我们在左上角的前面图表中看到的,我们有三行:

  • 柴金振荡器上升
  • 柴金振荡器当期值
  • 柴金振荡器前期值

另一种场景是当期数据下降,

柴金振荡器走势 - 当期数据下降信号

前期数据下降的情况:

柴金振荡器走势 - 前期数据下降信号

正如我们在前幅图表里看到的,在图表左上角我们得到这条注释:

柴金振荡器正在下降

柴金振荡器当期值。

柴金振荡器前期值。

  • 策略三: 柴金振荡器 - 上行趋势:

以下是根据此策略创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                 Chaikin Oscillator - 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 chaiArray[];
   MqlRates priceArray[];

   ArraySetAsSeries(chaiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,priceArray);

   int chaiDef = iChaikin(_Symbol,_Period,3,10,MODE_EMA,VOLUME_TICK);

   CopyBuffer(chaiDef,0,0,3,chaiArray);

   int chaiCurrentVal = NormalizeDouble(chaiArray[0],6);
   int chaiPrevVal = NormalizeDouble(chaiArray[1],6);


   double currentHighVal=NormalizeDouble(priceArray[2].high,6);
   double prevHighVal=NormalizeDouble(priceArray[1].high,6);

   if(currentHighVal>prevHighVal&&chaiCurrentVal>chaiPrevVal)
     {
      Comment("Strong Up Move During The Uptrend","\n",
              "Current High Value is: ",currentHighVal,"\n",
              "Previous High Value is: ",prevHighVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }


   if(currentHighVal>prevHighVal&&chaiCurrentVal<chaiPrevVal)
     {
      Comment("Bearish Divergence","\n",
              "Current High Value is: ",currentHighVal,"\n",
              "Previous High Value is: ",prevHighVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

  }
//+------------------------------------------------------------------+

代码中的差异与以下内容相同:

就如同我们在学习 priceArray 时那样,调用 “MqlRates” 函数为 ChaiArray 创建两个数组,存储有关价格、交易量、和点差的信息。

ArraySetAsSeries(chaiArray,true);
int Data=CopyRates(_Symbol,_Period,0,3,priceArray);

定义当期和前期柴金振荡器的值。

int chaiCurrentVal = NormalizeDouble(chaiArray[0],6);
int chaiPrevVal = NormalizeDouble(chaiArray[1],6);

定义当期和前期高点的值。

double currentHighVal=NormalizeDouble(priceArray[2].high,6);
double prevHighVal=NormalizeDouble(priceArray[1].high,6);

此策略的条件:

在上升趋势期间的强劲走势情况:

   if(currentHighVal>prevHighVal&&chaiCurrentVal>chaiPrevVal)
     {
      Comment("Strong Up Move During The Uptrend","\n",
              "Current High Value is: ",currentHighVal,"\n",
              "Previous High Value is: ",prevHighVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

在看跌背离的情况下:

   if(currentHighVal>prevHighVal&&chaiCurrentVal<chaiPrevVal)
     {
      Comment("Bearish Divergence","\n",
              "Current High Value is: ",currentHighVal,"\n",
              "Previous High Value is: ",prevHighVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

编译此代码后,我们就能在导航器中找到该智能系统,如下所示:

 Nav3

将其拖放到图表上,智能系统的窗口将显示如下:

柴金振荡器 - 上行趋势窗口

按“确定”后,我们会发现智能系统已加载到图表上,如下所示:

柴金振荡器 - 上行趋势加载

以下是基于该交易系统生成的信号示例。

当期数据导致强劲走势情况:

柴金振荡器 - 上行趋势 - 强劲 - 当期数据

前期数据导致强劲走势情况:

柴金振荡器 - 上行趋势 - 强劲 - 前期数据

正如我们在前两幅图表中看到的,我们在图表的左上角有五行注释,它们是:

  •  上升趋势期间的强劲上升走势
  • 当期高点值
  • 前期高点值
  • 当期柴金值
  • 前期柴金值

在另一种场景下,当我们与当前数据出现看跌背离时,我们可以看到这种情况的示例,如下所示:

柴金振荡器 - 上行趋势 - 背离 - 当期数据

前期数据看跌背离的情况:

柴金振荡器 - 上行趋势 - 背离 - 前期数据

正如我们在前两幅图表中看到的,我们有一条包含五行的注释:

看跌背离。

当期高点值。

前期高点值。

当期柴金值。

前期柴金值。

  • 策略四: 柴金振荡器 - 下行趋势:

以下是基于此策略创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                               Chaikin Oscillator - 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 chaiArray[];
   MqlRates priceArray[];

   ArraySetAsSeries(chaiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,priceArray);

   int chaiDef = iChaikin(_Symbol,_Period,3,10,MODE_EMA,VOLUME_TICK);

   CopyBuffer(chaiDef,0,0,3,chaiArray);

   int chaiCurrentVal = NormalizeDouble(chaiArray[0],6);
   int chaiPrevVal = NormalizeDouble(chaiArray[1],6);


   double currentLowVal=NormalizeDouble(priceArray[2].low,6);
   double prevLowVal=NormalizeDouble(priceArray[1].low,6);

   if(currentLowVal<prevLowVal&&chaiCurrentVal<chaiPrevVal)
     {
      Comment("Strong Down Move During The Downtrend","\n",
              "Current Low Value is: ",currentLowVal,"\n",
              "Previous Low Value is: ",prevLowVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }


   if(currentLowVal<prevLowVal&&chaiCurrentVal>chaiPrevVal)
     {
      Comment("Bullish Divergence","\n",
              "Current Low Value is: ",currentLowVal,"\n",
              "Previous Low Value is: ",prevLowVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

  }
//+------------------------------------------------------------------+

代码中的不同之处在于此策略的条件:

在下跌趋势期间的强劲下行走势情况:

   if(currentLowVal<prevLowVal&&chaiCurrentVal<chaiPrevVal)
     {
      Comment("Strong Down Move During The Downtrend","\n",
              "Current Low Value is: ",currentLowVal,"\n",
              "Previous Low Value is: ",prevLowVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

在看涨背离的情况下:

   if(currentLowVal<prevLowVal&&chaiCurrentVal>chaiPrevVal)
     {
      Comment("Bullish Divergence","\n",
              "Current Low Value is: ",currentLowVal,"\n",
              "Previous Low Value is: ",prevLowVal,"\n",
              "Chaikin Oscillator Current Value is ",chaiCurrentVal,"\n",
              "Chaikin Oscillator Previous Value is ",chaiPrevVal);
     }

编译此代码后,我们将在导航器窗口中找到此策略的智能系统,如下所示:

 Nav4

把该智能系统拖拽到图表上,我们就能找到其窗口,如下所示:

柴金振荡器 - 下跌趋势窗口

按“确定”后,我们会发现智能系统已加载到图表上,如下所示:

柴金振荡器 - 下跌趋势加载

以下是基于此策略在测试时生成的信号示例。

当期数据在下跌趋势期间导致强劲下行走势情况:

柴金振荡器 - 下跌趋势 - 强劲 - 当期数据

前期数据导致强劲下行走势情况:

柴金振荡器 - 下跌趋势 - 强劲 - 前期数据

正如我们在前两幅图表中看到的,我们有一条包含五行的注释:

  • 在下跌趋势期间的强劲下行走势:
  • 当期低点值
  • 前期低点值
  • 当期柴金值
  • 前期柴金值

在另一种看涨背离场景下,我们可以看到生成信号的示例,如下所示:

当期数据导致看涨背离的情况:

柴金振荡器 - 下跌趋势 - 背离 - 当期数据

前期数据导致看涨背离的情况:

柴金振荡器 - 下跌趋势 - 背离 - 前期数据 

正如我们在前两幅图表中看到的,我们有一条包含五行的注释:

  • 看涨背离
  • 当期低点值
  • 前期低点值
  • 当期柴金值
  • 前期柴金值


结束语

在前面的主题之后,我们详细学习了柴金振荡器。 我们学习到它是什么,它衡量什么,如何手工计算它,以及如何使用和插入内置的 MetaTrader 5 指标。 我们还学习了如何简单地基于该指标的主要概念运用它,正因我们已学到不止一种策略:

  • 柴金振荡器交叉:基于零轴交叉获取买入和卖出信号。
  • 柴金振荡器走势: 获取信号,通知我们指标线的走势是上升还是下降。
  • 柴金振荡器 - 上升趋势:当我们在上升趋势中有强劲的上升走势,或出现看跌背离时获得信号。
  • 柴金振荡器 - 下跌趋势:当我们在下跌趋势中有强劲的下行走势,或出现看涨背离时获得信号。

我们还为每个策略设计了一个蓝图,来帮助我们为每个策略创建一个交易系统,因为这是组织我们的思路,从而顺利实现目标的非常重要的一步。 我们学习了如何为每个策略创建一个交易系统,以便在 MetaTrader 5 中执行后自动生成信号,从而简化和增强我们的交易,并在节省时间的同时获得更好的结果。

我再次提请您在真实账户上使用任何策略之前,必须确保对其进行测试,因为没有任何策略适合所有人。 如果您需要提高编程技能,我在此重点提示您要亲自应用本文中所学到的知识,因为实践在任何教育过程中都是非常重要的因素。 我希望这篇文章能对您有用,如果您想阅读更多类似的文章,您可以阅读本系列中有关如何基于最流行的技术指标设计交易系统的其它篇章。

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

CCI 指标。 三个变换步骤 CCI 指标。 三个变换步骤
在本文中,我将针对 CCI 进行额外的修改,从而影响该指标的逻辑。 进而,我们就能够在主图表窗口中看到它。
神经网络变得轻松(第二十二部分):递归模型的无监督学习 神经网络变得轻松(第二十二部分):递归模型的无监督学习
我们继续研究无监督学习算法。 这次我建议我们讨论自动编码器应用于递归模型训练时的特性。
DoEasy. 控件 (第 13 部分): 优化 WinForms 对象与鼠标的交互,启动开发 TabControl WinForms 对象 DoEasy. 控件 (第 13 部分): 优化 WinForms 对象与鼠标的交互,启动开发 TabControl WinForms 对象
在本文中,我将修复和优化当鼠标光标移离 WinForms 对象后 WinForms 对象的外观处理,并启动开发 TabControl WinForms 对象。
数据科学与机器学习(第 06 部分):梯度下降 数据科学与机器学习(第 06 部分):梯度下降
梯度下降在训练神经网络和许多机器学习算法中起着重要作用。 它是一种快速而智能的算法,尽管它的工作令人印象深刻,但它仍然被许多数据科学家误解,我们来看看有关它的全部。