この戦略は,エラーズMESAアダプティブ・ムービング・平均値に基づい,二つの移動平均値間のクロスオーバーを追跡するトレンド・トレーディング戦略を設計した.高速線がスローラインを越えると長くなって,高速線がスローラインを越えると短くなってしまいます.これは典型的な二重移動平均クロスオーバー戦略です.
この戦略の核心は,2つの適応移動平均を計算することである.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)