Stratégie quantitative MACD croisée de l' ALMA

Auteur:ChaoZhang est là., Date: 2023-12-05 10:24:34 Je suis désolé
Les étiquettes:

img

Résumé

Cette stratégie est basée sur les signaux de croix dorée et de croix morte des lignes moyennes mobiles doubles ALMA, combinés aux signaux longs et courts de l'indicateur MACD, pour obtenir des positions longues et courtes automatiques.

Principe de stratégie

La stratégie utilise des lignes rapides et lentes construites à partir d'ALMA pour construire la double moyenne mobile. La longueur de la ligne rapide est de 20 et la longueur de la ligne lente est de 40, les deux adoptant un décalage de 0,9 et un écart type de 5.

Dans le même temps, la stratégie intègre le signal de l'histogramme de l'indicateur MACD. Seulement lorsque l'histogramme MACD est positif (en hausse), le signal long est valide; seulement lorsque l'histogramme MACD est négatif (en baisse), le signal court est valide.

La stratégie définit également les conditions de prise de profit et de stop-loss. Le long take profit est 2 fois et le stop loss est 0,2 fois; le short take profit est 0,05 fois et le stop loss est 1 fois.

Analyse des avantages

La stratégie combine le jugement de tendance de la moyenne mobile double et le jugement d'énergie de l'indicateur MACD, qui peut filtrer efficacement les faux signaux et améliorer la précision de l'entrée.

Les données de backtest sont adoptées depuis 2017, couvrant plusieurs cycles de conversion de taureaux et d'ours.

Analyse des risques

La stratégie comporte les risques suivants:

  1. La double moyenne mobile elle-même a un effet de retard, éventuellement manquant des opportunités à court terme
  2. Lorsque l'histogramme MACD est nul, la stratégie ne générera pas de signaux
  3. Les ratios de prise de profit et de stop loss sont prédéfinis, peuvent s'écarter du marché réel

Les solutions:

  1. Réduire de manière appropriée le cycle de la moyenne mobile pour améliorer la sensibilité à court terme
  2. Optimiser les paramètres MACD pour rendre la fluctuation de l'histogramme plus fréquente
  3. Ajustez dynamiquement les paramètres de prise de profit et de stop-loss

Directions d'optimisation

La stratégie peut également être optimisée dans les aspects suivants:

  1. Essayez différents types de moyennes mobiles pour trouver de meilleurs effets de lissage
  2. Optimiser les paramètres des moyennes mobiles et du MACD pour s'adapter à différents produits et cycles
  3. Ajouter des conditions supplémentaires telles que les changements de volume de négociation aux signaux filtrés
  4. Ajustez les ratios de prise de profit et de stop loss en temps réel pour une meilleure adaptabilité

Conclusion

La stratégie combine avec succès le jugement de tendance des moyennes mobiles et le jugement auxiliaire du MACD, et fixe des bénéfices raisonnables et des arrêts de pertes, qui peuvent obtenir des rendements stables dans diverses conditions de marché.


/*backtest
start: 2023-11-04 00:00:00
end: 2023-12-04 00:00:00
period: 1h
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/
// © exlux99

//@version=4
strategy(title = "Full Crypto Swing Strategy ALMA Cross", overlay = true,  pyramiding=1,initial_capital = 1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.03)

//time condition
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2010, title = "From Year", minval = 1970)
 //monday and session 
// To Date Inputs
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2031, title = "To Year", minval = 1970)

startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
time_cond = time >= startDate and time <= finishDate

UseHAcandles    = input(false, title="Use Heikin Ashi Candles in Algo Calculations")

haClose = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, close) : close
haOpen  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, open) : open
haHigh  = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, high) : high
haLow   = UseHAcandles ? security(heikinashi(syminfo.tickerid), timeframe.period, low) : low

//alma fast and slow
src = haClose
windowsize = input(title="Length Size Fast", type=input.integer, defval=20)
windowsize2 = input(title="Length Size Slow", type=input.integer, defval=40)
offset = input(title="Offset", type=input.float, defval=0.9, step=0.05)
sigma = input(title="Sigma", type=input.float, defval=5)
outfast=alma(src, windowsize, offset, sigma)
outslow=alma(src, windowsize2, offset, sigma)

//macd
fast_length = input(title="Fast Length", type=input.integer, defval=6)
slow_length = input(title="Slow Length", type=input.integer, defval=25)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)

// Calculating
fast_ma = ema(src, fast_length)
slow_ma =  ema(src, slow_length)
macd = fast_ma - slow_ma
signal = ema(macd, signal_length)
hist = macd - signal

long=crossover(outfast,outslow) and hist > hist[1] and time_cond
short=crossunder(outfast,outslow) and hist < hist[1] and time_cond

takeProfit_long=input(2.0, step=0.005)
stopLoss_long=input(0.2, step=0.005)
takeProfit_short=input(0.05, step=0.005)
stopLoss_short=input(1.0, step=0.005)

strategy.entry("long",1,when=long)
strategy.entry("short",0,when=short)

strategy.exit("short_tp/sl", "long", profit=close * takeProfit_long / syminfo.mintick, loss=close * stopLoss_long / syminfo.mintick, comment='LONG EXIT',  alert_message = 'closeshort')
strategy.exit("short_tp/sl", "short", profit=close * takeProfit_short / syminfo.mintick, loss=close * stopLoss_short / syminfo.mintick, comment='SHORT EXIT',  alert_message = 'closeshort')

Plus de