채널 + 트렌드라인 인디케이터

작성자 정보

  • 차트분석 작성
  • 작성일

컨텐츠 정보

  • 4,394 조회
  • 457 추천
  • 195 비추천
  • 목록

본문

d2d55-67aea9bbb5535-98a7c7ab43edd0cbb8e0fa39a88709cf0e28462f.png

 

Channels and Trend Lines 인디케이터는 차트의 주요 추세선을 감지하고 가격의 움직임을 기반으로 채널을 형성하여 트레이더가 매매 전략을 수립하는 데 도움을 주는 TradingView 맞춤형 스크립트입니다.
이 인디케이터는 추세선(Trend Line)과 가격 채널(Channels)을 자동으로 식별 및 표시하여, 트레이더가 지지선(Support)과 저항선(Resistance)을 효과적으로 파악할 수 있도록 합니다.

 

기능

 

추세선(Trend Line) 자동 감지 및 표시

  • 특정 Pivot High(고점) 및 Pivot Low(저점) 을 기준으로 추세선을 생성
  • 최대 3개의 상승 추세선(녹색)하락 추세선(빨간색) 을 자동으로 감지
  • 추세선이 깨지는 지점을 감지하여 변화를 확인할 수 있음

가격 채널(Channels) 자동 감지 및 표시

  • 최고점(Upper Extremity)최저점(Lower Extremity) 을 기준으로 채널 생성
  • 채널 내 변동 범위를 시각적으로 표시하여 트레이딩 기회를 포착
  • 가격이 채널을 돌파할 경우, 추세 강도 변화를 쉽게 인식 가능

지지선/저항선 표시 및 라벨(Label) 추가

  • 가격이 지지선(파란색) 또는 저항선(빨간색)에서 반응하는 지점을 라벨로 표시
  • 주요 지지/저항 수준에서 “X” 마크를 통해 돌파 여부 시각화 가능

연장 기능(Extend to Last Bar)

  • 채널과 추세선을 마지막 캔들까지 연장하여 현재 시장 상황을 반영

사용자 맞춤형 설정 가능

  • 추세선 및 채널 색상 사용자 설정 가능
  • 추세선 및 채널 표시 여부 선택 가능
  • 지지/저항 라벨 및 익스트림 포인트(Extreme Points) 표시 여부 조정 가능

 

작동 원리

 

1. 추세선(Trend Line) 감지 및 생성

 

추세선 검출 방법

  • ta.pivothigh(prd, prd), ta.pivotlow(prd, prd)를 활용하여 지정된 Pivot Period 내 고점 및 저점을 감지
  • 최근 감지된 여러 개의 고점/저점을 비교하여 추세선을 형성할 수 있는지 확인
  • 상승 추세선(녹색)과 하락 추세선(빨간색)을 각각 생성

추세선 생성 조건

  • 상승 추세선 조건
    • val1 > val2이전 고점이 현재 고점보다 높을 경우
    • 두 점을 연결하여 하락 추세선(빨간색) 생성
  • 하락 추세선 조건
    • val1 < val2이전 저점이 현재 저점보다 낮을 경우
    • 두 점을 연결하여 상승 추세선(녹색) 생성

 

2. 가격 채널(Channels) 감지 및 생성

 

채널 검출 방법

  • ta.highest(src1, length1), ta.lowest(src1, length1)를 활용하여 특정 길이 내 최고점 및 최저점을 감지
  • src1[length1]이 상단 채널을 돌파하면 상승 가능성이 증가
  • src1[length1]이 하단 채널을 돌파하면 하락 가능성이 증가

 

채널 생성 조건

  • upper = ta.highest(src1, length1)지정된 길이 내 최고점(Upper Extremity) 감지
  • lower = ta.lowest(src1, length1)지정된 길이 내 최저점(Lower Extremity) 감지
  • 가격이 채널을 벗어나지 않으면 채널 유지
  • 가격이 채널을 벗어나면 새로운 채널 형성

 

3. 지지/저항 라벨 및 돌파 신호 감지

  • 가격이 upper를 돌파하면 "X" 마크를 통해 돌파 신호 표시
  • 가격이 lower를 돌파하면 "X" 마크를 통해 돌파 신호 표시
  • label.new()을 활용하여 가격이 주요 저항선(빨간색) 또는 지지선(파란색)에 도달할 경우, 해당 가격을 라벨로 표시

 

