如何绘制Pine Script中for循环迭代的最后一个值?
问题:函数返回值为na导致数据窗口显示0.00
我在drawOrderBlocks函数中初始化了lastBarHigh,用于获取for循环迭代的最后一个值并返回,期望在数据窗口显示该值,但实际显示为0.00。经排查,函数返回值类型为na,尽管已在for循环中为其赋值。
原代码
drawOrderBlocks(bool internal = false) => float lastBarHigh = na array<orderBlock> orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks orderBlocksSize = orderBlocks.size() if orderBlocksSize > 0 maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput array<orderBlock> parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize)) array<box> b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes for [index,eachOrderBlock] in parsedOrdeBlocks lastBarHigh := eachOrderBlock.barHigh orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor) box b_ox = b_oxes.get(index) b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh)) b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow)) b_ox.set_border_color( internal ? na : orderBlockColor) b_ox.set_bgcolor( orderBlockColor) lastBarHigh float lastHigh = drawOrderBlocks() plot(na(lastHigh)?0:lastHigh,title = "barHigh",color =color.red,display = display.data_window)
问题原因
- 初始值未覆盖全分支:
lastBarHigh初始化为na,当orderBlocksSize为0时,if分支不会执行,lastBarHigh保持na状态。 - plot转换逻辑导致显示0:代码中用
na(lastHigh)?0:lastHigh将na强制转换为0,最终数据窗口显示0.00。 - 潜在空数组风险:如果
parsedOrdeBlocks是空数组(比如maxOrderBlocks设为0),for循环不会执行,lastBarHigh同样会是na。
修复方案
给lastBarHigh设置合理初始值,并在返回前兜底处理na情况,避免无意义的0值:
drawOrderBlocks(bool internal = false) => float lastBarHigh = close // 用当前K线收盘价作为初始值,避免na array<orderBlock> orderBlocks = internal ? internalOrderBlocks : swingOrderBlocks orderBlocksSize = orderBlocks.size() if orderBlocksSize > 0 maxOrderBlocks = internal ? internalOrderBlocksSizeInput : swingOrderBlocksSizeInput array<orderBlock> parsedOrdeBlocks = orderBlocks.slice(0, math.min(maxOrderBlocks,orderBlocksSize)) array<box> b_oxes = internal ? internalOrderBlocksBoxes : swingOrderBlocksBoxes for [index,eachOrderBlock] in parsedOrdeBlocks lastBarHigh := eachOrderBlock.barHigh orderBlockColor = styleInput == MONOCHROME ? (eachOrderBlock.bias == BEARISH ? color.new(MONO_BEARISH,80) : color.new(MONO_BULLISH,80)) : internal ? (eachOrderBlock.bias == BEARISH ? internalBearishOrderBlockColor : internalBullishOrderBlockColor) : (eachOrderBlock.bias == BEARISH ? swingBearishOrderBlockColor : swingBullishOrderBlockColor) box b_ox = b_oxes.get(index) b_ox.set_top_left_point( chart.point.new(eachOrderBlock.barTime,na,eachOrderBlock.barHigh)) b_ox.set_bottom_right_point(chart.point.new(last_bar_time,na,eachOrderBlock.barLow)) b_ox.set_border_color( internal ? na : orderBlockColor) b_ox.set_bgcolor( orderBlockColor) // 兜底处理:如果仍为na则返回当前收盘价 na(lastBarHigh) ? close : lastBarHigh float lastHigh = drawOrderBlocks() // 直接plot处理后的lastHigh,无需再转0 plot(lastHigh, title = "barHigh", color = color.red, display = display.data_window)
修改说明
- 将
lastBarHigh初始值设为close,确保即使没有进入if分支,也有合理数值返回。 - 在函数返回前增加判断,若
lastBarHigh仍为na,则返回当前收盘价作为兜底。 - 去掉plot语句中的
na(lastHigh)?0:lastHigh,直接显示处理后的有效数值,避免无意义的0值。
内容的提问来源于stack exchange,提问作者Konidoni Ravirr
相关产品推荐
相关产品推荐

