Chiến lược này sử dụng các đường ray trên và dưới của Bollinger Bands để thực hiện stop loss động. Nó đi ngắn khi giá vượt qua đường ray trên và đi dài khi giá vượt qua đường ray dưới. Và nó đặt stop loss động để theo dõi chuyển động giá.
Cốt lõi của chiến lược này nằm trong các đường ray trên và dưới của Bollinger Bands. Đường ray giữa là đường trung bình động n ngày. Đường ray trên là đường ray giữa + klệch chuẩn n ngày. Đường sắt dưới là đường sắt giữa − kn ngày lệch chuẩn. Khi giá bật lên từ đường ray dưới, đi dài. Khi giá giảm từ đường ray trên, đi ngắn. Đồng thời, chiến lược đặt điểm dừng lỗ và điều chỉnh động trong quá trình chuyển động giá để đặt điểm lấy lợi nhuận để thực hiện kiểm soát rủi ro thận trọng.
Chiến lược này sử dụng các thuộc tính hồi quy Bollinger Bands
/*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)