Preis-EMA mit stochastischer Optimierung basierend auf maschinellem Lernen

Schriftsteller:ChaoZhang, Datum: 2024-01-26 14:57:08
Tags:

img

Übersicht

Diese Strategie kombiniert den glatten gleitenden Durchschnitt mit dem stochastischen Indikator, um mehr Chancen in Trends zu erfassen. Sie verwendet hauptsächlich zwei exponentielle gleitende Durchschnitte mit verschiedenen Perioden, um Handelssignale zu generieren, zusammen mit der Überquerung der K-Linie und der D-Linie im stochastischen Indikator für die Eintrittszeitwahl, um eine höhere Rentabilität in Trends zu erzielen.

Strategieprinzip

Die Strategie verwendet 12-Perioden- und 26-Perioden-gleitende gleitende Durchschnitte. Wenn die schnelle Linie über die langsame Linie von unten kreuzt, gehen Sie lang. Wenn die schnelle Linie unter die langsame Linie von oben kreuzt, gehen Sie kurz. Um gefälschte Signale zu filtern, erfordert es, dass die schnellen und langsamen Linien in der gleichen Richtung liegen, wobei die schnelle Linie über der langsamen Linie für lang und die schnelle Linie unter der langsamen Linie für kurz ist.

Die Kreuzung von K-Linie und D-Linie im Stochastischen Indikator wird für die Eintrittszeitwahl verwendet. Wenn die K-Linie über die D-Linie von unterhalb der überkauften Linie geht, gehen Sie lang. Wenn die K-Linie unter die D-Linie von über der überverkauften Linie geht, gehen Sie kurz.

Der Stochastische Indikator filtert das Geräusch und wählt den Einstiegszeitpunkt aus.

Vorteile der Strategie

  • Der gleitende Durchschnitt selbst hat die Eigenschaft, dem Trend zu folgen und Trends leicht zu verfolgen.
  • Nutzen Sie Stochastic, um Lärm zu filtern und die Rentabilität zu verbessern
  • Die Kombination aus schnellen und langsamen MA ermöglicht den Einstieg, wenn sich der schnelle MA in einen langsamen MA zurückzieht, wodurch ein besserer Risiko-Renditeverhältnis erzielt wird.
  • Die Kreuzung von K- und D-Linie ermöglicht eine weitere Zeitoptimierung

Daher könnte diese Strategie dem Trend selektiv folgen, um Chancen zu nutzen und eine höhere Rentabilität zu erzielen.

Risikoanalyse

  • Hohe Gefahr eines vorzeitigen Ausstiegs auf kurze Sicht. Die Signale können abgelehnt oder eingeschlossen werden, wenn sich ein schneller MA in einen langsamen MA zurückzieht
  • Da es dem Trend folgt, kann es sich nicht schnell an eine drastische Trendwende anpassen, was zu großen Verlusten führt.

Um diese Risiken zu reduzieren, könnten wir einen Stop-Loss festlegen oder moderatere MA-Parameter anwenden.

Optimierungsrichtlinien

Die Strategie könnte aus folgenden Gesichtspunkten weiter optimiert werden:

  1. Versuche verschiedene Kombinationen von MA-Parametern, um die optimale
  2. Verschiedene Kombinationen von Stochastischen Parametern testen
  3. Hinzufügen einer Stop-Loss-Strategie
  4. Hinzufügen dynamischer Stop-Loss auf Basis der Volatilität
  5. Optimierung der Prüfparameter für verschiedene Produkte und Zeitrahmen
  6. Benutzung von Algorithmen für maschinelles Lernen zur Optimierung von Parametern

Durch das Testen verschiedener Parameterkombinationen könnten bessere Parameter gefunden werden.

Schlussfolgerung

Die Strategie integriert die Stärken von Smooth Moving Average und Stochastic für die Trendverfolgung und wählt gleichzeitig einen besseren Einstiegszeitpunkt. Sie ist einfach zu bedienen, mit kontrollierbarem Risiko und großem praktischen Wert. Ihre Leistung könnte durch kontinuierliche Tests und Optimierungen weiter verbessert werden. Sie bietet Quant-Händlern ein effizientes und stabiles Trendverfolgungsmodell.


