Stratégie de négociation quantitative à double MACD

Auteur:ChaoZhang est là., Date: le 30 janvier 2024 à 16h43
Les étiquettes:

img

Résumé

La stratégie de trading quantitative du MACD double est une stratégie de trading quantitative mise en œuvre à l'aide d'indicateurs MACD à double échéancier. Elle va long lorsque l'indicateur MACD hebdomadaire forme une croix dorée et ferme la position lorsque l'indicateur MACD quotidien forme une croix de mort. Lorsque la position est vide, si l'indicateur MACD quotidien forme une autre croix dorée, une nouvelle position longue peut être ouverte.

La logique de la stratégie

La stratégie de négociation quantitative du double MACD utilise une combinaison d'indicateurs MACD hebdomadaires et quotidiens pour déterminer les signaux d'entrée et de sortie.

Premièrement, lorsque la ligne MACD de l'indicateur MACD hebdomadaire traverse au-dessus de la ligne de signal, un signal d'achat est généré et une position longue est ouverte.

Lorsque la position est vide, si la ligne MACD de l'indicateur MACD quotidien traverse à nouveau au-dessus de la ligne de signal, une nouvelle position longue est rouverte.

Il convient de noter que seule la croix de la mort du MACD quotidien fermera la position, mais la réouverture n'est autorisée que lorsque la ligne MACD du MACD hebdomadaire est au-dessus de la ligne de signal, dans la fenêtre de négociation.

Les avantages

La stratégie de trading quantitative du double MACD combine une double analyse des délais, qui peut filtrer efficacement les faux signaux et améliorer la qualité du signal.

  1. Le calendrier hebdomadaire évalue la direction principale de la tendance, ce qui permet d'éviter les échanges contraires.

  2. Le calendrier journalier détermine les délais d'entrée et de sortie, ce qui permet de saisir en temps opportun les opportunités de négociation à court terme.

  3. Le mécanisme de "fenêtre de négociation" permet d'éviter des ouvertures et des fermetures trop fréquentes dues à des ajustements à court terme.

  4. Les paramètres de l'indicateur MACD sont réglables et peuvent être optimisés en fonction de différentes variétés et conditions de marché.

  5. Il intègre des fonctions de prise de profit, de stop loss et de stop loss pour contrôler efficacement les risques.

Les risques

La stratégie de négociation quantitative du double MACD comporte également certains risques, notamment:

  1. L'indicateur MACD a tendance à générer de faux signaux et des croisements fréquents, nécessite une confirmation d'autres indicateurs.

  2. La tendance principale identifiée sur une période hebdomadaire/mensuelle peut s'inverser, il est nécessaire de suivre le stop loss.

  3. Les paramètres doivent être continuellement optimisés et ajustés en fonction des variétés et des conditions du marché.

  4. Ne peut pas trop compter sur les résultats des tests antérieurs, les performances en direct peuvent différer des résultats des tests antérieurs.

Solution correspondante:

  1. Combiner avec d'autres indicateurs pour construire des systèmes de stratégie avec optimisation logique.

  2. Définir un stop loss raisonnable pour éviter de dépasser la perte maximale tolérable.

  3. Optimisez continuellement les paramètres pour trouver des combinaisons optimales.

  4. Commencez à négocier en direct à partir d'un capital minimum pour valider la stabilité.

Optimisation

La stratégie de négociation quantitative du double MACD peut être optimisée:

  1. Introduction de bandes de Bollinger, de KDJ et d'autres indicateurs pour élaborer des stratégies combinées à plusieurs indicateurs et améliorer la qualité du signal.

  2. Incorporer des indicateurs de volume de négociation pour éviter les fausses ruptures avec un volume insuffisant.

  3. Utiliser des méthodes d'apprentissage automatique pour optimiser automatiquement les paramètres et obtenir un ajustement dynamique.

  4. Poursuite de l'ajustement des risques de la stratégie, par exemple l'ajout de méthodes avancées de stop loss telles que le ratio profit/loss.

  5. Stratégie de test et d'optimisation de l'aptitude pour éviter les problèmes de suradaptation.

Conclusion

La stratégie de trading quantitative du double MACD intègre une double analyse des délais pour déterminer les tendances principales et subordonnées et donne pleinement le jeu aux avantages de chaque indicateur.


