Preismomentumsverfolgungsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-03 17:32:14
Tags:

img

Übersicht

Diese Strategie verwendet Preismomentumsindikatoren, um die Handelsrichtung zu bestimmen. Insbesondere berechnet sie den gleitenden Durchschnitt und den mittleren Preis. Wenn der Preis über den gleitenden Durchschnitt und den mittleren Preis geht, wird ein Kaufsignal generiert. Um falsche Signale auszufiltern, benötigt sie keine ähnlichen vorherigen Signale. Dann speichert sie den Signalstatus und erzeugt das endgültige Eröffnungs-Positionssignal in Kombination mit dem gleitenden Durchschnitt. Die Strategie enthält auch Stop-Loss- und Take-Profit-Einstellungen.

Strategieprinzip

Die Strategie stützt sich hauptsächlich auf Preisdynamikindikatoren, um die Trendrichtung zu beurteilen.

swmaClose = swma(close)
vwapClose = vwap(close) 

Wo ist er?swmaist der glättete gleitende Durchschnitt undvwapDer durchschnittliche Preisspiegel ist der volumengewichtete Durchschnittspreis.

Vergleichen Sie dann den Preis mit dem Durchschnitt, um zu sehen, ob der Preis über dem gleitenden Durchschnitt und dem Durchschnittspreis liegt, um zu beurteilen, ob es sich um ein bullisches Signal handelt:

swmaLong = close > swmaClose 
vwapLong = close > vwapClose

Um falsche Signale auszufiltern, sind keine vorherigen Signale dieser beiden Indikatoren erforderlich:

triggerLong = vwapLong and not vwapLong[1] and not swmaLong and not swmaLong[1] 

Als Nächstes, speichern Sie das Aufwärtssignal:

saveLong = false, saveLong := triggerLong ? true : not vwapLong ? false : saveLong[1] 

Wenn das gespeicherte Kreuzungssignal und der Kurs erneut über den gleitenden Durchschnitt gehen, wird das Öffnungssignal erzeugt:

startLong = saveLong and swmaLong

Dadurch können einige falsche Signale herausgefiltert und die Signale zuverlässiger gemacht werden.

Die Strategie enthält auch Stop-Loss- und Take-Profit-Einstellungen.

Analyse der Vorteile

Die Strategie weist folgende Vorteile auf:

  1. Mit Hilfe von Indikatoren für die Preisdynamik kann die Trendrichtung besser beurteilt werden
  2. Die Kombination aus zwei Indikatoren und mehrstufiger Verifizierung kann falsche Signale filtern und die Strategie zuverlässiger machen
  3. Die Stop-Loss- und Take-Profit-Einstellungen sind angemessen, um das Einzelhandelsrisiko zu kontrollieren
  4. Die Strategieparameter können an unterschiedliche Marktbedingungen angepasst werden
  5. Die Strategie ist einfach und unkompliziert, leicht zu verstehen und umzusetzen

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Der gleitende Durchschnittsindikator hat eine Verzögerung und kann einige Kursschwankungen übersehen
  2. Der Effekt hängt von Parameter-Einstellungen ab, und verschiedene Parameterkombinationen können große Unterschiede machen
  3. Es gibt relativ wenige Kaufsignale mit einigen verpassten Handelsrisiken
  4. Mehrstufige Überprüfung wird einige Möglichkeiten filtern, die sich auf das Gewinnniveau auswirken können

Gegenmaßnahmen:

  1. Verschiedene gleitende Durchschnittsparameter für die Parameteroptimierung testen
  2. Ein wenig vereinfachen Sie das logische Urteil, um Kaufsignale zu erhöhen
  3. Anpassung der Stop-Loss- und Take-Profit-Ratio zur Kontrolle von Einzelverlusten

Optimierungsrichtlinien

Die Strategie kann auch in folgenden Richtungen optimiert werden:

  1. Testen Sie mehr Preisdynamikindikatoren wie MACD, DMI usw.
  2. Hinzufügen von Verkaufssignalentscheidungen zur Umsetzung von Doppelrichtungshandel
  3. Einbeziehung von Handelsvolumenindikatoren zur Vermeidung möglicher falscher Ausbrüche
  4. Optimierung der Parameter-Einstellungen basierend auf Backtest-Ergebnissen
  5. Erwägen Sie die automatische Anpassung von Parametern anhand der Marktbedingungen
  6. Hinzufügen von Machine-Learning-Algorithmen zur Parameter-Selbstadaptivoptimierung

Diese Optimierungen können die Flexibilität, Robustheit und Rentabilität der Strategie verbessern.

Zusammenfassung

Insgesamt ist diese Kursmomentum-Tracking-Strategie eine einfache, unkomplizierte und logische Trend-Tracking-Strategie. Die Strategie nutzt Preisbewegungsdurchschnitte und mittlere Preise, um die Kursmomentum-Richtung zu bestimmen, und entwirft einen mehrstufigen Verifizierungsmechanismus zur Verbesserung der Signalqualität. Die Strategie enthält auch angemessene Stop-Loss- und Take-Profit-Einstellungen. In Bezug auf den Code ist die Strategie-Logik sehr prägnant und erfordert nur 20+ Zeilen Pine-Skript zur Implementierung. Zusammenfassend ist diese Strategie ein sehr gutes Lernbeispiel, Anfänger können sie als sehr guten Ausgangspunkt für das Verständnis quantitativer Handelsstrategien verwenden. Natürlich hat die Strategie selbst auch einen praktischen Handelswert. Durch Parameteroptimierung und Funktionsausweitung kann sie zu einem praktischen Handelssystem werden, um Lärm und Trends zu vermeiden.


/*backtest
start: 2023-12-03 00:00:00
end: 2024-01-02 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title = "Simple Price Momentum", shorttitle = "SPM", overlay = true, initial_capital = 20000, default_qty_value = 100, default_qty_type = strategy.percent_of_equity, commission_value = 0.025)

// How To Create A Simple Trading Strategy With TradingView
// https://docs.google.com/document/d/1fXxCtPuGgTXb-RuBJNbwlfgkeiLTK5060LfTrzRlr5k/view

swmaClose = swma(close)
vwapClose = vwap(close)

swmaLong = close > swmaClose
vwapLong = close > vwapClose

triggerLong = vwapLong and not vwapLong[1] and not swmaLong and not swmaLong[1]
saveLong = false, saveLong := triggerLong ? true : not vwapLong ? false : saveLong[1]

startLong = saveLong and swmaLong
startLong := input(false, "Consecutive Orders") ? startLong : startLong and not startLong[1]

stopLoss = input(250, "Stop Loss", step = 50)
takeProfit = input(10, "Reward/Risk") * stopLoss

strategy.entry("Open Long", strategy.long, when = startLong)
strategy.exit("Exit Long", "Open Long", profit = stopLoss, loss = takeProfit)

// bgcolor(swmaLong ? color.blue : na)
// bgcolor(vwapLong ? color.orange : na)
// bgcolor(triggerLong ? color.purple : na)
// bgcolor(saveLong ? color.yellow : na)
bgcolor(startLong[1] ? color.green : na)


Mehr