Trendwinkel-Gleitender-Durchschnitt-Crossover-Strategie


Erstellungsdatum: 2024-01-25 14:35:13 zuletzt geändert: 2024-01-25 14:35:13
Kopie: 2 Klicks: 1182
1
konzentrieren Sie sich auf
1617
Anhänger

Trendwinkel-Gleitender-Durchschnitt-Crossover-Strategie

Überblick

Die Strategie führt langfristige, wechselseitige Trades durch die Berechnung der Schräglage der Durchschnittslinie und die Bestimmung der Trendrichtung in Verbindung mit dem Preisänderungsindex. Sie besteht im Wesentlichen darin, die Preisentwicklung anhand der Schräglage der Durchschnittslinie zu bestimmen, sowie die Trendverfolgung, bei der der Preisänderungsindex überschritten wird.

Strategieprinzip

Die Strategie basiert auf folgenden Kennzahlen:

  1. Durchschnittswinkel: Der Kursverlauf wird durch die Berechnung der Schräglagewinkel der Jurik-Durchschnittswelle und des Index-Moving-Averages ermittelt. Ein Winkel größer als 0 ist ein Aufwärtstrend und kleiner als 0 ist ein Abwärtstrend.

  2. Preisänderungsrate: Berechnen Sie die Kursänderungsrate der letzten 12 K-Linien und filtern Sie die ungültigen Signale durch die Volatilität.

Wenn der Durchschnittswinkel nach oben (<=0) ist und die Preisänderung erfüllt die Bedingungen, machen Sie mehr; wenn der Durchschnittswinkel nach unten (<=0) ist und die Preisänderung erfüllt die Bedingungen, machen Sie leer.

Insbesondere berechnet die Strategie zunächst den Schräglagewinkel der Jurik-Mittellinie und der EMA. Dann wird ein Preisänderungsindikator für die Filterperiode berechnet. Es wird ein Handelssignal erzeugt, wenn der Schräglagewinkel eine Tendenz anzeigt und die Preisänderungsrate erfüllt ist.

Analyse der Stärken

Diese Strategie hat folgende Vorteile:

  1. Der Trend ist sehr zuverlässig und hat eine hohe Gewinnrate.

  2. Der Preiswechselindex kann die Schwankungen wirksam filtern und unwirksame Geschäfte vermeiden.

  3. Die Jurik-Gewinnlinie reagiert schnell auf den Durchbruch, während die EMA eine stabile Trendbeurteilung liefert, die sich ergänzt.

  4. Die langfristige, zweiseitige Handelsmethode kann bei Trends einen gewissen Gewinn erzielen.

Risikoanalyse

Die Strategie birgt auch einige Risiken:

  1. Bei starken Preisschwankungen besteht eine hohe Wahrscheinlichkeit für Fehlsignale. Dieses Risiko kann durch Optimierungsparameter verringert werden.

  2. Die Einheitliche Linie-Signal kann zu häufig wechseln, um zu viele unnötige Geschäfte zu erzeugen. Zusätzliche Filterbedingungen können hinzugefügt werden, um ungültige Geschäfte zu reduzieren.

  3. Stopps können durchbrochen werden, wenn ein unvorhergesehenes Ereignis zu einem Preissprung führt, und die Stopps können entsprechend gelockert werden.

Optimierungsrichtung

Die Strategie kann in folgenden Bereichen optimiert werden:

  1. Optimierung der Mittellinienparameter, Suche nach der optimalen Parameterkombination, Steigerung der Strategie-Stabilität.

  2. Erhöhung der Filterbedingungen wie Volatilität und Volumen, um die Anzahl der ungültigen Geschäfte weiter zu reduzieren.

  3. In Kombination mit anderen Indikatoren wird die Stop-Loss-Punkt-Bestimmung intelligenter gemacht.

  4. Die Entwicklung von Algorithmen, die sich an die Größe der Transaktionen anpassen, um die Gewinnspanne zu verbessern.

Zusammenfassen

Die Strategie ist insgesamt eine sehr praktische Trend-Tracking-Strategie. Sie nutzt eine mittlere Linie-Schlange, um Trends zu bestimmen, die sehr zuverlässig sind, und die Preisänderungsrate-Anzeige filtert wirksam ineffiziente Signale. Die langfristige, zweiseitige Handelsmethode bietet eine bessere Rendite. Durch kontinuierliche Optimierung kann die Strategie zu einer sehr stabilen und zuverlässigen Quantifizierungsstrategie werden.

Strategiequellcode
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// Based on ma angles code by Duyck which also uses Everget Jurik MA calulation and angle calculation by KyJ
strategy("Trend Angle BF", overlay=false)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true
    
src=input(ohlc4,title="source")

// definition of "Jurik Moving Average", by Everget
jma(_src,_length,_phase,_power) =>
    phaseRatio = _phase < -100 ? 0.5 : _phase > 100 ? 2.5 : _phase / 100 + 1.5
    beta = 0.45 * (_length - 1) / (0.45 * (_length - 1) + 2)
    alpha = pow(beta, _power)
    jma = 0.0
    e0 = 0.0
    e0 := (1 - alpha) * _src + alpha * nz(e0[1])
    e1 = 0.0
    e1 := (_src - e0) * (1 - beta) + beta * nz(e1[1])
    e2 = 0.0
    e2 := (e0 + phaseRatio * e1 - nz(jma[1])) * pow(1 - alpha, 2) + pow(alpha, 2) * nz(e2[1])
    jma := e2 + nz(jma[1])

//// //// Determine Angle by KyJ //// //// 
angle(_src) =>
    rad2degree=180/3.14159265359  //pi 
    ang=rad2degree*atan((_src[0] - _src[1])/atr(14)) 

jma_line=jma(src,10,50,1)
ma=ema(src,input(56))
jma_slope=angle(jma_line)
ma_slope=angle(ma)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(12, minval=1)
pcntChange = input(2, minval=1)
roc = 100 * (source - source[roclength]) / source[roclength]
emaroc = ema(roc, roclength / 2)
isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2))

/////////////// Strategy ///////////////
long = ma_slope>=0 and isMoving()
short = ma_slope<=0 and isMoving()

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])
sl_inp = input(2.0, title='Stop Loss %') / 100
tp_inp = input(900.0, title='Take Profit %') / 100 
 
take_level_l = strategy.position_avg_price * (1 + tp_inp)
take_level_s = strategy.position_avg_price * (1 - tp_inp) 

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na
slShort = strategy.position_avg_price * (1 + sl_inp)
long_sl = in_long_signal ? slLong : na
short_sl = in_short_signal ? slShort : na

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long",  strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0)
    strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0)
    
///////////// Plotting /////////////
hline(0, title='Zero line', color=color.purple, linewidth=1)
plot(ma_slope,title="ma slope", linewidth=2,color=ma_slope>=0?color.lime:color.red)
bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)