学习如何基于 ATR 设计交易系统

在这些主题之后,我希望我们能够深入理解 ATR 指b标,并学习如何以合适的方式去运用它。 我们将学习平均真实范围(ATR)指标,它测量什么,以及如何计算:我们将分析其计算公式,以及将其应用于市场的一个真实案例。 本主题将涵盖在 “ATR 定义” 部分当中。 我们将学习基于 ATR 指标概的简单策略。 我将分享一些简单的策略,这些策略有助于增强我们的理解 — 这会在 “ATR 策略” 部分中完成。 我们还将学习针对上述策略的设计蓝图。 这一步骤在交易系统设计过程中相当有用,因为它把程序应该如何工作的思路直观表现出来。 因此,“ATR 策略蓝图”部分将提供分步蓝图。 然后,我们将学习如何编写代码,使用 MQL5 编程语言基于这些策略设计交易系统。 开发的程序将在 MetaTrader 5 交易平台上运行。 这些内容将涵盖在 “ATR 交易系统”部分中。

为了在 MQL5 中编写策略代码,我们将利用 MetaQuotes 语言编辑器(MetaEditor 工具),该工具已集成在 MetaTrader 5 交易平台之中。 如果您还没有该平台,可以在 下载MetaTrader 5平台在全球金融市场进行交易 下载。

MetaTrader 5 交易平台窗口如下所示:

从该窗口中,您可在打开的 MetaTrader 5 终端里按 F4 键打开 MetaEditor。 另一种打开它的方式,则是从 MetaTrader 5 终端界面单击 IDE 按钮,如下图所示:

再换一种打开方式,则单击 MetaTrader 5 终端中的工具菜单 --> 然后从菜单中选择 MetaQuotes 语言编辑器,如下图所示:

这将打开 MetaQuotes 语言编辑器。 下图展示的是它的界面:

我建议您应用在这篇文章中读到的内容,因为实践是提高经验的一个重要因素。

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

现在,准备学习一种新的工具,它可以帮助您强化交易技能,提升交易结果。 我们开始我们的旅程。

ATR 定义

在本主题中,我们将详细介绍平均真实范围(ATR)指标:它测量什么、以及如何计算,并通过一些示例加深我们的理解,从而了解我们如何运用该指标,并从中受益。

平均真实范围(ATR)技术指标由威尔斯·怀尔德(Welles Wilder)开发。 ATR 指标通过分析特定周期的价格范围来衡量行情波动。 ATR 不提供价格或行情方向,仅提供波动走势的测量值。

现在,这里就是 ATR 指标衡量行情波动性时是如何计算的。

首先,我们需要计算真实范围,它将是以下各项的最大值:

  • 当前最高价和最低价之间的差值。
  • 当前高点和上一个收盘点之间的差值(绝对值)。
  • 当前低点和上一个收盘点之间的差值(绝对值)。

因此,在这一步中,我们需要高点、低点和收盘价的数据来计算它。 然后,我们就可计算平均真实范围。

现在,我们来看一个真实的市场实例,以便应用我们所学到的知识,并计算平均真实范围(ATR),以下是 EURUSD 数据:

天数最高价最低价收盘价
Mar 17, 20221.11381.10081.1089
Mar 18, 20221.1121.10031.1055
Mar 21, 20221.1071.1011.1014
Mar 22, 20221.10471.0961.1027
Mar 23, 20221.10441.09631.1004
Mar 24, 20221.10141.09651.0996
Mar 25, 20221.10391.09791.0981
Mar 28, 20221.11.09441.0978
Mar 29, 20221.11371.0971.1085
Mar 30, 20221.11711.10831.1156
Mar 31, 20221.11851.10611.1065
Apr 01, 20221.10771.10271.1053
Apr 04, 20221.10561.0961.097
Apr 05, 20221.0991.08991.0903
Apr 06, 20221.09391.08741.0893
Apr 07, 20221.09391.08641.0878
Apr 08, 20221.08921.08361.0876
Apr 11, 20221.09511.08721.0883
Apr 12, 20221.09051.08211.0826
Apr 13, 20221.08961.08091.0885
Apr 14, 20221.09251.07571.0827
Apr 15, 20221.08321.07961.0806
Apr 18, 20221.08221.07691.078
Apr 19, 20221.08151.07611.0786
Apr 20, 20221.08681.07831.085
Apr 21, 20221.09371.08241.0836
Apr 22, 20221.08531.0771.0794
Apr 25, 20221.08421.06971.0711
Apr 26, 20221.07381.06351.0643
Apr 27, 20221.06551.05861.0602

