적응형 볼린저 밴드 추세 추종 전략


생성 날짜: 2023-11-16 16:35:01 마지막으로 수정됨: 2023-11-16 16:35:01
복사: 1 클릭수: 605
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

적응형 볼린저 밴드 추세 추종 전략

개요

이 전략은 브린 통로 지표에 기반을 두고 있으며, 자조적 이동 평균선과 결합하여 트렌드에 대한 정확한 판단과 추적을 가능하게 한다. 동적으로 매개 변수를 조정함으로써 전략이 다른 품종과 시장 환경에 적응할 수 있게 하여, 강한 안정성과 적응력을 갖는다.

전략 원칙

이 전략은 다음과 같은 부분들로 구성됩니다.

  1. 자기 적응 이동 평균을 계산한다. 여기선 선형 회귀 지수를 사용하여 일정 주기 내의 선형 회귀 곡선을 이동 평균으로 계산한다.

  2. 부린 통로의 오르락 내리락을 계산한다. 여기서는 ATR 지표에 적응한 통로 대역을 사용하여, 사용자 지정된 파라미터 ratio2와 결합하여 부린 통로의 오르락 내리락을 계산한다.

  3. 구매/판매 시점을 판단한다. 부린 채널 상하를 돌파했는지에 따라 트렌드 방향을 판단하고 구매/판매 시점을 판단한다. 가격이 아래에서 위로 하하를 돌파할 때 구매 신호로 간주한다. 가격이 위에서 아래로 하하를 돌파할 때 판매 신호로 간주한다.

  4. 스톱로스를 설정한다. 고정 점수 스톱로스를 사용하여 리스크를 제어하고, 고정 점수 후에 스톱로스를 추적하는 방법을 사용하여 스톱을 설정하고, 이익을 보장하면서 동향을 극대화한다.

  5. 리테스트 기간과 함께 리테스트 시작 및 종료 시간을 설정하여 전략을 테스트 최적화합니다.

전략적 이점

  1. 적응형 파라미터 설계. 부린 통로의 통로 대역과 이동 평균선은 모두 적응형 방식으로 계산되어 전략이 시장의 변화에 적응할 수 있도록 한다.

  2. 돌파 판단이 명확하다. 트렌드 전환점을 판단하기 위해 부린 통로의 오르락 내리락 돌파를 사용하며, 바이오시그널은 비교적 명확하다.

  3. 스톱로스 설정이 합리적입니다. 고정 스톱로스 컨트롤 위험을 적용하고, 스톱로스 방법을 추적하여 트렌드 수익을 극대화합니다.

  4. 재검토 검증 유효성. 재검토 시간을 설정하여 전략을 검증하고, 역사적인 상황에서도 효과가 있는지 확인한다.

  5. 이해하기 쉬운 구현. 이 전략의 아이디어는 명확하고 이해하기 쉽고, 코드는 비교적 간결하고, 이해하기 쉽고, 실내에서 동작하기 쉽다.

전략적 위험

  1. 부린 통로는 파라미터 최적화가 필요합니다. 부린 통로의 통로 대역 및 회귀 사이클은 다른 품종과 시장 환경에 따라 최적화되어야 합니다. 최적화가 잘못되면 여러 번의 잘못된 신호 또는 빈번한 False Triggers가 발생합니다.

  2. 회귀 시간은 충분하지 않을 수 있다. 이 회귀는 단지 최근의 회귀 범위를 설정하고, 전략의 안정성을 완전히 검증하기 위해 더 긴 역사 상황을 커버 할 수 없다.

  3. 과도한 적합성의 위험이 존재할 수 있다. 현재 재검토 매개 변수는 최근 특정 상황에 대해서만 최적화되어 있어 역사적인 과도한 적합성의 위험이 있다.

  4. 스톱포인트 수는 평가해야 한다. 현재 스톱포인트 수는 작아 너무 민감하여 작은 충격으로 스톱포인트 손실이 발생할 수 있다. 적절한 스톱포인트 수는 평가해야 한다.

  5. 양적 검증 지표의 부족. 현재는 그래픽 돌파구로 거래 신호를 판단하고, 신호의 유효성을 검증하는 양적 지표가 도입되지 않았습니다.

전략 최적화 방향

  1. 더 많은 적응 지표들을 도입한다. 다양한 적응 평균선, 적응 통로 지표들의 조합을 테스트할 수 있고, 더 강력한 트렌드 추적 전략을 구축한다.

  2. 최적화 파라미터 설정. 부린 통로와 평행선 파라미터의 최적의 조합을 유전 알고리즘과 같은 보다 체계적인 방법으로 찾을 수 있다.

  3. 재검토 시간 범위를 확장한다. 재검토 시간 범위를 확장하고, 테스트 파라미터를 최적화한 안정성을 갖는다. 슬라이 포인트, 수수료 등 거래 비용을 더 현실적으로 재검토한다.

  4. 양적 필터링 규칙을 도입한다. 거래량 돌파, MACD 기둥 격차 등의 양적 지표 규칙을 설정하여 잘못된 부린 통로 돌파 신호가 발생하지 않도록 한다.

  5. 최적화된 스톱 메커니즘. 다양한 고정 스톱 포인트 설정과 다양한 스톱 추적 방법을 평가하여 최적의 스톱 모드를 찾습니다.

  6. 실체 검증. 실체에서 최적화 된 전략을 실행하고, 수익 회수 상황을 기록하고, 전략의 안정적 신뢰성을 더욱 개선한다.

