Pine Script中数组for循环未返回预期布尔值统计数的问题
Pine Script布尔值统计异常修复方案
你编写的Pine Script代码原本要统计默认设为true的7个输入项,但表格显示的是随品种和K线变化的5/6位大数,根本原因是变量初始化逻辑错误。
问题根源
代码中用var int tabNo = 0声明统计变量,var关键字会让变量在脚本启动时仅初始化一次,之后每根K线都会执行for循环累加tabNo,导致数值随K线数量持续增长,完全偏离预期的单次统计结果。
修复方案
有两种简单的修复方式:
方案1:每次统计前重置变量
移除var关键字,确保每根K线都重新统计:
//@version=5 indicator("test", overlay = true) var int maxPos = 20 // 输入项部分保持不变 pL01_S = input.bool(true, title="long pos 01", inline="L01-1", display=display.none) pL02_S = input.bool(true, title="long pos 02", inline="L02-1", display=display.none) pL03_S = input.bool(false, title="long pos 03", inline="L03-1", display=display.none) pL04_S = input.bool(false, title="long pos 04", inline="L04-1", display=display.none) pL05_S = input.bool(false, title="long pos 05", inline="L05-1", display=display.none) pL06_S = input.bool(false, title="long pos 06", inline="L06-1", display=display.none) pL07_S = input.bool(false, title="long pos 07", inline="L07-1", display=display.none) pL08_S = input.bool(false, title="long pos 08", inline="L08-1", display=display.none) pL09_S = input.bool(false, title="long pos 09", inline="L09-1", display=display.none) pL10_S = input.bool(false, title="long pos 10", inline="L10-1", display=display.none) pS01_S = input.bool(true, title="Short pos 01", inline="S01-1", display=display.none) pS02_S = input.bool(true, title="Short pos 02", inline="S02-1", display=display.none) pS03_S = input.bool(true, title="Short pos 03", inline="S03-1", display=display.none) pS04_S = input.bool(true, title="Short pos 04", inline="S04-1", display=display.none) pS05_S = input.bool(true, title="Short pos 05", inline="S05-1", display=display.none) pS06_S = input.bool(false, title="Short pos 06", inline="S06-1", display=display.none) pS07_S = input.bool(false, title="Short pos 07", inline="S07-1", display=display.none) pS08_S = input.bool(false, title="Short pos 08", inline="S08-1", display=display.none) pS09_S = input.bool(false, title="Short pos 09", inline="S09-1", display=display.none) pS10_S = input.bool(false, title="Short pos 10", inline="S10-1", display=display.none) pShow = array.new_bool(20, false) array.set(pShow, 0, pL01_S) array.set(pShow, 1, pL02_S) array.set(pShow, 2, pL03_S) array.set(pShow, 3, pL04_S) array.set(pShow, 4, pL05_S) array.set(pShow, 5, pL06_S) array.set(pShow, 6, pL07_S) array.set(pShow, 7, pL08_S) array.set(pShow, 8, pL09_S) array.set(pShow, 9, pL10_S) array.set(pShow, 10, pS01_S) array.set(pShow, 11, pS02_S) array.set(pShow, 12, pS03_S) array.set(pShow, 13, pS04_S) array.set(pShow, 14, pS05_S) array.set(pShow, 15, pS06_S) array.set(pShow, 16, pS07_S) array.set(pShow, 17, pS08_S) array.set(pShow, 18, pS09_S) array.set(pShow, 19, pS10_S) // 修复:每次统计前重置tabNo为0 int tabNo = 0 for i = 0 to maxPos - 1 if array.get(pShow, i) tabNo := tabNo + 1 pTab = table.new(position.top_center, 4, 1, bgcolor=color.new(color.black, 56), frame_color=color.new(color.blue, 80), frame_width=1, border_color=color.new(color.blue, 80),border_width=1) table.cell(pTab, 0, 0, text=str.tostring(tabNo))
方案2:用array.reduce简化统计(更高效)
直接用Pine Script内置的数组方法统计true的数量,避免手动循环:
//@version=5 indicator("test", overlay = true) var int maxPos = 20 // 输入项部分保持不变 pL01_S = input.bool(true, title="long pos 01", inline="L01-1", display=display.none) pL02_S = input.bool(true, title="long pos 02", inline="L02-1", display=display.none) pL03_S = input.bool(false, title="long pos 03", inline="L03-1", display=display.none) pL04_S = input.bool(false, title="long pos 04", inline="L04-1", display=display.none) pL05_S = input.bool(false, title="long pos 05", inline="L05-1", display=display.none) pL06_S = input.bool(false, title="long pos 06", inline="L06-1", display=display.none) pL07_S = input.bool(false, title="long pos 07", inline="L07-1", display=display.none) pL08_S = input.bool(false, title="long pos 08", inline="L08-1", display=display.none) pL09_S = input.bool(false, title="long pos 09", inline="L09-1", display=display.none) pL10_S = input.bool(false, title="long pos 10", inline="L10-1", display=display.none) pS01_S = input.bool(true, title="Short pos 01", inline="S01-1", display=display.none) pS02_S = input.bool(true, title="Short pos 02", inline="S02-1", display=display.none) pS03_S = input.bool(true, title="Short pos 03", inline="S03-1", display=display.none) pS04_S = input.bool(true, title="Short pos 04", inline="S04-1", display=display.none) pS05_S = input.bool(true, title="Short pos 05", inline="S05-1", display=display.none) pS06_S = input.bool(false, title="Short pos 06", inline="S06-1", display=display.none) pS07_S = input.bool(false, title="Short pos 07", inline="S07-1", display=display.none) pS08_S = input.bool(false, title="Short pos 08", inline="S08-1", display=display.none) pS09_S = input.bool(false, title="Short pos 09", inline="S09-1", display=display.none) pS10_S = input.bool(false, title="Short pos 10", inline="S10-1", display=display.none) pShow = array.new_bool(20, false) array.set(pShow, 0, pL01_S) array.set(pShow, 1, pL02_S) array.set(pShow, 2, pL03_S) array.set(pShow, 3, pL04_S) array.set(pShow, 4, pL05_S) array.set(pShow, 5, pL06_S) array.set(pShow, 6, pL07_S) array.set(pShow, 7, pL08_S) array.set(pShow, 8, pL09_S) array.set(pShow, 9, pL10_S) array.set(pShow, 10, pS01_S) array.set(pShow, 11, pS02_S) array.set(pShow, 12, pS03_S) array.set(pShow, 13, pS04_S) array.set(pShow, 14, pS05_S) array.set(pShow, 15, pS06_S) array.set(pShow, 16, pS07_S) array.set(pShow, 17, pS08_S) array.set(pShow, 18, pS09_S) array.set(pShow, 19, pS10_S) // 修复:用array.reduce统计true的数量 countTrue = array.reduce((acc, val) => acc + val, pShow, 0) pTab = table.new(position.top_center, 4, 1, bgcolor=color.new(color.black, 56), frame_color=color.new(color.blue, 80), frame_width=1, border_color=color.new(color.blue, 80),border_width=1) table.cell(pTab, 0, 0, text=str.tostring(countTrue))
效果验证
修复后,表格会稳定显示7,不会随K线或品种变化,符合预期的布尔值统计结果。
内容的提问来源于stack exchange,提问作者hally hush
相关产品推荐
相关产品推荐

