이중 트랙 볼링거 밴드 모멘텀 거래 전략

저자:차오장, 날짜: 2023-11-16 17:36:00
태그:

img

전반적인 설명

이 전략은 볼링거 밴드 (Bollinger Bands) 의 개념을 기반으로, 가격 채널을 위해 상위 및 하위 레일을 설정하고 트렌드 판단 및 거래 신호 생성에 사용한다. 구체적으로, 그것은 채널 대역폭으로 가격의 평균 절대 편차를 계산한다. 채널의 중간 레일은 가격의 간단한 이동 평균이며, 상위 및 하위 레일은 채널 대역폭의 1 또는 2 배 이상의 중간 레일이다. 가격이 상위 레일을 통과하면 길게 가다. 하위 레일을 통과하면 짧게 가다.

원칙

이 전략의 주요 내용은 다음과 같습니다.

  1. 가격의 중간 레일을 계산합니다. 가격의 단순한 이동 평균입니다.

  2. 채널 대역폭으로 가격의 절대편차의 단순한 이동 평균을 계산합니다.

  3. 중간 레일과 대역폭에 따라 상부와 하부 레일을 결정한다. 상부 레일은 중간 레일 더하기 대역폭의 1 또는 2 배이다. 하부 레일은 중간 레일 빼기 대역폭의 1 또는 2 배이다.

  4. 길고 짧은 트렌드 판단 지표를 계산합니다. 가격이 상단 레일 2보다 높을 때, 그것은 길습니다. 가격이 하단 레일 2보다 낮을 때, 그것은 짧습니다.

  5. 거래 신호를 생성합니다. 가격이 상단 레일 2를 넘을 때 길게 이동합니다. 하단 레일 2를 넘을 때 짧게 이동합니다.

  6. 스톱 로스 라인을 설정하십시오. 긴 주문의 스톱 로스 라인은 하부 레일 1이고 짧은 주문의 상부 레일 1입니다.

  7. 자본 관리 요구 사항에 따라 포지션 크기를 계산합니다.

이 전략은 트렌드를 판단하기 위해 이동 평균, 과소득과 과소득을 판단하기 위해 볼링거 밴드, 반전하기 위해 브레이크아웃을 사용하는 아이디어를 통합합니다. 이중 레일 사이의 차이는 트렌드의 강도를 판단하는 데 사용되며 볼링거 밴드의 회귀 함수는 비교적 안정적인 거래 시스템을 형성하는 데 사용됩니다.

이점 분석

이 전략의 주요 장점은 다음과 같습니다.

  1. 이중 철도 시스템은 추세의 강도를 더 잘 판단 할 수 있습니다.

  2. 볼링거 밴드는 강력한 회귀 기능을 가지고 있습니다. 잘못된 파장을 효과적으로 방지하기 위해서요.

  3. 이중 레일 사이의 차이는 볼링거 밴드 회귀와 결합하여 비교적 안정적인 거래 신호를 형성합니다.

  4. 리스크를 통제하기 위해 명확한 스톱 로스/엑시트 로직이 있습니다.

  5. 포지션 크기는 자본 관리 요구사항을 따르고, 슈퍼 레버리지를 피합니다.

  6. 전략 아이디어는 명확하고 이해하기 쉽고 최적화됩니다.

  7. 유연한 매개 변수 설정으로 다른 시장에 적응할 수 있습니다.

위험 분석

이 전략은 또한 몇 가지 위험을 안고 있습니다.

  1. 부적절한 볼링거 밴드 매개 변수는 가격을 효과적으로 추적하지 못하여 탈락 효과를 유발할 수 있습니다.

  2. 이중 레일 사이의 차이는 잘못된 트렌드 판단을 완전히 피할 수 없습니다.

  3. 범위에 묶인 시장에서 더 많은 유효하지 않은 신호를 생성할 수 있습니다.

  4. 허위 유출 상황에서는 손실이 발생할 수 있습니다.

  5. 시간이 지연되어 있고, 아마도 회전 전환점이 없어질 수도 있습니다.

  6. 리스크/이익 비율은 스톱 로스 포인트에 의해 제한되며, 트렌드를 무한히 추적할 수 없습니다.

