La stratégie de clôture du MACD est hybride.

Auteur:ChaoZhang est là., Date: le 30 octobre 2023 à 12 h 16 h 20
Les étiquettes:

img

Résumé

Cette stratégie combine les signaux de croix dorée et de croix morte de l'indicateur MACD, la relation entre le prix de clôture et la ligne médiane et les caractéristiques de volatilité des prix pour déterminer les points d'entrée et de sortie.

Principes de stratégie

La stratégie repose principalement sur les principes suivants:

  1. Utilisez la ligne rapide MACD et la ligne lente croix dorée et croix morte pour déterminer les marchés haussiers et baissiers et les points d'entrée spécifiques.

  2. Utilisez la relation entre le prix de clôture et la ligne médiane pour déterminer la fin des tendances et les points de sortie.

  3. Mettre en place un mécanisme de rentrée pour revenir sur le marché dans la même direction après la fin de la tendance actuelle du MACD afin d'augmenter les bénéfices.

  4. Mettre en place un mécanisme d'entrée de correction pour ajouter des positions lors de corrections partielles de prix au sein d'une tendance.

  5. Ajustez dynamiquement les positions en fonction de ce qui précède pour maximiser les profits dans les tendances tout en sortant rapidement lorsque la tendance se termine.

Plus précisément, la stratégie vérifie d'abord si une croix dorée ou une croix morte se produit entre les lignes rapides et lentes du MACD pour aller long ou court.

En outre, la stratégie dispose d'un mécanisme de réentrée pour rouvrir les positions dans la direction initiale si le MACD continue à montrer des signaux dans la même direction après la fin de la tendance initiale.

Grâce à ces paramètres, la stratégie peut ajuster dynamiquement les positions, augmenter les fréquences d'entrée et de sortie et maximiser les rendements tout en contrôlant les risques dans les tendances.

Les avantages

Les principaux avantages de cette stratégie multi-indicateurs sont les suivants:

  1. Le MACD identifie les tendances et les points d'inversion pour l'entrée.

  2. La relation entre le prix de clôture et la ligne médiane détermine avec précision la fin de la tendance.

  3. La réentrée augmente l'efficacité de l'utilisation du capital.

  4. L'entrée de correction ajoute des positions en temps opportun pour capturer les tendances.

  5. Une fréquence de négociation élevée avec un risque contrôlable produit des facteurs de profit élevés.

  6. Paramètres personnalisables pour l'optimisation entre produits et marchés.

  7. Une logique claire et un code concis pour faciliter le trading en direct.

  8. Des données de backtest suffisantes assurent la fiabilité.

Les risques

Les principaux risques sont les suivants:

  1. La probabilité de faux signaux MACD doit être vérifiée avec d'autres indicateurs.

  2. Les arrêts trop serrés peuvent être arrêtés par des mouvements volatils.

  3. L'augmentation de la fréquence des échanges nécessite un contrôle de l'utilisation du capital.

  4. Les entrées de correction peuvent entraîner des pertes lors des retraits.

  5. Optimisation requise pour différents produits et marchés.

  6. Cela nécessite un backtesting et une optimisation continus.

  7. Les coûts de glissement doivent être pris en considération pour les transactions en direct.

Les mesures de gestion des risques comprennent l'utilisation d'arrêts pour limiter les pertes, l'évaluation de l'utilisation du capital, l'optimisation des paramètres par produit via le backtesting, le suivi de la dynamique du marché pour affiner les paramètres et la prise en compte des glissements dans les tests.

Des possibilités d'amélioration

Possibilités d'amélioration:

  1. Ajouter d'autres indicateurs pour vérifier les signaux, par exemple KDJ.

  2. Mettre en place des arrêts dynamiques adaptatifs.

  3. Optimisez la logique de réentrée et de correction.

  4. Optimisation des paramètres par produit.

  5. Optimiser l'utilisation du capital pour les entrées.

  6. Incorporer des indicateurs de volume afin d'éviter les pertes dues aux retraits.

  7. Ajoutez des mécanismes de sortie comme des arrêts de mouvement.

  8. Construisez un robot de trading automatisé.

  9. Prenez en compte les facteurs du monde réel comme le glissement.

Ils peuvent améliorer encore la stabilité, l'adaptabilité, l'automatisation et les performances en direct.

Conclusion

Cette stratégie intègre les signaux MACD, l'analyse des prix de clôture et de multiples mécanismes d'entrée pour maximiser les tendances tout en contrôlant le risque.


