Estrategia de retroceso de la EMA

El autor:¿ Qué pasa?, Fecha: 2021-12-21 11:48:54
Las etiquetas:

img

Resumen general

La estrategia de retroceso de la EMA es una estrategia de trading cuantitativa basada en el indicador de EMA. Construye señales de trading utilizando tres curvas de EMA con períodos diferentes y establece stop loss y take profit basadas en retrocesos de precios para automatizar la negociación.

Principio de la estrategia

La estrategia utiliza tres curvas EMA:

  • EMA1: para juzgar el nivel de apoyo/resistencia de retroceso de precios, con un período relativamente corto, por defecto a 33 períodos.
  • EMA2: para filtrar algunas señales de reversión, con un período de 5 veces el EMA1, por defecto a 165 períodos.
  • EMA3: para determinar la dirección general de la tendencia, con un período de 11 veces el EMA1, por defecto a 365 períodos.

Las señales de negociación se generan de acuerdo con la siguiente lógica:

Signo largo: el precio cruza por encima de la EMA1, retrocede por debajo de la EMA1 formando mínimos más altos, con un retroceso que no alcanza la EMA2.

Señal corto: el precio cruza por debajo de la EMA1, retrocede por encima de la EMA1 formando máximos más bajos, con un retroceso que no alcanza la EMA2.

El stop loss se establece en el precio de retroceso más bajo / más alto para largo / corto.

Ventajas estratégicas

La estrategia tiene las siguientes ventajas:

  1. Las señales de negociación construidas utilizando un indicador EMA fiable.
  2. El retroceso de precios evita ser atrapado de manera efectiva.
  3. Las pérdidas de detención establecidas en los controles anteriores de alto/bajo riesgo de manera efectiva.
  4. Tome ganancias que satisfagan la relación riesgo-recompensa.
  5. Los parámetros de la EMA se pueden ajustar para diferentes ciclos.

Riesgos estratégicos

La estrategia también tiene algunos riesgos:

  1. La EMA tiene un efecto de retraso, puede perder los puntos de inversión de tendencia.
  2. El rango de retroceso demasiado grande para exceder la EMA2 puede generar señales falsas.
  3. El stop loss puede romperse en los mercados de tendencia.
  4. La configuración incorrecta de los parámetros conduce a un exceso de negociación o a oportunidades perdidas.

Los riesgos pueden mitigarse ajustando los períodos de EMA, el límite de retroceso, etc. También se pueden añadir otros indicadores a las señales de filtro.

Direcciones de optimización

La estrategia también puede optimizarse en los siguientes aspectos:

  1. Añadir un indicador de tendencia para evitar operaciones contrarias a la tendencia, por ejemplo, MACD.
  2. Se añadirá un indicador de volumen de operaciones para evitar una falsa ruptura, por ejemplo, OBV.
  3. Optimice los períodos de EMA o utilice el EMA adaptativo.
  4. Optimiza dinámicamente los parámetros utilizando modelos de aprendizaje automático como bolsas de palabras.
  5. Agregue la predicción del modelo para el stop loss y take profit adaptativos.

Conclusión

La estrategia de retroceso de la EMA construye un sistema de negociación utilizando tres EMA y establece stop loss y take profit basados en retrocesos de precios para automatizar la negociación. Controla eficazmente los riesgos comerciales y puede optimizarse ajustando parámetros basados en las condiciones del mercado.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-12-20 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/
// created by Space Jellyfish
//@version=4

strategy("EMA pullback strategy", overlay = true, initial_capital=10000, commission_value = 0.075)

target_stop_ratio = input(title="Take Profit Stop Loss ratio", type=input.float, defval=2.06, minval=0.5, maxval=100)
riskLimit_low =  input(title="lowest risk per trade", type=input.float, defval=0.008, minval=0, maxval=100)
riskLimit_high =  input(title="highest risk per trade", type=input.float, defval=0.02, minval=0, maxval=100)
//give up the trade, if the risk is smaller than limit, adjust position size if risk is bigger than limit

ema_pullbackLevel_period = input(title="EMA1 for pullback level Period", type=input.integer, defval=33, minval=1, maxval=10000)
ema_pullbackLimiit_period = input(title="EMA2 for pullback limit Period", type=input.integer, defval=165, minval=1, maxval=10000)
ema_trend_period = input(title="EMA3 for trend Period", type=input.integer, defval=365, minval=1, maxval=10000)

