Stratégie de trading intelligente à double signal MACD et régression linéaire

MACD LRS WMA TEMA EMA SMA
Date de création: 2024-12-11 15:46:20 Dernière modification: 2024-12-11 15:46:20
Copier: 0 Nombre de clics: 361
1
Suivre
1617
Abonnés

Stratégie de trading intelligente à double signal MACD et régression linéaire

Aperçu

La stratégie est un système de trading intelligent qui combine MACD (indicateur de dispersion de convergence des moyennes mobiles) et la pente de régression linéaire (indicateur de régression linéaire). La stratégie optimise le calcul de l’indicateur MACD par une combinaison de plusieurs méthodes de moyennes mobiles et introduit l’analyse de régression linéaire pour renforcer la fiabilité du signal de trading.

Principe de stratégie

Le cœur de la stratégie est de capturer les tendances du marché à l’aide d’un MACD optimisé et d’un indicateur de régression linéaire. La partie MACD utilise une combinaison des quatre méthodes de calcul des moyennes mobiles SMA, EMA, WMA et TEMA, ce qui améliore la sensibilité à la tendance des prix. La partie de régression linéaire détermine la direction et l’intensité de la tendance en calculant la pente et la position de la ligne de régression.

Avantages stratégiques

  1. Flexibilité des combinaisons d’indicateurs: une combinaison d’indicateurs simples ou doubles peut être choisie en fonction de la situation du marché
  2. Calcul amélioré de la MACD: accurace accrue de la détection des tendances grâce à plusieurs méthodes de moyenne mobile
  3. Confirmation de tendance objective: la régression linéaire fournit un jugement de tendance avec un soutien mathématique
  4. Une meilleure gestion des risques: un système intégré de stop-loss
  5. Ajustabilité des paramètres: les paramètres clés peuvent être optimisés en fonction des différentes caractéristiques du marché

Risque stratégique

  1. Sensitivité des paramètres: les paramètres peuvent nécessiter des ajustements fréquents selon les conditions du marché
  2. Décalage du signal: un certain retard dans les moyennes mobiles
  3. Les marchés oscillants ne s’appliquent pas: les marchés oscillants horizontaux peuvent générer de faux signaux
  4. Coût d’opportunité lié à la double confirmation: une confirmation stricte à deux indicateurs peut laisser passer de bonnes opportunités commerciales

Orientation de l’optimisation de la stratégie

  1. Augmentation de l’identification des conditions du marché: introduction d’indicateurs de volatilité pour distinguer les tendances et les chocs du marché
  2. Ajustement des paramètres dynamiques: paramètres qui ajustent automatiquement le MACD et la régression linéaire en fonction de l’état du marché
  3. Optimisation des stop-loss: introduction d’un stop-loss dynamique qui s’ajuste automatiquement en fonction des fluctuations du marché
  4. Augmentation de l’analyse des volumes de transactions: une combinaison d’indicateurs de volumes de transactions pour améliorer la fiabilité du signal
  5. Introduction de l’analyse des cycles de temps: considérer la confirmation de plusieurs cycles de temps pour améliorer la précision des transactions

Résumer

La stratégie, combinant des versions améliorées d’indicateurs classiques et des méthodes statistiques, crée un système de négociation à la fois flexible et fiable. Sa conception modulaire permet aux traders d’ajuster de manière flexible les paramètres de la stratégie et le mécanisme de confirmation des signaux en fonction des différentes conditions du marché. Grâce à une optimisation et à une amélioration continues, la stratégie devrait maintenir une performance stable dans divers environnements de marché.

Code source de la stratégie
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy('SIMPLIFIED MACD & LRS Backtest by NHBProd', overlay=false)

// Function to calculate TEMA (Triple Exponential Moving Average)
tema(src, length) =>
    ema1 = ta.ema(src, length)
    ema2 = ta.ema(ema1, length)
    ema3 = ta.ema(ema2, length)
    3 * (ema1 - ema2) + ema3

// MACD Calculation Function
macdfx(src, fast_length, slow_length, signal_length, method) =>
    fast_ma = method == 'SMA' ? ta.sma(src, fast_length) :
              method == 'EMA' ? ta.ema(src, fast_length) :
              method == 'WMA' ? ta.wma(src, fast_length) :
              tema(src, fast_length)
    slow_ma = method == 'SMA' ? ta.sma(src, slow_length) :
              method == 'EMA' ? ta.ema(src, slow_length) :
              method == 'WMA' ? ta.wma(src, slow_length) :
              tema(src, slow_length)
    macd = fast_ma - slow_ma
    signal = method == 'SMA' ? ta.sma(macd, signal_length) :
             method == 'EMA' ? ta.ema(macd, signal_length) :
             method == 'WMA' ? ta.wma(macd, signal_length) :
             tema(macd, signal_length)
    hist = macd - signal
    [macd, signal, hist]

