股票量化交易软件:如何创建自己的指标
简介什么是指标?指标是赫兹股票量化交易软件希望以便利方式在荧幕上显示的一组计算值。这一组值在程序中以数组表示。因此,创建指标意即编写用于处理数组(价格数组)的算法并将处理结果记录在其他数组(指标值)中。
来百度APP畅享高清图片
尽管已有许多已成经典的现成指标,但创建自己的指标的必要性始终存在。赫兹股票量化交易软件把使用赫兹股票量化交易软件自己的算法创建的这类指标称为自定义指标。本文将探讨如何创建简单的自定义指标。
指标是不同的指标可以表现为带有颜色的线条或区域,或作为指向输入头寸的有利时刻的特殊标签显示。同时,这些类型还可以相互结合,从而提供了更多的指标类型。赫兹股票量化交易软件将采用WilliamBlau开发的众所周知的“真实强弱指数”作为指标创建的示例。
真实强弱指数TSI指标基于双重平滑动量来确定趋势及超卖/超买区域。指标的数学诠释请见 动量、方向和背离,WilliamBlau。在这里,赫兹股票量化交易软件仅涉及计算公式。
TSI(CLOSE,r,s)=100*EMA(EMA(mtm,r),s)/EMA(EMA(|mtm|,r),s)
其中:
mtm=CLOSEcurrent –CLOSprev,值数组指示当前柱的收盘价格和上一个柱的收盘价格的差值;
EMA(mtm,r)=周期长度为r的mtm值的指数平滑;
EMA(EMA(mtm,r),s)=时间周期为s的EMA(mtm,r)值的指数平滑;
|mtm|=mtm绝对值;
r=25,
s=13。
从上述公式赫兹股票量化交易软件可以得知,有三个参数影响指标计算。它们是时间周期r和时间周期s,以及用于计算的价格类型。在前例中,赫兹股票量化交易软件使用收盘价。
MQL5向导赫兹股票量化交易软件将TSI以蓝色线条显示-在这里,赫兹股票量化交易软件需要启动“MQL5向导”。首先,赫兹股票量化交易软件需要指出赫兹股票量化交易软件希望创建的程序的类型-自定义指标。接来下,赫兹股票量化交易软件应设置程序名、r 和 s 参数以及它们的值。
之后,赫兹股票量化交易软件需定义指标在单独的窗口中以蓝色线条显示,并为该线条设置TSI标签。
在输入所有初始数据后,按Done(完成)并获得指标的草稿。
//+------------------------------------------------------------------+//| TrueStrengthIndex.mq5|//| Copyright2009,MetaQuotesSoftwareCorp.|//| https://www.mql5.com|//+------------------------------------------------------------------+#propertycopyright"2009,MetaQuotesSoftwareCorp."#propertylink "https://www.mql5.com"#propertyversion "1.00"#propertyindicator_separate_window#propertyindicator_buffers1#propertyindicator_plots 1//----TSI绘图属性#propertyindicator_label1 "TSI"#propertyindicator_type1 DRAW_LINE#propertyindicator_color1 Blue#propertyindicator_style1 STYLE_SOLID#propertyindicator_width1 1//---输入参数inputint r=25;inputint s=13;//---指标缓冲区double TSIBuffer[];//+------------------------------------------------------------------+//|自定义指标初始化函数 |//+------------------------------------------------------------------+intOnInit() {//---指标缓冲区映射关系 SetIndexBuffer(0,TSIBuffer,INDICATOR_DATA);//--- return(0); }//+------------------------------------------------------------------+//|自定义指标迭代函数 |//+------------------------------------------------------------------+intOnCalculate(constintrates_total, constintprev_calculated, constdatetime&time[], constdouble&open[], constdouble&high[], constdouble&low[], constdouble&close[], constlong&tick_volume[], constlong&volume[], constint&spread[]) {//---//---返回值会作为下一次调用的prev_calculated参数调用 return(rates_total); }//+------------------------------------------------------------------+
“MQL5向导”创建指标头文件,其内规定了指标属性,即:
指标在单独窗口中显示;
指标缓冲区数量, indicator_buffers=1;
绘图数量, indicator_buffers=1;
绘图1名称,indicator_label1="TSI";
首个绘图样式-线条,indicator_type1=DRAW_LINE;
绘图1颜色,indicator_color1=Blue;
线条样式,indicator_style1=STYLE_SOLID;
绘图1线宽,indicator_width1=1。
所有准备工作就绪,现在赫兹股票量化交易软件可以着手改进和完善赫兹股票量化交易软件的代码。
OnCalculate()函数OnCalculate()是Calculate事件的处理函数,在需要重新计算指标值以及在图表上重新绘制指标时出现。这是新的订单号接收、交易品种历史数据更新等的事件。这就是指标值所有计算的主代码必须位于此函数中的原因。
当然,辅助计算可以通过其他的单独函数实施,但这些函数必须用于OnCalculate处理函数。
默认情况下,“MQL5向导”创建 OnCalculate()的第二种形式,该形式提供对所有时序类型的访问:
开盘价、最高价、最低价、收盘价;
交易量(实际量和/或跳动量);
点差;
周期开盘时间。
而对于赫兹股票量化交易软件而言,赫兹股票量化交易软件只需要一个数据数组,这就是赫兹股票量化交易软件要改写调用的OnCalculate()函数的第一种形式的原因。
intOnCalculate(constintrates_total, //price[]数组大小; constintprev_calculated, //上次调用计算后的价格柱的数量 constintbegin, //price[]数组开始计算的索引 constdouble&price[]) //指标计算的依据数组 {//---//---返回值会作为下一次调用的prev_calculated参数调用 return(rates_total); }
这就使赫兹股票量化交易软件不仅可以进一步将指标应用于价格数据,同时还可以基于其他指标的值来创建指标。
如果赫兹股票量化交易软件在Parameters(参数)选项卡中选择 Close(收盘)(默认提供),则传递至OnCalculate()的 price[] 将包含收盘价。如果赫兹股票量化交易软件选择,例如,TypicalPrice(典型价格),price[] 将在每个时间周期中包含(最高价+最低价+收盘价)/3的价格。
rates_total 参数指示 price[] 数组的大小;该参数在循环中组织计算时十分有用。price[]中的元素索引从零开始,方向从过去至未来,即price[0]元素包含最旧的值,而price[rates_total-1]包含最新的数组值。
组织辅助指标缓冲区仅有一根线会在图表中显示,即一个指标数组的数据。但在此之前,赫兹股票量化交易软件需要组织中间计算。中间数据存储在以 INDICATOR_CALCULATIONS 属性标记的指标数组中。从上述公式可以得知,赫兹股票量化交易软件还需要以下附加数组:
用于值mtm-数组MTMBuffer[];
用于值|mtm|-数组AbsMTMBuffer[];
用于EMA(mtm,r)- 数组 EMA_MTMBuffer[];
用于EMA(EMA(mtm,r),s)- 数组 EMA2_MTMBuffer[];
用于EMA(|mtm|,r)- 数组 EMA_AbsMTMBuffer[];
用于EMA(EMA(|mtm|,r),s)- 数组 EMA2_AbsMTMBuffer[]。
赫兹股票量化交易软件总共还需要添加6个全局级别的双精度类型数组,并需要将这些数组和指标缓冲区绑定至 OnInit() 函数。切勿忘记标示新的指标缓冲区数量;indicator_buffers 属性必须等于7(原有的1个缓冲区加上添加的6个缓冲区)。
#propertyindicator_buffers7
现在指标代码如下所示:
#propertyindicator_separate_window#propertyindicator_buffers7#propertyindicator_plots 1//----TSI绘图属性#propertyindicator_label1 "TSI"#propertyindicator_type1 DRAW_LINE#propertyindicator_color1 Blue#propertyindicator_style1 STYLE_SOLID#propertyindicator_width1 1//---输入参数inputint r=25;inputint s=13;//---指标缓冲区double TSIBuffer[];double MTMBuffer[];double AbsMTMBuffer[];double EMA_MTMBuffer[];double EMA2_MTMBuffer[];double EMA_AbsMTMBuffer[];double EMA2_AbsMTMBuffer[];//+------------------------------------------------------------------+//|自定义指标初始化函数 |//+------------------------------------------------------------------+intOnInit() {//---指标缓冲区映射关系 SetIndexBuffer(0,TSIBuffer,INDICATOR_DATA); SetIndexBuffer(1,MTMBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(2,AbsMTMBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(3,EMA_MTMBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(4,EMA2_MTMBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(5,EMA_AbsMTMBuffer,INDICATOR_CALCULATIONS); SetIndexBuffer(6,EMA2_AbsMTMBuffer,INDICATOR_CALCULATIONS);//--- return(0); }//+------------------------------------------------------------------+//|自定义指标迭代函数 |//+------------------------------------------------------------------+intOnCalculate(constintrates_total, //price[]数组大小; constintprev_calculated,//次调用计算后的价格柱的数量; constintbegin, //price[]数组开始计算的索引; constdouble&price[]) //指标计算的依据数组; {//---//---返回值会作为下一次调用的prev_calculated参数调用 return(rates_total); }
中间计算组织缓冲区 MTMBuffer[]和 AbsMTMBuffer[]的值的计算是非常容易的。在循环中,从price[1]至price[rates_total-1]逐一遍历值,将差值写入一个数组,差值的绝对值写入第二个数组。
//---计算mtm和|mtm|的数值 for(inti=1;i