이 전략은 볼링거 밴드 지표에 기반합니다. 가격이 하위 밴드 이상으로 넘어갈 때 길게 이동하고 가격이 상위 밴드에 닿을 때 포지션을 닫습니다. 이 전략은 볼링거 밴드의 격리 원리를 사용하여 낮은 가격 구매와 높은 판매를위한 비정상적인 가격 브레이크를 추적합니다.
중위 계단 SMA를 최근 종료 가격의 단순한 이동 평균으로 계산합니다.
값 변동 범위를 반영하기 위해 표준편차 StdDev를 계산합니다.
상단역을 얻기 위해 상단역 SMA에 표준편차의 상단편차를 더합니다.
중간 대역 SMA에서 표준편차의 하위 오프셋을 빼면 하위 대역이 나오죠.
닫기 가격이 하단역을 넘어서면 하단역으로 이동합니다.
가격이 상단역에 닿을 때 포지션을 닫습니다. 왜냐하면 가격이 비정상적이라고 생각되기 때문입니다.
이 전략의 가장 큰 장점은 비정상적인 시장 변동을 효과적으로 추적하고 트렌드를 포착하기 위해 볼링거 밴드의 통계적 특성을 활용하는 것입니다. 일반 이동 평균 전략에 비해 볼링거 밴드 전략은 더 많은 장점을 가지고 있습니다.
볼링거 밴드 상부와 하부 밴드는 자동으로 시장 변동에 적응할 수 있습니다.
침입 시그널은 더 신뢰할 수 있습니다.
이윤을 취하기 위해 의미로 전환하는 것이 합리적입니다.
다양한 시장에 적응할 수 있는 거대한 매개 변수 조정 공간
중장기 동향을 파악할 수 있고 단기에도 사용할 수 있습니다.
이 전략의 잠재적 위험은 주로 다음과 같습니다.
범위에 묶인 시장에서 볼링거 밴드의 나쁜 성과, 잘못된 항목을 피하십시오.
파업 신호는 거짓 파업일 수 있어 신중한 판단이 필요합니다.
이윤 취득 지위는 너무 이상화되어 실제 가격 행동으로 최적화 될 수 있습니다.
부적절한 매개 변수 설정은 과도한 거래 또는 과도한 보수주의로 이어질 수 있습니다.
백테스트 기간은 곡선 부착을 피하기 위해 충분히 길어야 합니다.
대응한 위험 관리 조치:
신호 필터에 거래량 지표를 추가합니다.
다양한 시장에서 온 매개 변수와 테스트 데이터를 최적화합니다.
마감 손실을 추가하고, 수익을 취합니다.
신호의 차이점을 평가하고, 높은 점과 낮은 점의 추종을 피하세요.
이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.
볼링거 밴드 매개 변수들의 다양한 조합을 시도해서 최적을 찾습니다.
파업 신호를 필터하기 위해 MA, MACD 등을 추가합니다.
기계 학습 알고리즘을 적용하여 볼링거 매개 변수를 최적화합니다.
파업의 강도를 평가하고 위치 크기를 조정합니다.
안정성을 테스트하기 위해 더 긴 기간을 테스트합니다.
리스크를 통제하기 위해 스톱 로스 메커니즘을 추가합니다.
요약하자면 볼링거 밴드 전략은 전반적으로 신뢰할 수 있는 트렌드 다음 전략입니다. 그것은 비정상적인 가격 변동을 효과적으로 포착 할 수 있습니다. 그러나 우리는 또한 실제 가격에서 그 편차를 주목하고 매개 변수를 지속적으로 최적화해야합니다. 라이브 거래에 사용되는 경우, 엄격한 리스크 관리는 거래 당 손실을 제어하는 데 필수적입니다.
/*backtest start: 2023-09-11 00:00:00 end: 2023-09-12 04:00:00 period: 10m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="BB training No Repainting (OTS Mode)", overlay=true) // Strategy Rules: // 1. Enter trade when price crosses above the lower band // 2. Exit trade when price touches the upper band // // Chart Properties testStartYear = input(2010, "Backtest Start Year") testStartMonth = input(01, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and time >= testPeriodStart and time <= testPeriodStop ? #6c6f6c : na bgcolor(testPeriodBackgroundColor, transp=97) // User provided values smaLength = input(title="SMA Length", type=input.integer, defval=20) // Middle band period length (moving average) stdLength = input(title="StdDev Length", type=input.integer, defval=20) // Range to apply bands to ubOffset = input(title="Upper Band Offset", type=input.float, defval=2.0, step=0.5) // Number of standard deviations above MA lbOffset = input(title="Lower Band Offset", type=input.float, defval=2.0, step=0.5) // Number of standard deviation below MA testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false smaValue = sma(close, smaLength) // Middle band stdDev = stdev(close, stdLength) upperBand = smaValue + stdDev * ubOffset // Top band lowerBand = smaValue - stdDev * lbOffset // Bottom band // Plot bands to chart plot(series=smaValue, title="SMA", color=color.green) plot(series=upperBand, title="UB", color=color.blue, linewidth=2) plot(series=lowerBand, title="LB", color=color.blue, linewidth=2) longCondition = (crossover(close, lowerBand)) closeLongCondition = (close >= upperBand) if (longCondition and testPeriod()) strategy.entry(id="CALL", long=true) strategy.close(id="CALL", when=closeLongCondition)