[기술적 분석] 지표/전략 : Woodies CCI (Commodity Channel Index)

반응형

 

2024.06.06 - [주가 분석/기술적 분석] - [기술적 분석] 지표/전략 : CCI (Commodity Channel Index)

 

[기술적 분석] 지표/전략 : CCI (Commodity Channel Index)

제법 유명한 지표인 상품 채널 지수, CCI(Commodity Channel Index)는 도널드 램버트(Donald Lambert)에 의해 개발된 상품 가격을 관찰하기 위한 지표다. 현재는 선물 뿐만이 아니라 주식 현물, 가상 화폐나

antsinvest.tistory.com

 

  Woodies CCI(Woodies Commodity Channel Index)는 앞서 도널드 램버트(Donald Lambert)의 CCI를 캔 우즈(Ken Woods)가 개량한 지표다. 기존 CCI에 좀더 빠른 구간을 갖는 Turbo CCI 라인을 추가하고 CCI 히스토그램을 추가한다. 통상적으로 장기 CCI는 14일 빠른 CCI인 터보 CCI는 6일을 사용하는 경우가 많다. 히스토그램은 0 라인과 CCI 라인 사이 간격을 표시하는데 사실 이러면 히스토그램이 필요가 없다. 따라서 히스토그램을 일정한 기준에 따라 일부분만 칠하거나 색을 구분하여 칠하는데 이 기준은 5일 연속 CCI가 0보다 작으면 붉은 히스토그램, 5일 연속 CCI가 0보다 크면 녹색 히스토그램을 칠한다.

 

  우디스 CCI는 일반적인 CCI에 비해 많이 알려져 있거나 많이 사용되는 지표는 아니다. 대부분 CCI로도 구현할 수 있는 내용이긴 한데 의미를 부여하자면 두개의 CCI 라인을 이용한 오실레이터 전략을 운용할 수 있다는 것에 장점이 있다. 각각의 추가된 지표들을 이용하여 매매에 적용하는 방법을 알아보자.

 

Woodies CCI(Woodies Commodity Channel Index) 보조 지표

반응형

 

  기본적인 매매 방법은 CCI와 동일하다. 0을 기준으로 0보다 크면 상승 모멘텀, 0보다 작으면 하락 모멘텀으로 본다. 따라서 CCI가 0을 상승 돌파하면 매수하고, CCI가 0을 하락 돌파하는 경우에 매도하는 전략이다. 이 경우, CCI, CCI Turbo를 사용하여 적용할 수 있는데 CCI 터보의 경우에는 너무 민감하여 적용 시 허위 시그널이 많이 발생할 수 있다. 그 다음은 히스토그램을 적용하는 건데 이 경우, 0을 기준으로 매수, 매도 시그널을 포착하는 경우에는 CCI와 다른 점이 없다. 따라서 히스토그램의 색을 가지고 매매하는데 히스토그램 색깔을 CCI가 5일간 0 위에 있었는지, 아래에 있었는지에 따라 칠하는 이유가 여기에 있다. 이렇게 되면 허위 시그널의 발생 빈도가 확연히 줄어드는데 0을 상향 돌파했을 경우 매수에 바로 임하는 것이 아니라 5일간 지켜보는 것이다. 이 방법은 허위 시그널을 줄이기 위해 다른 지표에서도 자주 사용하는 방법 중의 하나인데, 이를 지표에 녹여낸 것이라고 보면 된다. 단, 이 경우에는 시그널의 포착 속도가 느려질 수 있다는 단점 역시 존재한다.

 

  다른 매매 전략은 상단, 하단 밴드를 정하고 하단 밴드를 상항 돌파하는 경우 매수, 상단 밴드를 하향 돌파하는 경우 매도를 하는 전략이다. 보통 CCI는 -100 ~ 100 사이의 값 분포를 보이므로 통상적으로 -100을 하단, 100을 상단으로 잡고 -100 밑의 값일 경우 과매도로 판단하고 100을 넘을 경우 과매수로 판단하여 매매에 임한다. CCI 터보 라인은 변동이 심하고 폭이 좁기 때문에 보통 -100, 100라인에는 적용하지 않는다.

 

  라인이 CCI와 CCI 터보 두개이다 보니 두개 라인을 이용한 크로스 전략을 적용할 수 있다. CCI 터보 라인이 CCI 라인을 상향 돌파할 때, 매수, CCI 터보 라인이 CCI 라인을 하향 돌파할 때 매도하는 전략이다. 우디스 CCI 오실레이터 전략은 포착 신호는 굉장히 빠르나 다른 신호 포착이 빠른 지표들 처럼 허위 신호가 자주 발생하고 매매가 빈번해지는 단점이 있다.

 

  마지막으로 Woodies CCI(Woodies Commodity Channel Index) 트레이딩 뷰 파인 스크립트 소스를 공유하며 마친다.

 

 

  • Woodies CCI(Woodies Commodity Channel Index) 트레이딩 뷰 파인 스크립트 지표 소스
