Cette stratégie combine l'indicateur de dynamique MACD avec l'indicateur de surachat / survente du RSI. Lorsque le MACD traverse la hausse ou la baisse, il vérifie si le RSI complète également l'inversion de bas / sommet correspondante au cours de la période de repérage pour générer des signaux de trading plus fiables.
Calculer le MACD DIFF, DEA et l'histogramme. Le croisement du DIFF au-dessus de DEA donne un signal de croisement haussier, et le croisement en dessous donne un signal de croisement mortel.
Calculer le RSI pour identifier les rebonds de survente et les surachats de vente.
Lorsqu'un croisement haussier du MACD se produit, si le RSI a rebondit sur une survente dans la fenêtre de repérage, un signal long est généré.
Le risque de défaillance est défini après l'entrée en contrôle.
Le MACD identifie de manière sensible les changements de tendance.
L'exigence des deux signaux MACD et RSI filtre les faux signaux.
La fenêtre de rétrospection améliore la fiabilité du signal.
Le stop loss aide à gérer les risques.
Le retard du MACD et du RSI peut entraîner des entrées optimales manquées.
Une probabilité moindre d'un signal à double indicateur signifie moins de transactions.
Aucune prise en compte de la direction de tendance plus large risque d'être piégée.
Un mauvais réglage du stop-loss peut être trop large ou trop serré.
Des solutions possibles:
Ajustez les paramètres MACD et RSI pour réduire le décalage.
Élargir les plages de seuil des indicateurs pour fournir plus de signaux.
Ajouter un filtre de tendance pour éviter les entrées contre tendance.
Testez différents paramètres de stop-loss pour obtenir des niveaux optimaux.
Testez la SMA et les autres moyennes mobiles.
Ajoutez le stop loss pour les stops flexibles.
Incorporer la force de la tendance pour juger de la qualité de l'entrée.
Utilisez l'apprentissage automatique pour prédire les mouvements des indicateurs.
Combinez plus de facteurs pour optimiser le timing de l'entrée.
Cette stratégie filtre pour des signaux d'inversion fiables en utilisant le MACD et le RSI coordonnés. La logique est claire et les paramètres flexibles pour des améliorations telles que la sélection d'indicateurs, les filtres de tendance, les techniques de stop loss, etc. pour acquérir plus de transactions tout en maintenant la stabilité, mais les risques d'optimisation excessive doivent être évités.
/*backtest start: 2023-08-24 00:00:00 end: 2023-09-23 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 //based on Range Strat - MACD/RSI // strategy("MACD/RSI - edited", // overlay=true, // default_qty_type=strategy.percent_of_equity, // default_qty_value=10, precision=2, initial_capital=100000, // pyramiding=2, // commission_value=0.05) //Backtest date range StartDate = input(timestamp("13 Jun 2022"), title="Start Date") EndDate = input(timestamp("13 Jun 2024"), title="Start Date") inDateRange = true // RSI Input Settings rsisrc = input(title="RSI Source", defval=close, group="RSI Settings") length = input(title="Length", defval=14, group="RSI Settings" ) overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" ) overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" ) rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings") // Calculating RSI vrsi = ta.rsi(rsisrc, length) co = ta.crossover(vrsi, overSold) cu = ta.crossunder(vrsi, overBought) // Function looking for a happened condition during lookback period f_somethingHappened(_cond, _lookback) => bool _crossed = false for i = 1 to _lookback if _cond[i] _crossed := true _crossed coCheck = f_somethingHappened(co, rsi_lookback) cuCheck = f_somethingHappened(cu, rsi_lookback) // MACD Input Settings macdsrc = input(title="MACD Source", defval=close, group="MACD Settings") fast_length = input(title="Fast Length", defval=12, group="MACD Settings") slow_length = input(title="Slow Length", defval=26, group="MACD Settings") signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 50, defval = 9, group="MACD Settings") sma_source = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings") sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings") // Calculating MACD fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length) slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length) macd = fast_ma - slow_ma signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length) delta = macd - signal MACDcrossover = ta.crossover(delta, 0) MACDcrossunder = ta.crossunder(delta, 0) // Stop Loss Input Settings longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01 shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01 // Calculating Stop Loss longStopPrice = strategy.position_avg_price * (1 - longLossPerc) shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc) // Strategy Entry if (not na(vrsi)) if (inDateRange and MACDcrossover and coCheck) strategy.entry("LONG", strategy.long, comment="LONG") if (inDateRange and MACDcrossunder and cuCheck) strategy.entry("SHORT", strategy.short, comment="SHORT") // Submit exit orders based on calculated stop loss price if (strategy.position_size > 0) strategy.exit(id="LONG STOP", stop=longStopPrice) if (strategy.position_size < 0) strategy.exit(id="SHORT STOP", stop=shortStopPrice)