Pine Script for循环三态计数器实现及array.push类型报错咨询
三态循环计数器优化方案
原代码的逻辑问题
你初始写的计数器存在多处逻辑bug:
- 分支判断存在断层:流转逻辑为
count=0时赋值为1,count=1时赋值为2,没有触发count=2状态的路径,导致后续归零的分支永远无法触发,计数器会永久停在2,无法完成三态循环。 - 部分判断条件疑似混淆了赋值操作和等值判断:比如
else if (count = 3)是将count赋值为3,不是判断count是否等于3,会进一步打乱计数逻辑。 - 你需要实现的1-4-7、2-5-8、3-6-9序列识别,本质是周期为3的循环状态轮转,完全不需要靠嵌套if分支实现,用取余运算即可无分支完成状态判断,代码更简洁也不会漏分支。
优化后的计数器实现
核心逻辑:每次循环计数器自增后对3取余,即可直接得到当前所处的循环状态,自然匹配每3次一个周期的序列识别需求:
count = 0 MyVariable = 0 for h = 0 to 10 # 状态自动轮转,替代所有if分支判断 count := (count + 1) % 3 # 匹配对应状态的变量值 MyVariable := switch count == 1 => 5 count == 2 => 10 count == 0 => 18
这个逻辑的状态流转是:第1/4/7次循环对应count=1,第2/5/8次循环对应count=2,第3/6/9次循环对应count=0,完全匹配你提出的序列识别要求。
if块返回类型不兼容报错解决方案
报错根源
该报错来自Pine Script的强类型校验规则:多分支if/else if结构中,所有分支的返回值类型必须完全统一。
你遇到的类型不匹配提示void; series[integer]; series[integer],本质是代码中存在悬空的函数返回值:
array.push()函数本身是有返回值的(返回新的数组长度,类型为series[integer]),如果直接调用不接收它的返回值,Pine会将这个返回值作为当前if分支的返回值;- 而其他分支中如果没有带返回值的表达式,分支类型就是
void,最终出现不同分支返回值类型不一致的报错。
修复方法
- 统一if结构的返回值类型:对所有有返回值的函数调用,显式将返回值赋值给临时变量,避免悬空返回值。比如将
array.push(Ptest,"Test")修改为_push_result = array.push(Ptest,"Test"),此时整个if结构所有分支都没有返回值,类型统一为void。 - 用优化后的取余计数逻辑替代原来的if/else if分支,从根源上减少分支结构的类型校验问题。
修复后的参考代码
array.sort(PDelta) plot(array.size(PDelta)) _valore = "" Count = 1 Ptest = array.new_string() # 遍历PDelta数组 for j = 0 to (i_size)-1 _value = array.get(PDelta,j) # 内层遍历 for h = 0 to (i_size)-1 # 自动实现1→2→3→1的轮转,替代原有的if/else if判断 Count := (Count % 3) + 1 # 显式接住array.push的返回值,避免类型不兼容 _push_res = array.push(Ptest, "Test")
内容的提问来源于stack exchange,提问作者Maxim
相关产品推荐
相关产品推荐

