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

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

MetaTrader 5交易 | 31 八月 2022, 11:26
1 417 0
Mohamed Abdelmaaboud
Mohamed Abdelmaaboud

概述

本文延续我们的系列文章,介绍如何基于最流行的技术指标设计简单的交易系统,从而帮助我们学习 MQL5 编码。 在这篇新文章中,我们将看到一个新的技术指标,称为资金流动性指数(MFI)。 我们将详细学习该指标,并了解如何基于其背后的主要概念来开发简单的交易系统。 因此,我们将通过以下主题介绍该指标:

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

如果您阅读了本系列的其它文章,您会发现,它的主题编排与前面提到的每个新策略相同,有关于指标的新信息和一些新代码,以此来尝试学习有关交易和 MQL5 编码的新概念。 我们将学习什么是 MFI 指标,它衡量什么,以及如何手工计算,从而了解其背后的主要概念。 然后,我们将看到计算 MFI 指标的示例。 当然,这些只是基础。 考虑到它背后的基本概念,我们需要学习一个更重要的主题,即如何在简单的策略中运用它。 之后,我们将为每个提到的策略设计一个分步蓝图,以便帮助我们据其设计一款交易系统。 最有趣的话题是发掘我们如何利用 MQL5 为这些策略创建一个交易系统,以便在 MetaTrader 5 交易平台中运用它们。

为了能够依据您的高胜算交易策略创建您自己的交易系统,我建议您自行完成全部编码。 不要只满足于阅读理解,而是要尽可能应用您所阅读的内容,自己编写每一行代码。 最好去搜索函数和编程的概念,从而深入了解它们,因为这将帮助您掌握更多。 不要忘记,任何成功的程序员最重要的技能之一就是除了实践之外,还知道如何有效地搜索,因为这两件事在任何学习或开发环节中都非常重要。

此外,在运用任何策略之前,您都必须对其进行测试,特别是如果其主要目的只是出于教学。 没有适合所有人的策略。 故此,对我有用的东西对您可能用处不大。

贯穿本文,我们将以 MetaQuotes(MQL5)语言在 MetaTrader 5 的内置 MetaEditor 中编写策略代码。 如果您想知道如何下载并使用 MetaEditor,请阅读上一篇文章中的在 MetaEditor 里编写 MQL5 代码主题。

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

现在,我们览阅我们的主题,直接学习一种新的工具,从而增加交易百宝箱中的工具数量。


MFI 定义

在本节中,我们将详细讲述资金流动性指数(MFI)指标,并查看该指标背后的概念,该指标是基于交易量的指标之一。 我们将了解它是什么,加上它测量的是什么,然后我们将通过分析一个示例来学习如何手工计算它。

如前一篇文章所述,交易量是交易中的一个重要因素。 充分的成交量分析令我们在交易中占据前沿,因为市场中有许多层面能影响到它。 您了解的层面越多,您就可以制定出更好的决策,因为获得的知识会增加证据的权重,从而引导您朝着特定的方向做出特定的决策。

如果我们有一项资产经历了巨量买卖,相比交易量较低的资产,显然该资产的重要性更高。 在金融市场中,交易量是一段时间内所交易股票或合约的数量。 当价格在上涨趋势中突破阻力位,或在下跌趋势中突破支撑位时,看到伴随高额成交量是最好的,因为这是走势强度的重要标志之一。 最好是,在上升趋势期间,成交量伴随走势上扬同时放大,调整期间联动下降;以及在下跌趋势期间,成交量伴随走势下挫降低,调整期间联动放大。 如果我们看到成交量伴随趋势变化,这是确认当前趋势的重要标志之一。

资金流动性指数(MFI)指标由 Gene Quong 和 Avrum Soudack 创建。 这是一个基于成交量的指标,但它在计算中采用价格和成交量来衡量买卖压力。 它在 0 和 100 之间移动。 MFI 指标的提升意味着存在买入压力,反之亦然,MFI 的减少意味着存在卖出压力。 它也许能确认趋势方向,也可以发出逆转警告。 如果您想了解更多关于趋势的信息,可以阅读前面一篇文章中的趋势定义主题。

