노로의 볼링거 추적 전략

저자:차오장, 날짜: 2023-11-28 16:57:28
태그:

img

전반적인 설명

이것은 볼링거 밴드 (Bollinger Bands) 를 기반으로 하는 모멘텀 추적 전략입니다. 그것은 시장 추세와 반전 지점을 판단하기 위해 볼링거 밴드를 결합하고 시장 변동을 추적하기 위해 장과 짧은 포지션을 설정합니다.

원칙

이 전략의 핵심 지표는 중간 밴드, 상위 밴드 및 하위 밴드로 구성된 볼링거 밴드입니다. 중간 밴드는 n 일간의 이동 평균이며 상위 및 하위 밴드는 중간 밴드 더하기 / 마이너스 표준 편차의 오프셋입니다. 가격이 상위 / 하위 밴드에 접근하면 과잉 구매 / 과잉 판매의 신호로 간주됩니다. 전략은 트렌드 편차를 열 포지션의 기초로 포함합니다. 즉 가격이 반대 방향으로 중간 밴드를 뚫었을 때 열 포지션입니다. 거짓 브레이크로 인해 발생하는 손실을 방지하기 위해 전략은 브레이크의 폭이 평균보다 크다는 것을 요구합니다. 폐쇄 조건은 중간 밴드를 뚫은 후 가격이 돌아가는 것입니다.

이 전략은 또한 다른 거래 기회에 대응하는 트렌드를 따르는 엔트리와 평균 반전 엔트리를 모두 포함합니다. 트렌드를 따르는 엔트리는 중간에있는 밴드가 지원 / 저항 참조가되고 오차 브레이크아웃을 형성하도록 요구합니다. 평균 반전 엔트리는 상부 / 하부 볼링거 밴드 근처에서 직접 반전됩니다. 전략은이 두 유형의 신호를 결합하여 트렌드 추적 및 반전 작업을 모두 수행 할 수 있습니다.

이점 분석

이 전략은 볼링거 밴드의 과잉 구매/ 과잉 판매 특성을 반전 포인트 판단과 결합합니다. 이것은 트렌딩 및 범위 시장에 적용하여 다양한 유형의 거래 기회를 포착 할 수 있습니다. 스톱 로스 출구 설정은 손실이 확장되는 것을 방지합니다. 또한, 길고 짧게 거래 할 수있는 능력은 전략의 적용성을 향상시킵니다.

간단한 볼링거 전략과 비교하면 추가 트렌드 논리는 이 전략의 엔트리를 더 안정적으로 만들고, 역전 기회를 포착합니다. 이것은 신호-소음 비율을 향상시킵니다. 또한, 두 방향 거래는 다른 시장 상황에서 거래 기회를 더 완벽하게 활용합니다.

위험 분석

이 전략은 주로 볼링거 밴드의 과잉 구매/ 과잉 판매 특성에 의존한다. 따라서 극심한 가격 변동이 있을 때 볼링거 밴드의 폭은 계속 확장되며, 이는 여러 번의 손실 트레이드를 쉽게 초래할 수 있다. 이것은 잠재적 위험 지점이다. 또한, 역전 판단에 여전히 약간의 불확실성과 오류가 있으며, 실패한 엔트리와 정지로 이어진다.

볼링거 밴드의 실패에 대해, 우리는 밴드를 더 민감하게 만들기 위해 매개 변수 n를 단축하거나 손실의 가능성을 줄이기 위해 대역 폭을 줄일 수 있습니다. 역전 곡선 판단에 관해서는, 브레이크아웃의 매개 변수를 최적화하면 오류를 줄일 수 있습니다.

최적화 방향

이 전략을 최적화하는 주요 방향은 다음과 같습니다.

  1. 볼링거 밴드의 매개 변수는 최적의 조합을 찾기 위해 다른 시장에 따라 조정 할 수 있습니다.
  2. 오차의 크기와 평균값의 계산은 다른 옵션으로 테스트 할 수 있습니다.
  3. 입력 신호를 판단하고 거짓 양성 반응을 줄이기 위해 더 많은 필터를 추가합니다.
  4. 트레일 스톱 손실과 같은 다른 스톱 손실 방법을 테스트하십시오.
  5. 매개 변수들은 특정 제품과 시간대에 최적화 될 수 있습니다.

결론

이 전략은 표준 볼링거 전략에 대한 효과적인 확장 및 최적화를 제공합니다. 추가 트렌드 오차는 안정성을 향상시키고 반전 기회를 잘 활용합니다. 두 방향과 스톱 손실을 거래 할 수있는 능력 또한 전략을 더 견고하게 만듭니다. 매개 변수 최적화 및 더 많은 필터를 추가함으로써 추가 개선이 가능합니다.


/*backtest
start: 2023-11-20 00:00:00
end: 2023-11-27 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=3
strategy("Noro's Bollinger Strategy v1.3", shorttitle = "Bollinger str 1.3", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 5)

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

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

uset = input(true, defval = true, title = "Use trend entry")
usect = input(true, defval = true, title = "Use counter-trend entry")

fromyear = input(2018, defval = 2018, 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
body = abs(close - open)
abody = ema(body, 30)

//Signals
bar = close > open ? 1 : close < open ? -1 : 0 
up1 = bar == -1 and ohlc4 >= basis and ohlc4 < upper and (close < strategy.position_avg_price or strategy.position_size == 0) and uset
dn1 = bar == 1 and ohlc4 <= basis and ohlc4 > lower and (close > strategy.position_avg_price or strategy.position_size == 0) and uset
up2 = close <= lower and usect
dn2 = close >= upper and usect
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2

//Trading
if up1 or up2
    strategy.entry("Long", strategy.long, needlong == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    strategy.entry("Short", strategy.short, needshort == false ? 0 : na, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

더 많은