4. 가격 변동성 및 확장 기능

  • extend 옵션을 활성화하면 마지막 캔들까지 채널이 연장되어 실시간 변동성을 반영
  • show_ext, show_labels 옵션을 통해 채널의 익스트림 포인트 및 라벨을 표시할지 선택 가능

 

사용 방법

 

추세선(Trend Line) 활성화

  • SHOW TREND LINES? 옵션을 활성화하면 추세선을 자동으로 감지하여 차트에 표시

가격 채널(Channels) 활성화

  • SHOW CHANNELS? 옵션을 활성화하면 가격 채널을 자동으로 감지하여 차트에 표시

지지선/저항선 확인

  • 빨간색 선 → 저항선
  • 파란색 선 → 지지선
  • 가격이 저항선을 돌파하면 상승 가능성 증가
  • 가격이 지지선을 이탈하면 하락 가능성 증가

라벨 및 돌파 신호 활용

  • 주요 지지/저항 수준에서 “X” 마크가 나타나면 돌파 신호를 의미
  • 돌파가 발생하면 추세 변화 가능성 있음

연장 기능(Extend to Last Bar) 활용

  • Extend To Last Bar 옵션을 활성화하면 현재 가격까지 채널이 연장되어 실시간 시장 흐름 반영

 

주의사항

 

이 인디케이터는 과거 가격 데이터를 기반으로 추세선 및 채널을 감지하므로, 미래 가격을 100% 예측할 수 없습니다.
지지선과 저항선은 강한 가격 변동 시 무력화될 가능성이 있으며, 거짓 신호(False Signal)가 발생할 수 있습니다.

 

투자 시 유의해야 할 사항

 

추세선 및 채널 돌파 시 신호 확인

  • 가격이 지지선(파란색)과 저항선(빨간색)을 돌파할 경우, 추세 전환 가능성이 높음
  • 돌파 후 되돌림이 발생할 수도 있으므로, 다른 보조 지표(RSI, MACD 등)와 함께 분석 필요

다른 분석 도구와 병행하여 사용

  • 이 인디케이터는 단독으로 사용하기보다는 기술적 분석(TA) 도구와 함께 활용하는 것이 중요
  • 예를 들어, 볼린저 밴드, 이동평균선(MA), 거래량 분석 등을 추가하여 신호의 신뢰도를 높일 수 있음

백테스트 및 실전 적용 전 시뮬레이션 필요

  • 실제 거래 전에 백테스트 및 데모 트레이딩을 통해 전략을 검증하는 것이 중요

책임은 투자자 본인에게 있음

  • 이 인디케이터는 매매 보조 도구일 뿐, 모든 투자 결정은 본인의 책임

 

Channels and Trend Lines 인디케이터는 자동으로 추세선 및 가격 채널을 감지하여 시장 흐름을 분석하는 도구입니다.
그러나 단독으로 활용하기보다는, 추가적인 기술적 분석을 병행하여 더욱 신뢰도 높은 매매 전략을 수립하는 것이 중요합니다.

 

 



//@version=5

 


indicator('Channels and Trend Lines', format=format.price, precision=4, overlay=true, max_bars_back=4000, max_lines_count=500, max_labels_count=500)

x2 = input(defval=true,title="SHOW TREND LINES?",group="TREND LINE")

startyear = input(defval=2020, title='Start Year',group="TREND LINE") 
startmonth = input(defval=1, title='Start Month',group="TREND LINE")
startday = input(defval=1, title='Start day',group="TREND LINE")


prd = input.int(defval=20, title='Pivot Period', minval=10, maxval=50,group="TREND LINE")
PPnum = input.int(defval=3, title='Number of Pivot Points to check', minval=2, maxval=6,group="TREND LINE")
utcol = input.color(defval=color.lime, title='Colors', inline='tcol',group="TREND LINE")
dtcol = input.color(defval=color.red, title='', inline='tcol',group="TREND LINE")

float ph = ta.pivothigh(prd, prd)
float pl = ta.pivotlow(prd, prd)

var tval = array.new_float(PPnum)
var tpos = array.new_int(PPnum)
var bval = array.new_float(PPnum)
var bpos = array.new_int(PPnum)

add_to_array(apointer1, apointer2, val) =>
    array.unshift(apointer1, val)
    array.unshift(apointer2, bar_index)
    array.pop(apointer1)
    array.pop(apointer2)

if ph
    add_to_array(tval, tpos, ph)

if pl
    add_to_array(bval, bpos, pl)

// line definitions
maxline = 3
var bln = array.new_line(maxline, na)
var tln = array.new_line(maxline, na)

