이것은 볼링거 밴드 채널을 기반으로하는 역주도 트렌드 전략입니다. 트렌드를 결정하기 위해 볼링거 밴드 상부 및 하부 채널을 사용하여 가격이 채널 경계에 접근 할 때 역전 기회를 찾습니다.
이 전략은 볼링거 밴드를 주요 기술 지표로 사용합니다. 볼링거 밴드는 n 기간 이동 평균과 상위/하위 밴드 오차로 구성됩니다. 상위 밴드 = n 기간 MA + m * n 기간 표준 오차, 하위 밴드 = n 기간 MA - m * n 기간 표준 오차. n와 m는 매개 변수입니다.
가격이 상단으로 접근하면 상승 추세를 나타낼 수 있지만 정점에 역전화 될 수 있습니다. 가격이 하단으로 접근하면 하단 추세를 나타낼 수 있지만 바닥에서 역전화 될 수 있습니다. 볼링거 밴드의 효과적인 브레이크는 잠재적인 역전을 나타낼 수 있습니다.
구체적인 거래 규칙은 다음과 같습니다.
상단역을 닫으면 길게, 하단역을 닫으면 짧게
n 기간 이동 평균을 이윤 취득 및 스톱 로스 신호로 사용하십시오. MA 이하의 폐쇄 파업이있을 때 긴 문을 닫고 MA 이상의 폐쇄 파업이있을 때 짧은 문을 닫습니다.
매 거래에 일정한 양을 사용하세요.
고정 분수 포지션 크기를 사용하십시오. 고정 수익 비율을 충족 할 때 고정 금액으로 포지션 크기를 증가시키고 손실이 발생할 때 크기를 감소하십시오.
이 전략의 장점:
볼링거 밴드 채널을 사용하여 트렌드 방향과 거래 반전을 결정하면 대부분의 윙사 (whipsaws) 를 피하고 승률을 향상시킵니다.
이동 평균은 신뢰성 있는 수익/손실 중지 신호입니다. 대부분의 수익을 차단합니다.
일정한 양은 간단하고 쉽게 구현할 수 있으며 복잡한 계산이 필요하지 않습니다.
고정 분수 위치 사이징은 수익을 확대하고 위치 조정으로 위험을 제어합니다.
이 전략의 위험은:
볼링거 밴드는 잘못된 신호를 생성하여 트렌드 상대로 거래하는 손실을 유발할 수 있습니다.
이동평균이 뒤떨어지면 수익이 충분하지 않을 수 있습니다.
일정한 양은 시장 조건에 적응할 수 없습니다.
고정 분수 방법의 공격적인 위치 크기 조정으로 손실이 증가할 수 있습니다.
솔루션: 신호의 정확성을 향상시키기 위해 볼링거 밴드 매개 변수를 최적화하십시오. 트렌드를 결정하기 위해 다른 지표를 추가하십시오. 고정량 크기를 줄이십시오. 분량 위치 사이징 방법에서 위치 사이징 조정 비율을 낮추십시오.
이 전략은 다음과 같은 측면에서 개선될 수 있습니다.
정확도를 높이기 위해 n와 m와 같은 볼링거 밴드 매개 변수를 최적화합니다.
MACD, KD 같은 다른 지표를 추가하여 잘못된 신호를 피합니다.
시장 조건에 따라 고정량을 동적 위치로 변경합니다.
지점 크기의 조정 비율이 낮아지고 지점 크기의 조정 비율이 부드러운 자산 곡선입니다.
스톱 로스 전략도 추가합니다. 스톱 로스 이동, 브레이크 로스 중단 등. 위험을 통제하기 위해서죠.
최적의 매개 변수 조합을 찾기 위한 매개 변수 최적화
요약하자면, 이것은 전형적인 볼링거 밴드 반전 전략이다. 볼링거 밴드에 의해 반전 지점을 식별하고, 이동 평균에 의해 이익 취득 / 중지 손실을 설정하고, 고정량 및 분자 위치 사이징에 의해 위험을 제어합니다. 반전 전략으로, 이론적으로 전통적인 볼링거 밴드 전략과 비교하여 몇 가지 윙사이를 피하고 수익성을 향상시킵니다. 그러나 볼링거 밴드의 결함, 이동 평균은 강력한 실용적 응용을 위해 추가 최적화와 위험 관리가 필요합니다.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m 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/ // © gsanson66 //This strategy uses the well-known Bollinger Bands Indicator //@version=5 strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18) //----------------------------------------FUNCTIONS---------------------------------------// //@function Displays text passed to `txt` when called. debugLabel(txt, color) => label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small) //@function which looks if the close date of the current bar falls inside the date range inBacktestPeriod(start, end) => (time >= start) and (time <= end) //---------------------------------------USER INPUTS--------------------------------------// //Technical parameters bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters") mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters") smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters") //Money Management fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management") increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management") //Backtesting period startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period") endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period") //----------------------------------VARIABLES INITIALISATION-----------------------------// strategy.initial_capital = 50000 //Exit SMA smaExit = ta.sma(close, smaLength) //BB Calculation basis = ta.sma(close, bbLength) dev = mult * ta.stdev(close, bbLength) upperBB = basis + dev lowerBB = basis - dev //Money management equity = strategy.equity - strategy.openprofit var float capital_ref = strategy.initial_capital var float cashOrder = strategy.initial_capital * 0.95 //Backtesting period bool inRange = na //------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------// //Checking if the date belong to the range inRange := true //Checking performances of the strategy if equity > capital_ref + fixedRatio spread = (equity - capital_ref)/fixedRatio nb_level = int(spread) increasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder + increasingOrder capital_ref := capital_ref + nb_level*fixedRatio if equity < capital_ref - fixedRatio spread = (capital_ref - equity)/fixedRatio nb_level = int(spread) decreasingOrder = nb_level * increasingOrderAmount cashOrder := cashOrder - decreasingOrder capital_ref := capital_ref - nb_level*fixedRatio //Checking if we close all trades in case where we exit the backtesting period if strategy.position_size!=0 and not inRange strategy.close_all() debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116)) //-----------------------------------EXIT SIGNAL------------------------------// if strategy.position_size > 0 and close < smaExit strategy.close("Long") if strategy.position_size < 0 and close > smaExit strategy.close("Short") //----------------------------------LONG/SHORT CONDITION---------------------------// //Long Condition if close > upperBB and inRange qty = cashOrder/close strategy.entry("Long", strategy.long, qty) //Short Condition if close < lowerBB and inRange qty = cashOrder/close strategy.entry("Short", strategy.short, qty) //---------------------------------PLOTTING ELEMENT----------------------------------// plot(smaExit, color=color.orange) upperBBPlot = plot(upperBB, color=color.blue) lowerBBPlot = plot(lowerBB, color=color.blue) fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))