
Cette stratégie est basée sur une stratégie de suivi de tendance et de rupture de l’indicateur des bandes récurrentes développée par Alex Grover. La stratégie utilise les bandes récurrentes pour déterminer la tendance des prix et les niveaux de résistance de soutien critique, combinée à des conditions de dynamisme pour filtrer les fausses ruptures, permettant des entrées de faible fréquence mais de haute qualité.
L’indicateur de la bande récurrente est composé de la bande supérieure, de la bande inférieure et de la ligne médiane. Le calcul de l’indicateur est le suivant:
Bande supérieure = valeur maximale de la première ligne K, prix de clôture + n*Le taux de volatilité
Bande inférieure = valeur minimale de la bande inférieure de la ligne K précédente, prix de clôture - n*Le taux de volatilité
La ligne médiane est égale à (la bande supérieure + la bande inférieure) / 2
où n est un coefficient d’agrandissement, la fluctuation peut choisir l’ATR, l’écart-type, le canal moyen et une méthode RFV spéciale. La sensibilité de l’indicateur est contrôlée par le paramètre de longueur, et plus la valeur est grande, moins l’indicateur est susceptible d’être déclenché.
La stratégie consiste d’abord à détecter si la bande inférieure continue à monter et si la bande supérieure continue à descendre, afin d’éliminer les fausses ruptures.
Quand le prix est au-dessous de la barre, faites plus; quand le prix est au-dessus de la barre, faites moins.
La stratégie a également une logique de stop-loss.
Cette stratégie présente les avantages suivants:
Cette stratégie comporte aussi des risques:
Ces risques peuvent être maîtrisés par l’optimisation des paramètres, la mise en place de stop-loss et l’augmentation des points de glissement.
Cette stratégie peut également être optimisée dans les directions suivantes:
Cette stratégie est globalement une stratégie de suivi de tendance très pratique et efficace. Elle est combinée à un cadre récurrent pour économiser des ressources de calcul, utilise la résistance de la tendance pour déterminer la direction de la grande tendance et augmente le filtrage des fausses ruptures de conditions de mouvement, garantissant ainsi la qualité du signal de négociation.
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
method == a ? b : c
v(x) =>
f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2
// Colors
beColor = #675F76
buColor = #a472ff
// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))
// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
if b[i] > b[i+1]
longc:=longc+1
if a[i] < a[i+1]
shortc:=shortc+1
bhdLong = if bandDirectionCheck
longc==lookback
else
true
bhdShort = if bandDirectionCheck
shortc==lookback
else
true
// Strategy
if b>=low and bhdLong
strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
strategy.entry(id='Short',direction=strategy.short)
// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
//strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
//strategy.exit(id="Long",limit=close)