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

学习如何基于标准偏差设计交易系统

MetaTrader 5交易 | 24 十月 2022, 09:47
1 291 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

欢迎来到我们该系列中的一篇新文章,在本系列中学贯如何运用最流行的技术指标来创建交易系统。 我们将在这篇新文章中详细学习一个可用于增强交易的新工具,我们将学习如何基于其背后的基本概念创建交易系统。 这个新指标就是标准偏差指标。 我们将在以下主题里覆盖该指标的详细介绍:

  1. 标准偏差定义
  2. 标准偏差策略
  3. 标准偏差策略蓝图
  4. 标准偏差交易系统
  5. 结束语

贯穿标准偏差定义主题,我们将更详细地了解什么是标准偏差,它衡量什么,以及如何手动计算它,以此了解其背后的基本概念,然后我们在示例中加以应用,从而计算标准偏差值。 我们随后将转到下一个主题,即标准偏差策略,去学习如何基于指标基本概念,在简单策略里运用标准偏差指标。 然后,我们将转到下一个主题,即设计一个标准偏差策略蓝图,来帮助我们为每个策略创建一个交易系统,因为这是一个分步的蓝图,能归纳思路并顺利创建此交易系统。 再往后,我们将转到本文最有趣的主题,即标准偏差交易系统,为每种策略创建一个可在 MetaTrader 5 中运行的交易系统,从而自动生成信号。

我们将使用 MetaTrader 5 和 MetaEditor 来编写 MQL5(MetaQuates 语言)代码,据此创建我们的交易系统,如果您不知道如何下载和使用 MetaEditor,您可以阅读上一篇文章中的在 MetaEditor 中编写 MQL5 代码主题,从中了解更多信息。

我建议您应用自己所学知识来加深您的理解,并获得有关该主题或任何相关主题的更多认知,以此来从文章信息中获得最大收益。 除此之外,任何策略在用于您的真实帐户之前,您必须亲测所有策略,从而确保它对您有用,因为没有任何策略能适合每个人。

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

我们开始我们的主题,来学习我们的新工具。


标准偏差定义

在本主题中,我们将据其定义更详细地学习什么是标准偏差指标,了解它衡量什么,以及如何手工计算它,来学习它背后的基本概念。 然后,我们将此计算在一个示例里加以应用。

标准偏差是统计学中的一个术语。 此统计项衡量围绕均值或平均值的离散度。 但什么是离散,简单地说,它是任何实际值与中位值或平均值之间的差值。 离散越高,标准偏差越高。 离散越低,标准偏差越低。 标准偏差指标衡量波动性。

现在,我们需要学习如何计算标准偏差。 我们可以由以下步骤轻松做到这一点:

1- 计算期望周期的平均值或中位值。

2- 从其平均值中减去每个收盘价来计算偏差。

3- 取每个计算出的偏差的平方。

4- 累加平方偏差求和,然后将其除以观测次数。

5- 计算标准偏差,即等于步骤四所得结果的平方根。

下面的示例,应用了此计算,来加深我们理解。 如果我们有以下金融产品的数据。

# 收盘价
1 1.05535
2 1.05829
3 1.0518
4 1.04411
5 1.04827
6 1.04261
7 1.04221
8 1.02656
9 1.01810
10 1.01587
11 1.01831

步骤一:我们将计算 10 个周期的移动平均线,并且我们将考虑直到第十个周期那个,所有 MA 都是相同的移动平均线。 因此,以下是计算后的结果。

步骤 1

步骤二: 计算偏差。 以下是计算后的结果。

步骤 2

步骤三: 计算偏差平方。

步骤三

步骤四: 计算偏差平方 10 个周期的平均值。

步骤 4

步骤五: 计算标准偏差 = 步骤四所获结果的平方根。

步骤 5