startDate = input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2018, minval=2008, maxval=2200)

inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

ema_pullbackLevel = ema(close, ema_pullbackLevel_period)
ema_pullbackLimit = ema(close, ema_pullbackLimiit_period)
ema_trendDirection = ema(close, ema_trend_period)

//ema pullback 
float pricePullAboveEMA_maxClose = na
float pricePullAboveEMA_maxHigh = na

float pricePullBelowEMA_minClose = na
float pricePullBelowMA_minLow = na

if(crossover(close, ema_pullbackLevel))
    pricePullAboveEMA_maxClose := close
    pricePullAboveEMA_maxHigh := high
else
    pricePullAboveEMA_maxClose := pricePullAboveEMA_maxClose[1]
    pricePullAboveEMA_maxHigh := pricePullAboveEMA_maxHigh[1]

if(close > pricePullAboveEMA_maxClose)
    pricePullAboveEMA_maxClose := close
if(high > pricePullAboveEMA_maxHigh)
    pricePullAboveEMA_maxHigh := high

if(crossunder(close, ema_pullbackLevel))
    pricePullBelowEMA_minClose := close
    pricePullBelowMA_minLow := low
else
    pricePullBelowEMA_minClose :=pricePullBelowEMA_minClose[1]
    pricePullBelowMA_minLow:=pricePullBelowMA_minLow[1]
    
if(close < pricePullBelowEMA_minClose)
    pricePullBelowEMA_minClose := close
if(low < pricePullBelowMA_minLow)
    pricePullBelowMA_minLow := low


long_strategy = crossover(close, ema_pullbackLevel) and pricePullBelowEMA_minClose < ema_pullbackLimit and ema_pullbackLevel>ema_trendDirection 
short_strategy = crossunder(close, ema_pullbackLevel) and pricePullAboveEMA_maxClose > ema_pullbackLimit and ema_pullbackLevel<ema_trendDirection


var open_long_or_short = 0// long = 10000, short = -10000, no open = 0

//check if position is closed
if(strategy.position_size == 0)
    open_long_or_short := 0
else
    open_long_or_short := open_long_or_short[1]

float risk_long = na
float risk_short = na
float stopLoss = na
float takeProfit = na
float entry_price = na

float entryContracts = 0



risk_long := risk_long[1]
risk_short := risk_short[1]
    
//open a position determine the position size
if (strategy.position_size == 0 and long_strategy and inDateRange)
    risk_long := (close - pricePullBelowMA_minLow) / close

    if(risk_long < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_long)/close
    
    if(risk_long > riskLimit_low)
        strategy.entry("long", strategy.long, qty = entryContracts, when = long_strategy)


    open_long_or_short := 10000
    
if (strategy.position_size == 0 and short_strategy and inDateRange)
    risk_short := (pricePullAboveEMA_maxHigh - close) / close
    if(risk_short < riskLimit_high)
        entryContracts := strategy.equity / close
    else
        entryContracts := (strategy.equity * riskLimit_high / risk_short)/close

    if(risk_short > riskLimit_low)
        strategy.entry("short", strategy.short, qty = entryContracts, when = short_strategy)

    
    open_long_or_short := -10000

//take profit / stop loss
if(open_long_or_short == 10000)

    stopLoss :=   strategy.position_avg_price*(1 - risk_long)
    takeProfit :=  strategy.position_avg_price*(1 + target_stop_ratio * risk_long)
    entry_price := strategy.position_avg_price
    strategy.exit("Long exit","long", limit = takeProfit , stop = stopLoss)
    
if(open_long_or_short == -10000)
    stopLoss :=  strategy.position_avg_price*(1 + risk_short)
    takeProfit :=  strategy.position_avg_price*(1 - target_stop_ratio * risk_short)
    entry_price := strategy.position_avg_price
    strategy.exit("Short exit","short", limit = takeProfit, stop = stopLoss)



plot(ema_pullbackLevel, color=color.aqua,  title="ema pullback level")
plot(ema_pullbackLimit, color=color.purple,  title="ema pullback limit")
plot(ema_trendDirection, color=color.white,  title="ema trend")

plot(entry_price, color = color.yellow, linewidth = 1, style = plot.style_linebr)
plot(stopLoss, color = color.red, linewidth = 1, style = plot.style_linebr)
plot(takeProfit, color = color.green, linewidth = 1, style = plot.style_linebr)





//

Más.