您现在的位置是:首页 > MultiCharts程序化 > MultiCharts策略MultiCharts策略

[转载]包寧傑強盜Bollinger Bandit交易系統(Z)

龙听2021-06-07【MultiCharts策略】人已围观

简介今天要報告的是”Building Winning Trading Systems with TradeStation”這本書裡面的第二個交易系統。名字叫做包寧傑強盜Bollinger Bandit交易系統。





要先

今天要報告的是”Building Winning Trading Systems with TradeStation”這本書裡面的第二個交易系統。名字叫做包寧傑強盜Bollinger Bandit交易系統。





要先講一下Bollinger Band這個系統,Bollinger Band這個通道的名詞,最早是由John Bollinger在1960年代所提出的觀念。計算方式就是先取一條簡單移動平均線,然後在這條移動平均線上下個取一個標準差的距離,來分別當作上下通道。Bollinger認為在統計學的觀念來說,在移動平均線上下各取一個標準差的距離,等於總共是有兩個標準差的寬度的通道,應該會包含95%的價格波動。所以當價格位於到上通道的上面的時候,就很有可能會往下回歸均線。這時候就可以在價格往下穿透上通道的時候做空,也就是把上通道當作壓力區間來操作。(下通道則相反)





但是George Pruitt & John Hill做的很多測試發現。Bollinger Band的上通道通常並不是壓力線,而通常會是可以成功做多的突破線。也就是說我們應該在價格突破上通道的時候做多才對。





所以作者就將Bollinger Band的訊號反過來操作。同時也加入了一些其他的設計,其中一個設計就是由King Keltner trading system的系統改進而來的。因為在King Keltner trading system當中,出場的機制是當價位回到移動平均線的時候就出場。但是有時候移動平均線的追蹤速度太慢了,導致我們有時候真正出場的時候會回吐太多的獲利出去。這種情形常常會讓很多人吐血。所以他們設計的出場機制會隨著進場時間的增加,而更緊密的追蹤價位。作法就是隨著進場之後的時間增加,把出場的移動平均線的計算長度,逐漸的減少。所以剛進場的時候的停損金額是會比較寬的,但是進場時間越長,計算出場的移動平均線的時間長度會越短,也就代表這條出場移動平均線會越緊密的追蹤價位。所以當最後價格反轉不利於我們的時候,我們比較不會回吐太多的獲利出去。但是這個時間長度最少只有減到10而已,以防止移動秤均線太貼緊價位而很容易就打到停損出場。





最後作者加了一個簡單的濾網來決定多空的方向。就是如果今天的收盤價比30天前的收盤價高的話就只做多,如果今天收盤價比30天之前的收盤價低的話就只做空。





下面就是書上的程式碼:

{Bollinger Bandit by George Pruitt—program uses Bollinger Bands and Rate of

change to determine entry points. A trailing stop that is proportional with

the amount of time a trade is on is used as the exit technique.}





Inputs: bollingerLengths(50),liqLength(50),rocCalcLength(30);





Vars: upBand(0),dnBand(0),liqDays(50),rocCalc(0);





upBand = BollingerBand(Close,bollingerLengths,1.25);

dnBand = BollingerBand(Close,bollingerLengths,-1.25);

rocCalc = Close - Close[rocCalcLength-1]; {remember to subtract 1}





if(MarketPosition <> 1 and rocCalc > 0) then Buy("BanditBuy")tomorrow upBand stop;

if(MarketPosition <>-1 and rocCalc < 0) then SellShort("BanditSell") tomorrow dnBand stop;

if(MarketPosition = 0) then liqDays = liqLength;





if(MarketPosition <> 0) then begin

liqDays = liqDays - 1;

liqDays = MaxList(liqDays,10);

end;


if(MarketPosition = 1 and Average(Close,liqDays) < upBand) then Sell("Long Liq") tomorrow Average(Close,liqDays) stop;

if(MarketPosition = -1 and Average(Close,liqDays) > dnBand) then BuyToCover("Short Liq") tomorrow Average(Close,liqDays) stop;
而作者測試1982-2002年這20年的歷史資料,所得出的來結果是這樣的。



BB Performance.JPG
BB Performance.JPG (86.56 KiB) 被瀏覽 580 次






Bollinger Bandit系統像King Keltner系統一樣,同樣的也是把上下通道的寬度固定住了,這裡是固定在標準差的1.25倍。所以我同樣做了個小小的修改,讓我們可以試試看不同的通道寬度,對於績效的影響如何。修改後的程式碼如下:







