English Русский Español Deutsch 日本語 Português
preview
学习如何基于比尔·威廉姆斯(Bill Williams)的 MFI 设计交易系统

学习如何基于比尔·威廉姆斯(Bill Williams)的 MFI 设计交易系统

MetaTrader 5交易 | 31 七月 2023, 09:28
1 288 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

这是我们系列文集中的新篇章,介绍如何基于最流行的技术指标设计交易系统。 我们将在本文中介绍一种新的技术工具,它可以成为您交易的有益补充,特别是如果您将其与其它技术工具配合使用,从而获得更好的见解。 我们将精通比尔·威廉姆斯的市场促进指数(BW MFI)。 该指标将涵盖以下主题:

  1. BW MFI 定义
  2. BW MFI 策略
  3. BW MFI 策略蓝图
  4. BW MFI 交易系统
  5. 结束语

我们将选用 MetaTrader 5 交易平台来测试本文的策略,我们还选用 MQL5(MetaQuotes 语言)的 IDE 为本文构建我们的交易系统。 如果您还不知道如何下载和使用它们,您可阅读我上一篇文章在 MetaEditor 中编写 MQL5 代码中的的主题,从而获取更多详细信息。

本文中提到的所有策略仅用于教学目的,您必须在用于实盘账户之前对其进行测试。 它们肯定需要一些优化。 有些策略可能根本不适合您的交易风格,因为没有什么策略能适合所有人。 此外,作为编码员,尝试应用自己阅读的内容对您非常有用,因为它将帮助您提高编程技能。

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


BW MFI 定义

在本主题中,我们将详细学习市场促进指数(MFI)指标。 它是由著名交易员和作家比尔·威廉姆斯开发的技术指标之一。 该指标旨在通过研究和分析价格和交易量来衡量市场方向。 这将有助于作为交易者的我们,因为它有助于检测行情的未来走势,并将提供有关当前价格走势强度的见解:是延续还是可能逆转。 这对我们非常有用,因为它有助于与市场上最强大的一方进行交易,并做出正确的决策。

为了能够了解状况,我们可以分析 MFI 和交易量。 情况可能如下:

  • 如果 BW MFI 和交易量增加,则表明市场参与者对该金融产品感兴趣。
  • 如果 BW MFI 和交易量减少,则表明市场参与者对该金融产品不感兴趣。
  • 如果 BW MFI 增加但交易量减小,则表示交易量不支持当前走势。
  • 如果 BW MFI 减少而交易量增加,则表明买卖双方之间在市场上处于平衡。

现在我们来看看如何手动计算 BW MFI。 这将有助于理解其背后的主要思想或概念,其实我们现在不需要这样做,因为我们可以简单地使用内置在 MetaTrader 5 中的该指标。 为了计算 BW MFI,我们需要取最高价减去最低价后,再将结果除以交易量。

BW MFI = (High - Low) / Volume

其中:

High => 最高价
Low => 最低价
Volume => 当期交易量

但正如我上面提到的,我们实际上不需要手动计算它,我们需要做的就是从 MetaTrader 5 的可用指标中选择它。 下面我将展示如何做到这一点。

打开 MetaTrader 5 终端,选择插入菜单 ->指标 -> 比尔·威廉姆斯 -> 市场促进指数。 如下图所示:

BW MFI 插入

之后,我们可以找到指标参数的窗口,如下所示:

BW MFI 窗口

1 — 表示 MFI 的情况和交易量增加的颜色。

2 — 表示 MFI 和交易量减少时情况的颜色。

3 — 表示 MFI 增加和交易量减少时情况的颜色。

4 — 表示 MFI 减少和交易量增加时情况的颜色。

5 — 交易量类型(跳价或实际量)。

6 — 指标柱线的粗细。

确定上述参数并按 OK 后,您会发现附加到图表的指标与以下示例相同:

BW MFI 加载

正如您在上一张图片所见,指标出现在图表的子窗口当中。 它以柱线形式显示,基于不同价格和交易量,遵照 BW MFI 指标计算出不同数值和颜色。 指标的每种颜色和数值都表示价格变动的特定状态。

  • 绿色柱线:表示 BW MFI 和交易量增加,表明市场参与者对该产品感兴趣。
  • 棕色柱线:表示 BW MFI 和交易量减小,表明没有人对该产品感兴趣。
  • 蓝色柱线:表示 BW MFI 增加,交易量减少,表明交易量不支持市场走势。
  • 粉红柱线:表示 BW MFI 减少,交易量增加,表明多头和空头之间处于平衡。