MFI 手工计算包括多个步骤:

  • 计算典型价格 (TP) = (最高价+最低价+收盘价)/3
  • 计算原始资金流动性 = 交易量 * TP
  • 判定 TP 的走势: 向上或向下。 如果当期 TP > 前期 TP = 向上;如果当期 TP < 前期 TP = 向下。
  • 计算 1+MF = 上升期间的原始 MF
  • 计算 1-MF = 下降期间的原始 MF
  • 计算 14 +MF = 14 周期的 (1+MF) 求和
  • 计算 14 -MF = 14 周期的 (1-MF) 求和
  • 计算 14 周期 MF 比率 = 14+MF / 14-MF
  • 计算 MFI = 100-100/(1+MF 比率)

如果我们有金融产品的以下数据,我们来看看应用它的计算示例:

天数 最高价 最低价 收盘价 交易量
1 55 53 54 12000
2 56 54 55 10000
3 61 59 60 15000
4 67 64 65 20000
5 63 58 60 10000
6 58 52 55 5000
7 64 58 60 7000
8 52 47 50 7500
9 52 48 48 8000
10 50 48 49 5000
11 49 47 48 6000
12 48 47 47 7500
13 50 46 48 9000
14 52 45 47 10000
15 55 46 49 7000
16 53 45 47 7500
17 51 43 46 6000
18 50 42 44 5000
19 50 43 45 15000

如果我们需要根据之前的数据计算 MFI 指标,我们需执行以下步骤:

计算典型价格 (TP) = (最高价+最低价+收盘价)/3

以下是计算后得到的 TP:

 MFI calc2

计算原始资金流动性 = 交易量 * TP

MFI calc3

判定 TP 的走势: 向上或向下

MFI calc4

计算 1+MF = 上升期间的原始 MF

计算 1-MF = 下降期间的原始 MF

 MFI calc5

计算 14 +MF = 14 周期的 (1+MF) 求和

计算 14 -MF = 14 周期的 (1-MF) 求和

MFI calc6

计算 14 周期 MF 比率 = 14+MF / 14-MF

 MFI calc7

计算 MFI = 100-100/(1+MF 比率)

MFI calc8

在之前的步骤中,我们手工计算了 MFI 指标,但现在我们不需要这样做。 既然我们已经掌握了指标背后的概念,我们就可用 MetaTrader 5 中的内置指标。 您所需做到的全部就是从可用指标中选择:

启动 MetaTrader 5 -->,单击插入选项卡 --> 指标 --> 交易量 --> 资金流动性指数

MFI 插入

选择资金流动性指数后,将显示指标参数:

MFI 参数窗口

1. 期望的指标周期。

2. 交易量类型 (跳价或真实).

3. MFI 线颜色。

4. 线类型。

5. MFI 线宽度。

单击“确定”后,MFI 指标将被加载到图表:

 MFI 加载


MFI 策略

在本节中,我们将学习在辨别出 MFI 指标是什么、它衡量什么、以及它背后的主要概念之后,如何运用它。 现在,我们将学习一些可以运用的简单策略。

  • 策略一: MFI - OB 和 OS:

根据该策略,我们将识别超买(OB)和超卖(OS)区域。 当 MFI 接近 20 等级时,这将是一个超卖(OS)区域,当它接近 80 等级时,它将是超买(OB)区域。 超卖区域提升了潜在上涨的可能性,反之亦然,超卖区域则增加了潜在下跌的可能性。

如此,我们可以说: 

MFI <= 20 --> OS

MFI >= 80 --> OB

  • 策略二: MFI - 上行趋势 — 做多:

根据该策略,我们将等待 MFI 低于或等于 50,即看到买入信号被触发。 相应的等级 70 就是获利了结信号。 这一策略背后的理论依据是,大多数情况下,MFI 在上升趋势中位于 50 和 70 之间移动。

故此,

MFI <= 50 --> 做多信号

MFI >= 70 --> 获利了结信号

  • 策略三: MFI - 下行趋势 — 做空:

该策略将与前一策略(MFI -上升趋势 — 做多)相反,因为我们需要看到 MFI 高于或等于等级 50,即表示触发抛售信号,当 MFI 低于或等于等级 30 时,则发出获利了结信号。 这背后的理论依据是,在大多数情况下,MFI 在下跌趋势期间位于 50 至 30 等级间移动。

