Stratégies de trading flexibles à long et à court terme basées sur les canaux Keltner

ATR EMA SMA MA TR
Date de création: 2025-02-10 15:07:12 Dernière modification: 2025-02-10 15:07:12
Copier: 4 Nombre de clics: 448
1
Suivre
1617
Abonnés

Stratégies de trading flexibles à long et à court terme basées sur les canaux Keltner

Aperçu

Il s’agit d’une stratégie de négociation flexible basée sur le Keltner Channel. La stratégie prend en charge le trading bidirectionnel polyvalent en surveillant les hauts et les bas des prix qui traversent le canal. Le cœur de la stratégie est de construire un canal de prix en utilisant une moyenne mobile (MA) et d’ajuster dynamiquement la largeur du canal en combinaison avec l’amplitude d’onde réelle (ATR) afin de maintenir l’adaptabilité de la stratégie dans différents environnements de marché.

Principe de stratégie

La stratégie repose principalement sur les principes suivants:

  1. la tendance centrale des prix calculés par EMA ou SMA, formant une trajectoire intermédiaire
  2. Utilisez ATR, TR ou Range pour calculer le taux de fluctuation et construire des voies d’atterrissage et de descente
  3. Un signal de multiplication est déclenché lorsque le prix dépasse la barre supérieure, un signal de rupture est déclenché lorsque le prix dépasse la barre inférieure
  4. Utilisation d’un mécanisme unique d’entrée et de sortie de stop loss pour améliorer la fiabilité de l’exécution des transactions
  5. Prise en charge de modes de négociation flexibles: faire plus, faire moins ou négocier dans les deux sens

Avantages stratégiques

  1. Adaptabilité - Adaptation dynamique de la largeur des canaux via l’ATR pour permettre à la stratégie de s’adapter à différents environnements de fluctuation du marché
  2. Contrôle des risques parfait - Utilisez un mécanisme unique de stop loss pour effectuer des transactions et contrôlez efficacement les risques
  3. Flexibilité opérationnelle - Prise en charge de plusieurs modes de négociation, adaptés aux caractéristiques du marché et aux préférences de négociation
  4. Vérifié efficace - performant sur les marchés de la crypto-monnaie et des actions, en particulier dans les marchés plus volatiles
  5. Visualisation claire - fournit des signaux de trading et un affichage intuitif de l’état des positions

Risque stratégique

  1. Risque de choc du marché - des signaux de fausse rupture fréquents peuvent être générés dans les marchés à choc horizontal
  2. Risque de glissement - les mandats stop-loss peuvent faire face à des glissements plus importants dans des marchés peu liquides
  3. Risque de renversement de tendance - risque de pertes plus importantes en cas de renversement soudain de tendance
  4. Sensitivité des paramètres - le choix des paramètres du canal a une influence importante sur la performance de la stratégie

Orientation de l’optimisation de la stratégie

  1. Introduction de filtres de tendance - pour réduire les faux signaux de rupture en ajoutant des indicateurs de jugement de tendance
  2. Optimisation des paramètres dynamiques - Adaptation dynamique des paramètres de la chaîne en fonction des fluctuations du marché
  3. Amélioration des mécanismes d’arrêt des pertes - ajout d’une fonction mobile d’arrêt des pertes pour mieux protéger les bénéfices
  4. Augmentation de la confirmation de la quantité de transaction - La combinaison des indicateurs de la quantité de transaction améliore la fiabilité du signal
  5. Optimisation de la gestion des positions - mise en place d’une gestion dynamique des positions pour une meilleure maîtrise des risques

Résumer

La stratégie est un système de négociation bien conçu et logiquement clair qui permet de saisir efficacement les opportunités du marché grâce à l’utilisation flexible des canaux Kettner et de divers indicateurs techniques. La stratégie est hautement personnalisable et adaptée aux traders ayant des préférences de risque différentes.

