Die Ressourcen sind geladen. Beförderung...

Multi-Zeitrahmen-Index bewegliche Durchschnitts-Kreuzstrategie

Schriftsteller:ChaoZhang, Datum: 2024-07-30 12:02:23
Tags:EMASLTPZentralbank

多时间周期指数移动平均交叉策略

Übersicht

Die Multi-Zeitrahmen-Index-Moving Average-Cross-Strategie ist ein automatisches Handelssystem, das auf EMA-Cross-Signalen basiert. Es generiert Handelssignale mit EMAs aus verschiedenen Zeitrahmen und kombiniert Stop-Loss- und Gewinnauflösungsmechanismen zur Risikomanagement. Die Strategie setzt hauptsächlich auf die Kreuzung zwischen schnellen EMAs und langsamen EMAs sowie höheren Zeitrahmen-EMAs, um potenzielle Handelschancen zu identifizieren.

Die Strategie

Der Kern der Strategie ist die Nutzung von EMAs für mehrere Zeitzyklen, um Markttrends zu erkennen und Handelssignale zu erzeugen.

  1. Die 9-Zyklus-EMA wird als Schnelllinie, die 50-Zyklus-EMA als langsame Linie und die 100-Zyklus-EMA auf einem 15-Minuten-Zeitrahmen als höhere Zeitrahmen-Referenzlinie verwendet.

  2. Die Bedingungen für den Signalkauf:

    • Ein schneller EMA überschreitet einen langsamen EMA, wobei ein schneller EMA über einem höheren Zeitrahmen liegt; oder
    • Die schnelle EMA trägt eine höhere EMA-Zeitrahmen.
  3. Die Bedingungen für den Verkauf:

    • Die schnelle EMA geht unterhalb der langsamen EMA und die schnelle EMA liegt unterhalb der höheren Zeitrahmen-EMA; oder
    • Die schnelle EMA geht unterhalb der höheren EMA-Zeitrahmen.
  4. Transaktionsmanagement:

    • Feststehende Stop-Loss (SL) und Gewinnziele (TP) werden festgelegt.
    • Wenn der Preis das erste Gewinnziel (TP1) erreicht, wird die 25%ige Position ausgeglichen und der Stop-Loss in die Kapitalanlage verschoben.
    • Die restlichen Positionen werden bis zum zweiten Gewinnziel (TP2) oder zum Stop-Loss weitergeführt.
  5. Zeitkontrolle:

    • Sie können bestimmte Handelszeiten und -tage festlegen.

Strategische Vorteile

  1. Multi-Zeitrahmen-Analyse: Die Kombination von EMAs mit verschiedenen Zeitrahmen hilft, falsche Signale zu reduzieren und die Qualität der Transaktionen zu verbessern.

  2. Trendverfolgung: Durch EMA-Kreuzungen und Positionsbeziehungen können Markttrends effektiv erfasst werden.

  3. Risikomanagement: Durch die Einführung von einem festen Stop-Loss- und Profit-Fall-Strategie wird der potenzielle Verlust begrenzt und der Gewinn kann weiter steigen.

  4. Flexibilität: EMA-Parameter, Stop-Loss- und Gewinnniveaus können je nach Markt und Handelsstil angepasst werden.

  5. Automatisierung: Strategien können vollständig automatisierte Transaktionen über die TradingView-Plattform und PineConnector ermöglichen.

  6. Zeitmanagement: Es können spezifische Handelszeiten und -tage festgelegt werden, um zu vermeiden, dass man in einem ungünstigen Marktumfeld handelt.

Strategische Risiken

  1. Verzögerung: Die EMA ist ein verzögerter Indikator, der möglicherweise nicht rechtzeitig in stark schwankenden Märkten reagiert.

  2. Falsches Signal: In den Quermärkten kann die EMA-Kreuzung häufige Falschsignale erzeugen, was zu Überhandelungen führt.

  3. Feste Stop Loss: Stopps mit einer festen Punktzahl sind unter Umständen nicht für alle Marktbedingungen geeignet und können manchmal zu groß oder zu klein sein.

  4. Abhängig von historischen Daten: Die Wirksamkeit der Strategie hängt stark vom Marktverhalten während der Rückprüfung ab, und die zukünftige Performance kann unterschiedlich sein.

  5. Marktanpassungsfähigkeit: Die Strategie funktioniert gut für einige Währungspaare, kann aber schlecht für andere Währungspaare wirken.

