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

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

MetaTrader 5交易 | 15 七月 2022, 08:49
3 358 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

在本文中,我们将研究最流行和常用的交易工具之一。 我们将谈一谈移动平均收敛/发散(MACD)指标。 我们将对其进行详细研究,看看它在交易中能带来什么益处。 在之前的文章中,我们已经提到,辨别行情的趋势或方向非常重要,据此方向方可制定相应的交易决策,并立于不败之地。

故此,第一步是判定行情的方向。 根据方向,有两种不同类型的走势:

  • 定向走势。
  • 非定向走势。

定向走势:它意味着我们可以清晰地找到价格走势的方向,要么上行,要么下行。 因此,根据走势类型,我们可以识别出两种不同的趋势:上行趋势和下行趋势。

  • 上行趋势:意味着价格的方向是向上的或价格向上移动,这意味着价格正在增长。 通常这意味着行情由买家或多头控制,这种行情状态通常被称为牛市。 下一张图展示了这一走势,其中价格创造了更高的低点和更高的高点。


上行趋势

  • 下行趋势:意味着价格的方向是向下的或价格向下移动。 即,价格正在下跌。 可以说,行情由卖方或空头控制,因此这种行情状态通常被称为熊市。 下图展示了这种状态,其中价格创造了更低的高点和更低的低点。


下行趋势

非定向走势:它意味着我们无法发现明晰的价格走势方向,即不能判定价格是上涨亦或下跌。 这种走势类型可称为窄幅震荡。 因此,一般来说,除了上行或下行趋势之外的任何走势都可被称为窄幅震荡。 有许多形式可以归纳为窄幅震荡形式。

既然我们已经辨别出了价格行为,并找到了如何判定其方向,那么我还需要挑明另一件事。 这是关于价格行为的更高级的东西,就是还有另一个维度:我们必须辨别动量,它代表价格走势的速率。 有许多工具能帮助我们判定动量,并判定走向是否强劲。

其中一个工具是“移动平均收敛/发散(MACD)”指标,它是技术交易者群体最常用的指标之一。 在本文中,我们会更详尽地研究这个指标,并学习如何基于它设计一款交易系统。 为此,我们将通览以下主题:

我们将更详细地探究 MACD 指标:它衡量的是什么?以及如何计算?并将在 “MACD 定义”章节看到一个示例。 然后,我们将学习能与 MACD 配套使用的简单策略,它们对我们的交易非常有用 — “MACD 策略”章节。 之后,在“MACD蓝图”章节中,我们将学习如何设计蓝图,该蓝图在基于上述 MACD 策略设计交易系统时会有所帮助。 然后,我们将学习如何实现这些策略设计这个交易系统。

再次,我们将利用 MetaTrader 5 交易平台和集成到 MetaTrader 5 中的 MetaQuotes 语言编辑器来设计该交易系统。如果您还安装它,可以通过以下链接下载:https://www.metatrader5.com/zh/download 得到它。

下载并安装之后,您将看到以下 MetaTrader 5 窗口:

 MT5 交易终端

之后,您可以打开 MetaTrader 5 并按 F4,或使用“工具菜单” -> “MetaQuotes 语言编辑器” 打开 MetaQuotes 语言编辑器,如以下窗口所示:

MQL5 打开

或按下 IDE 按钮。

MT5 终端 IDE 按钮

然后,将为 MetaQuotes 语言编辑器打开以下窗口:

Metaeditor - 创建新文件窗口

此窗口为编辑器提供了可以执行操作的各种选项,其中包括:

1. 打开一个新文件,创建一个可以遵照程序条件自动执行的智能交易系统。

2. 打开一个新文件,创建一个自定义指标,来帮助我们清晰地读取图表,并查看图表上没有显示的内容。

3. 打开一个新文件,创建执行一次性指令的脚本。

在本文中,我们将选择第一个选项来创建可以自动执行和运行程序指令的智能交易系统。

