Эта стратегия основана на индикаторах EMA (экспоненциальный скользящий средний) и MAMA (адаптивный скользящий средний) для определения направления тренда и генерации торговых сигналов в соответствии с их перекрестками. EMA часто используется для оценки направления тренда рынка, в то время как MAMA может более точно фиксировать переломные моменты рынка. Использование обоих может улучшить эффективность стратегии.
Вычислить быструю и медленную среднюю среднюю среднюю среднюю, которые отражают краткосрочные и долгосрочные тенденции рынка соответственно.
Вычислите линии MAMA и FAMA, которые являются адаптивными скользящими средними.
Когда быстрая EMA пересекает медленную EMA, генерируется сигнал покупки.
Когда быстрая EMA переходит ниже медленной EMA, генерируется сигнал продажи.
Когда MAMA пересекает FAMA, генерируется сигнал покупки.
Когда MAMA переходит ниже FAMA, генерируется сигнал продажи.
Кроссовки MAMA и FAMA могут использоваться для подтверждения сигналов EMA или раннего обнаружения поворотов тренда.
В частности, в стратегии сначала рассчитывается быстрая (fl) и медленная (sl) EMA, отражающие краткосрочные и долгосрочные тенденции соответственно.
Затем он рассчитывает MAMA и FAMA на основе формулы Джона Элерса:
Вычислить трансформацию Хильберта цены и извлечь фазовую информацию сигнала.
Вычислить мгновенную частоту p на основе фазовой информации.
Вычислить весовой коэффициент α на основе значения p.
Расчет MAMA и FAMA на основе α.
Наконец, торговые сигналы генерируются на основе перекресток EMA и MAMA/FAMA:
Эта стратегия сочетает в себе преимущества показателей EMA и MAMA для повышения точности торговых сигналов.
Преимущества EMA:
Преимущества MAMA:
Преимущества совмещения:
Основные риски этой стратегии:
Решения:
Стратегия может быть оптимизирована в следующих аспектах:
Эта стратегия объединяет сильные стороны индикаторов EMA и MAMA для своевременного отслеживания тренда и захвата поворотов. Благодаря оптимизации параметров и контролю рисков, она может достичь повышенной скорости выигрыша и прибыльности.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMAMA strategy", overlay=true) //This entire strategy is courtesy of LazyBear for programming the original EMAMA system, I simply added a strategy element to everything to round things out. src=input(hl2, title="Source") fl=input(.5, title="Fast Limit") sl=input(.05, title="Slow Limit") sp = (4*src + 3*src[1] + 2*src[2] + src[3]) / 10.0 dt = (.0962*sp + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54) q1 = (.0962*dt + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54) i1 = nz(dt[3]) jI = (.0962*i1 + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54) jq = (.0962*q1 + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54) i2_ = i1 - jq q2_ = q1 + jI i2 = .2*i2_ + .8*nz(i2[1]) q2 = .2*q2_ + .8*nz(q2[1]) re_ = i2*nz(i2[1]) + q2*nz(q2[1]) im_ = i2*nz(q2[1]) - q2*nz(i2[1]) re = .2*re_ + .8*nz(re[1]) im = .2*im_ + .8*nz(im[1]) p1 = iff(im!=0 and re!=0, 360/atan(im/re), nz(p[1])) p2 = iff(p1 > 1.5*nz(p1[1]), 1.5*nz(p1[1]), iff(p1 < 0.67*nz(p1[1]), 0.67*nz(p1[1]), p1)) p3 = iff(p2<6, 6, iff (p2 > 50, 50, p2)) p = .2*p3 + .8*nz(p3[1]) spp = .33*p + .67*nz(spp[1]) phase = atan(q1 / i1) dphase_ = nz(phase[1]) - phase dphase = iff(dphase_< 1, 1, dphase_) alpha_ = fl / dphase alpha = iff(alpha_ < sl, sl, iff(alpha_ > fl, fl, alpha_)) mama = alpha*src + (1 - alpha)*nz(mama[1]) fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1]) pa=input(false, title="Mark crossover points") plotarrow(pa?(cross(mama, fama)?mama<fama?-1:1:na):na, title="Crossover Markers") fr=input(false, title="Fill MAMA/FAMA Region") duml=plot(fr?(mama>fama?mama:fama):na, style=circles, color=gray, linewidth=0, title="DummyL") mamal=plot(mama, title="MAMA", color=red, linewidth=2) famal=plot(fama, title="FAMA", color=green, linewidth=2) fill(duml, mamal, red, transp=70, title="NegativeFill") fill(duml, famal, green, transp=70, title="PositiveFill") ebc=input(false, title="Enable Bar colors") bc=mama>fama?lime:red barcolor(ebc?bc:na) longCondition = crossover(mama, fama) if (longCondition) strategy.entry("My Long Entry Id", strategy.long) shortCondition = crossunder(mama, fama) if (shortCondition) strategy.entry("My Short Entry Id", strategy.short)