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

刚百度了一下,是这么解释的,简易波动指标(EMV),它是根据成交量和人气的变化,构成一个完整的价格体系循环。指示投资者在人气聚集且成交热络的时候买进,并且在成交量逐渐展现无力,而狂热的投资者尚未察觉能量即将用尽时卖出。

这解释说的真好,但具体实盘是不是如此,我还真不知道,说真的,这个指标我不大熟悉,也很少用这个。我测试过,熟悉的指标会跟大家说一下个人理解,这个指标今天也主要就是解读源代码,写个交易程序化,再直接测试一下看看吧。

先看下计算方式:

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

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

C=今日最高-今日最低

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

3.EMV=N日内EM的累和

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

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

好,看明白这个了计算原理,我们来看TB系统如何来写这个程序的:

Params

Numeric Length(14);//声明数值型参数Length,赋值14,其实也就是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值=(当前k线的成交量/10000)/(当前最高价 - 当前最低价)。//

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

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

Else//就是变量Ratio小于等于0的时候,执行EMVValue=0.//

EMVValue = 0;//变量EMVValue等于0//

}

PlotNumeric("EMV",EMVValue);//画线了,线EMV代表了EMVValue值。//

PlotNumeric("EMV Average",AverageFC(EMVValue,Length));//画出14周期EMV的均值。//

PlotNumeric("Ref",0);//画出0轴。//

End

我们理解了这个EMV的代码意思,接下来就是做成一个程序化交易系统了,它的买卖规则是这样的:

1. EMV值上升,代表量跌价增;EMV值下降,代表量跌价跌。

2. EMV趋向于0,代表大成交量;EMV>0,买进;EMV<0,卖出。

我做出来了,那操作太频繁了,手续费都得耗光资金。所以我改了一下,把EMV值,改成14周期的均值,这操作就好多了,结果看着还行的,代码如下:

Params

Numeric Length(14);

Vars

NumericSeries EMVValue;

NumericSeries EMV;

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 = MovMid/Ratio;

Else

EMVValue = 0;

}

EMV = AverageFC(EMVValue,Length);

If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤

If(MarketPosition <>1 && EMV[1] > 0)

{

Buy(1,Open);

}

If(MarketPosition ==1 && EMV[1] < 0)

{

Sell(1,Open);

}

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

{

SellShort(1,Open);

}

If(MarketPosition ==-1 && EMV[1] > 0)

{

BuyToCover(1,open);

}

End

看着结果不错,那我们能不能再改进一下,还是添加一条移动200均线(其实200或则360啊都是我随意写上去的,没做什么优化过),代码及结果如下:

Params

Numeric Length(14);

Numeric DslowLength(200);

Vars

NumericSeries EMVValue;

NumericSeries EMV;

Numeric MovMid(0);

Numeric Ratio;

NumericSeries AvgValue3;

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 = MovMid/Ratio;

Else

EMVValue = 0;

}

EMV = AverageFC(EMVValue,Length);

AvgValue3 = AverageFC(Close,DslowLength);

If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤//

If(MarketPosition <>1 && EMV[1] > 0 && Close[1] > AvgValue3[1] )

{

Buy(1,Open);

}

If(MarketPosition ==1 && EMV[1] < 0)

{

Sell(1,Open);

}

If(MarketPosition <>-1 && EMV[1] < 0 && Close[1] < AvgValue3[1] )

{

SellShort(1,Open);

}

If(MarketPosition ==-1 && EMV[1] > 0)

{

BuyToCover(1,open);

}

End

看到了,结果又更好了一些,当然这些参数都是我随意写上的,没做过优化处理,也没对各品种进行过全面测试,但是看这结果,我觉得这系统还是不错的。有朋友要是对这指标熟悉,觉得可以,也可以在此基础上进行改进,比如再修改一下止损止盈啊,把我之前写的那个添加进去就行,至于结果如何,我也不知道,感兴趣的朋友可以自己测试看看的。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容