Diese Strategie bestimmt die Trendrichtung, indem sie den Crossover zwischen dem MACD-Indikator und dem gleitenden Durchschnitt der Signallinie berechnet und die Stärke des aktuellen Trends mit dem EMA-Indikator beurteilt, um den Trend zu verfolgen.
Der Kern dieser Strategie besteht darin, die Trendrichtung und den Eintrittszeitpunkt basierend auf dem MACD-Indikator zu bestimmen. Der Crossover zwischen der MACD-Linie und der Signallinie zeigt eine Umkehr des Kurstrends an. Daher werden Long- und Short-Positionen entsprechend der Breakout-Richtung bestimmt. Insbesondere, wenn der Schlusskurs über der EMA-Linie liegt und die MACD-Linie von unten durch die Signallinie bricht, gehen Sie lang; wenn der Schlusskurs unter der EMA-Linie liegt und die MACD-Linie von oben durch die Signallinie bricht, gehen Sie kurz.
Die EMA-Linie dient dazu, den Trend zu beurteilen. Wenn der Preis über der EMA-Linie liegt, deutet dies auf einen Aufwärtstrend hin. Zu diesem Zeitpunkt wird ein Durchbruch aus dem MACD unten wahrscheinlich ein goldenes Kreuzsignal bilden. Wenn der Preis unter der EMA-Linie liegt, deutet dies auf einen Abwärtstrend hin. Zu diesem Zeitpunkt wird ein Durchbruch aus dem MACD oben wahrscheinlich ein Todeskreuzsignal bilden. Die EMA-Länge bestimmt auch den mittelfristigen bis langfristigen Grad des Trendurteils.
Auf diese Weise können wir rechtzeitig in den Markt eintreten, wenn der Preis beginnt, sich umzukehren und einen neuen Trend zu bilden, wodurch ein Trend-Tracking-Effekt erzielt wird.
Diese Strategie kombiniert doppelte Beurteilungsbedingungen, wobei sowohl die Trendrichtung der Preise als auch die Verwendung von Indikatoren zur Bestimmung spezifischer Eintrittszeiten berücksichtigt werden, wodurch das Risiko falscher Ausbrüche vermieden und die Zuverlässigkeit der Strategie erhöht wird.
Die Anwendung der EMA-Linie ermöglicht es der Strategie außerdem, die Auswirkungen von kurzfristigen Schwankungen auszufiltern und mittelfristige und langfristige Trends bis zu einem gewissen Grad einzuschließen.
Darüber hinaus werden in der Strategie sowohl Long- als auch Short-Bedingungen festgelegt, die auf die Bullen- und Bärenmärkte angewendet werden können, wodurch die Anpassungsfähigkeit der Strategie verbessert wird.
Das Hauptrisiko dieser Strategie besteht darin, dass der MACD-Indikator selbst eine hohe Wahrscheinlichkeit hat, Fakeout-Signale falsch zu beurteilen.
Darüber hinaus setzt die Strategie einen Gewinnfaktor ein, um Stop-Loss- und Gewinnbedingungen festzulegen, was eine gewisse Subjektivität beinhaltet.
Schließlich setzt die Strategie einfach die Positionsgröße auf 100% des Eigenkapitals des Kontos, ohne die Frage der Fondsverwaltung zu berücksichtigen, die auch bei Live-Handel einige Risiken birgt.
Zu den wichtigsten Optimierungsrichtungen dieser Strategie gehören:
Es kann beispielsweise KDJ und BOLL in Betracht gezogen werden.
Die EMA-Linienlänge kann mehrparameteroptimiert werden, um die optimalen Parameter für die Beurteilung der Trendrichtung zu finden.
Die MACD-Parameter können auch weiter optimiert werden, um die genauesten Werte für die Bestimmung des Umkehrzeitpunkts zu finden.
Zum Beispiel kann der Gewinnfaktor als dynamischer Input verwendet werden und auch Schlupfstopp eingestellt werden.
Testen Sie die Auswirkungen auf verschiedene Arten von Verträgen, wie Kryptowährungen, Index-Futures usw., um die am besten geeignete Handelsvariante zu finden.
Insgesamt ist diese MACD EMA Crossover Trend Tracking Strategie relativ einfach und praktisch. Sie gewährleistet Signalzuverlässigkeit durch doppelte Indikatorenbedingungen und Sperren in Gewinnen durch vernünftige Stop-Loss- und Take-Profit-Methoden. Der Hauptoptimierungsraum liegt in der Parameterwahl, Indikatorenkombinationen, Kapitalmanagement usw. Mit weiterer Optimierung und Testung wird angenommen, dass diese Strategie zu einer der effizientesten Trend-Tracking-Strategien werden kann.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="MACD EMA Strategy", shorttitle="MACD EMA STRAT", overlay = true, pyramiding = 0, max_bars_back=3000, calc_on_order_fills = false, commission_type = strategy.commission.percent, commission_value = 0, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital=5000, currency=currency.USD) // Time Range FromMonth=input(defval=1,title="FromMonth",minval=1,maxval=12) FromDay=input(defval=1,title="FromDay",minval=1,maxval=31) FromYear=input(defval=2020,title="FromYear",minval=2016) ToMonth=input(defval=1,title="ToMonth",minval=1,maxval=12) ToDay=input(defval=1,title="ToDay",minval=1,maxval=31) ToYear=input(defval=9999,title="ToYear",minval=2017) start=timestamp(FromYear,FromMonth,FromDay,00,00) finish=timestamp(ToYear,ToMonth,ToDay,23,59) window()=>true // STEP 2: // See if this bar's time happened on/after start date afterStartDate = true //EMA emasrc = close res = input(title="EMA Timeframe", type=input.resolution, defval="15") len1 = input(title="EMA Length", type=input.integer, defval=206) col1 = color.yellow // Calculate EMA ema1 = ema(emasrc, len1) emaSmooth = security(syminfo.tickerid, res, ema1, barmerge.gaps_on, barmerge.lookahead_off) // Draw EMA plot(emaSmooth, title="EMA", linewidth=1, color=col1) //MACD fast_length = input(title="Fast Length", type=input.integer, defval=15) slow_length = input(title="Slow Length", type=input.integer, defval=24) src = input(title="Source", type=input.source, defval=close) signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9) sma_source = input(title="Simple MA (Oscillator)", type=input.bool, defval=true) sma_signal = input(title="Simple MA (Signal Line)", type=input.bool, defval=true) zeroline = 0 // Plot colors col_grow_above = #26A69A col_grow_below = #FFCDD2 col_fall_above = #B2DFDB col_fall_below = #EF5350 col_macd = #0094ff col_signal = #ff6a00 // Calculating fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length) slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length) macd = fast_ma - slow_ma signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length) hist = macd - signal //plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 ) //plot(macd, title="MACD", color=col_macd, transp=0) //plot(signal, title="Signal", color=col_signal, transp=0) //plot(zeroline, title="Zero Line", color=color.black, transp=0) ///////////////////////////LONG//////////////////////////////////////////////////////////////////// enablelong = input(true, title="Enable long?") //Long Signal upcondition = close > emaSmooth and close[1] > emaSmooth[1] macdunderhis = macd < zeroline macdcrossup = crossover(macd, signal) longcondition = upcondition and macdunderhis and macdcrossup //strategy buy long if (longcondition) and (afterStartDate) and strategy.opentrades < 1 and (enablelong == true) strategy.entry("long", strategy.long) //////////////////////////////////////SHORT////////////////////////////////////////////////////////////////////////////////// enableshort = input(true, title="Enable short?") //Short Signal downcondition = close < emaSmooth and close[1] < emaSmooth[1] macdoverhis = macd > zeroline macdcrosunder = crossunder(macd, signal) shortcondition = downcondition and macdoverhis and macdcrosunder //strategy buy short if (shortcondition) and (afterStartDate) and strategy.opentrades < 1 and (enableshort == true) strategy.entry("short", strategy.short) //////////////////////////////////////EXIT CONDITION////////////////////////////////////////////////////////////////////////////////// bought = strategy.position_size[1] < strategy.position_size sold = strategy.position_size[1] > strategy.position_size barsbought = barssince(bought) barssold = barssince(sold) //////LOWEST LOW////// //Lowest Low LONG profitfactorlong = input(title="ProfitfactorLong", type=input.float, step=0.1, defval=1.9) loLen = input(title="Lowest Low Lookback", type=input.integer, defval=46, minval=2) stop_level_long = lowest(low, loLen)[1] if strategy.position_size>0 profit_level_long = strategy.position_avg_price + ((strategy.position_avg_price - stop_level_long[barsbought])*profitfactorlong) strategy.exit(id="TP/ SL", stop=stop_level_long[barsbought], limit=profit_level_long) //Lowest Low SHORT profitfactorshort = input(title="ProfitfactorShort", type=input.float, step=0.1, defval=2.1) highLen = input(title="highest high lookback", type=input.integer, defval=25, minval=2) stop_level_short = highest(high, highLen)[1] if strategy.position_size<0 profit_level_short = strategy.position_avg_price - ((stop_level_short[barssold] - strategy.position_avg_price)*profitfactorshort) strategy.exit(id="TP/ SL", stop=stop_level_short[barssold], limit=profit_level_short) //PLOTT TP SL plot(stop_level_long, title="SL Long", linewidth=1, color=color.red) plot(stop_level_short, title="SL Short", linewidth=1, color=color.red)