经由前面的各个步骤,我们计算出了标准偏差值。 如今,我们非常幸运,因为我们不需要再手工计算它,因为它是 MetaTrader 5 交易平台中的内置指标。 我们需要做的全部,就是从交易平台的可用指标中选择它。 以下是如何做到这一点。

在打开 MetaTrader 5 交易平台时,我们将按 "插入选项卡“ --> ”指标“ --> ”趋势“ --> ”标准偏差“。

 Std Dev 插入

之后,我们就能看到以下指标参数窗口。

 Std Dev 参数

1- 确定我们将使用的周期。

2- 确定指标线的水平偏移量,如果我们打算这样做的话。

3- 选择移动平均线的类型。

4- 选择我们将在计算中采用的价格类型。

5- 确定指标线的颜色。

6- 确定指标线的样式。

7- 确定指标线的宽度。

确定所需参数后,我们可以找到图表上插入的指标,如下所示。

 Std Dev 指标加载

正如我们在上图中看到的那样,标准偏差已插入,我们可在下部窗口中找到它,其表现为基于标准偏差值的振荡线。

贯穿本主题,我们更详细地教授了标准偏差指标,了解到它是什么,它衡量了什么,以及如何手工计算它,从而了解到它背后的基本概念,并将此计算应用于示例。


标准偏差策略

本主题中,在详细了解标准偏差指标之后,并了解其主要概念之后,我们将学习如何基于其背后的基本概念运用该指标。 我们将通过三个简单的策略,学习如何运用标准偏差指标。 第一个,简单标准偏差 — 波动性,将从中了解是否存在波动性。 至于第二个, 简单标准偏差 — 标准偏差和 MA,我们将用它与移动平均线配合一起获取买入或卖出信号。 第三个,简单标准偏差 — 标准偏差,AVG 和 MA,在看到高波动性之后,与移动平均线配合一起获得买入或卖出信号。

  • 策略一:简单标准偏差 — 波动性:

基于此策略,我们需要根据当前标准偏差与前 5 期数值的平均值之间的比较来衡量波动性。 如果当期 Std 值大于前 5 期平均值,则这是一个高波动性信号。 如果当期 Std 值小于前 5 期平均值,则这是一个低波动性信号。

当期 Std > Std AVG --> 高波动性

当期 Std < Std AVG --> 低波动性

  • 策略二:简单标准偏差和 MA:

基于此策略,我们需要根据特定条件得到买入和卖出信号。 如果当期标准偏差大于前期值,并且要价值大于移动平均线,则这是一个买入信号。 如果当期标准偏差大于前期值,并且出价值低于移动平均线,则这是一个卖出信号。

当期 Std > 前期值 Std 与要价 > MA --> 买入信号

当期 Std > 前期值 Std 与出价 < MA --> 卖出信号

  • 策略三:简单标准偏差 — Std,Std AVG,和 MA:

基于此策略,我们需要根据其它条件得到买入和卖出信号。 如果当期标准偏差大于平均值,并且要价大于移动平均线,则这是一个买入信号。 如果当期标准偏差大于平均值,并且出价值低于移动平均线,则这是一个卖出信号。

当期 Std > Std 均值,且要价 > MA --> 买入信号

当期 Std > Std 均值,且出价 < MA --> 卖出信号

通过前面的策略,我们学习了如何依据三个简单的策略,运用标准偏差指标来衡量波动性,并根据两组不同的条件得到买入和卖出信号。 您还可以尝试组合其它技术指标,从而根据您的交易计划和策略,从多个角度更深入地了解金融产品。


标准偏差策略蓝图

在本主题中,我们将学习如何为每个策略设计分步蓝图,来帮助我们基于每个提到的策略创建交易系统。 依我所见,这一步非常重要,因为它能帮助我们归纳思路,并以顺滑、轻松的方式创建交易系统。 由此,现在我将表述一个蓝图,该蓝图有助于告知计算机我们需要具体做什么。

  • 策略一:简单标准偏差 — 波动性:

