English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
学习如何基于建仓/派发(AD)设计交易系统

学习如何基于建仓/派发(AD)设计交易系统

MetaTrader 5交易 | 23 八月 2022, 11:04
1 393 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

我们的系列文章致力于教授有关最流行的技术指标详情,并以简单策略的形式应用它们。 很对这些策略的交易系统采用 MQL5 设计,从而可在 MetaTrader 5 交易平台中执行这些交易系统。 在本文中,我们将传授建仓/派发(AD),这是一种新的基于交易量的技术指标,可为我们揭示金融产品的另一个视角。 我们会通过以下主题涵盖该指标:

  1. AD 定义
  2. AD 策略
  3. AD 策略蓝图
  4. AD 交易系统
  5. 结束语

首先,我们将详细讲授这个新技术指标及其衡量准则,以及如何利用它、如何手工计算,从而了解其背后的主要概念。 然后,我们将基于它来设计一款交易系统。 我们将把该计算应用到一个示例当中,从而更好地理解这个概念。 在详细讲授 AD 指标的基础知识之后,我们将讲授如何在简单的策略中运用它。 然后,我们将为每个提及的策略设计一个蓝图,来帮助我们基于它们设计并创建一款交易系统。 为所有提到的简单策略设计完全部蓝图之后,我们将进入本文最有趣的部分,因为我们将讲授如何创建或编写 MQL5 代码,从而创建可以在 MetaTrader 5 交易平台中执行的交易系统。

届时,我们讲授如何运用它的过程中会涵盖 AD 指标详情。 之后,我们将针对上述简单策略创建一款交易系统。 我建议您依据所学知识尝试自行编写上述代码,因为这将有助于您加深理解,而且本文(就像本系列其它文章一样)的主要目的就是让萌新程序员掌握如何根据最流行的指标编写或设计交易系统。 此外,我们将采用 MetaQuotes 语言(MQL5)在 MetaTrader 5 内置的 MetaEditor 中编写代码。 如果您想获知如何安装 MetaTrader 5 或如何使用 MetaEditor,请阅读我上一篇文章在 MetaEditor 里编写 MQL5 代码

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

现在,我们来审阅主题,在有关交易和 MQL5 的学习旅程中迈入新的里程。

AD 定义

在此,我将详细讨论建仓/派发(AD)指标,并定义它是什么、它衡量什么、我们如何计算它、以及它背后的概念。 AD 线指标由 Marc Chaikin 开发。 这是一个基于成交量的指标,这意味着在计算中采用成交量,它让我们对成交量有了更深入的认知,这是常规交易中的一个重要视角,因为它衡量货币流入和流出某支金融产品的累计流量。 此外,它用成交量来确认趋势或反转预警。 如果您想了解更多关于趋势、其类型、以及我们如何识别它的信息,请阅读上一篇文章中的趋势定义章节。

就像任何累积指标一样,运行当中的 AD 线是每个周期货币流量的总和。 这一事实在指标计算期间体现得非常清晰。 我们来看看如何通过以下步骤计算 AD 线。

