Stratégie de croisement de moyennes mobiles sur plusieurs périodes de temps


Date de création: 2024-02-19 15:41:29 Dernière modification: 2024-02-19 15:41:29
Copier: 0 Nombre de clics: 654
1
Suivre
1617
Abonnés

Stratégie de croisement de moyennes mobiles sur plusieurs périodes de temps

Aperçu

La stratégie Multi Timeframe Moving Average Crossover est une stratégie de trading algorithmique qui utilise des signaux croisés entre des moyennes mobiles de différentes périodes pour déterminer la direction de la tendance. La stratégie utilise une combinaison d’indicateurs de tendance, d’indicateurs de dynamique et d’indicateurs de volatilité, ce qui rend la stratégie plus fiable.

Principe de stratégie

La stratégie consiste à déterminer la direction de la tendance du marché en calculant les indicateurs CCI de différents cycles, puis en combinant les indicateurs MACD pour rechercher un signal de fourche dorée et, enfin, en utilisant l’indicateur ATR pour définir un stop-loss, permettant ainsi un achat ou une vente à bas prix.

Plus précisément, on commence par calculer l’indicateur CCI sur 20 cycles, pour juger de la tendance du marché en fonction de ses valeurs positives et négatives; ensuite, on calcule si la moyenne rapide et lente de l’indicateur MACD est croisée, pour déterminer si un signal d’achat et de vente est généré; ensuite, on utilise l’indicateur ATR pour générer un mécanisme de suivi des arrêts de perte, afin de bloquer davantage les bénéfices; enfin, on synthétise les signaux de plusieurs des indicateurs ci-dessus pour produire le signal final de la stratégie d’achat et de vente.

Avantages stratégiques

  1. Combinaison de plusieurs indicateurs pour une meilleure précision du signal

La stratégie utilise une combinaison de trois indicateurs: CCI, MACD et ATR pour évaluer la tendance, la dynamique et la volatilité du marché, ce qui rend le signal stratégique plus précis et plus fiable.

  1. Une analyse de plusieurs périodes pour suivre le rythme du marché

L’utilisation du CCI de différents cycles pour déterminer la tendance générale du marché, en collaboration avec le MACD de haute période pour rechercher des nœuds de bas prix et de vente élevée, permet de saisir le rythme de tendance plus important du marché.

  1. ATR: un suivi des pertes et une gestion efficace des risques

Avec le stop loss généré par l’indicateur ATR, il est possible de définir des points de perte raisonnables en fonction de la volatilité du marché, tout en ayant une fonction de suivi des arrêts, ce qui permet de bien contrôler le risque de la stratégie.

Risque stratégique

  1. Limite d’optimisation des paramètres

La plupart des paramètres de la stratégie n’ont pas beaucoup de marge de manœuvre, ce qui limite l’amélioration de l’effet de la stratégie.

  1. La combinaison de plusieurs indicateurs augmente la charge de calcul

Le fait que la stratégie utilise plusieurs indicateurs pour effectuer des opérations combinées augmente dans une certaine mesure la charge de calcul de la stratégie. Des problèmes de carton peuvent survenir dans les transactions à haute fréquence.

  1. Les signaux sont fréquents, les contrôles de risque limités

Les signaux stratégiques peuvent être plus fréquents, tandis que les contrôles de risque reposent principalement sur le suivi des pertes de l’indicateur ATR. Les contrôles de risque pour les situations extrêmes ne sont pas complets.

Optimisation de la stratégie

  1. L’efficacité de l’optimisation des paramètres grâce à des algorithmes d’apprentissage automatique

Il est possible d’essayer d’utiliser des algorithmes d’optimisation hyperparamétrique basés sur l’apprentissage automatique, tels que l’optimisation bayésienne, l’algorithme génétique, etc., pour rendre l’ajustement des paramètres plus intelligent et plus efficace.

  1. Accroître les indicateurs fonctionnels et la résilience stratégique

L’ajout d’autres indicateurs fonctionnels, tels que les indicateurs de volatilité, les indicateurs d’énergie quantitative et les indicateurs d’humeur, peut être envisagé pour améliorer l’adaptabilité et la robustesse de la stratégie.

  1. Renforcement des modules de gestion des risques et des stratégies de contrôle des risques

Il est possible de concevoir des principes de stop-loss plus scientifiques, ou d’ajouter certains modules de contrôle de position ou de gestion de fonds, afin de mieux protéger contre les risques de situations extrêmes et de garantir la stabilité de la stratégie.

Résumer

La stratégie multi-cadres transverse la ligne d’équilibre par l’utilisation d’une combinaison de trois grands indicateurs CCI, MACD et ATR, permettant un jugement de tendance plus fiable et un contrôle de risque plus efficace. La stratégie prend en compte les trois dimensions de la tendance, de la dynamique et de la volatilité, avec une grande précision du signal, la maîtrise du rythme du marché et les avantages d’un contrôle efficace du risque. Bien sûr, la stratégie existe également un espace d’optimisation paramétrique, une charge de calcul limitée et des problèmes de contrôle du risque.