BW MFI 策略

在本主题中,我们将分享一些简单的策略,这些策略将基于 BW MFI 指标的主要思想,且仅用于教学目的。 请不要忘记,它们需要经过优化、修改某些参数、或与其它技术指标结合使用才能获得更好的结果。 故此,在您的真实账户中使用它们之前,对其进行测试非常重要,确保它们符合您的交易偏好,且有用。

策略一: BW MFI - 走势状态

基于此策略,我们需要依据 BW MFI 值和交易量值的顺序获取 BW MFI 指标的走势状态。 据此,我们将有四种状态:

  • 如果当前 BW MFI 大于前一个,并且当前交易量大于前一个。 故此,柱线是绿色的,这将是绿色状态的信号。
  • 如果当前 BW MFI 小于前一个,并且当前交易量小于前一个。 因此,柱线是棕色的,它将是淡入衰退状态的信号。
  • 如果当前 BW MFI 大于前一个,并且当前交易量小于前一个。 故此,柱线是蓝色的,它将是假状态的信号。
  • 如果当前 BW MFI 小于前一个,并且当前交易量大于前一个。 故此,柱线是粉红色的,这将是深蹲状态的信号。

简而言之,

  • 档期 BW MFI > 前期 BW MFI 和当期交易量 > 前期 交易量 ==> 绿色状态 - 绿色柱线
  • 当期 BW MFI < 前期 BW MFI 和当期交易量 < 前期 交易量 ==> 衰退状态 - 褐色柱线
  • 档期 BW MFI > 前期 BW MFI 和当期交易量 < 前期 交易量 ==> 假状态 - 蓝色柱线
  • 当期 BW MFI < 前期 BW MFI 和当期交易量 > 前期 交易量 ==> 深蹲状态 - 粉色柱线

策略二: BW MFI 信号

基于此策略,我们需要根据 BW MFI 指标的状态获得信号。 首先,我们需要判定市场状态,就像我们依据之前的策略所判定的那样。 然后我们将在此基础上判定我们的决策。 根据此策略,我们将有四个信号:

  • 如果状态为绿色,则表示找到一个好的入场点。
  • 如果状态是衰退,这是找到良好离场的信号。
  • 如果状态是假,这是假突破概率的信号。
  • 如果状态是深蹲,那是市场平衡的信号。

策略三: BW MFI 配合 MA:

基于此策略,我们将结合另一个技术指标,即移动平均线来获取买入或卖出信号。 如果状态为绿色,且收盘价高于移动平均线,则为买入信号。 在另一种情况下,如果状态为绿色,且收盘价低于移动平均线,则为卖出信号。 这种方式可以按技术分析的特点,并结合技术工具,获得更多的见解,看到不同的视角。 您还可以使用其它技术工具来获得更多见解,例如支撑和阻力、MACD、移动平均线、或任何其它可用于过滤生成信号的实用技术工具。

简而言之,

  • 绿色状态和收盘价 > MA ==> 买入信号
  • 绿色状态和收盘价 < MA ==> 卖出信号

BW MFI 策略蓝图

在这一部分中,我们将研究设计交易系统的一个非常重要的步骤,就是每个提及策略的分步蓝图。 蓝图有助于顺利创建交易系统,因为它能直观示意我们需要计算机做什么。 故此,我们可以将此步骤视为我们即将实现策略的规划步骤。

 策略一: BW MFI - 走势状态

根据此策略,我们需要创建一个交易系统,可根据指标柱线的颜色获取 BW MFI 指标的走势信号,该信号将根据指标的性质判定,方法是比较每次跳价的四个值,从而判定每个数值的位置。 这四个数值是当期 BW MFI、前期 BW MFI、当期交易量和前期交易量。 我们需要程序来检查它们,并判定每个数值的位置。 当 BW MFI 的当期值大于前期值,同时当期交易量大于前期值时,我们需要交易系统在图表上返回带有“绿色状态 - 绿色柱线”的注释,这是第一种情况。 第二个是当期 BW MFI 小于前期,同时当期交易量的值低于前期时,交易系统在图表上返回带有“衰退状态 - 褐色柱线”的注释。 第三种情况是当期 BW MFI 值大于前期值,同时当期交易量的值低于前期,系统需要返回带有“假状态 - 蓝色柱线”的图表注释。 第四种也是最后一种情况是当期 BW MFI 值低于前期,同时当期交易量的值大于前期时,我们需要在图表上获得带有“深蹲状态 - 粉红柱线”的注释。