// loop for pivot points to check if there is possible trend line
countlinelo = 0
countlinehi = 0

starttime = timestamp(startyear, startmonth, startday, 0, 0, 0)

if time >= starttime
    for x = 0 to maxline - 1 by 1
        line.delete(array.get(bln, x))
        line.delete(array.get(tln, x))
    for p1 = 0 to PPnum - 2 by 1
        uv1 = 0.0
        uv2 = 0.0
        up1 = 0
        up2 = 0
        if countlinelo <= maxline and x2
            for p2 = PPnum - 1 to p1 + 1 by 1
                val1 = array.get(bval, p1)
                val2 = array.get(bval, p2)
                pos1 = array.get(bpos, p1)
                pos2 = array.get(bpos, p2)
                if val1 > val2
                    diff = (val1 - val2) / (pos1 - pos2)
                    hline = val2 + diff
                    lloc = bar_index
                    lval = low
                    valid = true
                    for x = pos2 + 1 - prd to bar_index by 1
                        if close[bar_index - x] < hline and x2
                            valid := false
                            break
                        lloc := x
                        lval := hline
                        hline += diff
                        hline


                    if valid and x2
                        uv1 := hline - diff
                        uv2 := val2
                        up1 := lloc
                        up2 := pos2
                        break

        dv1 = 0.0
        dv2 = 0.0
        dp1 = 0
        dp2 = 0
        if countlinehi <= maxline and x2
            for p2 = PPnum - 1 to p1 + 1 by 1
                val1 = array.get(tval, p1)
                val2 = array.get(tval, p2)
                pos1 = array.get(tpos, p1)
                pos2 = array.get(tpos, p2)
                if val1 < val2 and x2
                    diff = (val2 - val1) / float(pos1 - pos2)
                    hline = val2 - diff
                    lloc = bar_index
                    lval = high
                    valid = true
                    for x = pos2 + 1 - prd to bar_index by 1
                        if close[bar_index - x] > hline
                            valid := false
                            break
                        lloc := x
                        lval := hline
                        hline -= diff
                        hline

                    if valid and x2
                        dv1 := hline + diff
                        dv2 := val2
                        dp1 := lloc
                        dp2 := pos2
                        break

        // if there is continues uptrend line then draw it
        if up1 != 0 and up2 != 0 and countlinelo < maxline and x2
            countlinelo += 1
            array.set(bln, countlinelo - 1, line.new(up2 - prd, uv2, up1, uv1, color=utcol))

        // if there is continues downtrend line then draw it
        if dp1 != 0 and dp2 != 0 and countlinehi < maxline and x2
            countlinehi += 1
            array.set(tln, countlinehi - 1, line.new(dp2 - prd, dv2, dp1, dv1, color=dtcol))

 

 


//------------------------------------------------------------------------------

x1 = input(defval=true,title="SHOW CHANNELS?",group="CHANNEL")


length1 = input(100,group="CHANNEL",title="Length")
extend = input(true, 'Extend To Last Bar',group="CHANNEL")
show_ext = input(true, 'Show Extremities',group="CHANNEL")
show_labels = input(true, 'Show Labels',group="CHANNEL")

//Style

