//@version=6
indicator('目標設定', overlay = true, max_lines_count = 40)
// 輸入 ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
length = input.int(10, 'Trend Length')
target = input.int(0, 'Set Targets')
// }
// VARIABLES ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
var bool trend = false
float trend_value = na
//顏色
color up_color = #06b690
color dn_color = color.rgb(182, 112, 6)
// 計算ATR停損和目標
series float atr_value = ta.sma(ta.atr(200), 200) * 0.8
//趨勢方向
series float sma_high = ta.sma(high, length) + atr_value
series float sma_low = ta.sma(low, length) - atr_value
color plot_color = color.new(chart.fg_color, 80)
//管理線條和標籤的 UDT
type TrendTargets
array<line> lines
array<label> labels
//初始化UDT
var TrendTargets targets_up = TrendTargets.new(array.new_line(), array.new_label())
var TrendTargets targets_down = TrendTargets.new(array.new_line(), array.new_label())
// }
// 計算――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
//交叉確定趨勢
if ta.crossover(close, sma_high) and barstate.isconfirmed
trend := true
trend
if ta.crossunder(close, sma_low) and barstate.isconfirmed
trend := false
trend
trend_value := switch
trend => sma_low
not trend => sma_high
trend_color = trend ? up_color : not trend ? dn_color : na
// 趨勢變化訊號偵測
bool signal_up = ta.change(trend) and not trend[1]
bool signal_down = ta.change(trend) and trend[1]
// 繪製趨勢目標和管理線條/標籤的方法
method draw_targets(TrendTargets targets, bool signal1, bool signal2, bool direction) =>
float base = direction ? sma_low : sma_high
float atr_multiplier = atr_value * (direction ? 1 : -1)
// 重置向上和向下目標的計數器
var int count_up = 0
var int count_down = 0
if trend
count_down := 0
count_up := count_up + 1
count_up
if not trend
count_down := count_down + 1
count_up := 0
count_up
int count = direction ? count_up : count_down
if signal1
float target_len1 = atr_multiplier * (5 + target)
float target_len2 = atr_multiplier * (10 + target * 2)
float target_len3 = atr_multiplier * (15 + target * 3)
// 清除現有的線條和標籤
for line_i in targets.lines
int i = targets.lines.indexof(line_i)
label.delete(targets.labels.get(i))
line.delete(line_i)
array.clear(targets.lines)
array.clear(targets.labels)
// 為趨勢目標繪製新線
line stop_loss_line = line.new(bar_index, base, bar_index + 20, base)
line entry_line = line.new(bar_index, close, bar_index + 20, close)
line target1_line = line.new(bar_index, close + target_len1, bar_index + 20, close + target_len1)
line target2_line = line.new(bar_index, close + target_len2, bar_index + 20, close + target_len2)
line target3_line = line.new(bar_index, close + target_len3, bar_index + 20, close + target_len3)
//在止損線和入場線之間填充
linefill.new(stop_loss_line, entry_line, color.new(dn_color, 95))
linefill.new(entry_line, target3_line, color.new(up_color, 95))
// 為趨勢目標繪製新標籤
label stop_loss_label = label.new(bar_index + 20, base, '止損價格: '+'⨷'+ str.tostring(math.round(base, 2)))
label entry_label = label.new(bar_index + 20, close, str.tostring(math.round(close, 2)))
label target1_label = label.new(bar_index + 20, close + target_len1, '停利⓵ - ' + str.tostring(math.round(close + target_len1, 2)))
label target2_label = label.new(bar_index + 20, close + target_len2, '停利⓶ - ' + str.tostring(math.round(close + target_len2, 2)))
label target3_label = label.new(bar_index + 20, close + target_len3, '停利⓷ - ' + str.tostring(math.round(close + target_len3, 2)))
//線條和標籤傳送到 UDT
targets.lines.push(stop_loss_line)
targets.lines.push(entry_line)
targets.lines.push(target1_line)
targets.lines.push(target2_line)
targets.lines.push(target3_line)
targets.labels.push(stop_loss_label)
targets.labels.push(entry_label)
targets.labels.push(target1_label)
targets.labels.push(target2_label)
targets.labels.push(target3_label)
// 更新標籤和線條的樣式
for lbl in targets.labels
int idx = targets.labels.indexof(lbl)
line line_ref = targets.lines.get(idx)
lbl.set_style(label.style_label_left)
lbl.set_color(color.rgb(179, 13, 225, 29))
lbl.set_textcolor(color.rgb(255, 254, 254))
line_ref.set_color(#db1e1e)
if signal2
// 清除現有的線條和標籤
for line_i in targets.lines
int i = targets.lines.indexof(line_i)
label.delete(targets.labels.get(i))
line.delete(line_i)
array.clear(targets.lines)
array.clear(targets.labels)
for line_i in targets.lines
int idx = targets.lines.indexof(line_i)
label lbl_ref = targets.labels.get(idx)
label first_label = targets.labels.first()
line entry_line = targets.lines.get(1)
label entry_label = targets.labels.get(1)
// 目標
if high >= line.get_y2(line_i) and low <= line.get_y2(line_i) and count > 1
lbl_ref.set_style(label.style_label_left)
lbl_ref.set_color(chart.fg_color)
lbl_ref.set_text(' ✔ 達標 ')
lbl_ref.set_textcolor(color.rgb(172, 9, 9))
line_i.set_style(line.style_dashed)
line_i.set_color(plot_color)
//停損
if high >= line.get_y2(targets.lines.first()) and low <= line.get_y2(targets.lines.first()) and count > 1
first_label.set_style(label.style_label_left)
first_label.set_color(color.rgb(172, 9, 9))
first_label.set_text(' ✖ 停損 ')
first_label.set_textcolor(color.rgb(172, 9, 9))
if direction ? trend : not trend
first_label.set_textcolor(color.rgb(250, 250, 250))
line_i.set_x2(bar_index + 20)
targets.lines.first().set_color(dn_color)
label.set_x(targets.labels.get(idx), bar_index + 20)
entry_line.set_style(line.style_solid)
entry_line.set_color(up_color)
entry_label.set_text('買進價格: ' + '◉ ' + str.tostring(math.round(line.get_y2(entry_line), 2)))
entry_label.set_color(#ddb01d)
entry_label.set_textcolor(#1d80dd)
// }
// 繪圖―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――{
// CALL 上升和下降趨勢
targets_down.draw_targets(signal_down, signal_up, false)
targets_up.draw_targets(signal_up, signal_down, true)
// 使用趨勢顏色繪製K線
plotcandle(open, high, low, close, title = 'Title', color = trend_color, wickcolor = trend_color, bordercolor = trend_color)
//繪製追蹤停損
p1 = plot(trend ? trend_value : na, style = plot.style_linebr, color = plot_color)
p2 = plot(not trend ? trend_value : na, style = plot.style_linebr, color = plot_color)
p0 = plot(hl2, display = display.none, editable = false)
fill(p1, p0, trend_value, hl2, color.new(chart.fg_color, 90), na)
fill(p2, p0, trend_value, hl2, color.new(chart.fg_color, 90), na)
// 在圖表上繪製訊號
float sigUp = signal_up ? low - atr_value * 2 : na
float sigDn = signal_down ? high + atr_value * 2 : na
plotshape(sigUp, '', shape.triangleup, location.absolute, up_color, size = size.tiny)
plotshape(sigUp, '', shape.triangleup, location.absolute, color.new(up_color, 80), size = size.small)
plotshape(sigDn, '', shape.triangledown, location.absolute, dn_color, size = size.tiny)
plotshape(sigDn, '', shape.triangledown, location.absolute, color.new(dn_color, 80), size = size.small)
// }