基于Pine Script dynamic_requests的多标的价格批量绘图需求问询
多标的价格批量绘制解决方案(Pine Script v5)
问题背景
使用Pine Script的dynamic_requests功能绘制多标的价格时,手动创建变量+逐个调用plot()的暴力法可行,但希望用更简洁的批量方式实现。尝试用plotchar配合循环时,仅能显示最后一个标的的数值,且已知plot()无法在循环内直接调用。
核心原因
- 原代码用单值数组存储数据,仅保留当前bar的价格,循环赋值时会不断覆盖变量,最终只留下最后一个标的的当前值。
- Pine Script的
plot()属于编译时函数,无法在运行时循环中动态创建绘图元素。
解决方案
关键思路
- 使用序列数组存储每个标的的完整价格序列(而非单值),确保历史价格被完整保留。
- 通过数组索引配合
plot()实现批量绘制,或预先创建足够多的plot()并通过display参数控制显示状态,适配动态数量的标的。
固定数量标的实现(简洁版)
//@version=5 indicator("Dynamic Requests Plotting", dynamic_requests = true, format = format.price) // 配置标的列表与对应颜色 var array<string> symbols = array.from("KAS", "GLMR", "DOGE", "POLYX") var array<color> plotColors = array.from(color.yellow, color.gray, color.teal, color.maroon) // 存储每个标的的完整价格序列 var array<series<float>> symbolPrices = array.new<series<float>>() // 批量请求标的数据 if barstate.islast array.clear(symbolPrices) for sym in symbols // 存储完整价格序列,而非单值 series<float> price = request.security("BYBIT:" + sym + "USDT.P", timeframe.period, close) array.push(symbolPrices, price) // 批量绘制:通过数组索引调用plot,避免手动创建变量 if array.size(symbolPrices) > 0 plot(array.get(symbolPrices, 0), array.get(symbols, 0), color=array.get(plotColors, 0), linewidth=1) if array.size(symbolPrices) > 1 plot(array.get(symbolPrices, 1), array.get(symbols, 1), color=array.get(plotColors, 1), linewidth=1) if array.size(symbolPrices) > 2 plot(array.get(symbolPrices, 2), array.get(symbols, 2), color=array.get(plotColors, 2), linewidth=1) if array.size(symbolPrices) > 3 plot(array.get(symbolPrices, 3), array.get(symbols, 3), color=array.get(plotColors, 3), linewidth=1)
动态数量标的实现(适配任意数量)
如果需要后续动态添加标的,可预先创建最多64个plot()(Pine Script允许的最大绘图数),通过条件判断控制显示:
//@version=5 indicator("Dynamic Requests Plotting", dynamic_requests = true, format = format.price) // 可动态修改的标的列表 var array<string> symbols = array.from("KAS", "GLMR", "DOGE", "POLYX") // 自动生成渐变颜色(也可手动指定) var array<color> plotColors = array.new<color>() if array.size(plotColors) == 0 for i = 0 to array.size(symbols)-1 array.push(plotColors, color.from_gradient(i, 0, array.size(symbols)-1)) // 存储每个标的的完整价格序列 var array<series<float>> symbolPrices = array.new<series<float>>() // 批量请求标的数据 if barstate.islast array.clear(symbolPrices) for sym in symbols series<float> price = request.security("BYBIT:" + sym + "USDT.P", timeframe.period, close) array.push(symbolPrices, price) // 预先创建最多64个plot,根据标的数量控制显示 max_plots = 64 for i = 0 to max_plots-1 plot( // 仅当存在对应标的时返回价格序列,否则返回na i < array.size(symbolPrices) ? array.get(symbolPrices, i) : na, title = i < array.size(symbols) ? array.get(symbols, i) : "", color = i < array.size(plotColors) ? array.get(plotColors, i) : na, linewidth = 1, // 隐藏未使用的plot display = i < array.size(symbolPrices) ? display.data : display.none )
说明
- 序列数组
array<series<float>>确保每个标的的历史价格都被完整存储,解决了循环赋值覆盖的问题。 - 动态数量方案中,
display = display.none会隐藏未使用的绘图元素,避免界面冗余。 - 颜色可手动指定或通过渐变自动生成,适配不同数量的标的需求。
内容的提问来源于stack exchange,提问作者Arby
相关产品推荐
相关产品推荐