根据此策略,我们需要交易系统检查两个数值,并持续比较它们。 这两个值是当期标准偏差,和前五期标准偏差的平均值。 之后,我们需要交易系统来决定哪一个值较大。 如果当期 Std Dev 大于平均值,我们需要在图表上看到一条注释,

  • 高波动性。
  • 当期 Std Dev 值。
  • 前 5 期 Std Dev 均值。

如果当期 Std Dev 低于平均值,我们需要在图表上看到一条注释,

  • 低波动性。
  • 当期 Std Dev 值。
  • 前 5 期 Std Dev 均值。
下图是简单标准偏差 — 波动率策略的分步蓝图。

简单 Std Dev - 波动率蓝图

  • 策略二:简单标准偏差和 MA:

根据此策略,我们需要交易系统检查四个数值,并持续执行比较。 这四个数值是当期标准偏差、前期标准偏差、要价和移动平均值。 在检查这些数值之后,我们需要交易系统来制定决策,并在此基础上显示相应的信号。

如果当期标准偏差大于前期值,且要价值大于移动平均线,我们需要交易系统在图表上生成含有以下值的注释:

  • 买入信号。
  • 当期 Std Dev 值。
  • 前期 Std Dev 值。
  • 要价值。
  • 移动均值。

如果当期标准偏差大于前期值,且出价值低于移动平均线,我们需要交易系统在图表上生成含有以下值的注释:

  • 做空信号。
  • 当期 Std Dev 值。
  • 前期 Std Dev 值。
  • 出价值。
  • 移动均值。
下图是简单标准偏差 — 标准偏差和 MA 策略的分步蓝图。

 简单 Std Dev - Std _ MA 蓝图

  • 策略三:简单标准偏差 — Std,Std AVG,和 MA:

根据此策略,我们需要交易系统连续检查四个数值,并根据这些值之间的比较来决定我们需要看到什么信号。 这些值是当期标准偏差、标准偏差平均值、要价、和移动平均线。

如果当期 Std 值大于 Std Dev 均值,且要价大于移动平均线,我们需要交易系统生成一个信号作为图表上的注释,并含有以下值:

  • 买入信号。
  • 当期 Std Dev 值。
  • Std Dev 均值。
  • 要价值。
  • 移动均值。

如果当期 Std 值大于 Std Dev 均值,且出价低于移动平均线,我们需要交易系统生成一个信号作为图表上的注释,并含有以下值:

  • 做空信号。
  • 当期 Std Dev 值。
  • Std Dev 均值。
  • 出价值。
  • 移动均值。
下图是简单标准偏差 - 标准偏差、标准偏差均值、和 MA 策略的分步蓝图。

简单 Std Dev - Std Dev _ AVG _ MA 蓝图

现在,我们以学会了为每个策略设计一个分步蓝图,来帮助我们依据有规划的步骤为它们创建一个交易系统。 


标准偏差交易系统

在本主题中,我们将学习如何针对 MetaTrader 5 平台,以 MQL5 为上述每个策略设计一个交易系统。 首先,我们将为标准偏差设计一个简单的交易系统,该系统可在所需图表上生成含有标准偏差值的注释,并以此交易系统为基础,为每个策略设计交易系统。  

  • 调用 “double” 函数建 Std Dev 的数组,能表示小数值。 “double” 型是浮点型之一,也是数据类型之一。
double StdDevArray[];
  • 依据当前数据对此数组进行排序,我们将调用 “ArraySetAsSeries” 函数来执行此操作,返回 true 或 false 或布尔值。 "ArraySetAsSeries" 参数是:
    • 一个数组[]
    • 标志
