이 전략은 볼링거 밴드의 상부 및 하부 레일을 사용하여 동적 스톱 손실을 구현합니다. 가격이 상부 레일을 통과 할 때 짧고 가격이 하부 레일을 통과 할 때 길게됩니다. 그리고 가격 움직임을 추적하기 위해 동적 스톱 손실을 설정합니다.
이 전략의 핵심은 볼링거 밴드의 상부 및 하부 레일에 있습니다. 중부 레일은 n 일 이동 평균입니다. 상부 레일은 중부 레일 + k입니다.n일 표준편차. 하부 레일은 중간 레일 − kn일 표준편차. 가격이 하부 레일에서 반등되면, 긴 이동. 가격이 상부 레일에서 다시 떨어지면, 짧은 이동. 동시에, 전략은 신중한 위험 통제를 구현하기 위해 수익점을 설정하기 위해 가격 움직임 중에 스톱 로스 포인트를 설정하고 동적으로 조정합니다.
이 전략은 위험을 제어하면서 중장기 트렌드 수익을 얻기 위해 동적인 슬라이딩 스톱 로스와 함께 볼링거 밴드 회귀 특성을 활용합니다. 그것은 매우 적응 가능하고 안정적인 양적 전략입니다. 매개 변수 최적화 및 논리 최적화를 통해 더 많은 제품에 적응하여 실시간 거래에서 안정적인 수익을 얻을 수 있습니다.
/*backtest start: 2024-01-24 00:00:00 end: 2024-01-31 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(shorttitle="BB Strategy", title="Bollinger Bands Strategy", overlay=true) length = input.int(20, minval=1, group = "Bollinger Bands") maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group = "Bollinger Bands") src = input(close, title="Source", group = "Bollinger Bands") mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev", group = "Bollinger Bands") ma(source, length, _type) => switch _type "SMA" => ta.sma(source, length) "EMA" => ta.ema(source, length) "SMMA (RMA)" => ta.rma(source, length) "WMA" => ta.wma(source, length) "VWMA" => ta.vwma(source, length) basis = ma(src, length, maType) dev = mult * ta.stdev(src, length) upper = basis + dev lower = basis - dev offset = input.int(0, "Offset", minval = -500, maxval = 500, group = "Bollinger Bands") plot(basis, "Basis", color=#FF6D00, offset = offset) p1 = plot(upper, "Upper", color=#2962FF, offset = offset) p2 = plot(lower, "Lower", color=#2962FF, offset = offset) fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95)) lo = input.bool(true, "Long", group = "Strategy") sh = input.bool(true, "Short", group = "Strategy") x = input.float(3.0, "Target Multiplier (X)", group = "Strategy", minval = 1.0, step = 0.1) token = input.string(defval = "", title = "Token", group = "AUTOMATION") Buy_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1) + '"}' Buy_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2) + '"}' Exit_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-1) + '"}' Exit_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(-2) + '"}' Exit_PE_CE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(2.5) + '"}' Exit_CE_PE = '{"auth-token":"' + token + '","key":"Value1","value":"' + str.tostring(1.5) + '"}' long = high < lower short = low > upper var sl_b = 0.0 var tar_b = 0.0 var sl_s = 0.0 var tar_s = 0.0 var static_sl = 0.0 entry = strategy.opentrades.entry_price(strategy.opentrades - 1) if long and lo and strategy.position_size == 0 strategy.entry("Long", strategy.long, alert_message = Buy_CE, stop = high) strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE) sl_b := low tar_b := high + (math.abs(high - low) * x) static_sl := math.abs(low - high) if short and sh and strategy.position_size == 0 strategy.entry("Short", strategy.short, alert_message = Buy_PE, stop = low) strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE) sl_s := high tar_s := low - (math.abs(high - low) * x) static_sl := math.abs(high - low) // if long and strategy.position_size < 0 // strategy.entry("Long", strategy.long, alert_message = Exit_PE_CE, stop = high) // strategy.exit("LX", "Long", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = low, alert_message = Exit_CE) // sl_b := low // tar_b := high + (math.abs(high - low) * x) // if short and strategy.position_size > 0 // strategy.entry("Short", strategy.short, alert_message = Exit_CE_PE, stop = low) // strategy.exit("SX", "Short", profit = (math.abs(high - low) * x)/syminfo.mintick, stop = high, alert_message = Exit_PE) // sl_s := math.max(high[1], high) // tar_s := low - (math.abs(high - low) * x) if ta.change(dayofmonth) or (long[1] and not long[2]) strategy.cancel("Long") if ta.change(dayofmonth) or (short[1] and not short[2]) strategy.cancel("Short") var count = 1 if strategy.position_size != 0 if strategy.position_size > 0 if close > (entry + (static_sl * count)) strategy.exit("LX", "Long", limit = tar_b, stop = sl_b, alert_message = Exit_CE) sl_b := entry + (static_sl * (count - 1)) count += 1 else if close < (entry - (static_sl * count)) strategy.exit("SX", "Short", limit = tar_s, stop = sl_s, alert_message = Exit_PE) sl_s := entry - (static_sl * (count - 1)) count += 1 // label.new(bar_index, high, str.tostring(static_sl)) if strategy.position_size == 0 count := 1 plot(strategy.position_size > 0 ? sl_b : na, "", color.red, style = plot.style_linebr) plot(strategy.position_size < 0 ? sl_s : na, "", color.red, style = plot.style_linebr) plot(strategy.position_size > 0 ? tar_b : na, "", color.green, style = plot.style_linebr) plot(strategy.position_size < 0 ? tar_s : na, "", color.green, style = plot.style_linebr)