//@version=5
indicator(title="Woodies Commodity Channel Index", shorttitle="Woodies CCI", format=format.price, precision=2, timeframe="", timeframe_gaps=true)

lastnbars(indi, length, base, updown) =>
    bool bars = true
    for i = 1 to length
        if updown == "Up"
            if indi[i] > base 
                bars := bars and true
            else
                bars := bars and false
        else
            if indi[i] < base 
                bars := bars and true
            else
                bars := bars and false
    bars

sourceInput = input(defval=hlc3, title="CCI Source")
lengthInput = input.int(defval=14, title="CCI MA Length")
turboSourceInput = input(defval=hlc3, title="Turbo CCI Source")
turboLengthInput = input.int(defval=6, title="Turbo CCI MA Length")
histLengthInput = input.int(defval=5, title="Histogram Length")
upperInput1 = input.int(100, title="Upper", group="1st Band Settings")
lowerInput1 = input.int(-100, title="Lower", group="1st Band Settings")
upperInput2 = input.int(200, title="Upper", group="2nd Band Settings")
lowerInput2 = input.int(-200, title="Lower", group="2nd Band Settings")

turbocci = ta.cci(turboSourceInput, turboLengthInput)
cci = ta.cci(sourceInput, lengthInput)

cciPlot = plot(cci, title="CCI", color=color.blue)
turbocciPlot = plot(turbocci, title="Turbo CCI", color=color.yellow)

lastUp = lastnbars(cci, histLengthInput, 0, "Up")
lastDown = lastnbars(cci, histLengthInput, 0, "Down")
histogramColor = lastUp ? color.lime : lastDown ? color.red : cci < 0 ? color.lime : color.red

plot(cci, title="CCI Turbo Histogram", color=histogramColor, style=plot.style_histogram)
upperBand1 = hline(upperInput1, "1st Upper Band", color=color.gray)
hline(0, "Middle Band", linestyle=hline.style_dotted, color=color.gray)
lowerBand1 = hline(lowerInput1, "1st Lower Band", color=color.gray)
fill(upperBand1, lowerBand1, title="Background", color=color.new(color.gray, 90))
upperBand2 = hline(upperInput2, "2nd Upper Band", color=color.gray)
lowerBand2 = hline(lowerInput2, "2nd Lower Band", color=color.gray)
fill(upperBand2, lowerBand2, title="Background2", color=color.new(color.gray, 90))

midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(cciPlot, midLinePlot, 300, upperInput1, top_color = color.green, bottom_color = color.new(color.green, 100), title = "Overbought Gradient Fill")
fill(cciPlot, midLinePlot, lowerInput1, -300, top_color = color.new(color.red, 100), bottom_color = color.red, title = "Oversold Gradient Fill")

 

 

  • Woodies CCI(Woodies Commodity Channel Index) 트레이딩 뷰 파인 스크립트 전략 소스
//@version=5
strategy(title="Woodies Commodity Channel Index", shorttitle="Woodies CCI", margin_long=100, margin_short=100, default_qty_type=strategy.percent_of_equity, default_qty_value=50, commission_type=strategy.commission.percent, commission_value=0.2, pyramiding=0)