计算 AD 线有三个步骤:

  1. 计算货币流乘数 =((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价)
  2. 计算货币流量 = 货币流量乘数 * 周期交易量
  3. AD 线 = 前一个 AD 线值 + 当前资金流量

现在我们需要研究一个例子,如果我们有某支金融产品的以下数据,则应用这些步骤来计算 AD 线:

天数 最高价 最低价 收盘价 交易量
1 55 53 54 12000
2 56 54 55 10000
3 61 59 60 15000
4 67 64 65 20000
5 63 58 60 10000
6 58 52 55 5000
7 64 58 60 7000
8 52 47 50 7500
9 52 48 48 8000
10 50 48 49 5000
11 49 47 48 6000
12 48 47 47 7500
13 50 46 48 9000
14 52 45 47 10000
15 55 46 49 7000
16 53 45 47 7500
17 51 43 46 6000
18 50 42 44 5000
19 50 43 45 15000

现在,我们需要根据先前给定的数据计算 AD 线。 计算方法与如下相同:

首先,我们将计算货币流乘数 =((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价),然后我们将发现它与下图相同:

Ad calc

其次,我们将计算货币流量 = 货币流量乘数 * 周期交易量,然后我们可以发现它与下图相同:

Ad calc1

第三,我们将计算 AD 线 = 前一个 AD 线值 + 当前资金流量,然后我们将发现它与下图相同:

AD calc2

既然我们已经手工计算出 AD 线,其实我们不必如此,但我们这样做是为了理解 AD 指标背后的概念。 目前,如果我们想看到 AD 指标,我们所要做的全部就是从 MetaTrader 5 终端已提供的指标列表中选择它。

首先,在启动的 MetaTrader 5 里,单击插入选项卡-->指标-->交易量-->建仓/派发

AD insert

选择指标后,将打开以下 AD 指标参数窗口:

AD 插入窗口

1. 交易量类型: 跳变次数或实际。

2. AD 线颜色。

3. AD 线型。

4. AD 线宽度。

确定所需参数值,并按确定后,AD 指标将如下图所示:

AD 加载

现在,我们需要知道如何运用 AD 指标。


AD 策略

在本章节中,我们将讲授如何按照我们的偏好来运用 AD 指标,并以简单的策略来强化我们的交易。 我希望,您能获得更多对您的交易有益的新思路。

您也许会发现这些策略需要优化。 这其实很好,因为这里的主要目标是分享简单策略,这些策略有助于我们理解 AD 指标背后的基本概念,以及我们如何基于它们以 MQL5 创建交易系统。 如此,在将每个策略用于实际帐户之前,您必须要对其进行测试,因为可能需要对其进行优化或编辑。 此外,您可以编辑可用周期期限的长度,令其足以或更适合您的交易。

现在,我们将看到可以运用 AD 指标的简单策略。

  • 策略一:简单的 AD 走势:

根据这一策略,我们需要知道 AD 线的走势 — 是上升还是下降。 我们将简单比较当前 AD 值和以前的 AD 值。 如果当前 AD 值大于以前的那个,则 AD 线上升,反之亦然。 如果当前值小于前一个值,则 AD 线正在下降。

简言之,我们可以说:

当前 AD > 前一 AD --> AD 线正在上升

当前 AD < 前一 AD --> AD 线正在下降

  • 策略二:简单 AD 强度:

根据该策略,我们需要知道 AD 线的当前走势是强势亦或疲软,我们将依据简单比较当前 AD 值和以前近十个 AD 值的最大值或最小值来实现这一点。 如果当前值大于之前 10 个 AD 值的最大值,则当前 AD 值强劲,反之亦然。 如果当前值小于之前 10 个 AD 值的最小值,则当前 AD 值疲软。

简言之,它将与以下相同:

当前 AD > 之前 10 个 AD 的最大值 --> AD 当前强劲

当前 AD < 之前 10 个 AD 的最大小值 --> AD 当前疲软

  • 策略三: 简单 AD - 上行趋势:

根据该策略,我们需要知道当前上涨趋势中的上涨走势是否足够强劲;或者是否存在简单形式的熊市背离。 熊市背离简单说就是当我们看到价格创造了一个新的高点,但该指标并没有确认该走势,而是反而下跌。 为了简单起见,我们将比较最后两个连续的 AD 值和最后连续的两个最高值来验证,但您可以编辑检查周期来得到分量更重的证据。 因此,我们需要在此处从这样一个概念受益,即最好看到成交量随趋势而变化:在上升趋势期间,成交量随着走势上升而增加,而在调整的情况下则降低。

我们将比较当前与之前的 AD 值,以及当前的最高价与之前的最高价。 如果当前 AD 值大于前 AD 值,且当前最高点大于前高点,则在上升趋势期间存在强劲的上升走势。 或者,如果当前 AD 值小于前一 AD 值,且当前最高点大于前一高点,则存在熊市背离。

简言之,它将与以下相同:

当前 AD > 前一次 AD,且当前高点 > 前高点 --> 上行趋势中的强劲走势

当前 AD < 前一次 AD,且当前高点 > 前高点 --> 熊市背离

  • 策略四: 简单 AD - 下行趋势:

这一策略将与简单上升趋势策略相反,我们需要知道在下跌趋势中当前的下跌走势是否强劲,或者是否存在简单形式的牛势背离。 牛势背离是指当我们看到价格创下新低,但指标并未确认这一变化,而是走高,我们将比较 AD 指标最后两个连续值和最近两个连续的最低值来验证这一点。 如果当前 AD 值小于前一 AD 值,且当前最低点小于前一最低点,则在下降趋势期间存在强烈的向下走势。 或者,如果当前 AD 值大于前一 AD 值,且当前最低点小于先前最低点,则存在牛势背离。

它简单到如下所示:

当前 AD < 前一 AD,且当前最低点 < 前一最低点 --> 在下跌趋势中存在强劲下行走势

当前 AD > 前一次 AD,且当前低点 < 前低点 --> 熊市背离 


AD 策略蓝图

现在,是时候归纳我们创建交易系统的步骤了,因为在本部分中,我们将为每个策略创建一个分步的蓝图,来帮助我们顺滑地创建交易系统。 我相信这一步在任何交易系统创建过程中都非常重要。 因此,我们将为每个策略设计一个蓝图,从而了解我们需要做什么,它们将与以下相同。

首先,我们需要为一个简单策略设计蓝图,将 AD 当前值作为图表上的注释,作为未来策略的基础。 我们将其称为简单 AD,我们只需要让这个系统做的就是在图表上的注释里显示当前 AD 值,下面是实现这一点的蓝图:

简单 AD 蓝图 

现在,我们需要为每个提到的策略设计一个蓝图。

  • 策略一:简单的 AD 走势:

对于每次跳价,我们需要交易系统在执行时连续检查两个值,即当前 AD 值和前一个 AD 值,并判定当前 AD 是否大于前值。 我们需要在图表上返回一条注释,其中包括上升的 AD 线、AD 当前值和 AD 前值。 每个值都在单独的一行之中。 另一方面,如果当前值小于前值,我们需要在图表上返回一条注释,其中包含递减的 AD 行、AD 当前值和前值。 每个值都在单独的一行之中,以下是创建此交易系统的蓝图:

简单 AD 走势蓝图

  • 策略二:简单 AD 强度:

根据这一策略,我们需要设计一个交易系统,如果执行该系统,它可以在每次跳价时检查连续三个 AD 值。 这三个值是当前 AD 值、最后十个 AD 值的最大值和最小值。 如果当前 AD 值大于最大值,我们需要系统返回相应的通知、AD 当前值、最大值和最小值。 每个值都设置在单独的一行之中。 如果当前 AD 值低于最小值,我们需要系统返回相应的通知、AD 当前值、最大值和最小值。 每个值都设置在单独的一行之中。

以下是实现它的蓝图:

简单 AD 强度蓝图

  • 策略三: 简单 AD - 上行趋势:

我们需要为该策略创建一个交易系统,它能检查四个值:AD 当前值、前值、当前高点和前高点,并在上涨趋势中的每一次跳价处执行。 然后,我们需要系统判定当前 AD 是否大于前值,以及当前高点是否大于前高点。 我们需要系统在图表上返回注释,在上升趋势存在强劲的上行走势、AD 当前值、前值、当前高点和前高点。 每个值都设置在单独的一行之中。 我们需要标记的另一种情况是,当前 AD 是否小于前值,当前高点是否大于前高点。 我们需要系统返回熊势背离、AD 当前值、前值、当前高点和前高点,且每个值都在单独一行之中。

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

简单 AD 上行趋势蓝图

  • 策略四: 简单 AD - 下行趋势:

我们需要为该策略创建一个交易系统,它能检查四个值:AD 当前值、前值、当前低点和前低点,并在下跌趋势中的每一次跳价处执行。 然后,我们需要系统判定当前 AD 是否小于前值,以及当前低点是否小于前低点。 我们需要系统在图表上返回注释,在下跌趋势存在强劲的下行走势、AD 当前值、前值、当前低点和前低点。 我们需要标记的另一种情况是,当前 AD 是否大于前值,当前低点是否小于前低点。 我们需要系统返回牛势背离、AD 当前值、前值、当前低点和前低点,且每个值都在单独一行之中。

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

简单 AD 下跌蓝图


AD 策略交易系统

在这个有趣的部分,我们将讲授如何在理解和设计我们所需之后创建一个交易系统。 我们将首先创建一个简单的 AD 系统,只返回 AD 当前值作为我们策略的基础。 下面是如何为其编码:

  • 使用 “double” 型数据为 AD 创建一个数组,能以小数部分表示数值。
double ADArray[];
  • 调用 ArraySetAsSeries 函数设置数组排列顺序从当前数据起。
ArraySetAsSeries(ADArray,true);
  • 在创建 ADDef 的整数型变量后,调用 iAD 函数定义 AD。 iAD 函数返回建仓/派发指标的句柄,其参数为(品种、周期、和应用的交易量)。
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
  • 调用 CopyBuffer 函数填充 ADArray,并返回复制的数据计数,其参数为(指标句柄、缓冲区编号、开始时间、终止时间、和缓冲区)。
CopyBuffer(ADDef,0,0,3,ADArray);
  • 调用 NormalizeDouble 函数计算 AD 当前值,该函数在计算完 ADValue 的整数型变量后返回双精度型数值。 
int ADValue=NormalizeDouble(ADArray[0],5);
  • 调用注释函数在图表上创建注释。
Comment("AD Value is: ",ADValue);

下面是简单 AD 的完整代码:

//+------------------------------------------------------------------+
//|                                                    Simple AD.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()
  {
   //create an array for AD
   double ADArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(ADArray,true);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD value
   int ADValue=NormalizeDouble(ADArray[0],5);
   
   //creating a comment with AD value
   Comment("AD Value is: ",ADValue);  
  }
//+------------------------------------------------------------------+

编译此代码后,我们可以在“智能系统”文件夹中的导航器窗口中找到它:

AD Nav

我们可以将 EA 拖放到图表上来执行它。 将出现以下窗口:

简单 AD 窗口

单击“确定”后,它就会加载到图表,如下所示:

简单 AD 加载

以下是根据测试 EA 生成的注释示例:

简单 AD 测试信号

如果我们需要确保 EA 生成与原始 MetaTrader 5 指标相同的值,我们可以插入指标,并同时加载 EA。 我们可以看到它们是相同的:

简单 AD - 相同信号

  • 策略一:简单的 AD 走势:

以下是所创建 EA 的完整代码,该 EA 可以执行,并根据此策略生成所需信号:

//+------------------------------------------------------------------+
//|                                           Simple AD 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()
  {
   //create array for AD
   double ADArray[];
   
   //sorting array from the current data
   ArraySetAsSeries(ADArray,true);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //Comparing two values and giving signal
   //Rising AD
   if(ADCurrrentValue>ADPrevValue)
   {
      Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }
   
   //Declining AD
   if(ADCurrrentValue<ADPrevValue)
   {
      Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue);
   }  
  }
//+------------------------------------------------------------------+

前面的代码与基准代码不同,以下是不同之处:

  • 计算当前 AD 值和前值:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);
  • 根据此策略设置条件,并生成注释:
    • 上行 AD 线:
if(ADCurrrentValue>ADPrevValue)
{
 Comment("AD line is rising","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
}
    • 下跌 AD 线:
if(ADCurrrentValue<ADPrevValue)
{
 Comment("AD line is declining","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue);
} 

编译此代码后,我们可以在导航器窗口中找到该 EA:

AD Nav 2

双击它,我们可以发现以下窗口:

简单 AD 走势窗口

按“确定”后,它就被加载到图表:

简单 AD 走势加载

以下是在数据窗口显示当前和先前数据,并生成信号的示例:

上行 AD 线,

当前数据: 

简单 AD 走势 - 上行 AD - 当前 

前数据:

简单 AD 走势 - 上行 AD - 前值

下跌 AD,

当前数据:

简单 AD 走势 - 下跌 AD - 当前

前数据:

 简单 AD 走势 - 下跌 AD - 前值

  • 策略二:简单 AD 强度:

以下是所创建 EA 的完整代码,可以执行我们的交易策略:

//+------------------------------------------------------------------+
//|                                           Simple AD strength.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
void OnTick()
  {
   //Create array for AD
   double ADArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(ADArray,true);
  
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,10,ADArray);
 
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
  
   //Defining Max and Min values from the last 10 AD values
   int ADMax =ArrayMaximum(ADArray,1,10);
   int ADMin =ArrayMinimum(ADArray,1,10);
   
   //Calculating Max and Min values
   int ADMaxValue=ADArray[ADMax];
   int ADMinValue=ADArray[ADMin];

   //Comparing two values and giving signal
   //AD current is strong
   if(ADCurrrentValue>ADMaxValue)
   {
      Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
   
   //AD current is weak
   if(ADCurrrentValue<ADMinValue)
   {
      Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
   "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
   }
  }
//+------------------------------------------------------------------+

以前的代码在策略和我们需要 EA 做哪些操作方面有很多差异,以下是针对这些差异的澄清:

  • 在创建 ADMaxValue 和 ADMinValue 的整数型变量后,调用 ArrayMaximum 和 ArrayMinimum 函数定义 AD 最大值和最小值。 ArrayMaximum 返回已找到元素的索引,已考虑到数组序列,并搜索最大元素,而其参数是数字数组、开始处的索引、和要搜索的元素数量。 ArrayMinimum 与 ArrayMaximum 参数相同,但它搜索最低的元素。
int ADMax =ArrayMaximum(ADArray,1,10);
int ADMin =ArrayMinimum(ADArray,1,10);
  • 创建 ADMaxValue 和 ADMinValue 整数型变量后计算它们:
int ADMaxValue=ADArray[ADMax];
int ADMinValue=ADArray[ADMin];
  • 设置策略的条件和基于每个条件的注释,
    • 强 AD 值:
if(ADCurrrentValue>ADMaxValue)
{
 Comment("AD Current value is strong","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}
    • 弱 AD 值:
if(ADCurrrentValue<ADMinValue)
{
 Comment("AD Current value is weak","\n","AD current value is: ,",ADCurrrentValue,
 "\n","AD Max is: ",ADMaxValue,"\n","AD Min is: ",ADMinValue);
}

编译此代码后,EA 将在导航器中可用:

AD Nav 3

 

将其拖放到图表上后,其窗口出现:

简单 AD 强度窗口

按“确定”后,它就被加载到图表:

简单 OBV 强度加载

以下是测试生成信号的示例:

强 AD:

简单 AD 强度信号 - 强

弱 AD:

简单 AD 强度信号 - 弱

  • 策略三: 简单 AD 上行趋势:

以下是针对该策略创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                          Simple AD - 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()
  {
   //Create two arrays for AD and price
   double ADArray[];
   MqlRates PriceArray[];
   
   //sorting the two arrays
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   //calculating current and previous highs
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
   
   //Comparing two values and giving signal
   //Strong Up move
   if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current high value is: ",CurrentHighValue,
      "\n","Previous high value is: ",PrevHighValue);    
   }   
   
   //in case of divergence
   if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
   {
      Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentHighValue,
      "\n","Previous low value is: ",PrevHighValue);      
   }   
  }
//+------------------------------------------------------------------+

此代码中的区别:

  • 创建两个数组:一个用于 AD,作为 “double” 型;另一个用于价格,采用 MqlRates 型,存储价格信息。
double ADArray[];
MqlRates PriceArray[];

  • 两个数组设置排列顺序,一个用于 AD,调用 ArraySetAsSeries 函数;另一个用于价格,调用 CopyRates 函数,在为数据创建整数型变量后获取 MqlRates 结构的历史数据。
ArraySetAsSeries(ADArray,true);
int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
  • 下跌 AD,填充 AD 数组:
int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);

