期货量化软件:赫兹量化中如何用 MQL5 创建自定义真实强度指数指标

概述
如果我们正确使用技术指标,它们会非常实用,因其也许会提供额外的见解,而这些见解很难通过查看价格行为来检测。 有许多现成的技术指标我们可以取用,但有时可能会发现我们需要自定义它们,以便为我们提供指示或特定的见解,或者我们需要根据自己的获胜思路创建一个新指标。 有一种途径能以 MQL5 创建此类自定义指标,并在 MetaTrader 5 交易平台中使用它们。 在本文中,我将与您分享如何从头开始创建真实强度指数指标。 我们将学习该指标的细节,并看到如何在我们的代码中计算它。 不仅如此,我们还将学习如何遵照交易策略,基于这个自定义指标创建智能系统。

真实强度指数(TSI)定义
在这一部分中,我们将辨别真实强度指数(TSI)技术指标,以便正确理解它。 它是由威廉·布劳(William Blau)开发的,是一款衡量价格行为动量的技术指标,即它衡量金融产品的强度,是强势亦或弱势。 它围绕零轴振荡,因此它是一个动量振荡器指标。 信号线也可与它一起使用,基于这些线之间的交叉获得额外的买入或卖出信号。 不过,我们只能基于 TSI 线获得信号,即它与零轴的交叉。 如果高于零轴,则表示看涨动量,如果低于零轴,则表示看跌动量。 它可用于检测超买和超卖区域,并检测看涨和看跌背离。 由于我们知道,我们需要确认其信号,以便提升证据的权重;最好将其与其它技术工具配合使用,我们应该在价格行为相同的背景下使用这些工具,从而获得更好的见解。

现在我们来看看如何计算这个指标。 计算分几个步骤进行,分别是:

计算双重平滑动量:

从当前价格中减去前一个价格来计算动量(价格变化)
依据已计算出的动量,计算其 25-周期 EMA,得到第一次平滑
依据第一次平滑(已计算动量的 25-周期 EMA)再次计算 13-周期 EMA,得到第二次平滑
计算双重平滑绝对动量:

从当前绝对价格中减去前期绝对价格来计算绝对动量
依据已计算出的绝对动量,计算其 25-周期 EMA,得到第一次平滑
依据第一次平滑(已计算绝对动量的 25-周期 EMA)再计算 13-周期 EMA,得到第二次平滑
计算 TSI = 100*(双重平滑动量 / 双重平滑绝对动量)

这种计算的后果是得到一条围绕零轴的振荡线,衡量价格行为的动量,并检测我们提到的超买和超卖区域。

自定义简单 TSI 指标
MQL5 编程语言有很多预定义的技术指标,我们可以在我们的系统中使用这些预定义的函数。 在本系列的前几篇文章中,我们已经讨论过很多这样的指标,讨论了如何基于这些流行的技术指标来设计交易系统。 您可以查阅以前的文章,也许会找到有用的东西。 现在的问题是,如果指标不存在,我们如何创建一个指标,就像标准平台交付包中一样,或者即使它存在,我们如何创建一个自定义指标来获得所需的信号或触发器。 简短的答案是利用主要编程语言创建一个自定义指标,这就是我们在这一部分中所要做的。

我们将学习如何利用 MQL5 创建我们的自定义真实强度指数指标。 然后,我们将在其它系统或 EA 中使用它的功能。 以下步骤就是为了创建此自定义指标。

创建其它参数要使用 #property,在它之后是我们指定的标识符和数值,以下这些是我们需要指定的参数:

(indicator_separate_window) — 在单独的窗口中显示指标。
(indicator_buffers) — 指定指标的缓冲区数量,我们将指定(8)。
(indicator_plots) — 指定指标中绘图板的数量,我们将指定(1)。
(indicator_label1) — 设置绘图板编号的标签,我们将指定(TSI)。
(indicator_type1) — 从 ENUM_DRAW_TYPE 枚举值中选一个,来指定绘图板的类型,我们将指定(DRAW_LINE)。
(indicator_color1) — 指定指标线的颜色,我们将指定(clrBlue)。
(indicator_style1) — 指定指标线的样式,我们将指定(STYLE_SOLID)。
(indicator_width1) — 指定指标线的粗细,我们将指定(3)。
#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   1
#property indicator_label1  "TSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  3
我们需要包含 MovingAverage.mqh 文件,以便在计算中调用它的组件,该文件存在于 Include 文件夹中,故需用 #include 命令。 请确保编写的文件名与实际文件名相同。

#include <MovingAverages.mqh>
我们需要输入两个平滑周期的设置,如果用户需要更新程序中指定的默认值,我们可用输入类输入这些值,并计算指标。 之后,我们用 uint(无符号整数型)声明我们需要的变量(InpSmPeriod1、InpSmPeriod2)的数据类型。 然后,我们将(25) 分配给 InpSmPeriod1,将(13)分配给 InpSmPeriod2,作为默认值。 

input uint     InpSmPeriod1   =  25;    // Smoothing period 1
input uint     InpSmPeriod2   =  13;   // Smoothing period 2
创建两个整数型变量(smperiod1,smperiod2)保存平滑周期。

int            smperiod1;
int            smperiod2;
为指标缓冲区创建 7 个数组

double         indBuff[];
double         momBuff[];
double         momSmBuff1[];
double         momSmBuff2[];
double         absMomBuff[];
double         absMomSmBuff1[];
double         absMomSmBuff2[];
在 OnInit() 函数中,我们将执行以下步骤:

声明变量(smperiod1,smperiod2),如果用户输入的 InpSmPeriod1 和 InpSmPeriod2 小于 2,则返回值 2;如果是其它数值,则返回 InpSmPeriod1 和 InpSmPeriod2 的值。

   smperiod1=int(InpSmPeriod1<2 ? 2 : InpSmPeriod1);
   smperiod2=int(InpSmPeriod2<2 ? 2 : InpSmPeriod2);
调用(SetIndexBuffer)函数将指标缓冲区与数组绑定。 其参数为:

index: 在我们的程序中设置指标缓冲区的数量,其为从 0 开始到 7 的数字。

buffer[]: 指定自定义指标中声明的数组。

data_type: 指定存储在指标数组中的数据类型。

   SetIndexBuffer(0,indBuff,INDICATOR_DATA);
   SetIndexBuffer(2,momBuff,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,momSmBuff1,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,momSmBuff2,INDICATOR_CALCULATIONS);
   SetIndexBuffer(5,absMomBuff,INDICATOR_CALCULATIONS);
   SetIndexBuffer(6,absMomSmBuff1,INDICATOR_CALCULATIONS);
   SetIndexBuffer(7,absMomSmBuff2,INDICATOR_CALCULATIONS);
设置相应指标属性的数值时,指标属性(prop value)必须是字符串类型,方法是调用(IndicatorSetString)函数,仅按指定属性标识符调用该函数的不同变体。 此步骤设置指标的短名称,并确定在指标窗口左上角显示的周期。 其参数:

prop_id: 指定指示器属性的标识符,该属性将是(ENUM_CUSTOMIND_PROPERTY_STRING)枚举之一。 在我们的程序中,它应是(INDICATOR_SHORTNAME)。
prop_value: 指定属性的值,该值将为字符串数据类型。 它将是 "True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")"。
IndicatorSetString(INDICATOR_SHORTNAME,"True Strength Index ("+(string)smperiod1+","+(string)smperiod2+")");
以整数型数据类型设置指标的另一个属性值,调用 (IndicatorSetInteger)变体设置指定属性标识符,将指标的小数值规范化到指定位数。 其参数 

prop_id: 指定指标属性的标识符,该属性应是(ENUM_CUSTOMIND_PROPERTY_INTEGER)枚举之一。 在我们的程序中,它应是(INDICATOR_DIGITS)。
prop_value: 指定属性的值,该值是整数型数据类型。 它将与 Digits() 对应。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值