Quantifizierungsstrategie für Bollinger-Band-Crossover zwischen Paaren

Schriftsteller:ChaoZhang, Datum: 2023-12-27 14:28:21
Tags:

img

Übersicht

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.

Strategie Logik

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.

Analyse der Vorteile

Diese Strategie hat folgende Vorteile:

  1. Verwendet den MACD-Indikator zur Bestimmung des Markttrends, der ein klassischer und zuverlässiger Indikator für die technische Analyse ist.

  2. Der Ansatz, Positionen in Chargen zu eröffnen, kann das Risiko eines einzigen Handels kontrollieren.

  3. Das Hinzufügen von Positionen kann das Gewinnpotenzial durch das Martingale-Prinzip erweitern.

  4. Konfigurieren Sie den Gewinnpunkt, um Verluste zu begrenzen.

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Der MACD-Indikator kann Marktbewegungen nicht perfekt vorhersagen, es können falsche Signale auftreten.

  2. Es besteht die Gefahr, dass sich die Retrace mit der Erhöhung der Gesamtposition ausweitet.

  3. Wenn der Gewinnsatz zu gering eingestellt wird, kann dies das Gewinnpotenzial einschränken und für verschiedene Produkte angepasst werden.

  4. Notwendigkeit, einen angemessenen Prozentsatz des Kapitals für die Eröffnung von Positionen pro Produkt festzulegen, um eine Überschreitung der Kontogrenzen zu vermeiden.

Optimierungsrichtlinien

Diese Strategie kann in folgenden Aspekten optimiert werden:

  1. Testen Sie MACD-Parameter, finden Sie Parameter, die besser für bestimmte Handelsprodukte passen.

  2. Optimieren Sie Geldanteil und Retracement-Prozent für jede Position hinzugefügt, finden Sie optimale Parameterkombinationen.

  3. Testen Sie langfristige bzw. kurzfristige Gewinnpunkte, um optimale Werte zu ermitteln.

  4. Bewertung der Margin-Kapazität des Kontos, Festlegung eines angemessenen Höchststands pro Produkt.

  5. Hinzufügen Stop-Loss-Logik. Stop-Loss kann effektiv Verluste kontrollieren, wenn drastische Marktänderungen auftreten.

Zusammenfassung

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)

Mehr