You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Pine Script dynamic_requests的多标的价格批量绘图需求问询

多标的价格批量绘制解决方案(Pine Script v5)

问题背景

使用Pine Script的dynamic_requests功能绘制多标的价格时,手动创建变量+逐个调用plot()的暴力法可行,但希望用更简洁的批量方式实现。尝试用plotchar配合循环时,仅能显示最后一个标的的数值,且已知plot()无法在循环内直接调用。

核心原因

  1. 原代码用单值数组存储数据,仅保留当前bar的价格,循环赋值时会不断覆盖变量,最终只留下最后一个标的的当前值。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 16:08:13