Cet article explique en détail une stratégie de trading quantitative basée sur l'analyse de la tendance de l'élan. Il synthétise des indicateurs tels que les moyennes mobiles, MACD et RSI pour identifier l'élan des prix et saisir les opportunités de tendance à moyen et long terme.
I. Logique stratégique
Les principaux indicateurs de jugement sont les suivants:
Les EMA permettent d'évaluer les tendances à travers les différentes périodes.
MACD pour détecter les changements de dynamique à court terme.
RSI pour vérifier les niveaux de surachat/survente.
ATR pour le calcul du stop-loss et du take profit.
Il combine ces indicateurs pour identifier des écarts persistants et importants qui signalent le début d'une tendance à l'entrée dans le commerce.
Lorsque l'EMA à court terme fluctue fréquemment, il juge que le marché est variable. Les transactions ne sont effectuées que lorsque l'EMA à long terme est brisée.
Le MACD juge la force de l'élan, le RSI évite de courir après les sommets et les bas.
II. Avantages de la stratégie
Le principal avantage réside dans la complémentarité des indicateurs, qui permettent d'identifier efficacement le début des tendances à moyen et long terme.
Un autre avantage est l'arrêt des pertes et le profit, qui bloque les profits de tendance et gère le risque.
Enfin, les périodes EMA par étapes permettent des entrées de tendance en douceur à différents niveaux de dynamique.
III. Risques potentiels
Toutefois, la stratégie comporte également les risques suivants:
Premièrement, la détection des tendances peut être retardée, ce qui entraîne des occasions manquées.
Deuxièmement, les arrêts trop serrés risquent d'être arrêtés trop tôt.
Enfin, la pression de retrait nécessite une préparation psychologique.
IV. Résumé
En résumé, cet article a expliqué une stratégie quantitative basée sur l'analyse de la tendance de l'élan. Il synthétise des indicateurs tels que les moyennes mobiles, le MACD et le RSI pour déterminer la direction de la tendance. Avec un réglage approprié des paramètres, il peut contrôler les risques et réaliser des profits stables. Mais les risques tels que le décalage des indicateurs doivent être surveillés.
/*backtest start: 2023-08-14 00:00:00 end: 2023-08-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("QuantCat Mom Finder Strateg (1H)", overlay=true) //Series to sum the amount of crosses in EMA for sideways trend/noise filtering //can change EMA lengths, can change to SMA's/WMA's e.t.c lookback_value = 60 minMA = 20 midMA = 40 maxMA = 60 ema25_crossover = (crossover(close, ema(close, minMA))) == true ? 1 : 0 ema25_crossover_sum = sum(ema25_crossover, lookback_value) ///potentially change lookback value to alter results ema50_crossover = (crossover(close, ema(close, midMA))) == true ? 1 : 0 ema50_crossover_sum = sum(ema50_crossover, lookback_value) ///potentially change lookback value to alter results ema75_crossover = (crossover(close, ema(close, maxMA))) == true ? 1 : 0 ema75_crossover_sum = sum(ema75_crossover, lookback_value) ///potentially change lookback value to alter results ema25_crossunder = (crossunder(close, ema(close, minMA))) == true ? 1 : 0 ema25_crossunder_sum = sum(ema25_crossunder, lookback_value) ///potentially change lookback value to alter results ema50_crossunder = (crossunder(close, ema(close, midMA))) == true ? 1 : 0 ema50_crossunder_sum = sum(ema50_crossunder, lookback_value) ///potentially change lookback value to alter results ema75_crossunder = (crossunder(close, ema(close, maxMA))) == true ? 1 : 0 ema75_crossunder_sum = sum(ema75_crossunder, lookback_value) ///potentially change lookback value to alter results4 //Boolean series declaration //can change amount of times crossed over the EMA verification to stop sideways trend filtering (3) maxNoCross=2 macdmidlinebull=-0.5 macdmidlinebear=0.5 [macdLine, signalLine, histLine] = macd(close, 12, 26, 9) //--------------- //Series Creation bullishMacd = (macdLine > signalLine) and (macdLine > macdmidlinebull) ? true : false bearishMacd = (macdLine < signalLine) and (macdLine < macdmidlinebear) ? true : false bullRsiMin = 50 //53 initial values bullRsiMax = 60 //61 bearRsiMin = 40 //39 bearRsiMax = 50 //47 basicBullCross25bool = ((ema25_crossover_sum < ema50_crossover_sum) and (ema25_crossover_sum < ema75_crossover_sum) and (ema25_crossover_sum < maxNoCross) and crossover(close, ema(close, minMA)) and (rsi(close, 14) > bullRsiMin) and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false basicBullCross50bool = ((ema50_crossover_sum < ema25_crossover_sum) and (ema50_crossover_sum < ema75_crossover_sum) and (ema50_crossover_sum < maxNoCross) and crossover(close, ema(close, midMA)) and (rsi(close, 14) > bullRsiMin) and (basicBullCross25bool == false) and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false basicBullCross75bool = ((ema75_crossover_sum < ema25_crossover_sum) and (ema75_crossover_sum < ema50_crossover_sum) and (ema75_crossover_sum < maxNoCross) and crossover(close, ema(close, maxMA)) and (rsi(close, 14) > bullRsiMin) and (basicBullCross25bool == false) and (basicBullCross50bool == false) and (rsi(close, 14) < bullRsiMax) and (bullishMacd == true)) ? true : false basicBearCross25bool = ((ema25_crossunder_sum < ema50_crossunder_sum) and (ema25_crossunder_sum < ema75_crossunder_sum) and (ema25_crossunder_sum < maxNoCross) and crossunder(close, ema(close, minMA)) and (rsi(close, 14) <bearRsiMax) and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false basicBearCross50bool = ((ema50_crossunder_sum < ema25_crossunder_sum) and (ema50_crossunder_sum < ema75_crossover_sum) and (ema50_crossunder_sum < maxNoCross) and crossunder(close, ema(close, midMA)) and (rsi(close, 14) < bearRsiMax) and (basicBearCross25bool == false) and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false basicBearCross75bool = ((ema75_crossunder_sum < ema25_crossunder_sum) and (ema75_crossunder_sum < ema50_crossunder_sum) and (ema75_crossunder_sum < maxNoCross) and crossunder(close, ema(close, maxMA)) and (rsi(close, 14) < bearRsiMax) and (basicBearCross25bool == false) and (basicBearCross50bool == false) and (rsi(close, 14) > bearRsiMin) and (bearishMacd == true)) ? true : false //STRATEGY //can change lookback input on ATR atrLkb = input(14, minval=1, title='ATR Stop Period') atrRes = input("D", title='ATR Resolution') atr = security(syminfo.tickerid, atrRes, atr(atrLkb)) longCondition = (basicBullCross25bool or basicBullCross50bool or basicBullCross75bool) == true if (longCondition) strategy.entry("Long", strategy.long) shortCondition = (basicBearCross25bool or basicBearCross50bool or basicBearCross75bool) == true if (shortCondition) strategy.entry("Short", strategy.short) // Calc ATR Stops // can change atr multiplier to affect stop distance/tp distance, and change "close" to ema values- could try ema 50 stopMult = 0.6 //0.6 is optimal longStop = na longStop := shortCondition ? na : longCondition and strategy.position_size <=0 ? close - (atr * stopMult) : longStop[1] shortStop = na shortStop := longCondition ? na : shortCondition and strategy.position_size >=0 ? close + (atr * stopMult) : shortStop[1] //Calc ATR Target targetMult = 2.2 //2.2 is optimal for crypto x/btc pairs longTarget = na longTarget := shortCondition ? na : longCondition and strategy.position_size <=0 ? close + (atr*targetMult) : longTarget[1] shortTarget = na shortTarget := longCondition ? na : shortCondition and strategy.position_size >=0 ? close - (atr*targetMult) : shortTarget[1] // Place the exits strategy.exit("Long ATR Stop", "Long", stop=longStop, limit=longTarget) strategy.exit("Short ATR Stop", "Short", stop=shortStop, limit=shortTarget) //Bar color series longColour = longCondition ? lime : na shortColour = shortCondition ? red : na // Plot the stoplosses and targets plot(longStop, style=linebr, color=red, linewidth=2, title='Long ATR Stop') plot(shortStop, style=linebr, color=red, linewidth=2, title='Short ATR Stop') plot(longTarget, style=linebr, linewidth=2, color=lime, title='Long ATR Target') plot(shortTarget, linewidth=2, style=linebr, color=lime, title='Long ATR Target') barcolor(color=longColour) barcolor(color=shortColour) alertcondition(((basicBullCross25bool or basicBullCross50bool or basicBullCross75bool)==true), title='Long Entry', message='Bullish Momentum Change!') alertcondition(((basicBearCross25bool or basicBearCross50bool or basicBearCross75bool)==true), title='Short Entry', message='Bearish Momentum Change!')