Stratégie de dynamique croisée à moyenne mobile double

Auteur:ChaoZhang est là., Date: 2023-11-16 17h25 et 13h
Les étiquettes:

img

Résumé

Cette stratégie utilise le double principe de croisement des moyennes mobiles, combine l'indicateur MACD pour le jugement de tendance et la mise en évidence de fond croisé, et confirme les entrées avec des points de modèle, visant à capturer les tendances à moyen terme sur le marché.

La logique de la stratégie

La stratégie construit des moyennes mobiles doubles en utilisant une EMA rapide et une EMA lente, et détermine la direction de la tendance en fonction du croisement entre les lignes rapides et lentes.

Selon le code, la longueur de la ligne rapide est de 12 et la longueur de la ligne lente est de 26, représentant les tendances à court et à long terme.

Logique croisée:

  • tendance_up = macd > signal: la ligne rapide traverse la ligne lente, indiquant une tendance haussière à court terme

  • tendance_dn = macd < signal: la ligne rapide traverse la ligne lente, indiquant une tendance à la baisse à court terme

Détection des points de croisement:

  • cross_UP = signal[1] >= macd[1] et signal < macd: la ligne rapide traverse la ligne lente depuis le bas

  • cross_DN = signal[1] <= macd[1] et signal > macd: la ligne rapide traverse la ligne lente d'en haut

Le changement de couleur de l'histogramme détermine la force de mouvement:

  • histA_IsUp = Colonne d'histogramme en hausse et supérieure à 0, dynamique de renforcement de la tendance haussière

  • histA_IsDown = Colonne d'histogramme en baisse mais toujours supérieure à 0, dynamique affaiblie dans la tendance haussière

  • La même logique sous 0

Les avantages

  1. Les moyennes mobiles doubles déterminent la tendance à moyen terme, évitent le bruit à court terme

  2. Le MACD aide à évaluer les tendances à court terme et la dynamique pour une plus grande rentabilité

  3. Le changement de couleur de l'histogramme aide à mieux identifier le moment de l'entrée

  4. Couleur de fond croisée met en évidence les signaux

  5. Périodes de moyennes mobiles personnalisables adaptées aux différents environnements de marché

  6. Les paramètres MACD réglables optimisent l'indicateur

  7. Fournit plusieurs confirmations d'entrée: tendance, croisement, rupture de modèle

Les risques

  1. Les deux modes de financement, insensibles aux fluctuations à court terme, peuvent manquer des opportunités à court terme

  2. Un mauvais effet MACD avec des paramètres mal réglés peut générer de faux signaux

  3. Les entrées basées uniquement sur les MAs et le MACD présentent certains points morts

  4. L'absence de mécanisme d'arrêt des pertes entraîne un risque d'augmentation des pertes

  5. Manque de gestion de fonds et de dimensionnement des positions rigoureux

Des solutions possibles:

  1. Combiner d'autres indicateurs pour définir des plages d'échange à court terme et contrôler le risque

  2. Optimiser les paramètres MACD et tester sur différents marchés

  3. Ajoutez un motif, une impulsion, etc. pour confirmer les signaux

  4. Mettre en place des mécanismes d'arrêt des pertes pour limiter la taille des pertes

  5. Ajout d'un module de gestion de trésorerie à la taille des positions basée sur le capital

Directions d'optimisation

  1. Tester et optimiser les combinaisons de paramètres de l'AM pour une plus grande adaptabilité du marché

  2. Essayez différents types de MA comme le VWAP, la ligne médiane de Bollinger, etc.

  3. Considérer le volume de négociation pour éviter les fausses ruptures

  4. Incorporer le RSI, etc., pour confirmer le surachat/survente

  5. Mettre en place des mécanismes de stop loss robustes comme le stop de trail, le stop de volatilité, etc.

  6. Incorporer la taille des positions en fonction de la taille du compte

  7. Considérez l'apprentissage automatique pour l'optimisation des paramètres

  8. Élargir l'univers de la stratégie pour une approche de portefeuille améliorée

Conclusion

Cette stratégie intègre le double filtrage de tendance de la moyenne mobile et l'élan MACD, ajoute des caractéristiques de modèle, construisant un système de trading à moyen terme relativement stable. L'avantage clé réside dans la capture de la tendance majeure tout en évitant le bruit à court terme. Mais il y a aussi des domaines qui pourraient être améliorés, comme l'ajout de mécanismes de stop loss et de gestion des risques.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Histogram MacD MVP_V2.1", shorttitle="Histogram MacD MVP_2.1")
//Plot Inputs
res           = input.timeframe("",  "Indicator TimeFrame")
fast_length   = input.int(title="Fast Length", defval=12)
slow_length   = input.int(title="Slow Length", defval=26)
src           = input.source(title="Source", defval=close)
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9)
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"])
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])
// Show Plots T/F
show_macd     = input.bool(true, title="Show MACD Lines", group="Show Plots?", inline="SP10")
show_macd_LW  = input.int(3, minval=0, maxval=5, title = "MACD Width", group="Show Plots?", inline="SP11")
show_signal_LW= input.int(2, minval=0, maxval=5, title = "Signal Width", group="Show Plots?", inline="SP11")
show_Hist     = input.bool(true, title="Show Histogram", group="Show Plots?", inline="SP20")
show_hist_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP20")
show_trend    = input.bool(true, title = "Show MACD Lines w/ Trend Color", group="Show Plots?", inline="SP30")
show_HB       = input.bool(false, title="Show Highlight Price Bars", group="Show Plots?", inline="SP40")
show_cross    = input.bool(false, title = "Show BackGround on Cross", group="Show Plots?", inline="SP50")
show_dots     = input.bool(true, title = "Show Circle on Cross", group="Show Plots?", inline="SP60")
show_dots_LW  = input.int(5, minval=0, maxval=5, title = "-- Width", group="Show Plots?", inline="SP60")