现在,为了计算 ATR,我们将遵循以下步骤。

1- 计算 TR,它将是以下值中的最大值:

  • 当前高点 — 当前低点(高点和低点之间的差值),

  • 绝对值 (当前高点-前一收盘价),

  • 绝对值 (当前低点-前一收盘价),

根据我们的计算结果,我们将判定 TR,它是(高点 - 低点,abs(高点 - 前收盘),abs(低点 - 前收盘))中的最大值,

2- 计算 14 个周期的平均真实范围(ATR),

依据前面的步骤,我们可以手工计算平均真实范围(ATR)。 但如今我们不需要这样做,因为我们可以在 MetaTrader 5 交易平台中以现成的形式使用它。 我们所=要做的全部就是在其它可用指标中进行选择,下面是如何做到这一点。

打开 MetaTrader 5 交易终端时,单击插入选项卡 --> 指标 --> 振荡器 --> 平均真实范围:

选择平均真实范围后,将为 ATR 打开以下参数窗口:

1 - the desired period for the indicator. — 指标所需周期

不同金融产品、或金融产品每个不同区间波动性,以及不同时间帧的周期值可能会不同。 ATR 周期越长,生成的指示越准确,因为平均值越平滑。

2 - the color of the ATR line. — ATR 指标线的颜色

3 - the ATR line style. — ATR 指标线的线型

4 - the ATR line thickness. — ATR 指标线的宽度

设置 ATR 指标参数后,它将加载到图表上,并显示如下:

正如我们在前一张图中所看到的,下层窗口包括 14 周期的 ATR 指标,该指标由一条振荡线表示,来测量 EURUSD 在 1 小时内的波动性。

正如我之前提到的那样,ATR 衡量波动性。 据此,分析 ATR 窗口中的数值:ATR 值越低,金融产品的波动性越低。 反之亦然,ATR 值越高,金融产品的波动性越高。

下图是关于如何解读:

那么,当 ATR 记录的数值较低时,这表示波动性较低;反之亦然,当 ATR 指标记录的数值较高时,这表明波动性较高。

根据 ATR 指标的计算,我们已经知道,ATR 指标不能准确地生成交易信号。 它只考虑范围的大小,但其优点是有助于评估持仓规模、止损位和止盈位,是最佳工具之一。

正如我之前提到的那样,ATR 只测量波动性,而不提供趋势或行情方向。 因此,如果 ATR 曲线正在向上移动,请不要感到困惑 — 这并不意味着趋势上行;反之亦然,如果 ATR 曲线正在向下移动,这并不意味着趋势下行。 如果您打算了解最流行的工具之一,譬如 ADX 指标,它可以用来判定是否有趋势。

您还可以阅读我上一篇文章中的趋势定义

下图是一个示例,可以表明 ATR 不提供趋势方向:

正如我们所见,指标在价格下降的同时上升,反之亦然,ATR 线在价格上升的同时下降。 这是因为 ATR 并没有提供趋势或行情方向,它只是提供了波动性的度量。

ATR 策略

在本主题中,我们将学习依据 ATR 指标的概念可以一起配套运用的简单策略,从而提升我们的交易结果。 ATR 指标的概念是,它仅衡量行情的波动性,而不是行情的方向。

1- 简单 ATR 系统 - ATR 强度:

