적응적인 볼링거 트렌드 추적 전략

저자:차오장, 날짜: 2023-11-16 16:35:01
태그:

img

전반적인 설명

이 전략은 볼링거 밴드 지표와 적응형 이동 평균을 결합하여 동적 매개 변수를 조정함으로써 강력한 안정성과 적응력을 갖춘 다양한 제품 및 시장 환경에 적응할 수 있습니다.

전략 논리

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

  1. 적응 이동 평균을 계산합니다. 이동 평균으로 특정 기간 동안 선형 회귀 곡선을 계산하기 위해 선형 회귀 지표를 사용하십시오.

  2. 볼링거 밴드를 계산합니다. 사용자 지정 ratio2 매개 변수와 결합한 적응 ATR 지표를 사용하여 상위 및 하위 밴드를 계산합니다.

  3. 진입 및 출구를 결정합니다. 볼링거 밴드를 통해 가격의 돌파를 기반으로 트렌드 방향과 진입 / 출구를 판단합니다. 상부 밴드 신호를 파는 것은 진입을 판매하고 하부 밴드 신호를 파는 것은 구매 진입입니다.

  4. 스톱 로스를 설정하고 이윤을 취하십시오. 위험을 제어하기 위해 고정 포인트 스톱 로스를 사용하고 트렌드 이윤을 극대화하기 위해 수익을 추적하십시오.

  5. 전략 최적화와 검증을 위해 백테스팅 시간 창과 결합합니다.

장점

  1. 적응 가능한 매개 변수. 적응 가능한 이동 평균 및 대역 디자인은 시장 변화에 적응합니다.

  2. 명백한 파업 신호, 볼링거 밴드 파업은 명확한 트렌드 반전 신호를 제공합니다.

  3. 합리적인 스톱 설정. 고정 스톱 손실은 위험을 통제하고 후속 스톱 이익은 트렌드 수익을 극대화하는 것을 목표로합니다.

  4. 백테스팅으로 검증됩니다. 백테스팅 창은 전략의 효과를 확인합니다.

  5. 이해하기 쉽고 구현하기 쉽습니다. 논리는 명확하고 코드는 이해하기 쉽도록 간결합니다.

위험성

  1. 볼링거 대역은 매개 변수 조정이 필요합니다. 대역 너비와 기간은 다른 제품에 최적화가 필요할 수 있습니다. 부적절한 매개 변수는 신호가 누락되거나 잘못된 트리거로 이어집니다.

  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)


더 많은