MACD EMA-Kreuzungstrendverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-02-18 15:17:36
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

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.

Risikoanalyse

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.

Optimierungsrichtlinien

Zu den wichtigsten Optimierungsrichtungen dieser Strategie gehören:

  1. Es kann beispielsweise KDJ und BOLL in Betracht gezogen werden.

  2. Die EMA-Linienlänge kann mehrparameteroptimiert werden, um die optimalen Parameter für die Beurteilung der Trendrichtung zu finden.

  3. Die MACD-Parameter können auch weiter optimiert werden, um die genauesten Werte für die Bestimmung des Umkehrzeitpunkts zu finden.

  4. Zum Beispiel kann der Gewinnfaktor als dynamischer Input verwendet werden und auch Schlupfstopp eingestellt werden.

  5. Testen Sie die Auswirkungen auf verschiedene Arten von Verträgen, wie Kryptowährungen, Index-Futures usw., um die am besten geeignete Handelsvariante zu finden.

Schlussfolgerung

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)

Mehr