Stratégie quantitative basée sur les canaux Keltner et l'indicateur CCI

Auteur:ChaoZhang est là., Date: le 27 février 2024 à 15h47
Les étiquettes:

img

Résumé

Cette stratégie combine les canaux Keltner, l'indicateur CCI et l'indicateur RSI avec des conditions de volume de négociation pour créer une stratégie de négociation quantitative de filtrage de tendance relativement complète. Elle génère des signaux d'achat et de vente lorsque les prix traversent des zones clés, les indicateurs donnent des signaux de négociation et de grands volumes de négociation apparaissent.

La logique de la stratégie

La stratégie prend des décisions de négociation principalement sur la base des indicateurs et des conditions suivants:

  1. Canaux Keltner: Calculer les bandes supérieures et inférieures en fonction du prix typique et de l'ATR sur une période pour déterminer si le prix se situe dans le canal.

  2. Indicateur CCI: Utilisé pour déterminer si le prix est suracheté ou survendu.

  3. Indicateur RSI: aide à évaluer les niveaux de surachat/survente.

  4. Volume de négociation: nécessite une rupture avec une certaine valeur moyenne mobile.

  5. Filtre de tendance avec MAs: Utilisez SMA, EMA, etc. pour déterminer la direction générale de la tendance.

Avec la condition de direction de tendance remplie, des signaux d'achat et de vente sont générés lorsque les prix dépassent les bandes du canal Keltner, le CCI et le RSI donnent des signaux, et le volume des transactions augmente.

Les avantages

La stratégie combine plusieurs indicateurs et conditions pour filtrer les signaux incertains et rendre les décisions plus fiables:

  1. Le filtre de tendance évite les marchés volatils peu clairs.

  2. Les canaux Keltner identifient les niveaux d'évasion clés.

  3. Les signaux CCI et RSI sont relativement précis.

  4. Une augmentation de volume aide à prévenir de fausses éruptions.

Les risques

Principaux risques:

  1. Un jugement erroné de la tendance peut manquer des tendances plus fortes.

  2. Des paramètres d'indicateur incorrects peuvent provoquer des signaux manqués ou faux.

  3. Un grossissement de volume inefficace laisse un risque de fausse rupture.

Directions d'optimisation

Directions d'optimisation potentielles:

  1. Testez différents types et longueurs de MA pour un meilleur filtre de tendance.

  2. Optimiser les paramètres des canaux Keltner, CCI, RSI pour des signaux plus précis.

  3. Testez différents multiplicateurs de volume pour trouver le niveau optimal.

  4. Considérez l'ajout d'un stop loss pour limiter la perte maximale par transaction.

Conclusion

Dans l'ensemble, cette stratégie combine les canaux Keltner, l'ICC, les indicateurs RSI et les conditions de volume de négociation pour créer une stratégie de négociation quantitative de filtrage des tendances relativement complète. Elle présente des avantages tels que l'évitement de marchés volatils peu clairs, l'identification des événements clés, l'obtention de signaux de surachat / survente relativement précis et la prévention de certaines fausses ruptures. Des risques existent dans des aspects tels que des paramètres incorrects et un grossissement inefficace du volume. Des optimisations supplémentaires peuvent être effectuées sur la méthode de filtrage des tendances, les paramètres de l'indicateur, le multiplicateur de volume et l'ajout de mécanismes de stop loss.


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

Plus de