이것은 볼링거 밴드 지표에 기반한 트렌드 다음 전략이다. 트렌드 방향을 결정하고 대응하는 포지션을 여는 볼링거 밴드 상부 및 하부 밴드의 브레이크오웃을 사용합니다. 가격이 다시 떨어지기 시작하면 포지션을 종료하고 수익을 창출하기 위해 동적 간격과 함께 트레일링 스톱 로스를 사용합니다.
이 전략은 경향 방향을 결정하기 위해 볼링거 밴드를 사용합니다. 볼링거 밴드는 상위와 하위 밴드를 형성하기 위해 가격의 표준 편차를 계산하여 구성됩니다. 가격이 상위 밴드를 넘으면 상승 추세 시작을 나타냅니다. 가격이 하위 밴드를 넘으면 하락 추세 시작을 나타냅니다.
구체적인 거래 논리는 다음과 같습니다.
볼링거 밴드의 중간, 상위 및 하위 밴드를 계산합니다.
가격이 상위 범위를 넘어가면 롱, 하위 범위를 넘어가면 쇼트
트레일링 스톱 로스를 사용하여 위험을 통제하고 가격이 다시 떨어지기 시작하면 출입하십시오.
가격이 다시 범위를 돌파할 때 다시 트렌드에 들어갈 수 있습니다.
경향을 결정하기 위해 볼링거 밴드를 사용하여 동적인 트레일링 스톱 로스로 결합하면 위험을 효과적으로 제어 할 수 있습니다.
이 전략의 장점은 다음과 같습니다.
볼링거 밴드를 사용하여 트렌드를 결정합니다. 간단하고 효과적입니다.
브레이크오웃 엔트리와 동적 트레일링 스톱 로스의 조합은 트렌드 포착과 리스크 통제를 균형 잡습니다.
깨끗하고 간결한 코드 구조, 이해하기 쉽고 수정하기 쉽습니다.
몇 개의 매개 변수, 최적화하기 쉽습니다.
다양한 제품에 적용 가능하고 유연합니다.
좋은 백테스트 결과, 큰 수익 잠재력.
주요 위험은 다음과 같습니다.
볼링거 밴드는 통계에만 의존하고 곡선 적응의 위험도 있습니다.
범위 확장과 실제 추세를 구별하기 어렵기 때문에 잘못된 판단이 발생할 수 있습니다.
스톱 손실 포인트는 너무 단단해서 정상적인 오스실레이션으로 멈출 위험이 있습니다.
거래비용은 고려하지 않습니다.
제한된 백테스트 기간, 과도한 장착 위험.
해결책은 다음과 같습니다.
매개 변수를 최적화하거나 신호 검증을 위한 다른 지표를 추가합니다.
진동과 채널의 식별을 개선합니다.
동적으로 ATR 등을 기반으로 스톱 손실을 조정합니다.
수수료를 더하고, 미끄러진 비용.
백테스트 기간을 확장하고, 다중 시장 검증
전략은 다음과 같이 최적화 될 수 있습니다.
다른 지표의 조합 효과를 테스트합니다.
트렌드 오스실레이션의 식별을 개선합니다.
동적 매개 변수 최적화를 위한 기계 학습을 도입합니다.
백테스트 결과를 바탕으로 스톱 로스 전략을 최적화합니다.
거래 비용을 평가하고 추가합니다.
최적의 설정을 위한 파라미터 공간 최적화
자금 관리와 위치 리스크를 통제하는 것
이 전략은 볼링거 밴드 (Bollinger Bands) 로 트렌드 방향을 결정하고 트레일링 스톱 로스로 위험을 제어합니다. 전체적인 논리는 간단하고 명확합니다. 좋은 트렌드 포착 능력을 가지고 있지만 더 많은 기술적 인 지표, 최적화 매개 변수, 비용을 추가하는 등이 더 강력하게 만들기 위해 개선 될 수 있습니다. 전반적으로이 전략은 간단하고 실용적인 볼링거 밴드 (Bollinger Bands) 기반 트렌드 다음 접근 방식을 제공합니다.
/*backtest start: 2022-09-15 00:00:00 end: 2023-09-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Bollinger Band Breakout", shorttitle = "BB Strategy",initial_capital=1000, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_type = strategy.commission.percent, commission_value = 0.3, max_bars_back = 1000, overlay=true) // Inputs // sma = input(20, minval=1) mult = input(1.2, minval=0.001, maxval=50) src = input(close) // alert msg // message_long_entry = input("long entry") message_short_entry = input("short entry") // Calculations // basis = sma(close, sma) dev = mult * stdev(close, sma) upper = basis + dev lower = basis - dev // Backtest // fromyear = input(2019, defval = 2019, minval = 1900, maxval = 2100, title = "From Year") toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year") frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month") tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month") fromday = input(1, defval = 01, minval = 01, maxval = 31, title = "From day") today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day") leverage = input(1, "Leverage") term = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)) // PLOT // plot(basis, color = color.gray, linewidth = 2) lu = plot(upper, color = color.green, linewidth = 2) ll = plot(lower, color = color.red, linewidth = 2) fill(lu, ll, color = color.gray) // Signals // long = crossover(close, upper) short = crossunder(close, lower) // Strategy entry // strategy.initial_capital = 50000 if (long and term) strategy.entry("long", strategy.long, qty=strategy.initial_capital/close*leverage, when = long and barstate.isconfirmed, alert_message = message_long_entry) if (short and term) strategy.entry("short", strategy.short, qty=strategy.initial_capital/close*leverage, when = short and barstate.isconfirmed, alert_message = message_short_entry) // strategy exit // strategy.exit("long tsl", "long", loss = close*0.075 / syminfo.mintick, trail_points = close*0.05 / syminfo.mintick, trail_offset = close*0.005 / syminfo.mintick) strategy.exit("short tsl", "short", loss = close*0.075 / syminfo.mintick, trail_points = close*0.05 / syminfo.mintick, trail_offset = close*0.005 / syminfo.mintick)