En la carga de los recursos... Cargando...

Tendencia de toma de ganancias/detención de pérdidas de múltiples modos siguiendo una estrategia basada en la EMA, la franja de Madrid y el canal de Donchian

El autor:¿ Qué pasa?, Fecha: 2025-01-10 16:24:30
Las etiquetas:El EMARRR

 Multi-Mode Take Profit/Stop Loss Trend Following Strategy Based on EMA, Madrid Ribbon and Donchian Channel

Resumen general

Esta es una estrategia de seguimiento de tendencias que combina el promedio móvil exponencial (EMA), la cinta de Madrid y el canal de Donchian. La singularidad de la estrategia radica en sus tres modos de toma de ganancias / stop-loss conmutables: basados en ticks, basados en dólares y basados en la relación riesgo-recompensa. Mejora la confiabilidad a través de un mecanismo de doble confirmación, ejecutando operaciones solo en la segunda señal válida.

Principios de estrategia

La estrategia emplea una triple combinación de indicadores técnicos para identificar oportunidades comerciales: 1. EMA de 200 períodos para determinar la dirección general de la tendencia 2. cinta de Madrid (crossover de EMA de 5 períodos y de 100 períodos) para la evaluación de la tendencia a medio plazo 3. La ruptura del Canal Donchian para un tiempo de entrada específico

Condiciones de negociación largas: precio por encima de 200 EMA, ribete de Madrid alcista y brechas de precios por encima del Canal de Donchian. Condiciones de negociación a corto plazo: precio por debajo de 200 EMA, banda de Madrid bajista y brechas de precios por debajo del canal de Donchian. Para reducir las señales falsas, las operaciones solo se ejecutan en la segunda aparición de una señal válida.

Ventajas estratégicas

  1. Sistema de gestión TP/SL flexible y adaptable a los diferentes estilos de negociación
  2. La combinación de múltiples indicadores técnicos proporciona señales más fiables
  3. El mecanismo de doble confirmación reduce eficazmente las señales falsas
  4. La estrategia evita por completo el sesgo de mirar hacia el futuro sin volver a pintar
  5. Muy personalizable para diferentes entornos de mercado

Riesgos estratégicos

  1. Posibilidad de retiros significativos durante las reversiones de tendencia Solución: Ajustar los parámetros del indicador para aumentar la sensibilidad de la estrategia
  2. La excesiva dependencia de los indicadores técnicos puede hacer perder ciertas oportunidades de mercado Solución: Recomendar combinar con el análisis fundamental
  3. El TP/SL fijo puede no adaptarse a todas las condiciones del mercado Solución: ajustar dinámicamente los niveles de TP/SL en función de la volatilidad

Direcciones para la optimización de la estrategia

  1. Introducir indicadores de volatilidad para el ajuste dinámico de TP/SL
  2. Añadir análisis de volumen para mejorar la fiabilidad de la señal
  3. Incorporar más indicadores del sentimiento del mercado
  4. Desarrollar un sistema de optimización de parámetros adaptativo
  5. Añadir un módulo de gestión de riesgos, como el control del aprovechamiento máximo

Resumen de las actividades

Se trata de una estrategia de seguimiento de tendencias que combina múltiples indicadores técnicos clásicos, mejorando la estabilidad de las operaciones a través de una gestión flexible de TP/SL y un mecanismo de doble confirmación.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=6
strategy("Pamplona Enhanced TP/SL Toggleable", overlay=true, default_qty_type=strategy.fixed, default_qty_value=1)

// Input settings
use_tick_based = input.bool(false, title="Use Tick-Based TP/SL")
use_dollar_based = input.bool(false, title="Use Dollar-Based TP/SL")
use_risk_reward = input.bool(true, title="Use Risk-Reward TP/SL") // Default option

tick_size = input.float(0.1, title="Tick Size (for Tick-Based)", minval=0.0001, step=0.0001)
ticks = input.int(10, title="Ticks (for Tick-Based TP/SL)", minval=1)
dollar_tp = input.float(10.0, title="Dollar Take Profit (for Dollar-Based)", minval=0.01, step=0.01)
dollar_sl = input.float(10.0, title="Dollar Stop Loss (for Dollar-Based)", minval=0.01, step=0.01)
risk_reward_ratio = input.float(2.0, title="Risk-Reward Ratio (for Risk-Reward TP/SL)", minval=0.1, step=0.1)
contract_size = input.int(1, title="Contract Size", minval=1)

// Retrieve indicators
ema200 = ta.ema(close, 200)
src = close
ma05 = ta.ema(src, 5)
ma100 = ta.ema(src, 100)
madrid_green = ma05 > ma100
dlen = input.int(20, title="Donchian Channel Period")
highest_d = ta.highest(high, dlen)
lowest_d = ta.lowest(low, dlen)
donchian_green = close > highest_d[1]
donchian_red = close < lowest_d[1]

// Track signals
var int long_signal_count = 0
var int short_signal_count = 0

// Conditions
long_condition_raw = madrid_green and donchian_green and close > ema200
short_condition_raw = not madrid_green and donchian_red and close < ema200

// Update signal counters
if long_condition_raw
    long_signal_count += 1
else
    long_signal_count := 0

if short_condition_raw
    short_signal_count += 1
else
    short_signal_count := 0

// Final conditions to enter on the second signal
long_condition = long_signal_count == 2
short_condition = short_signal_count == 2

// Ensure exactly one TP/SL mode is enabled
tp_sl_mode_count = (use_tick_based ? 1 : 0) + (use_dollar_based ? 1 : 0) + (use_risk_reward ? 1 : 0)
if tp_sl_mode_count != 1
    runtime.error("Enable exactly ONE TP/SL mode (Tick-Based, Dollar-Based, or Risk-Reward).")

// Function to calculate TP/SL based on active mode
calc_tp_sl(entry_price, is_long) =>
    float tp = na
    float sl = na
    if use_tick_based
        tp := is_long ? entry_price + ticks * tick_size : entry_price - ticks * tick_size
        sl := is_long ? entry_price - ticks * tick_size : entry_price + ticks * tick_size
    else if use_dollar_based
        tp := is_long ? entry_price + (dollar_tp / contract_size) : entry_price - (dollar_tp / contract_size)
        sl := is_long ? entry_price - (dollar_sl / contract_size) : entry_price + (dollar_sl / contract_size)
    else if use_risk_reward
        risk = is_long ? close - low : high - close
        tp := is_long ? close + (risk * risk_reward_ratio) : close - (risk * risk_reward_ratio)
        sl := is_long ? close - risk : close + risk
    [tp, sl]

// Entry logic
if long_condition
    [take_profit, stop_loss] = calc_tp_sl(close, true)
    strategy.entry("Long", strategy.long, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Long", limit=take_profit, stop=stop_loss)

if short_condition
    [take_profit, stop_loss] = calc_tp_sl(close, false)
    strategy.entry("Short", strategy.short, qty=contract_size)
    strategy.exit("Take Profit", from_entry="Short", limit=take_profit, stop=stop_loss)

// Plot indicators
plot(ema200, title="200 EMA", color=color.white, linewidth=2)
bgcolor(long_condition ? color.new(color.green, 90) : short_condition ? color.new(color.red, 90) : na)


Relacionados

Más.