学习如何基于加速(Accelerator)振荡器设计交易系统

Mohamed Abdelmaaboud | 30 一月, 2023

概述

这是来自我们系列中的一篇新文章,是有关如何基于最流行的技术指标设计交易系统。 我们将在本文中学习一种新的技术工具,在交易中加以运用可有利于我们。 我们将详细学习加速振荡器指标 (AC),包括了解它是什么、它测量什么、如何计算、如何读取它、并在简单的交易策略里运用它,然后我们如何基于它们创建交易系统。

以下主题将是我们学习有关该指标更多信息的途径:

  1. 加速振荡器定义
  2. 加速振荡器策略
  3. 加速振荡器策略蓝图
  4. 加速振荡器交易系统
  5. 结束语

我们将以 MQL5(MetaQuotes 语言 5)来编写我们的代码,其已内置在 MetaTrader 5 交易终端之中,可执行我们的交易系统。 如果您还不明白如何下载 MetaTrader 5,以及如何使用 MQL5,您可以阅读上一篇文章中的在 MetaEditor 中编写 MQL5 代码的主题,从而了解更多信息。 此处提及的所有策略仅用于教学目的,您在实盘账户中使用它们之前必须对其进行测试,确保它们可盈利,并且适合您;如果您想提高您的交易和编码技能,我建议您尝试应用您学到的知识,因为这是一个重要的步骤,有助于您从本文中汲取全部益处。

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


加速振荡器定义

加速振荡器 (AC) 是由比尔·威廉姆斯(Bill Williams)开发的动量指标。 它衡量动量是否有变化。 如果上升趋势的动量减弱,这可能意味着购买该金融产品的兴趣降低,在这种情况下,我们也许会看到反向卖出的不同走势,反之亦然,如果下降趋势的动量减弱,这可能意味着出售该金融产品的兴趣降低,我们也许会看到买入推动力。 它是一个领先指标,且它也许会在价格之前行动。

如此,该指标的主要目标是衡量行情力量在向上或向下两个方向上的加速和减速,以便深入明了当前价格走势将持续多长时间,并为任何变化做好准备。

现在,我们将学习如何通过以下步骤手工计算此指标:

AC = AO - SMA (AO, 5)

其中:

Ac = 加速(Accelerator)振荡器。

AO = 奥萨姆(Awesome)振荡器,顺便说一下,您可以阅读我之前关于奥萨姆振荡器的文章以了解更多信息。

SMA = 简单移动均线。

5 = SMA 的周期。

为了计算 AO,执行以下步骤:

MEDIAN PRICE = (HIGH + LOW) / 2 

AO = SMA (MEDIAN PRICE, 5) - SMA (MEDIAN PRICE, 34)

幸运的是,我们不需要手工计算这个指标,因为它在 MetaTrader 5 交易平台中已自带,我们需要做的就是从可用的指标中选择它。 打开交易终端时,我们按下插入 --> 指标 --> 比尔·威廉姆斯 --> 加速振荡器

 AC 插入

然后我们将找到指标参数窗口,设置我们的首选项,如下所示:

 AC 参数

1 - 向上值颜色。

2 - 直方柱宽度。

3 - 向下值颜色。

根据我们的偏好确定先前的参数,并按“确定”后,我们就会发现指标插入到图表当中,如下所示:

 AC 加载

正如我们在上一张图表中所见,我们在图表的下半部分插入了指标,且基于动量的加速度 AC 值在零轴附近振荡。

零轴意味着行情的两个多头和空头之间存在平衡。 如果 AC 大于零轴,则意味着我们可能会发现向上移动的延续,反之亦然,如果 AC 低于零轴,则意味着我们可能会找到向下移动的延续。


加速振荡器策略

在本主题中,我们将学习基于 AC 指标的基本概念在简单交易策略里的运用,但您在真实账户上使用它们之前必须对其进行测试,因为这里的主要目标只是教学性质。 如此,您必须确保它适合您的交易,并有利可图。

策略一: AC 零轴交叉

基于此策略,我们需要利用 AC 来明了何时出现看涨或看跌信号,方法是比较两个值,判定当期 AC 值相对 AC 指标零轴的位置。 如果当期 AC 值大于零轴,则为看涨信号。 在另一种场景下,如果当期 AC 值低于零轴,则可能是看跌信号。

简而言之,

AC > 零轴 --> 看涨

AC < 零轴 --> 看跌

策略二: AC 强度

基于这种策略,我们需要比较当期 AC 值与最近10 个 AC 值的最大值和最小值,由此得到 AC 走势强度的信号,从而判定每个值的位置,并获得相应的信号。 如果当期 AC 值大于最大 AC 值,它是强势信号。 在另一种场景下,如果当期 AC 值低于最小 AC 值,则表示疲软。

