리소스 로딩... 로딩...

볼링거 밴드 역전 오시슬레이션 트렌드 전략

저자:차오장, 날짜: 2023-10-31 14:30:45
태그:

img

전반적인 설명

이것은 볼링거 밴드 채널을 기반으로하는 역주도 트렌드 전략입니다. 트렌드를 결정하기 위해 볼링거 밴드 상부 및 하부 채널을 사용하여 가격이 채널 경계에 접근 할 때 역전 기회를 찾습니다.

전략 논리

이 전략은 볼링거 밴드를 주요 기술 지표로 사용합니다. 볼링거 밴드는 n 기간 이동 평균과 상위/하위 밴드 오차로 구성됩니다. 상위 밴드 = n 기간 MA + m * n 기간 표준 오차, 하위 밴드 = n 기간 MA - m * n 기간 표준 오차. n와 m는 매개 변수입니다.

가격이 상단으로 접근하면 상승 추세를 나타낼 수 있지만 정점에 역전화 될 수 있습니다. 가격이 하단으로 접근하면 하단 추세를 나타낼 수 있지만 바닥에서 역전화 될 수 있습니다. 볼링거 밴드의 효과적인 브레이크는 잠재적인 역전을 나타낼 수 있습니다.

구체적인 거래 규칙은 다음과 같습니다.

  1. 상단역을 닫으면 길게, 하단역을 닫으면 짧게

  2. n 기간 이동 평균을 이윤 취득 및 스톱 로스 신호로 사용하십시오. MA 이하의 폐쇄 파업이있을 때 긴 문을 닫고 MA 이상의 폐쇄 파업이있을 때 짧은 문을 닫습니다.

  3. 매 거래에 일정한 양을 사용하세요.

  4. 고정 분수 포지션 크기를 사용하십시오. 고정 수익 비율을 충족 할 때 고정 금액으로 포지션 크기를 증가시키고 손실이 발생할 때 크기를 감소하십시오.

이점 분석

이 전략의 장점:

  1. 볼링거 밴드 채널을 사용하여 트렌드 방향과 거래 반전을 결정하면 대부분의 윙사 (whipsaws) 를 피하고 승률을 향상시킵니다.

  2. 이동 평균은 신뢰성 있는 수익/손실 중지 신호입니다. 대부분의 수익을 차단합니다.

  3. 일정한 양은 간단하고 쉽게 구현할 수 있으며 복잡한 계산이 필요하지 않습니다.

  4. 고정 분수 위치 사이징은 수익을 확대하고 위치 조정으로 위험을 제어합니다.

위험 분석

이 전략의 위험은:

  1. 볼링거 밴드는 잘못된 신호를 생성하여 트렌드 상대로 거래하는 손실을 유발할 수 있습니다.

  2. 이동평균이 뒤떨어지면 수익이 충분하지 않을 수 있습니다.

  3. 일정한 양은 시장 조건에 적응할 수 없습니다.

  4. 고정 분수 방법의 공격적인 위치 크기 조정으로 손실이 증가할 수 있습니다.

솔루션: 신호의 정확성을 향상시키기 위해 볼링거 밴드 매개 변수를 최적화하십시오. 트렌드를 결정하기 위해 다른 지표를 추가하십시오. 고정량 크기를 줄이십시오. 분량 위치 사이징 방법에서 위치 사이징 조정 비율을 낮추십시오.

개선 방향

이 전략은 다음과 같은 측면에서 개선될 수 있습니다.

  1. 정확도를 높이기 위해 n와 m와 같은 볼링거 밴드 매개 변수를 최적화합니다.

  2. MACD, KD 같은 다른 지표를 추가하여 잘못된 신호를 피합니다.

  3. 시장 조건에 따라 고정량을 동적 위치로 변경합니다.

  4. 지점 크기의 조정 비율이 낮아지고 지점 크기의 조정 비율이 부드러운 자산 곡선입니다.

  5. 스톱 로스 전략도 추가합니다. 스톱 로스 이동, 브레이크 로스 중단 등. 위험을 통제하기 위해서죠.

  6. 최적의 매개 변수 조합을 찾기 위한 매개 변수 최적화

요약

요약하자면, 이것은 전형적인 볼링거 밴드 반전 전략이다. 볼링거 밴드에 의해 반전 지점을 식별하고, 이동 평균에 의해 이익 취득 / 중지 손실을 설정하고, 고정량 및 분자 위치 사이징에 의해 위험을 제어합니다. 반전 전략으로, 이론적으로 전통적인 볼링거 밴드 전략과 비교하여 몇 가지 윙사이를 피하고 수익성을 향상시킵니다. 그러나 볼링거 밴드의 결함, 이동 평균은 강력한 실용적 응용을 위해 추가 최적화와 위험 관리가 필요합니다.


/*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))


더 많은