根据该策略,我们将比较当前 ATR 值和特定值,并判定 ATR 强弱。 这里需要注意的是,这些特定值可能因金融产品而异,或因周期而异。 故此,我们将检查 ATR 指标值,并根据其值判定其强度。 如果当前 ATR 值大于 0.0024,则表示 ATR 较强,反之亦然;如果当前 ATR 值小于 0.0014,则表明 ATR 较弱。 如果 ATR 值在 0.0014 和 0.0024 之间,这意味着 ATR 为中性,仅返回当前 ATR 值。

  • 当前 ATR 值 > 0.0024 = ATR 较强
  • 当前 ATR 值 < 0.0014 = ATR 较弱
  • 当前 ATR 值 > 0.0014 且 < 0.0024 = 当前 ATR 值

2 - 简单 ATR 系统 - ATR 走势:

根据该策略,我们将比较当前 ATR 值和以前的 ATR 值,然后决定 ATR 走势;若 ATR 线上行,则当前 ATR 大于以前的 ATR 值时就会发生这种情况,或者当前 ATR 值小于以前的 ATR 值时亦会出现这种情况。

  • 当前 ATR 值 > 以前 ATR 值 =  ATR 向上
  • 当前 ATR 值 < 以前 ATR 值 =  ATR 向下

3 - 简单 ATR 系统 - 止损和止盈价位:

根据该策略,我们需要取用 ATR 值来判定动态止损和止盈价位,计算基于当前 ATR 值,并针对做多或做空持仓具体计算止损和止盈价位。

在做多持仓的情况下,我们需要在图表上看到:

  • 当前要价。
  • 当前出价在新的一行。
  • 当前 ADX 值在新的一行。
  • 根据做多持仓具体计算,得出的止损位在新的一行。
  • 根据做多持仓具体计算,得出的止盈位在新的一行。

在做空持仓的情况下,我们需要在图表上看到:

  • 当前要价。
  • 当前出价在新的一行。
  • 当前 ADX 值在新的一行。
  • 根据做空持仓具体计算,得出的止损位在新的一行。
  • 根据做空持仓具体计算,得出的止盈位在新的一行。

我们可以发现 ATR 指标还可以配合其它高级策略运用,但这里我们只需要提及一些简单的策略,这些策略可以帮助我们深入理解 ATR 指标,以便能够以适当的方式使用它,从而提高我们的交易结果。

ATR 策略蓝图

在这一部分中,我们会逐步学习我们需要什么,以便依据每个策略的蓝图为上述三种策略创建一个交易系统。 首先,在设计或创建上述三种策略之前,我们将从创建简单程序或智能交易系统所需步骤的蓝图开始,该蓝图可以向我们展示含有当前 ATR 值的注释,从而帮助我们设计上述策略,下图代表这一蓝图:

1- 简单 ATR 系统 - ATR 强度:

  • 当前 ATR 值 > 0.0024 = ATR 较强
  • 当前 ATR 值 < 0.0014 = ATR 较弱
  • 当前 ATR 值 > 0.0014 且 < 0.0024 = 当前 ATR 值

故此,我们打算该程序采用特定值来检查当前 ATR 值,并判定当前 ATR 值是否大于 0.0024 — 这意味着 ATR 较强。 如果不大于 0.0024,我们需要程序检查 ATR 是否小于 0.0014 — 这意味着 ATR 较弱。 如果它不小于 0.0014 的情况,且程序发现它在 0.001 4 和 0.0024 之间,那么我们希望程序仅在图表上显示当前 ATR 值。

以下是 ATR 强度策略的蓝图:

2 - 简单 ATR 系统 - ATR 走势:

  • 当前 ATR 值 > 以前 ATR 值 =  ATR 向上
  • 当前 ATR 值 < 以前 ATR 值 =  ATR 向下

因此,我们需要智能交易系统检查当前 ATR 值和以前的 ATR 值,然后做出判定,如果当前 ATR 值大于以前的 ATR 值,这意味着 ATR 是向上的;如果当前 ATR 值小于以前的 ATR 值,这表示 ATR 是向下的,或者它没有给出任何信息。