下图是走势状态策略蓝图:

走势状态蓝图

策略二: BW MFI 信号

根据此策略,在依据指标柱线识别出每个状态后,我们需要创建一个交易系统,该系统可根据 BW MFI 指标的状态在图表上返回带有合适信号的注释。 为此,我们需要创建一个交易系统,该系统检查每次跳价的四种状态,并基于它返回相应的信号。 如果 BW MFI 的状态是在交易系统中标识的绿色状态,我们需要在图表上获取一个带有“找到一个好入场点”信号作为注释。 第二种状态是检查指标的状态,并发现它是衰退状态时,我们需要交易系统返回一个带有“找到一个好的离场点”信号作为图表上注释。 第三种情况或状态是,当检查 BW MFI 的状态,并发现它是假状态时,我们需要交易系统在图表上返回具有“假突破概率”信号作为注释。 最后一个状态是在检查后发现它是深蹲状态时,我们需要在图表上获得“市场平衡”信号作为注释。

下图是信号策略蓝图:

BW MFI 信号蓝图

策略三: BW MFI 配合 MA:

根据此策略,我们需要创建一个交易系统,可根据 BW MFI 指标和简单移动平均线返回买入或卖出信号。 我们需要交易系统从每次跳价识别出四种状态后,持续检查收盘价、当期简单移动平均线和当期 BW MFI 指标的状态。 如果交易系统发现收盘价大于简单移动平均线的当期值,同时当期 BW MFI 状态为绿色,我们需要交易系统返回买入信号作为图表上的注释。 如果它发现收盘价小于当期简单移动平均线,同时当期 BW MFI 状态为绿色,我们需要交易系统返回卖出信号作为图表上的注释。 如果还有其它东西,我们则不需要交易系统返回任何内容。

下图是 BW MFI 配合 MA 的策略蓝图:

BW MFI 配合 MA 蓝图

BW MFI 交易系统

我们将在本文的这一部分中开始为提到的每个策略创建各自的交易系统。 我们开始创建一个简单的交易系统,以便返回带有 BW MFI 当期值的图表注释,从而将其用作其它策略的基础。 以下是执行此操作的步骤:

创建双精度数组 BWMFIArray,其返回带有分数值的实数型之一。

double BWMFIArray[];

调用 “ArraySetAsSeries” 函数对此数组中的数据进行排序。 其参数:

  • array[]: 确定创建的数组,即 BMWFIArray。
  • flag: 数组索引方向,其为 true。
ArraySetAsSeries(BWMFIArray,true);

为 BWMFIDef 创建一个整数型变量,并调用 “iBWMFI” 函数定义比尔·威廉姆斯市场促进指数的句柄。 返回指标句柄,其参数:

  • symbol: 确定所需的品种,我们将采用(_Symbol)对应于当前品种。
  • period: 确定周期,我们将采用(_PERIOD)对应于当前时间帧。
  • applied_volume: 确定交易量的类型,我们将采用(VOLUME_TICK)。
int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);

调用 “CopyBuffer” 函数为 BWMFIArray 定义数据和存储结果。 其参数:

  • indicator_handle: 确定指标句柄,我们将采用(BWMFIDef)。
  • buffer_num: 确定指标缓冲区编号,我们将采用(0)。
  • start_pos: 确定起始位置,我们将采用(0)。
  • count: 确定要复制的数量,我们将采用(3)。
  • buffer[]: 确定要复制的目标数组,我们将采用(BWMFIArray)。
CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);

为 BWMFIVal 创建双精度变量,再获取 BWMFI 的当期值。 然后,我们将调用(NormalizeDouble)函数进行舍入。

  • value: 我们将采用 BWMFIArray[0] 作为当期值。
  • digits: 我们将采用(5)作为小数点后的位数。
double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);

调用(Comment)函数显示当期 BW MFI 的值。

Comment("BW MFI Value = ",BWMFIVal);

以下是该交易系统的完整代码模块:

//+------------------------------------------------------------------+
//|                             Simple Market Facilitation Index.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   ArraySetAsSeries(BWMFIArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   Comment("BW MFI Value = ",BWMFIVal);
  }
//+------------------------------------------------------------------+

前面的代码行若编译时没有错误,我们将在 MetaTrader 5 交易终端的导航器窗口中的 "Expert Advisors" 文件夹下找到该智能系统,如下所示:

