
이중 파동 밴드 절단 전략은 파동 밴드 지표를 이용한 단선 거래 전략이다. 그것은 동시에 빠르고 느린 두 가지의 다른 파라미터 설치를 가진 파동 밴드를 사용하여 파동 밴드가 위 또는 아래로 돌파 할 때 거래 기회를 찾는다.
이 전략은 길이가 각각 20과 50이고, 표준 차이는 1인 빠른 및 느린 변동대를 동시에 사용한다. 종결 가격이 빠른 변동대를 돌파했을 때, 이 종결 가격으로 다단위 입장에 들어간다. 종결 가격이 빠른 변동대를 돌파했을 때, 이 종결 가격으로 공백 입장에 들어간다.
일단 포지션에 들어가면, 전략은 가격이 계속 느린 변동의 반도를 뚫고 상행 또는 하행하는 신호를 추가 확인 신호로 기다립니다. 또한, 전략은 RSI 지표와 결합하여 트렌드 방향을 판단합니다. 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)