以下是 ATR 走势策略的蓝图:

3 - 简单 ATR 系统 - 止损和止盈价位:

在这两种情况下,都需要在图表上显示注释,

做多仓位和做空仓位:

  • 当前要价。
  • 当前出价在新的一行。
  • 当前 ADX 值在新的一行。
  • 当前止损位在新的一行。
  • 当前止盈位在新的一行。

以下是 ATR 止损位和止盈位策略的蓝图:

ATR 交易系统

在这个有趣的主题中,我们将学习编写所提到的每种策略的代码,从而创建一个基于其中每一种策略的交易系统,并能轻松、顺利、准确地执行。 现在,我们将编写一个智能交易系统的代码,自动在图表上显示 ATR 值。

下面是我们如何编写这个简单 ATR 系统智能交易系统的代码:

  • 创建 “double” 类型的价格数组:
double PriceArray[];
  • 调用 "ArraySetAsSeries" 函数设置数据排列顺序:
ArraySetAsSeries(PriceArray,true);
  • 调用 iATR 函数定义 ATR,且返回的 ATR 值为整数型 “int”:
int ATRDef=iATR(_Symbol,_Period,14);
  • 调用 “CopyBuffer” 函数定义数据并存储结果:
CopyBuffer(ATRDef,0,0,3,PriceArray);
  • 调用 “NormalizeDouble” 函数返回获取的当前数据双精度值:
double ATRValue=NormalizeDouble(PriceArray[0],5);
  • 在图表上显示含有 ATR 数值的注释:
Comment("ATR Value = ",ATRValue);

如果您想轻松复制并粘贴它,或者想在一个模块中看到它,以下是完整的代码:

//+------------------------------------------------------------------+
//|                                                   Simple ATR.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 price array
   double PriceArray[];
   
   //Sorting data
   ArraySetAsSeries(PriceArray,true);

   //define ATR
   int ATRDef=iATR(_Symbol,_Period,14);
   
   
   //define data and store result
   CopyBuffer(ATRDef,0,0,3,PriceArray);
   
   //get value of current data
   double ATRValue=NormalizeDouble(PriceArray[0],5);
   
   //comment on the chart
   Comment("ATR Value = ",ATRValue);
  }
//+------------------------------------------------------------------+

智能交易系统编写完毕后,如果我们想执行这个程序,我们可以在导航器中找到它,如下图所示:

双击或拖放此文件至图表上,将打开以下窗口,

单击“确定”后,我们可以发现简单 ATR 智能交易系统加载到图表上,如下图所示:

我们可以根据程序发现其结果与以下测试示例相同:

现在,我们将为每个提到的策略创建一个交易系统,它将与下面相同,

1- 简单 ATR 系统 - ATR 强度:

  • 当前 ATR 值 > 0.0024 = ATR 较强 
  • 当前 ATR 值 < 0.0014 = ATR 较弱
  • 当前 ATR 值 > 0.0014 且 < 0.0024 = 当前 ATR 值

下面是我们如何编写这个基于简单 ATR 系统的智能交易系统的代码 — ATR 强度:

//+------------------------------------------------------------------+
//|                             Simple ATR System - ATR 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()
  {
   //creating price array
   double PriceArray[];
   
   
   //Sorting data
   ArraySetAsSeries(PriceArray,true);
   
   //define ATR
   int ATRDef=iATR(_Symbol,_Period,14);   
   
   //define data and store result
   CopyBuffer(ATRDef,0,0,3,PriceArray);
   
   //get value of current data
   double ATRValue=NormalizeDouble(PriceArray[0],5);
   
   //comment on the chart with ATR strength as per its value
   if(ATRValue>0.0024)
   Comment("Strong ATR","\n","ATR Value = ",ATRValue);
   
   if(ATRValue<0.0014)
   Comment("Weak ATR","\n","ATR Value = ",ATRValue);
   
   if((ATRValue>0.0014)&&(ATRValue<0.0024))
   Comment("ATR Value = ",ATRValue);
  }
