
La estrategia de ruptura de precios de canal de adaptación uniforme es una estrategia de ruptura de línea larga que se basa en la media móvil de adaptación uniforme (AMA) y el rango de canal de adaptación para juzgar las señales de compra y venta. La estrategia utiliza la AMA para calcular la dirección de la tendencia del precio actual y combina el rango de canal de ajuste dinámico para encontrar señales de ruptura de precios para comprar y vender a su debido tiempo.
El indicador central de la estrategia es el promedio móvil adaptado mediano (AMA), cuya fórmula de cálculo para capturar la tendencia de los precios es:
AMA(t) = α(t-1) * P(t) + [1 - α(t-1)] * AMA(t-1)
P (t) es el precio actual y α (t) es la constante de fluctuación, cuyo rango de valores oscila entre 0 y 1. α (t) se ajusta de forma dinámica con ciertas reglas para controlar la sensibilidad de la AMA a los cambios de precio. En concreto, el valor de α (t) es proporcional a la amplitud de desviación entre la AMA y el precio en SNRT. La fórmula de SNRT es la siguiente:
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
Así, cuando la fluctuación de los precios aumenta, α ((t) aumentará, lo que hace que el AMA sea más sensible a los precios; cuando la fluctuación de los precios disminuye, α ((t) disminuirá, lo que hace que el AMA tenga una mayor suavidad.
Basado en la AMA, la estrategia crea un rango de canal adaptado para detectar señales de ruptura de precios. Las trayectorias superiores y inferiores del rango de canal son:
En la vía: H (t) = (1 + β)*H(t-1)) * AMA(t)
Baja vía: L (t) = (1 - β)*L(t-1)) * AMA(t)
donde β es un parámetro ajustable que controla el ancho de canal. Finalmente, la estrategia genera una señal de negociación observando si el precio se rompe en la vía ascendente o descendente:
Cuando el precio sube, hay que hacer más.
El precio de las acciones se ha reducido en los últimos meses.
Si no lo haces, no tienes nada.
La estrategia tiene las siguientes ventajas:
El uso de la AMA en lugar de la media móvil ordinaria permite una mayor flexibilidad para capturar las tendencias de los precios, especialmente en mercados con mucha volatilidad.
El rango del canal de adaptación se puede ajustar dinámicamente, ampliando el ancho del canal en caso de incertidumbre y estrechando el canal de seguimiento de precios en caso de tendencia clara.
El uso de señales de breakout en el precio permite capturar las señales en el inicio de la tendencia, con una mayor probabilidad de éxito.
La lógica de la estrategia es simple, clara, fácil de entender y implementar, adecuada para el comercio cuantitativo.
La estrategia también tiene los siguientes riesgos:
La configuración incorrecta de los parámetros AMA puede causar tendencias de precios erróneas o generar falsas señales.
Los parámetros de la vía de adaptación, como β, deben ajustarse con cuidado, de lo contrario, se producen transacciones demasiado frecuentes o tendencias de omisión.
Las señales de ruptura de precios son susceptibles de ser engañadas por falsas rupturas y deben filtrarse en combinación con más indicadores.
La estrategia en sí no tiene en cuenta la gestión de fondos y los mecanismos de suspensión de pérdidas, por lo que existe un cierto riesgo de pérdidas.
La estrategia puede ser optimizada en los siguientes aspectos:
Optimizar la forma en que se calcula el valor α de la AMA para que sea más sensible a los cambios en los precios.
Aumentar la confirmación adicional después de la ruptura del canal para evitar que una falsa ruptura genere una señal errónea.
Se filtran en combinación con indicadores de volumen de transacciones o volatilidad para asegurar la efectividad de las brechas.
Aumentar el mecanismo de seguimiento de los stop losses para bloquear los beneficios y controlar el riesgo.
Optimizar la administración de fondos y determinar la administración razonable de las posiciones de los diferentes activos.
La estrategia de ruptura de precios de canal de adaptación automática es una estrategia de ruptura de seguimiento de tendencias sencilla y práctica en general. Se adapta a las medias móviles para seguir la tendencia de los precios, y se complementa con la detección de señales de ruptura de canal de adaptación automática. La estrategia tiene ciertas ventajas, pero también existe un posible riesgo.
/*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)