La estrategia de ruptura de canal de promedio móvil adaptativo es una estrategia de ruptura de tendencia basada en el promedio móvil adaptativo (AMA) y un rango de canal adaptativo para generar señales comerciales.
El indicador central de esta estrategia es el Adaptive Moving Average (AMA), que se utiliza para capturar la tendencia del precio.
El valor de las emisiones de gases de efecto invernadero es el valor de las emisiones de gases de efecto invernadero.
donde P (t) es el precio actual y α (t) es la constante de suavizado entre 0 y 1. α (t) se ajusta dinámicamente de acuerdo con ciertas reglas para controlar la sensibilidad de la AMA a los cambios de precio.
Las emisiones de gases de efecto invernadero se calcularán en función de las emisiones de gases de efecto invernadero.
Por lo tanto, a medida que aumentan las fluctuaciones de precios, α ((t) aumentará para hacer que el AMA sea más sensible; cuando las fluctuaciones disminuyen, α ((t) disminuirá para hacer que el AMA sea más suave.
Basada en el AMA, la estrategia construye un rango de canal adaptativo para detectar señales de ruptura de precios.
En la parte superior: H (t) = (1 + β*H (t-1)) * AMA (t)
En la parte inferior: L (t) = (1 - β*L (t-1)) * AMA (t)
Por último, la estrategia genera transacciones basadas en las rupturas de precios de los niveles del canal:
Entra largo cuando el precio se rompe por encima del nivel superior.
Entrar corto cuando el precio se rompe por debajo del nivel inferior.
De lo contrario, mantente en el piso.
Las ventajas de esta estrategia incluyen:
El AMA es más flexible para capturar las tendencias de precios en comparación con las medias móviles simples, especialmente en mercados volátiles.
El canal adaptativo puede ajustar dinámicamente su ancho, expandiéndose cuando la tendencia no está clara y estrechándose cuando surge una tendencia.
Las señales de ruptura de precios pueden capturar oportunamente la tendencia comienza con tasas de ganancia más altas.
La lógica es simple y clara, fácil de entender y automatizar para el comercio cuantitativo.
Los riesgos de esta estrategia incluyen:
Los parámetros de AMA incorrectos pueden pasar por alto las tendencias de los precios o generar señales falsas.
Los parámetros del canal adaptativo como β necesitan una puesta a punto cuidadosa, de lo contrario puede ocurrir demasiado whipsaw o tendencias perdidas.
Las rupturas de precios son susceptibles a falsas rupturas, lo que requiere más filtros.
La estrategia no incluye mecanismos de gestión de riesgos ni de stop loss.
La estrategia se puede optimizar mediante:
Mejorar el cálculo α para hacer que el AMA sea más sensible.
Añadir más confirmación después de los primeros brotes para evitar señales falsas.
Aplicar filtros como volumen o volatilidad para validar la validez de la ruptura.
Incorporación de un stop loss para bloquear las ganancias y controlar el riesgo.
Optimización del tamaño de las posiciones para diferentes clases de activos.
En resumen, la Estrategia de ruptura de canal de promedio móvil adaptativo es una estrategia de ruptura de tendencia simple y práctica. Utiliza el AMA flexible para rastrear las tendencias de precios y un canal adaptativo para detectar señales de ruptura. La estrategia tiene algunas ventajas, pero también riesgos potenciales.
/*backtest start: 2022-10-26 00:00:00 end: 2023-11-01 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // CryptoStatistical - 2019 // AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading // https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857 strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD) testStartYear = input(2019, "Backtest Start Year") testStartMonth = input(6, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=95) testPeriod() => true price = input(title='Price Source:', type=input.source, defval=close) ama = price hb = price lb = price // Static model parameters minfactor = 0. maxfactor = 1. deviation_max = 1. deviation_min = 1. beta_hb = 1. beta_lb = 1. snr = 1. normalized_atan= 0. alpha = 0.5 // Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1) // Sensitivity Lookback search for the best perdiod from 5 to 20 lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5) // Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5 beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1) offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001) // pi/2 pi2 = 1.5707963267948966 // Zero-lag resampled moving average (Durschner nwma) f_nwma(_src, _period) => fast = _period/2 lambda = _period/fast alpha = lambda * (_period - 1)/(_period - lambda) average1 = wma(_src,_period) average2 = wma(average1,fast) nwma = (1+alpha)*average1 - alpha*average2 ama := alpha[1]*price + (1-alpha[1])*nz(ama[1]) deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1]) deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1]) beta_hb := beta*deviation_max beta_lb := beta*deviation_min hb := (1 + beta_hb[1])*ama lb := (1 - beta_lb[1])*ama snr := if price > hb ((price - ama[1])/ama[1])/beta_lb else if price < lb -((price - ama[1])/ama[1])/beta_hb else 0 normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2) alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback) plot(ama, color=color.black) plot(hb, color=color.green) plot(lb, color=color.red) // Buy Condition Var bc = false // Sell Condition Var sc = false d = color.black // Buy Condition if(price > hb) bc := true d := color.green // Sell Condition if(price < lb) sc := true d := color.red if(testPeriod()) strategy.entry("Long", strategy.long, when = bc) strategy.entry("Short", strategy.short, when = sc) alertcondition(bc, title='BuyCondition', message='Buy') alertcondition(sc, title='SellCondition', message='Sell') plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0) plotshape(title='Sell', series=sc ? price * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)