양적 전략: 볼링거 밴드 RSI CCI 크로스오버 전략

저자:차오장, 날짜: 2023-12-20 16:24:49
태그:

img

전반적인 설명

이 전략은 볼링거 밴드, 상대적 강도 지수 (RSI) 및 상품 채널 지수를 결합하여 크로스오버 신호를 찾고 구매 및 판매 신호를 생성합니다. 이 전략은 시장에서 과반 구매 및 과반 판매 시나리오를 식별하고 더 나은 투자 수익을 위해 전환 지점에서 포지션을 취하는 것을 목표로합니다.

전략 논리

볼링거 밴드

볼링거 밴드는 중간 밴드, 상위 밴드 및 하위 밴드로 구성됩니다. 중간 밴드는 일반적으로 20 일 이동 평균입니다. 상위 밴드는 중간 밴드 위의 두 표준 편차입니다. 하위 밴드는 아래의 두 표준 편차입니다. 하위 밴드 근처의 가격은 과판 상태를 나타낼 수 있습니다. 상위 밴드 근처의 가격은 과반 상태를 나타낼 수 있습니다.

RSI

RSI는 방향적인 가격 움직임의 위아래 속도를 측정합니다. 70 이상 과잉 구매 및 30 이하 과잉 판매를 보여줍니다. RSI가 70 이상에서 떨어지면 판매 신호가 될 수 있습니다. RSI가 30 이하에서 상승하면 구매 신호가 될 수 있습니다.

CCI

CCI는 가격이 평균 가격에서 얼마나 멀리 이동했는지 측정합니다. +100 이상의 판독은 과잉 구매 상태를 암시합니다. -100 이하의 판독은 과잉 판매 상태를 암시합니다. CCI는 극단적인 가격 수준을 반영합니다.

크로스오버 신호

이 전략은 볼링거 대역을 사용하여 단기 과잉 구매 / 과잉 판매 수준을 판단하고, RSI를 사용하여 상승 / 하락 동력을 측정하고, CCI를 사용하여 가격 극단성을 식별합니다. 세 가지 지표 모두 플래시 구매 / 판매 신호를 표시하면 전략은 거래 명령을 발급합니다.

장점

  1. 여러 표시기 를 결합 함 으로 신호 정확성 이 향상 되고 거짓 신호 가 감소
  2. 전환점에서의 역행 기회를 포착합니다.
  3. 사용자 정의 가능한 매개 변수는 다른 시장 조건에 적응합니다
  4. 부드러운 CCI 필터는 소음을 줄이고 안정성을 향상시킵니다.

위험 과 해결책

  1. 이 세 가지 지표 모두 손실을 초래하는 나쁜 신호를 생성 할 수 있습니다. 매개 변수를 느슨하게하거나 다른 필터를 추가 할 수 있습니다.
  2. CCI는 불안한 시장에 어려움을 겪습니다. 이동 평균 또는 변동 지표로 대체 할 수 있습니다.
  3. 이윤을 취하지 않고 손해를 막는 것만 하면 됩니다. 이윤을 확보하기 위해 후속 스톱을 추가할 수 있습니다.

최적화 기회

  1. 최적 설정을 찾기 위해 더 많은 매개 변수 조합을 테스트
  2. 매개 변수를 자동으로 조정하기 위해 기계 학습을 도입
  3. 수익 목표가 있는 수익을 추가하는 전략
  4. 신호를 검증하기 위해 MACD, KD와 같은 더 많은 지표를 포함

결론

이 전략은 볼링거 밴드, RSI 및 CCI 지표를 사용하여 전반적인 시장 조건을 분석합니다. 교차 신호를 통해 거래 시장 반전을위한 인플렉션 포인트를 식별합니다. 매개 변수 조정, 수익 취득 메커니즘 등과 같은 추가 최적화로 다양한 시장 환경에 대한 강력한 반 트렌드 전략이 될 수 있습니다.


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

//@version=5
strategy(shorttitle="BBRSIstr", title="Bollinger Bands", overlay=true)
length = input.int(20, minval=1)
maType = input.string("SMA", "Basis MA Type", options = ["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"])
src = input(close, title="Source")
mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")

ma(source, length, _type) =>
    switch _type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

basis = ma(src, length, maType)
dev = mult * ta.stdev(src, length)
upper = basis + dev
lower = basis - dev
offset = input.int(0, "Offset", minval = -500, maxval = 500)
plot(basis, "Basis", color=#FF6D00, offset = offset)
p1 = plot(upper, "Upper", color=#2962FF, offset = offset)
p2 = plot(lower, "Lower", color=#2962FF, offset = offset)
fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95))

//RSI
rsiLengthInput = input.int(14, minval=1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")
maTypeInput = input.string("SMA", title="MA Type", options=["SMA", "Bollinger Bands", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA Settings")
maLengthInput = input.int(14, title="MA Length", group="MA Settings")
bbMultInput = input.float(2.0, minval=0.001, maxval=50, title="BB StdDev", group="MA Settings")
showDivergence = input.bool(false, title="Show Divergence", group="RSI Settings")

up = ta.rma(math.max(ta.change(rsiSourceInput), 0), rsiLengthInput)
down = ta.rma(-math.min(ta.change(rsiSourceInput), 0), rsiLengthInput)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))
rsiMA = ma(rsi, maLengthInput, maTypeInput)
isBB = maTypeInput == "Bollinger Bands"

rsiPlot = plot(rsi, "RSI", color=#7E57C2)
plot(rsiMA, "RSI-based MA", color=color.yellow)
rsiUpperBand = hline(70, "RSI Upper Band", color=#787B86)
midline = hline(50, "RSI Middle Band", color=color.new(#787B86, 50))
rsiLowerBand = hline(30, "RSI Lower Band", color=#787B86)
fill(rsiUpperBand, rsiLowerBand, color=color.rgb(126, 87, 194, 90), title="RSI Background Fill")

//cci
ma = ta.sma(src, length)
cci = (src - ma) / (0.015 * ta.dev(src, length))
plot(cci, "CCI", color=#2962FF)
band1 = hline(100, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
hline(0, "Middle Band", color=color.new(#787B86, 50))
band0 = hline(-100, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color=color.rgb(33, 150, 243, 90), title="Background")

typeMA = input.string(title = "Method", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="Smoothing")
smoothingLength = input.int(title = "Length", defval = 5, minval = 1, maxval = 100, group="Smoothing")

smoothingLine = ma(cci, smoothingLength, typeMA)
plot(smoothingLine, title="Smoothing Line", color=#f37f20, display=display.none)


longCBB= close < lower
shortCBB = close>upper
longBRSI = rsi < 33
shortBRSI = rsi > 70
longcci = cci < -215
shortcci = cci > 250

strategy.entry("LONG", strategy.long, when = longCBB and longBRSI and longcci)
strategy.exit("Exit ", profit = 600)
strategy.entry("SHORT", strategy.short, when = shortCBB and shortBRSI and shortcci)
strategy.exit("Exit ", profit = 600)

더 많은