除此之外,我建议您在用它之前测试所学的一切。 如果您需要加深自己的知识,那么您必须多加练习,并应用自己所学的知识,因为这将帮助您发现更多对于交易有用的新思路和见解。

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

现在,我们来通览主题,从而了解更多关于交易的信息,以及如何基于这些新知识创建交易系统。


MACD 定义

这部分的主题很有趣,其中我们将更详细地了解可在交易里运用的最流行、最有用的一款工具 — 移动平均收敛/发散,即 MACD(通常发音为 M-A-C-D 或 MAC-Dee,但这并不重要)。 重要的是了解如何使用该指标,它衡量的是了什么?以及如何计算。 这些知识对于我们和我们的交易都很有用,因为它可以强化我们的结果,并可开阔眼界发现对交易有益的新思路。

什么是 MACD?

它是移动平均收敛/发散,是由杰拉尔德·阿佩尔创建及开发的振荡器指标。 它在计算中用到了两条指数移动均线。 如果您打算了解更多关于移动平均线及其类型的信息,请阅读我之前的文章,了解如何设计不同的移动平均线系统。 MACD 是一款趋势跟踪指标,即它跟踪趋势并确认之。

它由两条指标线组成:

  • 一条 MACD 线,其为快速线。 这是两条指数移动平均线之间的差值结果:第一条指数移动均线的周期默认为 12,第二条指数移动均线的周期默认为 26,但您可以根据自己的偏好和交易需求进行调整。
  • 另一条是信号线,其为慢速线。 这是 MACD 线 9 个周期的指数平滑平均值的结果,也是为什么这条线较慢的原因,因为它是两条移动均线之间差值的移动平均值。

MACD 指标的另一个组成部分是 MACD 直方图。 这是 MACD 线和信号线之间的差值结果。 它示意两条 MACD 和信号线之间的差值,它既可以较宽,亦可较窄。 但在本文中,我们将重点关注这两条线,和解读它们的策略。

因此,MACD 指标计算包括以下步骤:

  1. 获取 12 周期的指数移动平均值(12 EMA)。
  2. 获取 26 周期的指数移动平均值(26 EMA)。
  3. 获取 12 EMA 和 26 EMA 之间的差值 = MACD 线之间的差值。
  4. 计算 MACD 线的 9 周期移动平均值 = 信号线。

其中 EMA = (收盘价*(2/(n+1)))+(前一个均值*(1-(2/(n+1))))。 请注意,第一条计算出的移动均线很简单,后随计算中的指数移动均线。

我们来看一个示例,了解如何应用该计算:

我们需要一个最小周期为 34 的数据,因为计算 12 EMA 需要 12 个周期,计算 26 EMA 需要 26 个周期,它们之间的差值是 MACD 线,然后我们需要更多的 9 周期 MACD 线数据来计算信号线。 因此,如果我们有以下所需区间的数据:

周期 收盘价
1 100
2 130
3 140
4 130
5 120
6 140
7 160
8 170
9 155
10 140
11 160
12 180
13 190
14 200
15 210
16 200
17 190
18 185
19 195
20 200
21 210
22 220
23 215
24 225
25 230
26 235
27 230
28 225
29 220
30 215
31 225
32 235
33 240
34 245

现在我们可以计算 MACD 指标,首先我们计算 12 EMA,如下所示:

12 EMA

然后,我们计算 26 EMA:

26 EMA

然后,我们计算 12 EMA 和 26 EMA 之间的差值作为 MACD 线,其如下所示:

MACD 线

然后计算 MACD 线:

信号线

如此,我们计算出本例的 MACD 线。 请注意,我们其实不需要手工计算,因为它是一个直接在 Meta Trader 5 中提供的内置指标。 通过理解指标的每个细节,我们可以更好地把握这个概念。 您会发现,在插入该指标时,它的样子与 MetaTrader 5 里的略有不同,因为正如我所提到的,它有两条线(MACD 线和信号线),出现的差别如下:

  • 代表 MACD 线的柱线
  • 代表信号线的线