Strategische Optimierung

  1. Anpassung der Dynamikparameter: Berücksichtigen Sie die Anpassung des EMA-Zyklus, des Stop-Loss- und des Gewinnniveaus anhand der Dynamik der Marktfluktuation.

  2. Zusätzliche Filterbedingungen: Einführung zusätzlicher Technischer Indikatoren oder Marktgefühlsindikatoren, um Handelssignale zu filtern und falsche Signale zu reduzieren.

  3. Verbesserte Stop-Loss-Strategien: Tracking-Stopps oder dynamische Stopps auf Basis von ATR werden realisiert, um sich besser an Marktfluktuationen anzupassen.

  4. Optimierte Handelszeiten: Eine detailliertere Zeitanalyse, um die besten Handelszeiten und -termine zu finden.

  5. Erhöhung der Handelsvolumenverwaltung: Anpassung der Positionsgröße an Marktfluktuation und Kontorisiko.

  6. Binäre Korrelationsanalyse: Betrachtet die Korrelation zwischen mehreren Währungspaaren und vermeidet eine übermäßige Exposition gegenüber ähnlichem Marktrisiko.

  7. Integration von maschinellem Lernen: Optimierung der Parameterwahl und Signalgenerierung mit Hilfe von maschinellen Lernalgorithmen.

Zusammenfassung

Die Multi-Zeitrahmen-Index-Moving Average-Cross-Strategie ist ein automatisiertes Handelssystem, das Trendverfolgung und Risikomanagement kombiniert. Durch die Nutzung von EMA-Cross-Signalen für verschiedene Zeitrahmen zielt die Strategie darauf ab, Markttrends zu erfassen und zu einem angemessenen Zeitpunkt zu handeln. Obwohl die Strategie unter bestimmten Marktbedingungen gut funktioniert, bestehen einige inhärente Risiken und Einschränkungen. Um die Stabilität und Anpassungsfähigkeit der Strategie weiter zu verbessern, kann die Einführung von Dynamikparameteranpassungen, zusätzlichen Filterbedingungen und komplexeren Risikomanagementtechniken in Betracht gezogen werden.


