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

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

MetaTrader 5交易 | 1 八月 2022, 09:55
2 056 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

在这篇新文章中,我们将讨论一个交易中我们必须衡量并知道如何使用它的新概念。 这个概念就是波动性。 许多工具可用于测量波动性,其中最常用的工具之一是平均真实范围(ATR)技术指标。 当您知道波动性是如何传导的,就可能会改变游戏,就像我们在本文中看到的那样,因为这将是您构建决策的一个重要因素或基础。

我们将遍历许多主题来更好地理解这个 ATR 指标,正如您可能知道的一样,如果您已阅读过其它我曾发表的文章,我的方法是学习和传授事物的根源。 以下主题涵盖了我们将在本文中学习的关于这一神奇工具的所有内容:

  1. 在 MetaEditor 中编写 MQL5 代码
  2. ATR 定义
  3. ATR 策略
  4. ATR 策略蓝图
  5. ATR 交易系统
  6. 结束语

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

为了在 MQL5 中编写策略代码,我们将利用 MetaQuotes 语言编辑器(MetaEditor 工具),该工具已集成在 MetaTrader 5 交易平台之中。 如果您还没有该平台,可以在 https://www.metatrader5.com/zh/download 下载。

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

MT5 平台

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

Metaeditor open2

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

Metaeditor open1 

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

Metaeditor 界面

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

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

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


ATR 定义

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

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

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

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

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

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

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

天数 最高价 最低价 收盘价
Mar 17, 2022 1.1138 1.1008 1.1089
Mar 18, 2022 1.112 1.1003 1.1055
Mar 21, 2022 1.107 1.101 1.1014
Mar 22, 2022 1.1047 1.096 1.1027
Mar 23, 2022 1.1044 1.0963 1.1004
Mar 24, 2022 1.1014 1.0965 1.0996
Mar 25, 2022 1.1039 1.0979 1.0981
Mar 28, 2022 1.1 1.0944 1.0978
Mar 29, 2022 1.1137 1.097 1.1085
Mar 30, 2022 1.1171 1.1083 1.1156
Mar 31, 2022 1.1185 1.1061 1.1065
Apr 01, 2022 1.1077 1.1027 1.1053
Apr 04, 2022 1.1056 1.096 1.097
Apr 05, 2022 1.099 1.0899 1.0903
Apr 06, 2022 1.0939 1.0874 1.0893
Apr 07, 2022 1.0939 1.0864 1.0878
Apr 08, 2022 1.0892 1.0836 1.0876
Apr 11, 2022 1.0951 1.0872 1.0883
Apr 12, 2022 1.0905 1.0821 1.0826
Apr 13, 2022 1.0896 1.0809 1.0885
Apr 14, 2022 1.0925 1.0757 1.0827
Apr 15, 2022 1.0832 1.0796 1.0806
Apr 18, 2022 1.0822 1.0769 1.078
Apr 19, 2022 1.0815 1.0761 1.0786
Apr 20, 2022 1.0868 1.0783 1.085
Apr 21, 2022 1.0937 1.0824 1.0836
Apr 22, 2022 1.0853 1.077 1.0794
Apr 25, 2022 1.0842 1.0697 1.0711
Apr 26, 2022 1.0738 1.0635 1.0643
Apr 27, 2022 1.0655 1.0586 1.0602

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

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

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

H-L

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

 absh-pc

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

 absl-pc

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

TR

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

ATR

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

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

ATR insert

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

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 指标参数后,它将加载到图表上,并显示如下:

ATR 加载

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

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

下图是关于如何解读:

ATR 解读

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

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

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

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

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

ATR reading2

正如我们所见,指标在价格下降的同时上升,反之亦然,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 值的注释,从而帮助我们设计上述策略,下图代表这一蓝图:

简单 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 强度策略的蓝图:

简单 ATR 系统 - ATR 强度蓝图

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

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

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

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

简单 ATR 系统 - ATR 走势蓝图

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

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

做多仓位和做空仓位:

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


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

简单 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 Nav

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

简单 ATR 窗口

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

简单 ATR 加载

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

简单 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 Nav 1

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

ATR 强度窗口

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

ATR 强度加载

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

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

ATR 强度 - 强

如我们所见,下图在注释的新行中显示弱 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);
编译后,我们可以在导航器窗口中找到这个智能交易系统,并执行它:

ATR Nav 2

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

ATR 走势窗口。

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

ATR 走势加载

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

如果 ATR 向上:

ATR 走势 - 向上

如果 ATR 向下:

ATR 走势 - 向下


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

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

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

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

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

下面是我们如何编写这个基于简单 ATR 系统的智能交易系统的代码 — 止损位和止盈位

//+------------------------------------------------------------------+
//|                             Simple ATR System - SL&TP levels.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()
  {
   //define Ask price&Bid
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //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);
   
   //Calculate SL&TP for buy position
   double StopLossBuy=Bid-(ATRValue*2);
   double TakeProfitBuy=Ask+((ATRValue*2)*2);
   
   //Calculate SL&TP for sell position
   double StopLossSell=Ask+(ATRValue*2);
   double TakeProfitSell=Bid-((ATRValue*2)*2);
   
   //comment on the chart
   Comment("BUY POSITION","\n","Current Ask = ",Ask,"\n","Current Bid = ",Bid,"\n","ATR Value = ",ATRValue,
   "\n","Stop Loss = ",StopLossBuy,"\n","Take Profit = ",TakeProfitBuy,"\n",
   "SELL POSITION","\n","Current Ask = ",Ask,"\n","Current Bid = ",Bid,"\n","ATR Value = ",ATRValue,
   "\n","Stop Loss = ",StopLossSell,"\n","Take Profit = ",TakeProfitSell);
  }
