威廉指標(biāo)-WR,也是業(yè)內(nèi)大名鼎鼎的一個(gè)輔助性指標(biāo)糟红,還是先說(shuō)明艾帐,這個(gè)指標(biāo)我也不熟悉,你們也許該鄙視我了盆偿,不熟悉還寫什么的柒爸。我只能說(shuō)的是,我解讀的是代碼事扭,不是解讀指標(biāo)捎稚,百度里關(guān)于各指標(biāo),已經(jīng)都有明確的描述了句旱。解讀代碼的本意呢阳藻,是因?yàn)槲乙郧按蛩阕龀绦蚧臅r(shí)候,一直想找相關(guān)的解讀而沒(méi)有找到谈撒,編碼大神又覺(jué)得這些沒(méi)什么好寫的腥泥,那時(shí)我就苦惱著從頭一點(diǎn)點(diǎn)的啃c++語(yǔ)言,所以在這里也只是解讀一下啃匿,告訴大家怎么看一個(gè)代碼蛔外。當(dāng)然,聰明的朋友溯乒,看了這些夹厌,要能寫出自己的交易程序那就牛逼了。
好了裆悄,廢話也不說(shuō)了矛纹,直接說(shuō)代碼吧,威廉指標(biāo)TB系統(tǒng)里給它寫了三個(gè)函數(shù)光稼,如下或南。
第一個(gè)求最高函數(shù)Highest孩等,代碼如下:
Params
NumericSeries Price(0);//聲明序列參數(shù)Price,賦值0.//
Numeric Length(5); //聲明參數(shù)Length采够,賦值5肄方。//
Vars
Numeric HighestValue;//聲明變量HighestValue.//
Numeric i;//聲明變量 i。//
Begin
HighestValue = Price;//變量HighestValue的值等于價(jià)格蹬癌。//
for i=1 to Length - 1//循環(huán)語(yǔ)句权她,變量i的值從1循環(huán)到參數(shù)Length-1,循環(huán)執(zhí)行花括號(hào)里的語(yǔ)句程序逝薪。//
? ? {
If(Price[i] > HighestValue)//假如Price[ i ]大于變量HighestValue隅要,其實(shí)這當(dāng)前價(jià)格是一個(gè)中間值,作用是為了求前1翼闽,2拾徙,3,4數(shù)位的價(jià)格哪個(gè)最大感局。//
HighestValue = Price[i];//可以看到尼啡,假如Price[1]的值大于當(dāng)前價(jià),那么就把Price[1]的值賦予給HighestValue询微,再把Price[1]跟Price[2]對(duì)比崖瞭,循環(huán)到Price[4]為止。//
}
Return HighestValue;//根據(jù)對(duì)比的這5根k線的價(jià)格撑毛,把最大值返回給主函數(shù)书聚。//
End
第二個(gè)求最低函數(shù)Lowest,代碼如下:(這個(gè)解讀意思同上藻雌,就是把對(duì)比5根k線的最低價(jià))
Params
NumericSeries Price(0);
Numeric Length(5);
Vars
Numeric LowestValue;
Numeric i;
Begin
LowestValue = Price;
for i=1 to Length - 1
? ? {
If(Price[i] < LowestValue)
LowestValue = Price[i];
}
Return LowestValue;
End
第三個(gè)就是求威廉指標(biāo)函數(shù)PercentR雌续,算法很簡(jiǎn)單,就是N日內(nèi)最高價(jià)與當(dāng)日收盤價(jià)的差胯杭,除以N日內(nèi)最高價(jià)與最低價(jià)的差驯杜,結(jié)果放大100倍。代碼如下:
Params
Numeric Length(10);//聲明參數(shù)Length做个,賦值為10.記住了鸽心,這個(gè)初值10是可以變的。//
Vars
Numeric HH;//聲明變量名為HH居暖。//
Numeric Divisor;//聲明變量名為Divisor顽频。//
Numeric PRValue;//聲明變量名為PRValue。//
Begin
HH = Highest(High, Length);//變量HH值等于太闺,調(diào)用函數(shù)Highest糯景,求出10周期內(nèi)的最高價(jià)。//
Divisor = HH - Lowest(Low, Length);//變量Divisor值等于,10周期內(nèi)的最高價(jià)減去最低價(jià)莺奸。//
If (Divisor <> 0 )//假如變量Divisor不等于0.//
PRValue = 100 - ( ( HH - Close ) / Divisor ) * 100;//看著都明白丑孩,直白翻譯了,變量PRValue值 = 100? - ((10周期內(nèi)最高價(jià)-當(dāng)前收盤價(jià))/變量Divisor值)* 100//
else//假如變量Divisor等于0.//
PRValue = Divisor;//變量PRValue等于0了//
Return PRValue;//把變量PRValue的值返回給主函數(shù)灭贷,其實(shí)所謂主函數(shù)就是編寫的代碼里直接調(diào)用出來(lái)。//
End
TB系統(tǒng)里真正顯示在k線圖里的威廉函數(shù)代碼很簡(jiǎn)潔的略贮,如下:
Params
Numeric Length(5);//聲明參數(shù)Length甚疟,賦值5.//
Numeric OverSold(20) ;//聲明參數(shù)OverSold,賦值20.//
Numeric OverBought(80) ;聲明參數(shù)OverBought逃延,賦值80.//
Vars
Numeric WRValue;//聲明變量WRValue览妖。//
Begin
WRValue = PercentR(Length);//變量WRValue值,其實(shí)就是把參數(shù)5帶回函數(shù)PercentR里重新求一遍揽祥,再把得到的值返回來(lái)給WRValue讽膏。//
PlotNumeric("WR",WRValue);//畫線WR,替代WRValue拄丰。//
PlotNumeric("超買",OverBought);//畫線超買府树,就是初值80.//
PlotNumeric("超賣",OverSold);//畫線超賣,就是初值20.//
End
這代碼看明白了料按,怎么求值威廉指標(biāo)也清楚了奄侠,我們可以做個(gè)程序化交易代碼出來(lái)。買賣規(guī)則很簡(jiǎn)單载矿,也就是個(gè)跟RSI指標(biāo)共振罷了垄潮。即同步穿過(guò)50中間值,買入闷盔;同步跌破50中間值弯洗,賣出。固定止損30逢勾,止盈分50牡整,與80兩級(jí)。代碼及測(cè)試結(jié)果如下:
Params
Numeric Length1(10);
Numeric Length(14) ;
Numeric TrailingStart1(50); // 跟蹤止盈啟動(dòng)設(shè)置1//
Numeric TrailingStart2(80); // 跟蹤止盈啟動(dòng)設(shè)置2//
Numeric TrailingStop1(30); // 跟蹤止盈設(shè)置1//
Numeric TrailingStop2(20); // 跟蹤止盈設(shè)置2//
Numeric StopLossSet(30); //固定止損30個(gè)點(diǎn)//
Vars
Numeric HH;
Numeric Divisor;
NumericSeries PRValue;
NumericSeries NetChgAvg( 0 );
NumericSeries TotChgAvg( 0 );
Numeric SF( 0 );
Numeric Change( 0 );
Numeric ChgRatio( 0 ) ;
NumericSeries RSIValue;
NumericSeries HighestAfterEntry;
NumericSeries LowestAfterEntry;
Numeric MinPoint;
Numeric MyEntryPrice;
Numeric myprice;
Numeric myexitprice;
Begin
//計(jì)算WR指標(biāo)//
HH = Highest(High, Length1);
Divisor = HH - Lowest(Low, Length1);
If (Divisor <> 0 )
PRValue = 100 - ( ( HH - Close ) / Divisor ) * 100;
else
PRValue = Divisor;
//計(jì)算RSI指標(biāo)//
If(CurrentBar <= Length - 1)
{
NetChgAvg = ( Close - Close[Length] ) / Length ;
TotChgAvg = Average( Abs( Close - Close[1] ), Length ) ;
}Else
{
SF = 1/Length;
Change = Close - Close[1] ;
NetChgAvg = NetChgAvg[1] + SF * ( Change - NetChgAvg[1] ) ;
TotChgAvg = TotChgAvg[1] + SF * ( Abs( Change ) - TotChgAvg[1] ) ;
}
If( TotChgAvg <> 0 )
{
ChgRatio = NetChgAvg / TotChgAvg;
}else
{
ChgRatio = 0 ;
}
RSIValue = 50 * ( ChgRatio + 1 );
If(!CallAuctionFilter()) Return;// 集合競(jìng)價(jià)和小節(jié)休息過(guò)濾
If(MarketPosition <>1 && PRValue[1] >= 50 And RSIValue[1] >= 50)
{
Buy(1,Open);
}
If(MarketPosition <>-1 && PRValue[1] <= 50 And RSIValue[1] <= 50)
{
SellShort(1,Open);
}
If(BarsSinceentry == 0)
{
HighestAfterEntry = Close;
LowestAfterEntry = Close;
If(MarketPosition <> 0)
{
HighestAfterEntry = Max(HighestAfterEntry,AvgEntryPrice); // 開倉(cāng)的Bar敏沉,將開倉(cāng)價(jià)和當(dāng)時(shí)的收盤價(jià)的較大值保留到HighestAfterEntry//
LowestAfterEntry = Min(LowestAfterEntry,AvgEntryPrice); // 開倉(cāng)的Bar果正,將開倉(cāng)價(jià)和當(dāng)時(shí)的收盤價(jià)的較小值保留到LowestAfterEntry//
}
}else
{
HighestAfterEntry = Max(HighestAfterEntry,High); // 記錄下當(dāng)前Bar的最高點(diǎn),用于下一個(gè)Bar的跟蹤止損判斷//
LowestAfterEntry = Min(LowestAfterEntry,Low); // 記錄下當(dāng)前Bar的最低點(diǎn)盟迟,用于下一個(gè)Bar的跟蹤止損判斷//
}
Commentary("HighestAfterEntry="+Text(HighestAfterEntry));
Commentary("LowestAfterEntry="+Text(LowestAfterEntry));
Commentary("MyEntryPrice="+Text(MyEntryPrice));
MinPoint = MinMove*PriceScale;
MyEntryPrice = AvgEntryPrice;
If(MarketPosition==1) // 有多倉(cāng)的情況//
{
If(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart2*MinPoint) // 第二級(jí)跟蹤止損的條件表達(dá)式//
{
If(Low <= HighestAfterEntry[1] - TrailingStop2*MinPoint)
{
MyExitPrice = HighestAfterEntry[1] - TrailingStop2*MinPoint;
Sell(0,MyExitPrice);
}
}else if(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart1*MinPoint)// 第一級(jí)跟蹤止損的條件表達(dá)式//
{
If(Low <= HighestAfterEntry[1] - TrailingStop1*MinPoint)
{
MyExitPrice =? HighestAfterEntry[1] - TrailingStop1*MinPoint ;
Sell(0,MyExitPrice);
}
}else if(Low <= MyEntryPrice - StopLossSet*MinPoint)//可以在這里寫上初始的止損處理//
{
MyExitPrice =? MyEntryPrice - StopLossSet*MinPoint;
Sell(0,MyExitPrice);
}
}else if(MarketPosition==-1) // 有空倉(cāng)的情況//
{
If(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart2*MinPoint) // 第二級(jí)跟蹤止損的條件表達(dá)式//
{
If(High >= LowestAfterEntry[1] + TrailingStop2*MinPoint)
{
MyExitPrice =? LowestAfterEntry[1] + TrailingStop2*MinPoint;
BuyToCover(0,MyExitPrice);
}
}else if(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart1*MinPoint)// 第一級(jí)跟蹤止損的條件表達(dá)式//
{
If(High >= LowestAfterEntry[1] + TrailingStop1*MinPoint)
{
MyExitPrice =? LowestAfterEntry[1] + TrailingStop1*MinPoint;
BuyToCover(0,MyExitPrice);
}
}else If(High >= MyEntryPrice + StopLossSet*MinPoint)//可以在這里寫上初始的止損處理//
{
MyExitPrice = MyEntryPrice + StopLossSet*MinPoint;
BuyToCover(0,MyExitPrice);
}
}
End
看著結(jié)果還不錯(cuò)吧秋泳,但是它的交易頻率太高了點(diǎn),我也不知道具體實(shí)盤結(jié)果如何攒菠,這個(gè)程序化也是今天寫這篇文章迫皱,順帶就寫出來(lái),測(cè)試一下而已,有興趣的朋友可以自己觀察實(shí)盤看看的卓起。對(duì)了和敬,這個(gè)威廉除了可以跟RSI指標(biāo)一起用以外,還可以跟別的戏阅,比如移動(dòng)均線啊昼弟,或者布林帶啊等等。也是把代碼復(fù)制進(jìn)去奕筐,修改一下買賣的指令就可以了舱痘,結(jié)果如何,大家有興趣的可以試試的离赫。