Stratégie de trading de cassure des bandes de Bollinger


Date de création: 2023-09-12 16:23:12 Dernière modification: 2023-09-12 16:23:12
Copier: 0 Nombre de clics: 815
1
Suivre
1617
Abonnés

Cette stratégie consiste à négocier en jugeant si le prix a franchi le canal de la ceinture de Brin. Cette stratégie appartient à la catégorie des stratégies de rupture de canal et vise à capturer les opportunités de négociation de tendance qui se forment dans le canal de rupture de prix.

Le principe de la stratégie:

  1. Pour le calcul de la voie de la ceinture de Brin, la moyenne est la moyenne mobile simple de n jours, et la moyenne est plusieurs fois plus grande que la moyenne.

  2. Lorsque le prix est descendu de haut en bas, il y a une entrée en position courte. Lorsque le prix est descendu de bas en haut, il y a une entrée en position multiple.

  3. La ligne de stop-loss doit être placée à l’opposé de la ligne d’orbite pour le contrôle des risques.

  4. Adaptation de la bande passante du canal en fonction de la retraite maximale et optimisation des paramètres.

  5. Le filtrage des volumes de transactions est utilisé pour éviter les fausses percées.

Les avantages de cette stratégie:

  1. La rupture des canaux permet de déterminer efficacement le point de basculement de la tendance.

  2. L’optimisation des paramètres des bandes de Bryn est simple et pratique.

  3. La qualité est améliorée grâce à un filtrage de la fausse rupture combiné au volume des transactions.

Le risque de cette stratégie:

  1. Le retard de la ceinture de Brin est plus prononcé et peut manquer le meilleur point d’entrée.

  2. Il est facile de se retourner après une percée, il faut mettre en place un stop-loss raisonnable.

  3. L’optimisation de la recherche de transactions basse fréquence peut être une occasion manquée.

En résumé, la stratégie consiste à négocier en jugeant la rupture de la ceinture de Brin et constitue une stratégie de rupture de passage typique. Les règles relativement simples favorisent l’optimisation des paramètres, mais les problèmes de réglage du retard et de l’arrêt de la perte doivent toujours être surveillés pour obtenir des gains stables à long terme.

Code source de la stratégie
/*backtest
start: 2023-08-12 00:00:00
end: 2023-09-11 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
// strategy("ChannelBreakOutStrategyV2.1", commission_type = "percent", commission_value = 0.1, calc_on_order_fills = true, overlay=true)

length = input(title="Length",  minval=1, maxval=1000, defval=40)
maxR = input(title = "R",  minval = 1.0, maxval = 10, defval = 3, step = 0.1)
adoptR = input(title = "Auto Adjust R",  defval = false)
stepR = input(title = "Step in R",  minval = 0.01, maxval = 0.1, step = 0.01, defval = 0.02)
baseYear = input(title = "Base Year",  minval = 2000, maxval = 2016, defval = 2000)
volumeTh = input(title = "Volume Threadhold",  minval = 100.0, maxval = 200, defval = 120, step = 5)
hasLong = input(title = "Include Long",  defval = true)
hasShort = input(title = "Include Short",  defval = true)
usePositionSizing = input(title = "Enable Position Sizing",  defval = true)

getTrailStop(val, current) => 
    s = val > 1.6 ? 0.8 : val >= 1.4 ? 0.85 : val >= 1.3 ? 0.9 : 0.93
    s * current


upBound = highest(high, length)
downBound = lowest(low, length)
hasVol = (volume / sma(volume, length) * 100 >= volumeTh) ? 1 : 0

hasPos = strategy.position_size != 0 ? 1 : 0

trailstop = atr(length) * 3
ptvalue = syminfo.pointvalue
equity = strategy.openprofit > 0 ? strategy.equity - strategy.openprofit : strategy.equity
curR = adoptR == false ? maxR : n == 0 ? maxR : hasPos == 1 ? curR[1] : (rising(equity,1) > 0? curR[1] + stepR : falling(equity, 1) > 0 ? curR[1] <= 2.0 ? 2.0 : curR[1] - stepR : curR[1])
contracts = usePositionSizing == false ? 20 : floor(equity / 100 * curR / (trailstop * ptvalue))

realbuystop = close - trailstop
realsellstop = close + trailstop

isPFst = (hasPos[1] == 0 and hasPos == 1) ? 1 : 0
isPOn = (hasPos[1] + hasPos == 2) ? 1 : 0
largestR = hasPos == 0 or isPFst == 1 ? -1 : nz(largestR[1]) < close ? close : largestR[1]
pctRise =  largestR / strategy.position_avg_price

rbs = strategy.position_size <= 0 ? realbuystop : isPFst ? strategy.position_avg_price - trailstop : pctRise >= 1.3 ? getTrailStop(pctRise, largestR) : (isPOn and realbuystop > rbs[1] and close > close[1]) ? realbuystop : rbs[1]
rss = strategy.position_size >= 0 ? realsellstop : isPFst ? strategy.position_avg_price + trailstop : (isPOn and realsellstop < rss[1] and close < close[1]) ? realsellstop : rss[1]

isStart = na(rbs) or na(rss) ? 0 : 1
buyARun = close - open > 0 ? 0 : open - close
sellARun = open - close > 0 ? 0 : close - open

if (strategy.position_size > 0 and buyARun >= trailstop / 3 * 2 and pctRise < 1.3)
    strategy.close("buy")
    strategy.cancel("exit")
if (strategy.position_size < 0 and sellARun >= trailstop / 3 * 2)
    strategy.close("sell")
    strategy.cancel("exit")

strategy.cancel("buy")
strategy.cancel("sell")
conLong = hasLong == true and hasPos == 0 and year > baseYear and (isStart + hasVol) == 2
strategy.order("buy", strategy.long, qty = contracts, stop=upBound + syminfo.mintick * 5, comment="BUY", when = conLong)
if (rbs > high)
    strategy.close("buy")
strategy.exit("exit", "buy", stop = rbs, when = hasPos == 1 and isStart == 1)

conShort = hasShort == true and hasPos == 0 and year > baseYear and (isStart + hasVol) == 2
strategy.order("sell", strategy.short, qty = contracts, stop=downBound - syminfo.mintick * 5, comment="SELL", when = conShort)
if (rss < low)
    strategy.close("sell")
strategy.exit("exit", "sell", stop = rss, when = hasPos == 1 and isStart == 1)

plot(series = rbs, color=blue)
plot(series = realbuystop, color=green)
plot(series = rss, color=red)
plot(series = realsellstop, color=yellow)