学习如何基于强力指数(Force Index)设计交易系统

Mohamed Abdelmaaboud | 14 十一月, 2022

概述

这是我们系列中的新篇章,有关如何基于最流行的技术指标设计交易系统。 在本文中,我们将学习如何运用强力指数(Force Index)指标创建交易系统。 我们通读以下涵盖的主题来详细了解该指标是什么:

  1. 强力指数(Force Index)定义
  2. 强力指数策略
  3. 强力指数策略蓝图
  4. 强力指数交易系统
  5. 结束语

经由前面提到的主题,我们将学到更多有关这个技术指标的细节。 我们将通过力指数定义的主题来了解它是什么,它测量什么以及如何计算它。 在掌握了该指标背后的基本概念之后,我们通过浏览强力指数策略的主题,来学习如何在简单策略里运用它。 当走到为任意策略创建交易系统这一步时,我们发现还需要规划我们的思路,才能顺利地做到这一点,故此,我们将为每个拟议的策略设计一个蓝图,来帮助我们顺利有效地达成我们的目标,我们将在强力指数策略蓝图的主题里做到这一点。 在经由分步蓝图规划我们的想法后,我们将创建能在 MetaTrader 5 交易平台中执行的交易系统,从而自动准确地生成信号,以及我们将经由强力指数交易系统的主题来做到这一点。

我们将以 MQL5(MetaQuotes 语言)来编写交易系统,而该 MQL5 已内置在 MetaTrader 5 交易终端当中。 如果您想学习如何下载和使用它们,您可以阅读上一篇文章中的在 MetaEditor 中编写 MQL5 代码的主题。 我需要建议您应用所学的知识,因为它将帮助您加深理解,此外在真实账户上使用任何策略之前,必须对其进行测试。

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

现在,我们开始我们的主题,来学习这个强力指数指标。


强力指数(Force Index)定义

在本主题中,我们将学习有关强力指数指标的细节,如此我们将学到强力指数指标是什么、它衡量什么、以及如何计算它。 我采取的方式是,当我们学习和理解事物的根源时,我们不能仅满足于有效地运用这些东西,而是追求获得更多与这些事物相关的见解,和更多有关如何开发的思路。 强力指数由亚历山大·埃尔德(Alexander Elder)开发,他是在其令人惊叹的著作《交易谋生(Trading for a living)》中发表了它。 该指标衡量走势背后的推动力,或识别潜在的转折点。 该强力指数指标在其计算中采用价格和交易量,这有助于衡量市场任何变动背后的推动力。

如果我们想知道如何手工计算这个强力指数指标,从而了解其背后的基本概念,我们可以通过以下两个简单步骤来完成:

1- 一周期的强力指数 = (一周期的收盘价  - 前期收盘价) * 交易量

2- 十三周期的强力指数 = 一周期强力指数的十三周期 EMA 均值

今日,我们不需要再手工计算,因为我们可在 MetaTrader 5 交易平台的内置指标中找到它,我们所需要的只是从 MetaTrader 5 交易终端的可用指标中选择它。 我们打开 MetaTrader 5,我们按下插入选项卡 --> 指标 --> 振荡器 --> 强力指数。

以下是执行此操作的图片:

强力指数指标插入

选择“强力指数”后,我们会发现该指标的参数如下:

强力指数指标参数

1- 确定强力指数指标的所需周期。 我们将用(13)作为指标的默认设置。

2- 确定可用移动平均线的类型。 我们将用指数型。

3- 确定交易量的类型。 我们将用跳价。

4- 确定指标线的颜色。

5- 确定线条的样式。

6- 确定线条的宽度。

之后,我们可以找到加载到图表的指标,如下所示:

强力指数指标加载

正如我们从上一张图表的下部窗口中看到的那样,强力指数指标记载到图表上,其曲线在零轴上、下方振荡。


强力指数策略

在本主题中,我们将学习如何依据强力指数背后的基本概念运用它。 我们简单地以简单策略来理解如何运用该指标,以及如何基于它创建交易系统的基本概念。 您在真实账户上使用它们之前,您务必测试所有这些策略,从而确保它们适合您的交易,因为此处的主要宗旨只是教学。

基于此策略,我们要求根据强力指数指标与零轴之间的交叉来获得看涨或看跌信号。 如果强力指数大于零轴,则为看涨走势的信号。 反之亦然,如果强力指数低于零轴,则可能是看跌走势的信号。

简而言之,

强力指数 > 零轴 --> 看涨走势。