ArraySetAsSeries(StdDevArray,true);
  • 创建一个整数型变量 StdevDef 定义标准偏差,保存调用 “iStdDev” 函数返回的标准偏差指标句柄。 该函数的参数是:
    • symbol, 设置交易品种名称,默认我们指定应用当前图表的 “_Symbol”。
    • period, 设置时间帧,默认我们指定应用当前时间帧的 “_Period”。
    • ma_period, 设置移动平均线周期长度,默认我们设置为 20。
    • ma_shift, 如果需要,设置水平偏移,默认我们设置为 0。
    • ma_method, 确定移动平均线的类型,默认我们采用简单移动平均线(MODE_SMA)。
    • applied_price, 确定要采用的价格类型,默认我们采用收盘价(PRICE_CLOSE)。
int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
  • 调用 “CopyBuffer” 函数将价格数据复制到 StdDev 数组,并返回复制的数据计数,如果出现错误,则返回 -1。 该函数的参数是:
    • indicator_handle, 我们将指定指标的定义是 “StdDevDef”。
    • buffer_num, 设置指标缓冲区编号,我们设置为 0。
    • start_pos, 设置起始位置,我们设置为 0。
    • count, 设置数据复制的数量,我们设置为 3。
    • buffer[], 确定要复制的目标数组,我们确定其为 “StdDevArray”。
CopyBuffer(StdDevDef,0,0,3,StdDevArray);
  • 在创建双精度变量 “StdDevVal” 后,调用 “NormalizeDouble” 函数把获取的标准偏差值转化为双精度类型。 "Normalizedouble" 的参数是:
    • value, 确定正规化数字,我们将指定 “StdDevArray[0]”
    • digits, 确定小数点后的保留位数,我们确定为 6。
double StdDevVal = NormalizeDouble(StdDevArray[0],6);
  • 调用 “Comment” 函数在图表上显示含有当期 StdDev 值的注释,则该函数没有返回值,但它将输出一条定义好的注释。
Comment("StdDev Value is",StdDevVal);

 编译此代码后,我们会发现没有错误或警告提示。 然后,我们将在导航器窗口中找到该交易系统的智能系统,如下所示:

Std Dev n1

若是将其拖放到所需的图表上,将出现智能系统的以下窗口:

简单 Std Dev 窗口

在“允许算法交易”旁边勾选,并按“确定”后,我们会发现该交易系统的智能系统将加载到图表上,如下所示:

 简单 Std Dev 加载

正如我们在上一张图片的右上角看到的那样,智能系统已加载到图表上。

下图是测试中的示例,它根据该智能系统显示生成的信号。

简单 Std Dev 信号

下图是另一个加载该交易系统的智能系统之后,它自动生成信号的示例,并与此同时,我们插入内置的标准偏差指标,来确保两个 StdDev 值相同。

 简单 Std Dev 相同信号 

  • 策略一:简单标准偏差 — 波动性:

现在,我们将基于简单 Std Dev - 波动率策略创建一个交易系统,以下是创建基于此策略的交易系统的完整代码。

