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 stratégie prend des décisions de négociation principalement sur la base des indicateurs et des conditions suivants:
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.
Indicateur CCI: Utilisé pour déterminer si le prix est suracheté ou survendu.
Indicateur RSI: aide à évaluer les niveaux de surachat/survente.
Volume de négociation: nécessite une rupture avec une certaine valeur moyenne mobile.
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.
La stratégie combine plusieurs indicateurs et conditions pour filtrer les signaux incertains et rendre les décisions plus fiables:
Le filtre de tendance évite les marchés volatils peu clairs.
Les canaux Keltner identifient les niveaux d'évasion clés.
Les signaux CCI et RSI sont relativement précis.
Une augmentation de volume aide à prévenir de fausses éruptions.
Principaux risques:
Un jugement erroné de la tendance peut manquer des tendances plus fortes.
Des paramètres d'indicateur incorrects peuvent provoquer des signaux manqués ou faux.
Un grossissement de volume inefficace laisse un risque de fausse rupture.
Directions d'optimisation potentielles:
Testez différents types et longueurs de MA pour un meilleur filtre de tendance.
Optimiser les paramètres des canaux Keltner, CCI, RSI pour des signaux plus précis.
Testez différents multiplicateurs de volume pour trouver le niveau optimal.
Considérez l'ajout d'un stop loss pour limiter la perte maximale par transaction.
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)