
La stratégie est un système de trading dynamique basé sur l’analyse de plusieurs périodes de temps, combinant l’indice des moyennes mobiles (EMA), l’indice des quantités dynamiques (SQM) et l’indice des flux de fonds (CMF) pour générer des signaux de trading. Le cœur de la stratégie est de confirmer les tendances par l’analyse de plusieurs périodes de temps et d’utiliser des arrêts dynamiques pour optimiser la gestion des risques.
La stratégie utilise trois combinaisons d’indicateurs techniques principaux pour identifier les opportunités de trading. Tout d’abord, l’orientation de la tendance du marché est déterminée par les EMA du cycle 11 et du cycle 34. Ensuite, l’indicateur Squeeze Momentum, une version améliorée, est utilisé pour détecter les pressions du marché et les opportunités de rupture potentielles. L’indicateur calcule l’écart de prix par une méthode de régression linéaire.
La stratégie offre aux traders un programme de négociation systématisé grâce à une analyse technique multidimensionnelle et à une gestion intelligente des risques. Son avantage central réside dans la combinaison de suivi des tendances et de gestion dynamique des risques, capable de saisir les opportunités de marché tout en protégeant les bénéfices. Bien que la stratégie présente des aspects qui nécessitent une optimisation, elle peut toujours être un outil de négociation efficace grâce à un paramétrage et un contrôle des risques raisonnables.
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("LL Crypto - SUI", overlay=true)
// Parâmetros de tempo para criptomoedas
fast_ema_len = input.int(11, minval=5, title="Fast EMA")
slow_ema_len = input.int(34, minval=20, title="Slow EMA")
sqm_lengthKC = input.int(20, title="SQM KC Length")
kauf_period = input.int(20, title="Kauf Period")
kauf_mult = input.float(2, title="Kauf Mult factor")
min_profit_sl = input.float(5, minval=0.01, maxval=100.0, title="Min profit to start moving SL [%]")
longest_sl = input.float(10, minval=0.01, maxval=100.0, title="Maximum possible of SL [%]")
sl_step = input.float(0.5, minval=0.0, maxval=1.0, title="Take profit factor")
// Parâmetros adaptados para criptomoedas
CMF_length = input.int(11, minval=1, title="CMF length")
show_plots = input.bool(true, title="Show plots")
// Definir intervalos de tempo para criptomoedas
selected_timeframe = input.string(defval="15", title="Intervalo de Tempo", options=["1", "15", "60"])
lower_resolution = timeframe.period == '1' ? '1' :
timeframe.period == '5' ? '15' :
timeframe.period == '15' ? '60' :
timeframe.period == '60' ? '240' :
timeframe.period == '240' ? 'D' :
timeframe.period == 'D' ? 'W' : 'M'
sp_close = close[barstate.isrealtime ? 1 : 0]
sp_high = high[barstate.isrealtime ? 1 : 0]
sp_low = low[barstate.isrealtime ? 1 : 0]
sp_volume = volume[barstate.isrealtime ? 1 : 0]
// Calcular Squeeze Momentum ajustado para criptomoedas
sqm_val = ta.linreg(sp_close - math.avg(math.avg(ta.highest(sp_high, sqm_lengthKC), ta.lowest(sp_low, sqm_lengthKC)), ta.sma(sp_close, sqm_lengthKC)), sqm_lengthKC, 0)
close_low = request.security(syminfo.tickerid, lower_resolution, sp_close, lookahead=barmerge.lookahead_on)
high_low = request.security(syminfo.tickerid, lower_resolution, sp_high, lookahead=barmerge.lookahead_on)
low_low = request.security(syminfo.tickerid, lower_resolution, sp_low, lookahead=barmerge.lookahead_on)
sqm_val_low = ta.linreg(close_low - math.avg(math.avg(ta.highest(high_low, sqm_lengthKC), ta.lowest(low_low, sqm_lengthKC)), ta.sma(close_low, sqm_lengthKC)), sqm_lengthKC, 0)
// CMF adaptado para criptomoedas
ad = sp_close == sp_high and sp_close == sp_low or sp_high == sp_low ? 0 : ((2 * sp_close - sp_low - sp_high) / (sp_high - sp_low)) * sp_volume
money_flow = math.sum(ad, CMF_length) / math.sum(sp_volume, CMF_length)
// Condições de entrada para criptomoedas
low_condition_long = (sqm_val_low > sqm_val_low[1])
low_condition_short = (sqm_val_low < sqm_val_low[1])
money_flow_min = (money_flow[4] > money_flow[2]) and (money_flow[3] > money_flow[2]) and (money_flow[2] < money_flow[1]) and (money_flow[2] < money_flow)
money_flow_max = (money_flow[4] < money_flow[2]) and (money_flow[3] < money_flow[2]) and (money_flow[2] > money_flow[1]) and (money_flow[2] > money_flow)
condition_long = ((sqm_val > sqm_val[1])) and money_flow_min and ta.lowest(sqm_val, 5) < 0
condition_short = ((sqm_val < sqm_val[1])) and money_flow_max and ta.highest(sqm_val, 5) > 0
enter_long = low_condition_long and condition_long
enter_short = low_condition_short and condition_short
// Stop conditions
var float current_target_price = na
var float current_sl_price = na
var float current_target_per = na
var float current_profit_per = na
set_targets(isLong, min_profit, current_target_per, current_profit_per) =>
float target = na
float sl = na
if isLong
target := sp_close * (1.0 + current_target_per)
sl := sp_close * (1.0 - (longest_sl / 100.0))
else
target := sp_close * (1.0 - current_target_per)
sl := sp_close * (1.0 + (longest_sl / 100.0))
[target, sl]
target_reached(isLong, min_profit, current_target_per, current_profit_per) =>
float target = na
float sl = na
float profit_per = na
float target_per = na
if current_profit_per == na
profit_per := (min_profit * sl_step) / 100.0
else
profit_per := current_profit_per + ((min_profit * sl_step) / 100.0)
target_per := current_target_per + (min_profit / 100.0)
if isLong
target := strategy.position_avg_price * (1.0 + target_per)
sl := strategy.position_avg_price * (1.0 + profit_per)
else
target := strategy.position_avg_price * (1.0 - target_per)
sl := strategy.position_avg_price * (1.0 - profit_per)
[target, sl, profit_per, target_per]
hl_diff = ta.sma(sp_high - sp_low, kauf_period)
stop_condition_long = 0.0
new_stop_condition_long = sp_low - (hl_diff * kauf_mult)
if (strategy.position_size > 0)
if (sp_close > current_target_price)
[target, sl, profit_per, target_per] = target_reached(true, min_profit_sl, current_target_per, current_profit_per)
current_target_price := target
current_sl_price := sl
current_profit_per := profit_per
current_target_per := target_per
stop_condition_long := math.max(stop_condition_long[1], current_sl_price)
else
stop_condition_long := new_stop_condition_long
stop_condition_short = 99999999.9
new_stop_condition_short = sp_high + (hl_diff * kauf_mult)
if (strategy.position_size < 0)
if (sp_close < current_target_price)
[target, sl, profit_per, target_per] = target_reached(false, min_profit_sl, current_target_per, current_profit_per)
current_target_price := target
current_sl_price := sl
current_profit_per := profit_per
current_target_per := target_per
stop_condition_short := math.min(stop_condition_short[1], current_sl_price)
else
stop_condition_short := new_stop_condition_short
// Submit entry orders
if (enter_long and (strategy.position_size <= 0))
if (strategy.position_size < 0)
strategy.close(id="SHORT")
current_target_per := (min_profit_sl / 100.0)
current_profit_per := na
[target, sl] = set_targets(true, min_profit_sl, current_target_per, current_profit_per)
current_target_price := target
current_sl_price := sl
strategy.entry(id="LONG", direction=strategy.long)
if show_plots
label.new(bar_index, sp_high, text="LONG\nSL: " + str.tostring(stop_condition_long), style=label.style_label_down, color=color.green)
if (enter_short and (strategy.position_size >= 0))
if (strategy.position_size > 0)
strategy.close(id="LONG")
current_target_per := (min_profit_sl / 100.0)
current_profit_per := na
[target, sl] = set_targets(false, min_profit_sl, current_target_per, current_profit_per)
current_target_price := target
current_sl_price := sl
strategy.entry(id="SHORT", direction=strategy.short)
if show_plots
label.new(bar_index, sp_high, text="SHORT\nSL: " + str.tostring(stop_condition_short), style=label.style_label_down, color=color.red)
if (strategy.position_size > 0)
strategy.exit(id="EXIT LONG", stop=stop_condition_long)
if (strategy.position_size < 0)
strategy.exit(id="EXIT SHORT", stop=stop_condition_short)
// Plot anchor trend
plotshape(low_condition_long, style=shape.triangleup, location=location.abovebar, color=color.green)
plotshape(low_condition_short, style=shape.triangledown, location=location.abovebar, color=color.red)
plotshape(condition_long, style=shape.triangleup, location=location.belowbar, color=color.green)
plotshape(condition_short, style=shape.triangledown, location=location.belowbar, color=color.red)
plotshape(enter_long, style=shape.triangleup, location=location.bottom, color=color.green)
plotshape(enter_short, style=shape.triangledown, location=location.bottom, color=color.red)
// Plot emas
plot(ta.ema(close, 20), color=color.blue, title="20 EMA")
plot(ta.ema(close, 50), color=color.orange, title="50 EMA")
plot(ta.sma(close, 200), color=color.red, title="MA 200")
// Plot stop loss values for confirmation
plot(series=(strategy.position_size > 0) and show_plots ? stop_condition_long : na, color=color.green, style=plot.style_linebr, title="Long Stop")
plot(series=(strategy.position_size < 0) and show_plots ? stop_condition_short : na, color=color.green, style=plot.style_linebr, title="Short Stop")
plot(series=(strategy.position_size < 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Short TP")
plot(series=(strategy.position_size > 0) and show_plots ? current_target_price : na, color=color.yellow, style=plot.style_linebr, title="Long TP")