但它与两条线的版本是同一个指标,除了外观并无其它任何区别。 现在,我们看看如何插入指标,以及如何在图表上显示它。

在已打开的 MetaTrader 5 终端中,单击插入菜单,然后选择指标 -> 振荡器 -> MACD。

MACD 插入

这将打开 MACD 参数窗口:

MACD 插入窗口

该窗口含有以下 MACD 参数:

1,2,3: 在 MACD 中计算用的判定周期。

4: 在 MACD 中计算用的判定价格类型。

5: 设置 MACD 线的颜色和柱线宽度。

6: 设置信号线的颜色、线型和宽度。

判定 MACD 的所需参数并按下“确定”后,指标将出现在图表上,如下所示:

MACD 附着

现在我们已经学习了 MACD 指标是什么,我们如何计算它,以及它如何出现在图表上。


MACD 策略

在这一部分中,我们将学习两种可以基于 MACD 指标的简单交易策略。 该策略将取决于交叉,因为我们提到的 MACD 指标是一个振荡器指标,它围绕零轴附近振荡。 MACD 本身由两条线组成,我们在运用策略时会根据两个概念。

  • 策略一:MACD 设置检测器。

根据这一策略,我们需要识别行情设置:是做多设置、亦或做空设置。 换言之,我们需要识别行情方向,如果是看涨或看跌,这都可依据 MACD 辨别。 如果 MACD 主线突破零轴向上,这将是做多(或看涨)设置,反之亦然。如果 MACD 主线突破零轴向下,这将是做空(或看跌)设置。

故此,

MACD 柱线 > 0 = 看涨设置

MACD 柱线 < 0 = 看跌设置

  • 策略二:MACD 线交叉

根据该策略,我们需要识别 MACD 主线和信号线交叉生成的信号,是否存在做多信号或做空信号。 如果 MACD 主线突破信号线向上,这将是做多信号;如果 MACD 主线突破信号线向下,这将是做空信号。

故此,

MACD 柱线 > MACD 信号线 = 做多信号

MACD 柱线 < MACD 信号线 = 做空信号

基于 MACD 指标,我们有两种简单策略可供选择。 一般来说,有许多策略可以基于 MACD,这是非常有用的。 但我们只参考用于理解 MACD 概念的最简单策略。 接下来,我们将通过以下主题学习如何运用上述简单策略来设计交易系统。


MACD 蓝图

在这一章节中,我们需要创建一个蓝图,帮助我们基于上述两种策略设计一款交易系统;我们设计的系统或程序会通知计算机要做什么,这个蓝图是为了帮助我们一步一步地创建这个交易系统。

  • 策略一:MACD 设置检测器

根据这一策略,我们需要告诉计算机在每次即时报价之时检查 MACD 主线值,然后根据与零轴的比值得出设置。 如果 MACD 主线高于零轴,我们需要程序在图表上给我们一个注释:“MACD 主线为看涨设置...”,然后是当前得 MACD 主线值。 或者,如果 MACD 主线低于零轴,我们需要该程序在图表上给我们一个注释,“看跌设置,因为 MACD 主线是...”,然后是当前得 MACD 主线值。

下图示意了该策略的蓝图:

设置策略蓝图

  • 策略二:MACD 线交叉

根据该策略,我们需要告诉计算机在 MACD 线(主线和信号线)之间交叉时,为我们给出相应的信号。 故此,程序将在每次即时报价之时检查 MACD 线,当 MACD 主线突破 MACD 信号线向上时,程序应在图表上注释“做多信号,因为 MACD 主线在 MACD 信号线上方”,然后是新的一行注释 “MACD 主线值为...”,然后是当前的 MACD 主线值,然后再是新的一行,在图表上注释 “MACD 信号线值为...”,然后是当前的 MACD 信号线值。

下图示意了该策略的蓝图:

Signals strategy blueprint

MACD 交易系统

