Ehlers MESA適応移動平均に基づく取引戦略


作成日: 2023-09-28 15:37:13 最終変更日: 2023-09-28 15:37:13
コピー: 0 クリック数: 1233
1
フォロー
1621
フォロワー

概要

この戦略は,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線の大きさの関係を比較して,現在上昇傾向にあるか下降傾向にあるかを判断し,取引信号を生成する.

戦略的優位分析

この戦略の利点は以下の通りです.

  1. 適応移動平均を使用すると,パラメータは市場の変化に応じて自動的に調整され,固定パラメータを人工的に設定する必要はありません.

  2. 偽突破をフィルタリングする低通路フィルタ FAMA 線を追加します.

  3. 市場の中央の長線トレンドを追跡するために,2つの移動平均の設計を使用します.

  4. 戦略の論理はシンプルで明快で,理解し,修正しやすい.

  5. ビジュアル指数は直感的で,取引シグナルがはっきり見えます.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. 双線交差戦略は複数の取引シグナルを生成しやすいため,適切な間隔制御と撤退を推奨する.

  2. MAMAとFAMAの線は計算が複雑で,パラメータを正しく設定しないことが曲線の歪みに原因となる.

  3. 適応パラメータは,過度最適化につながる可能性があるので,他の技術指標と併せて検証する必要がある.

  4. 双線交差は時間遅れで,トレンド転換点を逃す可能性があります.

  5. 偽の突破による損失の危険に注意してください.

戦略最適化の方向性

この戦略は以下の方向から最適化できます.

  1. パラメータ設定を最適化して,最適の快制限,遅制限のパラメータ組み合わせを見つける.

  2. ストップ・ロスの策略を増やし,単一ストップ・ロスを厳しく管理する.

  3. MACD,RSIなどの他の指標のフィルター信号と組み合わせて,偽突破を避ける.

  4. 傾向判断の指標を増やして逆行を避ける.

  5. 入場ペースの最適化,二線交差の間隔要求の調整,過剰な取引の減少

  6. トレンドの強さに応じて異なるストップ方法を採用する.

  7. 異なる品種のパラメータ設定の違いをテストし,最適なパラメータ組み合わせを探します.

要約する

この戦略 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)