요약하다

이 전략은 전체적인 아이디어가 명확하며, 부린 통로를 사용하여 트렌드 방향을 결정하고 브레이크 신호를 포착하고, 이동 평행선을 보조하여 전체적인 트렌드 방향을 결정한다. 약간의 최적화를 통해, 더 안정적이고 신뢰할 수 있는 트렌드 추적 전략이 될 수 있다. 그러나 여전히 시간 범위의 대표성에 주의를 기울여야 하며, 정량화 필터링 규칙을 도입하고, 손해의 수준을 파악해야 한다. 이러한 문제를 잘 처리할 수 있다면, 이 전략은 실전에서 안정적이고 눈에 띄는 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-09 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Linear Regression (Backtest / Trailing Stop)",overlay=true)
close_price = close[0]

len = input(40)
linear_reg = linreg(close_price, len, 0)

calculationToPlotAverageMeanLine=linear_reg
useUpperDeviation = input(true, "Upper Deviation", bool)
useLowerDeviation = input(true, "Lower Deviation", bool)
ratio2=input(defval=2,title=" Ratio 2")
avg=atr(len)
r2=avg*ratio2
top=linear_reg+r2
bott=linear_reg-r2

calculationToPlotUpperLine=top
calculationToPlotLowerLine=bott

plotUpperDeviationLine = plot(not useUpperDeviation ? na : calculationToPlotUpperLine, color=color(blue,0))
plotAverageMeanLine = plot(calculationToPlotAverageMeanLine, color=color(olive,0))
plotLowererDeviationLine = plot(not useLowerDeviation ? na : calculationToPlotLowerLine, color=color(red,0))
fill(plotUpperDeviationLine, plotAverageMeanLine, color=color(blue,85))
fill(plotLowererDeviationLine, plotAverageMeanLine, color=color(red,85))


//
length = input(title="linear Length",  defval=40, minval=1)
multiplier = input(title="linear Deviation", type=float, defval=2, minval=1)
overbought = input(title="Overbought",  defval=1, minval=1)
oversold = input(title="Oversold",  defval=0, minval=1)
custom_timeframe = input(title="Use another Timeframe?", type=bool, defval=false)
highTimeFrame = input(title="Select The Timeframe",  defval="60")
res1 = custom_timeframe ? highTimeFrame : timeframe.period

fixedSL = input(title="SL Activation", defval=70)
trailSL = input(title="SL Trigger", defval=10)
fixedTP = input(title="TP Activation", defval=50)
trailTP = input(title="TP Trigger", defval=10)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2015)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2015)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

smabasis = linreg(close_price, length, 0)
stdev = stdev(close, length)
cierre = request.security(syminfo.tickerid, res1, close, false)
alta = request.security(syminfo.tickerid, res1, high, false)
baja = request.security(syminfo.tickerid, res1, low, false)
basis1 = request.security(syminfo.tickerid, res1, smabasis, false)
stdevb = request.security(syminfo.tickerid, res1, stdev, false)
dev = multiplier * stdevb // stdev(cierre, length)
upper = basis1 + dev
lower = basis1 - dev

bbr = (cierre - lower)/(upper - lower)

// plot(bbr)

// // MARCA LAS RESISTENCIAS
pintarojo = 0.0
pintarojo := nz(pintarojo[1])
pintarojo := bbr[1] > overbought and bbr < overbought ? alta[1] :  nz(pintarojo[1])
p = plot(pintarojo, color = red, style=circles, linewidth=2)

// // MARCA LOS SOPORTES
pintaverde = 0.0
pintaverde := nz(pintaverde[1])
pintaverde := bbr[1] < oversold and bbr > oversold ? baja[1] :  nz(pintaverde[1])
g = plot(pintaverde, color = black, style=circles, linewidth=2)
zz= crossover(pintaverde,pintaverde[1]) or crossunder(pintaverde,pintaverde[1])
kp= crossover(pintarojo,pintarojo[1]) or crossunder(pintarojo,pintarojo[1]) 
plotshape(zz,  title="buy", style=shape.triangleup,location=location.belowbar, color=green, transp=0, size=size.small)
plotshape(kp, title="sell", style=shape.triangledown,location=location.abovebar, color=red, transp=0, size=size.small)


strategy.entry("BUY", strategy.long, qty=10, oca_name="BUY",  when=zz and window())
strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP)

strategy.entry("SELL", strategy.short, qty=10, oca_name="SELL",  when=kp and window())
strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=trailSL, trail_points=fixedTP)