条件存为数组时plotshape的替代方案及循环使用方法咨询
针对数组存储条件的plotshape替代方案建议
方案1:将数组转为Series,直接复用plotshape
plotshape本身是矢量化函数,只需把数组中存储的条件映射为对应K线的Series值,就能一次调用完成所有绘制,这是最贴近你原有需求的方案。
假设你的数组按K线索引顺序存储(索引0对应最早的K线,bar_count-1对应最新K线),可以这样实现:
// 初始化存储条件的数组 var array<bool> conditionArray = array.new_bool() // 示例:每次新K线生成时,计算条件并存入数组(替换为你的实际逻辑) if barstate.isnew currentCondition = ta.close > ta.open // 示例条件 array.push(conditionArray, currentCondition) // 将数组转为对应K线的Series conditionSeries = na if bar_index < array.size(conditionArray) conditionSeries := array.get(conditionArray, bar_index) // 直接调用plotshape,参数和你原来的一致 plotshape(conditionSeries, style=shape.triangledown, location=location.abovebar, color=color.new(color.blue,50), offset=-1, size=size.auto)
注意:如果数组存储顺序是“最新条件在数组末尾”,且bar_index从0开始递增,上述逻辑可以直接对应每个K线的条件。
方案2:优化label.new参数,贴近plotshape的简洁效果
如果你坚持用label,通过调整参数可以让它的显示效果和plotshape几乎一致:
var array<bool> conditionArray = array.new_bool() if barstate.isnew currentCondition = ta.close > ta.open // 示例条件 array.push(conditionArray, currentCondition) // 遍历需要绘制的历史条件(这里以当前K线的前一个bar为例,对应offset=-1) targetBarIdx = bar_index - 1 if targetBarIdx >= 0 and array.get(conditionArray, targetBarIdx) // 创建无边框、无背景的三角形label label.new(bar_index=targetBarIdx, y=high[1], style=label.style_triangledown, color=color.new(color.blue,50), textcolor=color.new(color.blue,50), size=size.small, border_color=na, background_color=na)
关键调整:
- 使用
label.style_triangledown匹配plotshape的形状 - 设置
border_color=na和background_color=na去掉多余边框背景 - 调整
size和color参数和原plotshape一致
方案3:用数组管理label实例,避免重复创建
循环创建label容易导致内存占用过高,用数组存储已创建的label,定期清理旧实例:
var array<bool> conditionArray = array.new_bool() var array<label> shapeLabels = array.new_label() if barstate.isnew currentCondition = ta.close > ta.open // 示例条件 array.push(conditionArray, currentCondition) // 检查当前条件是否需要绘制(对应offset=-1的前一个bar) if currentCondition newLabel = label.new(bar_index=bar_index-1, y=high[1], style=label.style_triangledown, color=color.new(color.blue,50), textcolor=color.new(color.blue,50), size=size.small, border_color=na, background_color=na) array.push(shapeLabels, newLabel) // 清理超过数量上限的旧label,避免内存溢出 if array.size(shapeLabels) > 50 label.delete(array.shift(shapeLabels))
关于循环调用plotshape的说明
plotshape是矢量化函数,一次调用会处理所有K线的条件。循环中调用plotshape会导致每个循环生成一个独立的shape系列,不仅会重复绘制图形,还会降低脚本运行效率,因此不建议这么做。
内容的提问来源于stack exchange,提问作者sey eeet
相关产品推荐
相关产品推荐

