Diese Strategie erzeugt Kauf- und Verkaufssignale, indem die Überschneidung der schnellen und langsamen Linie des MACD-Indikators verglichen wird. Wenn ein Kaufsignal erzeugt wird, wird eine Position mit einem bestimmten Prozentsatz des Kontokapitals eröffnet. An bestimmten Rückzugspunkten werden dann zusätzliche Positionen hinzugefügt. Wenn der akkumulierte Gewinn der Positionen den konfigurierten Take-Profit-Punkt erreicht, werden alle Positionen geschlossen. Die Logik für Verkaufssignale ist ähnlich wie für Kaufsignale.
Die Kernlogik dieser Strategie besteht darin, die Überschneidung der MACD-Schnelllinie und der langsamen Linie zu vergleichen, um den Trend zu bestimmen.
Wenn die schnelle Linie über die langsame Linie kreuzt, wird ein goldenes Kreuz erzeugt, was anzeigt, dass der Markt in einem Aufwärtstrend ist, und die Strategie wird Long-Positionen eröffnen.
Nach Eröffnung von Positionen wird die Strategie zu bestehenden Long- oder Short-Positionen an bestimmten Retracement-Punkten hinzugefügt. Dies kann das Gewinnpotenzial durch das Martingale-Prinzip erhöhen. Wenn der akkumulierte Gewinn den konfigurierten Take-Profit-Punkt erreicht, schließt die Strategie alle Positionen.
Diese Strategie hat folgende Vorteile:
Verwendet den MACD-Indikator zur Bestimmung des Markttrends, der ein klassischer und zuverlässiger Indikator für die technische Analyse ist.
Der Ansatz, Positionen in Chargen zu eröffnen, kann das Risiko eines einzigen Handels kontrollieren.
Das Hinzufügen von Positionen kann das Gewinnpotenzial durch das Martingale-Prinzip erweitern.
Konfigurieren Sie den Gewinnpunkt, um Verluste zu begrenzen.
Diese Strategie birgt auch einige Risiken:
Der MACD-Indikator kann Marktbewegungen nicht perfekt vorhersagen, es können falsche Signale auftreten.
Es besteht die Gefahr, dass sich die Retrace mit der Erhöhung der Gesamtposition ausweitet.
Wenn der Gewinnsatz zu gering eingestellt wird, kann dies das Gewinnpotenzial einschränken und für verschiedene Produkte angepasst werden.
Notwendigkeit, einen angemessenen Prozentsatz des Kapitals für die Eröffnung von Positionen pro Produkt festzulegen, um eine Überschreitung der Kontogrenzen zu vermeiden.
Diese Strategie kann in folgenden Aspekten optimiert werden:
Testen Sie MACD-Parameter, finden Sie Parameter, die besser für bestimmte Handelsprodukte passen.
Optimieren Sie Geldanteil und Retracement-Prozent für jede Position hinzugefügt, finden Sie optimale Parameterkombinationen.
Testen Sie langfristige bzw. kurzfristige Gewinnpunkte, um optimale Werte zu ermitteln.
Bewertung der Margin-Kapazität des Kontos, Festlegung eines angemessenen Höchststands pro Produkt.
Hinzufügen Stop-Loss-Logik. Stop-Loss kann effektiv Verluste kontrollieren, wenn drastische Marktänderungen auftreten.
Zusammenfassend ist dies eine typische Trend-Folge-Strategie. Es verwendet den MACD-Indikator, um die Markttrendrichtung zu bestimmen, nimmt den Ansatz, Positionen in Chargen zu addieren, um dem Trend zu folgen, und macht Gewinn, wenn der akkumulierte Gewinn ein bestimmtes Niveau erreicht. Diese einfache und praktische Strategie ist einfach umzusetzen und eignet sich für quantitative Handelsanfänger. Durch die Optimierung von Parametern und die Erweiterung der Risikokontrolllogik kann die Strategie robuster werden.
/*backtest start: 2023-11-26 00:00:00 end: 2023-12-26 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © TradingSoft_tech //@version=5 strategy("MAPM-V1", overlay=true, default_qty_value=10, max_bars_back=5000,default_qty_type = strategy.percent_of_equity, commission_value=0.1, initial_capital = 100, pyramiding=6, currency=currency.USD) ///////// Options SignalFast = input.int(300, step=10) SignalSlow = input.int(600, step=10) StepAddPurchases = input.float(2.5, step=0.1) VolumePurchases = input.int(6,step=1) Buy = input(true) Sell = input(true) longProfitPerc = input.float(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01 shortProfitPerc = input.float(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01 Martingale = input.float(1.6, minval = 1, step = 0.1) VolumeDepo = input.int(100, step=1) PercentOfDepo = input.float(10, step=1) Close = (close) EnterVolume = VolumeDepo*PercentOfDepo*0.01/Close ///////// Calculation indicator fastAverage = ta.ema(close, 8) slowAverage = ta.ema(close, 49) macd = fastAverage - slowAverage macdSignalF = ta.ema(macd,SignalFast) macdSignalS = ta.ema(macd,SignalSlow) // Test Start startYear = input(2005, "Test Start Year") startMonth = input(1, "Test Start Month") startDay = input(1, "Test Start Day") startTest = timestamp(startYear,startMonth,startDay,0,0) //Test End endYear = input(2050, "Test End Year") endMonth = input(12, "Test End Month") endDay = input(30, "Test End Day") endTest = timestamp(endYear,endMonth,endDay,23,59) timeRange = time > startTest and time < endTest ? true : false ///////// Plot Data //plot(macd, style = plot.style_histogram) //plot(macdSignalF*10000, style = plot.style_line, color=color.red) //plot(macdSignalS*10000, style = plot.style_line, color=color.blue) //plot(fastAverage, style = plot.style_line, color=color.red) //plot(slowAverage, style = plot.style_line, color=color.blue) ///////// Calculation of the updated value var x = 0.0 if strategy.opentrades>strategy.opentrades[1] x := x + 1 else if strategy.opentrades==0 x := 0 y = x+1 ///////// Calculation of reference price data entryPrice = strategy.opentrades==0? 0 : strategy.opentrades.entry_price(0) limitLong = strategy.position_avg_price * (1 + longProfitPerc) limitShort = strategy.position_avg_price * (1 - shortProfitPerc) SteplimitLong = entryPrice[0]*(1-StepAddPurchases*y/100) SteplimitShort = entryPrice[0]*(1+StepAddPurchases*y/100) ///////// Conditions for a long bool EntryLong = ta.crossover(macdSignalF, macdSignalS) and Buy and strategy.opentrades==0 and strategy.position_size==0 bool PurchasesLong = Buy and strategy.opentrades==x and strategy.position_size>0 and x<=VolumePurchases bool CancelPurchasesLong = strategy.position_size==0 and strategy.opentrades==0 bool TPLong = strategy.position_size>0 and strategy.opentrades!=0 ///////// Entry Long + add.purchases + cancel purchases + Take profit Long switch EntryLong => strategy.entry("Entry Long", strategy.long, qty = EnterVolume) PurchasesLong => strategy.entry("PurchasesLong", strategy.long, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitLong) CancelPurchasesLong => strategy.cancel("PurchasesLong") switch TPLong => strategy.exit("TPLong", qty_percent = 100, limit = limitLong) ///////// Conditions for a Short bool EntryShort = ta.crossunder(macdSignalF, macdSignalS) and Sell and strategy.opentrades==0 and strategy.position_size==0 bool PurchasesShort = Sell and strategy.opentrades==x and strategy.position_size<0 and x<=VolumePurchases bool CancelPurchasesShort = strategy.position_size==0 and strategy.opentrades==0 bool TPShort = strategy.position_size<0 and strategy.opentrades!=0 ///////// Entry Short + add.purchases + cancel purchases + Take profit Short switch EntryShort => strategy.entry("Entry Short", strategy.short, qty = EnterVolume) PurchasesShort => strategy.entry("PurchasesShort", strategy.short, qty = EnterVolume*math.pow(Martingale,y), limit = SteplimitShort) CancelPurchasesShort => strategy.cancel("PurchasesShort") switch TPShort => strategy.exit("TPShort", qty_percent = 100, limit = limitShort) /////////Calculation of conditions and reference data for level drawing InTradeLong = strategy.position_size<0 InTradeShort = strategy.position_size>0 PickInLong = strategy.opentrades.entry_price(0)*(1-StepAddPurchases*y/100) PickInShort = strategy.opentrades.entry_price(0)*(1+StepAddPurchases*y/100) /////////Displaying the level of Take Profit plot(InTradeLong ? na : limitLong, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1) plot(InTradeShort ? na : limitShort, color=color.new(#00d146, 0), style=plot.style_linebr, linewidth=1) /////////Displaying the level of add.purchases plot(InTradeLong ? na : PickInLong, color=color.white, style=plot.style_linebr, linewidth=1) plot(InTradeShort ? na : PickInShort, color=color.white, style=plot.style_linebr, linewidth=1)