Estrategia de seguimiento de la media móvil dinámica

El autor:¿ Qué pasa?, Fecha: 2023-11-24 16:59:25
Las etiquetas:

img

Resumen general

La idea central de esta estrategia es utilizar la media móvil dinámica para el seguimiento de tendencias, establecer el stop loss y tomar ganancias, y combinar las técnicas de velas Heikin Ashi para el juicio de señales largas / cortas.

Principios

La estrategia primero calcula el indicador ATR, luego combina la fuente de precios de entrada y los parámetros para calcular la media móvil dinámica. Las señales largas / cortas se generan cuando el precio cruza por encima / por debajo de la media móvil dinámica. Mientras tanto, las posiciones de stop loss y take profit se establecen para rastrear los cambios de precios en tiempo real.

Específicamente, el indicador ATR y el parámetro nLoss se calculan primero. Luego, el precio del período actual y la posición de stop loss del período anterior se comparan para actualizar la línea de stop loss. Cuando el precio se rompe a través de la línea de stop loss del período anterior, se generan señales largas / cortas pos y colores correspondientes. Cuando se activan las señales comerciales, se trazan marcas de flechas. Finalmente, las posiciones se cierran según la lógica de stop loss / take profit.

Análisis de ventajas

La mayor ventaja de esta estrategia es el uso de promedios móviles dinámicos para rastrear los cambios de precios en tiempo real. Esto captura las tendencias mejor que los promedios móviles fijos tradicionales y reduce las posibilidades de stop loss. Además, la combinación de stop loss basados en ATR permite un ajuste flexible de la posición de stop loss basado en la volatilidad del mercado para controlar eficazmente los riesgos.

Riesgos y soluciones

El principal riesgo de esta estrategia es que el precio pueda dispararse significativamente, causando señales falsas cuando se alcanza el stop loss.

Las soluciones incluyen la optimización del período promedio móvil, el ajuste del coeficiente de ATR y stop loss para reducir la probabilidad de señales falsas.

Direcciones de optimización

La estrategia se puede optimizar en los siguientes aspectos:

  1. Prueba diferentes tipos y períodos de medias móviles para encontrar combinaciones óptimas de parámetros

  2. Optimizar el parámetro del período ATR para equilibrar la sensibilidad de stop loss

  3. Añadir filtros e indicadores adicionales para mejorar la calidad de la señal

  4. Ajustar los valores de stop loss/take profit para optimizar la relación riesgo-recompensa

Conclusión

La idea central de esta estrategia es utilizar promedios móviles dinámicos para rastrear los cambios de precios en tiempo real, utilizando el indicador ATR para establecer dinámicamente posiciones de stop loss, controlando estrictamente el riesgo mientras se rastrean las tendencias.


/*backtest
start: 2022-11-23 00:00:00
end: 2023-11-05 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT","stocks":0}]
*/

//@version=5
strategy(title='UT Bot v5', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 
//Edited and converted to @version=5 by SeaSide420 for Paperina
// Inputs
AllowBuy = input(defval=true, title='Allow Buy?')
AllowSell = input(defval=false, title='Allow Sell?')
h = input(false, title='Signals from Heikin Ashi Candles')
//revclose = input(defval=true, title='Close when reverse signal?')
Price = input(defval=open, title='Price Source (recommended OPEN to avoid repainting)')
smoothing = input.string(title="Moving Average Type", defval="HMA", options=["SMA", "EMA", "WMA", "HMA"])
MA_Period = input(2, title='This changes the MAPeriod')
a = input.float(1, title='This changes the sensitivity',step=0.1)
c = input(11, title='ATR Period')
TakeProfit = input.int(defval=50000, title='Take Profit ($)', minval=1)
StopLoss = input.int(defval=50000, title='Stop Loss ($)', minval=1)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, Price, lookahead=barmerge.lookahead_off) : Price
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2
pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ma_function(src, MA_Period) =>
    switch smoothing
        "SMA" => ta.sma(src, MA_Period)
        "EMA" => ta.ema(src, MA_Period)
        "WMA" => ta.wma(src, MA_Period)
        => ta.hma(src, MA_Period)
thema = ma_function(src, MA_Period)
above = ta.crossover(thema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, thema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
plot(thema,title="The M.A.",color=color.green,linewidth=2)
plot(xATRTrailingStop,title="The M.A.",color=color.red,linewidth=2)
plotshape(buy,  title = "Buy",  text = "Buy",  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny)
plotshape(sell, title = "Sell", text = "Sell", style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, size = size.tiny)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
strategy.close_all(when=strategy.openprofit>TakeProfit,alert_message="Close- TakeProfit", comment = "TP")
strategy.close_all(when=strategy.openprofit<StopLoss-(StopLoss*2),alert_message="Close- StopLoss", comment = "SL")
strategy.close("buy", when =  sell and AllowSell==false , comment = "close buy")
strategy.close("sell", when =  buy and AllowBuy==false, comment = "close sell")
strategy.entry("buy", strategy.long, when = buy and AllowBuy)
strategy.entry("sell", strategy.short, when = sell and AllowSell)

Más.