動的マルチ期間指数移動平均クロスオーバー戦略とドローダウン最適化システム

EMA MA SMA RSI
作成日: 2024-12-27 15:29:38 最終変更日: 2024-12-27 15:29:38
コピー: 1 クリック数: 415
1
フォロー
1617
フォロワー

動的マルチ期間指数移動平均クロスオーバー戦略とドローダウン最適化システム

概要

この戦略は、複数の指数移動平均 (EMA) クロスオーバーとリトレースメント最適化に基づく定量取引システムです。 EMA5、EMA8、EMA13、EMA21、EMA50の5つの移動平均線を使用し、異なる期間の移動平均線間の相互関係や価格と移動平均線の位置関係を観測することで、ポジションの一括オープンと動的なクローズを実現します。この戦略は資金管理システムを採用し、ポジションを 20%、40% などの異なる割合に分割し、さまざまな市場シグナルに応じて徐々にポジションを増やしたり減らしたりします。

戦略原則

この戦略のコアロジックには、3 つの主要なエントリー条件と 2 つのエグジット条件が含まれます。

  1. ポジションを開くためのシグナルには、EMA5がEMA8を横切るときに20%のポジションを開く、EMA5がEMA13を横切るときに20%のポジションを追加する、EMA8がEMA21を横切るときに40%のポジションを追加するなどがあります。
  2. リトレースメント最適化システム: 価格が EMA50 に達したときに 20% のポジションを開き、価格が再び EMA50 を突破したときに 20% を追加します。
  3. 終値シグナル: EMA5がEMA13を下回った場合、ポジションの50%をクローズします。EMA8がEMA21を下回った場合、すべてのポジションをクローズします。
  4. リスク管理: 価格、EMA5、EMA8が同時にEMA50を下回った場合、直ちにすべてのポジションをクリアします。

戦略的優位性

  1. 複数の確認メカニズム:複数の移動平均クロスオーバーを通じて、より信頼性の高い取引シグナルを提供します。
  2. 動的ポジション管理:シグナルの強さに応じて異なるポジション比率を使用し、リスクを効果的に管理します。
  3. リトレースメント最適化設計: リトレースメント買いのサポートレベルとしてEMA50を使用し、エントリー精度を向上させる
  4. 柔軟な清算メカニズム:利益を維持しながらリトレースメントを制御するために段階的な清算戦略を採用する
  5. 完璧なリスク管理:急激な下落による損失を防ぐために明確なストップロス条件を設定します

戦略リスク

  1. 移動平均ヒステリシス:移動平均自体にヒステリシスがあり、信号遅延を引き起こす可能性がある。
  2. 不安定な市場のリスク: 横ばいで不安定な市場では、偽のブレイクアウトが頻繁に発生する可能性があります。
  3. 過剰取引リスク: 複数の開始条件により過剰取引につながる可能性がある
  4. 執行コスト: 頻繁に取引を行うと取引手数料が高くなる場合があります
  5. システミックリスク: 不安定な市場でポジションを閉じるには遅すぎる可能性がある

戦略最適化の方向性

  1. トレンドフィルターの導入: ADXなどのトレンドインジケーターを追加して、強いトレンドがある場合にのみ取引を実行できます。
  2. ポジション管理の最適化: ボラティリティに基づいてポジションサイズを動的に調整
  3. 価格パターン認識を追加: Kラインパターンを組み合わせてエントリー精度を向上
  4. ストッププロフィットメカニズムの改善:動的なストッププロフィットラインを設定して、利益をより確実に確保できます。
  5. 市場センチメント指標の追加: RSIやその他の指標を導入して市場の状況をフィルタリングする

要約する

この戦略は、複数の移動平均クロスオーバーとリトレースメント最適化システムを通じて、比較的完全な取引システムを構築します。その利点は、複数の確認メカニズムと柔軟なポジション管理にありますが、移動平均の遅れなどの固有の欠陥もあります。トレンド フィルターなどの最適化手法を導入することで、戦略の安定性と収益性をさらに向上させることができます。この戦略は明らかなトレンドがある市場での使用に適しており、トレーダーは実際の市場状況に基づいてパラメータを最適化する必要があります。

ストラテジーソースコード
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-25 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Strategy with Price & EMA5 & EMA8 < EMA50 Condition", overlay=true, margin_long=100, initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// ==============================
// INPUTS
// ==============================
lengthEMA5 = input.int(5, "EMA5 Length")
lengthEMA8 = input.int(8, "EMA8 Length")
lengthEMA13 = input.int(13, "EMA13 Length")
lengthEMA21 = input.int(21, "EMA21 Length")
lengthEMA50 = input.int(50, "EMA50 Length")

// Tam pozisyon boyutu (örnek: 100 birim)
full_position = 100.0 
qty20 = full_position * 0.2
qty40 = full_position * 0.4