{Bollinger Bandit by George Pruitt—program uses Bollinger Bands and Rate of

change to determine entry points. A trailing stop that is proportional with

the amount of time a trade is on is used as the exit technique.}





Inputs: bollingerLengths(50),liqLength(50),rocCalcLength(30),StdDevRatio(1);





Vars: upBand(0),dnBand(0),liqDays(50),rocCalc(0);





upBand = BollingerBand(Close,bollingerLengths,StdDevRatio);

dnBand = BollingerBand(Close,bollingerLengths,-StdDevRatio);

rocCalc = Close - Close[rocCalcLength-1]; {remember to subtract 1}





if(MarketPosition <> 1 and rocCalc > 0) then Buy("BanditBuy")tomorrow upBand stop;

if(MarketPosition <>-1 and rocCalc < 0) then SellShort("BanditSell") tomorrow dnBand stop;

if(MarketPosition = 0) then liqDays = liqLength;





if(MarketPosition <> 0) then begin

liqDays = liqDays - 1;

liqDays = MaxList(liqDays,10);

end;





if(MarketPosition = 1 and Average(Close,liqDays) < upBand) then Sell("Long Liq") tomorrow Average(Close,liqDays) stop;

if(MarketPosition = -1 and Average(Close,liqDays) > dnBand) then BuyToCover("Short Liq") tomorrow Average(Close,liqDays) stop;







如果有朋友有研究過上一個介紹的King Keltner系統的話,應該會發現Bollinger Bandit跟King Keltner的績效差不多。這是因為這兩個系統的原理基本上就是很類似的,都是屬於上下通道突破的系統,只是出場跟濾網的設計不一樣而已。所以如果有朋友想要做multi-system的portfolio的話,要注意這兩個交易系統的相關性會是比較高的。而我們設計portfolio的原則,就是應該要採用相關性較低的系統才好。
http://www.programtrading.tw/viewtopic.php?f=24&t=393&p=1373&hilit=Bollinger+Bandit#p1373

 

 

 

、、、、、、

標準差用來表示數列中數據平均偏離中間區域(線)的程度。布林線利用這種統計規律來確定價格走勢的支撐和阻力。該指標于上世紀60年代由John Bollinger提出,並以他的名字命名(關於布林線的歷史請看“約翰·布林格”)。布林線由3條線組成:中間是一定時間段的簡單移動平均線;上下兩條線是加上(減去)標準差而得。從理論上說,95%的價格將落在這兩條線之間。最初,布林線用來確定市場波動的邊界。如果市場價格走到了上軌(下軌),那麼折回中線的概率很大。我們也確實在市場上看到無數次這樣的波動。

必勝外匯原創翻譯
隨著時間的推移,我們和其他人都發現其實布林線作為突破指標效果更好。比如,50週期的布林線上軌是不錯的多頭進場點位,下軌是空頭進場點位。這個系統和keltner系統很像,一個系統賺錢的時候另外一個也表現不俗。當然也僅僅在於進場這一點。與keltner回落到均線離場不同,我們改進了離場策略。通過觀察keltner的做單,我們發現為了等待均線離場,往往要放棄贏利的很大一部分。因此我們採用了更積極的退出策略。進場以後,止損設在50日均線。在持倉的日子,每過一天,我們把均線的參數減一併修改止損。比如,持倉10天后止損點改為40日均線值。持倉的時間愈長(當然行情越大!),我們越容易出場,也會獲取更大部分的贏利。這種修改止損的動作一直持續到週期為10,以後我們不再改變。另外還有一點:離場的均線要在布林線的上下軌範圍之內。這是為了避免再度進入我們剛剛推出的交易。

前面我們說過布林線的上下軌是可能的進場點。真正進入交易還有最後一個條件:對於多頭,昨日收盤必須大於30日前的收盤價;空頭則相反。這是為了確認趨勢,我們只能在漲勢做多,而跌勢做空。

Bollinger Bandit Pseudocode

LiqDay is initially set to 50
upBand = Average(Close,50) + StdDev(Close,50) *1.25
dnBand = Average(Close,50) - StdDev(Close,50) *1.25
rocCalc = Close of today - Close of thirty days ago
Set liqLength to 50
If rocCalc is positive, a long position will be initiated when
today's market action >= upBand
If rocCalc is negative, a short position will be initiated when
today's market action <= dnBand
liqPoint = Average(Close, 50)
today's market action <= liqPoint
if today's market action >= liqPoint
If we are not stopped out today, then liqLength = liqLength - 1
If we are stopped out today, then reset liqLength to fifty