lastnbars(indi, length, base, updown) =>
    bool bars = true
    for i = 1 to length
        if updown == "Up"
            if indi[i] > base 
                bars := bars and true
            else
                bars := bars and false
        else
            if indi[i] < base 
                bars := bars and true
            else
                bars := bars and false
    bars

sourceInput = input(defval=hlc3, title="CCI Source")
lengthInput = input.int(defval=14, title="CCI MA Length")
turboSourceInput = input(defval=hlc3, title="Turbo CCI Source")
turboLengthInput = input.int(defval=6, title="Turbo CCI MA Length")
histLengthInput = input.int(defval=5, title="Histogram Length")
upperInput1 = input.int(100, title="Upper", group="1st Band Settings")
lowerInput1 = input.int(-100, title="Lower", group="1st Band Settings")
upperInput2 = input.int(200, title="Upper", group="2nd Band Settings")
lowerInput2 = input.int(-200, title="Lower", group="2nd Band Settings")

turbocci = ta.cci(turboSourceInput, turboLengthInput)
cci = ta.cci(sourceInput, lengthInput)

cciPlot = plot(cci, title="CCI", color=color.blue)
turbocciPlot = plot(turbocci, title="Turbo CCI", color=color.yellow)

lastUp = lastnbars(cci, histLengthInput, 0, "Up")
lastDown = lastnbars(cci, histLengthInput, 0, "Down")
histogramColor = lastUp ? color.lime : lastDown ? color.red : cci < 0 ? color.lime : color.red

plot(cci, title="CCI Turbo Histogram", color=histogramColor, style=plot.style_histogram)
upperBand1 = hline(upperInput1, "1st Upper Band", color=color.gray)
hline(0, "Middle Band", linestyle=hline.style_dotted, color=color.gray)
lowerBand1 = hline(lowerInput1, "1st Lower Band", color=color.gray)
fill(upperBand1, lowerBand1, title="Background", color=color.new(color.gray, 90))
upperBand2 = hline(upperInput2, "2nd Upper Band", color=color.gray)
lowerBand2 = hline(lowerInput2, "2nd Lower Band", color=color.gray)
fill(upperBand2, lowerBand2, title="Background2", color=color.new(color.gray, 90))

midLinePlot = plot(0, color = na, editable = false, display = display.none)
fill(cciPlot, midLinePlot, 300, upperInput1, top_color = color.green, bottom_color = color.new(color.green, 100), title = "Overbought Gradient Fill")
fill(cciPlot, midLinePlot, lowerInput1, -300, top_color = color.new(color.red, 100), bottom_color = color.red, title = "Oversold Gradient Fill")

strategySignal = input.string("CCI-Band", title="Strategy Indicator", options = ["CCI-Band", "CCI Turbo-Band", "CCI-0 Cross", "CCI Turbo-0 Cross", "Histogram-0 Cross"])
startDate = input.time(defval=timestamp("01 Jan 1970 00:00 +0000"), group = "Test Range")
finishDate = input.time(defval=timestamp("31 Dec 2025 24:00 +0000"), group = "Test Range")
time_condition = time >= startDate and time <= finishDate
 
if(time_condition)
	if (strategySignal == "CCI-Band")
		if ta.crossover(cci, lowerInput1)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(cci, upperInput1)
			strategy.close_all('매도')
    if (strategySignal == "CCI Turbo-Band")
		if ta.crossover(turbocci, lowerInput1)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(turbocci, upperInput1)
			strategy.close_all('매도')
	if (strategySignal == "CCI-0 Cross")
		if ta.crossover(cci, 0)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(cci, 0)
			strategy.close_all('매도')
    if (strategySignal == "CCI Turbo-0 Cross")
		if ta.crossover(turbocci, 0)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if ta.crossunder(turbocci, 0)
			strategy.close_all('매도')
    if (strategySignal == "Histogram-0 Cross")
		if (histogramColor == color.lime)
			strategy.entry("매수", strategy.long, oca_type=strategy.oca.cancel, comment="매수")
		if (histogramColor == color.red)
			strategy.close_all('매도')
	
bgcolor(strategy.position_size > 0 ? color.new(color.yellow,90) : na)
반응형