//+------------------------------------------------------------------+

此处的区别在于:

  • 为了计算止损和止盈定义要价和出价:
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
  • 很对多头和空头持仓计算止损和止盈:
   //Calculate SL&TP for buy position
   double StopLossBuy=Bid-(ATRValue*2);
   double TakeProfitBuy=Ask+((ATRValue*2)*2);
   
   //Calculate SL&TP for sell position
   double StopLossSell=Ask+(ATRValue*2);
   double TakeProfitSell=Bid-((ATRValue*2)*2);
  • 基于多头和空头持仓策略显示注释:
  • 当前要价。
  • 当前出价在新的一行。
  • 当前 ADX 值在新的一行。
  • 当前止损位在新的一行。
  • 当前止盈位在新的一行。
  •    Comment("BUY POSITION","\n","Current Ask = ",Ask,"\n","Current Bid = ",Bid,"\n","ATR Value = ",ATRValue,
       "\n","Stop Loss = ",StopLossBuy,"\n","Take Profit = ",TakeProfitBuy,"\n",
       "SELL POSITION","\n","Current Ask = ",Ask,"\n","Current Bid = ",Bid,"\n","ATR Value = ",ATRValue,
       "\n","Stop Loss = ",StopLossSell,"\n","Take Profit = ",TakeProfitSell);

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

    ATR Nav 3

    双击文件,或将其拖放到图表上之后,将出现以下窗口:

    ATR SL_TP window

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

    ATR SL_TP attached

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

    ATR SL-TP levels

    结束语

    现在,假设您已详细了解了平均真实范围,譬如我们学过了什么是 ATR,它测量了什么,以及其背后的概念,我们如何手工计算它,并将其应用于市场的一个真实示例,这是在 ATR 定义主题实现的。 然后,我们学习了一些基于平均真实范围概念的简单策略,这些策略可以按照我们的偏好来应用,与我们所学内容相同;我们还学习了 ATR 强度系统、ATR 走势和简单 ATR 止损位&止盈位策略,这些都是我们在 ATR 策略主题中学习的内容,我们还学习并设计了每个策略的蓝图,从而帮助我们遵照 ATR 策略蓝图主题为每个策略设计一个交易系统,并可在 MetaTrader 5 交易平台上运行;然后我们学习如何利用 MetaQuotes 语言(MQL5)为每个策略编写智能交易系统,这是在 ATR 交易系统主题讲述的,并 MetaTrader5 平台上执行它们。

    在理解并实践了前面的主题后,您肯定能够根据其背后的概念使用平均真实范围(ATR),并且您肯定能够通过自动交易系统读取指标来判定金融产品的波动性;尤其是您在应用自己所学知识的同时,对于掌握任何事情都很重要。

    同样重要的是要确认,在您的真实账户上使用任何新策略或工具之前,您必须测试它,因为它可能对您的交易有利,亦或毫无用处(即便与其它工具配合操作),所以它可能不适合您的角色或您的交易计划,这是正常的。 故此,您必须首先通过测试来确保它对您有用,且可盈利。

    在本文的最后,我希望您能发现它对您的交易有用,我也希望任何相关主题能激发您的新思路,这可能是提高您的交易结果的原因,我希望它能让你们认识到编程对交易的重要性,它有多有用,它能帮助我们轻松、顺利、准确地进行交易。

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

    学习如何基于抛物线 SAR 设计交易系统 学习如何基于抛物线 SAR 设计交易系统
    在本文中,我们将继续讲述如何基于最流行的指标设计交易系统。 在本文中,我们将详细学习抛物线 SAR 指标,以及如何运用一些简单的策略来设计用于 MetaTrader 5 的交易系统。
    从头开始开发智能交易系统(第 14 部分):添加价格成交量(II) 从头开始开发智能交易系统(第 14 部分):添加价格成交量(II)
    今天,我们要将更多资源加入 EA。 这篇有趣的文章可以提供一些展示信息的新思路和方法。 与此同时,它能帮助修复项目中的小缺陷。
    从头开始开发智能交易系统(第 15 部分):访问 web 上的数据(I) 从头开始开发智能交易系统(第 15 部分):访问 web 上的数据(I)
    如何通过 MetaTrader 5 访问在线数据? 互联网上有很多网站,提供海量信息。 您需要知道的是,在哪里查找、以及如何才能最好地利用这些信息。
    从头开始开发智能交易系统(第 13 部分):时序与交易(II) 从头开始开发智能交易系统(第 13 部分):时序与交易(II)
    今天,我们将针对市场分析构建《时序与交易》系统的第二部分。 在前一篇文章《时序与交易(I)》当中,我们讨论了一种替代的图表组织系统,该系统能够针对市场上执行的成交进行最快速的解释。