指数関数移動平均に基づくモメンタムクロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-23 14:18:26 詳細はこちら
タグ:

img

概要

この戦略は,異なる期間のEMA線のクロスオーバーに基づいてトレンド方向を決定し,それに応じてロングとショートシグナルを生成する.主に2つの移動平均値 - 10日間のEMAと20日間のEMAを使用する. 10日間のEMAが20日間のEMAを下回ると,ショートシグナルがトリガーされる. 10日間のEMAが20日間のEMAを上回ると,ロングシグナルがトリガーされる.この戦略は中期取引戦略に属している.

戦略の原則

この戦略は,10日EMAと20日EMAを含む2つのEMA線を使用する. EMA線は価格の傾向を効果的に反映することができる. 短期EMA線が長期EMA線の上を横切ると,価格傾向が低下から上昇へと変化することを示す. 短期EMA線が長期EMA線を下に横切ると,価格傾向が上昇から低下へと変化することを示す. これは短い信号である.

この戦略は,価格変動の最大値と最小値を組み合わせて,一部の取引信号をフィルタリングする.取引信号は,価格変動が一定程度に達した後のみ起動する.これは,いくつかの誤った信号を一定程度フィルタリングすることができます.

特に,最大値と最小値が達成される時間を追跡することで,戦略は価格傾向が形成されているかどうかを判断する.実際の取引信号は,最大値または最小値がしばらく持続した後のみ起動する.

利点分析

この戦略には以下の利点があります.

  1. トレンド方向を決定するためにEMA線を使用することで,市場の動きを効果的に追跡することができます.
  2. 異なる期間の EMA ラインを組み合わせることで,中期における取引機会を把握できます.
  3. 極端な値で信号をフィルタリングすることで,ノイズがなくなり,取引機会を逃すことは避けられます
  4. 論理は単純で明快で 分かりやすく 修正できます
  5. パラメータは,異なる製品と貿易優遇に応じて調整可能で,高度な適応性を示しています

リスク分析

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

  1. EMA線自体は遅延効果があり,短期的なトレンド逆転を見逃す可能性があります.
  2. 騒音フィルタリングは不完全で,いくつかの間違った取引が発生する可能性があります
  3. パラメータは,異なる市場環境に適するように適切に調整する必要があります

リスクは以下の方法で軽減できます.

  1. EMA線遅れの問題を避けるため,信号確認のための他の指標を追加する
  2. 信号の信頼性を向上させるため,極値フィルタリング条件の最適化
  3. バックテストの結果に基づいてパラメータを調整して戦略を最適化

改善 に 関する 指示

この戦略は,次の側面においてさらに最適化することができる.

  1. 信号の正確性を向上させるためにMACDやKDなどの他の技術指標を組み込む
  2. 特定の製品に適した EMA ライン パラメータを最適化
  3. 価格変動をよりよく判断するために極端値パラメータを精査する
  4. 取引ごとに最大損失を制御するためにストップ・ロスのメカニズムを追加する
  5. 適応性を評価するために 戦略を異なる製品でテストする

概要

概要すると,このEMAクロスオーバー戦略は,シンプルで実践的なトレンドフォロー戦略である.主要トレンド方向を決定するためにEMA線を使用し,取引決定のための価格変動フィルタリングと組み合わせます.パラメータを理解し調整し,中期取引に適応することが簡単です.さらなる最適化により,これは長期的に保持する価値のある定量戦略になり得ます.


/*backtest
start: 2024-01-15 00:00:00
end: 2024-01-22 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("PierceMAStrat", overlay=true)

lenMA0 = input(title="Length 0",defval=2)
lenMA1=input(title="Length 1",defval=10)
lenMA2=input(title="Length 2", defval=20)
lenMA3 = input(title = "Length3", defval =50)




emaLen0 = ema(close, lenMA0)
emaLen1 = ema(close, lenMA1)
emaLen2 = ema(close, lenMA2)
emaLen3 = ema(close, lenMA3)

    
ascent = if emaLen1[1] < emaLen1[0]
    true
else
    false
    
descent = if emaLen1[1] > emaLen1[0]
    true
else
    false
    
TimeSinceAscensionStart = if ascent == true
    barssince(descent == true)
else
    0
    

StartUp = if TimeSinceAscensionStart < 1
    true
else
    false

StartDown = if TimeSinceAscensionStart < 1
    false
else
    true


AscentBarCounter = barssince(StartUp == true)

DescentBarCounter = barssince(StartDown == true)

MaxAscent = if AscentBarCounter[1] > AscentBarCounter[0] and AscentBarCounter[1] > 10
    true
else
    false
    
MaxDescent = if DescentBarCounter[1] > DescentBarCounter[0] and DescentBarCounter[1] > 5
    true
else
    false
    
longCond = if crossover(emaLen1, emaLen2) and barssince(MaxDescent == true) > 3
    true
else
    false
shortCond = if crossunder(emaLen1, emaLen2) and barssince(MaxAscent == true) > 3
    true
else
    false


//longCond = (crossover(emaLen1, emaLen2) and (emaLen2 > emaLen3))
//shortCond = crossunder(emaLen1, emaLen2) and (emaLen2 < emaLen3)



if longCond == true
    strategy.entry("LONG", strategy.long)

if shortCond == true
    strategy.entry("SHORT", strategy.short)
    


plotshape(series=MaxAscent, title="MaximaReached", style=shape.triangledown, location=location.abovebar, color=green, text="MaximaReached", size=size.small)
plotshape(series=MaxDescent, title="MinimaReached", style=shape.triangleup, location=location.belowbar, color=red, text="MinimaReached", size=size.small)
//plotshape(series=StartUp, title="StartUp", style=shape.triangleup, location=location.belowbar, color=red, text="StartUp", size=size.tiny)
//plotshape(series=StartDown, title="StartDown", style=shape.triangleup, location=location.belowbar, color=green, text="StartDown", size=size.tiny)

//plotshape(series=(crossover(emaLen1, emaLen3)), title="GBXOVER", style=shape.triangleup, location=location.belowbar, color=green, text="GBXO", size=size.small)
//plotshape(series=(crossover(emaLen2, emaLen3)), title="RBXOVER", style=shape.triangledown, location=location.abovebar, color=orange, text="RBXO", size=size.small)
//plotshape(series=(crossover(emaLen1, emaLen2)), title="GRXOVER", style=shape.triangledown, location=location.abovebar, color=teal, text="GRXO", size=size.small)
//plotshape(series=(crossunder(emaLen1, emaLen2)), title="GRXUNDER", style=shape.triangledown, location=location.abovebar, color=purple, text="GRXU", size=size.small)
//plotshape(series=(crossunder(emaLen1, emaLen3)), title="GBXOVER", style=shape.triangleup, location=location.belowbar, color=yellow, text="GBXU", size=size.small)
//plotshape(series=(crossunder(emaLen2, emaLen3)), title="RBXOVER", style=shape.triangledown, location=location.abovebar, color=yellow, text="RBXU", size=size.small)
    
//plotshape(convergence, color=lime, style=shape.arrowup, text="CROSS")
plot(emaLen1, color=green, transp=0, linewidth=2)
plot(emaLen2, color=red, transp=30, linewidth=2)
plot(emaLen3, color=blue, transp=30, linewidth=2)



もっと