//+------------------------------------------------------------------+
//|                                  Simple Std Dev - Volatility.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 StdDevArray[];

   ArraySetAsSeries(StdDevArray,true);

   int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(StdDevDef,0,0,6,StdDevArray);

   double StdDevVal = NormalizeDouble(StdDevArray[0],6);
   double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);
   double StdDevVal2 = NormalizeDouble(StdDevArray[2],6);
   double StdDevVal3 = NormalizeDouble(StdDevArray[3],6);
   double StdDevVal4 = NormalizeDouble(StdDevArray[4],6);
   double StdDevVal5 = NormalizeDouble(StdDevArray[5],6);
   double StdDevAVGVal = ((StdDevVal1+StdDevVal2+StdDevVal3+StdDevVal4+StdDevVal5)/5);

   if(StdDevVal>StdDevAVGVal)
     {
      Comment("High volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

   if(StdDevVal<StdDevAVGVal)
     {
      Comment("Low volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

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

此代码中的差异如下:

不仅定义当前的 Std Dev 值,而且我们将用与定义当期值相同的函数来定义前五期的数值,但我们将在规范化数字中使用不同的数字来提供所需的值。

double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);
double StdDevVal2 = NormalizeDouble(StdDevArray[2],6);
double StdDevVal3 = NormalizeDouble(StdDevArray[3],6);
double StdDevVal4 = NormalizeDouble(StdDevArray[4],6);
double StdDevVal5 = NormalizeDouble(StdDevArray[5],6);

计算前五期数值的平均值。

double StdDevAVGVal = ((StdDevVal1+StdDevVal2+StdDevVal3+StdDevVal4+StdDevVal5)/5);

策略条件:

在高波动性的情况下,

   if(StdDevVal>StdDevAVGVal)
     {
      Comment("High volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

在低波动性的情况下,

   if(StdDevVal<StdDevAVGVal)
     {
      Comment("Low volatility","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal);
     }

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

 Std Dev n2

将其拖放到所需图表上,我们可以找到与以下内容相同的交易系统的窗口:

 简单 Std Dev - 波动率窗口

按下 “确定” 后,我们将发现图表上加载的智能系统与如下,并根据此策略开始生成信号:

简单 Std Dev - 波动率加载

正如我们所看到的,简单的 Std Dev - 波动率交易系统的智能系统与我们在上图右上角看到的相同。

我们可以从测试中看到根据此交易系统生成的信号示例,如下图所示:

根据此策略,在高波动性的情况下,

 简单 Std Dev - 波动率 - 高波动信号

正如我们在上图中看到的,我们在图表的左上角找到了三行注释:

  • 高波动性陈述。
  • 当期 Std Dev 值。
  • 前五期 Std Dev 值的平均值。

在根据此策略的低波动性的情况下,

简单 Std Dev - 波动率 - 地波动信号

正如我们在上图中找到的那样,在图表的左上角还有三行注释来通知我们:

  • 波动性很低。
  • 当期 Std Dev 值。
  • 前五期T Std Dev 值的平均值
贯穿前面的内容,我们学习了如何创建一个交易系统,该系统可以生成一个信号来通知我们波动性作为衡量标准。
  • 策略二:简单标准偏差和 MA:

以下代码是如何针对这个简单的标准偏差创建一个交易系统 — 标准偏差和 MA 策略:

//+------------------------------------------------------------------+
//|                                    Simple Std Dev - Std & MA.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 Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   double StdDevArray[];
   double PArray[];

   ArraySetAsSeries(StdDevArray,true);
   ArraySetAsSeries(PArray,true);

   int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
   int MADef = iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(StdDevDef,0,0,3,StdDevArray);
   CopyBuffer(MADef,0,0,10,PArray);

   double StdDevVal = NormalizeDouble(StdDevArray[0],6);
   double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);

   double MAValue = NormalizeDouble(PArray[0],6);


   if(StdDevVal>StdDevVal1&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

   if(StdDevVal>StdDevVal1&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

  }

//+------------------------------------------------------------------+

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

为每个人创建双精度变量,定义要价值和出价值,调用 “NormalizeDouble” 函数返回双精度类型值,然后调用 “SymbolInfoDouble” 返回特定交易品种相应属性的规范化数字。"SymbolInfoDouble" 的参数是:

  • name of the symbol, 我们将采用应用于图表的当前交易品种 “_Symbol”。
  • prop_id, 定义属性,这里是 “SYMBOL_ASK”。
double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

再创建一个价格数组。

double PArray[];

针对当前数据进行排序。

ArraySetAsSeries(PArray,true);

在创建 MADef 的整数型变量后,调用 “iMA” 函数定义移动平均线。

int MADef = iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

将价格数据复制到该已创建数组。

CopyBuffer(MADef,0,0,10,PArray);

定义 Std Dev 的前期值。

double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);

定义移动平均线的值。

double MAValue = NormalizeDouble(PArray[0],6);

策略条件:

在买入信号的情况下,

   if(StdDevVal>StdDevVal1&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

在卖出信号的情况下,

   if(StdDevVal>StdDevVal1&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Previous Std Dev value is ",StdDevVal1,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

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

 Std Dev n3

双击,我们可以发现该智能系统的以下窗口,如下图所示:

简单 Std Dev MA 窗口

在“允许算法交易”旁边勾选后,然后按“确定”,我们会发现智能系统被加载到图表上,如下图所示:

简单 Std Dev 加载

正如我们在图表的右上角看到的那样,智能系统被加载,那么我们可以看到根据此策略进行测试的示例,与以下示例相同。

买入信号的情况,

 简单 Std Dev - Std _ MA - 买入信号

正如我们在之前的买入信号示例所见,我们可以在图表的左上角找到五行注释:

  • 买入信号
  • 当期 Std Dev 值
  • 前期 Std Dev 值
  • 要价值
  • Ma 值

在卖出信号的情况下,

 简单 Std Dev - Std _ MA - 卖出信号

正如我们在之前的卖出信号示例所见,我们可以在图表的左上角找到五行注释:

  • 卖出信号
  • 当期 Std Dev 值
  • 前期 Std Dev 值
  • 出价值
  • Ma 值

贯穿前面的内容,我们学习了如何创建一个交易系统,该系统可根据标准偏差和移动平均线生成买入或卖出信号。

  • 策略三:简单标准偏差 — Std,Std AVG,和 MA:

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

//+------------------------------------------------------------------+
//|                  Simple Std Dev - Std Dev & AVG Std Dev & MA.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 Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   double StdDevArray[];
   double PArray[];

   ArraySetAsSeries(StdDevArray,true);
   ArraySetAsSeries(PArray,true);

   int StdDevDef = iStdDev(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
   int MADef = iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(StdDevDef,0,0,6,StdDevArray);
   CopyBuffer(MADef,0,0,10,PArray);

   double StdDevVal = NormalizeDouble(StdDevArray[0],6);
   double StdDevVal1 = NormalizeDouble(StdDevArray[1],6);
   double StdDevVal2 = NormalizeDouble(StdDevArray[2],6);
   double StdDevVal3 = NormalizeDouble(StdDevArray[3],6);
   double StdDevVal4 = NormalizeDouble(StdDevArray[4],6);
   double StdDevVal5 = NormalizeDouble(StdDevArray[5],6);
   double StdDevAVGVal = ((StdDevVal1+StdDevVal2+StdDevVal3+StdDevVal4+StdDevVal5)/5);
   double MAValue = NormalizeDouble(PArray[0],6);

   if(StdDevVal>StdDevAVGVal&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

   if(StdDevVal>StdDevAVGVal&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

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

此代码中的差异是:

策略条件,

买入信号的情况,

   if(StdDevVal>StdDevAVGVal&&Ask>MAValue)
     {
      Comment("Buy signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Ask value is ",Ask,"\n",
              "MA value is ",MAValue);
     }

卖出信号的情况,

   if(StdDevVal>StdDevAVGVal&&Bid<MAValue)
     {
      Comment("Sell signal","\n",
              "Current Std Dev value is ",StdDevVal,"\n",
              "Std Dev Avg value is ",StdDevAVGVal,"\n",
              "Bid value is ",Bid,"\n",
              "MA value is ",MAValue);
     }

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

 Std Dev n4

双击或将其拖放到图表上后,我们可以找到与以下内容相同的窗口:

简单 Std Dev - Std Dev _ AVG _ MA 窗口

按下“确定”后,我们会发现智能系统与下图一样加载到图表上。

 简单 Std Dev - Std Dev _ AVG _ MA attache

正如我们在图表的右上角所看到的,我们可以找到加载的智能系统。

现在,我们需要查看基于此交易系统生成信号的示例,我们可以依照以下示例看到这一点:

买入信号的情况,

简单 Std Dev - Std Dev _ AVG _ MA - 买入信号

正如我们在图表左上角的上一个例子所看到的,这个交易系统生成了五行注释:

  • 买入信号
  • 当期 Std Dev 值
  • Std Dev 平均值
  • 要价值
  • Ma 值

卖出信号的情况,

 简单 Std Dev - Std Dev _ AVG _ MA - 卖出信号

正如我们通过前面的卖出信号示例找到的,有五行基于此交易系统的注释:

  • 卖出信号
  • 当期 Std Dev 值
  • Std Dev 平均值
  • 出价值
  • Ma 值

贯穿前面的内容,我们学习了如何基于每个提到的策略创建一个可用于生成自动信号的交易系统。


结束语

现在和前面的主题之后,我们考虑我们已对标准偏差指标了解了很多,譬如我们学到了它是什么,它通知我们什么,或它衡量什么,以及如何通过一个应用例子来手工计算它,以此加深我们对该指标的理解。 在较好地理解了这个指标之后,我们学会了如何基于该指标的基本概念,在简单策略里运用它。 如我们所学,如何基于简单 Std Dev - 波动率策略,将其用于波动率测量。 如何基于简单标准偏差 - 标准偏差和 MA 策略,以及标准偏差、标准偏差均值、MA 策略,基于两种不同的条件获取买入或卖出信号。 之后,我们学会了为每个策略设计一个分步蓝图,来帮助我们顺滑、轻松地为每个策略创建一个交易系统。 其后,我们根据每个提到的策略,以 MQL5 创建了一个交易系统,MetaTrader 5 能利用该策略自动生成信号,从而帮助我们节省时间,根据特定条件获得准确的信号,再依据得到的清晰信号来避免有害的情绪和主观性,这些都是来自编程的好处。

如果您尝试将该指标与其它技术指标一起配合,以便获得更多视角,来多角度审视,这将是有用的,因为这是技术分析的功能之一,因为当您设计一个交易系统时,该系统可为您提供有关金融产品最重要因素的清晰见解。

我需要再次确认,在此其宗旨主要用作教学目的,在您用作它处之前,您必须自行测试所有策略,并确保它对您有用或适合您。 我希望您能掌握本文的主题,为您激发有助于增强交易的新思路,并对您有所帮助。

如果您发现本文有用,并且想阅读更多类似的文章,从而学习如何通过最流行的技术指标设计交易系统,推荐您查阅我在本系列中的其它文章。

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

神经网络变得轻松(第二十一部分):变分自动编码器(VAE) 神经网络变得轻松(第二十一部分):变分自动编码器(VAE)
在上一篇文章中,我们已熟悉了自动编码器算法。 像其它任何算法一样,它也有其优点和缺点。 在其原始实现中,自动编码器会尽可能多地将对象与训练样本分开。 这次我们将讨论如何应对它的一些缺点。
神经网络实验(第 2 部分):智能神经网络优化 神经网络实验(第 2 部分):智能神经网络优化
在本文中,我将利用实验和非标准方法开发一个可盈利的交易系统,并验证神经网络是否对交易者有任何帮助。 若在交易中运用神经网络的话, MetaTrader 5 完全可作为一款自给自足的工具。
从头开始开发智能交易系统(第 24 部分):提供系统健壮性(I) 从头开始开发智能交易系统(第 24 部分):提供系统健壮性(I)
在本文中,我们将令系统更加可靠,来确保健壮和安全的使用。 实现所需健壮性的途径之一是尝试尽可能多地重用代码,从而能在不同情况下不断对其进行测试。 但这只是其中一种方式。 另一个是采用 OOP。
DoEasy. 控件 (第 11 部分): WinForms 对象 — 群组,CheckedListBox WinForms 对象 DoEasy. 控件 (第 11 部分): WinForms 对象 — 群组,CheckedListBox WinForms 对象
本文将讨论 WinForms 对象群组,及创建 CheckBox 对象列表对象。