Trendfilter Quantitative Strategie auf der Grundlage von Keltner-Kanälen und CCI-Indikator

Schriftsteller:ChaoZhang, Datum: 2024-02-27 15:47:20
Tags:

img

Übersicht

Diese Strategie kombiniert Keltner Channels, CCI-Indikator und RSI-Indikator mit Handelsvolumenbedingungen, um eine relativ vollständige Trendfilter-quantitative Handelsstrategie zu erstellen. Sie erzeugt Kauf- und Verkaufssignale, wenn die Preise durch Schlüsselbereiche durchbrechen, Indikatoren Handelssignale geben und große Handelsvolumina erscheinen. Gleichzeitig werden gleitende Durchschnitte für das Trendbeurteilungsverfahren verwendet, um den Handel ohne einen klaren Trend zu vermeiden.

Strategie Logik

Die Strategie trifft Handelsentscheidungen hauptsächlich auf der Grundlage folgender Indikatoren und Bedingungen:

  1. Keltner-Kanäle: Berechnen Sie die oberen und unteren Bands anhand des typischen Preises und des ATR über einen Zeitraum, um festzustellen, ob der Preis innerhalb des Kanals liegt.

  2. CCI-Indikator: Wird verwendet, um festzustellen, ob der Preis überkauft oder überverkauft ist.

  3. RSI-Indikator: Hilft bei der Beurteilung von Überkauf-/Überverkaufswerten.

  4. Handelsvolumen: Erfordert einen Ausbruch eines bestimmten gleitenden Durchschnittswerts.

  5. Trendfilter mit MAs: Verwenden Sie SMA, EMA usw. zur Bestimmung der allgemeinen Trendrichtung.

Bei Erfüllung der Trendrichtung werden Kauf- und Verkaufssignale erzeugt, wenn der Preis durchbricht, Keltner Channel-Bänder, CCI und RSI geben Signale und das Handelsvolumen steigt.

Vorteile

Die Strategie kombiniert mehrere Indikatoren und Bedingungen, um unsichere Signale zu filtern und Entscheidungen zuverlässiger zu treffen:

  1. Der Trendfilter vermeidet unklare volatile Märkte.

  2. Keltner-Kanäle identifizieren wichtige Ausbruchsniveaus.

  3. Die CCI- und RSI-Signale sind relativ genau.

  4. Ein Volumenanstieg verhindert einige falsche Ausbrüche.

Risiken

Hauptrisiken:

  1. Eine falsche Beurteilung des Trends kann starke Trends verpassen.

  2. Falsche Indikatorparameter können fehlende oder falsche Signale verursachen.

  3. Eine unwirksame Volumenvergrößerung birgt ein falsches Ausbruchrisiko.

Optimierungsrichtlinien

Potenzielle Optimierungsrichtungen:

  1. Versuche verschiedene MA-Typen und -Längen für einen besseren Trendfilter.

  2. Optimieren Sie die Parameter von Keltner-Kanälen, CCI, RSI für genauere Signale.

  3. Versuche verschiedene Volumenmultiplikatoren, um den optimalen Wert zu finden.

  4. Überlegen Sie, ob Sie einen Stop-Loss hinzufügen, um den maximalen Verlust pro Trade zu begrenzen.

Schlussfolgerung

Insgesamt kombiniert diese Strategie Keltner-Kanäle, CCI, RSI-Indikatoren und Handelsvolumenbedingungen, um eine relativ vollständige Trendfilter-Quantitative-Handelsstrategie zu erstellen. Sie hat Vorteile wie die Vermeidung unklarer volatiler Märkte, die Identifizierung von Schlüsselmultiplizierungen, das Erhalten relativ genauer Überkauf-/Überverkaufssignale und die Verhinderung einiger falscher Ausbrüche. Risiken bestehen in Aspekten wie unsachgemäße Parameter-Einstellungen und ineffektive Volumenvergrößerung. Weitere Optimierungen können an der Trendfiltermethode, Indikatorparametern, Volumenmultiplikator und dem Hinzufügen von Stop-Loss-Mechanismen durchgeführt werden.


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

//@version=4
strategy("Custom Keltner CCI Strategy with Trend Filter", overlay=true )
// Input Parameters for allowing long and short trades
allowLong = input(true, title="Allow Long Trades")
allowShort = input(true, title="Allow Short Trades")
// Trend Filter Inputs
maType = input(title="MA Type", options=["OFF", "SMA", "EMA", "SMMA", "CMA", "TMA"], defval="OFF")
trendFilterMethod = input(title="Trend Filter Method", options=["OFF", "Normal", "Reversed"], defval="OFF")
maLength = input(14, title="MA Length")
// Other Input Parameters
lengthKC = input(30, title="Keltner Channels Length")
multKC = input(0.7, title="Keltner Channels Multiplier")
lengthCCI = input(5, title="CCI Length")
overboughtCCI = input(75, title="CCI Overbought Level")
oversoldCCI = input(-75, title="CCI Oversold Level")
rsiPeriod = input(30, title="RSI Period")
rsiOverbought = input(60, title="RSI Overbought Level")
rsiOversold = input(60, title="RSI Oversold Level")
volumeMultiplier = input(0, title="Volume Multiplier", type=input.float, step=0.1, minval=0)
// Define Moving Averages
var float maValue = na
if (maType == "SMA")
    maValue := sma(close, maLength)
else if (maType == "EMA")
    maValue := ema(close, maLength)
else if (maType == "SMMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (maValue[1] * (maLength - 1) + close) / maLength
else if (maType == "CMA")
    maValue := na(maValue[1]) ? sma(close, maLength) : (sma(close, maLength) + (sma(close, maLength) - maValue[1])) / 2
else if (maType == "TMA")
    maValue := sma(sma(close, round(maLength/2)), round(maLength/2)+1)
// Entry Conditions with Trend Filter
longCondition = allowLong and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close > maValue) or (trendFilterMethod == "Reversed" and close < maValue))
shortCondition = allowShort and (trendFilterMethod == "OFF" or (trendFilterMethod == "Normal" and close < maValue) or (trendFilterMethod == "Reversed" and close > maValue))
// Keltner Channels
typicalPrice = hlc3
middleLine = sma(typicalPrice, lengthKC)
range = multKC * atr(lengthKC)
upperChannel = middleLine + range
lowerChannel = middleLine - range
// CCI
cci = cci(close, lengthCCI)
// RSI
rsi = rsi(close, rsiPeriod)
// Volume
volCondition = volume > sma(volume, 50) * volumeMultiplier
// Combined Entry Conditions with Trend Filter
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition
// Execute orders at the open of the new bar after conditions are met
if (longCondition)
    strategy.entry("Long", strategy.long)
if (shortCondition)
    strategy.entry("Short", strategy.short)
// Exit Conditions
strategy.close("Long", when = cci > 0)
strategy.close("Short", when = cci < 0)
// Plotting
plot(upperChannel, color=color.red, linewidth=1)
plot(lowerChannel, color=color.green, linewidth=1)
hline(overboughtCCI, "Overbought", color=color.red)
hline(oversoldCCI, "Oversold", color=color.green)

Mehr