Die Ressourcen sind geladen. Beförderung...

Das Dual Quant Trading System

Schriftsteller:ChaoZhang, Datum: 2024-02-26 14:30:54
Tags:

img

Diese Strategie kombiniert den CCI-Indikator, den RSI-Indikator und zwei gleitende Durchschnitte in einem zusammengesetzten Handelssystem.

Strategieprinzip

Die Strategie verwendet hauptsächlich den CCI-Indikator, um die Trendrichtung zu bestimmen. CCI-Werte über 100 zeigen einen bullischen Markt an, während diejenigen unter -100 einen bärischen Markt anzeigen. Das System verwendet zwei gleitende Durchschnittskreuzungen, um die Trendrichtung zu bestimmen.

Nach der Bestimmung des bullischen oder bärischen Trends verwendet das System dann die Überschneidung von zwei RSI mit unterschiedlichen Parameterlängen als Eintrittsverifizierung. Zum Beispiel in einem Bullenmarkt, wenn der kurzfristige RSI über den langfristigen RSI überschreitet, ist es das endgültige Kaufsignal. Dieses Design filtert hauptsächlich Rauschen aus, um falsche Trades zu vermeiden, die durch kurzfristige Korrekturen während der Trends ausgelöst werden.

Die Strategie eröffnet nur Positionen während der angegebenen Handelssitzung und schließt alle Positionen aktiv 15 Minuten vor dem Schließen, um das Übernachtungsrisiko zu vermeiden.

Analyse der Vorteile

  • Durch die Kombination von Trendbeurteilung und Indikator-Kreuzungen können Trends effektiv ermittelt und Geräusche für präzise Einträge ausgefiltert werden
  • Die Verwendung von Trailing Stops zur aktiven Kontrolle von Risiken verhindert, dass Sie aufgrund von Flash-Abstürzen ausgeschaltet werden
  • Nur die Eröffnung von Positionen während bestimmter Handelssitzungen vermeidet das Overnight-Gap-Risiko
  • Anpassungsfähige RSI-Parameter können sich flexibel an verschiedene Marktumgebungen anpassen

Risikoanalyse

  • CCI zeigt eine schlechte Performance auf ungewöhnlich volatilen Märkten
  • Doppel-RSI-Kreuzbedingungen sind relativ streng und könnten einige Chancen verpassen
  • Die Verzögerung kann übermäßig subjektiv sein und eine Optimierung der Parameter erfordern.
  • Bestimmte Handelssitzungen können große Nachrichtenlücken über Nacht verpassen

Optimierungsvorschläge

  • Versuche verschiedene CCI-Parameterkombinationen, um optimale Einstellungen zu finden
  • Prüfung, bei der die RSI-Crossover-Bedingung entfernt und direkt auf der Grundlage von CCI durchgeführt wird
  • Backtest und Optimierung der Trailing Stop-Parameter, um optimale Einstellungen zu finden
  • Testen Sie die Logik des erzwungenen Positionsschließens und verfolgen Sie stattdessen die Gewinne mit Trailing Stops während der Positionen, um die Gewinne zu maximieren

Zusammenfassung

Diese Strategie berücksichtigt umfassend Trendbestimmung und Indikator-Crossover-Validierung, um die Signalgültigkeit zu gewährleisten und gleichzeitig das Risiko zu kontrollieren. Durch Parameteroptimierung und Logikanpassungen hat die Strategie ein weiteres Potenzial, Gewinnchancen zu erweitern und verpasste Chancen zu reduzieren. Dies ist ein sehr vielversprechendes Handelskonzept.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © rwestbrookjr

//@version=5
strategy("EMA with RSI Cross Strategy", overlay=true)

//EMA
fastLen = input(title='Fast EMA Length', defval=9)
slowLen = input(title='Slow EMA Length', defval=20)

fastEMA = ta.ema(close, fastLen)
slowEMA = ta.ema(close, slowLen)

fema = plot(fastEMA, title='FastEMA', color=color.new(color.green, 0), linewidth=1, style=plot.style_line)
sema = plot(slowEMA, title='SlowEMA', color=color.new(color.red, 0), linewidth=1, style=plot.style_line)

fill(fema, sema, color=fastEMA > slowEMA ? color.new(#417505, 50) : color.new(#890101, 50), title='Cloud')

// Bull and Bear Alerts
//Bull = ta.crossover(fastEMA, slowEMA)
Bull = fastEMA > slowEMA
//Bear = ta.crossunder(fastEMA, slowEMA)
Bear = fastEMA < slowEMA

//RSIs
rsiLength1Input = input.int(9, minval=1, title="RSI Length", group="RSI Settings")
rsiSource1Input = input.source(close, "Source", group="RSI Settings")
rsiLength2Input = input.int(20, minval=1, title="RSI Length", group="RSI Settings")
rsiSource2Input = input.source(close, "Source", group="RSI Settings")

up1 = ta.rma(math.max(ta.change(rsiSource1Input), 0), rsiLength1Input)
down1 = ta.rma(-math.min(ta.change(rsiSource1Input), 0), rsiLength1Input)
rsi = down1 == 0 ? 100 : up1 == 0 ? 0 : 100 - (100 / (1 + up1 / down1))
up2 = ta.rma(math.max(ta.change(rsiSource2Input), 0), rsiLength2Input)
down2 = ta.rma(-math.min(ta.change(rsiSource2Input), 0), rsiLength2Input)
rsi2 = down2 == 0 ? 100 : up2 == 0 ? 0 : 100 - (100 / (1 + up2 / down2))

//CCI
cciLength = input.int(20, minval=1)
src = input(hlc3, title="Source")
ma = ta.sma(src, cciLength)
cci = (src - ma) / (0.015 * ta.dev(src, cciLength))

//Trail Stop Setup
trstp = input.float(title="Trail Loss($)", minval = 0.0, step = 0.01, defval = 0.5)

longStop = 0.0, shortStop = 0.0

longStop := if Bull
    stopValue = close - trstp
    math.max(stopValue, longStop[1])
else
    0.0

shortStop := if Bear
    stopValue = close + trstp
    math.min(stopValue, shortStop[1])
else
    999999


//Session Setup
open_session=input(defval="0930-1545")
session = time("1", open_session)
validSession=(na(session) ? 0 : 1)

//Trade Signals
longCondition = Bull and cci > 100 and ta.crossover(rsi,rsi2) and validSession
if (longCondition)
    strategy.entry("Long", strategy.long, 1)
    
//longExit = close > strategy.opentrades.entry_price(0) + 1.5 or close < strategy.opentrades.entry_price(0) - 0.75
longExit = close < longStop or not validSession
if (longExit)
    strategy.close("Long")

shortCondition = Bear and cci < 100 and ta.crossunder(rsi,rsi2) and validSession
if (shortCondition)
    strategy.entry("Short", strategy.short, 1)

//shortExit = close < strategy.opentrades.entry_price(0) - 1.5 or close > strategy.opentrades.entry_price(0) + 0.75
shortExit = close > shortStop or not validSession
if (shortExit)
    strategy.close("Short")


Mehr