Cette stratégie est un système de trading dynamique basé sur l'analyse de plusieurs délais, combinant des moyennes mobiles exponentielles (EMA), l'indicateur de momentum de compression (SQM) et l'indice de flux monétaire (CMF) pour la génération de signaux.
La stratégie utilise trois principaux indicateurs techniques pour identifier les opportunités de trading. Premièrement, elle utilise des EMA à 11 périodes et 34 périodes pour déterminer la direction de la tendance du marché. Deuxièmement, elle utilise un indicateur de momentum de compression modifié pour détecter la pression du marché et les opportunités de rupture potentielles, calculées par régression linéaire des écarts de prix. Enfin, elle confirme la direction du commerce à travers un indicateur de flux monétaire modifié, garantissant un capital suffisant pour soutenir les mouvements de prix. La stratégie définit des niveaux de stop-loss dynamiques après confirmation, qui s'ajustent automatiquement à mesure que les bénéfices augmentent, protégeant les gains tout en permettant les fluctuations de prix.
Cette stratégie offre aux traders une approche de trading systématique grâce à une analyse technique multidimensionnelle et une gestion intelligente des risques. Sa force principale réside dans la combinaison de la tendance suivie avec une gestion dynamique des risques, capturant les opportunités de marché tout en protégeant les bénéfices. Bien qu'il existe des aspects nécessitant une optimisation, la stratégie peut servir d'outil de trading efficace avec des paramètres appropriés et un contrôle des risques.
/*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")