
La stratégie utilise les courbes de Boolean pour réaliser des arrêts dynamiques. Faites le vide lorsque le prix franchit la courbe de Boolean, faites le plus lorsque vous franchissez la courbe de Boolean, et définissez des arrêts dynamiques pour suivre le fonctionnement du prix.
Le cœur de la stratégie est la trajectoire ascendante et descendante de la bande de Brin. La trajectoire moyenne de la bande de Brin est la moyenne mobile de n jours, et la trajectoire supérieure est la moyenne + k*N jours de décalage standard, la voie inférieure est la voie médiane-k*En même temps, la stratégie de mise en place d’un stop loss, de l’ajustement dynamique du stop loss au cours de l’exécution du prix, et de la mise en place d’un stop loss, permettent un contrôle prudent du risque.
Cette stratégie utilise la propriété de régression de la bande de Brin, associée à des arrêts de dérapage dynamiques, pour obtenir des bénéfices de tendance à la ligne moyenne longue, sous réserve de contrôler les risques. C’est une stratégie quantitative très adaptable et stable.
/*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)