Estrategia comercial basada en EMA


Fecha de creación: 2023-11-24 15:46:48 Última modificación: 2023-11-24 15:46:48
Copiar: 0 Número de Visitas: 1288
1
Seguir
1617
Seguidores

Estrategia comercial basada en EMA

Descripción general

La estrategia utiliza 4 EMAs de diferentes períodos para formar señales de negociación en función de la orden en la que se encuentran, como las luces de tres colores rojo, amarillo y verde que se asemejan a los semáforos, por lo que se le llama estrategia de negociación de semáforos de aluminio. La estrategia analiza el mercado desde dos perspectivas: tendencia y reversión, con el objetivo de mejorar la precisión de las decisiones comerciales.

Principio de estrategia

  1. Establezca la línea rápida ((8 ciclos), la línea media ((14 ciclos), la línea lenta ((16 ciclos) 3 líneas medias de EMA, luego agregue una línea media de EMA de ciclo largo ((100 ciclos) como filtro.

  2. Para determinar el orden de la línea media rápida y media lenta y el cruce con el filtro, determinar el momento de hacer más y hacer menos:

  • Cuando se cruza la línea media en la línea rápida o la línea media en la línea lenta, se juzga que se hace más señal

  • Cuando se cruza la línea rápida debajo de la línea media, se considera que es una señal de Pinto

  • Cuando la línea rápida atraviesa la línea media o la línea media atraviesa la línea lenta, se considera una señal de vacío

  • Cuando se cruza la línea rápida en la línea media, se considera una señal de vacío.

  1. Determina la dirección y la intensidad de la tendencia a través de la secuencia de líneas medias rápidas y lentas, combinando la línea mediana con el punto de inflexión de la medición cruzada del filtro, para lograr una combinación orgánica de seguimiento de tendencias y captura de inversiones.

Análisis de las ventajas

La estrategia combina las ventajas del seguimiento de tendencias y la inversión de operaciones para aprovechar mejor las oportunidades de mercado. Las principales ventajas son:

  1. El uso de múltiples grupos de líneas medias de EMA, mayor capacidad de juicio y menor número de señales falsas
  2. Flexible para hacer más condiciones de vacío y evitar perder oportunidades de negociación
  3. Utilizando el trigonometrio para la medición de períodos largos y cortos, el juicio es completo.
  4. Condiciones de parada de pérdidas personalizadas, control de riesgo en el lugar

Con la optimización de los parámetros, la estrategia se puede adaptar a más variedades, mostrando una mayor rentabilidad y estabilidad en la retrospectiva.

Análisis de riesgos

Los principales riesgos de esta estrategia son:

  1. La confusión en el orden de la línea media de varios grupos de EMA aumenta la dificultad de juicio y genera dudas en las transacciones
  2. Falso signo de fluctuaciones anormales en el mercado que no puede filtrarse eficazmente, lo que puede causar pérdidas en caso de grandes sacudidas
  3. Los parámetros no se establecen a tiempo y los parámetros de parada y pérdida pueden ser demasiado flexibles o estrictos, lo que lleva a pérdidas o pérdidas excesivas

Se recomienda mejorar aún más la estabilidad de la estrategia y controlar el riesgo mediante la optimización de los parámetros, el establecimiento de niveles de stop loss y la operación cautelosa.

Dirección de optimización

Las principales direcciones de optimización de la estrategia son:

  1. Ajuste de los parámetros de ciclo de la línea media de la EMA para adaptarse a más variedades
  2. Añadir filtros de otros indicadores, como MACD, Brinks, etc., para mejorar la precisión de los juicios
  3. Optimización del Stop Loss Ratio para lograr el mejor equilibrio entre riesgos y beneficios
  4. Adición de mecanismos de suspensión de pérdidas adaptativos, como la suspensión de ATR, para controlar aún más el riesgo descendente

La estabilidad y la rentabilidad de las estrategias se pueden mejorar continuamente mediante la adaptación de parámetros en múltiples direcciones y la introducción de instrumentos de control de riesgos.

Resumir

La estrategia de comercio de semáforos integra el seguimiento de tendencias y el juicio de reversión, utiliza 4 grupos de EMA para formar señales de comercio uniformes, se adapta a más variedades a través de la optimización de parámetros y muestra una fuerte capacidad de ganancias en la retrospectiva. A continuación, mediante el control de riesgos adicional y la introducción de indicadores de diversificación, se espera que sea una estrategia de comercio cuantitativa estable y eficiente.

Código Fuente de la Estrategia
/*backtest
start: 2023-01-01 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © maxits

// 4HS Crypto Market Strategy
// This strategy uses 4 ema to get Long or Short Signals
// Length are: 8, 14, 16, 100
// We take long positions when the order of the emas is the following:
// green > yellow > red (As the color of Traffic Lights) and they are above white ema (Used as a filter for long positions)
  
// We take short positions when the order of the emas is the following:
// green < yellow < red (As the color of inverse Traffic Lights) and they are below white ema (Used as a filter for short positions)

//@version=4
strategy(title="Trafic Lights Strategy",
         shorttitle="TLS",
         overlay=true,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0
         )

// User Inputs
// i_time         = input(defval = timestamp("28 May 2017 13:30 +0000"), title = "Start Time", type = input.time) //Starting time for Backtesting

sep1           = input(title="============ System Conditions ============", type=input.bool, defval=false)

enable_Long    = input(true, title="Enable Long Positions")   // Enable long  Positions
enable_Short   = input(true, title="Enable Short Positions") // Enable short Positions

sep2           = input(title="============ Indicator Parameters ============", type=input.bool, defval=false)

f_length       = input(title="Fast EMA Length",   type=input.integer, defval=8,   minval=1) 
m_length       = input(title="Medium EMA Length", type=input.integer, defval=14,   minval=1) 
s_length       = input(title="Slow EMA Length",   type=input.integer, defval=16,  minval=1) 
filter_L       = input(title="EMA Filter",        type=input.integer, defval=100, minval=1) 
filterRes      = input(title="Filter Resolution", type=input.resolution, defval="D")        // ema Filter Time Frame

sep3           = input(title="============LONG Profit-Loss Parameters============", type=input.bool, defval=false)

e_Long_TP      = input(true, title="Enable a Profit Level?")
e_Long_SL      = input(false, title="Enable a S.Loss Level?")
e_Long_TS      = input(true, title="Enable a Trailing Stop?")           
long_TP_Input  = input(40.0,   title='Take Profit %',   type=input.float,   minval=0)/100
long_SL_Input  = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100 
atrLongMultip  = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)   // Parameters to calculate Trailing Stop Loss
atrLongLength  = input(14,    title='ATR Length',      type=input.integer, minval=1)

sep4           = input(title="============SHORT Profit-Loss Parameters============", type=input.bool, defval=false)

e_Short_TP     = input(true, title="Enable a Profit Level?")
e_Short_SL     = input(false, title="Enable a S.Loss Level?")
e_Short_TS     = input(true, title="Enable a Trailing Stop?")
short_TP_Input = input(30.0,   title='Take Profit %',   type=input.float,   minval=0)/100
short_SL_Input = input(1.0,   title='Stop Loss %',     type=input.float,   minval=0)/100
atrShortMultip = input(2.0,   title='ATR Multiplier',  type=input.float,   minval=0.1)
atrShortLength = input(14,    title='ATR Length',      type=input.integer, minval=1)

// Indicators

fema   = ema(close, f_length)
mema   = ema(close, m_length)
sema   = ema(close, s_length)
filter = security(syminfo.tickerid, filterRes, ema(close, filter_L))

plot(fema,   title="Fast EMA",   color=color.new(color.green,  0))
plot(mema,   title="Medi EMA",   color=color.new(color.yellow, 0))
plot(sema,   title="Slow EMA",   color=color.new(color.red,    0))
plot(filter, title="EMA Filter", color=color.new(color.white,  0))

// Entry Conditions

longTrade  = strategy.position_size >  0
shortTrade = strategy.position_size <  0
notInTrade = strategy.position_size == 0
inTrade    = strategy.position_size != 0
priceEntry = strategy.position_avg_price

goLong  = fema > mema and mema > sema and fema > filter and  enable_Long  and (crossover (fema, mema) or crossover (mema, sema) or crossover (sema, filter))
goShort = fema < mema and mema < sema and fema < filter and  enable_Short and (crossunder (fema, mema) or crossunder (mema, sema) or crossunder (sema, filter))

close_L = crossunder(fema, mema)
close_S = crossover (fema, mema)

// Profit and Loss conditions

// Long
 
long_TP = priceEntry * (1 + long_TP_Input)  // Long Position Take Profit Calculation
long_SL = priceEntry * (1 - long_SL_Input)  // Long Position Stop Loss Calculation
atrLong = atr(atrLongLength)                // Long Position ATR Calculation
long_TS = low - atrLong * atrLongMultip

long_T_stop  = 0.0                          // Code for calculating Long Positions Trailing Stop Loss/
long_T_stop := if (longTrade)
    longStop = long_TS
    max(long_T_stop[1], longStop)
else 
    0
    
//Short

short_TP = priceEntry * (1 - short_TP_Input) // Long  Position Take Profit Calculation
short_SL = priceEntry * (1 + short_SL_Input) // Short Position Stop Loss Calculation
atrShort = atr(atrShortLength)               // Short Position ATR Calculation
short_TS = high + atrShort * atrShortMultip

short_T_stop   = 0.0                // Code for calculating Short Positions Trailing Stop Loss/
short_T_stop  := if shortTrade
    shortStop  = short_TS
    min(short_T_stop[1], shortStop)
else 
    9999999

// Strategy Long Entry

if goLong and notInTrade 
    strategy.entry("Go Long", long=strategy.long, comment="Go Long", alert_message="Open Long Position")

if longTrade and close_L
    strategy.close("Go Long", when=close_L, comment="Close Long", alert_message="Close Long Position")
    
if e_Long_TP    // Algorithm for Enabled Long Position Profit Loss Parameters
    if (e_Long_TS and not e_Long_SL)
        strategy.exit("Long TP & TS", "Go Long", limit = long_TP, stop = long_T_stop)
    else
        if (e_Long_SL and not e_Long_TS)
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS", "Go Long",limit = long_TP)
else
    if not e_Long_TP 
        if (e_Long_TS and not e_Long_SL)
            strategy.exit("Long TP & TS", "Go Long", stop = long_T_stop)
        else
            if (e_Long_SL and not e_Long_TS)
                strategy.exit("Long TP & TS", "Go Long",stop = long_SL)
    

// Strategy Short Entry

if goShort and notInTrade 
    strategy.entry("Go Short", long=strategy.short, comment="Go Short", alert_message="Open Short Position")

if shortTrade and close_S
    strategy.close("Go Short", comment="Close Short", alert_message="Close Short Position")

if e_Short_TP   // Algorithm for Enabled Short Position Profit Loss Parameters
    if (e_Short_TS and not e_Short_SL)
        strategy.exit("Short TP & TS", "Go Short", limit = short_TP, stop = short_T_stop)
    else
        if (e_Short_SL and not e_Short_TS)
            strategy.exit("Short TP & SL", "Go Short",limit = short_TP, stop = short_SL)
        else 
            strategy.exit("Short TP & TS", "Go Short",limit = short_TP)
else
    if not e_Short_TP 
        if (e_Short_TS and not e_Short_SL)
            strategy.exit("Short TS", "Go Short", stop = short_T_stop)
        else
            if (e_Short_SL and not e_Short_TS)
                strategy.exit("Short SL", "Go Short",stop = short_SL)

// Long  Position Profit and Loss Plotting

plot(longTrade and e_Long_TP  and long_TP                          ? long_TP      : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_SL  and long_SL and not e_Long_TS        ? long_SL      : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(longTrade and e_Long_TS  and long_T_stop and not e_Long_SL    ? long_T_stop  : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)

// Short Position Profit and Loss Plotting

plot(shortTrade and e_Short_TP and short_TP                        ? short_TP     : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_SL and short_SL and not e_Short_TS     ? short_SL     : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(shortTrade and e_Short_TS and short_T_stop and not e_Short_SL ? short_T_stop : na, title="TS Level", color=color.red,   style=plot.style_linebr, linewidth=2)