/*backtest
start: 2023-09-29 00:00:00
end: 2023-10-29 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Puckapao

//@version=4
// strategy(title="MACD", shorttitle="MACD", overlay=true, initial_capital=10000.00, currency="USD", default_qty_type=strategy.cash, default_qty_value=10000.00)
// Getting inputs
reenter_delay = input(title="Re-enter Delay", type=input.integer, defval=2)
sculp_delay = input(title="Sculp Delay", type=input.integer, defval=4)
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)
ema_period = input(title="EMA Period", type=input.integer, defval=21)

// Get date
startDate = input(title="Start Date", type=input.integer,
     defval=19, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=09, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2017, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=3, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
// STEP 2:
// Look if the close time of the current bar
// falls inside the date range
inDateRange =  true

reenter_cnt = 0
reenter_cnt := nz(reenter_cnt[1])

sculp_cnt = 0
sculp_cnt := nz(sculp_cnt[1])

close_cnt = 0
close_cnt := nz(close_cnt[1])

on_long = false
on_long := nz(on_long[1])

on_short = false
on_short := nz(on_short[1])

sculp = false
reenter = false
slowdown = false

ema = ema(close, ema_period)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00
// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal
// plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)

cross_up = crossover(macd, signal)
cross_down = crossunder(macd, signal)

if (inDateRange)

    over_macd = macd > 0 and signal > 0 ? true : false
    under_macd = macd < 0 and signal < 0 ? true : false
    over_water = close > ema ? true : false
    under_water = close < ema ? true : false
    slowdown := hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] > hist ? false : true)
    reenter := hist >= 0 ? (hist[1] < hist ? true : false) : (hist[1] > hist ? true : false)
    sculp := (hist >= 0 ? (hist[1] > hist ? true : false) : (hist[1] < hist ? true : false))
    
    if(reenter == true)
        if(reenter_cnt < reenter_delay)
            reenter_cnt := reenter_cnt + 1
    else
        if(reenter_cnt > 0)
            reenter_cnt := reenter_cnt - 1
                    
    if(sculp == true)
        if(sculp_cnt < sculp_delay)
            sculp_cnt := sculp_cnt + 1
    else
        if(sculp_cnt > 0)
            sculp_cnt := sculp_cnt - 1
        
    if(slowdown == false)
        if(close_cnt < 2)
            close_cnt := close_cnt + 1
        else
            close_cnt := 0
    
    // plotchar(fork_cnt, "fork count", "")
    // plotchar(spoon_cnt, "spoon count", "")

    // Entry
    if (cross_up == true)
        strategy.entry("long", strategy.long, comment = "long", alert_message = "long")
        on_long := true
        on_short := false
    if (cross_down == true)
        strategy.entry("short", strategy.short, comment = "short", alert_message = "short")
        on_short := true
        on_long := false
        
    // Sculp bottom / top
    if (sculp == true and sculp_cnt >= sculp_delay)
        if (hist >= 0)
            strategy.entry("sculp-short", strategy.short, comment = "sculp-short", alert_message = "sculp-short")
        else
            strategy.entry("sculp-long", strategy.long, comment = "sculp-long", alert_message = "sculp-long")
        
        sculp_cnt := 0
        sculp := false
            
    // Re-Entry
    if (reenter == true and reenter_cnt >= reenter_delay)
        if (hist >= 0)
            strategy.entry("re-long", strategy.long, comment = "re-long", alert_message = "re-long")
        else
            strategy.entry("re-short", strategy.short, comment = "re-short", alert_message = "re-short")
            
        reenter_cnt := 0
        reenter := false
            
    // Close
    strategy.close("long", when = slowdown, comment = "close long", alert_message = "close long")
    strategy.close("short", when = slowdown, comment = "close short", alert_message = "close short")
    strategy.close("re-long", when = slowdown, comment = "close re-long", alert_message = "close re-long")
    strategy.close("re-short", when = slowdown, comment = "close re-short", alert_message = "close re-short")
    strategy.close("sculp-long", when = slowdown, comment = "close sculp-long", alert_message = "close sculp-long")
    strategy.close("sculp-short", when = slowdown, comment = "close sculp-short", alert_message = "close sculp-short")
    
    if (slowdown)
        if (hist >= 0)
            on_long := false
        else
            on_short := false


plotchar(slowdown, "close", "")
plotchar(reenter, "reenter", "")
plotchar(reenter_cnt, "reenter count", "")
plotchar(sculp, "sculp", "")
plotchar(sculp_cnt, "sculp count", "")

Plus de