CopyBuffer(ADDef,0,0,3,ADArray);
  • 计算当前 AD 值、前 AD 值、当前高点和前高点:
int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
int ADPrevValue=NormalizeDouble(ADArray[1],5);

double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);         
double PrevHighValue=NormalizeDouble(PriceArray[1].high,5); 
  • 设定策略的条件和期望注释:
    • 强势上扬:
if(ADCurrrentValue > ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Strong Up Move During The Uptrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current high value is: ",CurrentHighValue,
 "\n","Previous high value is: ",PrevHighValue);    
} 
    • 熊势背离:
if(ADCurrrentValue < ADPrevValue && CurrentHighValue>PrevHighValue)
{
 Comment("Bearish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentHighValue,
 "\n","Previous low value is: ",PrevHighValue);      
} 

编译此代码后,我们可以在智能系统文件夹的导航器窗口中找到它:

AD Nav 4

双击并执行它,其窗口将如下出现:

简单 AD 上行趋势窗口

按“确定”后,它就被加载到图表:

简单 AD 上行趋势加载

以下是数据窗口里含有当前值和前值,及生成信号的示例:

强势上扬,

当前数据:

 简单 AD 上行趋势 - 强势上扬信号 - 当前

前数据:

简单 AD 上行趋势 - 强势上扬信号 - 前值

