볼린저 밴드 백분율 거래 전략


생성 날짜: 2023-12-11 11:14:53 마지막으로 수정됨: 2023-12-11 11:14:53
복사: 0 클릭수: 750
avatar of ChaoZhang ChaoZhang
1
집중하다
1621
수행원

볼린저 밴드 백분율 거래 전략

개요

이 전략은 부린띠 지표에 기반하여 이동 평균과 ATR 기술 지표와 결합하여 짧은 주기의 돌파구 시스템을 구현한다. 이 전략은 부린띠 통로 내의 가격의 상대적인 위치 비율을 계산하여 가격의 과매매 과매매 상황을 판단하고, 새로운 고저점 돌파구와 결합하여 거래 신호를 생성한다.

전략 원칙

  1. 부린 벨트 통로와 가격의 통로 내의 상대적인 위치 비율을 계산한다.
  2. 오픈 가격, 클로징 가격, 최고 가격, 최저 가격에 대해 각각 이동 평균을 계산합니다.
  3. ATR 지표를 계산하고 ATR과 함께 스톱 라인을 설정합니다.
  4. 가격이 새로운 최고점이나 새로운 최저점 근처에 있는지 판단하는 방법
  5. 연간 최고 최저 가격과 연간 최저 최저 가격의 합계로
  6. 브린 대역의 비율 변화와 새로운 고기, 새로운 낮은 판단을 통해 거래 신호를 보내는지

이 전략은 부린带通道을 사용하여 시장의 변동률을 판단하고, 부린带通道의 폭은 표준 차기로 결정한다. 가격은 부린带에서 하향 경로를 돌파할 때 구매점으로, 가격은 부린带에서 상향 경로를 돌파할 때 판매점으로 한다. 이동 평균은 부린带의 변동성을 평평하게 하고, 가짜 돌파를 줄인다. ATR 지표는 이동 스톱라인과 결합되어, 고정된 스톱 손실의 폭이다.

전략적 이점

  1. 엄격한 브린 벨트 통로 침입 판단은 가짜 신호를 줄일 수 있다.
  2. 이동 평균은 가격을 평평하게 하고, 실제 추세를 파악합니다.
  3. ATR 지표의 동적 추적 중단으로 단편 손실을 제한할 수 있다
  4. 새로운 최고, 새로운 최저, 그리고 연간 최고, 최저를 판단하여 신호를 더 신뢰하게 만듭니다.
  5. 다양한 기술 지표가 효과적으로 결합되어 전략의 효율성을 높여줍니다.

전략적 위험과 해결 방법

  1. 부린 벨트 통로 매개 변수가 잘못 설정되면 너무 많은 가짜 돌파구가 발생할 수 있으며, 최적의 효과를 얻기 위해 다양한 매개 변수 조합을 테스트해야합니다.
  2. 종전 가격 기준으로 ATR의 설정된 스톱 손실 범위를 초과하는 회수가 발생할 수 있으며, 더 큰 파장을 사용하는 최저 최저 가격 계산의 비율을 고려할 수 있습니다.
  3. 엄격한 브린 필터링은 더 긴 선의 트렌드 기회를 놓칠 수 있습니다. 필터링 조건과 지분 기간을 적절히 완화하십시오.
  4. ATR 지표는 큰 가격 변동을 추적하는 데 느려서 실제 파도와 같은 더 높은 빈도의 변동률 지표가 고려되어야합니다.
  5. 새로운 고기, 새로운 낮은 돌파는 단기 잡음으로 방해받을 수 있으며, 통계적 유의성과 트렌드 지속성을 평가해야 합니다.

전략 최적화 방향

  1. 다양한 변수 조합을 테스트하여 최적의 브린 밴드 변수와 이동 평균 길이를 결정합니다.
  2. 모델 조합을 사용하여 서로 다른 브린 밴드 파라미터 또는 이동 평균 판단 신호를 결합
  3. 다른 기간과 다른 품종의 매개 변수 적응성을 테스트하여 체력을 향상시킵니다.
  4. 더 큰 수준의 조건 판단과 결합하여, 일선 수준의 브린 밴드 신호 또는 계절적 요소
  5. 트렌드 포토샵 기회를 평가하여 전략의 범위와 수익을 확대합니다.

요약하다

이 전략은 브린 띠 비율, 이동 평균, ATR 지표, 새 고, 새 낮은, 연간 높은 낮은 등 여러 가지 기술 도구를 통합하여 짧은 기간에 비교적 엄격하고 효율적인 돌파구 거래 전략을 구축합니다. 그것의 눈에 띄는 장점은 잡음을 줄이고 진정한 트렌드 신호를 식별하기 위해 다양한 도구를 사용하는 것입니다. 물론 전략은 특정 매개 변수를 설정하는 어려움과 엄격한 조건 하에서 기회를 놓칠 가능성이 있습니다.

전략 소스 코드
/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © HeWhoMustNotBeNamed

//@version=4
strategy("Bollinger %B Candles Strategy", overlay=false, initial_capital = 1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

BBLength = input(100, minval=1, step=1)
StdDev = 10
useMovingAverage = input(true)
MAType = input(title="Moving Average Type", defval="rma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
lookbackPeriod = input(22, minval=10, step=10)
colorByPreviousClose = input(true)

AtrMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
AtrLength = input(10)
AtrMult = input(4)
wicks = input(false)

considerYearlyHighLow = input(false)
considerNewLongTermHighLows = input(false)
shortHighLowPeriod = 100
longHighLowPeriod = 200
tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])

