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

Mohamed Abdelmaaboud | 23 五月, 2022

概述

在我上一篇文章中,我曾提到了判断价格走势的重要性。 重要的是,根据这个方向或趋势,我们可以制定相应的决策。 故此,我们可以说,判断行情方向将有助于我们提高交易决策和结果。 这就是为什么识别和分析趋势如此重要的原因。 

另一个可以强化我们决策的因素是,我们有能力判断这一确定的趋势是强或弱,或者换句话说,当前这个趋势能否会延续。 已有许多不同的工具可以做到这一点。 在本文中,我们将重点关注动量,它是能帮助我们了解更多趋势的最重要工具之一;因为我们将从本文中更详细地了解运用动量衡量价格或趋势的速度。

在本文中,我们将深度辨别动量,以及如何在 MQL5 中利用它设计一款简单的交易系统;受益于编程的魔力,它可以帮助我们顺利、轻松、有效地进行交易。 本文将讨论以下主题:

我们将在第一个主题“动量定义”中了解有关动量指标的更多信息 — 我们将了解动量指标是什么,以及它是如何计算的。 然后,我们将学习一个简单的策略,它可以增强我们对动量指标的理解,以及它如何为我们提供帮助。 然后,我们将基于上述动量交易策略设计一个交易系统蓝图,从而能帮助我们在 MQL5 中进行编码。 再后,我们将学习如何编码并执行,来获取此策略的信号。 

在本文中,我们将使用 MetaTrader 5 来执行交易系统程序,并使用 MetaTrader 5 内置的 MetaQuotes 语言编辑器编写代码。 您可从以下链接下载 MetaTrader 5:https://www.metatrader5.com/zh/download

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

MT5 平台

现在打开 MetaQuotes 语言编辑器来编写代码。 这可以通过不同的途径完成:

最简单的方法是先启动 MetaTrader 5,然后从键盘上按下 F4 按钮,然后就会打开 MetaQuotes 语言编辑器。

打开 MetaQuotes 语言编辑器的第二种方法是使用工具菜单:

Metaeditor 打开 1

第三种方法是单击 MetaTrader 5 中的 IDE 按钮:

Metaeditor 打开 2

将会打开以下窗口:

Metaeditor 窗口

如果您想了解更多信息,可以参阅我之前的文章:了解为什么以及如何设计算法交易系统

我还建议您尝试运用您学到的知识,因为这会加深您的理解,并会令您对相关或非相关主题有更多的见解和新思路。 本文的主要目标是分享我对 MQL5 这一伟大工具如何能帮助我们进行交易的认知。

请注意,在用它之前,您必须先测试您所学的一切,因为它可能适合我,但也许不适合您的交易风格。 因此,使用演示帐户来测试您学习的所有内容,验证它是否对您有用,这一点非常重要。 

免责声明:本文的所有内容仅用于教学目的,不涉其它。 故此,您应自行针对基于本文内容所采取的任何行动负责,本文内容并不保证任何结果。

现在,我们开始学习这个主题,依据我们的认知构建一个新的模块,并加以改进。


动量定义

在这部分中,我们将学习什么是动量,它的含义是什么,它对我们的交易有啥用处,什么是动量指标,以及我们如何计算它。 这也有助于我们理解它有何作用,以及我们如何使用它;因为当我们理解事物的核心时,我们就可以有效地处理它。

动量概念是关于测量物体的速度。 在此,它衡量的是价格变化的速度。 因此,它将当前价格与之前的价格进行比较,以衡量这两个值之间的变化速度。 这就是动量指标的作用 — 它衡量价格变化的速度,或趋势的加速度。

我们已经知道,首先判断趋势类型或行情方向非常重要,因为我们将根据它制定决策。 因此,我们需要判断趋势:是上行趋势、下行趋势、亦或是横盘。

有关更多信息,请参阅我上一篇文章学习如何设计基于 RSI 的交易系统 

动量的概念非常重要,因为它能从另一个维度来展现趋势走势的强度。 故此,现在我们不仅能观察或判断趋势方向,还能通过分析动量来衡量趋势的强度。

动量指标是一个领先指标,因为它可能引领价格;或者换句话说,它在价格出现变化之前就发生变化了。

根据它的算法,它属于无界振荡器,其被认为是它的缺点之一。 另外的缺点是,根据动量指标的算法,动量指标会错失计算时刻之间的数据。

计算动量有两种不同的方法:

这两种方式都会根据您的首选周期选取当前价格和前一周期处的价格,默认值为 14。 那么,我们来看看这两种计算类型中所采用的公式,并举例说明。

它的计算非常简单 — 它查找当前周期内与前一周期的收盘价之间的差额。

动量 = 当期收盘价 - 前 (n) 周期的收盘价

n = 14, 这是默认周期值

在计算动量指标后,依据计算值生成一条围绕零轴上下振荡的曲线。

我们来看看指标计算的示例。 假设我们有以下数据:

日索引 收盘价
1
10
2 12
3 15
4 17
5 19
6 20
7 18
8 16
9 20
10 22
11 24
12 20
13 18
14 17
15 15

