EMAとMAMA指標に基づく取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023年10月31日 14:20:56
タグ:

img

概要

この戦略は,トレンド方向を決定し,そのクロスオーバーに応じて取引信号を生成するために,EMA (指数関数移動平均値) とMAMA (MESA適応移動平均値) の指標をベースにしている.EMAはしばしば市場のトレンド方向を判断するために使用され,MAMAは市場のターニングポイントをより正確に把握することができる.両方を使用することで,戦略のパフォーマンスを改善することができます.

戦略の論理

  1. 市場における短期的および長期的動向を反映する高速EMAと遅いEMAを計算する.

  2. MAMA と FAMA の線を計算します.これらは適応移動平均線です.

  3. 速いEMAがスローEMAを横切ると,買い信号が生成されます.

  4. 速いEMAがスローEMAを下回ると,売り信号が生成されます.

  5. MAMAが FAMAを横切ると,買い信号が生成されます.

  6. MAMAが FAMAを下回ると,売り信号が生成されます.

  7. MAMAとFAMAのクロスオーバーは,EMA信号の確認またはトレンドターンの早期検出に使用できます.

具体的には,戦略はまず,短期の傾向と長期の傾向を反映した,速い EMA (fl) と遅い EMA (sl) を計算します.

MAMAとFAMAを計算します.

  1. 価格のヒルバート変換を計算し,信号の相情報を抽出する.

  2. 段階情報に基づいて瞬間の周波数 p を計算する.

  3. p値に基づいて,重量因子 α を計算する.

  4. MAMA と FAMA を α に基づいて計算する.

最後に,EMAとMAMA/FAMAのクロスオーバーに基づいて取引シグナルが生成されます.

  • EMAが上を横切ると長
  • EMAが低くなるとショート
  • MAMAが FAMAを横切ったとき
  • MAMAが FAMAを下回るときに短くなります

利点分析

この戦略は,EMAとMAMAの利点を組み合わせて,取引シグナルの精度を向上させる.

EMA の 利点

  • 価格データを効率的に調整し,ノイズを減らす
  • トレンドを少し遅らせながらも
  • 柔軟なパラメータで感度を調整する

MAMA の 利点:

  • 調整可能なパラメータ,手動で設定する必要はありません.
  • 傾向を早期に捉えるための迅速な反応
  • サポートとレジスタンスを正確に識別する

組み合わせる利点:

  • EMAは全体的な傾向を決定する
  • MAMA は 信号 を 確認 し, 早く ターン を 検知 する
  • 信号の精度と勝利率の向上

リスク分析

この戦略の主なリスクは

  • EMAとMAMAは遅れている指標で,エントリーシグナルには遅延やスライプがある可能性があります.
  • 異なる市場での頻繁なクロスオーバーが,混乱を引き起こす
  • パラメータの設定が正しくない場合,トレンドが欠落したり,シグナルが偽りになる

解決策:

  • 損失を制御するためにストップ損失を使用する
  • 適正 な 基準 を 選ん で,過度に 敏感 な こと を 避ける
  • 他の指標と組み合わせて信号を確認する

オプティマイゼーションの方向性

戦略は以下の側面で最適化できます.

  • シンボルの特徴に基づいて EMA 期間を最適化する
  • MAMA アルファ 感度により良い回転を捉える
  • 偽の信号を避けるためにMACD,RSIなどの他のフィルターを追加します.
  • ストップ・ロスをリスク制御に追加する
  • 最適なパラメータを見つけるためのバックテスト
  • 利益を最大化するために利益を取ることを自動化します

概要

この戦略は,トレンドをフォローし,タイミングでターンを取るために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)

もっと