La stratégie de test arrière de l'indicateur de dynamique MACD

Auteur:ChaoZhang est là., Date: 24 septembre 2023 à 13h21
Les étiquettes:

Résumé

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.

La logique de la stratégie

  1. 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.

  2. Calculer le RSI pour identifier les rebonds de survente et les surachats de vente.

  3. 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é.

  4. Le risque de défaillance est défini après l'entrée en contrôle.

Les avantages

  1. Le MACD identifie de manière sensible les changements de tendance.

  2. L'exigence des deux signaux MACD et RSI filtre les faux signaux.

  3. La fenêtre de rétrospection améliore la fiabilité du signal.

  4. Le stop loss aide à gérer les risques.

Les risques

  1. Le retard du MACD et du RSI peut entraîner des entrées optimales manquées.

  2. Une probabilité moindre d'un signal à double indicateur signifie moins de transactions.

  3. Aucune prise en compte de la direction de tendance plus large risque d'être piégée.

  4. Un mauvais réglage du stop-loss peut être trop large ou trop serré.

Des solutions possibles:

  1. Ajustez les paramètres MACD et RSI pour réduire le décalage.

  2. Élargir les plages de seuil des indicateurs pour fournir plus de signaux.

  3. Ajouter un filtre de tendance pour éviter les entrées contre tendance.

  4. Testez différents paramètres de stop-loss pour obtenir des niveaux optimaux.

Directions d'optimisation

  1. Testez la SMA et les autres moyennes mobiles.

  2. Ajoutez le stop loss pour les stops flexibles.

  3. Incorporer la force de la tendance pour juger de la qualité de l'entrée.

  4. Utilisez l'apprentissage automatique pour prédire les mouvements des indicateurs.

  5. Combinez plus de facteurs pour optimiser le timing de l'entrée.

Résumé

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)

Plus de