故此,

MFI >=50 --> 做空信号

MFI <= 30 --> 获利了结

  • 策略四: MFI - 上行趋势或背离:

根据这一策略,我们需要指标来确认当前的走势是否强劲。 我们可以通过比较当期和前期的 MFI 值,以及当期和前期的高点来看出这一点,并查看是否能确认当前走势强劲或存在背离。 那么,在上升趋势中,如果当期 MFI 大于前期 MFI,且当期高点大于前期高点,则表示当前走势强劲;但如果当期 MFI 小于前期 MFI,且当期高点高于前期高点,则表示存在看跌背离,因为该指标未能确认价格走势。 您可以调整数值的长度以便进行比较,这有助于理解概念。

故此,

当期 MFI > 前期 MFI 且当期高点 > 前期高点 --> 强势上扬

当期 MFI < 前期 MFI 且当期高点 > 前期高点 --> 看跌背离

  • 策略五: MFI - 下行趋势或背离:

该策略与前一个策略(MFI- 上升趋势或背离)相反,因为我们还需要该指标来确认当前走势是否强劲,或者通过仅比较两个值来确认是否存在简单形式的背离。 那么,如果当期 MFI 小于前期,并且当期低点小于前期,这意味着当前下行走势强劲,但如果当期 MFI 大于前期那个,且当期低点低于前期那个,则意味着存在看涨背离。

简而言之,

当期 MFI < 前期 MFI 且当期低点 < 前期低点 --> 强势下行

当期 MFI > 前期 MFI 且当期低点 < 前期低点 --> 看涨背离


MFI 策略蓝图

在本章节中,我们将为每种策略设计一个蓝图,来帮助我们为每一种策略创建一款交易系统,但首先,我们要设计一个简单的交易系统蓝图,作为所有提到的交易策略的基础。 此简单系统仅在图表上注释里显示 MFI 当期值。 因此,我们需要计算机检查每次跳价时的 MFI 值,然后将该值显示在图表上的注释里。 实现这一点的蓝图如下所示:

简单 MFI 蓝图

现在,我们将为每个策略设计一个蓝图,如下所示:

  • 策略一: MFI - OB 和 OS:

基于这一策略,我们需要向交易系统发出指令,以便检查每次跳价时的 MFI 值,并将该值与特定等级(20 和 80)进行比较,结果作为图表上的注释显示,并根据该比较结果决定或返回。 如果 MFI 小于或等于 20,它将返回超卖和当期 MFI 值,作为图表上的注释,并将每条注释放在单独的一行中。 如果 MFI 大于或等于 80,它将返回超买和当期 MFI 作为图表上的注释,每条注释都在单独的一行中。 如果 MFI 高于 20 且低于 80,则仅返回 MFI 当期值。 这样做的蓝图如下:

MFI -OB-OS 蓝图

  • 策略二: MFI - 上行趋势 — 做多:

根据这一策略,我们也需要交易系统检查 MFI 值、50 和 70 等级,以便决定 MFI 是否小于或等于 50,如此它必须返回做多信号。 如果 MFI 大于或等于 70,它必须返回一个获利了结信号,以下是实现这一点的蓝图:

 MFI - 上行趋势 - 做多蓝图

  • 策略三: MFI - 下行趋势 — 做空:

根据这一策略,我们需要交易程序根据 MFI、50 和 30 等级之间的比较向我们发出警报。 如果 MFI 大于或等于 50,则它必须返回做空信号,如果 MFI 小于或等于 30,则必须返回获利了结信号。 以下针对它的蓝图:

MFI - 下行趋势 - 做空蓝图

  • 策略四: MFI - 上行趋势或背离:

根据这一策略,我们需要设计一款交易系统,能够检查每次跳价时的四个数值(当期 MFI、前期 MFI、当期高点和前期高位),并决定将生成哪个信号。

当期 MFI > 前期 MFI 且当前高点 > 前期高点 --> 强势上扬信号

当期 MFI < 前期 MFI 且当期高点 > 前期高点 --> 看跌背离

以下是实现它的蓝图:

 MFI - 上行趋势或背离蓝图

 

  • 策略五: MFI - 下行趋势或背离:

