Strategie für einen doppelten Momentum-Ausbruch

Schriftsteller:ChaoZhang, Datum: 2023-11-16 17:00:54
Tags:

img

Übersicht

Dies ist eine Dual-Momentum-Breakout-Strategie. Sie verwendet zwei Momentum-Indikatoren mit unterschiedlichen Parameter-Einstellungen und erzeugt Handelssignale, wenn beide Momentum-Indikatoren die Nulllinie durchbrechen.

Strategie Logik

Der Code legt zunächst Strategie-Eigenschaften wie Auftragsart, Provisionsschema usw. fest.

// Momentum settings
****
i_len           = input(defval = 12, title = "Length", minval = 1)
i_src           = input(defval = close, title = "Source")  
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code 

mom0 = momentum(i_src, i_len, i_percent)
mom1 = momentum(mom0, 1, i_percent) 
mom2 = momentum(i_src, 1, i_percent)

momX = mom1   

if i_mom == "MOM2"
    momX := mom2

mom0 ist der Basismomentumsindikator mit Länge i_len, Datenquelle i_src, ob Prozent berechnet werden soll, entscheidet i_percent.

mom1 ist der Impulsindikator mit mom0 als Datenquelle und Länge 1.

mom2 ist der Impulsindikator mit den ursprünglichen Daten i_src als Quelle und Länge 1.

Der Endmomentumsindikator momX wird standardmäßig auf mom1 festgelegt, kann auch mom2 auswählen.

Wenn mom0 und momX beide über die Nulllinie brechen, gehen Sie lang.

Vorteile der Strategie

  1. Durch die Verwendung von Doppelmomentindikatoren mit unterschiedlichen Einstellungen wird die Signalzuverlässigkeit durch doppelte Bestätigung und weniger falsche Signale verbessert.

  2. Nur lange Eintritte und die Verwendung von Shorts für Ausgänge verringern die Handelsfrequenz und die Transaktionskosten.

  3. Flexible Anpassungen der Impulsparameter sind für verschiedene Marktumgebungen geeignet.

  4. Saubere Code-Struktur, leicht zu verstehen und zu ändern.

  5. Handelsnachrichten aktiviert, integriert sich gut mit automatischen Handelssystemen.

Risiken der Strategie

  1. Bei doppelter Dynamik können schwächere Trendsignale verfehlt werden, während falsche Signale reduziert werden.

  2. Kurzzeitgeschäftsmöglichkeiten mit nur langen Einträgen verpassen.

  3. Eine falsche Einstellung der Impulsparameter führt zu Überhandelungen oder verzögerten Signalen.

  4. Unzureichende Rücktestdaten verursachen Parameterüberanpassung.

  5. Doppelbestätigung reduziert, aber nicht beseitigt falsche Signale, müssen für die Gültigkeit im Live-Handel zu beobachten.

Optimierungsrichtlinien

  1. Testkombinationen von Längen- und Prozentsatzparametern, um das Optimum zu finden.

  2. Erwägen Sie, nach der Trendbestätigung Short-Trade-Signale hinzuzufügen, um mehr Trades zu erfassen.

  3. Verschiedene Impulsberechnungen wie ROC, RSI usw. für bessere Ergebnisse testen.

  4. Fügen Sie Trendfilterung hinzu, um Whipsaw-Märkte zu vermeiden.

  5. Optimieren Sie den Stop-Loss für maximale Rentabilität innerhalb der Risikogrenzen.

Schlussfolgerung

Dies ist eine typische Dual-Momentum-Breakout-Strategie. Es verwendet doppelte Bestätigung, um falsche Signale zu reduzieren und nur lange Einträge, um die Handelsfrequenz zu senken. Die Vorteile sind Einfachheit und Einfachheit der Implementierung, mit viel Raum für Verbesserungen bei Parameteroptimierung und Risikokontrolle. Insgesamt dient es als ein angemessenes Momentum-Breakout-Framework, benötigt aber marktspezifische Abstimmungen und Optimierungen für profitables Live-Handel.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")

Mehr