// MACD Inputs
useMACD = input(true, title="Use MACD for Signals")
src = input(close, title="MACD Source")
fastp = input(12, title="MACD Fast Length")
slowp = input(26, title="MACD Slow Length")
signalp = input(9, title="MACD Signal Length")
macdMethod = input.string('EMA', title='MACD Method', options=['EMA', 'SMA', 'WMA', 'TEMA'])

// MACD Calculation
[macd, signal, hist] = macdfx(src, fastp, slowp, signalp, macdMethod)

// Linear Regression Inputs
useLR = input(true, title="Use Linear Regression for Signals")
lrLength = input(24, title="Linear Regression Length")
lrSource = input(close, title="Linear Regression Source") 
lrSignalSelector = input.string('Rising Linear', title='Signal Selector', options=['Price Above Linear', 'Rising Linear', 'Both'])

// Linear Regression Calculation
linReg = ta.linreg(lrSource, lrLength, 0)
linRegPrev = ta.linreg(lrSource, lrLength, 1)
slope = linReg - linRegPrev

// Linear Regression Buy Signal
lrBuySignal = lrSignalSelector == 'Price Above Linear' ? (close > linReg) :
              lrSignalSelector == 'Rising Linear' ? (slope > 0 and slope > slope[1]) :
              lrSignalSelector == 'Both' ? (close > linReg and slope > 0) : false

// MACD Crossover Signals
macdCrossover = ta.crossover(macd, signal)

// Buy Signals based on user choices
macdSignal = useMACD and macdCrossover
lrSignal = useLR and lrBuySignal

// Buy condition: Use AND condition if both are selected, OR condition if only one is selected
buySignal = (useMACD and useLR) ? (macdSignal and lrSignal) : (macdSignal or lrSignal)

// Plot MACD
hline(0, title="Zero Line", color=color.gray)
plot(macd, color=color.blue, title="MACD Line", linewidth=2)
plot(signal, color=color.orange, title="Signal Line", linewidth=2)
plot(hist, color=hist >= 0 ? color.green : color.red, style=plot.style_columns, title="MACD Histogram")

// Plot Linear Regression Line and Slope
plot(slope, color=slope > 0 ? color.purple : color.red, title="Slope", linewidth=2)
plot(linReg,title="lingreg")
// Signal Plot for Visualization
plotshape(buySignal, style=shape.labelup, location=location.bottom, color=color.new(color.green, 0), title="Buy Signal", text="Buy")

// Sell Signals for Exiting Long Positions
macdCrossunder = ta.crossunder(macd, signal)  // MACD Crossunder for Sell Signal
lrSellSignal = lrSignalSelector == 'Price Above Linear' ? (close < linReg) :
               lrSignalSelector == 'Rising Linear' ? (slope < 0 and slope < slope[1]) :
               lrSignalSelector == 'Both' ? (close < linReg and slope < 0) : false

// User Input for Exit Signals: Select indicators to use for exiting trades
useMACDSell = input(true, title="Use MACD for Exit Signals")
useLRSell = input(true, title="Use Linear Regression for Exit Signals")

// Sell condition: Use AND condition if both are selected to trigger a sell at the same time, OR condition if only one is selected
sellSignal = (useMACDSell and useLRSell) ? (macdCrossunder and lrSellSignal) : 
             (useMACDSell ? macdCrossunder : false) or 
             (useLRSell ? lrSellSignal : false)

// Plot Sell Signals for Visualization (for exits, not short trades)
plotshape(sellSignal, style=shape.labeldown, location=location.top, color=color.new(color.red, 0), title="Sell Signal", text="Sell")

// Alerts
alertcondition(buySignal, title="Buy Signal", message="Buy signal detected!")
alertcondition(sellSignal, title="Sell Signal", message="Sell signal detected!")

// Take Profit and Stop Loss Inputs
takeProfit = input.float(10.0, title="Take Profit (%)")  // Take Profit in percentage
stopLoss = input.float(0.10, title="Stop Loss (%)")        // Stop Loss in percentage

// Backtest Date Range
startDate = input(timestamp("2024-01-01 00:00"), title="Start Date")
endDate = input(timestamp("2025-12-12 00:00"), title="End Date")
inBacktestPeriod = true
// Entry Rules (Only Long Entries)
if (buySignal and inBacktestPeriod)
    strategy.entry("Buy", strategy.long)

// Exit Rules (Only for Long Positions)
strategy.exit("Exit Buy", from_entry="Buy", limit=close * (1 + takeProfit / 100), stop=close * (1 - stopLoss / 100))

// Exit Long Position Based on Sell Signals
if (sellSignal and inBacktestPeriod)
    strategy.close("Buy", comment="Exit Signal")