Stratégie de trading bidirectionnelle longue et courte avec filtrage des tendances CCI+RSI+KC

CCI RSI KC SMA EMA SMMA CMA TMA
Date de création: 2024-05-15 16:56:03 Dernière modification: 2024-05-15 16:56:03
Copier: 1 Nombre de clics: 670
1
Suivre
1617
Abonnés

Stratégie de trading bidirectionnelle longue et courte avec filtrage des tendances CCI+RSI+KC

Aperçu

Cette stratégie utilise les trois indicateurs techniques CCI, RSI et KC, associés à un filtre de tendance, pour réaliser des transactions bidirectionnelles multi-zones sur les paires de devises AUDNZD et GBPNZD. La stratégie utilise le CCI et le RSI pour juger des situations de survente et de survente, le KC comme base de référence pour les arrêts de perte, tout en utilisant la moyenne mobile comme filtre de tendance pour les opérations d’ouverture de position en cas de tendance. La stratégie a été retracée sur les données historiques des 5 dernières années et a généré des gains stables.

Principe de stratégie

  1. Calculer les indices CCI, RSI et KC. Le KC est le nombre moyen de la ligne supérieure plus l’ATR, et le nombre moyen de la ligne inférieure moins l’ATR.
  2. Sélectionnez le type de moyenne mobile (SMA, EMA, SMMA, CMA ou TMA) en fonction des paramètres d’entrée et la méthode de filtrage de la tendance (Off, Positive ou Inverse).
  3. Conditions d’ouverture de position à plusieurs têtes: plus est autorisé, CCI < ligne de survente, prix de clôture < KC en baisse, RSI < ligne de survente, volume de transaction> 50 cycles en moyenne*Il n’y a pas de postes à pourvoir actuellement.
  4. Conditions pour ouvrir une position à vide: le couvert est autorisé, CCI> ligne de survente, prix de clôture> KC sur la voie, RSI> ligne de survente, volume de transaction> moyenne de 50 cycles*Le nombre de postes vacants est multiplié par le nombre de postes vacants.
  5. Conditions de mise en équilibre: CCI>0 ≠ position en équilibre à vide: CCI ≠
  6. Il y a une alerte à l’ouverture et une alerte à la fermeture des positions.

Avantages stratégiques

  1. La combinaison de plusieurs indicateurs permet d’obtenir un jugement global et d’améliorer la précision du signal.
  2. Le filtrage des tendances permet de s’adapter de manière flexible aux évolutions du marché.
  3. Les types de moyennes mobiles peuvent être choisis pour s’adapter à différentes caractéristiques du marché.
  4. Les données historiques ont été vérifiées depuis longtemps, la stabilité est bonne et convient à une utilisation à long terme.
  5. Les échanges bilatéraux, adaptés à toutes les situations, offrent de nombreuses opportunités de profit.
  6. Le niveau d’automatisation est élevé, il ne nécessite pas d’intervention humaine et économise du temps et de l’énergie.

Risque stratégique

  1. L’absence d’un stop-loss traditionnel peut entraîner une retraite plus importante en cas de situation extrême.
  2. Les marchés instables peuvent entraîner des positions faibles fréquentes et des coûts de transaction plus élevés.
  3. Avec un cycle CCI relativement court, il est possible d’obtenir des signaux de bruit.
  4. Le filtrage des tendances est limité lorsque les tendances ne sont pas claires ou que les fluctuations du marché sont plus fortes.
  5. Les positions fixes ne peuvent pas s’adapter aux fluctuations du marché.

Orientation de l’optimisation de la stratégie

  1. On peut envisager d’augmenter le stop-loss mobile ou le stop-loss à points fixes pour contrôler le risque d’une seule transaction.
  2. Les paramètres du RSI et du CCI peuvent être optimisés davantage pour réduire le signal de bruit.
  3. L’introduction d’indicateurs de volatilité tels que l’ATR peut être envisagée pour ajuster les positions et les arrêts en fonction des fluctuations du marché.
  4. Ajouter plus de paires de devises et optimiser les paramètres individuellement en fonction des caractéristiques de chaque variété.
  5. Il est également possible d’essayer d’introduire des technologies d’intelligence artificielle telles que l’apprentissage automatique et d’adapter les paramètres d’optimisation.

Résumer

La stratégie utilise plusieurs indicateurs classiques, et la compilation et le retesting sont plus faciles sur la vue de trading. Les résultats de retesting sont bons, mais il est également nécessaire de surveiller le contrôle des risques et d’ajuster les paramètres dans le jeu réel. Il est recommandé de tester d’abord un petit capital, puis d’augmenter progressivement les investissements après avoir accumulé de l’expérience.

Code source de la stratégie
/*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)