熊势背离,

当前数据:

简单 AD 上行趋势 - 熊势信号 - 当前

前数据:

简单 AD 上行趋势 - 熊势信号 - 前值

  • 策略四: 简单 AD - 下行趋势:

以下是针对该策略创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                        Simple AD - 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()
  {
   //creating a string variable for signal
   string signal="";
   
   //Create two arrays for AD and price
   double ADArray[];
   MqlRates PriceArray[];
   
   //sorting the two arrays
   ArraySetAsSeries(ADArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);
   
   //defining AD
   int ADDef=iAD(_Symbol,_Period,VOLUME_TICK);
   
   //filling the ADArray with ADDef
   CopyBuffer(ADDef,0,0,3,ADArray);
   
   //calculating current AD and previous values
   int ADCurrrentValue=NormalizeDouble(ADArray[0],5);
   int ADPrevValue=NormalizeDouble(ADArray[1],5);
   
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);         
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5); 
   
   //Comparing two values and giving signal
   //Strong down move
   if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }
   
   //in case of divergence
   if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
   {
      Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
      "\n","AD previous value is: ",ADPrevValue,
      "\n","Current low value is: ",CurrentLowValue,
      "\n","Previous low value is: ",PrevLowValue);      
   }  
  }
//+------------------------------------------------------------------+

