この戦略は,Ehlers MESA自律移動平均に基づいています.これは,2つの平均の交差を追跡するトレンド取引戦略を設計しています.
この戦略の核心は,MAMA線とFAMA線の2つの自律移動平均を計算することです.そのうちの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は相差である。alphaは相差に応じて動的に調整し,自主的に平滑パラメータを実現する。
FAMA線計算の公式は以下の通りである.
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
FAMA線はMAMA線の低通波平滑線である.
戦略は,MAMA線とFAMA線の大きさの関係を比較して,現在上昇傾向にあるか下降傾向にあるかを判断し,取引信号を生成する.
この戦略の利点は以下の通りです.
適応移動平均を使用すると,パラメータは市場の変化に応じて自動的に調整され,固定パラメータを人工的に設定する必要はありません.
偽突破をフィルタリングする低通路フィルタ FAMA 線を追加します.
市場の中央の長線トレンドを追跡するために,2つの移動平均の設計を使用します.
戦略の論理はシンプルで明快で,理解し,修正しやすい.
ビジュアル指数は直感的で,取引シグナルがはっきり見えます.
この戦略にはいくつかのリスクがあります.
双線交差戦略は複数の取引シグナルを生成しやすいため,適切な間隔制御と撤退を推奨する.
MAMAとFAMAの線は計算が複雑で,パラメータを正しく設定しないことが曲線の歪みに原因となる.
適応パラメータは,過度最適化につながる可能性があるので,他の技術指標と併せて検証する必要がある.
双線交差は時間遅れで,トレンド転換点を逃す可能性があります.
偽の突破による損失の危険に注意してください.
この戦略は以下の方向から最適化できます.
パラメータ設定を最適化して,最適の快制限,遅制限のパラメータ組み合わせを見つける.
ストップ・ロスの策略を増やし,単一ストップ・ロスを厳しく管理する.
MACD,RSIなどの他の指標のフィルター信号と組み合わせて,偽突破を避ける.
傾向判断の指標を増やして逆行を避ける.
入場ペースの最適化,二線交差の間隔要求の調整,過剰な取引の減少
トレンドの強さに応じて異なるストップ方法を採用する.
異なる品種のパラメータ設定の違いをテストし,最適なパラメータ組み合わせを探します.
この戦略 overall は,典型的なトレンド追跡戦略であり,エラーズ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)