이 전략은 Ehlers MESA 적응형 이동 평균에 기반하고 있으며 두 이동 평균 사이의 교차를 추적하는 트렌드 거래 전략을 설계했습니다. 빠른 선이 느린 선 위에 넘어가면 길고 빠른 선이 느린 선 아래에 넘어가면 짧습니다. 이것은 전형적인 이중 이동 평균 교차 전략입니다.
이 전략의 핵심은 두 개의 적응 이동 평균을 계산하는 것입니다. MAMA 선과 FAMA 선. MAMA 선은 다음과 같이 계산됩니다.
alpha = fl / dphase
alpha = iff(alpha < sl, sl, iff(alpha > fl, fl, alpha))
mama = alpha*src + (1 - alpha)*nz(mama[1])
여기서 fl는 빠른 한계, sl는 느린 한계, dphase는 단계 차이이다.
FAMA 선은 다음과 같이 계산됩니다.
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
FAMA 라인은 MAMA 라인의 낮은 통과 필터화 평형입니다.
이 전략은 MAMA와 FAMA 라인의 크기 관계를 비교하여 현재 시장이 상승 추세 또는 하락 추세인지 결정하고 이를 기반으로 거래 신호를 생성합니다.
이 전략은 다음과 같은 장점을 가지고 있습니다.
조정 가능한 이동 평균을 사용하며, 매개 변수는 고정된 수동 설정 매개 변수가 필요없이 시장 변화에 따라 자동으로 조정됩니다.
낮은 패스 필터 FAMA 라인은 가짜 브레이크를 필터링할 수 있습니다.
이중 이동 평균 디자인을 사용하면 중장기 트렌드를 추적 할 수 있습니다.
간단하고 명확한 전략 논리, 쉽게 이해하고 수정할 수 있습니다.
거래 신호를 명확하게 보여주는 시각적 지표
이 전략은 또한 몇 가지 위험을 안고 있습니다.
듀얼 라인 크로스오버 전략은 과도한 거래 신호를 생성할 수 있으므로 적절한 마감 및 간격 통제가 권장됩니다.
복잡한 MAMA 및 FAMA 계산, 잘못된 매개 변수 설정은 곡선 왜곡을 일으킬 수 있습니다.
적응 매개 변수는 과도한 장착으로 이어질 수 있으므로 다른 기술적 지표로 검증이 필요합니다.
이중선 교차로는 시간이 지연되어 트렌드 전환점을 놓칠 수 있습니다.
가짜 브레이크로 인한 스톱 로스 위험을 조심해야 합니다.
이 전략은 다음 영역에서 최적화 될 수 있습니다.
가장 좋은 빠른 제한과 느린 제한 조합을 찾기 위해 매개 변수 설정을 최적화합니다.
트레이드별로 엄격한 스톱 로스 통제에 스톱 로스 전략을 추가합니다.
MACD, RSI 등과 같은 다른 지표를 필터 신호에 추가하여 잘못된 브레이크를 피합니다.
트렌드 판단 지표를 추가하여 트렌드 반대 거래를 피합니다.
과도하게 빈번한 거래를 줄이기 위해 크로스오버 요구 사항을 조정하여 진입 속도를 최적화하십시오.
트렌드 강도에 따라 수익을 취하는 전략을 최적화하십시오.
최적의 매개 변수 조합을 찾기 위해 다양한 제품 간의 매개 변수 차이를 테스트합니다.
전체적으로 이것은 Ehlers MESA 적응 이동 평균을 사용하여 시각화 된 지표를 구축하고 이중 라인 크로스오버를 통해 거래 신호를 생성하는 전형적인 트렌드 다음 전략입니다. 전략은 적응 매개 변수, 잘못된 브레이크오프 필터링 및 시각화와 같은 장점이 있지만 시간 지연 및 과도한 거래와 같은 위험도 있습니다. 향후 개선은 매개 변수 최적화, 스톱 로스 전략, 신호 필터링 등을 통해 전략을 더욱 견고하게 할 수 있습니다.
/*backtest start: 2023-09-20 00:00:00 end: 2023-09-27 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 // @author LazyBear // // List of my public indicators: http://bit.ly/1LQaPK8 // List of my app-store indicators: http://blog.tradingview.com/?p=970 // strategy("Ehlers MESA Adaptive Moving Average [LazyBear with ekoronin fix]", shorttitle="EMAMA_LB (ekoronin fix)", overlay=false, calc_on_every_tick=true, precision=0) src=input(close, title="Source") fl=input(.4, title="Fast Limit") sl=input(.04, title="Slow Limit") pi = 3.1415926 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])) p1 = iff(im!=0 and re!=0, 2*pi/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) phase = 180/pi * 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) longSpike=mama>fama? 1:0 shortSpike=mama<fama? 1:0 plot(longSpike, title = "Mama Long", style=line, linewidth=1, color=yellow) plot(shortSpike, title = "Mama Short", style=line, linewidth=1, color=red) //possig = iff(reverse and pos == 1, -1, // iff(reverse and pos == -1, 1, pos)) if (longSpike) strategy.entry("Long", strategy.long) if (shortSpike) strategy.entry("Short", strategy.short)