http://big5.cnfol.com/big5/blog.cnfol.com/autofx/article/1342638.html

http://big5.cnfol.com/big5/blog.cnfol.com/autofx

 

      我在看build wining trade system with tradestation的时候看见两个 国外的交易系统,老师能否编为TDX版的?不胜感激
king keltner } 凯尔特勒
input: avglength(40), atrlength(40);
var: upband(0),dnband(0),liquidpoint(0),ma(0);
ma=average((high+low+close)/3,avglength);
upband=ma + avgtruerange(atrlength);
dnband=ma - avgtruerange(atrlength);
if ma>ma[1] then
buy tomorrow at upband stop;
if ma<ma[1] then
sell tomorrow at dnband stop;
liquidpoint=ma;
if marketposition=1 then
exitlong tomorrow at liquidpoint stop;
if marketposition=-1 then
exitshort tomorrow at liquidpoint stop;

BOLL系统
input: bollingerlengths(50),liqlength(50),roccalclength(30);
var: upband(0),dnband(0),liqdays(50),roccalc(0);
upband = bollingerband(close,bollingerlengths, 1.25);
dnband = bollingerband(close,bollingerlengths, -1.25);
rocCalc = Close - Close[rocCalcLength-1];
if MarketPosition <> 1 and rocCalc > 0 then Buy("BanditBuy") tomorrow upBand stop;
if MarketPosition <>-1 and rocCalc < 0 then sell("BanditSell") tomorrow dnBand stop;
if(MarketPosition = 0) then liqDays = liqLength;
if(MarketPosition <> 0) then begin
liqDays = liqDays - 1;
liqDays = MaxList(liqDays,10);
end;
if(MarketPosition = 1 and Average(Close,liqDays) < upBand) then
exitlong("Long Liq") tomorrow Average(Close,liqDays) stop;
if(MarketPosition = -1 and Average(Close,liqDays) > dnBand) then
exitshort("Short Liq") tomorrow Average(Close,liqDays) stop

http://bbs.macd.cn/viewthread.php?tid=1465722

 

>>>>>>>>>>>>>>>>>>>>>>>

用一小时布林通道写个交易模型  发贴心情 Post By:2006-11-6 14:38:00
  

老师,您好,想请您帮忙用一小时布林通道写个交易模型,用它来提示强筋麦的开平仓。

条件是:1,以中轨为开仓点,以上轨或下轨为平仓点。

2,针对中轨开仓点,当一小时K线首次触及或穿越中轨时(指收盘价 )不发出提示,往后五小时内任一小时创出自首次穿越以来的新高或新低时(指收盘价)发出开仓提示。

3,针对上下轨平仓点时,当一小时K线首次触及或穿越上轨时(指收盘价)不发出提示,往后任一小时出现收盘价高于或低于前一小时收盘价时发出平仓提示。

 

MID:=MA(CLOSE,N); TMP2:=STD(CLOSE,M); TOP:=MID+P*TMP2; BOTTOM:=MID-P*TMP2; CROSS(CLOSE,REF(HHV(CLOSE,4),1))&&EXIST(CROSS(CLOSE,MID),5),BK; CROSS(CLOSE,REF(CLOSE,1))&&CLOSE>TOP,SP; CROSS(REF(LLV(CLOSE,4),1),CLOSE)&&EXIST(CROSS(MID,CLOSE),5),SK; CROSS(REF(CLOSE,1),CLOSE)&&BOTTOM>CLOSE,BP;

 

 

底部做多,顶部做空:

可以编写如下:

MID:=MA(CLOSE,N); TMP2:=STD(CLOSE,M); TOP:=MID+P*TMP2; BOTTOM:=MID-P*TMP2;

CROSS(REF(CLOSE,1),REF(BOTTOM,1)),BPK;

CROSS(REF(TOP,1),REF(CLOSE,1)),SPK;

 

》》》》》》》》》》》》》》》》》

可不可以设置一下破布林通道下轨发出买入的信号,破上轨就发出卖出信号,破中轨加仓的信号.

目前不能实现加仓,所以将破中轨也写为开仓指令:

MID:=MA(CLOSE,26);