Code source de la stratégie
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('smplondonclinic Strategy', shorttitle='SMPLC Strategy', overlay=true, pyramiding = 0, process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

direction   = input.string(title='Entry Direction', defval='Long', options=['Long', 'Short', 'Both'],group = "Strategy Entry Direction")

TPPerc = input.float(title='Take Profit (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')
SLPerc = input.float(title='Stop Loss (%)', minval=0.0, step=0.1, defval=0.5, group='Strategy TP & SL')

period = input(20, 'CCI period',group = "TREND MAGIC")
coeff = input(1, 'ATR Multiplier',group = "TREND MAGIC")
AP = input(5, 'ATR Period',group = "TREND MAGIC")
ATR = ta.sma(ta.tr, AP)
srctm = close
upT = low - ATR * coeff
downT = high + ATR * coeff
MagicTrend = 0.0
MagicTrend := ta.cci(srctm, period) >= 0 ? upT < nz(MagicTrend[1]) ? nz(MagicTrend[1]) : upT : downT > nz(MagicTrend[1]) ? nz(MagicTrend[1]) : downT
color1 = ta.cci(srctm, period) >= 0 ? #0022FC : #FC0400
plot(MagicTrend, color=color1, linewidth=3)
tmb = ta.cci(srctm, period) >= 0 and close>MagicTrend
tms = ta.cci(srctm, period) <= 0 and close<MagicTrend

//MACD

res           = input.timeframe("",  "Indicator TimeFrame", group = "MACD")
fast_length   = input.int(title="Fast Length", defval=12, group = "MACD")
slow_length   = input.int(title="Slow Length", defval=26, group = "MACD")
src           = input.source(title="Source", defval=close, group = "MACD")
signal_length = input.int(title="Signal Smoothing", minval = 1, maxval = 999, defval = 9, group = "MACD")
sma_source    = input.string(title="Oscillator MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")
sma_signal    = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group = "MACD")

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

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


//UT Bot

srcut = close
showut = input.bool(false, 'Show UT Bot Labels', group = "UT BOT")
keyvalue = input.float(2, title='Key Vaule. \'This changes the sensitivity\'', step=.5, group = "UT BOT")
atrperiod = input(7, title='ATR Period', group = "UT BOT")
xATR = ta.atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
iff_1 = srcut > nz(xATRTrailingStop[1], 0) ? srcut - nLoss : srcut + nLoss
iff_2 = srcut < nz(xATRTrailingStop[1], 0) and srcut[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), srcut + nLoss) : iff_1
xATRTrailingStop := srcut > nz(xATRTrailingStop[1], 0) and srcut[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), srcut - nLoss) : iff_2

pos = 0
iff_3 = srcut[1] > nz(xATRTrailingStop[1], 0) and srcut < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := srcut[1] < nz(xATRTrailingStop[1], 0) and srcut > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

//plot(xATR, color=xcolor, title='Trailing Stop')
buy = ta.crossover(srcut, xATRTrailingStop)
sell = ta.crossunder(srcut, xATRTrailingStop)
barcolor = srcut > xATRTrailingStop

plotshape(showut ? buy:na, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(showut ? sell:na, title='Sell', text='Sell', style=shape.labeldown, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

//barcolor(barcolor ? color.green : color.red)

goLong = buy and tmb and cross_UP
goShort = sell and tms and cross_DN

plotshape(goLong, location=location.bottom, style=shape.triangleup, color=color.lime, size=size.small)
plotshape(goShort, location=location.top, style=shape.triangledown, color=color.red, size=size.small)

percentAsPoints(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100.0 * strategy.position_avg_price / syminfo.mintick) : float(na)

percentAsPrice(pcnt) =>
    strategy.position_size != 0 ? (pcnt / 100.0 + 1.0) * strategy.position_avg_price : float(na)

current_position_size = math.abs(strategy.position_size)
initial_position_size = math.abs(ta.valuewhen(strategy.position_size[1] == 0.0, strategy.position_size, 0))

TP = strategy.position_avg_price + percentAsPoints(TPPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)
SL = strategy.position_avg_price - percentAsPoints(SLPerc) * syminfo.mintick * strategy.position_size / math.abs(strategy.position_size)

var long = false
var short = false

if direction == 'Long' 
    long := goLong
    short := false

if direction == 'Short'
    short := goShort
    long := false

if direction == 'Both' 
    long := goLong
    short := goShort

if long and strategy.opentrades == 0
    strategy.entry(id='Long', direction=strategy.long)

if short and strategy.opentrades == 0
    strategy.entry(id='Short', direction=strategy.short)

if strategy.position_size > 0

    strategy.exit('TPSL', from_entry='Long', qty=initial_position_size, limit=TP, stop=SL)

if strategy.position_size < 0

    strategy.exit('TPSL2', from_entry='Short', qty=initial_position_size, limit=TP, stop=SL)