대응한 위험 관리 조치:

  1. 다양한 주기에 적응할 수 있는 볼링거 밴드를 만들기 위해 매개 변수를 최적화합니다.

  2. 확인을 위해 다른 지표를 결합하여 잘못된 판단을 피하십시오.

  3. 단일 손실을 통제하기 위해 포지션 크기를 줄이세요.

  4. 위험/이익 비율을 보장하기 위해 스톱 로스 포인트를 최적화합니다.

  5. 지연을 줄이기 위해 적절한 주기를 단축하십시오.

  6. 위험 통제는 강력해야 합니다. 무제한 추격은 없어야 합니다.

최적화 방향

이 전략은 다음과 같은 방향으로 최적화 될 수 있습니다.

  1. 더 나은 가격 추적을 위해 볼링거 밴드 매개 변수를 최적화합니다. 적응 매개 변수를 도입 할 수 있습니다.

  2. EMA, DWMA 등 다른 이동 평균을 시도해보세요.

  3. 범위에 묶인 시장에서 거래를 피하기 위해 트렌드 필터링을 추가하십시오. MACD가 고려 될 수 있습니다.

  4. 더 많은 트렌드 이윤을 얻기 위해 공격적인 출구 방법을 추가하십시오. 후속 스톱 손실, 출구 신호 등을 고려 할 수 있습니다.

  5. 다양한 시장 조건에 적합한 조합을 위한 여러 시간 프레임을 도입합니다.

  6. 부진을 피하기 위해 부피 상승과 같은 추가 조건을 추가합니다.

  7. 역볼링거 밴드를 생각해 보세요. 상위 밴드를 팔고, 하위 밴드를 사죠.

  8. 가장 좋은 매개 변수 조합을 위해 매개 변수 최적화를 수행합니다.

요약

이 전략의 전반적인 아이디어는 명확하고 안정적입니다. 또한 매개 변수 최적화, 논리 강화, 리스크 관리 등을 통해 개선할 여지가 있습니다. 매우 실용적인 양적 거래 전략으로 더 정밀화 할 수 있습니다. 전략은 양적 거래에 초보자에게 좋은 참조를 제공합니다.


/*backtest
start: 2022-11-09 00:00:00
end: 2023-11-15 00:00:00
period: 1d
basePeriod: 1h
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/
// © noro

//@version=4
strategy(title = "Noro's Bands Strategy", shorttitle = "Bands", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0, commission_value = 0.1)

//Sattings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
lotsize = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot, %")
len = input(20, defval = 20, minval = 1, maxval = 1000, title = "Length")
src = input(ohlc4, title = "Source")
showbb = input(true, title = "Show Bands")
showof = input(true, title = "Show Offset")
showbg = input(false, title = "Show Background")
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")

//PriceChannel
lasthigh = highest(src, len)
lastlow = lowest(src, len)
center = (lasthigh + lastlow) / 2

//Distance
dist = abs(src - center)
distsma = sma(dist, len)
hd = center + distsma
ld = center - distsma
hd2 = center + distsma * 2
ld2 = center - distsma * 2

//Trend
trend = 0
trend := high > hd2 ? 1 : low < ld2 ? -1 : trend[1]
bgcol = showbg == false ? na : trend == 1 ? color.lime : color.red
bgcolor(bgcol, transp = 70)

//Lines
colo = showbb == false ? na : color.black
offset = showof ? 1 : 0
plot(hd2, color = colo, linewidth = 1, transp = 0, offset = offset, title = "High band 2")
plot(hd, color = colo, linewidth = 1, transp = 0, offset = offset, title = "High band 1")
plot(center, color = colo, linewidth = 1, transp = 0, offset = offset, title = "center")
plot(ld, color = colo, linewidth = 1, transp = 0, offset = offset, title = "Low band 1")
plot(ld2, color = colo, linewidth = 1, transp = 0, offset = offset, title = "Low band 2")

//Trading
size = strategy.position_size
needstop = needlong == false or needshort == false
truetime = time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)
lot = 0.0
lot := size != size[1] ? strategy.equity / close * lotsize / 100 : lot[1]
if distsma > 0
    strategy.entry("Long", strategy.long, lot, stop = hd2, when = truetime and needlong)
    strategy.entry("Short", strategy.short, lot, stop = ld2, when = truetime and needshort)
sl = size > 0 ? ld2 : size < 0 ? hd2 : na
if size > 0 and needstop
    strategy.exit("Stop Long", "Long", stop = sl)
if size < 0 and needstop
    strategy.exit("Stop Short", "Short", stop = sl)
if time > timestamp(toyear, tomonth, today, 23, 59)
    strategy.close_all()
    strategy.cancel("Long")
    strategy.cancel("Short")

더 많은