Stratégie de synchronisation de la moyenne mobile différentielle de l'oscillateur

Auteur:ChaoZhang est là., Date: 2023-12-26 à 14h40
Les étiquettes:

img

Résumé

Cette stratégie calcule la différence entre l'EMA rapide et l'EMA lente pour former l'oscillateur MACD, et calcule l'EMA du MACD lui-même pour former la ligne de signal, construisant ainsi un système de double filtrage.

Principe de stratégie

L'indicateur de base de cette stratégie est l'oscillateur MACD, qui est calculé en soustrayant l'EMA lent (généralement 26 jours EMA) de l'EMA rapide (généralement 12 jours EMA). L'EMA rapide est plus sensible et peut capturer les fluctuations de prix à court terme. L'EMA lent répond aux changements de prix plus lentement. Soustrayant les deux forme un oscillateur qui représente la différence entre les cycles de prix à court et à moyen terme. L'EMA (généralement 9 jours) de l'oscillateur MACD lui-même est ensuite calculé pour obtenir la ligne de signal. Lorsque le MACD traverse au-dessus de la ligne de signal MAC ci-dessous, il indique que l'élan ascendant de la tendance à court terme est plus fort que celui de la tendance à moyen terme, générant un signal d'achat. Lorsque le DD traverse la ligne au-dessous de la tendance à court terme, il indique que l'élan descendant est plus fort, générant un signal

Les paramètres d'entrée de cette stratégie sont définis sur la longueur de la ligne rapide, la longueur de la ligne lente, la source de prix et la période de lissage de la ligne de signal, respectivement. Ceux-ci peuvent être ajustés en fonction de différents marchés pour trouver les combinaisons optimales de paramètres.

Analyse des avantages

  1. L'indicateur MACD est classique et facile à comprendre, capturant efficacement les opportunités d'inversion à court et moyen terme.

  2. La construction de la double EMA du système MACD est plus fluide que les systèmes à MA unique.

  3. Des paramètres relativement plus réglables permettent une optimisation sur différents marchés.

  4. La combinaison avec les indicateurs de volume permet d'identifier des signaux de haute qualité.

Analyse des risques

  1. Le MACD peut produire plus de faux signaux dans les marchés oscillants.

  2. Il ne peut pas déterminer les tendances et peut entraîner des pertes en croisant les tendances.

  3. Le délai limité de test de retour peut ignorer les conditions extrêmes du marché.

  4. Le réglage des paramètres nécessite davantage de données de marché pour éviter de suradapter des périodes de marché spécifiques.

Les risques peuvent être contrôlés en incorporant des indicateurs de tendance et des mécanismes de stop loss.

Directions d'optimisation

  1. Testez différentes sources de prix comme les prix de clôture, de médiane, de réinitialisation, etc.

  2. Rechercher des ensembles de paramètres optimaux basés sur des données plus historiques.

  3. Intégrer d'autres indicateurs pour juger de la qualité du signal, par exemple les signaux de volume.

  4. Incorporer une analyse des tendances et des cycles afin d'éviter des conflits de tendances importants.

Conclusion

Cette stratégie capte les opportunités d'inversion à court et moyen terme en construisant un système de double filtre EMA. Elle appartient à une stratégie de synchronisation de marché classique et pratique. Les risques peuvent être contrôlés via l'optimisation des paramètres, le filtrage des signaux et les moyens de stop-loss. L'intégration d'outils d'analyse de tendance pour éviter d'acheter des pics et de vendre des fonds peut conduire à des profits stables.


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

//@version=4
strategy(title="MACD Histogram Backtest", shorttitle="MACD")

// Getting inputs
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=false)

// 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

grow = (hist[1] < hist)
fall = (hist[1] > hist) and hist >= 0
stop = (hist[1] > hist)

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)

//Strategy Testing

// Component Code Start
// Example usage:
// if testPeriod()
//   strategy.entry("LE", strategy.long)
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(2, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

//Entry and Close settings
if testPeriod() 
    strategy.entry("grow", true, 10, when = grow, limit = close)
    strategy.close("grow", when = fall)
    strategy.close("grow", when = stop)
    
//if testPeriod() 
//   strategy.entry("fall", false, 1000, when = fall, limit = close)
//    strategy.close("fall", when = grow)    



Plus de