期货软件TB系统源代码解读系列20-EMV

之前已经写过一篇EMV简易波动指标,今天重新写是因为发现了TB系统自带的代码是一个错误的,没什么可以说的,先看算法:

1. A=(今日最高+今日最低)/2

B=(前日最高+前日最低)/2

C=今日最高-今日最低

2.EM=(A-B)*C/今日成交额

3.EMV=N日内EM的累和

4.MAEMV=EMV的M日简单移动平均

5.参数N为14,参数M为9

代码及解读如下:

Params

Numeric Length(14); //声明数值参数Length,初始值为14.//

Vars

NumericSeries EMVValue;//声明数值序列变量EMVValue。//

Numeric MovMid(0); //声明数值变量MovMid,初值为0.//

Numeric Ratio; //声明数值变量Ratio。//

Begin

If(CurrentBar==0) // 假如当前k线为第一根。//

{

EMVValue = 0; // 序列变量EMVValue 赋值为0.//

}Else //除了第一根k线之外,都按下列计算。//

{

MovMid = (High+Low)/2-(High[1]+Low[1])/2; // 变量MovMid = (当前高价 - 当前低价)/ 2 - (前一根k线高价 - 前一根k线低价)/ 2.//

Ratio = (Vol/10000)/(High-Low);//变量Ratio = (成交量 / 10000)/(当前高价-当前低价)//

If(Ratio >0 )  // 假如变量Ratio 大于0.//

EMVValue = MovMid/Ratio; // 变量EMVValue = 变量MovMid / 变量Ratio。//

Else //就是变量Ratio小于等于0时。//

EMVValue = 0; // 变量EMVValue = 0.//

}

PlotNumeric("EMV",EMVValue); //画线EMV,就是变量EMVValue值。//

PlotNumeric("EMV Average",AverageFC(EMVValue,Length)); // 画线EMV Average,值就是求变量EMVValue的14周期均值。//

PlotNumeric("Ref",0); // 画零线。//

End

看这代码,仔细跟算法对比,应该发现这代码少了第3步累和,所以说这个代码算出来的是不准确的。我们可以改一下:

Params

Numeric Length(14);

Numeric Length1(9);

Vars

NumericSeries EMVValue;

Numeric MovMid(0);

Numeric Ratio;

Begin

If(CurrentBar==0)

{

EMVValue = 0;

}Else

{

MovMid = (High+Low)/2-(High[1]+Low[1])/2;

Ratio = (Vol/10000)/(High-Low);

If(Ratio >0 )

EMVValue = SummationFC( MovMid/Ratio , Length);

Else

EMVValue = 0;

}

PlotNumeric("EMV",EMVValue);

PlotNumeric("EMV Average",AverageFC(EMVValue,Length1));

PlotNumeric("Ref",0);

End

看到了吧,这个才是与算法一致的代码,所以说,我们看TB系统自带的指标时候,首先应该先仔细看懂看清算法,再一步步解读代码,不是说TB自带的系统就不能出错的,因为编写代码的也是人,只要他不仔细,少了一步,得出来的结果就是错的,后期检查可能很难发现的。

这个EMV指标它的买卖规则也很简单,根据EMV判断当个交易日是否进行操作。如果上上个交易日EMV<0,上个交易日EMV>0,则买入,反之卖出。我直接附上代码及结果了,如下:

Params

Numeric Length(14);

Vars

NumericSeries EMVValue;

Numeric MovMid(0);

Numeric Ratio;

Begin

If(CurrentBar==0)

{

EMVValue = 0;

}Else

{

MovMid = (High+Low)/2-(High[1]+Low[1])/2;

Ratio = (Vol/10000)/(High-Low);

If(Ratio >0 )

EMVValue = SummationFC( MovMid/Ratio , Length);

Else

EMVValue = 0;

}

If(!CallAuctionFilter()) Return;

If(MarketPosition <>1 && EMVValue[2] < 0 && EMVValue[1] > 0 )

{

Buy(1,Open);

}

If(MarketPosition <>-1 && EMVValue[2] > 0 && EMVValue[1] < 0)

{

SellShort(1,Open);

}

End

结果就这样了,至于那些年收益啊,盈亏比,夏普率什么的,自己想用这个指标,就认真去了解了,我这里也就做个解读一下代码而已。不做推荐哪个程序化系统,因为每个系统都有自身的优缺点,不完全了解,用了心里没底也是白瞎做的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容