在这一章节中,我们将学习如何运用 MQL5 编程语言编写这些策略,从而创建交易系统。 然后,应在 MetaTrader 5 交易平台中执行生成的程序,根据预定条件为我们提供预定输出。 但在创建这两个简单策略之前,我们先学习如何创建一个程序,该程序可以在图表上显示 MACD 的值作为注释。

以下程序代码将在注释里显示 MACD 主线值:

//+------------------------------------------------------------------+
//|                                  Simple MACD MainLine System.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()
  {
   //cretaing an array for prices
   double MACDMainLine[];
   
   //Defining MACD and its parameters
   int MACDDef = iMACD(_Symbol,_Period,12,26,9,PRICE_CLOSE);
   
   //Sorting price array from current data
   ArraySetAsSeries(MACDMainLine,true);
   
   //Storing results after defining MA, line, current data
   CopyBuffer(MACDDef,0,0,3,MACDMainLine);
   
   //Get values of current data
   float MACDMainLineVal = (MACDMainLine[0]);
   
   //Commenting on the chart the value of MACD
   Comment("MACD Value is ",MACDMainLineVal);
  }
//+------------------------------------------------------------------+

该智能交易系统将生成我们所需的东西:我们需要 MACD 主线值显示在图表上。 此处就是:

简单 MACD 主线系统信号

现在,我们需要将文件附加到图表上,从而自动生成 MACD 主线值。 在导航器中查找程序,可在已打开的 MetaTrader 5 中按 ctrl+N 打开程序:

MACD 导航 1


然后,我们现在需要运行或执行该文件,我们可在图表上拖放该文件、或双击该文件来实现,完成后,您可以发现以下窗口:

简单 MACD 主线系统窗口

启用“允许算法交易”选项,并单击“确定”,智能交易系统将附着在图表上,它将自动生成 MACD 主线,如下所示:

简单 MACD 主线系统附着

现在,我们需要编写一些代码来做更多的工作,该代码不仅可以生成 MACD 主线,还可以生成 MACD 信号线。 下面代码创建程序,该程序可以取 MACD 主线和 MACD 信号线在图表上显示注释:

//+------------------------------------------------------------------+
//|                                      Simple MACD TwoLines System |
//|                                  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()
  {
   //cretaing an array for prices for MACD main line, MACD signal line
   double MACDMainLine[];
   double MACDSignalLine[];
   
   //Defining MACD and its parameters
   int MACDDef = iMACD(_Symbol,_Period,12,26,9,PRICE_CLOSE);
   
   //Sorting price array from current data for MACD main line, MACD signal line
   ArraySetAsSeries(MACDMainLine,true);
   ArraySetAsSeries(MACDSignalLine,true);
   
   //Storing results after defining MA, line, current data for MACD main line, MACD signal line
   CopyBuffer(MACDDef,0,0,3,MACDMainLine);
   CopyBuffer(MACDDef,1,0,3,MACDSignalLine);
   
   //Get values of current data for MACD main line, MACD signal line
   float MACDMainLineVal = (MACDMainLine[0]);
   float MACDSignalLineVal = (MACDSignalLine[0]);
   
   
   //Commenting on the chart the values of MACD main line and MACD signal line
   Comment("MACD Main Line Value is ",MACDMainLineVal,"\n" 
   "MACD Signal Line Value is ",MACDSignalLineVal);
  }
//+------------------------------------------------------------------+

代码编写完毕,并测试之后,将生成 MACD 主线和 MACD 信号线,如下图所示:

简单 MACD 双线系统信号

现在,我们需要将智能交易系统的这个文件附着到图表上,从而在图表上自动生成 MACD 线和 MACD 信号线值,作为两行注释。 如此,在导航器中选择程序:

MACD 导航 2

双击或将文件拖放到图表上。 之后,将打开以下智能交易系统窗口:

简单 MACD 双线系统窗口

按下”确定“键后,将加载智能交易系统,并自动在图表上生成值,如下图表示:

简单 MACD 双线系统加载

