
Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy - это количественная торговая стратегия, основанная на концепции Zero Lag Exponential Moving Average, разработанной Эхлером. Стратегия использует индикаторные скользящие средние как базовые показатели и добавляет адаптивный метод измерения мгновенной частоты, чтобы динамически оптимизировать параметры цикличности индикаторных скользящих средних.
Основная идея этой стратегии была взята из теории фильтра нулевой задержки Джона Элерса. Индексная скользящая средняя, хотя и является широко известным техническим показателем, имеет врожденные проблемы с задержкой.
В стратегии EMA с адаптивным нулевым отставанием мы используем методы измерения частоты в реальном времени, чтобы адаптироваться к оптимизации циклических параметров для нулевой отсталой скользящей средней. Измерение частоты в реальном времени делится на два вида: ассигнования и позитивная сигнала, которые позволяют измерить ведущие циклы изменения ценовой последовательности. Мы отслеживаем в реальном времени наилучшие циклы, вычисленные этими двумя методами измерений, и динамически устанавливаем циклические параметры для нулевой отсталой скользящей средней, чтобы они были более соответствующими текущей рыночной среде.
Когда быстрая линия (нулевая отсталая скользящая средняя) проходит медленную линию (обычная скользящая средняя), делая больше, когда она проходит, делая пустоту, когда она проходит, таким образом формируя торговый сигнал, похожий на пересечение скользящей средней.
Стратегия EMA с нулевой задержкой адаптации сочетает в себе фильтры с нулевой задержкой и методы оптимизации цикла адаптации, имеющие следующие преимущества:
Стратегии EMA с нулевой отсталостью также имеют определенные риски, которые проявляются в следующем:
Чтобы контролировать эти риски, нам необходимо тщательно протестировать параметры в различных рыночных условиях, адекватным образом скорректировать стоп-стоп, а также проверить, насколько это возможно, моделируя реальную среду в обратном измерении.
Стратегия EMA по адаптации к нулевой отсталости имеет широкий простор для оптимизации, основные направления включают:
С помощью этих методов оптимизации, в дальнейшем, как ожидается, будут повышены показатели успеваемости, прибыльности, рискованности и т.д.
Стратегия 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)