剛百度了一下,是這么解釋的,簡易波動指標(EMV),它是根據(jù)成交量和人氣的變化,構(gòu)成一個完整的價格體系循環(huán)。指示投資者在人氣聚集且成交熱絡(luò)的時候買進,并且在成交量逐漸展現(xiàn)無力,而狂熱的投資者尚未察覺能量即將用盡時賣出。
這解釋說的真好,但具體實盤是不是如此,我還真不知道,說真的,這個指標我不大熟悉,也很少用這個。我測試過,熟悉的指標會跟大家說一下個人理解,這個指標今天也主要就是解讀源代碼,寫個交易程序化,再直接測試一下看看吧。
先看下計算方式:
1.A=(今日最高+今日最低)/2
B=(前日最高+前日最低)/2
C=今日最高-今日最低
2.EM=(A-B)*C/今日成交額
3.EMV=N日內(nèi)EM的累和
4.MAEMV=EMV的M日的簡單移動平均
5.參數(shù)N為14,參數(shù)M為9
好,看明白這個了計算原理,我們來看TB系統(tǒng)如何來寫這個程序的:
Params
Numeric Length(14);//聲明數(shù)值型參數(shù)Length,賦值14,其實也就是14周期。//
Vars
NumericSeries EMVValue;//聲明數(shù)值型序列變量EMVValue。//
Numeric MovMid(0);//聲明數(shù)值型變量MovMid,賦值為0。//
Numeric Ratio;//聲明數(shù)值型變量Ratio。//
Begin
If(CurrentBar==0)//假如為第一根k線。//
{
EMVValue = 0;//變量EMVValue值等于0。//
}Else//除第一根k線之外的,執(zhí)行下列操作。//
{
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的時候,執(zhí)行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的代碼意思,接下來就是做成一個程序化交易系統(tǒng)了,它的買賣規(guī)則是這樣的:
1. EMV值上升,代表量跌價增;EMV值下降,代表量跌價跌。
2. EMV趨向于0,代表大成交量;EMV>0,買進;EMV<0,賣出。
我做出來了,那操作太頻繁了,手續(xù)費都得耗光資金。所以我改了一下,把EMV值,改成14周期的均值,這操作就好多了,結(jié)果看著還行的,代碼如下:
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;// 集合競價和小節(jié)休息過濾
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

看著結(jié)果不錯,那我們能不能再改進一下,還是添加一條移動200均線(其實200或則360啊都是我隨意寫上去的,沒做什么優(yōu)化過),代碼及結(jié)果如下:
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;// 集合競價和小節(jié)休息過濾//
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

看到了,結(jié)果又更好了一些,當然這些參數(shù)都是我隨意寫上的,沒做過優(yōu)化處理,也沒對各品種進行過全面測試,但是看這結(jié)果,我覺得這系統(tǒng)還是不錯的。有朋友要是對這指標熟悉,覺得可以,也可以在此基礎(chǔ)上進行改進,比如再修改一下止損止盈啊,把我之前寫的那個添加進去就行,至于結(jié)果如何,我也不知道,感興趣的朋友可以自己測試看看的。