반전 볼린저 밴드 채널 진동 추세 전략


생성 날짜: 2023-10-31 14:30:45 마지막으로 수정됨: 2023-10-31 14:30:45
복사: 0 클릭수: 664
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

반전 볼린저 밴드 채널 진동 추세 전략

개요

이것은 부린 벨트 통로에 기반한 반전 충격 트렌드 전략이다. 부린 벨트 상하 통로를 트렌드 판단으로 사용하며, 가격이 통로 경계에 접근할 때 반전 기회를 찾는다.

전략 원칙

이 전략은 브린 반지 지표를 주요 기술 지표로 사용한다. 브린 반지는 n 일 이동 평균과 그 상하 변동 범위로 구성되어 있으며, 브린 반지 상행 = n 일 이동 평균 + m × n 일 표준 차차, 브린 반지 하행 = n 일 이동 평균 - m × n 일 표준 차차이다. 여기서 n 및 m는 변수이다.

가격이 위 궤도에 가까워질 때, 현재 상승 추세에 있음을 나타내고, 그러나 꼭대기에 역전될 수 있다. 가격이 하향 궤도에 가까워질 때, 현재 하향 추세에 있음을 나타내고, 그러나 바닥에 역전될 수 있다. 이 시기는 부린띠를 효과적으로 돌파하면 하향 궤도에 올라갈 수 있다.

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

  1. 종전 가격이 부린이 올라가는 길보다 높을 때, 더 많은 입장을 취하고; 종전 가격이 부린이 내려가는 길보다 작을 때, 공백 입장을 취한다.

  2. 정지 손실은 n 일 이동 평균을 신호로 한다. 다중 단위 종결 가격 아래 n 일 평균선을 깨면 정지 손실을 출전한다. 공백 단위 종결 가격 위 n 일 평균선을 깨면 정지 손실을 출전한다.

  3. 고정 거래량으로 매 거래의 수를 고정한다.

  4. 고정 비율 자금 관리 방법을 사용하여 고정 수익률과 주문 조정 幅을 설정하십시오. 고정 비율이 수익을 달성 할 때 고정 幅에 따라 포지션을 증가 시키고 손실이 발생할 때 포지션을 줄이십시오.

우위 분석

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 브린 벨트 통로를 사용하여 트렌드 방향을 판단하고, 역동적인 거래 전략을 취하고, 가격이 반전될 수 있는 시점에 진입하여, 대부분의 흔들림을 피하고, 승률을 높인다.

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