
Strategi ini menggunakan tren naik dan turun Brin Belt untuk mencapai hentian dinamik. Buat kosong apabila harga menembusi tren Brin Belt, buat lebih banyak apabila ia menembusi tren bawah, dan tetapkan hentian dinamik untuk mengesan pergerakan harga.
Strategi ini berpusat pada lintasan atas dan bawah dalam Brin Belt. Brin Belt adalah n hari rata-rata bergerak dan lintasan atas adalah lintasan tengah + k*Kelemahan standard n hari, landasan bawah adalah landasan tengah-k*Kelemahan standard n hari. Apabila harga bangkit ke atas dari tren bawah, lakukan lebih banyak; Apabila harga kembali ke bawah dari tren atas, buat kosong. Pada masa yang sama, strategi menetapkan titik hentian, secara dinamik menyesuaikan titik hentian semasa harga berjalan, dan menetapkan titik berhenti, untuk mengawal risiko yang berhati-hati.
Strategi ini menggunakan sifat regresi Brin Belt, dengan stop loss slip dinamik, untuk mendapatkan keuntungan trend garis tengah dengan risiko yang terkawal, merupakan strategi kuantitatif yang kuat dan stabil. Dengan pengoptimuman parameter dan pengoptimuman peraturan, lebih banyak jenis dapat disesuaikan, untuk mendapatkan keuntungan yang stabil di pasaran.
/*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)