English Русский Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
学习如何设计不同的移动平均线系统

学习如何设计不同的移动平均线系统

MetaTrader 5交易 | 11 四月 2022, 09:48
2 911 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

我认为无论您在交易领域的经历有哪些,您肯定都听到过“趋势是您的朋友”这句话。 若是您不曾听说过,它在此的意思如同大家都知道的那样,我们有不同类型的市场方向或价格走势。

  • 上升趋势:当价格不断产生更高的低点和更高的高点,我们就可见到
  • 下降趋势:当价格与上升趋势相反时,我们可以看到下降趋势,即不断产生更低的高点和更低的低点。
  • 横盘:除了上升趋势或下降趋势,其它的走势。

下图是用折线图来展示上升趋势和下降趋势,除此之外的任何走势都是横盘:

上升趋势

下降趋势

现在,我们识别出了趋势,但为什么趋势是我的朋友?

我们将在这里讨论趋势,即上升趋势和下降趋势,因为它们有明显的上升或下降走势。 我们可以看到一个特定市场参与者的控制力。 在上升趋势中,我们可以看到买方是控制者,他推动价格上升,无论供应量是多少,我们称这个市场为牛市。 反之亦然,在下跌趋势中,我们可以看到卖方是控制者,他把价格向下压到此处。 我们称这个市场为熊市。

但在某些情况下,我们可能会经历所谓的洗盘或假突破。 这些假突破也许会损害我们的交易结果,这是怎么回事? 我们将在此看到它们会如何做,但首先让我们来识别什么是实盘或假突破。

假突破:这些信号是我们做出决策的导火索,而在做出决策后,市场却违背了这一决策。 可确定的是,这种决策会损害我们的交易结果。 这些假突破或洗盘可以依据多种策略进行过滤来减少。 对我们来说,最好的策略之一就是利用移动平均线,这是本文的主题,我们学习如何利用一些移动平均线策略,以及如何依据它们设计一款准确、简单、系统的算法交易系统。

在本文中,我们将讨论以下主题:

免责声明:本文的所有内容仅用于教学目的,不针对其它目的。 因此,根据本文内容所采取的任何行动,都将是您的责任,因为本文内容不保证任何结果。 所有策略都可能需要事先测试和优化,从而获得更好的结果,正如我在本文中提到的,本文的主要目标只是为了教学目的。

所有代码均由 MQL5 编写,并将在 MT5 上进行测试。

请注意,有众多策略可根据任何规则过滤生成的信号,甚至可采用本文自身所讨论的移动平均值。 因此,本文的目的是与您分享一些移动平均线策略,以及如何设计一款算法交易系统,让您开阔眼界,了解您可以做什么、以及如何制定您的交易策略。 现在,我们来学习如何设计不同的移动平均线系统,我很高兴能与大家分享…


移动平均线定义


移动平均线是技术分析中常用的一种指标,它的目的是计算我们给定的一个特定时间段内价格的平均值,或者换句话说,它帮助我们平滑价格数据,从而舒缓图表上短期波动的随机性或波动性。

移动平均线有很多种类型,它们之间的差异与每个类型的不同计算方式有关,就像我将在下一个主题中详细提到的那样。 但在此,在深入细节之前,我只想让你们知道,在许多类型之间有所差异,从而能根据情况计算得到最好的结果。

移动平均线是一个趋势跟踪指标,在于它是由价格计算得出的。 因此,如果价格以特定的趋势移动,移动平均线也会遵循相同的趋势。

移动平均线也是一个滞后指标,因为它在价格之后移动,这很正常,因为它由价格计算而来,故价格必须先移动。 或者,换句话说,我们必须先有价格数据,然后我们才可以计算这些价格数据来得到移动平均数据。

根据移动平均线的性质,我们就可以理解移动平均线:

  • 它给出的是平均值。
  • 它能更好地顺应市场。
  • 它能确认存在趋势,或者帮助我们识别趋势。
  • 它将清除价格中的噪音或随机波动。
  • 它能帮助我们避免因随机运动而产生的洗盘或假突破,因为它将被消除。
  • 还有更多……

移动平均线的类型


可采用多种类型的移动平均线,最常用的是:

  • 简单移动平均线。
  • 加权移动平均线。
  • 指数移动平均线。

它们之间的主要区别在于不同的算法,从而如同我前面提到的那样获得更好的结果。

因此,我们现在应辨别这些类型的移动平均线,并探求它们之间的差异。 我们还将看到如何在 MQL5 中运用这些移动平均值,或者如果我们想采用特定类型的移动平均值,我们该如何调用它们。

简单移动平均线:

