Trend nach einer auf Stochastik und CCI basierenden Strategie

Schriftsteller:ChaoZhang, Datum: 2023-11-22 16:23:31
Tags:

img

Übersicht

Diese Strategie kombiniert Stochastic-Indikator und CCI-Indikator, um die Trendrichtung zu identifizieren, und verwendet Rate of Change-Indikator, um Range-gebundene Trends auszufiltern, um dem Trend zu folgen.

Strategie Logik

  1. Der Stochastische Indikator beurteilt das bullische/bärenische Muster
    Das goldene Kreuz von Stochastic ist ein Kaufsignal, während das Todeskreuz ein Verkaufssignal ist.
  2. Der CCI-Indikator bestimmt die Trendrichtung CCI über 0 zeigt einen bullischen Markt an, während unter 0 ein bärischer Markt ist
  3. Der Indikator Veränderungsrate filtert den Bereichsgebundenen Trend
    Festlegen von Parametern der Veränderungsrate, um zu beurteilen, ob der Preis in einem aktiven Trend ist
  4. Einreise- und Ausreisevorschriften Langer Eintrag: Stochastisches Goldenkreuz & CCI > 0 & aktiver Trend Kurzer Eintrag: Stochastischer Todeskreuz & CCI < 0 & aktiver Trend Stop-Loss-Ausstieg: 3% Stop-Loss sowohl für die Long- als auch für die Short-Seite

Pro-Analyse

  1. Die Kombination von Stochastic und CCI verbessert die Genauigkeit der Trendbeurteilung
  2. Rate of Change filtert Trendgrenzen aus und vermeidet ungültige Trades
  3. Sowohl langer als auch kürzerer Handel, in der Lage, verschiedene Trendtypen zu erfassen
  4. Breakout-Eintritt rechtzeitig fängt Trend-Chance
  5. Strenge Stop-Loss verhindert große Verluste und kontrolliert das Risiko

Risikoanalyse

  1. Eine falsche Einstellung der Parameter kann zu einer überkonservativen oder aggressiven Strategie führen
  2. Begrenzte Wirkung der Indikatoren, kann bei extremen Marktbedingungen fehlschlagen
  3. Der Breakout-Eintrag verpasst eine frühe Phase der Trends und verzichtet auf einen Teil des Gewinns
  4. Zu enge oder zu breite Stoppverluste scheitern bei der Risikokontrolle

Optimierungsrichtlinien

  1. Parameteroptimierung zur Suche nach optimaler Kombination
  2. Mehr Trendindikatoren hinzufügen, um die Wirksamkeit zu verbessern
  3. Verwenden Sie einen nachfolgenden Stop-Loss oder einen zeitbasierten Stop-Loss, um die Wahrscheinlichkeit einer Verletzung des Stop-Loss zu verringern
  4. Hinzufügen von Risikometriken wie maximalem Abzug, um das Risiko vollständig zu kontrollieren

Zusammenfassung

Diese Strategie beurteilt die Trendrichtung durch Integration von Stochastic-, CCI- und Rate of Change-Indikatoren und erfasst Trendchancen mit Breakout-Tracking. Ihre Vorteile liegen in einem genauen Urteil, das durch Indikatorenkombination, Filterung des Bereichsmarktes und strengen Stop-Loss zur Risikokontrolle ermöglicht wird. Der nächste Schritt besteht darin, die Strategie durch Parameteroptimierung, mehrere Indikatoren, Stop-Loss-Strategie weiter zu verbessern, um sie robuster und flexibler zu machen.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Stochastic CCI BF 🚀", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// 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

///////////// CCI ///////////// 
src = close
ccilength = input(13, minval=1, title="CCI Length")
c=cci(src, ccilength)

///////////// Stochastic ///////////// 
len = input(19, minval=1, title="RSI Length")
lenema = input(12, minval=1, title="RSI-EMA Length")
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
out = ema(rsi, lenema)

///////////// Rate Of Change ///////////// 
source = close
roclength = input(30, minval=1)
pcntChange = input(7.0, 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 = out > out[1] and isMoving() and c > 0
short = out < out[1] and isMoving() and c < 0

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(3.0, title='Stop Loss %') / 100 

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("L",  strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)
    strategy.exit("L Ex", "L", stop=long_sl, when=since_longEntry > 0)
    strategy.exit("S Ex", "S", stop=short_sl, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30)
bgcolor(not isMoving() ? color.white : long ? color.lime : short ? color.red : na, transp=80)
plot(out, color = out > out[1] ? color.lime:color.red, linewidth = 2, title="Stoch")
plot(c, color = c > 0 ? color.lime:color.red, linewidth = 2, title="CCI")

Mehr