Cet article présente en détail une stratégie quantitative qui utilise une rupture de canal pour effectuer des transactions de tendance. Cette stratégie permet d’identifier la direction de la tendance via le canal EMA et de faire des opérations inverses avec le jugement de la courbe de Bryn.
Premièrement, les principes stratégiques
La stratégie comprend principalement les éléments suivants:
la mise en place d’un EMA de ligne médiane et l’extension d’un canal ascendant et descendant en fonction de la proportion;
Lorsque le prix atteint la ligne supérieure du canal, on fait un suivi plus long; lorsque le prix atteint la ligne inférieure du canal, on fait un suivi à vide;
Il est important de noter que la courbe de Bryn se rétrécit et que la courbe de Bryn est inversée.
Réglez l’arrêt ATR pour limiter le risque de perte.
Vous pouvez personnaliser les paramètres du canal pour trouver la meilleure combinaison de paramètres.
La stratégie utilise les canaux EMA pour déterminer la direction des tendances dominantes et les opportunités de renversement de la bande de Bryn pour constituer un système de tendances complet.
Deux, les avantages stratégiques
Le plus grand avantage de cette stratégie est que l’indicateur est utilisé de manière rationnelle, l’EMA juge la tendance dominante, la bande de Brin capture l’inversion.
L’autre avantage est que les paramètres de stop loss sont directement efficaces et permettent de contrôler les risques.
Enfin, les paramètres peuvent être personnalisés et optimisés pour différentes variétés.
Troisièmement, les risques potentiels
Mais cette stratégie présente aussi les problèmes suivants:
Tout d’abord, l’EMA et les indices de la ceinture de Brin sont en retard.
Deuxièmement, il faut tenir compte du risque d’échec de l’opération inverse.
Enfin, l’optimisation des paramètres nécessite beaucoup de travail pour éviter une sur-optimisation.
Quatrième partie, résumé
Cet article détaille une stratégie de trading de tendance utilisant une rupture de la chaîne EMA. Elle permet d’identifier les tendances dominantes et de faire des opérations inverses aux points de basculement. La stratégie permet d’obtenir des gains stables grâce à l’optimisation des paramètres, mais nécessite également de contrôler la difficulté d’optimisation et le retard des indicateurs.
/*backtest
start: 2023-08-15 00:00:00
end: 2023-09-14 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="[mdeacey] EMA Percentage Channel + Bollinger Band Trending Strategy", shorttitle="[mdeacey] EMA% Channel + BB Trend Strategy", overlay=true)
//EMA 200
len = input(title="EMA Length", type=input.integer, defval=100)
srce = input(title="EMA Source", type=input.source, defval=close)
ema1= ema(srce,len)
percent = input(title="Inside Channel (%)", type=input.float, defval= 1)
valuee = (percent*ema1)/100
upperbande = ema1 + valuee
lowerbande = ema1 - valuee
///2
percent2 = input(title="Outside Channel (%)", type=input.float, defval= 2)
valuee2 = (percent2*ema1)/100
upperbande2 = ema1 + valuee2
lowerbande2 = ema1 - valuee2
plot(upperbande, title='Inside Channel Upperband', color=color.black, linewidth=1, style=plot.style_line )
plot(lowerbande, title='Inside Channel Lowerband', color=color.black, linewidth=1, style=plot.style_line )
plot(upperbande2, title='Outside Channel Upperband', color=color.black, linewidth=1, style=plot.style_line )
plot(lowerbande2, title='Outside Channel Lowerband', color=color.black, linewidth=1, style=plot.style_line )
length = input(20, minval=2)
src = input(close, title="Close price")
mult = input(2.0, title="Multiplier", minval=0.001, maxval=50)
MA2 = sma(src, length)
dev = mult * stdev(src, length)
upper = MA2 + dev
lower = MA2 - dev
signalColor = crossunder(close, upper) ? color.red : crossover(close, lower) ? color.green : color.white
barcolor(color=signalColor)
nopo= strategy.position_size==0
upperBand = plot(upper, title='Upper Bollinger Band', color=color.gray, linewidth=1)
lowerBand = plot(lower, title='Lower Bollinger Band', color=color.gray, linewidth=1)
fill(upperBand, lowerBand, title='Bollinger Band', color=color.black)
strategy.entry("Long",true,when = crossover(close,lower) and close <lowerbande and close>lowerbande2)
strategy.close("Long",when = crossunder(close,lowerbande2))//crossunder(close,lowerbande) or crossunder(close,lowerbande2))
strategy.entry("Short",false,when = crossunder(close,upper) and close >upperbande and close<upperbande2)
strategy.close("Short",when = crossover(close,upperbande2) )//crossover(close,upperbande) or crossover(close,upperbande2) )
//Inputs
atrPeriod = input(defval=14, title="ATR Period",group='ATR Stoploss', type=input.integer) // Adjust this to change the ATR calculation length
multiplierPeriod = input(defval=1.75, title="ATR Multiplier",group='ATR Stoploss', type=input.float)// Adjust this to change the distance between your candles and the line
//ATR Calculation
pine_rma(x, y) =>
alpha = y
sum = 0.0
sum := (x + (alpha - 1) * nz(sum[1])) / alpha
true_range() =>
max(high - low, max(abs(high - close[1]), abs(low - close[1])))
//Long SL
plot(low - pine_rma(true_range() * multiplierPeriod, atrPeriod), "Long Stop", color=color.red, offset = 1)
// Short SL
plot(high +pine_rma(true_range() * multiplierPeriod, atrPeriod), "Short Stop", color=color.red, offset = 1)
strategy.exit("Exit","Long",limit=upper ,stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod) )
strategy.exit("Exit","Short",limit=lower ,stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod) )
/////////////////////new strategy
strategy.entry("Long",true,stop =upperbande ,when = close <upperbande and close[1] <upperbande and nopo )
strategy.close("Long",when = crossunder(close,upper) )// and close <upperbande and close>lowerbande)
strategy.entry("Short",false,stop =lowerbande ,when = close >lowerbande and close[1] >lowerbande and nopo )
strategy.close("Short",when = crossover(close, lower) )
strategy.exit("Exit","Long",stop = low - pine_rma(true_range() * multiplierPeriod, atrPeriod) )
strategy.exit("Exit","Short",stop =high +pine_rma(true_range() * multiplierPeriod, atrPeriod) )