//show_trend    = input(true, title = "Colors MACD Lines w/ Trend Color", group="Show Plots?", inline="SP5")
// MACD Lines colors
col_macd      = input.color(#FF6D00, "MACD Line  ",  group="Color Settings", inline="CS1")
col_signal    = input.color(#2962FF, "Signal Line  ",  group="Color Settings", inline="CS1")
col_trnd_Up   = input.color(#4BAF4F, "Trend Up      ",  group="Color Settings", inline="CS2")
col_trnd_Dn   = input.color(#B71D1C, "Trend Down    ",  group="Color Settings", inline="CS2")
// Histogram Colors
col_grow_above = input.color(#26A69A, "Above   Grow",  group="Histogram Colors", inline="Hist10")
col_fall_above = input.color(#FF5252, "Fall",  group="Histogram Colors", inline="Hist10")
col_grow_below = input.color(#FF5252, "Below Grow",  group="Histogram Colors", inline="Hist20")
col_fall_below = input.color(#f8f524, "Fall",  group="Histogram Colors", inline="Hist20")
// Alerts T/F Inputs
alert_Long    = input.bool(true, title = "MACD Cross Up", group = "Alerts", inline="Alert10")
alert_Short   = input.bool(true, title = "MACD Cross Dn", group = "Alerts", inline="Alert10")
alert_Long_A  = input.bool(false, title = "MACD Cross Up & > 0", group = "Alerts", inline="Alert20")
alert_Short_B = input.bool(false, title = "MACD Cross Dn & < 0", group = "Alerts", inline="Alert20")
// Calculating
fast_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length))
slow_ma = request.security(syminfo.tickerid, res, sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length))
macd = fast_ma - slow_ma
signal = request.security(syminfo.tickerid, res, sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length))
hist = macd - signal
// MACD Trend and Cross Up/Down conditions
trend_up   = macd > signal
trend_dn   = macd < signal
cross_UP   = signal[1] >= macd[1] and signal < macd
cross_DN   = signal[1] <= macd[1] and signal > macd
cross_UP_A = (signal[1] >= macd[1] and signal < macd) and macd > 0
cross_DN_B = (signal[1] <= macd[1] and signal > macd) and macd < 0
// Condition that changes Color of MACD Line if Show Trend is turned on..
trend_col = show_trend  and trend_up ? col_trnd_Up : trend_up ? col_macd : show_trend  and trend_dn ? col_trnd_Dn: trend_dn ? col_macd : na 

//Var Statements for Histogram Color Change
var bool histA_IsUp = false
var bool histA_IsDown = false
var bool histB_IsDown = false
var bool histB_IsUp = false
histA_IsUp   := hist == hist[1] ? histA_IsUp[1] : hist > hist[1] and hist > 0
histA_IsDown := hist == hist[1] ? histA_IsDown[1] : hist < hist[1] and hist > 0
histB_IsDown := hist == hist[1] ? histB_IsDown[1] : hist < hist[1] and hist <= 0
histB_IsUp   := hist == hist[1] ? histB_IsUp[1] : hist > hist[1] and hist <= 0

hist_col =  histA_IsUp ? col_grow_above : histA_IsDown ? col_fall_above : histB_IsDown ? col_grow_below : histB_IsUp ? col_fall_below :color.silver 

// Plot Statements
//Background Color
bgcolor(show_cross and cross_UP ? col_trnd_Up : na, editable=false)
bgcolor(show_cross and cross_DN ? col_trnd_Dn : na, editable=false)
//Highlight Price Bars
barcolor(show_HB and trend_up ? col_trnd_Up : na, title="Trend Up", offset = 0, editable=false)
barcolor(show_HB and trend_dn ? col_trnd_Dn : na, title="Trend Dn", offset = 0, editable=false)
//Regular Plots
plot(show_Hist and hist ? hist : na, title="Histogram", style=plot.style_columns, color=color.new(hist_col ,0),linewidth=show_hist_LW)
plot(show_macd  and signal ? signal : na, title="Signal", color=color.new(col_signal, 0),  style=plot.style_line ,linewidth=show_signal_LW)
plot(show_macd  and macd ? macd : na, title="MACD", color=color.new(trend_col, 0),  style=plot.style_line ,linewidth=show_macd_LW)
hline(0, title="0 Line", color=color.new(color.gray, 0), linestyle=hline.style_dashed, linewidth=1, editable=false)
plot(show_dots and cross_UP ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)
plot(show_dots and cross_DN ? macd : na, title="Dots", color=color.new(trend_col ,0), style=plot.style_circles, linewidth=show_dots_LW, editable=false)

//Alerts
if alert_Long and cross_UP
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short and cross_DN
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD Crosses Down.", alert.freq_once_per_bar_close)
//Alerts - Stricter Condition - Only Alerts When MACD Crosses UP & MACD > 0 -- Crosses Down & MACD < 0
if alert_Long_A and cross_UP_A
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD > 0 And Crosses Up.", alert.freq_once_per_bar_close)

if alert_Short_B and cross_DN_B
    alert("Symbol = (" + syminfo.tickerid + ") TimeFrame = (" + timeframe.period + ") Current Price (" + str.tostring(close) + ") MACD < 0 And Crosses Down.", alert.freq_once_per_bar_close)


if (histA_IsUp)
	strategy.entry("buy", strategy.long, comment="buy")
if (histA_IsDown)
	strategy.entry("sell", strategy.short, comment="sell")


Plus de