该策略与前一个相反。 根据该策略,我们需要设计一款交易系统,能够检查每次跳价时的四个数值(当期 MFI、前期 MFI、当期低点和前期低位),并决定将生成哪个信号。

当期 MFI < 前期 MFI 且当期低点 < 前期低点 --> 强势下行信号

当期 MFI > 前期 MFI 且当期低点 < 前期低点 --> 看涨背离

以下是实现它的蓝图:

MFI - 下行趋势或背离蓝图


MFI 交易系统

在这个有趣的章节中,我们将以 MQL5 编写代码,并在 MetaTrader 5 中执行,为每个提到的策略设计一款交易系统。 我们将从简单 MFI 开始,它采用 MFI 当期值在图表上生成注释。

  • 为 MFI 创建一个数组,以 “double” 作为数据类型,可以表示分数值。
double MFIArray[];
  • 调用 ArraySetAsSeries 函数为 MFI 数组设置排列顺序,从当前数据开始,并返回布尔结果(true 或 false),其参数为(array[] 和 flag)。
ArraySetAsSeries(MFIArray,true);
  • 在为 MFIDef 创建整数型变量后,调用 iMFI 函数定义 MFI。 iMFI 函数返回 MFI 指标的句柄,其参数为(品名、周期、均化周期、和应用的交易量类型)。
int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);
  • 调用 CopyBuffer 函数从 MFI 指标获取数据,填充数组。
CopyBuffer(MFIDef,0,0,3,MFIArray);
  • 创建双精度变量 MFI 值后,计算当期 MFI 值,调用 NormalizeDouble 返回双精度类型值。
double MFIValue=NormalizeDouble(MFIArray[0],5);
  • 调用 Comment 函数在图表上创建注释。
Comment("MFI Value is: ",MFIValue);

如此,完整代码将与下同:

//+------------------------------------------------------------------+
//|                                                   Simple MFI.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()
  {
//Create an array for MFI
   double MFIArray[];

//sorting the array from the current data
   ArraySetAsSeries(MFIArray,true);

//defining MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//filling the array
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//calculating current MFI value
   double MFIValue=NormalizeDouble(MFIArray[0],5);

//creating a comment with MFI value
   Comment("MFI Value is: ",MFIValue);
  }
//+------------------------------------------------------------------+

编译后,我们可以在导航器窗口中找到该智能系统:

MFI nav1

双击,将出现以下窗口:

简单 MFI 窗口

单击“确定”后,EA 将被加载到图表:

简单 MFI 加载

以下是来自测试生成的信号示例:

简单 MFI - 信号

如果我们想确保生成的 MFI 值与内置的 MFI 指标相同:

简单 MFI - 相同信号

  • 策略一: MFI - OB 和 OS:

以下是为该策略所创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                                  MFI - OB&OS.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()
  {
   //Create an array for MFI
   double MFIArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(MFIArray,true);
   
   //defining MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);
   
   //filling the array
   CopyBuffer(MFIDef,0,0,3,MFIArray);
   
   //calculating current MFI value
   double MFIValue=NormalizeDouble(MFIArray[0],5);
   
   
   //Conditions of OS&OS
   //OS
   if(MFIValue<=20)
   {
   Comment("Oversold","\n","MFI value is : ",MFIValue);
   }
   
   //OB
   if(MFIValue>=80)
   {
   Comment("Overbought","\n","MFI value is : ",MFIValue);
   }
   
   //no signal
   if(MFIValue>20 && MFIValue<80 )
   {
   Comment("MFI value is : ",MFIValue);
   }   
  }
//+------------------------------------------------------------------+

该代码的不同之处在于:

超卖和超买条件:
   //Conditions of OS&OS
   //OS
   if(MFIValue<=20)
   {
   Comment("Oversold","\n","MFI value is : ",MFIValue);
   }
   
   //OB
   if(MFIValue>=80)
   {
   Comment("Overbought","\n","MFI value is : ",MFIValue);
   }
   
   //no signal
   if(MFIValue>20 && MFIValue<80 )
   {
   Comment("MFI value is : ",MFIValue);
   } 

