ダブル・ボリンジャー・バンド・ブレークアウト戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-03 12:06:31
タグ:

img

概要

ダブル・ボリンジャー・バンド・ブレークアウト戦略 (Double Bollinger Band Breakout Strategy) は,ボリンジャー・バンド・インディケーターを利用した短期間の取引戦略である.バンドが破裂またはダウンしたときの取引機会を特定するために,異なるパラメータ設定,高速および遅い2つのボリンジャー・バンドを使用する.

戦略の論理

この戦略は,長さ20と標準偏差1の速いボリンジャーバンド,長さ50と標準偏差1の遅いボリンジャーバンドを使用する. 快速ボリンジャーの上部バンドをクローズ価格が破ると,閉じる価格を使用してロングポジションを入力する. 快速ボリンジャーの下部バンドをクローズ価格が破ると,ショートポジションを入力する.

ポジションに入ると,戦略はスローボリンジャー波長の上または下帯を破ることでさらなる確認を待つ.さらに,RSIインジケーターはトレンド方向を決定するために使用される.上帯ブレイクアウトからの購入信号は,RSIが50を超える場合にのみ考慮される.下帯ブレイクアウトからの販売信号は,RSIが50未満である場合にのみ考慮される.

ポジションが確立された後,価格が急ボリンジャー帯上下に戻ると閉まります.

利点分析

ダブルボリンジャーバンドブレイクアウト戦略の主な利点は,小さな動きを捉える能力にある.速いボリンジャーバンドを使用して小さなブレイクアウトを捉え,遅いボリンジャーバンドを使用して偽信号をフィルタリングすることで,低レンジ波動から利益を得ることができます.RSIの追加は,レンジング市場中に主要なトレンド逆転を見逃すのを避けるのに役立ちます.

さらに,ボリンジャー・バンドは,市場における高波動性段階を検出するのに優れています.これは短期的な取引戦略に有利です.

リスク分析

主なリスクは,ダブルボリンジャーセットアップによって生成される過剰な取引信号から生じる.これは市場のノイズを効果的にフィルタリングできない可能性があります.これは誤った取引から累積した損失につながる可能性があります.また,波動性が低いとき,帯の幅が狭くなって取引機会が減少します.

リスクを軽減するために,ボリンジャー帯のパラメータは,より長いスロー帯またはシグナルの手動確認を使用して調整できます.MACDとKDJなどの他の指標を組み合わせることで安定性が向上します.

オプティマイゼーションの方向性

主な最適化領域は,ボリンジャーバンドとRSIのパラメータを調整することにある.例えば,最適な組み合わせを見つけるために,高速および遅いバンドのための異なる期間をテストする.または,戦略のパフォーマンスを改善できるかを見るために,異なるRSI期間を試してみる.

また,ストップ損失ロジックを追加または修正する方向性もある.現在,最大引き下げリスクを増加させるストップ損失メカニズムはない.固定パーセントまたはトレーリングストップ損失を追加することでリスク報酬メトリックが大幅に改善される可能性がある.

結論

ダブルボリンガーバンドブレイクアウト戦略は,市場の変動に敏感な短期的なモメンタム・トレーディング戦略である.ダブルボリンガーセットアップによって明確な信号が与えられると,不安定な市場内の小さな価格動きを捕捉する.しかし,信頼性のさらなる証明が必要です.パラメータチューニングとストップロスのロジックを追加することにより,安定性をさらに向上させる可能性が高い.


