如何修改TradingView ATH指标脚本以新增周期最低值及高低区间展示功能
支持周期高低区间标注的Pine Script实现
- 保留原脚本所有原有功能(ATH标注、突破信号、高低位画线)
- 新增同统计周期的*历史最低价位(ATL)*追踪逻辑,统计周期和设定的回溯年数完全一致
- 标注标签同步展示周期最高值、周期最低值、高低区间差值,以及对应价位的出现日期、距当前K线的天数
indicator("回溯周期高低区间标注", overlay = true) num_years = input.int(1, title = "回溯年数", minval = 1) // 追踪历史最高ATH var float ATH = high var int ATH_time = time var float[] ATH_vals = array.new_float() var int[] ATH_time_vals = array.new_int() var int[] ATH_time_change_vals = array.new_int() ATH := math.max(ATH, high) if ta.change(ATH) != 0 ATH_time := time array.unshift(ATH_vals, ATH) array.unshift(ATH_time_vals, time) array.unshift(ATH_time_change_vals, ATH_time) // 新增追踪历史最低ATL var float ATL = low var int ATL_time = time var float[] ATL_vals = array.new_float() var int[] ATL_time_vals = array.new_int() var int[] ATL_time_change_vals = array.new_int() ATL := math.min(ATL, low) if ta.change(ATL) != 0 ATL_time := time array.unshift(ATL_vals, ATL) array.unshift(ATL_time_vals, time) array.unshift(ATL_time_change_vals, ATL_time) var float ATH1Y = na var float ATL1Y = na if barstate.isconfirmed search_time = time - 31536000000 * num_years // 查找周期内最高值 for i = 0 to array.size(ATH_time_vals) - 1 if array.get(ATH_time_vals, i) < search_time ATH1Y := array.get(ATH_vals, i) ATH1Y_time = array.get(ATH_time_change_vals, i) break // 查找周期内最低值 for i = 0 to array.size(ATL_time_vals) - 1 if array.get(ATL_time_vals, i) < search_time ATL1Y := array.get(ATL_vals, i) ATL1Y_time = array.get(ATL_time_change_vals, i) break // 拼接标签文本 if not na(ATH1Y) and not na(ATL1Y) // ATH相关文本 ay = year(ATH1Y_time) am = month(ATH1Y_time) ad = dayofmonth(ATH1Y_time) adays_ago = (time - ATH1Y_time) / 86400000 // ATL相关文本 iy = year(ATL1Y_time) im = month(ATL1Y_time) id = dayofmonth(ATL1Y_time) idays_ago = (time - ATL1Y_time) / 86400000 // 区间值 range_val = ATH1Y - ATL1Y date_text = str.tostring(ay) + "/" + str.tostring(am) + "/" + str.tostring(ad) + " 周期最高 : " + str.tostring(ATH1Y) + "\n距今天数 : " + str.tostring(math.round(adays_ago, 2)) + "\n" + str.tostring(iy) + "/" + str.tostring(im) + "/" + str.tostring(id) + " 周期最低 : " + str.tostring(ATL1Y) + "\n距今天数 : " + str.tostring(math.round(idays_ago, 2)) + "\n高低区间值 : " + str.tostring(math.round(range_val, 2)) if ATH > ATH1Y and ATH[3] <= ATH1Y[3] label.new(x = bar_index[3], y = ATH[3], text = date_text, style = label.style_label_lower_right) ATH_val = ATH > ATH1Y ? na : ATH1Y ATL_val = ATL < ATL1Y ? na : ATL1Y buy_signal = ATH > ATH1Y and ATH[3] <= ATH1Y[3] plotshape(buy_signal, color = color.green, location = location.belowbar, size = size.small, style = shape.triangleup) plot(ATH_val, title = "周期最高", style = plot.style_linebr, color = color.new(color.green, 0)) plot(ATL_val, title = "周期最低", style = plot.style_linebr, color = color.new(color.red, 0))
内容的提问来源于stack exchange,提问作者Alex Fx
相关产品推荐
相关产品推荐

