다중 필터 볼린저 밴드 트레이딩 전략


생성 날짜: 2024-01-17 15:12:57 마지막으로 수정됨: 2024-01-17 15:12:57
복사: 1 클릭수: 592
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

다중 필터 볼린저 밴드 트레이딩 전략

개요

다중 필터링 선택 브린 띠 거래 전략은 브린 띠 지표, 평균선 지표, 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()