이중 볼링거 밴드 브레이크업 전략

저자:차오장, 날짜: 2024-01-03 12:06:31
태그:

img

전반적인 설명

이중 볼링거 밴드 브레이크아웃 전략 (Double Bollinger Band Breakout Strategy) 은 볼링거 밴드 지표를 활용한 단기 거래 전략이다. 이는 밴드가 깨지거나 떨어질 때 거래 기회를 식별하기 위해 빠르고 느린 다른 매개 변수 설정을 가진 두 개의 볼링거 밴드를 사용합니다.

전략 논리

이 전략은 길이가 20이고 표준편차가 1인 빠른 볼링거 밴드와 길이가 50이고 표준편차가 1인 느린 볼링거 밴드를 사용합니다. 닫는 가격이 빠른 볼링거의 상단단위 위에 넘어가면 닫는 가격을 사용하여 긴 포지션을 입력합니다. 닫는 가격이 빠른 볼링거의 하단단단위 아래에 넘어가면 짧은 포지션을 입력합니다.

포지션에 위치하면, 전략은 느린 볼링거의 상단 또는 하단 밴드를 깨는 가격으로 추가 확인을 기다리고 있습니다. 또한 RSI 지표는 트렌드 방향을 결정하는 데 사용됩니다. 상단 브레이크오웃에서 구매 신호는 RSI가 50보다 높을 때만 고려됩니다. 하단 밴드 브레이크오웃에서 판매 신호는 RSI가 50 이하일 때만 고려됩니다.

포지션이 설정되면 가격이 빠른 볼링거 밴드 위로 또는 아래로 넘어갈 때 닫을 것입니다.

이점 분석

이중 볼링거 밴드 브레이크아웃 전략의 주요 장점은 작은 움직임을 포착하는 능력에 있다. 빠른 볼링거 밴드를 사용하여 작은 브레이크아웃을 포착하고 느린 볼링거 밴드를 사용하여 잘못된 신호를 필터함으로써 낮은 범위의 변동으로부터 이익을 얻을 수 있다. RSI를 추가하는 것은 또한 범위 시장에서 주요 트렌드 반전을 놓치지 않도록 돕는다.

또한, 동력 지표로서 볼링거 밴드는 시장에서 높은 변동성을 감지하는 데 탁월합니다. 이는 단기 거래 전략에 도움이 됩니다.

위험 분석

주요 위험은 이중 볼링거 설정에 의해 생성되는 과도한 거래 신호에서 비롯되며, 이는 시장 소음을 효과적으로 필터링하지 못할 수 있습니다. 이것은 잘못된 거래로 인한 누적 손실로 이어질 수 있습니다. 또한 변동성이 낮을 때 대역의 폭이 좁아지고 거래 기회가 감소합니다.

위험을 완화하기 위해 볼링거 밴드의 매개 변수는 더 긴 느린 밴드 또는 신호의 수동 확인을 사용하여 조정 할 수 있습니다. MACD 및 KDJ와 같은 다른 지표를 결합하면 안정성을 향상시킬 수 있습니다.

최적화 방향

주요 최적화 공간은 볼링거 밴드 및 RSI의 매개 변수를 조정하는 데 있습니다. 예를 들어, 최적의 조합을 찾기 위해 빠르고 느린 밴드의 다른 기간을 테스트하십시오. 또는 전략 성능을 향상시킬 수 있는지 확인하기 위해 다른 RSI 기간을 시도하십시오.

또 다른 방향은 스톱 로스 논리를 추가하거나 수정하는 것입니다. 현재 최대 인출 위험을 증가시키는 스톱 로스 메커니즘이 없습니다. 고정 비율 또는 후속 스톱 로스를 추가하면 위험 보상 메트릭을 크게 향상시킬 수 있습니다.

결론

이중 볼링거 밴드 브레이크아웃 전략 (Double Bollinger Band Breakout Strategy) 은 시장 변동성에 민감한 단기 추진력 거래 전략이다. 이중 볼링거 설정에 의해 명확한 신호가 주어질 때 변동성 시장 내의 작은 가격 움직임을 포착한다. 그러나 신뢰성의 추가 증거가 필요합니다. 매개 변수 조정 및 스톱 로스 논리를 추가함으로써 안정성을 더욱 향상시킬 수있는 좋은 잠재력이 있습니다.


/*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)


더 많은