ダブルクロストレンドフォロー戦略:インデックス移動平均とMACDの協調取引システム

EMA MACD DIF DEA TP SL RR
作成日: 2025-01-17 16:06:16 最終変更日: 2025-01-17 16:06:16
コピー: 0 クリック数: 374
1
フォロー
1617
フォロワー

ダブルクロストレンドフォロー戦略:インデックス移動平均とMACDの協調取引システム

概要

この戦略は、移動平均と MACD のデュアルテクニカル指標を組み合わせたトレンド追跡取引システムです。これは主に、EMA9 移動平均と価格の交点、および MACD インジケーターの高速線 (DIF) と低速線 (DEA) の交点を通じて市場の動向を捉えます。同時に、この戦略は過去 5 つの K ラインに基づく適応型ストップロス方式を採用し、3.5 倍のリスク リターン比率を使用して利益目標を設定し、完全な取引システムを形成します。

戦略原則

戦略の核となるロジックは、ロングとショートの 2 つの方向に分かれています。

  1. ロング条件: 終値が EMA9 を下から上に突破し、MACD の DIF ラインが DEA ラインを下から上に横切ると、システムはロング シグナルを送信します。
  2. 空売り条件: 終値が上から下にEMA9を下回り、MACDのDIFラインが上から下にDEAラインを横切ると、システムは空売りシグナルを送信します。
  3. リスク管理:
    • ロングオーダーのストップロスは、過去5Kラインの最低点以下に設定されています。
    • ショート注文のストップロスは、過去5つのKラインの最高点より上に設定されています。
    • 利益目標はストップロス距離の3.5倍

戦略的優位性

  1. 二重確認メカニズム:移動平均と MACD の協調的な連携により、誤ったシグナルを効果的に除去し、取引の精度を向上させることができます。
  2. 適応型ストップロス: 最近の価格変動に基づいて設定されたストップロスレベルは、市場のボラティリティに応じて保護ポジションを自動的に調整できます。
  3. 明確なリスク・リターン比率:3.5倍の固定リスク・リターン設定により、長期的に安定した利益の獲得に貢献します。
  4. 戦略ロジックは明確です。エントリー条件とエグジット条件が明確で、理解しやすく、実行しやすいです。
  5. 強力な適応性: さまざまな市場状況に応じてパラメータを調整できます。

戦略リスク

  1. 不安定な市場のリスク: 横ばいで不安定な市場では偽のブレイクアウトが頻繁に発生し、継続的なストップロスにつながる可能性があります。
  2. スリッページリスク: 市場の動きが速い場合、実際のストップロス価格と利益価格が予想価格から外れることがあります。
  3. パラメータ感度: EMA と MACD の期間設定は、戦略のパフォーマンスに大きな影響を与えます。
  4. トレンド依存性: 明確なトレンドのない市場環境では、戦略のパフォーマンスが低下する可能性があります。

戦略最適化の方向性

  1. トレンド フィルターの追加: より長い期間のトレンド インジケーターを導入し、主要なトレンドの方向にのみポジションを開くことができます。
  2. 動的リスク倍率: 市場のボラティリティに基づいてリスクとリターンの比率を自動的に調整します。
  3. 時間フィルター: 流動性が低い期間を回避するために、取引期間フィルターを追加します。
  4. ポジション管理の最適化: 信号強度に応じてポジション比率を動的に調整できます。
  5. ボラティリティ インジケーターの導入: ストップ ロス距離を動的に調整するために使用されます。

要約する

この戦略は、テクニカル指標の二重確認と厳格なリスク管理を通じて、完全なトレンド追跡取引システムを構築します。この戦略は、市場環境にある程度依存しますが、合理的なパラメータ最適化とリスク管理を通じて、優れた適応性と安定性を発揮します。その後の最適化の方向性は、主にトレンド識別の精度とリスク管理のダイナミクスに焦点を当て、戦略の全体的なパフォーマンスを向上させます。

ストラテジーソースコード
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

// =======================
// @version=6
strategy(title="MACD + EMA9 3 h",
     shorttitle="MACD+EMA9+StopTP_5candles",
     overlay=true,
     initial_capital=100000,    // Ajuste conforme desejar
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=200)      // Ajuste % de risco ou quantidade

