Cazador de rupturas de líneas de tendencia

EMA Pivot BREAKOUT TRENDLINE
Fecha de creación: 2025-10-29 15:47:08 Última modificación: 2025-10-29 15:47:08
Copiar: 0 Número de Visitas: 248
2
Seguir
319
Seguidores

Cazador de rupturas de líneas de tendencia Cazador de rupturas de líneas de tendencia

La línea de tendencia dinámica de la EMA+ de los 200 días, un conjunto de puntos débiles en el mercado de boxeo directo

Esta estrategia utiliza el EMA de 200 días para determinar la dirección de la tendencia general y luego busca oportunidades de ruptura en los puntos clave de resistencia / soporte.La lógica central es simple y cruda: los mercados alcistas buscan la línea de tendencia bajista para hacer más, los mercados bajistas buscan la línea de tendencia ascendente para hacer menos.

Los datos hablan: la estrategia utiliza la detección del eje central de 5 + 5 para asegurar que la señal no se replantee. La ventana de retrospección de 20 ciclos limita el alcance de los datos históricos y evita la sobreajuste. Esto no es ciencia ficción, es un análisis puro del comportamiento del precio.

1:3 riesgo de retorno que el diseño, la matemática espera estar a tu lado

El punto de parada está situado en el punto más alto/más bajo de la línea K anterior, y el objetivo de parada es 3 veces la distancia de parada.Esto significa que incluso con un 30% de probabilidad de ganar, usted todavía puede ganar dinero a largo plazo.

Ejecución específica: después de una ruptura múltiple, el stop loss = anterior bajo, el stop stop = precio de entrada + 3 × ((precio de entrada - anterior bajo))

El mecanismo de detección de puntos centrales, un adiós a la era de las líneas de dibujo subjetivas

El mayor problema con el análisis técnico tradicional es que es demasiado subjetivo. Esta estrategia utiliza un algoritmo para identificar automáticamente los puntos altos y bajos clave:

  • 5 líneas K a la izquierda + 5 líneas K a la derecha confirman el eje central
  • Solo conecta los dos puntos de eje válidos más recientes en 20 períodos
  • Tendencia alcista: los picos de la decadencia conectados forman una línea de tendencia descendente
  • Tendencia bajista: crecientes conexiones entre los puntos bajos y las líneas de tendencia alcista

El resultado es totalmente objetivo, sin repintado y reproducible, con una precisión mil veces superior a la de tu dibujo manual.

Un mecanismo de doble filtración que reduce considerablemente la probabilidad de una falsa brecha

El filtro de la primera capa: tendencia de la EMA hacia el juicio sesgado.El precio solo hace brechas múltiples por encima de la EMA de los 200 días y solo hace brechas en blanco por debajo de ella. Este truco filtra directamente el 80% de las transacciones adversas.

La segunda capa de filtrado: la validación de la eficacia de las líneas de tendencia.El sistema requiere que se encuentren dos puntos cardinales que cumplan los requisitos para trazar una línea de tendencia. La “línea de tendencia” que no tiene suficiente soporte de datos se ignora directamente.

Efectos en la batalla real: Reducción drástica de las señales ineficaces en las ciudades convulsivas y captura precisa de las oportunidades de ruptura en las ciudades de tendencia.

Gestión de posiciones dinámicas, control de riesgos más importante que ganancias

Hay dos opciones de posicionamiento:

  1. Modelo de porcentaje de riesgoAjuste de posiciones en función de la distancia de parada para asegurar que el riesgo de cada operación sea fijo
  2. Modelo de contrato fijoPara los traders experimentados, las posiciones son fijas pero el riesgo cambia con la distancia de pérdida.

Fórmula matemática: tamaño de la posición = (capital de la cuenta × porcentaje de riesgo) ÷ distancia de parada

Este conjunto de estrategias de gestión de posiciones es más científico que el 90% de las estrategias en el mercado.

La estrategia es limitada, no voy a ocultarla.

Esta estrategia no es universal, y las siguientes situaciones no funcionan bien:

  • El mercado de la oscilación horizontalLos piratas informáticos de los Estados Unidos están haciendo lo que pueden para proteger a sus clientes.
  • Los mercados de extrema volatilidadLa detección de puntos centrales puede estar rezagada por los cambios rápidos
  • Variedades poco fluidasEl precio de la gasolina se ha disparado y el precio de la gasolina ha subido.

La sensibilidad de los parámetros:

  • Si la sensibilidad del eje central está demasiado baja, se producirá una señal de ruido.
  • Una ventana de retrospectiva demasiado corta puede no encontrar una línea de tendencia efectiva
  • El porcentaje de riesgo de más del 2% requiere una consideración cautelosa

Recomendaciones para el despliegue en combate, mejor que la teoría

El mejor escenario:

  • Las variedades dominantes con tendencias claras a mediano y largo plazo
  • Gráfico de la línea del día o del nivel de 4 horas
  • Hay cierta volatilidad, pero no un mercado demasiado loco.