// ==============================
// EMA HESAPLAMALARI
// ==============================
ema5 = ta.ema(close, lengthEMA5)
ema8 = ta.ema(close, lengthEMA8)
ema13 = ta.ema(close, lengthEMA13)
ema21 = ta.ema(close, lengthEMA21)
ema50 = ta.ema(close, lengthEMA50)

// ==============================
// KESİŞİMLERİ TESPİT FONKSİYONLARI
// ==============================
crossUp(src1, src2) => ta.crossover(src1, src2)
crossDown(src1, src2) => ta.crossunder(src1, src2)

// ==============================
// STRATEJİ KOŞULLARI
// ==============================

// Adım 1: EMA5, EMA8’i yukarı keserse %20’lik alım
step1_condition = crossUp(ema5, ema8)

// Adım 2: EMA5, EMA8’i yukarı kestikten sonra EMA5, EMA13’ü de yukarı keserse %20 daha alım
step2_condition = crossUp(ema5, ema13)

// Adım 3: EMA8, EMA21’i yukarı keserse %40 alım
step3_condition = crossUp(ema8, ema21)

// Çıkış koşulları:
// EMA5, EMA13’ü aşağı keserse pozisyonun %50’sini kapat.
// EMA8, EMA21’i aşağı keserse tüm pozisyonu kapat.
half_close_condition = crossDown(ema5, ema13)
full_close_condition = crossDown(ema8, ema21)

// Düşüşlerde EMA50'ye dokunma -> %20 alım
pullback_condition = low <= ema50 or close <= ema50

// Fiyat tekrar EMA50'nin üzerine çıkarsa -> %20 alım
above_ema50_condition = crossUp(close, ema50)

// Yeni ek koşul:  
// Fiyat, EMA5 ve EMA8’in herbiri EMA50’nin altındaysa tüm pozisyon kapat.
// Bu durum tam bir düşüş senaryosunu işaret eder.
all_below_condition = (close < ema50) and (ema5 < ema50) and (ema8 < ema50)

// Mevcut pozisyon büyüklüğü
pos_size = strategy.position_size

// ==============================
// POZİSYON GİRİŞLERİ
// ==============================
if (step1_condition and pos_size == 0)
    strategy.entry("Step1", strategy.long, qty=qty20)

if (step2_condition and strategy.opentrades < 2)
    strategy.entry("Step2", strategy.long, qty=qty20)

if (step3_condition and strategy.opentrades < 3)
    strategy.entry("Step3", strategy.long, qty=qty40)

// Pullback: Fiyat EMA50'ye temas ederse ve pozisyon yoksa %20 alım
if (pullback_condition and strategy.opentrades == 0)
    strategy.entry("Pullback", strategy.long, qty=qty20)

// Fiyat EMA50’nin üzerine çıkarsa ve pozisyon %100'e ulaşmamışsa %20 alım
if (above_ema50_condition and strategy.opentrades < 4)
    strategy.entry("Above50", strategy.long, qty=qty20)

// ==============================
// POZİSYON YÖNETİMİ (ÇIKIŞLAR)
// ==============================
if (all_below_condition and strategy.opentrades > 0)
    // Tüm pozisyonu kapat çünkü sert düşüş senaryosuna girildi
    strategy.close("Step3")
    strategy.close("Step2")
    strategy.close("Step1")
    strategy.close("Pullback")
    strategy.close("Above50")
else
    // Yarı kapatma (EMA5, EMA13 aşağı kesişimi)
    if (half_close_condition)
        totalTrades = strategy.opentrades
        // Öncelikle en son açılan en büyük pozisyonu kapatarak kademeli küçültme
        if (totalTrades >= 3)
            strategy.close("Step3")     // Bu 40% kapatır
        else if (totalTrades == 2)
            strategy.close("Step2")     // Bu 20% kapatır
        else if (totalTrades == 1)
            strategy.close("Step1")     // Bu da 20% kapatır (tamamen çıkar, ama basitlik için böyle)

    // Tam kapatma (EMA8, EMA21 aşağı kesişimi)
    if (full_close_condition)
        // Açık olan tüm pozisyonları kapat
        strategy.close("Step3")
        strategy.close("Step2")
        strategy.close("Step1")
        strategy.close("Pullback")
        strategy.close("Above50")

// ==============================
// GÖRSELLEŞTİRME
// ==============================
plot(ema5, "EMA5", color=color.new(color.yellow, 0))
plot(ema8, "EMA8", color=color.new(color.blue, 0))
plot(ema13, "EMA13", color=color.new(color.green, 0))
plot(ema21, "EMA21", color=color.new(color.red, 0))
plot(ema50, "EMA50", color=color.new(color.purple, 0))