Adaptive Moving Average Channel Breakout Strategy - это следующая за трендом стратегия выхода на рынок, основанная на Adaptive Moving Average (AMA) и адаптивном диапазоне каналов для генерации торговых сигналов.
Основным показателем этой стратегии является адаптивная скользящая средняя (AMA), которая используется для определения ценовой тенденции.
AMA (t) = α (t-1) * P (t) + [1 - α (t-1) ] * AMA (t-1)
где P (t) - текущая цена, а α (t) - постоянная сглаживания между 0 и 1. α (t) динамически регулируется в соответствии с определенными правилами для контроля чувствительности AMA к изменениям цены. В частности, α (t) пропорционален отклонению SNRT между AMA и ценой, которое рассчитывается как:
SNRT = (P(t) - AMA(t-1)) / AMA(t-1)
Таким образом, по мере увеличения колебаний цен α ((t) увеличивается, чтобы сделать AMA более чувствительным; когда колебания уменьшаются, α ((t) уменьшается, чтобы сделать AMA более плавным.
Основываясь на AMA, стратегия создает адаптивный диапазон каналов для обнаружения сигналов прорыва цены.
Верхний: H ((t) = (1 + β*H ((t-1)) * AMA ((t))
Нижнее: L ((t) = (1 - β*L ((t-1)) * AMA ((t))
В конце концов, стратегия генерирует сделки на основе ценовых прорывов уровней канала:
Введите длинный, когда цена превышает верхний уровень.
Входите в короткие позиции, когда цена опускается ниже нижнего уровня.
В противном случае, оставайтесь на месте.
Преимущества этой стратегии включают:
AMA более гибко отслеживает ценовые тенденции по сравнению с простыми скользящими средними, особенно на волатильных рынках.
Адаптивный канал может динамически регулировать свою ширину, расширяясь, когда тенденция неясна, и сужаясь, когда появляется тенденция.
Сигналы прорыва цены могут своевременно зафиксировать тренд, начинающийся с более высоких показателей выигрыша.
Логика проста и понятна, легко понять и автоматизировать для количественной торговли.
Риски этой стратегии включают:
Неправильные параметры AMA могут упускать тенденции цен или генерировать ложные сигналы.
Параметры адаптивного канала, такие как β, нуждаются в тщательной настройке, иначе может возникнуть слишком много випса или пропущенные тенденции.
Прорывы цен подвержены ложным прорывам, требуя больше фильтров.
Стратегия не включает в себя механизмы управления рисками или стоп-лосс.
Стратегия может быть оптимизирована путем:
Улучшение расчета α, чтобы сделать AMA более отзывчивым.
Добавляем дополнительное подтверждение после первоначального прорыва, чтобы избежать ложных сигналов.
Применение фильтров, таких как объем или волатильность, для проверки действительности прорыва.
Включение остановки потери для закрепления прибыли и контроля риска.
Оптимизация размеров позиций для различных классов активов.
В целом, адаптивная стратегия переменного среднего канала является простой и практичной стратегией переменного канала, следующей за трендом. Она использует гибкую АМА для отслеживания ценовых тенденций и адаптивный канал для обнаружения сигналов переменного канала. Стратегия имеет некоторые преимущества, но также потенциальные риски. Благодаря оптимизации, такой как настройка параметров, добавление фильтров и улучшение остановок, она может стать более надежной.
/*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)