简而言之,

AC > 最大 AC 值 --> AC 强势

AC < 最小 AC 值 --> AC 疲软

策略三:AC & MA 策略

基于此策略,我们需要检查五个值来获取买入或卖出信号,它们是收盘价、50-周期指数移动平均线、当期 AC、和最近 50 个 AC 的最大值/最小值,来判定它们的位置,从而获得相应的信号。 如果当期 AC 大于最大 AC 值,且收盘价大于 50-周期 EMA,则为买入信号。 在另一种场景下,如果当期 AC 小于最小 AC 值,且收盘价低于 50-周期 EMA,则为卖出信号。

简而言之,

AC > 最大 AC 值,且收盘价 > 50- EMA --> 买入

AC < 最小 AC 值,且收盘价 < 50- EMA --> 卖出 

加速振荡器策略蓝图

在本主题中,我们将为每个提到的策略设计一个分步蓝图,来帮助我们顺滑地创建交易系统。

策略一: AC 零轴交叉

根据此策略,我们需要创建一个交易系统,可自动生成看涨或看跌信号,基于持续检查当期 AC 值相对于 AC 指标零轴的位置,判定它们并返回相应的信号,作为图表上的注释。 如果当期 AC 值大于零轴,我们要求交易系统在图表上返回含有以下值的注释:

在另一种情况下,如果 AC 值低于零轴,我们要求交易系统在图表上返回含有以下值的注释:

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

 AC 零轴交叉蓝图

策略二: AC 强度

根据此策略,我们需要创建一个交易系统,可生成 AC 走势强度信号,基于连续检查三个值:当期 AC 值、AC 指标最后十个值的最大值/最小值,判定它是强势还是疲软。 如果当期 AC 值大于最大值,我们要求交易系统在图表上返回含有以下值的注释:

在另一种情况下,如果当期 AC 值低于最小值,我们要求交易系统在图表上返回含有以下值的注释:

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

 AC 强度蓝图

策略三:AC & MA 策略

根据此策略,我们需要创建一个交易系统,可生成买入和卖出信号,基于持续检查以下五个值:当期 AC、最大/最小 AC、收盘价、和移动平均值,判定它们相对位置,从而生成相应的信号,作为图表上的注释。 如果当期 AC 大于最大 AC 值,收盘价大于移动平均线,我们要求交易系统在图表上生成注释,作为含有以下值的信号:

在另一种情况下,如果当期 AC 低于最小 AC 值,收盘价低于移动平均线,我们要求交易系统在图表上返回以下值的注释:

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

 AC _ MA 策略蓝图

加速振荡器交易系统

在这个有趣的主题中,我们将基于上述策略创建我们的交易系统,但我们要先创建一个简单的交易系统作为它们的基础,该系统将能够取当期 AC 值在图表上返回注释,以下是执行此操作的步骤:

创建一个 “double” 数据类型数组 acArray:

double acArray[];

调用 “ArraySetAsSeries” 函数为 acArray 设置排序顺序,并返回布尔值 true 或 false。 其参数为:

ArraySetAsSeries(acArray,true);

调用 “iAC” 函数定义 AC 指标,并返回加速振荡器指标的句柄。 其参数为:

int acDef = iAC(_Symbol,_Period);

调用 “CopyBuffer” 函数从 AC 指标的缓冲区获取数据。 其参数为: 

CopyBuffer(acDef,0,0,3,acArray);

定义 AC 值,为 acVal 创建双精度变量,并调用 “NormalizeDouble” 对其进行规范化。 "Normalizedouble" 的参数是:

double acVal = NormalizeDouble(acArray[0],7);

调用 “Comment” 函数在图表上返回含有当期 AC 值的注释。

Comment("AC Value is ",acVal);

以下是该交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                                    Simple AC.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 acArray[];
   ArraySetAsSeries(acArray,true);
   int acDef = iAC(_Symbol,_Period);
   CopyBuffer(acDef,0,0,3,acArray);
   double acVal = NormalizeDouble(acArray[0],7);
   Comment("AC Value is ",acVal);
  }
//+------------------------------------------------------------------+

此代码编译完毕后,我们可在导航器中于智能系统文件夹里找到它,如下所示:

 简单 AC 导航

若要执行此文件,我们将它拖放到所需的图表上,然后我们将找到与以下内容相同的窗口:

 简单 AC 窗口

 简单 AC 加载

正如我们在右上角的上一张图片中所见,我们已将智能系统加载到图表上。 现在,我们已准备好接收信号,它将与以下内容相同:

 简单 AC 信号