现在,我们需要针对两种策略进行编码,MACD 主线与零轴交叉、和 MACD 主线与 MACD 信号线交叉。 请注意,此处我们只提及生成的信号,不考虑获利了结,因为有许多工具可用于此目的,如指标本身或价格行为。 在此,我们重点关注生成的信号。 我们继续为这些策略创建代码。

  • 策略一:MACD 设置检测器 — 根据零轴与 MACD 主线交叉生成当前行情设置。

MACD 柱线 > 0 = 看涨设置

MACD 柱线 < 0 = 看跌设置

以下是程序代码,该程序根据 MACD 主线和零轴交叉、以及提取 MACD 主线值生成行情设置注释:

//+------------------------------------------------------------------+
//|                                         MACD Setup Dectector.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()
  {
   //cretaing an array for prices for MACD main line
   double MACDMainLine[];
   
   //Defining MACD and its parameters
   int MACDDef = iMACD(_Symbol,_Period,12,26,9,PRICE_CLOSE);
   
   //Sorting price array from current data
   ArraySetAsSeries(MACDMainLine,true);
   
   //Storing results after defining MA, line, current data
   CopyBuffer(MACDDef,0,0,3,MACDMainLine);
   
   //Get values of current data
   float MACDMainLineVal = (MACDMainLine[0]);
   
   //Commenting on the chart the value of MACD
   if (MACDMainLineVal>0)
   Comment("Bullish Setup As MACD MainLine is ",MACDMainLineVal);
   
   if (MACDMainLineVal<0)
   Comment("Bearish Setup As MACD MainLine is ",MACDMainLineVal);
  }
//+------------------------------------------------------------------+

编写代码并测试完毕后,下图示意它如何根据 MACD 主线和零轴之间的交叉生成设置:

看涨设置信号:

MACD 设置检测器看涨信号

看跌设置信号:

MACD 设置检测器看跌信号

现在,在这之后,我们需要将该智能交易系统加载到图表上,通过拖放文件至图表上、或从导航器窗口双击它来自动生成这些信号:

MACD 导航 3

随即打开以下智能交易系统窗口:

MACD 设置检测器窗口

按下“确定”后,智能系统将被加载到图表上,并依据信号在图表上自动生成注释。

MACD 主线值的看涨设置信号:

MACD 设置检测器加载

MACD 主线值的看跌设置信号:

MACD 设置检测器加载 — 看跌

  • 策略二:MACD 线交叉 — 依据 MACD 主线和 MACD 信号线之间的交叉生成做多和做空信号:

MACD 柱线 > MACD 信号线 = 做多信号

MACD 主线 < MACD 信号线 = 做空信号

以下代码创建一个程序,在图表上生成注释,其内容是根据 MACD 主线和 MACD 信号线交叉生成的做多或做空信号,以及提取的 MACD 主线和 MACD 信号线的数值:

//+------------------------------------------------------------------+
//|                          MACD Lines Crossover Signals System.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()
  {
   //cretaing an array for prices for MACD main line, MACD signal line
   double MACDMainLine[];
   double MACDSignalLine[];
   
   //Defining MACD and its parameters
   int MACDDef = iMACD(_Symbol,_Period,12,26,9,PRICE_CLOSE);
   
   //Sorting price array from current data for MACD main line, MACD signal line
   ArraySetAsSeries(MACDMainLine,true);
   ArraySetAsSeries(MACDSignalLine,true);
   
   //Storing results after defining MA, line, current data for MACD main line, MACD signal line
   CopyBuffer(MACDDef,0,0,3,MACDMainLine);
   CopyBuffer(MACDDef,1,0,3,MACDSignalLine);
   
   //Get values of current data for MACD main line, MACD signal line
   float MACDMainLineVal = (MACDMainLine[0]);
   float MACDSignalLineVal = (MACDSignalLine[0]);
   
   
   //Commenting on the chart the value of MACD
   if (MACDMainLineVal>MACDSignalLineVal)
   Comment("Buying Signal As MACD MainLine is Above MACD SignalLine","\n"
   "MACD Main Line Value is ",MACDMainLineVal,"\n" 
   "MACD Signal Line Value is ",MACDSignalLineVal);
   
   if (MACDMainLineVal<MACDSignalLineVal)
   Comment("Shorting Signal As MACD MainLine is Below MACD SignalLine","\n"
   "MACD Main Line Value is ",MACDMainLineVal,"\n" 
   "MACD Signal Line Value is ",MACDSignalLineVal);
  }
