Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy - это количественная стратегия торговли, разработанная на основе идеи Джона Элерса о Zero Lag Exponential Moving Average (ZLEMA). Эта стратегия использует экспоненциальную скользящую среднюю как базовый индикатор и включает адаптивный метод мгновенного измерения частоты (IFM) для динамической оптимизации параметра периода экспоненциальной скользящей средней.
Основная идея этой стратегии происходит из теории фильтров нулевого задержки Джона Элерса. Хотя экспоненциальная скользящая средняя является широко известным техническим показателем, она по своей сути имеет проблему задержки.
В стратегии адаптивной нулевой задержки EMA мы используем методы мгновенного измерения частоты для адаптивной оптимизации параметра периода ZLEMA. IFM состоит из двух методов - метода косина и метода инфаз-квадрат, который может измерять доминирующий цикл колебаний цен. Отслеживая в режиме реального времени оптимальные периоды, рассчитанные этими двумя измерениями, мы динамически устанавливаем параметр периода ZLEMA, чтобы лучше соответствовать текущим условиям рынка.
Когда быстрая EMA (ZLEMA) пересекает медленную EMA снизу, генерируется длинный сигнал. Когда быстрая EMA пересекает ниже медленной EMA, запускается короткий сигнал. Это формирует торговую стратегию, аналогичную системе пересечения скользящей средней.
Стратегия адаптивной EMA с нулевой задержкой сочетает в себе фильтр с нулевой задержкой и оптимизацию адаптивного периода с следующими преимуществами:
В этой стратегии также есть некоторые риски:
Чтобы контролировать эти риски, нам необходимо полностью протестировать параметры в различных рыночных условиях, правильно корректировать SL/TP и имитировать среду торговли в режиме реального времени при обратных тестах.
Еще есть много возможностей для дальнейшей оптимизации этой стратегии:
С помощью этих средств оптимизации существует потенциал для дальнейшего улучшения показателя выигрыша, рентабельности, рискованных показателей стратегии.
Adaptive Zero Lag EMA успешно сочетает в себе фильтр нулевого задержки и оптимизацию динамического периода. Благодаря меньшему количеству параметров и простоте работы, он особенно подходит для трендовых рынков. В сочетании с правильным стоп-лосом, размером позиций и другими методами управления рисками его стабильность и прибыльность могут быть еще более повышены.
/*backtest start: 2024-01-19 00:00:00 end: 2024-02-18 00:00:00 period: 4h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy(title="Adaptive Zero Lag EMA v2", shorttitle="AZLEMA", overlay = true) src = input(title="Source", defval=close) Period = input(title="Period", defval = 20) adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Off") GainLimit = input(title="Gain Limit", defval = 10) Threshold = input(title="Threshold", type = float, defval=0.05, step=0.01) fixedSL = input(title="SL Points", defval=70) fixedTP = input(title="TP Points", defval=5) risk = input(title='Risk', defval=0.01, step=0.01) //############################################################################## //I-Q IFM //############################################################################# range = input(title="Max Period", defval=60, minval=8, maxval=100) PI = 3.14159265359 imult = 0.635 qmult = 0.338 inphase = 0.0 quadrature = 0.0 re = 0.0 im = 0.0 deltaIQ = 0.0 instIQ = 0.0 lenIQ = 0.0 V = 0.0 P = src - src[7] inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3]) quadrature := P[2] - qmult*P + qmult*nz(quadrature[2]) re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1]) im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1]) if (re!= 0.0) deltaIQ := atan(im/re) for i=0 to range V := V + deltaIQ[i] if (V > 2*PI and instIQ == 0.0) instIQ := i if (instIQ == 0.0) instIQ := nz(instIQ[1]) lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1]) //############################################################################## //COSINE IFM //############################################################################# s2 = 0.0 s3 = 0.0 deltaC = 0.0 instC = 0.0 lenC = 0.0 v1 = 0.0 v2 = 0.0 v4 = 0.0 v1 := src - src[7] s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1]) s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1]) if (s2 != 0) v2 := sqrt(s3/s2) if (s3 != 0) deltaC := 2*atan(v2) for i = 0 to range v4 := v4 + deltaC[i] if (v4 > 2*PI and instC == 0.0) instC := i - 1 if (instC == 0.0) instC := instC[1] lenC := 0.25*instC + 0.75*nz(lenC[1]) if (adaptive == "Cos IFM") Period := round(lenC) if (adaptive == "I-Q IFM") Period := round(lenIQ) if (adaptive == "Average") Period := round((lenC + lenIQ)/2) //############################################################################## //ZERO LAG EXPONENTIAL MOVING AVERAGE //############################################################################## LeastError = 1000000.0 EC = 0.0 Gain = 0.0 EMA = 0.0 Error = 0.0 BestGain = 0.0 alpha =2/(Period + 1) EMA := alpha*src + (1-alpha)*nz(EMA[1]) for i = -GainLimit to GainLimit Gain := i/10 EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1]) Error := src - EC if(abs(Error)<LeastError) LeastError := abs(Error) BestGain := Gain EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1]) plot(EC, title="EC", color=orange, linewidth=2) plot(EMA, title="EMA", color=red, linewidth=2) buy = crossover(EC,EMA) and 100*LeastError/src > Threshold sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold strategy.initial_capital = 50000 if (time>timestamp(2016, 1, 1 , 0, 0)) //LONG balance = strategy.initial_capital + strategy.netprofit lots = ((risk * balance)/fixedSL)*1 strategy.entry("BUY", strategy.long, qty=lots, oca_name="BUY", when=buy) strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP) //SHORT strategy.entry("SELL", strategy.short, qty=lots, oca_name="SELL", when=sell) strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)