如何将Pinescript时间输入匹配到正确Bar Index并修复趋势线绘制异常
问题根因
线条缺失本质是Pine Script逐K线从左到右计算的特性导致的:在未运行到x2时间对应的K线时,你写的循环逻辑拿不到start_x2_bar的有效值,所以斜率、y值计算结果全为na,x1到x2区间的线条自然无法渲染。另外自定义循环匹配时间的方式性能差,还容易出现匹配偏差。
修复后完整代码
//@version=5 indicator("My Trend Line Script For Webhook", overlay=true) start_x1_time = input.time(title="S Time/Profit #1", defval=(timestamp("06 Nov 2021 04:30 +0000")), inline = "start", group = "Start Position Trend Line", confirm=(true)) start_y1 = input.price(title="", defval=0.2, inline = "start", group = "Start Position Trend Line", confirm=(true)) start_x2_time = input.time(title="S Time/Profit #2", defval=(timestamp("07 Nov 2021 04:30 +0000")), inline = "start2", group = "Start Position Trend Line", confirm=(true)) start_y2 = input.price(title="", defval=0.3, inline = "start2", group = "Start Position Trend Line", confirm=(true)) // 直接用内置函数匹配时间对应Bar索引,不需要循环 start_x1_bar = ta.valuewhen(time == start_x1_time, bar_index, 0) start_x2_bar = ta.valuewhen(time == start_x2_time, bar_index, 0) // 用var存储斜率和截距,计算一次永久生效 var float res_m = na var float res_b = na if not na(start_x1_bar) and not na(start_x2_bar) res_m := (start_y2 - start_y1) / (start_x2_bar - start_x1_bar) res_b := start_y1 - res_m * start_x1_bar // 计算当前K线对应的趋势线y值,仅在x1-x2区间返回有效值 res_y = not na(res_m) and bar_index >= start_x1_bar and bar_index <= start_x2_bar ? res_m * bar_index + res_b : na plot(res_y, color=color.red, title='Trendline Price Value', linewidth=1)
核心调整点
- 替换自定义循环逻辑,用Pine Script内置
ta.valuewhen()函数直接匹配时间对应的Bar索引,准确率更高、性能更好 - 用
var关键字存储斜率、截距计算结果,只要两个时间点的Bar索引都匹配成功就会永久存储有效值,不会受K线计算顺序影响,x1到x2区间的所有K线都能拿到正确的y值 - plot函数添加了显示范围限制,仅在bar_index处于x1和x2之间时渲染线条,避免区间外出现多余线条
原问题异常效果图

内容的提问来源于stack exchange,提问作者Richard Barr
相关产品推荐
相关产品推荐