现在,如果我们要计算第 15 天的动量,它应如下所示:

动量 = 当期收盘价 - 前 (n) 周期的收盘价

n = 14 其为前个周期的第 1 天

动量 = 15 - 10 = 5

然后,我们在零轴之上相距差值 5 的位置绘制动量指标,故动量指标应在零轴上下振荡。 从这个算法中我们可以看到其缺点,就像我们前面提到的:当我们从当期减去14 个周期前的数值时,其实错失了许多中间数据。 另一个缺点是该指标是无界限的,即它没有上升或下降的极限。 

计算动量指标的另一种方法是按照比率。 MetaTrader 5 中采用的正是此算法。 它包括以下步骤:

动量 = (当期收盘价 / 前 (n) 期的收盘价)*100

n = 14 其为前个周期的第 1 天

将此计算应用于上一个示例,我们得到的动量如下:

动量 = (15 / 10)*100 = 150

然后,该值将在 100 以上和 150 附近绘制,如图所示,动量指标将在 100 上下振荡。 在本文中,我们将采用这种计算方法,并策略也有基于此。

该指标已经内置在 MetaTrader 5 当中,因此我们只需选择它,它就会插入到图表之中,下面介绍如何做到这一点。

在 MetaTrader 5 中,单击插入开关,然后选择指标,再选择振荡器,最后选择动量,如下图所示:

动量插入

选择动量后,会出现动量指标参数图:

动量参数

前一个窗口包括动量指标的参数,在此,您可以根据自己的交易风格或交易计划设置合适的动量指标;因为这要根据交易员的偏好,每位交易员的动量指标可能不同;您会发现参数如下所示:

  1. 选择与当期价格进行比较的周期值,此处默认值为 14。
  2. 选择在动量计算中应用的价格类型(收盘价、开盘价、最高价、最低价、等等)。
  3. 为您的指标选择首选显示样式,如颜色、线型和线宽。

选择合适的参数并按 ok(确定)后,指标显示如下图所示:

图表上的动量


动量策略

在这一部分中,我们将学习基于动量指标的简单策略。 有很多基于动量的有用的策略和方法,但为了教学起见,我们将选取一个较简单的策略,因为我们的目的是学习如何运用动量,并在学习了主题核心后,为可能出现的新思路打开大门。 终极目的还是学习利用 MQL5 将这些思路设计为交易系统。

我们的策略将在动量曲线和 100 价位之间寻找交叉点。 当动量线向上突破 100 价位时,这应视为买入信号。 而当动量线向下突破 100 价位时,这应视为一个做空信号。

该信号将根据趋势方向生成,且会针对生成的信号进行过滤。 动量指标能给出早期信号和锯齿,可用于过滤生成的信号。

因此,它将如下所示:

上行趋势期间:

下图示意了在上行趋势期间动量交叉生成的信号示例:

上行趋势策略

下行趋势期间:

下图示意当动量指标超过 100 价位时,下行趋势期间可能产生的信号示例:

下行趋势策略

动量交易系统蓝图

在这一部分,我将提出一个设计基于动量策略的交易系统蓝图。 所以这一步是有关未来编码的规划,旨在得到一个可由计算机运行的程序。

动量上行趋势蓝图

动量下行趋势蓝图

参照如上蓝图,我们将利用 MQL5 进行策略编程,从而得到自动发出信号的程序,无需手工检查动量信号。 这就是我们将在本文的下一部分中将要实现的内容。


动量交易系统

首先,为了更深入地理解动量指标是如何编码的,我们将学习如何设计一个简单的动量系统,该系统将在图表上提取动量值生成注释。 这可由以下代码来实现:

//+------------------------------------------------------------------+
//|                                       Simple Momentum 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()
  {
   //Creating array for prices
   double PriceArray [];
   
   //Identifying Momentum properties
   int MomentumDef = iMomentum(_Symbol,_Period,14,PRICE_CLOSE);
   
   //Sorting price array
   ArraySetAsSeries(PriceArray,true);
   
   //Copying results
   CopyBuffer(MomentumDef,0,0,3,PriceArray);
   
   //Getting Momentum value of current price
   double MomentumValue = NormalizeDouble(PriceArray[0],2);
   
   //Commenting Momentum output on the chart
   if(MomentumValue>100) Comment("MOMENTUM VALUE IS: ",MomentumValue);
   
  }
//+------------------------------------------------------------------+

程序编写完成后,我们需要在 MetaTrader 5 交易平台上执行它。 若要执行此操作,请进入 MetaTrader 5 交易终端,然后从导航器中选择所需的文件。 导航器窗口通常在终端中打开。 如果尚未打开,请转到“视图”菜单,并选择“导航器”,或者在 MetaTrader 5 启动后按 Ctrl+N。

下图介绍如何在导航器中查找文件:

动量指标导航器

然后,通过双击或拖放该文件至打开的图表上。 之后,以下程序窗口将被打开:

简单动量窗口

启用“允许算法交易”选项,然后按确定。 程序将被加载到图表上,相应的注释亦将出现在图表上。 下面是一个正在运行的程序示例:

简单动量已加载

