如何在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
相关产品推荐
相关产品推荐

