Estratégia de negociação de rompimento de banda de Bollinger


Data de criação: 2023-09-12 16:23:12 última modificação: 2023-09-12 16:23:12
cópia: 0 Cliques: 815
1
focar em
1617
Seguidores

Esta estratégia é usada para negociar a partir de um cenário de ruptura de um canal de correlação. Esta estratégia é uma estratégia de ruptura de um canal de correlação que visa capturar a oportunidade de negociação de uma tendência de ruptura de um canal de correlação.

Princípios da estratégia:

  1. Calculando o canal da faixa de Brin, a linha central é a média móvel simples de n dias, e a linha superior e inferior são várias vezes a diferença padrão acima e abaixo da linha central.

  2. Quando o preço de cima para baixo quebra o downtrend, uma entrada de posição curta deve ser feita. Quando o preço de baixo para cima quebra o uptrend, uma entrada de posição múltipla deve ser feita.

  3. A linha de stop loss deve ser colocada fora da linha de trajectória, em sentido oposto, para o controle de risco.

  4. Ajustar a largura de banda do canal de acordo com a retirada máxima e otimizar os parâmetros.

  5. A partir de agora, os investidores poderão usar o filtro de volume para evitar falsas rupturas.

Os benefícios da estratégia:

  1. A ruptura de um canal pode ser um bom indicador de uma mudança de tendência.

  2. A otimização dos parâmetros da faixa de Bryn é simples, prática e difícil de otimizar.

  3. A combinação do volume de transações pode filtrar as brechas falsas e melhorar a qualidade.

Os riscos desta estratégia:

  1. O problema de atraso de Brin é mais notável e pode ter perdido o melhor ponto de entrada.

  2. A reversão é mais provável após a ruptura e deve ser feita com uma parada razoável.

  3. A busca por transações de baixa frequência pode perder oportunidades de otimização.

Em suma, a estratégia de negociar através de julgar a situação de ruptura da faixa de Brin, é uma estratégia de ruptura de canal típico. As regras simples do Relative são favoráveis à otimização de parâmetros, mas o atraso e a configuração de stop loss ainda precisam ser alertas para obter um lucro estável a longo prazo.

Código-fonte da estratégia
/*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)