现在,我们需要用两种趋势类型来设计我们的策略 — 上行趋势和下行趋势。 那么,正如我们所定义的:

上行趋势期间:

这可由以下代码来实现:

//+------------------------------------------------------------------+
//|                                    Momentum Uptrend Strategy.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 array for prices
   double PriceArray [];
   
   //Identifying Momentum properties
   int MomentumDef = iMomentum(_Symbol,_Period,14,PRICE_CLOSE);
   
   //Sorting price array
   ArraySetAsSeries(PriceArray,true);
   
   //Copying results
   CopyBuffer(MomentumDef,0,0,3,PriceArray);
   
   //Getting Momentum value of current price
   double MomentumValue = NormalizeDouble(PriceArray[0],2);
   
   //Commenting Momentum output on the chart
   if(MomentumValue>100) Comment("MOMENTUM UPTREND STRATEGY - BUY");
   if(MomentumValue<100) Comment("MOMENTUM UPTREND STRATEGY - No SIGNAL");
  }
//+------------------------------------------------------------------+

代码编写完成后,在交易终端中执行它,它会在图表上生成所需的信号,就像我们在前面的程序中看到的那样。 进入导航器窗口并找到该程序,如下图所示:

动量指标导航器 1

然后双击或拖放文件至打开的图表上。 这将打开以下参数窗口:

动量上行趋势策略窗口 

启用“允许算法交易”选项,并单击确定。 该文件将被加载到图表上,如下所示:

动量上行趋势策略已加载

程序将开始在图表上生成注释,并依据策略显示信号。

动量上行趋势策略 - 买入

动量上行趋势策略 - 无信号

下行趋势期间:

以下代码示意如何设计一个程序来实现这一切:

//+------------------------------------------------------------------+
//|                                  Momentum Downtrend Strategy.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 array for prices
   double PriceArray [];
   
   //Identifying Momentum properties
   int MomentumDef = iMomentum(_Symbol,_Period,14,PRICE_CLOSE);
   
   //Sorting price array
   ArraySetAsSeries(PriceArray,true);
   
   //Copying results
   CopyBuffer(MomentumDef,0,0,3,PriceArray);
   
   //Getting Momentum value of current price
   double MomentumValue = NormalizeDouble(PriceArray[0],2);
   
   //Commenting Momentum output on the chart
   if(MomentumValue<100) Comment("MOMENTUM DOWNTREND STRATEGY - SHORT");
   if(MomentumValue>100) Comment("MOMENTUM DOWNTREND STRATEGY - No SIGNAL");
  }
//+------------------------------------------------------------------+

我们在 MetaQuotes 语言编辑器中编写代码完毕,并进行编译之后,再次在图表上执行该程序的文件。 在导航器窗口中的智能交易系统文件夹下找到它,如下图所示:

动量指标导航器 2

然后双击或将文件拖放到图表上。 以下带有程序参数的窗口将被打开:

动量下行趋势策略窗口

再次启用“允许算法交易”,然后按确定。 该程序将被加载到图表上,并将如下图所示工作:

动量下行趋势策略已加载

依据该策略生成的信号如下所示。

动量下行趋势策略 - 做空

动量下行趋势策略 - 无信号

现在,我们借助一个简单的交易策略,设计了一个基于动量指标的交易系统。 我在文章中提到,动量指标可用于很多策略,但我们尝试运用并分享一个简单的交易策略,它能有助于理解指标的概念,并帮助初学者进行编程。 我希望本主题将激励您发现有关如何利用 MQL5 改进交易的新见解和新思路。


结束语

现在,我们已经完成了我们的主题。 在本文中,我们学习了动量的概念,了解了为什么动量这个概念对我们的交易很重要,以及它如何为我们的交易增加一个更有用的维度。 我们还见识了动量指标,它衡量了什么,以及如何计算它。 再往后,我们学习了一个简单的策略,在不同的行情方向或趋势中均可运用动量指标。 我们还学习了如何在 MQL5 中设计交易系统,如何编写该策略的代码,以及如何在 MetaTrader 5 交易终端中执行它,运行的程序可以自动生成信号。 这最终可以帮助我们顺利、轻松、有效地进行交易。

我找不到足够的词语来强调于使用之前测试所学内容的重要性,如此来确保其适合您的交易风格和计划,我建议您改进所学的一切,因为这一步骤不仅可以让您吸收所学内容,而且可以让您敞开心扉发掘创意,并对相关或非相关主题提供更多见解。

还有一件事我想在这里提一提,尽管有很多盈利策略可以采用,但我们也发现有人使用策略并获利,然而另一些人使用相同的策略却亏损了。 因此,这就不仅仅是策略的问题,是的,策略固然很重要,但还有更多的因素可以导致预期的结果,最重要的是纪律!我们有一个工具,可以有效地实现这一纪律,这个工具正在编程,就像我们通过盈利策略创建交易系统一样,这将改变游戏规则,因为计算机会理解您的策略,然后它会不折不扣地做您想做的事情,而不会像我们人类一样受到情绪干扰。 

我希望这篇文章对您的交易有用,并祝您交易得胜!