Stratégie de croisement des moyennes mobiles sur plusieurs délais

Auteur:ChaoZhang est là., Date: le 19 février 2024
Les étiquettes:

img

Résumé

La stratégie de croisement des moyennes mobiles sur plusieurs délais est une stratégie de trading algorithmique qui utilise des signaux de croisement des moyennes mobiles entre différentes périodes de temps pour déterminer la direction de la tendance.

La logique de la stratégie

Cette stratégie calcule l'indicateur CCI sur différentes périodes pour déterminer la direction de la tendance du marché, combiné avec les signaux MACD pour localiser les croix dorées et les croix de la mort, et utilise enfin l'indicateur ATR pour définir les niveaux stop loss/take profit, afin d'acheter à bas prix et de vendre à haut prix.

Plus précisément, il calcule d'abord le CCI à 20 périodes pour juger des tendances haussières ou baissières. Ensuite, il vérifie si les lignes MACD se croisent pour identifier les signaux de trading. Ensuite, ATR est utilisé pour générer des trailing stops pour verrouiller les bénéfices. Enfin, tous les signaux sont consolidés pour générer les signaux d'entrée et de sortie.

Les avantages

  1. La combinaison de plusieurs indicateurs améliore la précision du signal

    La combinaison du CCI, du MACD et de l'ATR améliore la fiabilité des signaux de négociation en évaluant collectivement la tendance, l'élan et la volatilité.

  2. L'analyse sur plusieurs délais capte le rythme du marché

    L'indicateur CCI à plus longue période capte la tendance globale, tandis que l'indicateur MACD à fréquence plus élevée détecte les points tournants locaux, permettant à la stratégie de capitaliser sur les fortes fluctuations du marché.

  3. Les contrôles d'arrêt de traction ATR sont efficaces

    Le stop loss basé sur l'ATR peut s'adapter à la volatilité du marché, tandis que sa caractéristique de trailing bloque davantage les bénéfices lorsque le marché évolue favorablement.

Les risques

  1. Espace d'optimisation limité

    La plupart des paramètres ont un espace de réglage restreint, ce qui permet d'atteindre facilement un goulot d'étranglement de performance.

  2. Augmentation de la charge de calcul

    Plusieurs indicateurs fonctionnant en même temps peuvent augmenter la charge de calcul, provoquant des retards dans le trading à haute fréquence.

  3. Signaux fréquents, contrôle du risque limité

    Les signaux peuvent être fréquents, tandis que le contrôle des risques repose principalement sur l'arrêt de trail ATR, qui a des limites contre les mouvements extrêmes.

Améliorations

  1. Appliquer l'apprentissage automatique pour un réglage plus efficace des paramètres

    L'optimisation bayésienne, les algorithmes génétiques, etc. peuvent permettre un réglage des paramètres plus intelligent et plus efficace.

  2. Ajouter des indicateurs fonctionnels pour améliorer l'adaptabilité

    L'incorporation d'autres indicateurs comme la volatilité, le volume, le sentiment peut rendre la stratégie plus robuste et flexible.

  3. Renforcer la gestion des risques pour une meilleure stabilité

    Des règles de stop loss plus scientifiques peuvent être conçues, et d'autres modules tels que la dimensionnement de la position peuvent aider à protéger contre les événements extrêmes.

Conclusion

La stratégie de croisement des moyennes mobiles multi-temps utilise les pouvoirs du CCI, du MACD et de l'ATR pour obtenir une capture fiable des tendances et un contrôle efficace des risques. Elle tient compte de la tendance, de l'élan et de la volatilité pour générer des signaux précis, saisir les rythmes du marché et gérer les risques.


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



Plus de