/*backtest
start: 2022-12-27 00:00:00
end: 2024-01-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/

// From "Bitcoin Trading Strategies: Algorithmic Trading Strategies For Bitcoin And Cryptocurrency That Work" by David Hanson.

// "Double Bolinger Band Scalping System 
// Recommended Timeframe: 1 minute or 5 minute 

// Required Indicators: 
// - RSI with a length of 14 (default settings) 
// - Bolinger band #1 settings: Length = 50, stDev = 1 Hide the basis/middle line (basis line not needed for this strategy) 
// Note: This is the slower bolinger band in the directions 
// - Bolinger band #2 settings: Length 20, stDev = 1 Hide the basis/middle line (basis line not needed for this strategy) 
// Note: This is the faster bolinger band in the directions 

// Enter Long/Buy Trade When: 
// - RSI is above the level 50 
// - A candle closes above the top of the faster bolinger band 
// Enter a long when a candle then closes above the top of the slower bolinger band, and price is above the top of both bands 
// Place a stop loss under the low of the entry candle Example of a long trade using this strategy 
// Exit Long Trade When: A candle closes below the top band of the fast bolinger band 

// Enter Short/Sell Trade When: 
// - RSI is below the level 50 
// - A candle closes below the bottom of the faster bolinger band 
// Enter a short when a candle then closes below the bottom of the slower bolinger band, and price is below both bands 
// Place a stop loss above the high of the entry candle Example of a short trade using this strategy 
// Exit Short Trade When: Price closes inside the bottom of the faster bolinger band"

// © tweakerID

//@version=4
strategy("Double Bollinger Strategy", 
     overlay=true, 
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, 
     initial_capital=10000, 
     commission_value=0.04, 
     calc_on_every_tick=false, 
     slippage=0)

direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))

/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")  

i_RSI=input(14, title="RSI Length")
lengthS = input(45, minval=1, title="Slow BB Band Length")
lengthF = input(31, minval=1, title="Fast BB Band Length")

/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")  

// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="Strategy Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=1, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(5, step=.1, title="ATR Multiple")
i_TPRRR = input(2, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")

// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1] 
 or strategy.position_size < strategy.position_size[1]

// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na 
entry_HH_price = strategy.position_size < 0 ? HH_price : na 
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR

// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na 
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na 
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR


// Strategy Stop
float LongStop = valuewhen(bought,low[1],0)*(1-i_PercIncrement)
float ShortStop = valuewhen(bought,high[1],0)*(1+i_PercIncrement)
float StratTP = na
float StratSTP = na

/////////////////////// STRATEGY LOGIC /////////////////////////////////////////

//RSI
RSI=rsi(close, i_RSI)

//BOLL1
[middleS, upperS, lowerS] = bb(close, lengthS, 1)
p1 = plot(upperS, "Slow BB Upper Band", color=color.teal)
p2 = plot(lowerS, "Slow BB Lower Band", color=color.teal)
fill(p1, p2, title = "Slow BB Background", color=color.blue, transp=95)

//BOLL2
[middleF, upperF, lowerF] = bb(close, lengthF, 1)
p1F = plot(upperF, "Fast BB Upper Band", color=color.gray)
p2F = plot(lowerF, "Fast BB Lower Band", color=color.gray)
fill(p1F, p2F, title = "Fast BB Background", color=color.white, transp=95)


BUY = bar_index > 40 and (RSI > 50) and (close > upperF) and crossover(close, upperS)
SELL = bar_index > 40 and (RSI < 50) and (close < lowerF) and crossunder(close, lowerS) 

longexit=close < upperF
shortexit=close > lowerF

//Trading Inputs
i_strategyClose=input(true, title="Use Strategy Close Logic")
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")

// Entries
if reverse
    if not DPR
        strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
    else     
        strategy.entry("long", strategy.long, when=SELL)
        strategy.entry("short", strategy.short, when=BUY)
else
    if not DPR 
        strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
        strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
    else
        strategy.entry("long", strategy.long, when=BUY)
        strategy.entry("short", strategy.short, when=SELL)

if i_strategyClose
    strategy.close("long", when=longexit)
    strategy.close("short", when=shortexit)
    


SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP

//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
 -strategy.position_avg_price
trailOffset     = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
    tstop := high- trailOffset - dif
    if tstop<tstop[1]
        tstop:=tstop[1]
else
    tstop := na
StrailOffset     = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 
 and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
    Ststop := low+ StrailOffset + Sdif
    if Ststop>Ststop[1]
        Ststop:=Ststop[1]
else
    Ststop := na

strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)

/////////////////////// PLOTS //////////////////////////////////////////////////


plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, 
 color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, 
 color=color.red, title="Bearish Setup", size=size.auto)


もっと