TMP2:=STD(CLOSE,26);

TOP:=MID+2*TMP2;

BOTTOM:=MID-2*TMP2;

CROSS(CLOSE,BOTTOM)||CROSS(CLOSE,BOTTOM)&&CROSS(CLOSE,MID),BPK;

CROSS(TOP,CLOSE)||CROSS(TOP,CLOSE)&&CROSS(MID,CLOSE),SPK;

》》》》》》》》》》》》》》》》

 

请老师给编个BOLL线、KDJ指标的交易模型  发贴心情 Post By:2006-12-5 18:10:00
  关键字: 编写 范例 模型 
条件如下:1:K线上穿BOLL线上轨且KDJ的J值大于等于100时发出开空信号.2:K线下破BOLL线下轨且KDJ的J值小于等于0时发出开多信号.谢谢老师

 

MID:=MA(CLOSE,26); TMP2:=STD(CLOSE,26); TOP:=MID+2*TMP2; BOTTOM:=MID-2*TMP2; RSV:=(CLOSE-LLV(LOW,9))/(HHV(HIGH,9)-LLV(LOW,9))*100; K:=SMA(RSV,3,1); D:=SMA(K,3,1); J:=3*K-2*D; CROSS(HIGH,TOP)&&J>=100,SPK; CROSS(BOTTOM,LOW)&&J<=0,BPK;

》》》》》》》》》》》》》》》》》

我的思路是:1,价格在MID以上并且MID的箭头为红色(表示趋势的改变)同时K线必须是阳线,开多单。BK

             

    2,价格在MID以下,但是MID的箭头为红色,同时K线为阴线的时候,平仓多单。BP

 

3,价格在MID以下并且MID的箭头为绿色(表示趋势开始改变)同时k线必须是阴线,开空单,SK

 

4,价格在MID以上,但是MID的箭头为绿色,同时K线为阳线的时候,平仓空单,SP.

 

 

 

就是K线图的上面,显示的MID比前一天是涨,就是一个箭头是红色向上,如果是跌,就是绿色向下
 

 

 

MID:=MA(CLOSE,N);
TMP2:=STD(CLOSE,M);
TOP:=MID+P*TMP2;
BOTTOM:=MID-P*TMP2;

MID>REF(MID,1)&&CLOSE>MID&&CLOSE>OPEN,BK;

MID>REF(MID,1)&&CLOSE<MID&&CLOSE<OPEN,SP;

MID<REF(MID,1)&&CLOSE<MID&&CLOSE<OPEN,SK;

MID<REF(MID,1)&&CLOSE>MID&&CLOSE>OPEN,BP;

 

》》》》》》》》》》》》》》》》》》》》》》

上面的模型,我还有一个要求,麻烦远方帮忙:1,平仓信号,如果有符合条件的平仓信号出现,在9.50--9.55和14.55--14.59分钟必须出现平仓信号,并且只能交易一次,信号在这个时间段频繁出现,也只能是交易一次---就是平仓。 2,开仓信号只能够在14.55--14.59分钟出现,如果信号反复出现,也只能交易一次,就是开仓。

 

要求该模型可以在文华的软件里面优化或者可以测试效果。谢谢

MID:=MA(CLOSE,N);
TMP2:=STD(CLOSE,M);
TOP:=MID+P*TMP2;
BOTTOM:=MID-P*TMP2;

 

CBK:=MID>REF(MID,1)&&CLOSE>MID&&CLOSE>OPEN;
CSP:=MID>REF(MID,1)&&CLOSE<MID&&CLOSE<OPEN;
CSK:=MID<REF(MID,1)&&CLOSE<MID&&CLOSE<OPEN;
CBP:=MID<REF(MID,1)&&CLOSE>MID&&CLOSE>OPEN;


CBK&&REF(CBK,1)=0&&TIME>1455&&TIME<1459,BK;
(CSP&&REF(CSP,1)=0&&TIME>950&&TIME<955)||(CSP&&REF(CSP,1)=0&&TIME>1455&&TIME<1459),SP;
CSK&&REF(CSK,1)=0&&TIME>1455&&TIME<1459,SK;
(CBP&&REF(CBP,1)=0&&TIME>950&&TIME<955)||(CBP&&REF(CBP,1)=0&&TIME>1455&&TIME<1459),BP;

Tags:期货经典策略   经典策略   交易策略

很赞哦! ()

联系我们

本站推荐

MultiCharts微信群