upcol = input.color(#ff1100, 'Upper Extremity Color',group="CHANNEL")
midcol = input.color(#ff5d00, 'Zig Zag Color',group="CHANNEL")
dncol = input.color(#2157f3, 'Lower Extremity Color',group="CHANNEL")
//------------------------------------------------------------------------------
os1 = 0
src1 = close
n = bar_index
var float valtop = na
var float valbtm = na

var line linetop = na 
var line linebottom = na 


//------------------------------------------------------------------------------
upper = ta.highest(src1, length1)
lower = ta.lowest(src1, length1)
os1 := src1[length1] > upper ? 0 : src1[length1] < lower ? 1 : os1[1]

btm = os1 == 1 and os1[1] != 1
top = os1 == 0 and os1[1] != 0

//------------------------------------------------------------------------------
btm_n = ta.valuewhen(btm, n, 0)
top_n = ta.valuewhen(top, n, 0)
lenc = math.abs(btm_n - top_n)

if btm and x1
    max_diff_up = 0.
    max_diff_dn = 0.
    valbtm := low[length1]

    for i = 0 to lenc - 1 by 1
        point = low[length1] + i / (lenc - 1) * (valtop - low[length1])
        max_diff_up := math.max(math.max(src1[length1 + i], open[length1 + i]) - point, max_diff_up)
        max_diff_dn := math.max(point - math.min(src1[length1 + i], open[length1 + i]), max_diff_dn)
        max_diff_dn

    //line.new(n[lenc + length1], valtop, n[length1], low[length1], color=midcol)

    if show_ext and x1
        linetop := line.new(n[lenc + length1], valtop + max_diff_up, n[length1], low[length1] + max_diff_up, color=upcol, style=line.style_solid)
        linebottom := line.new(n[lenc + length1], valtop - max_diff_dn, n[length1], low[length1] - max_diff_dn, color=dncol, style=line.style_solid)
    if show_labels and x1
        label.new(n[length1], low[length1], str.tostring(low[length1], '#.####'), color=#00000000, style=label.style_label_up, textcolor=dncol, textalign=text.align_left, size=size.small)

    if show_labels and x1 and    high >= valtop  + max_diff_up
        label.new(bar_index, low, "X",color=color.new(color.white,100) ,textcolor = color.red)

    line.new(n[lenc + length1], (2*valtop + max_diff_up-max_diff_dn)/2, n[length1], (2*low[length1]+max_diff_up-max_diff_dn)/2, color=midcol)


if top and x1
    max_diff_up = 0.
    max_diff_dn = 0.
    valtop := high[length1]

    for i = 0 to lenc - 1 by 1
        point = high[length1] + i / (lenc - 1) * (valbtm - high[length1])
        max_diff_up := math.max(math.max(src1[length1 + i], open[length1 + i]) - point, max_diff_up)
        max_diff_dn := math.max(point - math.min(src1[length1 + i], open[length1 + i]), max_diff_dn)
        max_diff_dn

    //line.new(n[lenc + length1], valbtm, n[length1], high[length1], color=midcol)

    if show_ext and x1
        linetop := line.new(n[lenc + length1], valbtm + max_diff_up, n[length1], high[length1] + max_diff_up, color=upcol, style=line.style_solid)
        linebottom := line.new(n[lenc + length1], valbtm - max_diff_dn, n[length1], high[length1] - max_diff_dn, color=dncol, style=line.style_solid)
    if show_labels and x1
        label.new(n[length1], high[length1], str.tostring(high[length1], '#.####'), color=#00000000, style=label.style_label_down, textcolor=upcol, textalign=text.align_left, size=size.small)

    
    line.new(n[lenc + length1], (2*valbtm + max_diff_up-max_diff_dn)/2, n[length1], (2*high[length1]+max_diff_up-max_diff_dn)/2, color=midcol)


if barstate.islast and extend and x1
    max_diff_up = 0.
    max_diff_dn = 0.
    x1 = 0
    y1 = 0.

    if os1 == 1 and x1
        x1 := btm_n - length1
        y1 := valbtm

        for i = 0 to n - btm_n + length1 - 1 by 1
            point = src1 + i / (n - btm_n + length1 - 1) * (valbtm - src1)
            max_diff_up := math.max(math.max(src1[i], open[i]) - point, max_diff_up)
            max_diff_dn := math.max(point - math.min(src1[i], open[i]), max_diff_dn) 
            max_diff_dn
    else

        x1 := top_n - length1
        y1 := valtop

        for i = 0 to n - top_n + length1 - 1 by 1
            point = src1 + i / (n - top_n + length1 - 1) * (valtop - src1)
            max_diff_up := math.max(math.max(src1[i], open[i]) - point, max_diff_up)
            max_diff_dn := math.max(point - math.min(src1[i], open[i]), max_diff_dn)
            max_diff_dn

    //line.delete(line.new(x1, y1, n, src1, color=midcol, extend=extend.right)[1])

    if show_ext and x1
        line.delete(line.new(x1, y1 + max_diff_up, n, src1 + max_diff_up, color=upcol, style=line.style_solid, extend=extend.right)[1])
        line.delete(line.new(x1, y1 - max_diff_dn, n, src1 - max_diff_dn, color=dncol, style=line.style_solid, extend=extend.right)[1])

    line.delete(line.new(x1, (2*y1+max_diff_up-max_diff_dn)/2, n, (2*src1+max_diff_up-max_diff_dn)/2, color=midcol, extend=extend.right)[1])


//------------------------------------------------------------------------------

///////////////

 

 

관련자료

댓글 0
등록된 댓글이 없습니다.
📊 크립토 공포지수 Latest Crypto Fear & Greed Index
알림 0