强力指数 < 零轴 --> 看跌走势。

基于该策略,我们要求在市场经历强劲的上涨或背离时得到信号。 如果当期高点大于前期高点,同时当期强力指数大于前期强力指数,则这是强势上涨的信号。 如果当期高点大于前期高点,同时当期强力指数低于前期强力指数,则这是看跌背离的信号。

简而言之,

当期高点 > 前期高点, 且当期强力指数 > 前期强力指数 --> 强劲上涨走势。

当期高点 > 前期高点, 且当期强力指数 < 前期强力指数 --> 看跌背离。

根据该策略,我们要求得到与策略二相反的信号。 我们要求基于具体条件获得强劲下跌走势或背离的信号。 如果当期低点低于前期低点,当期强力指数低于前期值,则这是强烈下跌走势的信号。 如果当期低点低于前期值,当期强力指数大于前期值,则这是看涨背离的信号。

简而言之,

当期低点 < 前期低点, 且当期强力指数 < 前期强力指数 --> 强劲下跌走势。

当期低点 < 前期低点, 且当期强力指数 > 前期强力指数 --> 看涨背离。

基于此策略,我们要求基于特定条件得到买入或卖出信号。 如果收盘价大于指数移动平均线,前期强力指数低于零轴,当期强力指数大于零轴,则这是一个买入信号。 如果收盘价低于指数移动平均线,前期强力指数大于零轴,当期强力指数低于零轴,则这是一个卖出信号。

简而言之,

收盘价 > EMA,前期强力指数 < 零轴,且当期强力指数 > 零轴 --> 买入信号。

收盘价 < EMA,前期强力指数 > 零轴,且当期强力指数 < 零轴 --> 卖出信号。


强力指数策略蓝图

在本主题中,我们将设计一个分步蓝图来帮助我们创建交易系统。 在我的观念中,这是一个重要的步骤,因为它有助于我们规划我们的思路,来完成我们的目标,并顺利创建我们的交易系统。

根据该策略,我们需要创建一个交易系统,它自动为我们提供看涨或看跌走势的信号,并在图表上作为注释。 我们要求智能系统检查每次跳价时的当期强力指数,并判定它距零轴的位置。 如果当期强力指数值大于零轴,我们要求智能系统在图表上返回含有看涨走势和当期强力指数值的注释。 另一方面,如果当期强力指数低于零轴,我们要求智能系统在图表上返回含有看跌走势和当期强力指数值的注释。

强力指数 - 趋势识别器蓝图

基于该策略,我们需要创建一个交易系统,为我们提供一个具有强烈上涨走势或看跌背离的信号。 我们要求交易系统持续检查四个值,这些值是当期高点和前期高点,并判定哪个值较大,且当期强力指数和前期强力指数相同。 如果当期高点大于前期高点,当期强力指数大于前期强力指数,我们要求智能系统在图表上返回以下内容作为注释,每个值都在单独的一行中:

如果当期高点大于前期高点,当期强力指数低于前期强力指数,我们要求智能系统在图表上返回以下内容作为注释,每个值都在单独的一行中:

以下是该蓝图的示意图:

强力指数 - 上行或背离蓝图

根据该策略,我们需要创建一个交易系统,返回强烈下跌或看涨背离的自动信号。 我们需要智能系统检查当期低点和前期低点四个值,并判定哪个较大,我们还要求智能系统检查当期强力指数和前期强力指数,并判定哪个较大。 如果当期低点低于前期低点,当期强力指数低于前期强力指数,我们要求智能系统在图表上返回含有以下值作为注释, 每个值单独一行:

如果当期低点低于前期低点,且当期强力指数大于前期强力指数,我们要求智能系统在图表上的注释中返回以下值,每个值都在单独的一行中:

以下是此蓝图的示意图:

强力指数 - 下跌或背离蓝图

基于该策略,我们需要创建一个交易系统,能够基于特定条件返回买入或卖出信号。 我们要求智能系统连续检查四个值,这些值是收盘价、移动平均线、当期强力指数和前期强力指数。 如果收盘价大于当期移动平均线值,前期强力指数低于零轴,当期强力指数大于零轴,我们要求智能系统在图表上返回以下值作为注释,每个值在单独的一行中:

如果收盘价低于当期移动平均线,前期强力指数大于零轴,当期强力指数低于零轴,我们要求智能系统在图表上返回以下值作为注释,每个值在单独的一行中:

以下是该策略的蓝图:

强力指数信号蓝图

强力指数交易系统

在本主题中,我们将详细学习如何为每个拟议的策略创建一个交易系统,从而在以 MQL5 编写这些策略的代码后,能根据每个策略自动在 MetaTrader 5 上获取信号。 首先,我们将创建一个简单交易策略,该策略可在图表上生成含有当期强力指数值的注释,来作为我们拟议策略的基础。

double fiArray[];
ArraySetAsSeries(fiArray,true);
int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
CopyBuffer(fiDef,0,0,3,fiArray);
double fiVal = NormalizeDouble(fiArray[0],6);
Comment("Force Index Value is ",fiVal);

以下是创建这个简单交易系统的完整代码:

//+------------------------------------------------------------------+
//|                                           Simple Force Index.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()
  {
   double fiArray[];

   ArraySetAsSeries(fiArray,true);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiVal = NormalizeDouble(fiArray[0],6);

   Comment("Force Index Value is ",fiVal);

  }
//+------------------------------------------------------------------+

编译此代码后,我们将在导航器窗口中找到该交易系统的智能系统,如下所示:

FI Nav 1

将其拖放到图表上,我们将发现其窗口与以下内容相同:

简单强力指数窗口

按“确定”后,我们发现智能系统将被加载到图表:

简单强力指数加载

正如我们在上一张图片的右上角看到的,智能系统 "Simple Force Index" 已被加载到图表上。

我们可以发现,这个交易系统生成的信号与下面的测试示例相同:

简单强力指数信号

正如我们在左上角的那张图片中看到的,有当期强力指数值的信号作为图表上的注释。

如果我们想确认生成的信号与 MetaTrader 5 中内置的强力指数指标是否相同。 我们可以在加载智能系统的同时,插入相同参数设置的指标来做到这一点。 我们会发现两者信号与以下内容相同:

简单强力指数 - 相同信号

正如我们在左上角的那张图表中看到的那样,加载了智能系统,在右上角,我们得到智能系统生成的含有强力指数值的注释,在下方窗口中,我们插入了内置的强力指数,我们可以清楚地看到两者数值是相同的。

下面介绍如何编写基于此策略来创建交易系统的代码。