//+------------------------------------------------------------------+

在编写代码并测试完毕后,我们将得到一个生成信号和曲线值的程序。

做多信号涵盖 MACD 主线突破信号线向上,以及 MACD 主线和 MACD 信号线的数值:

MACD 线与信号线交叉形成做多信号

做空信号涵盖 MACD 主线突破 MACD 信号线向下,以及两条曲线的数值:

MACD 线与信号线交叉形成做空信号

代码编写完毕后,需将智能系统文件加载到图表上,从导航器窗口双击文件、或将其拖放到图表上即可自动生成信号:

MACD 导航 4


之后,智能系统将加载到图表上,并在图表上显示信号。

根据策略因素生成的做多信号会显示在新的一行,并伴随 MACD 线的数值作为注释:

加载的 MACD 线与信号线交叉信号

根据策略得到的做空信号及其背后的原因,然后提取 MACD 线的数值作为两行新注释:

加载的 MACD 线与信号线交叉信号 — 做空


结束语

移动平均收敛/发散(MACD)指标对于我们的交易是有益的最有用工具之一,它可配套众多有用的策略,有助于在交易中获得更好的结果。 学习如何运用这个伟大的工具来创建自动化交易系统非常重要,它可以帮助我们令交易更容易、更有效、更有利可图;且在本文中,我尝试与大家分享这些概念。

我们已详细研究了 MACD 指标本身的含义,以及在应用示例中如何计算它,如此来加深我们对该指标的理解;然后我们知道了基于 MACD 交叉概念的简单策略;然后,我们创建了蓝图,进一步了解如何基于这些策略设计交易系统;然后,我们知道了如何针对 MACD 进行编码,并详细介绍了基于这些策略创建交易系统。 我建议您在真实帐户里运行它之前,测试您知道的所有内容,从而确保它适合您的交易风格和计划。

我相信,一旦您掌握了这些细节,也许会为您带来与主题相关或不相关的新见解和思路;我希望在阅读本文后能够涌现新的思路,这些新思路如此之新颖,能对我们的交易有所帮助,从而获得更好的结果。 所以,我希望这篇文章能对您和您的交易产生积极影响。

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

从头开始开发智能交易系统(第 11 部分):交叉订单系统 从头开始开发智能交易系统(第 11 部分):交叉订单系统
在本文中,我们将创建一个交叉订单系统。 有一种类型的资产让交易员的生涯变得非常困难 — 那就是期货合约。 但为什么令他们的职业生涯变得如此困难?
从头开始开发智能交易系统(第 10 部分):访问自定义指标 从头开始开发智能交易系统(第 10 部分):访问自定义指标
如何在智能交易系统中直接访问自定义指标? 一款交易 EA 仅在能够使用自定义指标的情况下才是真正有用;否则,它只是一组代码和指令而已。
从头开始开发智能交易系统(第 12 部分):时序与交易(I) 从头开始开发智能交易系统(第 12 部分):时序与交易(I)
今天,我们将创建时序与交易,从而快速解读订单流程。 这是我们构建系统的第一部分。 在下一篇文章中,我们将补全该系统缺失的信息。 为了实现这一新功能,我们需要在智能交易系统代码中添加一些新的内容。
如何掌握机器学习 如何掌握机器学习
查看这些有用的资料选集,它们可以辅助交易者提高他们的算法交易知识。 简约算法时代正在成为过去,如果不运用机器学习技术和神经网络,成功变得越来越困难。