이 전략은 트렌드 방향을 결정하고 트렌드 크로스오버에 따라 거래 신호를 생성하기 위해 EMA (엑스포넌셜 모닝 오브레어) 및 MAMA (MESA 어댑티브 모닝 오브레어) 지표에 기반합니다. EMA는 종종 시장 트렌드 방향을 판단하는 데 사용되며, MAMA는 시장 전환점을 더 정확하게 파악 할 수 있습니다. 둘 다 사용하면 전략의 성능을 향상시킬 수 있습니다.
빠른 EMA와 느린 EMA를 계산합니다. 각각 시장의 단기 및 장기 트렌드를 반영합니다.
MAMA와 FAMA 직선을 계산해 보세요. 적응적인 이동평균이죠.
빠른 EMA가 느린 EMA를 넘을 때 구매 신호가 생성됩니다.
빠른 EMA가 느린 EMA를 넘으면 판매 신호가 생성됩니다.
MAMA가 FAMA를 넘을 때 구매 신호가 생성됩니다.
MAMA가 FAMA 아래로 넘어가면 판매 신호가 생성됩니다.
MAMA와 FAMA의 크로스오버는 EMA 신호를 확인하거나 트렌드 전환을 조기에 감지하는 데 사용될 수 있습니다.
구체적으로, 전략은 먼저 빠른 EMA (fl) 와 느린 EMA (sl) 를 계산하여 각각 단기 및 장기적인 경향을 반영합니다.
다음으로 MAMA와 FAMA를 John Ehlers의 공식에 기초하여 계산합니다:
가격의 힐베르트 변환을 계산하고 신호의 단계 정보를 추출합니다.
단계 정보에 기초하여 순간 주파수 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)