正如我们在左上角所见,我们得到含有当期 AC 值的注释。

策略一: AC 零轴交叉

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

//+------------------------------------------------------------------+
//|                                            AC Zero 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 acArray[];
   ArraySetAsSeries(acArray,true);
   int acDef = iAC(_Symbol,_Period);
   CopyBuffer(acDef,0,0,3,acArray);
   double acVal = NormalizeDouble(acArray[0],7);
   if(acVal > 0)
     {
      Comment("Bullish","\n"
              "AC Value is ",acVal);
     }
   if(acVal < 0)
     {
      Comment("Bearish","\n"
              "AC Value is ",acVal);
     }
  }
//+------------------------------------------------------------------+

此代码中的区别:

策略的条件。

在看涨信号的情况下:

   if(acVal > 0)
     {
      Comment("Bullish","\n"
              "AC Value is ",acVal);
     }

看跌信号情况

   if(acVal < 0)
     {
      Comment("Bearish","\n"
              "AC Value is ",acVal);
     }

编译此代码后,确保没有错误,并将其拖放到图表上执行,就像我们之前学到的一样,我们会发现它加载到图表上,如下所示:

 AC 零轴交叉加载

在右上角,我们可以看到该策略的智能系统已加载到图表上。 我们现已准备好接收我们的信号了。

若是看涨信号情况:

 AC 零轴交叉 - 看涨信号

我们可在左上角看到,含有以下值的注释作为此策略的信号:

若是看跌信号情况:

 AC 零轴交叉 - 看跌信号

我们可以在左上角看到以下值:

策略二: AC 强度

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

//+------------------------------------------------------------------+
//|                                                  AC Strength.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 acArray[];
   ArraySetAsSeries(acArray,true);
   int acDef = iAC(_Symbol,_Period);
   CopyBuffer(acDef,0,0,11,acArray);
   double acCurrVal = NormalizeDouble(acArray[0],7);
   int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY);
   int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY);
   double acMaxVal = NormalizeDouble(acArray[acMaxArray],7);
   double acMinVal = NormalizeDouble(acArray[acMinArray],7);
   if(acCurrVal>acMaxVal)
     {
      Comment("AC is strong ","\n",
              "AC Value is ",acCurrVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal);
     }
   if(acCurrVal<acMinVal)
     {
      Comment("AC is weak ","\n",
              "AC Value is ",acCurrVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal);
     }
  }
//+------------------------------------------------------------------+

代码中的差异。

定义 AC 的当期值:

double acCurrVal = NormalizeDouble(acArray[0],7);

调用 “ArrayMaximum” 函数定义整个 AC 数组中的最大值,并返回最大值。 其参数:

int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY);

调用 “ArrayMinimum” 函数定义整个 AC 数组中的最小值,并返回最小值。 其参数:

int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY);

调用 “NormalizeDouble” 函数规范化最大值和最小值。

   double acMaxVal = NormalizeDouble(acArray[acMaxArray],7);
   double acMinVal = NormalizeDouble(acArray[acMinArray],7);

策略条件:

强势信号情况,

   if(acCurrVal>acMaxVal)
     {
      Comment("AC is strong ","\n",
              "AC Value is ",acCurrVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal);
     }

疲软信号情况,

   if(acCurrVal<acMinVal)
     {
      Comment("AC is weak ","\n",
              "AC Value is ",acCurrVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal);
     }

编译并在所需的图表上执行之后,我们会发现它已加载,与以下内容相同:

AC 强度加载

正如我们在加载图表右上角一样,我们已准备好接收此策略的信号,与以下测试示例相同。

强势信号情况:

AC 强度 - 强势信号

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

疲软情况:

AC 强度 - 疲软信号

我们可以得到以下值的信号:

策略三:AC & MA 策略

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

//+------------------------------------------------------------------+
//|                                             AC & MA Strategy.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 acArray[];
   double maArray[];
   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(acArray,true);
   ArraySetAsSeries(maArray,true);
   int acDef = iAC(_Symbol,_Period);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
   CopyBuffer(acDef,0,0,3,acArray);
   CopyBuffer(maDef,0,0,3,maArray);
   int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY);
   int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY);
   double closingPrice = pArray[0].close;
   double acVal = NormalizeDouble(acArray[0],7);
   double acMaxVal = NormalizeDouble(acArray[acMaxArray],7);
   double acMinVal = NormalizeDouble(acArray[acMinArray],7);
   double maVal = NormalizeDouble(maArray[0],7);
   if(acVal > acMaxVal && closingPrice > maVal)
     {
      Comment("Buy","\n"
              "Closing Price is ",closingPrice,"\n",
              "Ac Value is ",acVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal,"\n",
              "MA Value is ",maVal);
     }
   if(acVal < acMinVal && closingPrice < maVal)
     {
      Comment("Sell","\n"
              "Closing Price is ",closingPrice,"\n",
              "Ac Value is ",acVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal,"\n",
              "MA Value is ",maVal);
     }
  }
