
学习如何基于强力指数(Force Index)设计交易系统
概述
这是我们系列中的新篇章,有关如何基于最流行的技术指标设计交易系统。 在本文中,我们将学习如何运用强力指数(Force Index)指标创建交易系统。 我们通读以下涵盖的主题来详细了解该指标是什么:
经由前面提到的主题,我们将学到更多有关这个技术指标的细节。 我们将通过力指数定义的主题来了解它是什么,它测量什么以及如何计算它。 在掌握了该指标背后的基本概念之后,我们通过浏览强力指数策略的主题,来学习如何在简单策略里运用它。 当走到为任意策略创建交易系统这一步时,我们发现还需要规划我们的思路,才能顺利地做到这一点,故此,我们将为每个拟议的策略设计一个蓝图,来帮助我们顺利有效地达成我们的目标,我们将在强力指数策略蓝图的主题里做到这一点。 在经由分步蓝图规划我们的想法后,我们将创建能在 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。
double fiArray[];
- 调用 "ArraySetAsSeries" 函数设置数组排序,其返回一个布尔值 (true 或 false)。 该函数的参数是:
- array[]
- flag
ArraySetAsSeries(fiArray,true);
- 创建 fiDeF 变量后,调用 iForce 定义句柄。 iForce 函数返回强力指数指标的句柄。 该函数的参数是:
- symbol: 我们采用 (_Symbol) 对应当前应用的品种名称。
- period: 我们采用 (_Period) 对应当前应用的周期或时间帧。
- ma_period: 我们采用 (13) 作为移动均线长度。
- ma_method: 我们采用 (MODE_EMA) 作为移动均线类型
- applied_volume: 我们采用 (VOLUME_TICK) 作为交易量类型。
int fiDef = iForce(_Symbol,_Period,13,MODE_EMA,VOLUME_TICK);
- 调用 CopyBuffer 函数填充数组,数据取自强力指数指标。 该函数参数:
- indicator_handle: 指标句柄,我们取自(fiDef)。
- buffer_num: 指标缓冲区编号,我们将采用(0)。
- start_pos: 数据起始位置,我们将采用(0)。
- count: 需要复制的数量,我们将采用(13)。
- buffer[]: 数据复制的目标数组,我们将采用(fiArray)。
CopyBuffer(fiDef,0,0,3,fiArray);
- 创建 fiVal 变量后,调用 NormalizeDouble 函数定义当期强力指数值。 NormalizeDouble 函数返回双精度类型数值,参数为:
- value: 我们将采用 (fiArray[0]) 作为常规化数字。
- digits: 我们将采用 (6) 作为小数点之后的数字长度。
double fiVal = NormalizeDouble(fiArray[0],6);
- 调用 Comment 函数将当期强力指数值作为图表上的注释返回。
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); } //+------------------------------------------------------------------+
编译此代码后,我们将在导航器窗口中找到该交易系统的智能系统,如下所示:
将其拖放到图表上,我们将发现其窗口与以下内容相同:
按“确定”后,我们发现智能系统将被加载到图表:
正如我们在上一张图片的右上角看到的,智能系统 "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); }
编译此代码后,我们可以在导航窗口中找到与以下内容相同的智能系统:
若要执行此智能系统,我们将它拖放到图表上,然后我们就能找到其窗口,如下所示:
按“确定”后,我们会发现智能系统已加载到图表上,如同下图所示:
正如我们在图表的右上角所见到的那样,智能系统被加载到图表上。
我们可以发现基于该策略生成的信号,与下面的测试示例相同。
看涨走势情况:
正如我们在左上角的图表中看到的那样,我们得到一条关于看涨走势和强力指数指标当期值的注释。
看跌走势情况:
正如我们在左上角的图表中看到的那样,我们得到一条关于看跌走势和强力指数指标当期值的注释。
- 策略二:强力指数 - 上行或背离:
以下是为该策略如何编写交易系统的代码。
//+------------------------------------------------------------------+ //| 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” 结构的历史数据,其参数为:
- symbol name: 我们采用 (_Symbol)。
- timeframe: 我们采用 (_Period)。
- start time: 我们采用 (0)。
- stop time: 我们采用 (3)。
- rates array: 我们采用 (pArray)。
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); }
编译此代码后,我们可在导航器窗口中找到它,如下所示:
把它拖拽到图表上,我们就能找到智能系统的窗口,如同下图所示:
按“确定”后,我们会发现智能系统已加载到图表上,如下所示:
正如我们在右上角的那张图表中看到的那样,智能系统已被加载。
之后,如果市场行情与此策略条件匹配,我们就可以获得信号。 以下是来自测试的示例。
当前数据窗口为强劲上涨的情况下:
前期数据窗口:
当期数据看跌背离的情况:
前期数据窗口:
- 策略三:强力指数 - 下行或背离:
以下是基于此策略创建交易系统的完整代码:
//+------------------------------------------------------------------+ //| 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); }
编译此代码后,我们将在导航器窗口中找到该交易系统的智能系统,如下所示:
将其拖放到图表上后,我们就能找到该智能系统的窗口,如同下图所示:
按“确定”后,我们会发现智能系统已加载到图表上,如下所示:
正如我们在右上角的那张图表中看到的那样,智能系统已被加载。
现在,我们能看到基于此策略生成的信号,与以下测试示例相同。
当期数据导致强劲下行情况:
前期数据:
当期数据导致看涨背离的情况:
前期数据:
- 策略四:强力指数信号:
以下是基于此策略所创建交易系统的完整代码。
//+------------------------------------------------------------------+ //| 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); }
编译此代码后,我们可在导航器窗口中找到它,如下所示:
把它拖拽到图表上,我们就能找到智能系统的窗口,如同下图所示:
按“确定”后,我们会发现智能系统已加载到图表上,如下所示:
之后,我们可以找到从测试中生成的信号示例,如下所示。
当期数据生成买入信号情况:
前期数据:
当期数据生成卖出信号情况:
前期数据:
结束语
力量指数指标是一个极棒的技术工具,它为我们提供了制定恰当决策的良好见解。 我们经由本文详细涵盖了这个指标,我们学到了它是什么,它衡量什么,以及如何手工计算它,从而理解它背后的概念。 我们还学到了如何经由简单的策略运用它,这些策略是:
- 强力指数 - 趋势标识符:获取看涨和看跌走势的信号。
- 强力指数 - 上涨或背离:获得强劲上涨或看跌背离的信号。
- 强力指数 - 下跌或背离:获得强劲下跌或看涨背离的信号。
- 强力指数信号:根据估算收盘价、强力指数值、和指数移动平均线,获得买入或卖出信号。
之后,我们还设计了一个分步蓝图,为每个提到的策略创建一个交易系统,这一步的重要性在于它能帮助我们规划我们的想法,随之能顺利有效地创建这个交易系统。 我们为每个上述策略创建了一个交易系统,,并可在 MetaTrader 5 中执行,从而自动获得信号。
我需要在这里再次确认,在您的真实账户上使用任何策略之前,请严格对其进行测试,从而确保它适合您,因为没有任何策略适合所有人。 我希望您能应用自己所学,因为练习是任何学习之旅中非常重要的因素。 我还建议您研究如何将该指标与另一种技术工具配合使用,从而增强我们的决策和交易结果,因为这是技术分析方法最令人惊叹的功能之一。依我的观点,学习编程或至少关注它很重要,因为它在不同领域的重要性与日俱增。 当它买入交易领域,编程有很多特点可以驱使我们关注它,就像编程实现程序化交易,能为我们节省时间,或至少能帮助我们提高交易绩效。 除此之外,编程还有助于依据我们编码的代码来获取准确的信号。 最能得益之处在于减少和避免有害的情绪。
我希望您能发现本文对您有所帮助,可以增强您的交易结果,并围绕此主题或任何相关主题激发新的思路。 如果您发现本文有用,并且想阅读更多类似的文章,那么请参阅我在本系列中的其它文章。
本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/11269
注意: MetaQuotes Ltd.将保留所有关于这些材料的权利。全部或部分复制或者转载这些材料将被禁止。
This article was written by a user of the site and reflects their personal views. MetaQuotes Ltd is not responsible for the accuracy of the information presented, nor for any consequences resulting from the use of the solutions, strategies or recommendations described.


