刚百度了一下,是这么解释的,简易波动指标(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

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