//+------------------------------------------------------------------+

此代码中的差异是:

  • 如果当前 ATR 值 > 0.0024,则注释基于当前 ATR 值与特定值的比较:
   if(ATRValue>0.0024)
   Comment("Strong ATR","\n","ATR Value = ",ATRValue);
  • 如果当前 ATR < 0.0014
   if(ATRValue<0.0014)
   Comment("Weak ATR","\n","ATR Value = ",ATRValue);
  • 如果当前 ATR 值 > 0.0014 且当前 ATR < 0.0024
   if((ATRValue>0.0014)&&(ATRValue<0.0024))
   Comment("ATR Value = ",ATRValue);

之编译后,我们可以在导航器窗口中找到这个智能交易系统,并执行它:

双击打开文件,或拖放文件到图表上后,我们可以看到如下窗口:

按下“确定”按钮后,我们可以发现智能交易系统加载到图表,并与下图相同:

以下是基于该测试策略生成的信号示例:

如下图所示,在注释的新行中显示 强 ATR和当前 ATR 值:

如我们所见,下图在注释的新行中显示弱 ATR 和当前 ATR 值:

如我们所见,下图显示了一条注释,该注释仅含有当前 ATR 值,因为依据判定值,该值呈中性:

2 - 简单 ATR 系统 - ATR 走势: 

  • 当前 ATR 值 > 以前 ATR 值 =  ATR 向上
  • 当前 ATR 值 < 以前 ATR 值 =  ATR 向下

下面是我们如何编写这个基于简单 ATR 系统的智能交易系统的代码 — ATR 走势:

//+------------------------------------------------------------------+
//|                             Simple ATR System - ATR 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()
  {
   //creating arrays
   double PriceArray0[];
   double PriceArray1[];
   
   //sort price array from current data
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);
   
   //define ATR
   int ATRDef=iATR(_Symbol,_Period,14); 
   
   //define data and store result
   CopyBuffer(ATRDef,0,0,3,PriceArray0);      
   CopyBuffer(ATRDef,0,0,3,PriceArray1);
   
   //get value of current data
   double ATRValue=NormalizeDouble(PriceArray0[0],5);
   double PreATRValue=NormalizeDouble(PriceArray1[1],5);

   if(ATRValue>PreATRValue)
   Comment("ATR is UP","\n","ATR Value = ",ATRValue,"\n","ATR Previous Value = ",PreATRValue);
   
   if(ATRValue<PreATRValue)
   Comment("ATR is Down","\n","ATR Value = ",ATRValue,"\n","ATR Previous Value = ",PreATRValue);
      
  }
//+------------------------------------------------------------------+

此代码中的差异是:

  • 创建两个价格数组(当前 ATR 值(PriceArray0),以前的 ATR 值(PriceArray1)):
   double PriceArray0[];
   double PriceArray1[];
  • 为两个价格数组设置数据排列顺序:
   ArraySetAsSeries(PriceArray0,true);
   ArraySetAsSeries(PriceArray1,true);
  • 为两个数组定义数据和存储结果:
   CopyBuffer(ATRDef,0,0,3,PriceArray0);      
   CopyBuffer(ATRDef,0,0,3,PriceArray1);
  • 获取两个值(当前和以前的 ATR)的当前数据值:
   double ATRValue=NormalizeDouble(PriceArray0[0],5);
   double PreATRValue=NormalizeDouble(PriceArray1[1],5);
  • 依据当前 ATR 和以前的 ATR 值的比较结果显示注释,
    • 如果当前 ATR 值 > 以前的 ATR 值:
   if(ATRValue>PreATRValue)
   Comment("ATR is UP","\n","ATR Value = ",ATRValue,"\n","ATR Previous Value = ",PreATRValue);
    • 如果当前 ATR 值 < 以前的 ATR 值:
   if(ATRValue<PreATRValue)
   Comment("ATR is Down","\n","ATR Value = ",ATRValue,"\n","ATR Previous Value = ",PreATRValue);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值