BW MFI 导航

将 "Simple Market Facilitation Index" 智能系统拖放到所需图表上,我们将发现此 EA 的窗口与以下内容相同:

BW MFI 窗口

勾选“允许算法交易”,并按确定后,我们可以发现 EA 加载如下相同的内容:

Simple BW MFI 加载

现在,我们已准备好接收与以下测试示例相同的信号:

Simple BW MFI 信号

正如我们在上一张图表中看到的,我们有一个基于此交易策略的信号,该信号在左上角取当期 BW MFI 值作为注释显示。

策略一: BW MFI - 走势状态

我们可以找到以下创建该交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                     BW MFI - Movement Status.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   if(BWMFIVal>BWMFIVal1&&volVal>volVal1)
     {
      Comment("Green State - Green Bar");
     }
   if(BWMFIVal<BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fade State - Brown Bar");
     }
   if(BWMFIVal>BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fake State - Blue Bar");
     }
   if(BWMFIVal<BWMFIVal1&&volVal>volVal1)
     {
      Comment("Squat State - Pink Bar");
     }
  }
//+------------------------------------------------------------------+

此代码中的区别:

创建(BWMFIArray)和(volArray)两个数组,并使用 “ArraySetAsSeries” 函数对这些数组中的数据进行排序。

   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
为 BWMFIDef 和 volDef 创建整数型变量。 调用 “iBWMFI” 函数定义比尔·威廉姆斯市场促进指数的句柄,调用 “iVolumes” 函数定义交易量句柄。 返回指标句柄,两者的参数相同:
  • symbol: 确定所需的品种,我们将采用(_Symbol)对应于当前品种。
  • period: 确定周期,我们将采用(_PERIOD)对应于当前时间帧。
  • applied_volume: 确定交易量的类型,我们将采用(VOLUME_TICK)。
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);

针对 volArray 调用 “CopyBuffer” 函数定义数据和存储结果。

CopyBuffer(volDef,0,0,3,volArray);

定义 BWMFI 和交易量的当期值和前期值:

   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);

策略条件:

在绿色柱线的情况下,

   if(BWMFIVal>BWMFIVal1&&volVal>volVal1)
     {
      Comment("Green State - Green Bar");
     }

在褐色柱线的情况下,

   if(BWMFIVal<BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fade State - Brown Bar");
     }

在蓝色柱线的情况下,

   if(BWMFIVal>BWMFIVal1&&volVal<volVal1)
     {
      Comment("Fake State - Blue Bar");
     }

在粉红色柱线的情况下,

   if(BWMFIVal<BWMFIVal1&&volVal>volVal1)
     {
      Comment("Squat State - Pink Bar");
     }

前面的代码在编译时没有任何错误,并执行它后,我们会发现它附加到图表上,如下所示:

Movement Status 加载

如我们所见,EA 加载到在上图的右上角。 我们已准备好接收该交易系统的信号,与以下测试示例相同:

在绿色状态信号的情况下,

Movement Status - 绿色信号

 

正如我们在上图中所看到的,我们在左上角有一个绿色状态的信号。

在衰退状态的情况下,

Movement Status - 衰退信号

我们在左上角得到基于该策略的衰退信号作为注释。

在假状态的情况下,

Movement Status - 假信号

正如我们在前面的例子中看到的一样,我们得到了基于该交易系统的假状态信号。

在深蹲状态的情况下,

Movement Status - 深蹲信号

基于此交易策略,我们在图表的左上角有一个深蹲状态的信号作为注释。 

策略二: BW MFI 信号

以下是基于该策略的交易系统的完整代码。

//+------------------------------------------------------------------+
//|                                               BW MFI Signals.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;
   
   if(greenState)
     {
      Comment("Find a good entry");
     }
   if(fadeState)
     {
      Comment("Find a good exit");
     }
   if(fakeState)
     {
      Comment("False breakout Probability");
     }
   if(squatState)
     {
      Comment("Market is Balanced");
     }
  }
//+------------------------------------------------------------------+

该代码中的区别:

声明布尔变量,对应四种特定条件下的状态 green、fade、fake、和 squa。

   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;

策略条件:

在绿色状态的情况下

   if(greenState)
     {
      Comment("Find a good entry");
     }

在衰退状态的情况下

   if(fadeState)
     {
      Comment("Find a good exit");
     }

在假状态的情况下

   if(fakeState)
     {
      Comment("False breakout Probability");
     }