/*backtest
start: 2023-01-29 00:00:00
end: 2024-01-11 05:20:00
period: 1d
basePeriod: 1h
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/
// © maxits

// Long Position: Weekly Macd line crosses above Signal line   
// [Trading Window Macd Line > Signal Line] (Weekly)
// Close Position: Daily Macd Line crosses above Daily Signal line.  
// Re Entry Condition: Macd line crosses above Signal line only if [Trading Window MacdLine > Sgnal Line] (Weekly)

//@version=4
strategy("Dual MACD Strategy",
         shorttitle="Dual Macd Tester",
         overlay=false,
         initial_capital=1000,
         default_qty_value=20,
         default_qty_type=strategy.percent_of_equity,
         commission_value=0.1,
         pyramiding=0)



// Define user inputs
i_time     = input(defval = timestamp("01 May 2018 13:30 +0000"), title = "Start Time", type = input.time) // Starting  time for Backtesting
f_time     = input(defval = timestamp("9 Sep 2021 13:30 +0000"), title = "Finish Time", type = input.time) // Finishing time for Backtesting

sep1          = input(false, title="------ Profit & Loss ------")

enable_TP     = input(true, title="Enable Just a Profit Level?")
enable_SL     = input(false, title="Enable Just a S.Loss Level?")
enable_TS     = input(true, title=" Enable Only Trailing Stop")
long_TP_Input = input(30.0,   title='Take Profit %',      type=input.float, minval=0)/100
long_SL_Input = input(1.0,   title='Stop Loss %',        type=input.float, minval=0)/100
long_TS_Input = input(5.0,   title='Trailing Stop %',    type=input.float, minval=0)/100
cl_low_Input  = input(low,   title="Trailing Stop Source")
long_TP       = strategy.position_avg_price * (1 + long_TP_Input)
long_SL       = strategy.position_avg_price * (1 - long_SL_Input)
long_TS       = cl_low_Input * (1 - long_TS_Input)

sep2       = input(false, title="------ Macd Properties ------")

d_res      = input(title="Short Term TimeFrame", type=input.resolution, defval="D") // Daily Time Frame
w_res      = input(title="Long Term TimeFrame", type=input.resolution, defval="W")  // Weekly Time Frame
src        = input(close, title="Source")                                           // Indicator Price Source
fast_len   = input(title="Fast Length", type=input.integer, defval=12)              // Fast MA Length
slow_len   = input(title="Slow Length", type=input.integer, defval=26)              // Slow MA Length
sign_len   = input(title="Sign Length", type=input.integer, defval=9)               // Sign MA Length
d_w        = input(title="Daily or Weekly?", type=input.bool, defval=true)          // Plot Daily or Weekly MACD

// Color Plot for Macd

col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350

// BG Color

bg_color = color.rgb(127, 232, 34, 75)

// Daily Macd

[d_macdLine, d_singleLine, d_histLine] = security(syminfo.tickerid, d_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? d_macdLine   : na, color=color.blue)
plot(d_w ? d_singleLine : na, color=color.orange)
plot(d_w ? d_histLine   : na, style=plot.style_columns,
     color=(d_histLine>=0 ? (d_histLine[1] < d_histLine ? col_grow_above : col_fall_above) : 
     (d_histLine[1] < d_histLine ? col_grow_below : col_fall_below)))
    
// Weekly Macd

[w_macdLine, w_singleLine, w_histLine] = security(syminfo.tickerid, w_res, macd(src, fast_len, slow_len, sign_len)) // Funcion Security para poder usar correcta resolución

plot(d_w ? na : w_macdLine,   color=color.blue)
plot(d_w ? na : w_singleLine, color=color.orange)
plot(d_w ? na : w_histLine,   style=plot.style_columns,
     color=(w_histLine>=0 ? (w_histLine[1] < w_histLine ? col_grow_above : col_fall_above) : 
     (w_histLine[1] < w_histLine ? col_grow_below : col_fall_below)))

///////////////////////////////// Entry Conditions
inTrade    = strategy.position_size != 0       // Posición abierta
notInTrade = strategy.position_size == 0       // Posición Cerrada
start_time = true

trading_window = w_macdLine > w_singleLine   // Weekly Macd Signal enables a trading window 
bgcolor(trading_window ? bg_color : na)
buy_cond       = crossover (w_macdLine, w_singleLine)
sell_cond      = crossunder(d_macdLine, d_singleLine)
re_entry_cond  = crossover (d_macdLine, d_singleLine) and trading_window

// Entry Exit Conditions

trailing_stop  = 0.0        // Code for calculating Long Positions Trailing Stop Loss
trailing_stop := if (strategy.position_size != 0)
    stopValue = long_TS
    max(trailing_stop[1], stopValue)
else 
    0

if (buy_cond and notInTrade and start_time)
    strategy.entry(id="First Entry", long=strategy.long, comment="First Long")

if (sell_cond and inTrade)
    strategy.close(id="First Entry", comment="Close First Long")
    
if (re_entry_cond and notInTrade and start_time)
    strategy.entry(id="Further Entry", long=strategy.long, comment="Further Entry")

if (sell_cond and inTrade)
    strategy.close(id="Further Entry", comment="Close First Long")

if enable_TP
    if (enable_TS and not enable_SL)
        strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = trailing_stop)
        strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = trailing_stop)
    else
        if (enable_SL and not enable_TS)
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP, stop = long_SL)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP, stop = long_SL)
        else 
            strategy.exit("Long TP & TS FiEn", "First Entry",   limit = long_TP)
            strategy.exit("Long TP & TS FuEn", "Further Entry", limit = long_TP)
else
    if not enable_TP 
        if (enable_TS and not enable_SL)
            strategy.exit("Long TP & TS FiEn", "First Entry",   stop = trailing_stop)
            strategy.exit("Long TP & TS FuEn", "Further Entry", stop = trailing_stop)
        else
            if (enable_SL and not enable_TS)
                strategy.exit("Long TP & TS FiEn", "First Entry",   stop = long_SL)
                strategy.exit("Long TP & TS FuEn", "Further Entry", stop = long_SL)

plot(enable_TP ? long_TP : na, title="TP Level", color=color.green, style=plot.style_linebr, linewidth=2)
plot(enable_SL ? long_SL : na, title="SL Level", color=color.red,   style=plot.style_linebr, linewidth=2)
plot(enable_TS and trailing_stop ? trailing_stop : na, title="TS Level", color=color.red, style=plot.style_linebr, linewidth=2)


Plus de