Recomendaciones para la optimización de parámetros:

  • Los novatos sugieren que el riesgo esté controlado entre el 0,5% y el 1%
  • Sensibilidad del eje central adaptada a las características de la variedad
  • La ventana de retorno puede extenderse de acuerdo con el ciclo del mercado

Nota de riesgo: La retroalimentación histórica no representa ganancias futuras, y cualquier estrategia tiene la posibilidad de pérdidas continuas. Se recomienda probar el entorno simulado primero y comprobar que se entiende la lógica de la estrategia antes de invertir en el mercado real.

Código Fuente de la Estrategia
/*backtest
start: 2024-10-29 00:00:00
end: 2025-10-27 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("Trendline Breakout Strategy", overlay=true, max_lines_count=500, max_labels_count=500, max_boxes_count=500)

// === INPUTS ===
ema_len = input.int(200, "EMA Length", minval=1, group="Trend Detection")
src = input.source(close, "EMA Source", group="Trend Detection")
lookback = input.int(20, "Lookback Window for Pivots (bars)", minval=5, group="Trend Detection")
left_bars = input.int(5, "Pivot Left Sensitivity (bars)", minval=1, group="Trend Detection")
right_bars = input.int(5, "Pivot Right Sensitivity (bars)", minval=1, group="Trend Detection")

qty_mode = input.string("Risk Percent", "Position Sizing Mode", options=["Risk Percent", "Fixed Contracts"], group="Position Sizing")
risk_pct = input.float(1.0, "Risk % of Equity", minval=0.1, maxval=10.0, step=0.1, group="Position Sizing")
fixed_size = input.int(1, "Fixed Contract Size", minval=1, group="Position Sizing")

show_trendline = input.bool(true, "Show Trendline", group="Visuals")
enable_prints = input.bool(true, "Enable Info Table", group="Visuals")

// === CORE LOGIC ===
// EMA Calculation
ema = ta.ema(src, ema_len)
bias_bull = close > ema
bias_bear = close < ema

// Pivot Detection (confirmed, no repainting)
ph = ta.pivothigh(high, left_bars, right_bars)
pl = ta.pivotlow(low, left_bars, right_bars)

// Arrays to store historical pivots (limited to prevent memory issues)
var array<float> ph_values = array.new<float>()
var array<int> ph_bars = array.new<int>()
var array<float> pl_values = array.new<float>()
var array<int> pl_bars = array.new<int>()

// Update pivot highs array
if not na(ph)
    array.push(ph_values, ph)
    array.push(ph_bars, bar_index - right_bars)
    if array.size(ph_values) > 100
        array.shift(ph_values)
        array.shift(ph_bars)

// Update pivot lows array
if not na(pl)
    array.push(pl_values, pl)
    array.push(pl_bars, bar_index - right_bars)
    if array.size(pl_values) > 100
        array.shift(pl_values)
        array.shift(pl_bars)

// Function to find two most recent pivots within lookback
get_two_pivots(arr_vals, arr_bars) =>
    int p1_bar = na
    float p1_val = na
    int p2_bar = na
    float p2_val = na
    for j = array.size(arr_bars) - 1 to 0
        int pb = array.get(arr_bars, j)
        if pb < bar_index - lookback
            break
        if na(p1_bar)
            p1_bar := pb
            p1_val := array.get(arr_vals, j)
        else if na(p2_bar)
            p2_bar := pb
            p2_val := array.get(arr_vals, j)
            break  // Only need the two most recent
    [p1_bar, p1_val, p2_bar, p2_val]

// Get pivots for bullish bias
int p1h_bar = na
float p1h_val = na
int p2h_bar = na
float p2h_val = na
if bias_bull
    [tmp1, tmp2, tmp3, tmp4] = get_two_pivots(ph_values, ph_bars)
    p1h_bar := tmp1
    p1h_val := tmp2
    p2h_bar := tmp3
    p2h_val := tmp4

// Get pivots for bearish bias
int p1l_bar = na
float p1l_val = na
int p2l_bar = na
float p2l_val = na
if bias_bear
    [tmp5, tmp6, tmp7, tmp8] = get_two_pivots(pl_values, pl_bars)
    p1l_bar := tmp5
    p1l_val := tmp6
    p2l_bar := tmp7
    p2l_val := tmp8

// Validate trendlines
bull_valid = bias_bull and not na(p1h_bar) and not na(p2h_bar) and p2h_bar < p1h_bar and p2h_val > p1h_val  // Descending: older high > newer high
bear_valid = bias_bear and not na(p1l_bar) and not na(p2l_bar) and p2l_bar < p1l_bar and p2l_val < p1l_val  // Ascending: older low < newer low

// Calculate trendline Y at current bar
float bull_y = na
if bull_valid and p1h_bar != p2h_bar
    float slope = (p1h_val - p2h_val) / (p1h_bar - p2h_bar)
    bull_y := p1h_val + slope * (bar_index - p1h_bar)

float bear_y = na
if bear_valid and p1l_bar != p2l_bar
    float slope = (p1l_val - p2l_val) / (p1l_bar - p2l_bar)
    bear_y := p1l_val + slope * (bar_index - p1l_bar)

// Breakout conditions (confirmed on close, no repainting)
long_breakout = bull_valid and ta.crossover(close, bull_y)
short_breakout = bear_valid and ta.crossunder(close, bear_y)

// === POSITION SIZING AND ENTRIES ===
var float entry_price = na
var float sl_price = na
var float tp_price = na

if long_breakout and strategy.position_size == 0
    entry_price := close
    sl_price := low[1]
    float risk = entry_price - sl_price
    if risk > 0
        strategy.entry("Long", strategy.long, qty = qty_mode == "Fixed Contracts" ? float(fixed_size) : (strategy.equity * risk_pct / 100) / risk)
        tp_price := sl_price + 3 * risk
        strategy.exit("Long Exit", "Long", stop=sl_price, limit=tp_price)

if short_breakout and strategy.position_size == 0
    entry_price := close
    sl_price := high[1]
    float risk = sl_price - entry_price
    if risk > 0
        strategy.entry("Short", strategy.short, qty = qty_mode == "Fixed Contracts" ? float(fixed_size) : (strategy.equity * risk_pct / 100) / risk)
        tp_price := sl_price - 3 * risk
        strategy.exit("Short Exit", "Short", stop=sl_price, limit=tp_price)

// === VISUAL LABELS ===
if long_breakout
    label.new(bar_index, low, text="Long\nEntry: " + str.tostring(entry_price, "#.##") + "\nSL: " + str.tostring(sl_price, "#.##") + "\nTP: " + str.tostring(tp_price, "#.##") + "\nReason: Trendline Breakout", 
              style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small)

if short_breakout
    label.new(bar_index, high, text="Short\nEntry: " + str.tostring(entry_price, "#.##") + "\nSL: " + str.tostring(sl_price, "#.##") + "\nTP: " + str.tostring(tp_price, "#.##") + "\nReason: Trendline Breakout", 
              style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small)

// === INFO TABLE ===
if enable_prints and barstate.islast
    var table info_table = table.new(position.top_right, 2, 4, bgcolor=color.white, border_width=1)
    table.cell(info_table, 0, 0, "Bias", text_color=color.black, bgcolor=color.gray)
    table.cell(info_table, 1, 0, bias_bull ? "Bull" : "Bear", text_color=bias_bull ? color.green : color.red)
    table.cell(info_table, 0, 1, "Trendline", text_color=color.black, bgcolor=color.gray)
    table.cell(info_table, 1, 1, bull_valid or bear_valid ? (bull_valid ? "Descending" : "Ascending") : "None", text_color=color.black)
    table.cell(info_table, 0, 2, "Position", text_color=color.black, bgcolor=color.gray)
    table.cell(info_table, 1, 2, strategy.position_size > 0 ? "Long" : strategy.position_size < 0 ? "Short" : "Flat", text_color=color.black)
    table.cell(info_table, 0, 3, "P&L", text_color=color.black, bgcolor=color.gray)
    table.cell(info_table, 1, 3, str.tostring(strategy.netprofit, "#.##"), text_color=strategy.netprofit >= 0 ? color.green : color.red)

// === EMA PLOT ===
plot(ema, "EMA", color=color.blue, linewidth=2)

// === ALERTS ===
alertcondition(long_breakout, title="Long Entry Alert", message="Bullish bias: Price broke above descending trendline. Enter Long.")
alertcondition(short_breakout, title="Short Entry Alert", message="Bearish bias: Price broke below ascending trendline. Enter Short.")
alertcondition(strategy.position_size[1] != 0 and strategy.position_size == 0, title="Exit Alert", message="Position closed at SL or TP.")

// === COMMENTS AND LIMITATIONS ===
// Comments:
// - Pivots are detected using ta.pivothigh/low with user-defined sensitivity to identify "significant" swings.
// - Trendlines are redrawn only when bias is active and valid (two qualifying pivots found).
// - Entries/exits use strategy.entry/exit for backtesting; position size closes opposite trades automatically.
// - No repainting: All pivots require 'right_bars' confirmation; breakouts checked on bar close.
// - Variable names: Descriptive (e.g., p1h_bar for most recent pivot high bar).
//
// Limitations:
// - Trendline uses the two *most recent* pivot highs/lows within lookback; may not always connect the absolute highest/lowest if more pivots exist.
// - Pivot sensitivity (left/right bars) approximates "significant" swings—too low may include noise, too high may miss turns.
// - Only one trendline per bias; does not handle multiple parallel lines or complex channels.
// - Position sizing assumes equity-based risk; in "Fixed Contracts" mode, risk % varies with SL distance.
// - Lookback window limits historical context—short windows may yield few/no valid trendlines on low-volatility periods.
// - Strategy does not filter for overall trend strength beyond EMA bias; add filters (e.g., volume) for production use.