/*backtest
start: 2023-07-30 00:00:00
end: 2024-07-29 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Miles Multi TF EMA Strategy v 1", overlay=true)

Fast = input.int(9, "Fast EMA")
Xslow = input.int(50, "Slow EMA")

var bool inTrade = false // Ensure inTrade is declared and initialized
var int tradeDirection = 0
var float buy_slPrice = na
var float buy_tp1Price = na
var float buy_tp2Price = na
var float sell_slPrice = na
var float sell_tp1Price = na
var float sell_tp2Price = na
var bool tp1Hit = false
var bool buytp1Hit = false
var bool selltp1Hit = false
var float entryPrice = na
var float lastSignalBar = na
fastEMA = ta.ema(close, Fast)
XslowEMA = ta.ema(close, Xslow)
var int step = 0

// Example SL and TP settings (adjust according to your strategy)
slPips = input.int(150, "Stop Loss")
tp1Pips = input.int(75, "Take Profit 1")
tp2Pips = input.int(150, "Take Profit 2")
beoff = input.int(25, "Breakeven Offset")

// Define the higher time frame
higherTimeFrame = input.timeframe("15", "Higher Timeframe EMA")

// Fetch the EMA from the higher time frame
higherTimeFrameEMA = request.security(syminfo.tickerid, higherTimeFrame, ta.ema(close, 100))

// Input for trading start and end times, allowing end time to extend beyond midnight
startHour = input.int(1, "Start Hour", minval=0, maxval=23)
endHour = input.int(25, "End Hour", minval=0, maxval=47) // Extend maxval to 47 to allow specifying times into the next day

// Adjust endHour to be within 24-hour format using modulo operation
adjustedEndHour = endHour % 24

// Function to determine if the current time is within the trading hours
isTradingTime(currentHour) =>
    if startHour < adjustedEndHour
        currentHour >= startHour and currentHour < adjustedEndHour
    else
        currentHour >= startHour or currentHour < adjustedEndHour

// Get the current hour in the exchange's timezone
currentHour = hour(time, "Australia/Sydney")

// Check if the current time is within the trading hours
trading = isTradingTime(currentHour)

// Plot background color if within trading hours
bgcolor(trading ? color.new(color.blue, 90) : na)

// Inputs for trading days
tradeOnMonday = input.bool(true, "Trade on Monday")
tradeOnTuesday = input.bool(true, "Trade on Tuesday")
tradeOnWednesday = input.bool(true, "Trade on Wednesday")
tradeOnThursday = input.bool(true, "Trade on Thursday")
tradeOnFriday = input.bool(true, "Trade on Friday")

// Current time checks
currentDayOfWeek = dayofweek(time, "Australia/Sydney")

// Check if current time is within trading hours
isTradingHour = (currentHour >= startHour and currentHour < endHour)

// Check if trading is enabled for the current day of the week
isTradingDay = (currentDayOfWeek == dayofweek.monday and tradeOnMonday) or 
               (currentDayOfWeek == dayofweek.tuesday and tradeOnTuesday) or 
               (currentDayOfWeek == dayofweek.wednesday and tradeOnWednesday) or 
               (currentDayOfWeek == dayofweek.thursday and tradeOnThursday) or 
               (currentDayOfWeek == dayofweek.friday and tradeOnFriday)

// Combined check for trading time and day
isTradingTime = isTradingHour and isTradingDay

buySignal = false
sellSignal = false

// Conditions
if (step == 0 or step == 4) and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 4) and ta.crossover(fastEMA, higherTimeFrameEMA)
    step := 1

if step == 3 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 3

if step == 2 and ta.crossover(fastEMA, XslowEMA) and fastEMA > higherTimeFrameEMA
    step := 1

if (step == 0 or step == 3) and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

if (step == 0 or step == 3) and ta.crossunder(fastEMA, higherTimeFrameEMA)
    step := 2

if step == 4 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 4

if step == 1 and ta.crossunder(fastEMA, XslowEMA) and fastEMA < higherTimeFrameEMA
    step := 2

// For buy signals
if step == 1 and isTradingTime and fastEMA > ta.ema(close, Xslow) and fastEMA > higherTimeFrameEMA
    buySignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := 1
    buytp1Hit := false
    lastSignalBar := bar_index
    buy_slPrice := entryPrice - slPips * syminfo.mintick
    buy_tp1Price := entryPrice + tp1Pips * syminfo.mintick // Set TP1
    buy_tp2Price := entryPrice + tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 3
    strategy.entry("Buy", strategy.long, stop=buy_slPrice, limit=buy_tp1Price)

if step == 2 and isTradingTime and fastEMA < ta.ema(close, Xslow) and fastEMA < higherTimeFrameEMA
    sellSignal := true
    inTrade := true
    entryPrice := close
    tradeDirection := -1
    lastSignalBar := bar_index
    selltp1Hit := false
    sell_slPrice := entryPrice + slPips * syminfo.mintick
    sell_tp1Price := entryPrice - tp1Pips * syminfo.mintick // Set TP1
    sell_tp2Price := entryPrice - tp2Pips * syminfo.mintick // Set TP2
    tp1Hit := false
    step := 4
    strategy.entry("Sell", strategy.short, stop=sell_slPrice, limit=sell_tp1Price)

// Move SL to breakeven once TP1 is hit and close 25% of the trade
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) > 0)
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        strategy.close("Buy", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Buy", stop=buy_slPrice, limit=buy_tp2Price)
        
if (ta.valuewhen(strategy.position_size != 0, strategy.position_size, 0) < 0)
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        strategy.close("Sell", qty_percent = 25, comment = "TP1 Hit")
        strategy.exit("Close", from_entry="Sell", stop=sell_slPrice, limit=sell_tp2Price)

// Managing the trade after it's initiated
if inTrade and tradeDirection == 1 and sellSignal
    inTrade := false
    tradeDirection := 0
    buy_slPrice := na
    buy_tp1Price := na
    buy_tp2Price := na
    tp1Hit := false
    step := 2

if inTrade and tradeDirection == -1 and buySignal
    inTrade := false
    tradeDirection := 0
    sell_slPrice := na
    sell_slPrice := na
    sell_tp2Price := na
    tp1Hit := false
    step := 1

if inTrade and tradeDirection == 1 and step == 1
    step := 0

if inTrade and tradeDirection == -1 and step == 2
    step := 0

if inTrade and tradeDirection == 1 and (bar_index - lastSignalBar) >= 1
    if high >= buy_tp1Price and not tp1Hit
        tp1Hit := true
        buytp1Hit := true
        lastSignalBar := bar_index
        buy_slPrice := entryPrice + beoff * syminfo.mintick
        step := 3

    if low <= buy_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Buy", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == 1 and tp1Hit and (bar_index - lastSignalBar) >= 1
    if low <= buy_slPrice
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

    if high >= buy_tp2Price and (bar_index - lastSignalBar) >= 1
        inTrade := false
        tradeDirection := 0
        buy_slPrice := na
        buy_tp1Price := na
        buy_tp2Price := na
        tp1Hit := false
        buytp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and (bar_index - lastSignalBar) >= 1
    if low <= sell_tp1Price and not tp1Hit
        tp1Hit := true
        lastSignalBar := bar_index
        selltp1Hit := true
        sell_slPrice := entryPrice - beoff * syminfo.mintick
        step := 4

    if high >= sell_slPrice and not tp1Hit and (bar_index - lastSignalBar) >= 1
        strategy.close("Sell", qty_percent = 100, comment = "SL Hit")
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

if inTrade and tradeDirection == -1 and tp1Hit  and (bar_index - lastSignalBar) >= 1
    if high >= sell_slPrice
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0
    if low <= sell_tp2Price
        inTrade := false
        tradeDirection := 0
        sell_slPrice := na
        sell_tp1Price := na
        sell_tp2Price := na
        tp1Hit := false
        selltp1Hit := false
        step := 0

Inhalte dazu

Weitere Informationen