在深蹲状态的情况下

   if(squatState)
     {
      Comment("Market is Balanced");
     }

编译并执行此代码后,我们可以发现 EA 加载到图表上,如下所示:

BW MFI 信号加载

我们可以看到,BW MFI 信号的 EA 加载到图表的右上角。 我们现在可以根据这个交易系统获得信号,如下所示:

在找到良好入场信号的情况下:

找到良好入场信号

我们可以在图表的左上角找到一个好的入场点作为注释。

在找到良好离场信号的情况下:

找到良好离场信号

我们可以在图表的左上角找到一个好的离场信号作为评论。

在假突破概率信号的情况下:

BW MFI 信号 - 假突破信号

我们可以在图表的左上角将假突破概率的信号作为注释。

市场平衡信号的情况:

BW MFI 信号 - 平衡信号

我们可以在图表的左上角市场平衡信号作为评论。

策略三: BW MFI 配合 MA:

以下是该交易系统的完整代码,基于我们的 BW MFI 结合移动平均线的策略。

//+------------------------------------------------------------------+
//|                                               BW MFI with MA.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double BWMFIArray[];
   double volArray[];
   double maArray[];
   MqlRates pArray[];
   ArraySetAsSeries(BWMFIArray,true);
   ArraySetAsSeries(volArray,true);
   ArraySetAsSeries(maArray,true);
   int BWMFIDef=iBWMFI(_Symbol,_Period,VOLUME_TICK);
   int volDef=iVolumes(_Symbol,_Period,VOLUME_TICK);
   int maDef=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);
   int data=CopyRates(_Symbol,_Period,0,10,pArray);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   CopyBuffer(maDef,0,0,3,maArray);
   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   double maVal=NormalizeDouble(maArray[0],5);
   double closingPrice=pArray[0].close;
   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;
   if(closingPrice>maVal&&greenState)
     {
      Comment("Buy Signal");
     }
   else
      if(closingPrice<maVal&&greenState)
        {
         Comment("Sell signal");
        }
      else
         Comment("");
  }
//+------------------------------------------------------------------+

此代码中的区别:

创建两个数组,maArray 为双精度,pArray 为 MqlRates 类型,

   double maArray[];
   MqlRates pArray[];

调用 “ArraySetAsSeries” 函数对 maArray 中的数据进行排序:

ArraySetAsSeries(maArray,true);

创建一个整数型变量 maDef ,并调用 “iMA” 函数定义移动平均线,返回指标句柄及其参数:

  • symbol:  确定品种名称。 我们采用 (_SYMBOL) 应用当前图表的品种。
  • period: 确定周期,我们将采用(_PERIOD) 对应于当前时间帧,您也可以采用(PERIOD_CURRENT)达到相同目的。
  • ma_period: 确定均化周期,我们将采用(10)。
  • ma_shift: 根据需要确定水平偏移。 我们设置(0),因为我们不需要偏移 MA。
  • ma_method: 确定移动平均线类型,我们将设置 SMA(简单移动平均线)。
  • applied_price: 确定计算中所用的价格类型,我们采用收盘价。
int maDef=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);

通过调用 “CopyRates” 函数获取 MqlRates 型的历史数据:

  • symbol_name: 确定交易品种名称,我们采用(_Symbol) 应用当前品种。
  • timeframe: 确定时间帧,我们采用(_Period)应用当前时间帧。
  • start_pos: 确定起点位置,我们取(0)从当前位置开始。
  • count: 确定要复制的数量,我们将采用(10)。
  • rates_array[]: 确定要复制的目标数组,我们采用(pArray)。
int data=CopyRates(_Symbol,_Period,0,10,pArray);

调用 “CopyBuffer” 函数为 BWMFIArray、volArray 和 maArray 定义数据和存储结果。

   int data=CopyRates(_Symbol,_Period,0,10,pArray);
   CopyBuffer(BWMFIDef,0,0,3,BWMFIArray);
   CopyBuffer(volDef,0,0,3,volArray);
   CopyBuffer(maDef,0,0,3,maArray);

获取当期 BW MFI、交易量、简单移动平均线和收盘价的数值,以及前期 BW MFI 和交易量的数值。

   double BWMFIVal=NormalizeDouble(BWMFIArray[0],5);
   double BWMFIVal1=NormalizeDouble(BWMFIArray[1],5);
   double volVal=NormalizeDouble(volArray[0],5);
   double volVal1=NormalizeDouble(volArray[1],5);
   double maVal=NormalizeDouble(maArray[0],5);
   double closingPrice=pArray[0].close;