//+------------------------------------------------------------------+
//|                               Force Index - Trend Identifier.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()
  {
   double fiArray[];

   ArraySetAsSeries(fiArray,true);

   int fiDef = iForce(_Symbol,_Period,100,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiVal = NormalizeDouble(fiArray[0],6);

   if(fiVal>0)
     {
      Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
     }

   if(fiVal<0)
     {
      Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
     }

  }
//+------------------------------------------------------------------+

代码中的差异在于策略的条件,

若是看涨走势情况:

   if(fiVal>0)
     {
      Comment("Bullish Movement","\n","Force Index Value is ",fiVal);
     }

若是看跌走势情况:

   if(fiVal<0)
     {
      Comment("Bearish Movement","\n","Force Index Value is ",fiVal);
     }

编译此代码后,我们可以在导航窗口中找到与以下内容相同的智能系统:

FI nav

若要执行此智能系统,我们将它拖放到图表上,然后我们就能找到其窗口,如下所示:

强力指数 - 趋势识别器窗口

按“确定”后,我们会发现智能系统已加载到图表上,如同下图所示:

强力指数 - 趋势识别器加载

正如我们在图表的右上角所见到的那样,智能系统被加载到图表上。

我们可以发现基于该策略生成的信号,与下面的测试示例相同。

看涨走势情况:

强力指数 - 趋势识别器 - 看涨信号

正如我们在左上角的图表中看到的那样,我们得到一条关于看涨走势和强力指数指标当期值的注释。

看跌走势情况:

强力指数 - 趋势识别器 - 看跌信号

正如我们在左上角的图表中看到的那样,我们得到一条关于看跌走势和强力指数指标当期值的注释。

以下是为该策略如何编写交易系统的代码。

//+------------------------------------------------------------------+
//|                               Force Index - Up 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()
  {
   double fiArray[];
   MqlRates pArray[];

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double currentHighVal=NormalizeDouble(pArray[2].high,6);
   double prevHighVal=NormalizeDouble(pArray[1].high,6);

   if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Strong up move","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

   if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Bearish Divergence","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

此代码中的差异是:

像以前一样创建两个数组,其一是 fiArray,采用 “double” 数据型;另一个是 pArray,采用 “MqlRates” 数据型,该数组存储有关价格、交易量和点差的信息。

   double fiArray[];
   MqlRates pArray[];

为所创建的数组设置排序,对于 fiArray,我们将调用 “ArraySetAsSeries” 函数,就像我们之前学到的那样。 对于 pArray,我们将调用 “CopyRates” 函数来获取 “MqlRates” 结构的历史数据,其参数为:

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

定义强力指数的当期值和前期值

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

定义当期高点值和前期高点值

   double currentHighVal=NormalizeDouble(pArray[2].high,6);
   double prevHighVal=NormalizeDouble(pArray[1].high,6);

策略的条件

强势上扬的情况:

   if(currentHighVal>prevHighVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Strong up move","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

看跌背离的情况

 
   if(currentHighVal>prevHighVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Bearish Divergence","\n",
      "Current High is ",currentHighVal,"\n",
      "Previous High is ",prevHighVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

编译此代码后,我们可在导航器窗口中找到它,如下所示:

FI Nav

把它拖拽到图表上,我们就能找到智能系统的窗口,如同下图所示:

强力指数 - 上行或背离窗口

按“确定”后,我们会发现智能系统已加载到图表上,如下所示:

强力指数 - 上行或背离加载

正如我们在右上角的那张图表中看到的那样,智能系统已被加载。

之后,如果市场行情与此策略条件匹配,我们就可以获得信号。 以下是来自测试的示例。

当前数据窗口为强劲上涨的情况下:

强力指数 - 上行或背离 - 强劲上涨信号 - 当期数据

前期数据窗口:

 强力指数 - 上行或背离 - 强劲上涨信号 - 前期数据

当期数据看跌背离的情况:

强力指数 - 上行或背离 -背离信号 - 当期数据

前期数据窗口:

强力指数 - 上行或背离 -背离信号 - 前期数据

以下是基于此策略创建交易系统的完整代码:

//+------------------------------------------------------------------+
//|                             Force Index - Down 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()
  {
   double fiArray[];
   MqlRates pArray[];

   ArraySetAsSeries(fiArray,true);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);

   CopyBuffer(fiDef,0,0,3,fiArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double currentLowVal=NormalizeDouble(pArray[2].low,6);
   double prevLowVal=NormalizeDouble(pArray[1].low,6);

   if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Strong down move","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

   if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Bullish Divergence","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

此代码中的差异是:

定义当期低点值和前期低点值

   double currentLowVal=NormalizeDouble(pArray[2].low,6);
   double prevLowVal=NormalizeDouble(pArray[1].low,6);

此策略的条件:

强势下跌的情况:

   if(currentLowVal<prevLowVal && fiCurrentVal<fiPrevVal)
     {
      Comment("Strong down move","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

在看跌背离的情况下:

   if(currentLowVal<prevLowVal && fiCurrentVal>fiPrevVal)
     {
      Comment("Bullish Divergence","\n",
      "Current Low is ",currentLowVal,"\n",
      "Previous Low is ",prevLowVal,"\n",
      "Current Force Index Value is ",fiCurrentVal,"\n",
      "Previous Force Index Value is ",fiPrevVal);
     }

编译此代码后,我们将在导航器窗口中找到该交易系统的智能系统,如下所示:

FI Nav

将其拖放到图表上后,我们就能找到该智能系统的窗口,如同下图所示:

强力指数 - 下行或背离窗口

按“确定”后,我们会发现智能系统已加载到图表上,如下所示:

强力指数 - 下跌或背离加载

正如我们在右上角的那张图表中看到的那样,智能系统已被加载。

现在,我们能看到基于此策略生成的信号,与以下测试示例相同。

当期数据导致强劲下行情况:

强力指数 - 下行或背离 - 强劲下涨信号 - 当期数据

前期数据:

强力指数 - 下行或背离 - 强劲下涨信号 - 前期数据

当期数据导致看涨背离的情况:

强力指数 - 下行或背离 -背离信号 - 当期数据

前期数据:

强力指数 - 下行或背离 -背离信号 - 前期数据

以下是基于此策略所创建交易系统的完整代码。

//+------------------------------------------------------------------+
//|                                          Force Index signals.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 initialization function                                   |
//+------------------------------------------------------------------+
void OnTick()
  {
   double fiArray[];
   double maArray[];
   MqlRates pArray[];



   ArraySetAsSeries(fiArray,true);
   ArraySetAsSeries(maArray,true);


   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);
   int Data=CopyRates(_Symbol,_Period,0,3,pArray);

   CopyBuffer(fiDef,0,0,3,fiArray);
   CopyBuffer(maDef,0,0,3,maArray);

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double maCurrentVal = NormalizeDouble(maArray[0],6);
   double closePrice = NormalizeDouble(pArray[2].close,6);


   if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
     {
      Comment("Buy Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

   if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
     {
      Comment("Sell Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

  }
//+------------------------------------------------------------------+

此代码中的区别:

为 fiArray、maArray 和 MqlRate 创建三个数组

   double fiArray[];
   double maArray[];
   MqlRates pArray[];

为 fiArray 和 maArray 数组设置排序

   ArraySetAsSeries(fiArray,true);
   ArraySetAsSeries(maArray,true);

为强力指数定义 fiDef,为移动平均线定义 maDef

   int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
   int maDef = iMA(_Symbol,_Period,50,0,MODE_EMA,PRICE_CLOSE);

如同我们所学,调用 “CopyRates” 函数复制历史数据 pArray

int Data=CopyRates(_Symbol,_Period,0,3,pArray);

填充数组

   CopyBuffer(fiDef,0,0,3,fiArray);
   CopyBuffer(maDef,0,0,3,maArray);

定义当期强力指数、前期强力指数、当期移动平均线、和收盘价四个值

   double fiCurrentVal = NormalizeDouble(fiArray[0],6);
   double fiPrevVal = NormalizeDouble(fiArray[1],6);

   double maCurrentVal = NormalizeDouble(maArray[0],6);
   double closePrice = NormalizeDouble(pArray[2].close,6);

策略的条件

买入信号情况:

   if(closePrice>maCurrentVal && fiPrevVal<0 && fiCurrentVal>0)
     {
      Comment("Buy Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

卖出信号情况:

   if(closePrice<maCurrentVal && fiPrevVal>0 && fiCurrentVal<0)
     {
      Comment("Sell Signal","\n",
              "Current Closing Price ",closePrice,"\n",
              "EMA is ",maCurrentVal,"\n",
              "Current Force Index Value is ",fiCurrentVal,"\n",
              "Previous Force Index Value is ",fiPrevVal);
     }

编译此代码后,我们可在导航器窗口中找到它,如下所示:

FI Nav

把它拖拽到图表上,我们就能找到智能系统的窗口,如同下图所示:

强力指数信号窗口

按“确定”后,我们会发现智能系统已加载到图表上,如下所示:

 强力指数信号加载

之后,我们可以找到从测试中生成的信号示例,如下所示。

当期数据生成买入信号情况:

强力指数信号 - 买入信号 - 当期数据

前期数据:

强力指数信号 - 买入信号 - 前期数据

当期数据生成卖出信号情况:

强力指数信号 - 卖出信号 - 当期数据

前期数据:

 强力指数信号 - 卖出信号 - 前期数据


结束语

力量指数指标是一个极棒的技术工具,它为我们提供了制定恰当决策的良好见解。 我们经由本文详细涵盖了这个指标,我们学到了它是什么,它衡量什么,以及如何手工计算它,从而理解它背后的概念。 我们还学到了如何经由简单的策略运用它,这些策略是:

之后,我们还设计了一个分步蓝图,为每个提到的策略创建一个交易系统,这一步的重要性在于它能帮助我们规划我们的想法,随之能顺利有效地创建这个交易系统。 我们为每个上述策略创建了一个交易系统,,并可在 MetaTrader 5 中执行,从而自动获得信号。

我需要在这里再次确认,在您的真实账户上使用任何策略之前,请严格对其进行测试,从而确保它适合您,因为没有任何策略适合所有人。 我希望您能应用自己所学,因为练习是任何学习之旅中非常重要的因素。 我还建议您研究如何将该指标与另一种技术工具配合使用,从而增强我们的决策和交易结果,因为这是技术分析方法最令人惊叹的功能之一。

依我的观点,学习编程或至少关注它很重要,因为它在不同领域的重要性与日俱增。 当它买入交易领域,编程有很多特点可以驱使我们关注它,就像编程实现程序化交易,能为我们节省时间,或至少能帮助我们提高交易绩效。 除此之外,编程还有助于依据我们编码的代码来获取准确的信号。 最能得益之处在于减少和避免有害的情绪。

我希望您能发现本文对您有所帮助,可以增强您的交易结果,并围绕此主题或任何相关主题激发新的思路。 如果您发现本文有用,并且想阅读更多类似的文章,那么请参阅我在本系列中的其它文章。