Double Cross Trend Following-Strategie: Index Moving Average und MACD Collaborative Trading System

EMA MACD DIF DEA TP SL RR
Erstellungsdatum: 2025-01-17 16:06:16 zuletzt geändert: 2025-01-17 16:06:16
Kopie: 0 Klicks: 374
1
konzentrieren Sie sich auf
1617
Anhänger

Double Cross Trend Following-Strategie: Index Moving Average und MACD Collaborative Trading System

Überblick

Bei dieser Strategie handelt es sich um ein Trendverfolgungs-Handelssystem, das die dualen technischen Indikatoren „Gleitender Durchschnitt“ und „MACD“ kombiniert. Es erfasst hauptsächlich Markttrends durch den Schnittpunkt des gleitenden Durchschnitts EMA9 und des Preises sowie den Schnittpunkt der schnellen Linie (DIF) und der langsamen Linie (DEA) im MACD-Indikator. Gleichzeitig verwendet die Strategie eine adaptive Stop-Loss-Methode auf Grundlage der letzten 5 K-Linien und verwendet ein 3,5-faches Risiko-Rendite-Verhältnis zur Festlegung von Gewinnzielen, wodurch ein vollständiges Handelssystem entsteht.

Strategieprinzip

Die Kernlogik der Strategie gliedert sich in zwei Richtungen: lang und kurz:

  1. Long-Bedingungen: Wenn der Schlusskurs EMA9 von unten nach oben durchbricht und die DIF-Linie des MACD die DEA-Linie von unten nach oben kreuzt, sendet das System ein Long-Signal.
  2. Bedingungen für Leerverkäufe: Wenn der Schlusskurs von oben nach unten unter EMA9 fällt und die DIF-Linie des MACD die DEA-Linie von oben nach unten kreuzt, sendet das System ein Leerverkaufssignal.
  3. Risikomanagement:
    • Der Stop-Loss von Long-Orders wird unterhalb des tiefsten Punktes der vorherigen 5 K-Linien gesetzt
    • Der Stop-Loss für Short-Orders wird über dem höchsten Punkt der vorherigen 5 K-Linien gesetzt.
    • Das Gewinnziel liegt bei dem 3,5-fachen der Stop-Loss-Distanz

Strategische Vorteile

  1. Doppelter Bestätigungsmechanismus: Durch die koordinierte Zusammenarbeit von gleitendem Durchschnitt und MACD können falsche Signale effektiv herausgefiltert und die Genauigkeit von Transaktionen verbessert werden.
  2. Adaptiver Stop-Loss: Der auf Grundlage der jüngsten Preisschwankungen festgelegte Stop-Loss-Level kann die Schutzposition automatisch entsprechend der Marktvolatilität anpassen.
  3. Klares Rendite-Risiko-Verhältnis: Eine feste 3,5-fache Rendite-Risiko-Einstellung hilft dabei, langfristig stabile Gewinne zu erzielen.
  4. Die Strategielogik ist klar: Die Ein- und Ausstiegsbedingungen sind klar, leicht zu verstehen und umzusetzen.
  5. Starke Anpassungsfähigkeit: Parameter können an unterschiedliche Marktbedingungen angepasst werden.

Strategisches Risiko

  1. Risiko eines volatilen Marktes: In einem seitwärts gerichteten und volatilen Markt kann es häufig zu falschen Ausbrüchen kommen, die zu kontinuierlichen Stop-Loss-Aufträgen führen.
  2. Slippage-Risiko: In einem schnelllebigen Markt können die tatsächlichen Stop-Loss- und Gewinnpreise von den erwarteten abweichen.
  3. Parametersensitivität: Die Periodeneinstellungen von EMA und MACD haben einen großen Einfluss auf die Strategieleistung.
  4. Trendabhängigkeit: Strategien können in Marktumgebungen ohne klaren Trend eine schlechte Performance aufweisen.

Richtung der Strategieoptimierung

  1. Trendfilter hinzufügen: Sie können Trendindikatoren mit längeren Zeiträumen einführen und Positionen nur in Richtung des Haupttrends eröffnen.
  2. Dynamisches Risikomultiplikator: Passt das Risiko-Rendite-Verhältnis automatisch an die Marktvolatilität an.
  3. Zeitfilter: Fügen Sie einen Filter für den Handelszeitraum hinzu, um Zeiten geringer Liquidität zu vermeiden.
  4. Optimierung des Positionsmanagements: Das Positionsverhältnis kann dynamisch entsprechend der Signalstärke angepasst werden.
  5. Einführung des Volatilitätsindikators: Wird verwendet, um den Stop-Loss-Abstand dynamisch anzupassen.

Zusammenfassen

Diese Strategie baut durch doppelte Bestätigung technischer Indikatoren und striktes Risikomanagement ein vollständiges Trendverfolgungs-Handelssystem auf. Obwohl eine gewisse Abhängigkeit vom Marktumfeld besteht, weist die Strategie durch sinnvolle Parameteroptimierung und Risikomanagement eine gute Anpassungsfähigkeit und Stabilität auf. Nachfolgende Optimierungsrichtungen werden sich hauptsächlich auf die Genauigkeit der Trenderkennung und die Dynamik des Risikomanagements konzentrieren, um die Gesamtleistung der Strategie zu verbessern.

Strategiequellcode
/*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")