backtestYears = input(10, minval=1, step=1)


//////////////////////////////////// Calculate new high low condition //////////////////////////////////////////////////
f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)=>
    newHigh = highest(shortHighLowPeriod) == highest(longHighLowPeriod) or not considerNewLongTermHighLows
    newLow = lowest(shortHighLowPeriod) == lowest(longHighLowPeriod) or not considerNewLongTermHighLows
    [newHigh,newLow]

//////////////////////////////////// Calculate Yearly High Low //////////////////////////////////////////////////
f_getYearlyHighLowCondition(considerYearlyHighLow)=>
    yhigh = security(syminfo.tickerid, '12M', high[1]) 
    ylow = security(syminfo.tickerid, '12M', low[1]) 
    yhighlast = yhigh[365]
    ylowlast = ylow[365]
    yhighllast = yhigh[2 * 365]
    ylowllast = ylow[2 * 365]
    
    yearlyTrendUp = na(yhigh)? true : na(yhighlast)? close > yhigh : na(yhighllast)? close > max(yhigh,yhighlast) : close > max(yhigh, min(yhighlast, yhighllast))
    yearlyHighCondition = (  (na(yhigh) or na(yhighlast) ? true : (yhigh > yhighlast) ) and ( na(yhigh) or na(yhighllast) ? true : (yhigh > yhighllast))) or yearlyTrendUp or not considerYearlyHighLow
    yearlyTrendDown = na(ylow)? true : na(ylowlast)? close < ylow : na(ylowllast)? close < min(ylow,ylowlast) : close < min(ylow, max(ylowlast, ylowllast))
    yearlyLowCondition = (  (na(ylow) or na(ylowlast) ? true : (ylow < ylowlast) ) and ( na(ylow) or na(ylowllast) ? true : (ylow < ylowllast))) or yearlyTrendDown or not considerYearlyHighLow
    
    label_x = time+(60*60*24*1000*1)
    [yearlyHighCondition,yearlyLowCondition]

f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

inDateRange = true
[yearlyHighCondition,yearlyLowCondition] = f_getYearlyHighLowCondition(considerYearlyHighLow)
[newHighS,newLowS] = f_calculateNewHighLows(shortHighLowPeriod, longHighLowPeriod, considerNewLongTermHighLows)
[middleclose, upperclose, lowerclose] = bb(close, BBLength, StdDev)
[middleopen, upperopen, loweropen] = bb(open, BBLength, StdDev)
[middlehigh, upperhigh, lowerhigh] = bb(high, BBLength, StdDev)
[middlelow, upperlow, lowerlow] = bb(low, BBLength, StdDev)

percentBClose = (close - lowerclose)*100/(upperclose-lowerclose)
percentBOpen = (open - loweropen)*100/(upperopen-loweropen)
percentBHigh = (high - lowerhigh)*100/(upperhigh-lowerhigh)
percentBLow = (low - lowerlow)*100/(upperlow-lowerlow)

percentBMAClose = f_getMovingAverage(percentBClose, MAType, lookbackPeriod)
percentBMAOpen = f_getMovingAverage(percentBOpen, MAType, lookbackPeriod)
percentBMAHigh = f_getMovingAverage(percentBHigh, MAType, lookbackPeriod)
percentBMALow = f_getMovingAverage(percentBLow, MAType, lookbackPeriod)

newOpen = useMovingAverage? percentBMAOpen : percentBOpen
newClose = useMovingAverage? percentBMAClose : percentBClose
newHigh = useMovingAverage? percentBMAHigh : percentBHigh
newLow = useMovingAverage? percentBMALow : percentBLow

truerange = max(newHigh, newClose[1]) - min(newLow, newClose[1])

averagetruerange = f_getMovingAverage(truerange, AtrMAType, AtrLength)
atr = averagetruerange * AtrMult

longStop = newClose - atr
longStopPrev = nz(longStop[1], longStop)
longStop := (wicks ? newLow[1] : newClose[1]) > longStopPrev ? max(longStop, longStopPrev) : longStop

shortStop = newClose + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := (wicks ? newHigh[1] : newClose[1]) < shortStopPrev ? min(shortStop, shortStopPrev) : shortStop

dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and (wicks ? newHigh : newClose) > shortStopPrev ? 1 : dir == 1 and (wicks ? newLow : newClose) < longStopPrev ? -1 : dir

trailingStop = dir == 1? longStop : shortStop

candleColor = colorByPreviousClose ?
                 (newClose[1] < newClose ? color.green : newClose[1] > newClose ? color.red : color.silver) : 
                 (newOpen < newClose ? color.green : newOpen > newClose ? color.red : color.silver)
plotcandle(newOpen, newHigh, newLow, newClose, title='PercentBCandle', color = candleColor, wickcolor=candleColor)
plot(trailingStop, title="TrailingStop", style=plot.style_linebr, linewidth=1, color= dir == 1 ? color.green : color.red)

buyCondition = dir==1 and yearlyHighCondition and newHighS
exitBuyCondition = dir == -1
sellCondition = dir == -1 and yearlyLowCondition and newLowS
exitSellCondition = dir == 1
strategy.risk.allow_entry_in(tradeDirection)

barcolor(buyCondition? color.lime : sellCondition ? color.orange : color.silver)
strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=exitBuyCondition)

strategy.entry("Sell", strategy.short, when=sellCondition and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=exitSellCondition)