这种类型是最简单的移动平均线形式,其常用的快捷方式是 SMA。

它是依据在特定时间段内取一组给定值并取算术平均值来计算得出的。 或者将一组价格累加,然后除以集合中的价格数量。

SMA

示例:我们有 5 个交易日,这 5 天的收盘价如下:

  • Day1 = 10
  • Day2 = 15
  • Day3 = 20
  • Day4 = 30
  • Day5 = 35

如果我们打算获取这 5 天内的 SMA,其计算如下:


SMA 示例

加权移动平均线

加权移动平均(WMA)由于它被广泛使用,因为它给出了一个特定时间段内的平均价格,但此处的差异在于,它为最近的数据提供了更多的权重。 这意味着,如果我们计算 10 个交易日,这类的平均值不会给出所有 10 个交易日的权重,但会赋予最近的数据更多的权重。

它的计算如下公式:

WMA


示例:

如果我们计算同样的 5 个交易日,并且这 5 天的收盘价如下:

  • Day1 = 10
  • Day2 = 15
  • Day3 = 20
  • Day4 = 30
  • Day5 = 35

如果我们想获得这 5 天的 WMA,将按以下公式计算:

WMA 示例


WMA 示例1


指数移动平均线

指数移动平均线或 EMA 是最常用的。 它给出了价格的平均值,这里的差异是 EMA 不会剔除 MA 计算周期之前的时段,这意味着如果我们需要计算 10 MA,需要考虑这 10 个交易日之前的时段。

其计算公式如下:

首先,我们将计算 “K” 来表示指数,从而区别于计算区间的权重,“n” 将表示区间的数量:

EMA

则,

EMA

示例:

如果我们计算同样的 5 个交易日,并且这 5 天的收盘价如下:

  • Day1 = 10
  • Day2 = 15
  • Day3 = 20
  • Day4 = 30
  • Day5 = 35
  • Day6 = 40

如果我们想获得这 5 天的 EMA,将按以下公式计算:

EMA 示例


EMA 示例

注意此处,昨天的 EMA 将作为计算第 6 天的第一个 EMA,因此我们将取 5 天(22)的 SMA。


现在,在辨别完毕什么是移动平均线和移动平均线的类型之后,我们将进入本文中最有趣的部分。 我们将论及移动平均线策略,以及如何为它们设计算法交易系统。


策略1:一条移动平均线交叉

在本文中,我们将选择简单移动平均线。 然而,您可以在代码中采用任何所需的移动平均类型。

根据该策略,价格和 SMA 将在每次即时报价时进行检查:

  • 价格 > SMA: 信号是买入,我们需要在图表上出现这个信号作为注解。
  • 价格 < SMA: 信号是卖出,我们需要在图表上出现这个信号作为注解。
  • 如果还有别的什么,则不要做任何事。

下面的屏幕截图显示了我们想要设计的一个简单的移动平均线蓝图:

1MA 蓝图


以下是该策略的设计代码:

//+------------------------------------------------------------------+
//|                                            One SMA 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"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for price
   double myMovingAverageArray1[];
   
   //define Ask, Bid
   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
   
   //define the properties of  MAs - simple MA 24
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   
   //sort the price arrays current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   
   //Defined MA - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   
   //Check if we have a buy entry signal
   if (
      (Ask>myMovingAverageArray1[0])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (Bid<myMovingAverageArray1[0])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

以下屏幕截图显示了执行代码后生成的信号:

1MA - 买入信号

1MA - 卖出信号

策略 2:两条移动平均线交叉

在该策略中,我们将取用两条简单移动平均线。 较短的简单移动平均线周期为 24,较长的一个周期为 50。

根据这一策略,我们需要在每次即时报价时检查两条简单移动平均线:

  • 若 24 SMA > 50 SMA: 信号为买入,我们需要在图表上出现这个信号作为注解。
  • 若 24 SMA < 50 SMA: 信号为卖出,我们需要在图表上出现这个信号作为注解。
  • 如果有的话,什么也不要做。

下面的屏幕截图展示了我们想要设计的两条简单移动平均线蓝图:

2MA 蓝图


以下是该策略的设计代码:

//+------------------------------------------------------------------+
//|                                            Two SMA 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"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[];
   
   //define the properties of  MAs - simple MA, 1st 24 / 2nd 50
   int movingAverage1 = iMA(_Symbol, _Period, 24, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   
   //Defined MA1, MA2 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

以下屏幕截图显示了执行代码后生成的信号:

2MA - 买入


2MA - 卖出信号


策略 3:三条移动平均线交叉

在该策略中,我们将采用三条简单移动平均线:较短的简单移动平均线周期为 10,较长的一条周期为 48,还有一条的周期介于 24 之间。

根据该策略,我们需要在每次即时报价来临时检查三条简单移动平均线:

  • 若 10 SMA > 24 SMA, 10 SMA > 48 SMA, 且 24 SMA > 48 SMA: 信号为买入,我们需要在图表上出现这个信号作为注解。
  • 若 10 SMA < 24 SMA, 10 SMA < 48 SMA, 且 24 SMA < 48 SMA: 信号为卖出,我们需要在图表上出现这个信号作为注解。
  • 如果有的话,什么也不要做。

下面的屏幕截图展示了我们想要设计的三条简单移动平均线蓝图:

3MA 蓝图


以下是该策略的设计代码:

//+------------------------------------------------------------------+
//|                                          Three SMA 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"
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //create an array for several prices
   double myMovingAverageArray1[], myMovingAverageArray2[],myMovingAverageArray3[];
   
   //define the properties of  MAs - simple MA, 1st 10 / 2nd 24, 3rd 48
   int movingAverage1 = iMA(_Symbol, _Period, 10, 0, MODE_SMA, PRICE_CLOSE);
   int movingAverage2 = iMA(_Symbol,_Period,24,0,MODE_SMA,PRICE_CLOSE);
   int movingAverage3 = iMA(_Symbol,_Period,48,0,MODE_SMA,PRICE_CLOSE);
   
   //sort the price arrays 1, 2, 3 from current candle
   ArraySetAsSeries(myMovingAverageArray1,true);
   ArraySetAsSeries(myMovingAverageArray2,true);
   ArraySetAsSeries(myMovingAverageArray3,true);
   
   //Defined MA1, MA2, MA3 - one line - currentcandle, 3 candles - store result
   CopyBuffer(movingAverage1,0,0,3,myMovingAverageArray1);
   CopyBuffer(movingAverage2,0,0,3,myMovingAverageArray2);
   CopyBuffer(movingAverage3,0,0,3,myMovingAverageArray3);
   
   //Check if we have a buy entry signal
   if (
      (myMovingAverageArray1[0]>myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]<myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]>myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]<myMovingAverageArray3[1])
      )
         {
         Comment("BUY");
         }
    
   //check if we have a sell entry signal      
   if (
      (myMovingAverageArray1[0]<myMovingAverageArray2[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray2[1])
   && (myMovingAverageArray1[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray1[1]>myMovingAverageArray3[1])
   && (myMovingAverageArray2[0]<myMovingAverageArray3[0])
   && (myMovingAverageArray2[1]>myMovingAverageArray3[1])
      )
         {
         Comment("SELL");
         }          
  }
//+------------------------------------------------------------------+

以下屏幕截图展示了执行代码后生成的信号:

3MA - 买入信号


3MA - 卖出信号


结束语

在本文中,我通过分享三种不同的策略,论及最常用和最重要的指标之一。 我还尝试展示我们如何使用这些指标,以及我们如何根据每一个指标设计算法交易系统。 当然,在事先测试和优化之后,这些策略可以准确有效地使用。



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

DoEasy 函数库中的图形(第九十五部分):复合图形对象控件 DoEasy 函数库中的图形(第九十五部分):复合图形对象控件
在本文中,我将研究管理复合图形对象的工具包 — 管理扩展标准图形对象的控件。 今天,我从复合图形对象重新定位的内容稍微离题 ,并实现图表上复合图形对象的变更事件处理。 此外,我将重点讲解管理复合图形对象的控件。
DoEasy 函数库中的图形(第九十四部分):移动和删除复合图形对象 DoEasy 函数库中的图形(第九十四部分):移动和删除复合图形对象
在本文中,我将启动开发各种复合图形对象事件。 我们还将部分研究移动和删除复合图形对象。 实际上,在此,我还会把前一篇文章中实现的东西进行微调。
DoEasy 函数库中的图形(第九十六部分):窗体对象中的图形和鼠标事件的处理 DoEasy 函数库中的图形(第九十六部分):窗体对象中的图形和鼠标事件的处理
在本文中,我将启动创建处理窗体对象中的鼠标事件的功能,以及向品种对象添加新属性并跟踪。 此外,我将改进品种对象类,因为图表品种现在有新的属性需要考虑和跟踪。
MetaTrader 5 的 WebSocket — 使用 Windows API MetaTrader 5 的 WebSocket — 使用 Windows API
在本文中,我们将使用 WinHttp.dll 针对 MetaTrader 5 平台创建 WebSocket 客户端程序。 客户端最终将作为一个类实现,并借助 Binary.com 的 WebSocket API 进行测试。