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