为 green、fade、fake 和 squat 状态创建布尔变量:

   bool greenState = BWMFIVal>BWMFIVal1&&volVal>volVal1;
   bool fadeState = BWMFIVal<BWMFIVal1&&volVal<volVal1;
   bool fakeState = BWMFIVal>BWMFIVal1&&volVal<volVal1;
   bool squatState = BWMFIVal<BWMFIVal1&&volVal>volVal1;

此策略的条件:

若为买入信号的情况

   if(closingPrice>maVal&&greenState)
     {
      Comment("Buy Signal");
     }

若为卖出信号的情况

   else
      if(closingPrice<maVal&&greenState)
        {
         Comment("Sell signal");
        }

否则

      else
         Comment("");

编译并执行此代码后,我们会发现它加载到图表上,如下所示:

 BW MFI 配合 MA 加载

若为买入信号的情况

BW MFI 配合 MA - 买入信号

正如我们在左上角看到的,我们在图表上显示一个买入信号作为注释。

若为卖出信号的情况

BW MFI 配合 MA - 卖出信号

正如我们在左上角看到的,我们在图表上显示一个卖出信号作为注释。 贯穿本主题的前面内容,我们学习了如何基于上述策略创建不同的交易系统。

结束语

在本文的最后,假设您现在了解了由比尔·威廉姆斯开发的市场促进指数技术指标的主要概念。 现在您应该知道我们如何手动计算它,如何将其插入到 MetaTrader 5 交易平台的图表当中,以及如何解释其读数。 我们还学会了如何运用它。 为此,我们研究了一些基于其主要概念的简单策略:

  • BW MFI - 走势状态策略:它可根据指标的柱线作为图表上的信号(绿色、衰退、假和蹲状态)获取市场状态。
  • BW MFI 信号策略:它可在图表上获取信号,并根据 BW MFI 指标(找到一个好的入场点,找到一个好的离场点,假突破概率,市场平衡)。
  • BW MFI 配合 MA 策略: 它可根据 BW MFI 和简单移动平均线指标获取买入和卖出信号。

我建议大家尝试使用额外的技术工具来获得更好的结果,并看到市场的整体视图。 此外,在实盘交易中使用它们之前,您必须测试它们,并确保它们符合您的偏好,因为本文的主要概念是仅出于教学的共享信息。 之后,我们为每个策略设计了分步蓝图,从而帮助我们创建易于在 MetaTrader 5 中使用的交易系统。 我们学习了 MQL5 语言,并据该语言创建了它们。

我希望您能发觉这篇文章很实用,并且可以获得有关其主题或任何相关主题的更多见解,从而改善您的交易。 我也希望您尝试通过自己编写代码来应用您在本文中学到的知识 — 如果您想提高您的 MQL5 编程技能,这是任何学习过程中非常重要的一步。 如果您想阅读更多关于学习如何基于最流行的技术指标创建交易系统的类似文章,您可以阅读我在本系列中的其它文章,我希望它们也对您有所帮助。

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

种群优化算法:猴子算法(MA) 种群优化算法:猴子算法(MA)
在本文中,我将研究猴子优化算法(MA)。 这些动物克服困难障碍,并到达最难以接近的树顶的能力构成了 MA 算法思想的基础。
开发回放系统 — 市场模拟(第 01 部分):首次实验(I) 开发回放系统 — 市场模拟(第 01 部分):首次实验(I)
如何创建一个系统,让我们在闭市后也能研究市场,甚至模拟市场情况? 在此,我们将开始一系列新的文章,在其中我们将应对这个主题。
神经网络变得轻松(第三十六部分):关系强化学习 神经网络变得轻松(第三十六部分):关系强化学习
在上一篇文章中讨论的强化学习模型中,我们用到了卷积网络的各种变体,这些变体能够识别原始数据中的各种对象。 卷积网络的主要优点是能够识别对象,无关它们的位置。 与此同时,当物体存在各种变形和噪声时,卷积网络并不能始终表现良好。 这些是关系模型可以解决的问题。
MQL5 — 您也可以成为该语言的大师 MQL5 — 您也可以成为该语言的大师
本文将是一次自我访谈,我将告诉您我是如何迈出 MQL5 语言的第一步的。 我将向您展示如何成为一名出色的 MQL5 程序员。 我将为您解释实现这一壮举的必要基础。 唯一的先决条件是愿意学习。