期貨軟件TB系統(tǒng)源代碼解讀系列9-EMV

剛百度了一下,是這么解釋的,簡易波動指標(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é)果如何,我也不知道,感興趣的朋友可以自己測試看看的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容