//+------------------------------------------------------------------+

此代码中的区别:

创建数组 pArray、acArray、和 maArray。 我们定义 acArray 和 maArray 为 double 数据类型,但我们将定义 pArray 为 MqlRates 数据结构来存储有关价格、交易量和点差的信息。

   MqlRates pArray[];
   double acArray[];
   double maArray[];

为数组 (acArray) 和 (maArray) 设置 AS_SERIES 标志,就像我们之前所提那样,并调用 “CopyRates” 函数定义数据,获取 MqlRates 结构的历史数据,其参数是:

   int Data=CopyRates(_Symbol,_Period,0,1,pArray);
   ArraySetAsSeries(acArray,true);
   ArraySetAsSeries(maArray,true);

我们定义 AC, MA:

AC 调用我们以前提到的相同 “iCA” 函数。 但t MA,我们将调用 "iMA" 函数,其参数:

   int acDef = iAC(_Symbol,_Period);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

我们将调用 “CopyBuffer” 函数从 AC 和 MA 指标的缓冲区获取数据。

   CopyBuffer(acDef,0,0,3,acArray);
   CopyBuffer(maDef,0,0,3,maArray);

获取 acArray 的最大值和最小值。

   int acMaxArray = ArrayMaximum(acArray,1,WHOLE_ARRAY);
   int acMinArray = ArrayMinimum(acArray,1,WHOLE_ARRAY);

定义 AC 值、AC 最大值、AC 最小值、和指数移动均线值。

   double acVal = NormalizeDouble(acArray[0],7);
   double acMaxVal = NormalizeDouble(acArray[acMaxArray],7);
   double acMinVal = NormalizeDouble(acArray[acMinArray],7);
   double maVal = NormalizeDouble(maArray[0],7);

策略的条件。

若为买入信号的情况,

   if(acVal > acMaxVal && closingPrice > maVal)
     {
      Comment("Buy","\n"
              "Closing Price is ",closingPrice,"\n",
              "Ac Value is ",acVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal,"\n",
              "MA Value is ",maVal);
     }

若为卖出信号的情况,

   if(acVal < acMinVal && closingPrice < maVal)
     {
      Comment("Sell","\n"
              "Closing Price is ",closingPrice,"\n",
              "Ac Value is ",acVal,"\n",
              "AC Max is ",acMaxVal,"\n",
              "AC Min is ",acMinVal,"\n",
              "MA Value is ",maVal);
     }

编译此代码,执行并记载它,从而接收我们的信号,如下:

AC _ MA 策略加载

正如我们在右上角所见,智能系统加载到图表上。 现在,我们就能接收信号了。

若为买入信号的情况,

AC & MA 策略 - 买入信号

正如我们在左上角所见,我们得到以下值:

若为卖出信号的情况,

AC & MA 策略 - 卖出信号

我们得到含有以下值的注释:

结束语

从本文中学到所有内容之后,假设您很好地理解了加速振荡器指标,因为我们在本文中全面介绍了它,我们了解了它是什么、它测量什么、我们如何计算它、我们如何在简单的交易策略里读取并运用它,这些策略与以下内容相同:

然后,我们为所有拟议的策略设计了一个分步蓝图,来帮助我们轻松、有效和顺滑地创建我们的交易系统。 然后,我们来到了本文最有趣的部分,因为我们编写代码,基于这些提到的策略创建了一个交易系统,可在 MetaTrader 5 中执行,从而生成自动信号,而无需任何手工读取或监控所应用的条件。

我希望您能尝试应用学到的知识,就像我在本文开头告诉您的那样,以此获得有关本文主题或任何相关主题的更多见解,并从本文中汲取完全的益处。 我需要在此再次确认,您在真实账户上使用任何提到的策略之前,必须严格测试,确保它可盈利,或适合您的交易风格,因为没有任何策略适合所有人。 再有,此处的主要目标只是教学。

我希望您能发现这篇文章有益您的交易,并获得更好的结果,如果您想阅读更多关于如何基于最流行的技术指标(如 RSI、MACD、MA、随机指标、布林带)......等等,来设计交易系统的类似文章。 您可以阅读我之前在本系列中发表的文章,从而了解更多信息。