Estrategia de negociación cruzada de media móvil doble

El autor:¿ Qué pasa?, Fecha: 2023-12-27 16:07:49
Las etiquetas:

img

Resumen general

Esta estrategia genera señales de compra y venta basadas en la cruz de oro y la cruz de muerte de los promedios móviles. Específicamente, utiliza una media móvil exponencial de 5 días (EMA) y una media móvil exponencial doble de 34 días (DEMA). Cuando la EMA a corto plazo de 5 días cruza por encima de la DEMA a largo plazo de 34 días, se genera una señal de compra. Cuando la EMA a corto plazo de 5 días cruza por debajo de la DEMA a largo plazo de 34 días, se genera una señal de venta.

Estrategia lógica

  1. Calcular la EMA de 5 días y la DEMA de 34 días
  2. Generar una señal de compra cuando la EMA de 5 días a corto plazo cruce por encima de la DEMA de 34 días a largo plazo
  3. Generar una señal de venta cuando la EMA de 5 días a corto plazo cruza por debajo de la DEMA de 34 días a largo plazo
  4. Opción de negociación únicamente durante sesiones de negociación específicas
  5. Opción para utilizar el stop loss de seguimiento

Esta estrategia combina los factores de cruce de la media móvil y la media móvil para un rendimiento estable. Las medias móviles como indicador de tendencia pueden identificar eficazmente las tendencias del mercado; La combinación de EMA y DEMA puede suavizar eficazmente los datos de precios para generar señales comerciales; Los cruces entre las medias móviles a corto y largo plazo pueden proporcionar señales comerciales tempranas cuando hay cambios importantes de tendencia.

Análisis de ventajas

  1. Lógica estratégica simple y clara, fácil de entender e implementar
  2. El uso combinado de medias móviles considera tanto el juicio de tendencia como la suavización de los datos de precios
  3. Los cruces entre las medias móviles a corto y a largo plazo pueden proporcionar señales tempranas en los principales puntos de inflexión
  4. Los parámetros se pueden optimizar para ajustar las longitudes de media móvil para diferentes productos y marcos de tiempo
  5. La integración de dos factores puede mejorar la estabilidad de la estrategia

Análisis de riesgos

  1. Más señales falsas pueden ocurrir en los mercados variados
  2. Las longitudes de media móvil inadecuadas pueden causar retraso en la señal
  3. Las horas de negociación incorrectas y los ajustes de stop loss pueden afectar a la rentabilidad de la estrategia

Estos riesgos pueden reducirse ajustando las longitudes de las medias móviles, optimizando las horas de negociación y estableciendo un stop loss razonable.

Direcciones de optimización

  1. Ajustar los parámetros de longitud media móvil para diferentes productos de negociación y plazos
  2. Optimizar los parámetros de la sesión de negociación para operar durante los períodos más activos
  3. Comparación de pérdidas de parada fijas y pérdidas de parada posteriores
  4. Efecto de las diferentes opciones de fuente de precios en la estrategia

Conclusión

Esta estrategia genera señales comerciales a través de cruces de promedios móviles dobles, combinados con técnicas de seguimiento de tendencias y suavización de datos. Es una estrategia de seguimiento de tendencias simple y práctica. A través del ajuste de parámetros y el refinamiento de la lógica, puede adaptarse a diferentes productos y marcos de tiempo, proporcionar señales tempranas en cambios importantes de tendencia y evitar señales falsas. Vale la pena recomendar y aplicar.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",false]]
*/

//@version=2
strategy(title='[STRATEGY][RS]MicuRobert EMA cross V2', shorttitle='S', overlay=true)
USE_TRADESESSION = input(title='Use Trading Session?', type=bool, defval=true)
USE_TRAILINGSTOP = input(title='Use Trailing Stop?', type=bool, defval=true)
trade_session = input(title='Trade Session:',  defval='0400-1500', confirm=false)
istradingsession = not USE_TRADESESSION ? false : not na(time('1', trade_session))
bgcolor(istradingsession?gray:na)
trade_size = input(title='Trade Size:', type=float, defval=1)
tp = input(title='Take profit in pips:', type=float, defval=55.0) * (syminfo.mintick*10)
sl = input(title='Stop loss in pips:', type=float, defval=22.0) * (syminfo.mintick*10)
ma_length00 = input(title='EMA length:', defval=5)
ma_length01 = input(title='DEMA length:',  defval=34)
price = input(title='Price source:', defval=open)

//  ||--- NO LAG EMA, Credit LazyBear:  ---||
f_LB_zlema(_src, _length)=>
    _ema1=ema(_src, _length)
    _ema2=ema(_ema1, _length)
    _d=_ema1-_ema2
    _zlema=_ema1+_d
//  ||-------------------------------------||

ma00 = f_LB_zlema(price, ma_length00)
ma01 = f_LB_zlema(price, ma_length01)
plot(title='M0', series=ma00, color=black)
plot(title='M1', series=ma01, color=black)

isnewbuy = change(strategy.position_size)>0 and change(strategy.opentrades)>0
isnewsel = change(strategy.position_size)<0 and change(strategy.opentrades)>0

buy_entry_price = isnewbuy ? price : buy_entry_price[1]
sel_entry_price = isnewsel ? price : sel_entry_price[1]
plot(title='BE', series=buy_entry_price, style=circles, color=strategy.position_size <= 0 ? na : aqua)
plot(title='SE', series=sel_entry_price, style=circles, color=strategy.position_size >= 0 ? na : aqua)
buy_appex = na(buy_appex[1]) ? price : isnewbuy ? high : high >= buy_appex[1] ? high : buy_appex[1]
sel_appex = na(sel_appex[1]) ? price : isnewsel ? low : low <= sel_appex[1] ? low : sel_appex[1]
plot(title='BA', series=buy_appex, style=circles, color=strategy.position_size <= 0 ? na : teal)
plot(title='SA', series=sel_appex, style=circles, color=strategy.position_size >= 0 ? na : teal)
buy_ts = buy_appex - sl
sel_ts = sel_appex + sl
plot(title='Bts', series=buy_ts, style=circles, color=strategy.position_size <= 0 ? na : red)
plot(title='Sts', series=sel_ts, style=circles, color=strategy.position_size >= 0 ? na : red)

buy_cond1 = crossover(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
buy_cond0 = crossover(price, ma00) and ma00 > ma01 and (USE_TRADESESSION ? istradingsession : true)
buy_entry = buy_cond1 or buy_cond0
buy_close = (not USE_TRAILINGSTOP ? low <= buy_entry_price - sl: low <= buy_ts) or high>=buy_entry_price+tp//high>=last_traded_price + tp or low<=last_traded_price - sl //high >= hh or 
sel_cond1 = crossunder(ma00, ma01) and (USE_TRADESESSION ? istradingsession : true)
sel_cond0 = crossunder(price, ma00) and ma00 < ma01 and (USE_TRADESESSION ? istradingsession : true)
sel_entry = sel_cond1 or sel_cond0
sel_close = (not USE_TRAILINGSTOP ? high >= sel_entry_price + sl : high >= sel_ts) or low<=sel_entry_price-tp//low<=last_traded_price - tp or high>=last_traded_price + sl //low <= ll or 

strategy.entry('buy', long=strategy.long, qty=trade_size, comment='buy', when=buy_entry)
strategy.close('buy', when=buy_close)
strategy.entry('sell', long=strategy.short, qty=trade_size, comment='sell', when=sel_entry)
strategy.close('sell', when=sel_close)

Más.