Quantitative Handelsstrategie auf Basis der Wellenentwicklung

Schriftsteller:ChaoZhang, Datum: 2023-11-28 16:17:31
Tags:

img

Übersicht

Diese Strategie basiert auf dem Wave Trend-Indikator. Der Wave Trend-Indikator kombiniert Preiskanal und gleitenden Durchschnitt, um Markttrends effektiv zu identifizieren und Handelssignale zu generieren. Diese Strategie tritt in Long- oder Short-Positionen ein, wenn die Wave Trend-Linie über Schlüsselniveaus überschreitet, die einen Überkauf- oder Überverkaufstatus darstellen.

Strategie Logik

  1. Berechnen Sie den dreieckigen gleitenden Durchschnitt ap des Preises sowie den exponentiellen gleitenden Durchschnitt esa von ap.
  2. Berechnen Sie den exponentiellen gleitenden Durchschnitt d der absoluten Differenz zwischen ap und esa.
  3. Ableitung des Volatilitätsindikators ci.
  4. Berechnen Sie den gleitenden Durchschnitt von ci für die n2-Periode, um den Wellen-Trend-Indikator wt1 zu erhalten.
  5. Überkaufte und überverkaufte Schwellenwerte festlegen.
  6. Gehen Sie lang, wenn wt1 über die überverkaufte Linie geht, gehen Sie kurz, wenn wt1 unter die überkaufte Linie geht.

Analyse der Vorteile

  1. Wellen-Trend-Brechungen von überkauften/überverkauften Niveaus fangen effektiv Trendumkehrpunkte auf und erzeugen genaue Handelssignale.
  2. Durch die Kombination von Preiskanal- und gleitenden Durchschnittstheorien vermeidet der Indikator häufige falsche Signale.
  3. Anwendbar für alle Zeitrahmen und verschiedene Handelsinstrumente.
  4. Anpassbare Parameter bieten eine gute Benutzererfahrung.

Risiken und Lösungen

  1. Eine signifikante Whipsaws kann schlechte Signale, ein hohes Risiko verursachen.
  2. Keine Positionsgröße und Stop-Loss-Mechanismen, Risiken von Verlusten.

Optimierungsrichtlinien

  1. Es sollte in Betracht gezogen werden, sie mit anderen Indikatoren wie KDJ und MACD zu kombinieren, um eine Strategie zu bilden, die die Stabilität erhöht.
  2. Entwerfen Sie automatische Stop-Loss wie Trailing-Stops, Volatilitäts-Stops, um den Verlust pro Handel zu begrenzen.
  3. Verwenden Sie maschinelle Lernalgorithmen auf historischen Daten, um die Parameter automatisch einzustellen und die Strategieleistung zu verbessern.

Schlussfolgerung

Diese Strategie identifiziert Trends und Überkauf-/Überverkaufsniveaus mithilfe des Wellen-Trend-Indikators und bildet einen effektiven Trend nach der Strategie. Im Vergleich zu kurzfristigen Oszillatoren vermeidet der Wellen-Trend falsche Signale und bietet eine bessere Stabilität. Mit geeigneten Risikokontrollmethoden kann er stetige Gewinne erzielen. Von Parametern und Modell-Tuning kann eine weitere Leistungssteigerung erwartet werden.


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


//@author SoftKill21
//@version=4

strategy(title="WaveTrend strat", shorttitle="WaveTrend strategy")
n1 = input(10, "Channel Length")
n2 = input(21, "Average Length")
Overbought = input(70, "Over Bought")
Oversold = input(-30, "Over Sold ")

// BACKTESTING RANGE
 
// From Date Inputs
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2001, title = "From Year", minval = 1970)
 
// To Date Inputs
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2020, title = "To Year", minval = 1970)
 
// Calculate start/end date and time condition
DST = 1 //day light saving for usa
//--- Europe
London = iff(DST==0,"0000-0900","0100-1000")
//--- America
NewYork = iff(DST==0,"0400-1500","0500-1600")
//--- Pacific
Sydney = iff(DST==0,"1300-2200","1400-2300")
//--- Asia
Tokyo = iff(DST==0,"1500-2400","1600-0100")

//-- Time In Range
timeinrange(res, sess) => time(res, sess) != 0

london = timeinrange(timeframe.period, London)
newyork = timeinrange(timeframe.period, NewYork)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = true //and (london or newyork)

ap = hlc3 
esa = ema(ap, n1)
d = ema(abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * d)
tci = ema(ci, n2)
 
wt1 = tci
wt2 = sma(wt1,4)

plot(0, color=color.gray)
plot(Overbought, color=color.red)
plot(Oversold, color=color.green)

plot(wt1, color=color.green)
longButton = input(title="Long", type=input.bool, defval=true)
shortButton = input(title="Short", type=input.bool, defval=true)

if(longButton==true)
    strategy.entry("long",1,when=crossover(wt1,Oversold) and time_cond)
    strategy.close("long",when=crossunder(wt1, Overbought))
    
if(shortButton==true)
    strategy.entry("short",0,when=crossunder(wt1, Overbought) and time_cond)
    strategy.close("short",when=crossover(wt1,Oversold))

//strategy.close_all(when= not (london or newyork),comment="time")
if(dayofweek == dayofweek.friday)
    strategy.close_all(when= timeinrange(timeframe.period, "1300-1400"), comment="friday") 

Mehr