Pine Script条件判断异常:无法正确识别Bar 2的Imbalance问题
问题分析与修复
核心错误点
var关键字误用导致变量不更新- 定义
ib时用了var int ib = find_imbalance(...),var修饰的变量只会在脚本首次执行时初始化一次,后续K线不会重新调用函数计算新值,因此ib始终保持初始的0,触发else分支。 find_imbalance函数内的var int rv = 0同样错误:var让rv不会在每次调用函数时重置为0,会保留上一次的计算结果,导致逻辑判断混乱。
- 定义
参数对应逻辑(可选优化)
从日志数值看,bar[3].low = 5263.25,bar[1].high = 5263,满足l3 > h1的空失衡条件,但因var问题未生效。若你的目标是检测**Bar2(当前K线往前数第2根)**的失衡,当前参数high[1]和high[3]的对应关系可能不符合预期,需根据你的失衡定义调整。
修复后的代码
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © myself //@version=5 indicator("My first try", overlay=true) find_imbalance(h1, h3, l1, l3) => int rv = 0 // 移除var,每次调用重置为0 if h3 < l1 rv := 1 if l3 > h1 rv := -1 rv var label myLabel = label.new(bar_index, high + ta.tr, textcolor=color.white, color=color.blue) if barstate.islast log.info("{0} - cur: h={1}, l={2}, bar[1]: h={3}, l={4} bar[3]: h={5}, l={6}", bar_index, high, low, high[1], low[1], high[3], low[3]) label.set_x(myLabel, bar_index) label.set_y(myLabel, high + ta.tr) int ib = find_imbalance(high[1], high[3], low[1], low[3]) // 移除var,每次重新计算 if ib > 0 label.set_text(myLabel, text="Imbalance Long") else if ib < 0 label.set_text(myLabel, text="Imbalance Short") else label.set_text(myLabel, text="Bars on\nthe chart:\n" + str.tostring(bar_index + 1))
修复说明
- 移除
find_imbalance函数内rv的var修饰,确保每次调用函数时从0开始判断。 - 移除
ib变量的var修饰,让每根最后K线都重新计算当前失衡状态。 - 若需检测Bar2的失衡,可根据你的失衡定义调整参数,比如改为
find_imbalance(high[2], high[0], low[2], low[0])(对应Bar2与前后K线的缺口关系)。
内容的提问来源于stack exchange,提问作者unknown
相关产品推荐
相关产品推荐