/*backtest
start: 2024-01-18 00:00:00
end: 2024-01-25 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
// author SoftKill

strategy(title="Price EMA with stock", shorttitle="EMA STOCH", overlay=true)
src = input(title="Source", type=input.source, defval=close)

src_0 = src[0]
src_1 = src[1]
src_2 = src[2]
src_3 = src[3]
src_4 = src[4]

len50 = input(50, minval=1, title="Length")
src50 = input(close, title="Source")
out50 = ema(src50, len50)
len100 = input(100)
src100 = input(close, title="Source")
out100 = ema(src100, len100)

len1 = input(1, minval=1, title="Length")
src1 = input(close, title="Source")
out1 = sma(src1, len1)

length = input(5, minval=1)
OverBought = input(80)
OverSold = input(20)
smoothK = 3
smoothD = 3

k = sma(stoch(close, high, low, length), smoothK)
d = sma(k, smoothD)
cu = crossover(k,OverSold)
co = crossunder(k,OverBought)

sma_down = crossunder(out1, out50)
sma_up = crossover(out1,out50)

//if (not na(k) and not na(d))
  //  if (co and k < OverSold)
    //    strategy.entry("StochLE", strategy.long, comment="StochLE")
    //if (cu and k > OverBought)
     //   strategy.entry("StochSE", strategy.short, comment="StochSE")

crossCandle_4 = crossover(src[4],out50)
crossCandleUnder_4= cross(src[4],out50)
crossCandle_3 = crossover(src[3],out50)
crossCandleUnder_3= crossunder(src[3],out50)
crossCandle_2 = crossover(src[2],out50)
crossCandleUnder_2= crossunder(src[2],out50)
crossCandle_1 = crossover(src[1],out50)
crossCandleUnder_1= crossunder(src[1],out50)
crossCandle_0 = crossover(src[0],out50)
crossCandleUnder_0= crossunder(src[0],out50)

conditionOver = (crossCandle_4 or crossCandle_3 or crossCandle_2 or crossCandle_1 or crossCandle_0)
conditionUnder =(crossCandleUnder_4 or crossCandleUnder_3 or crossCandleUnder_2 or crossCandleUnder_1 or crossCandleUnder_0)

touch4 = (cross(low[4],out50) or cross(high[4],out50))
touch3 = (cross(low[3],out50) or cross(high[3],out50))
touch2 = (cross(low[2],out50) or cross(high[2],out50))
touch1 = (cross(low[1],out50) or cross(high[1],out50))

touch = touch1 or touch2 or touch3 or touch4

//and sma_up
//and sma_down

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src_macd = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src_macd, fast_length) : ema(src_macd, fast_length)
slow_ma = sma_source ? sma(src_macd, slow_length) : ema(src_macd, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
//plot(macd, title="MACD", color=col_macd, transp=0)
//plot(signal, title="Signal", color=col_signal, transp=0)


// plot((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close >= out50 and  (cu) and out50 > out100 and hist>=0 , title="Buy", style=plot.style_columns, color=color.lime)
// plot((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close <= out50 and  (co) and out50< out100 and hist<=0 , title="sell", style=plot.style_columns, color=color.red)


long_cond = ((conditionOver or conditionUnder or touch)  and src[0] >= out50 and close > out50 and  (cu) and out50 > out100 and hist>=0)
short_cond = ((conditionOver or conditionUnder or touch)  and src[0] <= out50 and close < out50 and  (co) and out50< out100 and hist<=0)

tp=input(0.1)
sl=input(0.1)

strategy.entry("long",strategy.long, when=long_cond)
strategy.entry("short",strategy.short, when=short_cond)

strategy.exit("X_long", "long", profit=close * tp / syminfo.mintick,  loss=close * sl / syminfo.mintick, when=touch  )
strategy.exit("x_short", "short",profit=close * tp / syminfo.mintick,loss=close * sl / syminfo.mintick,when = touch )

// //tp = input(0.0003, title="tp")
// tp = 0.0003
// //sl = input(1.0 , title="sl")
// sl = 1.0
// strategy.exit("closelong", "long" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closelong")
// strategy.exit("closeshort", "short" , profit = close * tp / syminfo.mintick, loss = close * sl / syminfo.mintick, alert_message = "closeshort")

Mehr