Extreme Version von Noros Trend-Strategie für gleitende Durchschnitte

Schriftsteller:ChaoZhang, Datum: 2024-01-31 17:00:53
Tags:

img

Übersicht

Diese Strategie verwendet zwei gleitende Durchschnittsindikatoren, um die Trendrichtung und die langen/kurzen Chancen zu identifizieren. Der langsamere gleitende Durchschnitt (blaue Linie) wird verwendet, um die allgemeine Trendrichtung zu bestimmen, während der schnellere gleitende Durchschnitt (rote Linie) in Kombination mit dem Preiskanal verwendet wird, um Handelsmöglichkeiten zu entdecken.

Strategie Logik

  1. Berechnen Sie zwei gleitende Durchschnitte - einen langsameren MA mit Periode 21 zur Bestimmung des Gesamttrends und einen schnelleren MA mit Periode 5, der sich mit dem Preiskanal kombiniert, um Handelsmöglichkeiten zu finden.

  2. Überprüfen Sie, ob der aktuelle Preis durch den im vorherigen Zeitraum gebildeten Preiskanal bricht.

  3. Zählen Sie die Anzahl und Richtung der jüngsten Kerzen. Zum Beispiel können mehrere aufeinanderfolgende bärische Kerzen eine lange Chance signalisieren, während aufeinanderfolgende bullische Kerzen eine kurze Chance signalisieren können. Die Anzahl der Kerzen kann über den Parameter Bars konfiguriert werden.

  4. Ein Signal wird ausgelöst, wenn sich die Kursbewegung mit der langsameren MA-Trendrichtung ausrichtet, ein schnellerer MA oder Preiskanal ein Signal erzeugt und die Kondition der Kerzenbewegung übereinstimmt.

Vorteile

  1. Das Dual Moving Average-System verfolgt effektiv die Trendrichtung.

  2. Schnellerer MA und Preiskanal kombiniert erkennt frühe Ausbruchspunkte, um Handelschancen zu erfassen.

  3. Sie berücksichtigt auch die Richtung der Kerzen und zählt, um nicht von Marktumkehrungen gefangen zu werden.

  4. Anpassbare MA-Parameter funktionieren für verschiedene Produkte und Zeitrahmen.

Risiken und Minderungsmaßnahmen

  1. Dual MAs können während seitlicher Märkte falsche Signale erzeugen.

  2. Es besteht immer noch das Risiko, in außergewöhnliche Marktbewegungen gefangen zu werden.

  3. Wir werden die Logik und Parameter weiter verbessern, um die Strategie robuster zu machen.

Möglichkeiten zur Verbesserung

  1. Fügen Sie unterstützende Indikatoren wie ADX, MACD hinzu, um falsche Trades in unruhigen Märkten zu vermeiden.

  2. Dynamische Stop-Loss-Berechnung, z. B. basierend auf ATR und Risikopräferenz.

  3. Parameteroptimierung durch maschinelles Lernen für die Anpassungsfähigkeit.

  4. Feinabstimmungsparameter auf der Grundlage von Instrumenteneigenschaften, z. B. kürzere Perioden für Kryptowährungen.

Schlussfolgerung

Insgesamt funktioniert diese Strategie sehr gut bei der Verfolgung von Trending-Märkten, mit zusätzlichen Ausbruchmöglichkeiten. Mit entsprechenden Verbesserungen kann sie zu einer kommerziell tragfähigen hochwertigen Quant-Strategie gemacht werden. Wir werden sie weiter verbessern, um mehr Märkte stabil zu handeln.


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

//@version=2
strategy(title = "Noro's Trend MAs Strategy v1.9 Extreme", shorttitle = "Trend MAs str 1.9 extreme", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value=100.0, pyramiding=0)

//Settings
needlong = input(true, "long")
needshort = input(true, "short")
needstops = input(false, "stops")
stoppercent = input(5, defval = 5, minval = 1, maxval = 50, title = "Stop, %")
useohlc4 = input(false, defval = false, title = "Use OHLC4")
usefastsma = input(true, "Use fast MA Filter")
fastlen = input(5, defval = 5, minval = 1, maxval = 50, title = "fast MA Period")
slowlen = input(21, defval = 20, minval = 2, maxval = 200, title = "slow MA Period")
bars = input(2, defval = 2, minval = 0, maxval = 3, title = "Bars Q")
needbg = input(false, defval = false, title = "Need trend Background?")
needarr = input(false, defval = false, title = "Need entry arrows?")
needex = input(true, defval = true, title = "Need extreme? (crypto/fiat only!!!)")

src = useohlc4 == true ? ohlc4 : close

//PriceChannel 1
lasthigh = highest(src, slowlen)
lastlow = lowest(src, slowlen)
center = (lasthigh + lastlow) / 2

//PriceChannel 2
lasthigh2 = highest(src, fastlen)
lastlow2 = lowest(src, fastlen)
center2 = (lasthigh2 + lastlow2) / 2

//Trend
trend = low > center and low[1] > center[1] ? 1 : high < center and high[1] < center[1] ? -1 : trend[1]

//Bars
bar = close > open ? 1 : close < open ? -1 : 0
redbars = bars == 0 ? 1 : bars == 1 and bar == -1 ? 1 : bars == 2 and bar == -1 and bar[1] == -1 ? 1 : bars == 3 and bar == -1 and bar[1] == -1 and bar[2] == -1 ? 1 : 0
greenbars = bars == 0 ? 1 : bars == 1 and bar == 1 ? 1 : bars == 2 and bar == 1 and bar[1] == 1 ? 1 : bars == 3 and bar == 1 and bar[1] == 1 and bar[2] == 1 ? 1 : 0

//Signals
up = trend == 1 and (low < center2 or usefastsma == false) and (redbars == 1) ? 1 : 0
dn = trend == -1 and (high > center2 or usefastsma == false) and (greenbars == 1) ? 1 : 0

up2 = high < center and high < center2 and bar == -1 ? 1 : 0
dn2 = low > center and low > center2 and bar == 1 ? 0 : 0

//Lines
plot(center, color = blue, linewidth = 3, transp = 0, title = "Slow MA")
plot(center2, color = red, linewidth = 3, transp = 0, title = "PriceChannel 2")

//Arrows
plotarrow(up == 1 and needarr == true ? 1 : 0, colorup = black, colordown = black, transp = 0)
plotarrow(dn == 1 and needarr == true ? -1 : 0, colorup = black, colordown = black, transp = 0)

//Background
col = needbg == false ? na : trend == 1 ? lime : red
bgcolor(col, transp = 90)

//Alerts
alertcondition(up == 1, title='buy', message='Uptrend')
alertcondition(dn == 1, title='sell', message='Downtrend')

//Trading
stoplong = up == 1 and needstops == true ? close - (close / 100 * stoppercent) : stoplong[1]
stopshort = dn == 1 and needstops == true ? close + (close / 100 * stoppercent) : stopshort[1]

longCondition = up == 1 or (up2 == 1 and needex == true)
if (longCondition)
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)
    strategy.exit("Stop Long", "Long", stop = stoplong)

shortCondition = dn == 1
if (shortCondition)
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    strategy.exit("Stop Short", "Short", stop = stopshort)

Mehr