Die Ressourcen sind geladen. Beförderung...

Die Risikopositionen werden von den Risikokapitalgebern und den Risikokapitalgebern in Bezug auf die Risikopositionen und die Risikopositionen der Risikokapitalgesellschaften geprüft.

Schriftsteller:ChaoZhang, Datum: 2024-05-15 16:56:03
Tags:CCIRSIKCSMAEMASMMACMATMA

img

Übersicht

Diese Strategie kombiniert drei technische Indikatoren: CCI, RSI und Keltner Channels (KC), zusammen mit einem Trendfilter, um einen bidirektionalen Handel auf AUDNZD und GBPNZD-Währungspaaren zu erreichen.

Strategieprinzipien

  1. Berechnen Sie die CCI-, RSI- und KC-Indikatoren. Die obere KC-Linie ist die Mittellinie plus ATR, und die untere Linie ist die Mittellinie minus ATR.
  2. Wählen Sie den gleitenden Durchschnittstyp (SMA, EMA, SMMA, CMA oder TMA) und die Trendfiltermethode (OFF, Normal oder Umgekehrt) anhand der Eingabeparameter aus.
  3. Long-Eintrittsbedingungen: erlauben Long, CCI < Überverkaufslinie, Close < KC Unterlinie, RSI < Überverkaufslinie, Volumen > 50-Perioden-Durchschnittsvolumen * Multiplikator, keine aktuelle Longposition.
  4. Kurze Eingangsbedingungen: kurz, CCI > überkaufte Linie, schließen > KC-Oberlinie, RSI > überkaufte Linie, Volumen > 50-Perioden-Durchschnittsvolumen * Multiplikator, keine aktuelle Leerposition.
  5. Lange Ausstiegsbedingung: CCI > 0, kurze Ausstiegsbedingung: CCI < 0.
  6. Senden von Warnungen bei Eröffnung und Schließung von Positionen.

Strategische Vorteile

  1. Kombiniert mehrere Indikatoren für eine umfassende Analyse und verbessert die Signalgenauigkeit.
  2. Verwendet Trendfiltermethoden, die flexible Anpassungen basierend auf Markttrends ermöglichen.
  3. Bietet mehrere gleitende Durchschnittsarten an, die sich an die verschiedenen Merkmale des Marktes anpassen.
  4. Validiert anhand langfristiger historischer Daten, die eine gute Stabilität und Eignung für den langfristigen Gebrauch aufweisen.
  5. Bidirektionale Handel, geeignet für verschiedene Marktbedingungen, bietet mehr Gewinnmöglichkeiten.
  6. Hoch automatisiert, ohne manuelle Eingriffe, Zeit und Mühe sparen.

Strategische Risiken

  1. Es fehlt an herkömmlichen Stop-Loss- und Take-Profit-Verfahren, die unter extremen Marktbedingungen möglicherweise zu erheblichen Abzügen führen.
  2. Kann häufiges Öffnen und Schließen von Positionen auf unruhigen Märkten erleben, was die Handelskosten erhöht.
  3. Verwendet relativ kurze CCI-Perioden, die möglicherweise Lärmsignale erzeugen.
  4. Die Effektivität von Trendfiltern kann begrenzt sein, wenn die Trends unklar sind oder die Marktvolatilität zunimmt.
  5. Festplatzierung der Positionen, die sich nicht an Veränderungen der Marktvolatilität anpassen kann.

Strategieoptimierungsrichtlinien

  1. Überlegen Sie, ob Sie Trailing-Stops oder Fix-Point-Stop-Losses hinzufügen, um das Single-Trade-Risiko zu kontrollieren.
  2. Weitere Optimierung der RSI- und CCI-Parameter zur Verringerung von Lärmsignalen.
  3. Es sollte in Erwägung gezogen werden, Volatilitätsindikatoren wie ATR einzuführen, um die Positionsgröße und Stop-Losses anhand der Marktvolatilität anzupassen.
  4. Sie können mehr Währungspaare hinzufügen und die Parameter individuell anhand der Merkmale jedes Instruments optimieren.
  5. Versuche, maschinelles Lernen und andere KI-Technologien für die adaptive Parameteroptimierung einzuführen.

