다중 필터 볼링거 밴드 거래 전략

저자:차오장, 날짜: 2024-01-17 15:12:57
태그:

img

전반적인 설명

멀티 필터 볼링거 밴드 거래 전략 (Multi-filter Bollinger Band Trading Strategy) 은 볼링거 밴드 지표, 이동 평균 지표, RSI 지표 및 K-라인 그래픽 기능을 결합하여 조건이 충족되면 거래 신호를 생성하는 양적 거래 전략이다. 중장기 가격 트렌드 변동을 포착하여 수익을 창출하는 전형적인 트렌드 추적 전략이다.

전략 원칙

지표 계산

이 전략은 주로 볼링거 밴드, 이동 평균 및 RSI라는 세 가지 지표를 사용합니다. 그 중에서도 볼링거 밴드의 중간 레일은 가격의 n 일간 간단한 이동 평균이며, 상부 및 하부 레일은 각각 중간 레일 +2 표준 편차 및 중간 레일 -2 표준 편차입니다. RSI 지표는 특정 기간 동안 상승/하락 범위를 기반으로 계산된 0에서 100 사이의 값입니다.

거래 신호

이 전략은 다음 세 가지 주요 조건으로 거래 신호를 생성합니다.

(1) 볼링거 하위 밴드 브레이크오웃 & K-라인 몸의 모순. 닫기 가격이 하위 밴드를 상향으로 뚫고 K-라인 몸의 색상이 현재 트렌드 방향과 모순되면, 긴 거리를 가십시오.

(2) 볼링거 상단 브레이크오웃 & K-라인 몸의 모순. 닫기 가격이 상단 밴드를 아래로 돌파하고 K-라인 몸의 색상이 현재 트렌드 방향과 모순될 때, 쇼트 가십시오.

(3) K-선 몸의 반전. 위치 방향이 K-선 몸의 색상 반전과 일치하면 위치를 닫습니다.

또한, 전략은 또한 이동 평균 필터, K 라인 바디 필터, RSI 필터 및 다른 보조 조건을 엄격하게 통제하기 위해 설정합니다.

이점 분석

  • 여러 가지 엄격한 조건 통제는 거짓 파업의 위험을 줄일 수 있습니다.
  • 트렌드 추적 방법은 거래 빈도를 줄여줍니다.
  • RSI 지표는 반전 함정을 피하는 데 도움이 됩니다.

위험 분석

  • 부적절한 볼링거 매개 변수 설정으로 인해 신호가 거의 나오지 않을 수 있습니다.
  • 실패한 탈출은 더 큰 손실을 초래할 수 있습니다.
  • 거래 빈도가 낮으면 거래 기회를 놓칠 수 있습니다.

위험은 볼링거 매개 변수를 조정하고 엄격한 정지 통제로 줄일 수 있습니다.

최적화 방향

  • 최적의 매개 변수를 찾기 위해 다른 매개 변수에서 전략 성능을 테스트
  • 자동으로 매개 변수를 최적화하기 위해 기계 학습 알고리즘을 추가
  • 더 많은 요소와 필터를 추가하여 전략 안정성을 향상시킵니다.

요약

전체적으로,이 전략은 전형적인 중장기 트렌드 다음 전략입니다. 트렌드 트레이딩 접근법으로 다조건 스크리닝 및 엄격한 출입 및 출출 타이밍을 제어함으로써 불필요한 거래를 줄이고 중장기 시장 트렌드를 포착 할 수 있습니다. 여전히 매개 변수를 조정하고 더 많은 보조 도구를 추가하여 이 전략을 최적화 할 수있는 많은 공간이 있으며, 전략의 안정성과 수익성을 더욱 향상시킵니다.


/*backtest
start: 2023-12-17 00:00:00
end: 2024-01-16 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy("Noro's Bollinger Strategy v1.4", shorttitle = "Bollinger str 1.4", overlay = true )

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(false, defval = false, title = "Short")

length = input(20, defval = 20, minval = 1, maxval = 1000, title = "Bollinger Length")
mult = input(1, defval = 1, minval = 0.001, maxval = 50, title = "Bollinger Mult")
source = input(ohlc4, defval = ohlc4, title = "Bollinger Source")

usebf = input(true, defval = true, title = "Use body-filter")
usecf = input(true, defval = true, title = "Use color-filter")
userf = input(true, defval = true, title = "Use RSI-filter")

fromyear = input(1900, defval = 1900, 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(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")
showbands = input(true, defval = true, title = "Show Bollinger Bands")

//Bollinger Bands
basis = sma(source, length)
dev = mult * stdev(source, length)
upper = basis + dev
lower = basis - dev

//Lines
col = showbands ? black : na 
plot(upper, linewidth = 1, color = col)
plot(basis, linewidth = 1, color = col)
plot(lower, linewidth = 1, color = col)

//Body filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 2 or usebf == false

//Color filter
bar = close > open ? 1 : close < open ? -1 : 0 
gb = bar == 1 or usecf == false
rb = bar == -1 or usecf == false

//RSI Filter
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
rsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))
ursi = rsi > 70 or userf == false
drsi = rsi < 30 or userf == false

//Signals
up = close <= lower and rb and body and drsi and (close < strategy.position_avg_price or strategy.position_size == 0)
dn = close >= upper and gb and body and ursi and (close > strategy.position_avg_price or strategy.position_size == 0)
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
if up
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na)

if dn
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na)
    
if  exit
    strategy.close_all()

더 많은