Joanne sur Crypto - moyenne mobile double avec stratégie de scalping MACD

Auteur:ChaoZhang est là., Date: 2023-11-02 16:09:08 Je suis désolé
Les étiquettes:

img

Résumé

L'idée de base de cette stratégie est de combiner les moyennes mobiles doubles et l'indicateur MACD pour déterminer la direction de tendance de la tendance après le trading. Lorsque le MA rapide traverse au-dessus du MA lent, il signale une opportunité de tendance haussière. Lorsque le MA rapide traverse en dessous du MA lent, il signale une opportunité de tendance baissière. L'histogramme MACD est utilisé pour déterminer des points d'entrée et de sortie spécifiques en allant long quand il traverse au-dessus de 0 et en allant court quand il traverse en dessous de 0.

La logique de la stratégie

  1. Calculer l'EMA rapide (12 jours), l'EMA lente (26 jours) et l'EMA du signal (9 jours) du MACD.

  2. Calculer l'histogramme MACD (EMA rapide - EMA lente) et la ligne de signal MACD (EMA à 9 jours de l'histogramme MACD).

  3. Calculer les MA à 50 jours et à 200 jours comme tendances.

  4. L'histogramme MACD dépassant 0 est le signal haussier et celui qui dépasse 0 est le signal baissier.

  5. Une EMA rapide dépassant une EMA lente, combinée à une EMA courte dépassant une EMA longue, donne des signaux haussiers.

  6. Le franchissement rapide de l'EMA en dessous de l'EMA lente combiné avec le franchissement de l'EMA courte en dessous de l'EMA longue donne des signaux baissiers.

  7. Nombre maximal de transactions après chaque croisement MA en utilisant le paramètre croisé EMA.

  8. Utilisez le stop loss et le profit pour sortir des transactions.

Les avantages

  1. Les doubles MAs déterminent la tendance globale afin d'éviter les transactions contre-tendance.

  2. Le MACD identifie les points d'entrée et de sortie pour capturer les changements de tendance.

  3. La combinaison fournit un bon moment pour les entrées dans la direction de la tendance.

  4. Limite le nombre de transactions après le croisement pour éviter de suivre les tendances.

  5. Arrêtez les pertes et prenez le risque de contrôle des bénéfices.

  6. Les paramètres peuvent être optimisés pour une meilleure performance.

Les risques

  1. Une mauvaise détermination de la tendance conduit à une perte de tendance opposée.

  2. Les signaux MACD retardent l'action des prix, ce qui entraîne des entrées prématurées ou tardives.

  3. Les niveaux de stop loss et de take profit inappropriés conduisent à des stops excessifs ou à des profits insuffisants.

  4. L'optimisation des paramètres est difficile. Différentes combinaisons de paramètres sont nécessaires pour différents produits et délais. Requiert des tests initiaux approfondis.

Des possibilités d'amélioration

  1. Testez d'autres indicateurs comme le KD pour déterminer la tendance.

  2. Ajoutez d'autres indicateurs pour filtrer les signaux MACD, comme les bandes de Bollinger, les arrêts ATR.

  3. Optimiser le stop loss et le profit pour chaque produit.

  4. Utilisez l'optimisation aléatoire pour trouver de meilleurs paramètres.

  5. Ajouter des mécanismes pour réduire la fréquence des transactions, comme la zone MACD autour de 0.

  6. Automatiser l'optimisation des paramètres et des combinaisons sur plusieurs produits.

Résumé

