
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.
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.
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.
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é.
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.
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.
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.
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.
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.
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.
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.
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.
/*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)