? ? ? 系列1主要解釋的是移動(dòng)平均線,接下來(lái)解釋的也是我們常用MACD指標(biāo)荚坞,及用它編寫(xiě)成的程序化交易挑宠。
? ? ? 我們先來(lái)看它的函數(shù)求指數(shù)的平均值XAverage,寫(xiě)好了這個(gè)颓影,才好方便直接調(diào)用的各淀。代碼如下:
Params
NumericSeries Price(10);?
Numeric Length(10);?
Vars
Numeric sFcactor;
NumericSeries XAvgValue;
Begin
sFcactor = 2 / ( Length + 1 );
if (CurrentBar == 0 )
{
XAvgValue = Price;
}else
{
XAvgValue = XAvgValue[1] + sFcactor * ( Price - XAvgValue[1] ) ;
}
Return XAvgValue;
End
解釋如下:
Params
NumericSeries Price(10);? //聲明參數(shù)序列變量?jī)r(jià)格Price,初始值為10個(gè)價(jià)格诡挂。//
Numeric Length(10);? //聲明參數(shù)Length碎浇,初始值為10個(gè)周期临谱。//
Vars
Numeric sFcactor;//聲明數(shù)值型變量為sFcactor//
NumericSeries XAvgValue;? //聲明數(shù)值型序列變量為XAvgValue//
Begin
sFcactor = 2 / ( Length + 1 );//我寫(xiě)個(gè)數(shù)學(xué)式,你們看就懂y=2/(x+1)奴璃,至于為什么要用這樣的公式悉默,那你就去查指數(shù)平均詳細(xì)公式吧,這里再解釋太費(fèi)勁了苟穆,你就當(dāng)它為隨周期變化的固定比重系數(shù)抄课。//
if (CurrentBar == 0 )//假如是第一個(gè)k線。//
{
XAvgValue = Price;//XAvgValue就給它賦值為那根k線的價(jià)格雳旅。//
}else //除了第一根k線之外的跟磨,進(jìn)行下列計(jì)算//
{
XAvgValue = XAvgValue[1] + sFcactor? ( Price - XAvgValue[1] ) ; //當(dāng)前XAvgValue的指數(shù)價(jià)格 = 它前一根k線的價(jià)格+周期比重系數(shù) * (當(dāng)前的價(jià)格 - 前一個(gè)的價(jià)格)//
}
Return XAvgValue;//昨天解釋的,除了返回XAvgValue計(jì)算以外攒盈,還有一個(gè)意思是把計(jì)算得到的值反饋給主函數(shù)抵拘,主函數(shù)直接調(diào)用這個(gè)值。//
End
? ? ? 好了型豁,指數(shù)平均值的函數(shù)我們解釋完了仑濒,接下來(lái)就該解釋MACD的代碼意思了,其實(shí)偷遗,你要是把MACD的計(jì)算原理看懂了墩瞳,這代碼看著也就很簡(jiǎn)單了,這里我也不去費(fèi)勁解釋MACD是怎么計(jì)算的了氏豌,百度里有詳細(xì)解釋的喉酌。
Params
Numeric FastLength(12);//聲明數(shù)值型參數(shù)為FastLength,初始值賦值它為12個(gè)周期//
Numeric SlowLength(26);//聲明數(shù)值型參數(shù)為SlowLength泵喘,初始值為26個(gè)周期泪电。//
Numeric MACDLength(9);//聲明數(shù)組型參數(shù)為MACDLength,初始值為9個(gè)周期纪铺。//
Vars
NumericSeries MACDValue; //跟k線價(jià)格相關(guān)相速,所以用聲明數(shù)組型序列變量名為MACDValue。//
Numeric AvgMACD;//聲明數(shù)值型變量名為AvgMACD鲜锚。//
Numeric MACDDiff;//聲明數(shù)值型變量名為MACDDiff突诬。//
Begin
MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ; //看到直接調(diào)用函數(shù)XAverage了,它把收盤(pán)價(jià)輸入到上面的Price芜繁,F(xiàn)astLength為12替代上面的那個(gè)Length數(shù)10旺隙,計(jì)算出結(jié)果了,返回這邊來(lái)骏令。后邊那個(gè)同理計(jì)算出指數(shù)價(jià)格蔬捷。//
AvgMACD = XAverage(MACDValue,MACDLength);//這次還是如此,它把上一步計(jì)算得到MACDValue的值榔袋,返回替代Price的值周拐,用MACDLength周期9铡俐,替代10,計(jì)算出AvgMACD值妥粟。//
MACDDiff = MACDValue - AvgMACD;//MACDDiff值等于MACDValue的值減去AvgMACD的值高蜂。//
PlotNumeric("MACD",MACDValue);//MACDValue的值用線MACD畫(huà)出來(lái)。//
PlotNumeric("MACDAvg",AvgMACD);//AvgMACD的值用MACDAvg畫(huà)出來(lái)罕容。//
If (MACDDiff >= 0) //假如MACDDiff的值是大于零的备恤。//
PlotNumeric("MACDDiff",MACDDiff,0,Red); //用紅色單線畫(huà)出MACDDiff。//
Else//否則MACDDiff小于零的情況锦秒。//
PlotNumeric("MACDDiff",MACDDiff,0,Green); //用綠色單線畫(huà)出MACDDiff露泊。//
PlotNumeric("零線",0); //畫(huà)出值為零的零線。//
End
? ? ? 以上這些代碼就是編寫(xiě)了MACD的各線是什么意思旅择,好了惭笑,明白了各線的具體求法,那我們就可以運(yùn)用它了生真,把你買賣的指令添加進(jìn)去就可以沉噩,其實(shí)跟移動(dòng)平均線的指令差不多。記住了柱蟀,這MACD程序化針對(duì)周期30分鐘以上的比較好川蒙,時(shí)間過(guò)小,它的快慢線穿插的過(guò)快长已,交易手續(xù)費(fèi)都不夠的畜眨,所以時(shí)間一般選擇30min以上的才好操作。
? ? ? 這個(gè)系統(tǒng)如何术瓮,我一般不怎么用它的康聂,但觀察了一段時(shí)間,看著還好吧胞四,可它不符合我的操作風(fēng)格恬汁,一直就擱置著不用的,有興趣的朋友辜伟,可以自己試著觀測(cè)一段時(shí)間氓侧,看看如何。這次系統(tǒng)它直接反手買賣游昼,但時(shí)間周期長(zhǎng)甘苍,我就不給它加以限制了。
程序化交易代碼如下:
Params
Numeric FastLength(12);
Numeric SlowLength(26);
Numeric MACDLength(9);
Vars
NumericSeries MACDValue;
NumericSeries AvgMACD;
Numeric MACDDiff;
Begin
MACDValue = XAverage( Close, FastLength ) - XAverage( Close, SlowLength ) ;
AvgMACD = XAverage(MACDValue,MACDLength);
MACDDiff = MACDValue - AvgMACD;
? ? ? ? // 集合競(jìng)價(jià)和小節(jié)休息過(guò)濾
If(!CallAuctionFilter()) Return;
? ? If(MarketPosition <>1 && MACDValue[1] > AvgMACD[1] && MACDDiff >= 0)
? ? {
? ? Buy(1,Open);
? ? }
? ? If(MarketPosition ==1 && MACDValue[1] < AvgMACD[1] )
? {
? ? Sell(1,Open);
? }
? If(MarketPosition <>-1 &&? MACDValue[1] < AvgMACD[1] &&? MACDDiff < 0)
? {
? ? SellShort(1,Open);
? }
? If(MarketPosition ==-1 &&? MACDValue[1] > AvgMACD[1])
? {
? ? BuyToCover(1,open);
? }
End