Cette stratégie combine les atouts de deux MAs pour la direction de la tendance et du MACD pour le timing d'entrée pour créer un système de suivi de tendance robuste. Des gains de performance supplémentaires sont possibles grâce à l'optimisation des paramètres et à la combinaison d'indicateurs.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="ComiCo - Joel on Crypto - MACD Scalping", shorttitle="ComiCo - Joel on Crypto - MACD Scalping")
// Getting inputs
slow_length1 = input(title="EMA Trend 1", defval=50)
slow_length2 = input(title="EMA Trend 2 ", defval=200)
fast_length = input(title="MACD Fast Length", defval=12)
slow_length = input(title="MACD Slow Length", defval=26)
signal_length = input.int(title="MACD Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
src = input(title="MACD Source", defval=close)

i_switch = input.string(title="Tick Highlight", defval="Moving average" ,options=["Moving average","Fixed value" ])
i_switch2 = input.string(title="Tick Source", defval="Highest bar" ,options=["Highest bar","Average","Last bar"])

signal_lengthup = input.int(title="Upticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)
signal_lengthdown = input.int(title="Downticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)

signal_lengthMA = input.float(title="Ticks Avg. Multiplier",  minval = 0, maxval = 5000, defval = 2, step = 0.1)

sma_source = "EMA"
sma_signal = "EMA"
// Plot colors

col_grow_above = #26A69A
col_fall_above =#B2DFDB
col_grow_below = #FFCDD2
col_fall_below = #FF5252
// Calculating

fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)

time_macd=timeframe.period=="1"?"1": timeframe.period=="3"?"1": timeframe.period=="5"?"1": timeframe.period=="15"?"3":timeframe.period=="30"?"5":timeframe.period=="60"?"15":timeframe.period=="120"?"30":timeframe.period=="240"?"60":timeframe.period=="D"?"240":timeframe.period=="W"?"D":timeframe.period=="M"?"W":timeframe.period=="12M"?"M":timeframe.period



macd = fast_ma - slow_ma
macd1=request.security(syminfo.tickerid, time_macd, macd)
signal = sma_signal == "SMA" ? ta.sma(macd1, signal_length) : ta.ema(macd1, signal_length)

ema50=ta.ema(close,slow_length1)
ema200=ta.ema(close ,slow_length2)

var TradeCounter = 0
MaxCount = input.int(title = "Max trades after EMA cross", minval = 0, maxval = 1000, defval = 3)
bull = ema50>ema200
if bull != bull[1]
    TradeCounter := 0


hist = request.security(syminfo.tickerid, time_macd, macd1 - signal)


f() => [hist[4],hist[3],hist[2],hist[1], hist]
ss=request.security(syminfo.tickerid, time_macd, hist, barmerge.gaps_on,barmerge.lookahead_off)



[ss5,ss4,ss3,ss2,ss1]=request.security(syminfo.tickerid, time_macd, f(), barmerge.gaps_on,barmerge.lookahead_off)



a = array.from(ss5,ss4,ss3,ss2,ss1)

s3=i_switch2=="Highest bar"?(ss>0? array.max(a, 0) : array.min(a, 0)):i_switch2=="Average"?array.avg(a):i_switch2=="Last bar"?ss1:0

saa=timeframe.period == '1'? ss:s3

saa2=timeframe.period == '1'? ss:s3*signal_lengthMA


colorss=(s3>=0 ? (s3[1] < s3 ? col_grow_above : col_fall_above) : (s3[1] < s3 ? col_grow_below : col_fall_below))


saadown = saa2
saaup = saa2

saadown:=saa>=0? saa2:saadown[1]

saaup:=saa<0? saa2:saaup[1]



verr=ta.ema(saadown,signal_lengthup)
dowww=ta.ema(saaup,signal_lengthdown)

ss22=plot(verr, title="Avg. Cloud Upper 1", color=color.new(color.white, 100))
ss33=plot(dowww, title="Avg. Cloud Lower 1", color=color.new(color.white, 100))

fill(ss22, ss33, color.new(color.white, 93), title="Avg. Cloud Background")

fixeduptick = input(title="Fixed Uptick Value", defval=30)
fixeddowntick = input(title="Fixed Downtick Value", defval=-30)
minl = i_switch=="Fixed value"? fixeduptick  :  verr
maxl = i_switch=="Fixed value"? fixeddowntick : dowww 

plot(minl, title="Avg. Cloud Upper 2", color=color.new(color.white, 81))
plot(maxl, title="Avg. Cloud Lower 2", color=color.new(color.white, 81))


colors2= s3<=minl and s3>=maxl ? #2a2e39 : colorss

coro2=s3>0? ema50>ema200 ? #2a2e39 :  colors2 : ema50<ema200 ? #2a2e39: colors2
plot(saa, title="Histogram", style=plot.style_columns, color=coro2)

LimitDiff = input.float(title="Limit Price Difference",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
TP = input.float(title="Take Profit",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
SL = input.float(title="Stop Loss",  minval = 0, maxval = 0.1, defval = 0.004, step = 0.0005)

minEMAdiff = input.float(title = "Min EMA difference", defval = 100, step = 10)

if #2a2e39 != coro2
    a22 = 0
    if ema50<ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 + LimitDiff)
        strategy.entry("enter short", strategy.short, limit = LimitPrice)
        strategy.exit("exit short", "enter short", limit = LimitPrice * (1 - TP), stop = LimitPrice * (1 + SL))
        TradeCounter := TradeCounter + 1
    if ema50>ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 - LimitDiff)
        strategy.entry("enter long", strategy.long, limit = LimitPrice)
        strategy.exit("exit long", "enter long", limit = LimitPrice * (1 + TP), stop = LimitPrice * (1 - SL))
        TradeCounter := TradeCounter + 1

//alertcondition(#2a2e39 != coro2 , title='MACD Tick Alert', message='Joel on Crypto - MACD Tick Alert')



Plus de