此代码中的差异相同:

  • 本策略的条件和根据本策略所需的注释:
    • 强势暴跌:
if(ADCurrrentValue < ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Strong Down Move During The Downtrend","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
}
    • 牛势背离:
if(ADCurrrentValue > ADPrevValue && CurrentLowValue<PrevLowValue)
{
 Comment("Bullish Divergence","\n","AD current value is: ",ADCurrrentValue,
 "\n","AD previous value is: ",ADPrevValue,
 "\n","Current low value is: ",CurrentLowValue,
 "\n","Previous low value is: ",PrevLowValue);      
} 

编译此代码后,我们可以在导航器窗口中找到该 EA:

 AD Nav 5

将其拖放到图表上后,其窗口出现:

简单 AD 下行趋势窗口

按“确定”后,EA 就被加载到图表:

简单 AD 下行趋势加载

以下是数据窗口里含有当前值和前值,及依据策略生成的信号示例:

强势暴跌,

当前数据:

简单 AD 下行趋势 - 强势暴跌信号 - 当前

前数据:

简单 AD 下行趋势 - 强势暴跌信号 - 前值

牛势背离,

当前数据:

简单 AD 下行趋势 - 牛势背离信号 - 当前

前数据:

简单 AD 下行趋势 - 牛势背离信号 - 前值\


