채널 + 트렌드라인 인디케이터
작성자 정보
- 차트분석 작성
- 작성일
컨텐츠 정보
- 4,394 조회
- 457 추천
- 195 비추천
- 목록
본문
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])
//------------------------------------------------------------------------------
///////////////
관련자료
-
이전
-
다음