Zusammenfassung

Diese Strategie verwendet mehrere klassische Indikatoren und ist relativ einfach zu programmieren und auf TradingView zu backtesten. Während die Backtesting-Ergebnisse gut sind, sind Risikokontrolle und Parameteranpassungen für den Live-Handel immer noch notwendig. Es wird empfohlen, mit kleinen Geldern zum Testen zu beginnen und die Investition allmählich zu erhöhen, wenn sich die Erfahrung ansammelt. Mit einem hohen Grad an Automatisierung eignet sie sich für konservative Anleger langfristig.


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

//@version=5
strategy('CCI Strategy with Trend Filter AUDNZD, GBPNZD', overlay=true, default_qty_type=strategy.cash, default_qty_value=50000, commission_value=0.0005, slippage=2, initial_capital=10000)

// State variables to ensure one entry per signal
var bool isLongOpen = false
var bool isShortOpen = false

// 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.string(title='MA Type', options=['OFF', 'SMA', 'EMA', 'SMMA', 'CMA', 'TMA'], defval='OFF')
trendFilterMethod = input.string(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.float(0, title='Volume Multiplier', step=0.1, minval=0)

// Define Moving Averages
var float maValue = na
if maType == 'SMA'
    maValue := ta.sma(close, maLength)
else if maType == 'EMA'
    maValue := ta.ema(close, maLength)
else if maType == 'SMMA'
    float initialSMMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? initialSMMA : (maValue[1] * (maLength - 1) + close) / maLength
else if maType == 'CMA'
    float firstSMA = ta.sma(close, maLength)
    float secondSMA = ta.sma(close, maLength)
    maValue := na(maValue[1]) ? firstSMA : (firstSMA + secondSMA - maValue[1]) / 2
else if maType == 'TMA'
    maValue := ta.sma(ta.sma(close, math.round(maLength / 2)), math.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 = ta.sma(typicalPrice, lengthKC)
range_1 = multKC * ta.atr(lengthKC)
upperChannel = middleLine + range_1
lowerChannel = middleLine - range_1

// CCI
cci = ta.cci(close, lengthCCI)

// RSI
rsi = ta.rsi(close, rsiPeriod)

// Volume
volCondition = volume > ta.sma(volume, 50) * volumeMultiplier

// Combined Entry Conditions with Trend Filter and state check
longCondition := longCondition and cci < oversoldCCI and low < lowerChannel and rsi < rsiOversold and volCondition and not isLongOpen
shortCondition := shortCondition and cci > overboughtCCI and high > upperChannel and rsi > rsiOverbought and volCondition and not isShortOpen

// Execute orders at the open of the new bar after conditions are met
if longCondition
    strategy.entry('Long', strategy.long)
    alert('LicenseID,buy,AUDNZD,risk=1')
    isLongOpen := true
if shortCondition
    strategy.entry('Short', strategy.short)
    alert('LicenseID,sell,AUDNZD,risk=1')
    isShortOpen := true

// Exit Conditions and Alerts
longExitCondition = cci > 0
shortExitCondition = cci < 0
if (longExitCondition and isLongOpen)
    strategy.close('Long')
    alert('LiceneseID,closelong,AUDNZD')
    isLongOpen := false
if (shortExitCondition and isShortOpen)
    strategy.close('Short')
    alert('LicenseID,closeshort,AUDNZD')
    isShortOpen := false

// Plotting
plot(upperChannel, color=color.new(color.red, 0), linewidth=1)
plot(lowerChannel, color=color.new(color.green, 0), linewidth=1)
hline(overboughtCCI, 'Overbought', color=color.red)
hline(oversoldCCI, 'Oversold', color=color.green)


Verwandt

Mehr