Cet article présente en détail une stratégie de trading quantitatif basée sur la détermination de la dynamique de la tendance. Cette stratégie utilise des indicateurs tels que la moyenne, le MACD et le RSI pour déterminer la dynamique des prix afin de capturer des opportunités de tendance à la moyenne et à la longueur.
Premièrement, les principes stratégiques
Les principaux indicateurs de jugement de la stratégie sont les suivants:
la moyenne des EMA, qui détermine la tendance des prix au cours des différents cycles;
Le MACD, pour déterminer si la dynamique à court terme a évolué;
Le RSI, pour déterminer s’il est en sur-achat ou en sur-vente;
ATR, calcul de la position de stop loss et d’arrêt
Il combine ces indicateurs pour déterminer si le prix a une rupture soutenue et forte, identifie le début d’une tendance et forme un signal de transaction.
Lorsque la courte EMA est inversée plusieurs fois, elle est considérée comme consolidée et n’est mise en jeu que lorsqu’elle franchit la longue EMA.
Le MACDI implément le jugement sur le changement de momentum, le RSI évite de remonter vers le bas.
Deux, les avantages stratégiques
Le plus grand avantage de cette stratégie est que les indicateurs sont complémentaires et permettent d’évaluer efficacement le lancement d’une tendance à la ligne moyenne et longue.
Un autre avantage est le paramètre Stop Loss Stop, qui permet de bloquer la tendance à la rentabilité et de contrôler les risques.
Enfin, la hiérarchisation des cycles EMA permet d’entrer progressivement dans des tendances de différentes intensités.
Troisièmement, les risques potentiels
Mais cette stratégie comporte aussi les risques suivants:
Tout d’abord, il y a un risque de retard dans le jugement des tendances et de fuites.
Deuxièmement, la prévention est trop radicale pour risquer de se faire piéger.
Enfin, il faut être préparé psychologiquement pour se débarrasser du stress.
Quatrième partie, résumé
Cet article décrit en détail une stratégie quantitative basée sur la dynamique de la tendance. Elle utilise des indicateurs tels que la moyenne, le MACD et le RSI pour déterminer la direction de la tendance.
/*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!')