Cette stratégie combine trois indicateurs techniques: CCI, RSI et Keltner Channels (KC), ainsi qu'un filtre de tendance pour réaliser une négociation bidirectionnelle sur les paires de devises AUDNZD et GBPNZD. Elle utilise CCI et RSI pour déterminer les conditions de surachat et de survente, KC comme référence pour le stop-loss et le take-profit, et une moyenne mobile comme filtre de tendance pour ouvrir des positions en ligne avec la tendance.
Cette stratégie utilise plusieurs indicateurs classiques et est relativement facile à coder et à backtest sur TradingView. Bien que les résultats de backtesting soient bons, le contrôle des risques et les ajustements de paramètres sont toujours nécessaires pour le trading en direct. Il est recommandé de commencer avec de petits fonds pour le test et d'augmenter progressivement l'investissement à mesure que l'expérience s'accumule. Avec un haut degré d'automatisation, il convient aux investisseurs conservateurs à utiliser à long terme.
/*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)