编译此代码后,我们将在导航器窗口中找到 EA:

MFI nav 2

将其拖放到图表上以打开其窗口:

 MFI - OB_OS 窗口

单击“确定”后,它将被加载到图表:

 MFI - OB_OS 加载

以下是根据该交易系统生成的信号示例。

超卖信号

简单 MFI - OB_OS - OS

超买信号

简单 MFI - OB_OS - OB

无信号:

简单 MFI - OB_OS - 无信号

  • 策略二: MFI - 上行趋势 — 做多:

下面是如何编写此策略的代码:

//+------------------------------------------------------------------+
//|                                          MFI - Uptrend - Buy.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()
  {
   //Create an array for MFI
   double MFIArray[];
   
   //sorting the array from the current data
   ArraySetAsSeries(MFIArray,true);
   
   //defining MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);
   
   //filling the array
   CopyBuffer(MFIDef,0,0,3,MFIArray);
   
   //calculating current MFI value
   double MFIValue=NormalizeDouble(MFIArray[0],5);
   
   
   //Buy signal
   if(MFIValue<=50)
   {
   Comment("Buy signal");
   }
   
   //TP
   if(MFIValue>=70)
   {
   Comment("Take profit");
   }
  }
//+------------------------------------------------------------------+

该代码的不同之处在于:

信号条件:

做多信号

//Buy signal
   if(MFIValue<=50)
   {
   Comment("Buy signal");
   }

止盈信号

//TP
   if(MFIValue>=70)
     {
      Comment("Take profit");
     }

编译后,EA 将出现在导航器窗口之中:

MFI nav3

EA 窗口将与下同:

MFI - 上行趋势 - 做多窗口

单击“确定”后,它将被加载到图表:

 MFI - 上行趋势 - 做多加载

以下是测试生成的信号示例:

做多信号

 MFI - 上行趋势 - 做多信号

止盈信号

MFI - 上行趋势 - 获利了结信号

  • 策略三: MFI - 下行趋势 — 做空:

以下是针对该策略创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                      MFI - Downtrend - Short.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()
  {
//Create an array for MFI
   double MFIArray[];

//sorting the array from the current data
   ArraySetAsSeries(MFIArray,true);

//defining MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//filling the array
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//calculating current MFI value
   double MFIValue=NormalizeDouble(MFIArray[0],5);


//Sell signal
   if(MFIValue>=50)
     {
      Comment("Sell signal");
     }

//TP
   if(MFIValue<=30)
     {
      Comment("Take profit");
     }
  }
//+------------------------------------------------------------------+

该代码的不同之处在于:

信号条件:

做空信号:

//Sell signal
   if(MFIValue>=50)
     {
      Comment("Sell signal");
     }

止盈信号

//TP
   if(MFIValue<=30)
     {
      Comment("Take profit");
     }

编译后,我们可以从导航器中双击来执行它:


双击后,其窗口将如下所示:

 MFI - 下行趋势 - 做空窗口

单击“确定”后,它将被加载到图表:

MFI - 下行趋势 - 做空加载

以下是基于 MFI 生成的信号示例 - 下行趋势 - 做空策略来自测试:

做空信号:

MFI - 下行趋势 - 做空信号

止盈信号

MFI - 下行趋势 - 获利了结信号

  • 策略四: MFI - 上行趋势或背离:

以下是 MFI 的完整代码 - 上升趋势或偏离策略来自测试:

//+------------------------------------------------------------------+
//|                                  MFI - Uptrend or divergence.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()
  {
//Create arrays for MFI and price
   double MFIArray[];
   MqlRates PriceArray[];

//sorting arrays from the current data
   ArraySetAsSeries(MFIArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

//defining MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//filling the MFI array
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//calculating current and previous MFI values
   double MFICurrentValue=NormalizeDouble(MFIArray[0],5);
   double MFIPrevValue=NormalizeDouble(MFIArray[1],5);

//calculating current and previous highs
   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);

//conditions of strong move or divergence
//strong up
   if(MFICurrentValue>MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Strong up move");
     }

//bearish divergence
   if(MFICurrentValue<MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Bearish divergence");
     }
  }
//+------------------------------------------------------------------+

此代码中的差异是:

为 MFI 和价格创建数组,其中价格数组是 MqlRates 类型,存储价格、交易量、和点差信息:

   double MFIArray[];
   MqlRates PriceArray[];

数组排序:

对于 MFI,调用 ArraySetAsSeries 函数,与前述相同。

对于价格,调用 CopyRates 函数获取 MqlRates 数据型的历史数据,其参数为(品名、时间帧、开始时间、截止时间、和汇率数组)。

   ArraySetAsSeries(MFIArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

计算当期和前期的 MFI 值:

   double MFICurrentValue=NormalizeDouble(MFIArray[0],5);
   double MFIPrevValue=NormalizeDouble(MFIArray[1],5);

计算当期和前期的高点:

   double CurrentHighValue=NormalizeDouble(PriceArray[2].high,5);
   double PrevHighValue=NormalizeDouble(PriceArray[1].high,5);

MFI 的条件 - 上行趋势或背离策略:

强劲上扬:

   if(MFICurrentValue>MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Strong up move");
     }

背离:

   if(MFICurrentValue<MFIPrevValue&&CurrentHighValue>PrevHighValue)
     {
      Comment("Bearish divergence");
     }

编译此代码后,我们将在导航器中的智能系统中找到它:

 MFI nav5

采用同样方式执行它。 将其拖放或双击,打开其窗口:

 MFI - 上行趋势或背离窗口

然后单击“确定”将其加载到图表:

MFI - 上行趋势或背离加载

以下是基于此策略生成的含有数据窗口的信号示例:

含有当期数据窗口的强劲上扬信号:

MFI - 上行趋势或背离 - 强势 - 当期

含有前期数据窗口的强劲上扬信号:

MFI - 上行趋势或背离 - 强势 - 前期

伴有当期数据窗口的背离信号

MFI - 上行趋势或背离 - 强势 - 当期

伴有前期数据窗口的背离信号


  • 策略五: MFI - 下行趋势或背离:

以下是该策略的完整代码:

//+------------------------------------------------------------------+
//|                                MFI - Downtrend or divergence.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()
  {
//Create arrays for MFI and price
   double MFIArray[];
   MqlRates PriceArray[];

//sorting arrays from the current data
   ArraySetAsSeries(MFIArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,PriceArray);

//defining MFI
   int MFIDef=iMFI(_Symbol,_Period,24,VOLUME_TICK);

//filling the array
   CopyBuffer(MFIDef,0,0,3,MFIArray);

//calculating current and previous MFI values
   double MFICurrentValue=NormalizeDouble(MFIArray[0],5);
   double MFIPrevValue=NormalizeDouble(MFIArray[1],5);

//calculating current and previous highs
   double CurrentLowValue=NormalizeDouble(PriceArray[2].low,5);
   double PrevLowValue=NormalizeDouble(PriceArray[1].low,5);

//conditions of strong move or divergence
//strong down
   if(MFICurrentValue<MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Strong down move");
     }

//bullish divergence
   if(MFICurrentValue>MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Bullish divergence");
     }
  }
//+------------------------------------------------------------------+

该代码的不同之处在于:

基于该策略生成信号的条件:

强势向下移动信号:

   if(MFICurrentValue<MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Strong down move");
     }

看涨背离:

   if(MFICurrentValue>MFIPrevValue&&CurrentLowValue<PrevLowValue)
     {
      Comment("Bullish divergence");
     }

编译后,导航器窗口如下所示:

MFI nav6

执行时,其窗口如下所示:

MFI - 下行趋势或背离窗口

单击“确定”后,它将被加载到图表:

MFI - 下行趋势或背离加载

以下是生成信号的示例,并伴有数据窗口,可显示基于测试值生成的信号:

伴有当期数据窗口的强劲下行信号:

MFI - 下行趋势或背离 - 强势 - 当期

伴有前期数据窗口的强劲下行信号:

MFI - 下行趋势或背离 - 强势 - 前期

伴有当期数据窗口的看涨背离:

MFI - 下行趋势或背离 - 看行背离 - 当期

伴有前期数据窗口的看涨背离:

MFI - 下行趋势或背离 - 看行背离 - 前期

结束语

我已经通过提供的新信息来涵盖了资金流动性指数(MFI)指标的主题,这些信息可以强化您的交易,因为现在我们知道了交易量是什么,为什么它在交易中非常重要,MFI 指标是什么,它测量了什么,此外还学习了如何手工计算,以及如何插入 MetaTrader 5 内置的 MFI 指标。 在学习了 MFI 指标的基础知识,并掌握了其背后的基本概念之后,我们学习了一些简单的策略:这些是超买和超卖策略,可以揭示金融产品的超买和超卖区域;MFI - 上行趋势策略,可基于 MFI 指标在上升趋势期间检测买入和获利了结信号,MFI - 下跌趋势策略,可在下跌趋势中基于 MFI 指标生成卖出和获利了结信号;MFI - 上行趋势或背离策略,可确认上行趋势中的上涨强度,或警告我们看跌背离,MFI - 下行趋势或背离,可确认当前下跌走势是否强劲,或警告看涨背离。

除此之外,我们还为每种策略开发了一个蓝图,通过设计一个分布的蓝图,帮助我们创建一款交易系统,在 MetaTrader 5 中自动生成信号。 之后,我们以 MQL5 为每个策略创建了一款交易系统,并在 MetaTrader 5 交易平台中执行,能够自动、准确地运行,无需人工干预,从而简化交易、节省时间,并高效地完成交易。

我希望您尝试应用和实践从本文中学到的知识。 我还希望这篇文章能为您提供有关交易的有用认知,无论是与当前主题,或任何相关主题有关的见解。 正如我已经说过的,在将任何策略用到真实账户之前,一定要测试它,因为本文的主要目的是为初学者提供信息,帮助他们学习如何自己编写简单的交易策略。 因此,您可能会发现这些策略需要优化或调整,或者您会发现,若将它们与其它技术工具相结合,效果会更佳。 这是一种行之有效的方式,可以将基本的技术工具结合起来,来揭示许多观点,从而能够制定出适当的决策。 在组合这些工具之后,您还可以为它们创建一款交易系统,因为我们可以找到从简单到复杂的所有类型的交易系统,这将令我们在克服主观性问题的同时,只做我们需要的事情,而这可能是实现您的交易目标的障碍。 编程是一个神奇的工具,它可以帮助我们轻松、准确、顺利地完成所需的工作。 除了众多其它优秀的功能外,它还可以避免我们每次都重复做同样的任务。

如果您觉得这篇文章很有用,并且需要阅读更多类似的文章,您可以阅读我在本系列中的其它文章,了解如何基于最流行的技术指标设计交易系统。 我希望,它们将帮助您提升交易结果。

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

神经网络变得轻松(第十七部分):降低维度 神经网络变得轻松(第十七部分):降低维度
在本部分中,我们将继续讨论人工智能模型。 即,我们研究无监督学习算法。 我们已经讨论了众多聚类算法之一。 在本文中,我将分享一种解决与降维相关问题的方法。
价格走势模型及其主要规定(第 1 部分):最简单的模型版本及其应用 价格走势模型及其主要规定(第 1 部分):最简单的模型版本及其应用
本文提供了数学上严格的价格运动和市场功能理论的基础。 到目前为止,我们还没有任何经过严格数学论证的价格走势理论。 取而代之的是,我们不得不基于经验假设进行处理,即价格在某种形态之后以某种方式移动。 当然,这些假设既没有得到统计数据的支持,也没有得到理论的支持。
在莫斯科交易所(MOEX)里使用限价订单进行自动网格交易 在莫斯科交易所(MOEX)里使用限价订单进行自动网格交易
本文研究针对 MetaTrader 5 平台开发 MQL5 智能交易系统(EA),旨在能在 MOEX 上操作。 该 EA 采用网格策略,面向 MetaTrader 5 终端,并在 MOEX 上进行交易。 EA 包括了依据止损和止盈平仓,以及在某些市场条件下取消挂单。
从头开始开发智能交易系统(第 18 部分):新订单系统 (I) 从头开始开发智能交易系统(第 18 部分):新订单系统 (I)
这是新订单系统的第一部分。 自从我们在文章中开始打造这个 EA 以来,它已经历了各种变化和改进,同时保持了相同的图表订单系统模型。