结束语

在本文中,我讨论了建仓/派发(AD)指标的主题,它是基于交易量的指标之一。 我们讲授了什么是 AD 指标,它衡量的是什么,以及如何手工计算,从而了解其背后的概念。 我们发现了如何在简单的策略中运用 AD 指标。 这些策略是:简单 AD 走势、简单 AD 强度、简单 AD 上升趋势、和简单 AD 下降趋势。 然后,我们为每个策略设计了一个蓝图,为每个策略创建一个交易系统。 之后,我们讲授了如何通过在 MQL 5中为每个策略创建 EA 来实现交易系统,从而可在 MetaTrader 5 交易平台上执行这些策略,并看到了每个策略生成信号的示例。 终端允许我们将这些策略自动化,以此生成信号。 这是一个非凡的功能,因为它为我们提供了计算机交易,或者至少为我们提供清晰、准确和快速的认知,帮助我们在不涉及可能有害情绪的情况下提高交易决策。

重要的事要再次提到,在将任何策略用于您的真实账户之前,您必须对其进行测试,因为它可能不适合您,因为没有什么策略能适合所有人,或者至少您可能会发现它需要优化,才能获得更好的结果。 本文和本系列其它文章的主要目标是讲授如何使用 MQL5 为最流行的技术指标编写简单策略。 我希望,您将应用所学到的知识,并尝试自行编写代码,因为实践是任何学习过程的重要因素。

我希望,您已经发现这篇文章对这个主题、甚至任何相关主题都很有帮助和见解。 如果您打算阅读更多类似的文章,您可以看看本系列之前的文章,了解如何基于最流行的技术指标设计一款简单的交易系统。

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

视频:如何为简单自动交易设置 MetaTrader 5 和 MQL5 视频:如何为简单自动交易设置 MetaTrader 5 和 MQL5
在这个小视频课程中,您将学习如何下载、安装和设置 MetaTrader 5,并实现自动交易。 您还将学习如何调整图表设置,和自动交易选项。 您将完成第一次回溯测试,在本课程结束时,您就会知道如何导入一个可以全天候自动交易的智能交易系统,而无需呆坐在屏幕前。
从头开始开发智能交易系统(第 17 部分):访问 web 上的数据(III) 从头开始开发智能交易系统(第 17 部分):访问 web 上的数据(III)
在本文中,我们将继续研究如何从 web 获取数据,并在智能系统中使用它。 这次我们将着手开发一个替代系统。
数据科学和机器学习(第 04 部分):预测当前股市崩盘 数据科学和机器学习(第 04 部分):预测当前股市崩盘
在本文中,我将尝试运用我们的逻辑模型,基于美国经济的基本面,来预测股市崩盘,我们将重点关注 NETFLIX 和苹果。利用 2019 年和 2020 年之前的股市崩盘,我们看看我们的模型在当前的厄运和低迷中会表现如何。
神经网络变得轻松(第十六部分):聚类运用实践 神经网络变得轻松(第十六部分):聚类运用实践
在上一篇文章中,我们为数据聚类创建了一个类。 在本文中,我想分享在解决实际交易任务时应用所获结果会遇到的可能变体。