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

如何在TradingView Pine Script中用数组与循环实现多标的动态指标

实现支持动态数量标的的Multi Squeeze指标(Pine Script v5)

原指标需要手动逐个添加标的输入,以下是修改后的代码,通过数组和for循环实现动态数量标的的支持,无需手动添加多个input.symbol:

//@version=5
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ebfsantos

indicator(title='Multi Squeeze for Power Plays', shorttitle='Multi-SQZ', overlay=false)

// 输入设置:用逗号分隔的标的字符串,替代单个标的输入
symbols_input = input.string("XLK,SMH,XLV,XLF,XLC,NVDA,AAPL,MSFT", title="Symbols (comma-separated)")
length = input(20, title="Length")

// 初始化数组存储标的
var string[] symbols_array = array.new_string()

// 拆分输入字符串到数组(仅在输入变化时执行)
if barstate.islast and symbols_input != array.join(symbols_array, ",")
    array.clear(symbols_array)
    symbol_list = str.split(symbols_input, ",")
    for sym in symbol_list
        array.push(symbols_array, str.trim(sym))

// 遍历数组处理每个标的
for i = 0 to array.size(symbols_array) - 1
    sym = array.get(symbols_array, i)
    // 获取标的数据
    sym_close = request.security(sym, timeframe.period, close)
    sym_tr_sma = request.security(sym, timeframe.period, ta.sma(ta.tr, length))
    
    // 计算指标值
    ma = ta.sma(sym_close, length)
    devBB = ta.stdev(sym_close, length)
    
    // Bollinger Bands 2x
    upBB = ma + devBB * 2
    lowBB = ma - devBB * 2
    
    // Keltner Channels 不同倍数
    upKCWide = ma + sym_tr_sma * 2
    lowKCWide = ma - sym_tr_sma * 2
    upKCNormal = ma + sym_tr_sma * 1.5
    lowKCNormal = ma - sym_tr_sma * 1.5
    upKCNarrow = ma + sym_tr_sma
    lowKCNarrow = ma - sym_tr_sma
    
    // 判断挤压状态
    sqzOnWide = lowBB >= lowKCWide and upBB <= upKCWide
    sqzOnNormal = lowBB >= lowKCNormal and upBB <= upKCNormal
    sqzOnNarrow = lowBB >= lowKCNarrow and upBB <= upKCNarrow
    sqzOffWide = lowBB < lowKCWide and upBB > upKCWide
    noSqz = not sqzOnWide and not sqzOffWide
    
    // 定义颜色
    color_1 = color.new(#ffffff, 0)
    color_2 = color.new(#27c5fd, 0)
    color_3 = color.new(#0c5974, 0)
    color_4 = color.new(#1a233c, 90)
    
    sq_color = noSqz ? color.blue : sqzOnNarrow ? color_1 : sqzOnNormal ? color_2 : sqzOnWide ? color_3 : color_4
    
    // 绘制每个标的的挤压状态点,用i+1区分不同标的的垂直位置
    plot(i + 1, title=str.format("SQZ - {0}", sym), color=sq_color, style=plot.style_circles, linewidth=2)

关键修改说明

  • 动态标的输入:用input.string接收逗号分隔的标的代码,替代原有的多个input.symbol,无需手动添加N个输入项
  • 数组存储标的:将输入的字符串拆分为数组,方便遍历处理
  • 循环遍历处理:通过for循环遍历数组中的每个标的,重复执行挤压指标的计算逻辑
  • 区分标的显示:每个标的的挤压点绘制在不同的垂直位置(i+1),避免重叠,方便查看每个标的的状态

使用提示

  • 输入标的时用逗号分隔,比如XLK,SMH,AAPL,可以随时添加或删除标的
  • 注意request.security的调用次数会随标的数量增加,过多标的可能导致指标加载变慢,建议控制标的数量在合理范围内

内容的提问来源于stack exchange,提问作者Emanuel Santos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:51:17