// ----- Entradas (Inputs) -----
emaLen          = input.int(9,     "Período da EMA 9", minval=1)
macdFastLen     = input.int(12,    "Período MACD Rápido", minval=1)
macdSlowLen     = input.int(26,    "Período MACD Lento",  minval=1)
macdSignalLen   = input.int(9,     "Período MACD Signal", minval=1)
riskMultiplier  = input.float(3.5, "Fator de Multiplicação do Risco (TP)")
lookbackCandles = input.int(5,     "Quantidade de candles p/ Stop", minval=1)

// ----- Cálculo da EMA -----
ema9 = ta.ema(close, emaLen)

// ----- Cálculo do MACD -----
[macdLine, signalLine, histLine] = ta.macd(close, macdFastLen, macdSlowLen, macdSignalLen)
// DIF cruza DEA para cima ou para baixo
macdCrossover   = ta.crossover(macdLine, signalLine)   // DIF cruza DEA p/ cima
macdCrossunder  = ta.crossunder(macdLine, signalLine)  // DIF cruza DEA p/ baixo

// ----- Condições de Compra/Venda -----

// Compra quando:
// 1) Preço cruza EMA9 de baixo pra cima
// 2) MACD cruza a linha de sinal para cima
buySignal = ta.crossover(close, ema9) and macdCrossover

// Venda quando:
// 1) Preço cruza EMA9 de cima pra baixo
// 2) MACD cruza a linha de sinal para baixo
sellSignal = ta.crossunder(close, ema9) and macdCrossunder

// ----- Execução das ordens -----

// Identifica o menor e o maior preço dos últimos 'lookbackCandles' candles.
// A função ta.lowest() e ta.highest() consideram, por padrão, a barra atual também.
// Se você quiser EXCLUIR a barra atual, use low[1] / high[1] dentro do ta.lowest() / ta.highest().
lowestLow5  = ta.lowest(low, lookbackCandles)
highestHigh5= ta.highest(high, lookbackCandles)

// >>> Quando há sinal de COMPRA <<<
if (buySignal)
    // Fecha posição vendida, se existir
    strategy.close("Sell")
    // Entra comprado
    strategy.entry("Buy", strategy.long)
    
    // STOP: abaixo do menor preço dos últimos 5 candles
    stopPrice = lowestLow5
    // Risco = (preço de entrada) - (stop)
    // Note que strategy.position_avg_price só fica disponível a partir da barra seguinte.
    // Por isso, o exit costuma funcionar corretamente apenas na barra seguinte.
    // Para fins de teste, podemos usar 'close' como proxy do "entry" (ou aceitar essa limitação).
    // A forma "correta" de usar strategy.position_avg_price seria via calc_on_order_fills = true,
    // mas isso pode exigir algumas configurações adicionais.
    risk = strategy.position_avg_price - stopPrice
    
    // Take Profit = entrada + 2,5 * risco
    takeProfitPrice = strategy.position_avg_price + riskMultiplier * risk

    // Registra a saída (stop e alvo) vinculada à posição "Buy"
    strategy.exit("Exit Buy", "Buy", stop=stopPrice, limit=takeProfitPrice)

// >>> Quando há sinal de VENDA <<<
if (sellSignal)
    // Fecha posição comprada, se existir
    strategy.close("Buy")
    // Entra vendido
    strategy.entry("Sell", strategy.short)
    
    // STOP: acima do maior preço dos últimos 5 candles
    stopPrice = highestHigh5
    // Risco = (stop) - (preço de entrada)
    risk = stopPrice - strategy.position_avg_price
    
    // Take Profit = entrada - 2,5 * risco
    takeProfitPrice = strategy.position_avg_price - riskMultiplier * risk

    // Registra a saída (stop e alvo) vinculada à posição "Sell"
    strategy.exit("Exit Sell", "Sell", stop=stopPrice, limit=takeProfitPrice)

// ----- Plotagens visuais -----
plot(ema9, color=color.orange, linewidth=2, title="EMA 9")

plot(macdLine,       color=color.new(color.blue, 0),   title="MACD")
plot(signalLine,     color=color.new(color.red, 0),    title="Signal")
plot(histLine,       color=color.new(color.purple, 0), style=plot.style_histogram, title="Histogram")

// Só para auxiliar na visualização, vamos plotar a linha do lowestLow5 e highestHigh5
plot(lowestLow5,    color=color.new(color.lime, 70),  style=plot.style_line, title="Lowest 5 bars")
plot(highestHigh5,  color=color.new(color.fuchsia,70),style=plot.style_line, title="Highest 5 bars")