Les ressources ont été chargées... Je charge...

La valeur de l'échange est la valeur de l'échange à l'échelle de l'échange.

Auteur:ChaoZhang est là., Date: 2024-05-15 16:56:03 Je vous en prie.
Les étiquettes:CCIIndice de résistanceKCSMALe taux d'intérêtLe secteur privéL'AMCTMA

img

Résumé

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.

Principes de stratégie

  1. Calculez les indicateurs CCI, RSI et KC. La ligne KC supérieure est la ligne médiane plus ATR, et la ligne inférieure est la ligne médiane moins ATR.
  2. Sélectionnez le type de moyenne mobile (SMA, EMA, SMMA, CMA ou TMA) et la méthode de filtrage de tendance (OFF, Normal ou Inversé) en fonction des paramètres d'entrée.
  3. Conditions d'entrée à long terme: permettre une position longue, CCI < ligne de survente, close < ligne inférieure KC, RSI < ligne de survente, volume > multiplicateur de volume moyen sur 50 périodes, aucune position longue en cours.
  4. Conditions d'entrée à court terme: autoriser une position courte, CCI > ligne de surachat, close > ligne supérieure KC, RSI > ligne de surachat, volume > volume moyen de 50 périodes * multiplicateur, aucune position courte en cours.
  5. Condition de sortie longue: CCI > 0, condition de sortie courte: CCI < 0.
  6. Envoyer des alertes lors de l'ouverture et de la fermeture des positions.

Les avantages de la stratégie

  1. Combine plusieurs indicateurs pour une analyse complète, améliorant la précision du signal.
  2. Utilise des méthodes de filtrage des tendances, permettant des ajustements flexibles en fonction des tendances du marché.
  3. Offre plusieurs types de moyennes mobiles, adaptés aux différentes caractéristiques du marché.
  4. Validée à partir de données historiques à long terme, démontrant une bonne stabilité et une bonne aptitude à une utilisation à long terme.
  5. Le commerce bidirectionnel, adapté à diverses conditions de marché, offre plus de possibilités de profit.
  6. Hautement automatisé, ne nécessitant aucune intervention manuelle, ce qui permet d'économiser du temps et des efforts.

Risques stratégiques

  1. Il n'existe pas de stop-loss et de take-profit traditionnels, ce qui peut entraîner des retombées significatives dans des conditions de marché extrêmes.
  2. Il peut y avoir une ouverture et une fermeture fréquentes de positions sur des marchés instables, ce qui augmente les coûts de négociation.
  3. Utilise des périodes de CCI relativement courtes, générant potentiellement des signaux sonores.
  4. Les filtres de tendance peuvent avoir une efficacité limitée lorsque les tendances ne sont pas claires ou que la volatilité du marché augmente.
  5. Taille de position fixe, incapable de s'adapter aux changements de volatilité du marché.

Directions d'optimisation de la stratégie

  1. Considérez l'ajout de stops de suivi ou de stop-loss à point fixe pour contrôler le risque de transaction unique.
  2. Optimiser davantage les paramètres RSI et CCI pour réduire les signaux sonores.
  3. Il convient d'envisager l'introduction d'indicateurs de volatilité tels que l'ATR pour ajuster la taille des positions et les stop-loss en fonction de la volatilité du marché.
  4. Ajouter plus de paires de devises et optimiser les paramètres individuellement en fonction des caractéristiques de chaque instrument.
  5. tenter d'introduire l'apprentissage automatique et d'autres technologies d'IA pour l'optimisation des paramètres adaptatifs.

Résumé

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)


Relationnée

Plus de