Code source de la stratégie
/*backtest
start: 2022-02-11 00:00:00
end: 2025-02-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy(title = "Jaakko's Keltner Strategy", overlay = true, initial_capital = 10000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

// ──────────────────────────────────────────────────────────────────────────────
// ─── USER INPUTS ─────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
length      = input.int(20,     minval=1,  title="Keltner MA Length")
mult        = input.float(2.0,             title="Multiplier")
src         = input(close,                 title="Keltner Source")
useEma      = input.bool(true,             title="Use Exponential MA")
BandsStyle  = input.string(title = "Bands Style", defval  = "Average True Range", options = ["Average True Range", "True Range", "Range"])
atrLength   = input.int(10,                title="ATR Length")

// Choose which side(s) to trade
tradeMode = input.string(title   = "Trade Mode", defval  = "Long Only", options = ["Long Only", "Short Only", "Both"])

// ──────────────────────────────────────────────────────────────────────────────
// ─── KELTNER MA & BANDS ───────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
f_ma(source, length, emaMode) =>
    maSma = ta.sma(source, length)
    maEma = ta.ema(source, length)
    emaMode ? maEma : maSma

ma    = f_ma(src, length, useEma)
rangeMa = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrLength) : ta.rma(high - low, length)

upper = ma + rangeMa * mult
lower = ma - rangeMa * mult

// ──────────────────────────────────────────────────────────────────────────────
// ─── CROSS CONDITIONS ─────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
crossUpper = ta.crossover(src, upper) // potential long signal
crossLower = ta.crossunder(src, lower) // potential short signal

// ──────────────────────────────────────────────────────────────────────────────
// ─── PRICE LEVELS FOR STOP ENTRY (LONG) & STOP ENTRY (SHORT) ─────────────────
// ──────────────────────────────────────────────────────────────────────────────
bprice = 0.0
bprice := crossUpper ? high + syminfo.mintick : nz(bprice[1])

sprice = 0.0
sprice := crossLower ? low - syminfo.mintick : nz(sprice[1])

// ──────────────────────────────────────────────────────────────────────────────
// ─── BOOLEAN FLAGS FOR PENDING LONG/SHORT ─────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
crossBcond = false
crossBcond := crossUpper ? true : crossBcond[1]

crossScond = false
crossScond := crossLower ? true : crossScond[1]

// Cancel logic for unfilled orders (same as original)
cancelBcond = crossBcond and (src < ma or high >= bprice)
cancelScond = crossScond and (src > ma or low <= sprice)

// ──────────────────────────────────────────────────────────────────────────────
// ─── LONG SIDE ────────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
if (tradeMode == "Long Only" or tradeMode == "Both")  // Only run if mode is long or both
    // Cancel unfilled long if invalid
    if cancelBcond
        strategy.cancel("KltChLE")

    // Place long entry
    if crossUpper
        strategy.entry("KltChLE", strategy.long, stop=bprice, comment="Long Entry")

    // If we are also using “Both,” we rely on short side to flatten the long.
    // But if “Long Only,” we can exit on crossLower or do nothing.
    // Let’s do a "stop exit" if in "Long Only" (like the improved version).
    if tradeMode == "Long Only"
        // Cancel unfilled exit
        if cancelScond
            strategy.cancel("KltChLX")

        // Place exit if crossLower
        if crossLower
            strategy.exit("KltChLX", from_entry="KltChLE", stop=sprice, comment="Long Exit")

// ──────────────────────────────────────────────────────────────────────────────
// ─── SHORT SIDE ───────────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
if (tradeMode == "Short Only" or tradeMode == "Both") // Only run if mode is short or both
    // Cancel unfilled short if invalid
    if cancelScond
        strategy.cancel("KltChSE")

    // Place short entry
    if crossLower
        strategy.entry("KltChSE", strategy.short, stop=sprice, comment="Short Entry")

    // If “Short Only,” we might do a symmetrical exit approach for crossUpper
    // Or if "Both," going long automatically flattens the short in a no-hedge account.
    // Let's replicate "stop exit" for short side if "Short Only" is chosen:
    if tradeMode == "Short Only"
        // Cancel unfilled exit
        if cancelBcond
            strategy.cancel("KltChSX")

        // Place exit if crossUpper
        if crossUpper
            strategy.exit("KltChSX", from_entry="KltChSE", stop=bprice, comment="Short Exit")

// ──────────────────────────────────────────────────────────────────────────────
// ─── OPTIONAL VISUALS ─────────────────────────────────────────────────────────
// ──────────────────────────────────────────────────────────────────────────────
barcolor(strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na)

plotshape(    strategy.position_size > 0 and strategy.position_size[1] <= 0, title     = "BUY",  text      = '🚀',  style     = shape.labelup,    location  = location.belowbar,     color     = color.green,     textcolor = color.white,      size      = size.small)

plotshape(    strategy.position_size <= 0 and strategy.position_size[1] > 0,     title     = "SELL",     text      = '☄️',     style     = shape.labeldown,     location  = location.abovebar,     color     = color.red,       textcolor = color.white,     size      = size.small)

plotshape(crossLower, style=shape.triangledown, color=color.red, location=location.abovebar, title="CrossLower Trigger")