Pine Script新手求助:第11行for语句报错,预期'to <expression>'
问题根源与解决方案
1. 核心错误原因
你定义的djia_tickers是逗号分隔的字符串序列,而非Pine Script要求的数组类型。array.size()函数仅能作用于数组,传入非数组值会导致表达式无效,进而触发for循环的语法错误。
2. 修正步骤
步骤1:将字符串序列转为数组
把djia_tickers的定义改为用array.from()创建数组:
djia_tickers = array.from("AAPL", "MSFT", "JPM", "V", "GS", "DIS", "HD", "INTC", "MCD", "BA","UNH", "KO", "WMT", "PG", "AXP", "CAT", "CVX", "IBM", "MRK", "CSCO","XOM", "COST", "PFE", "TRV", "MMM", "AMGN", "WBA", "HON", "CRM", "NKE", "DD")
步骤2:修正逻辑错误(关键)
原代码中if close < sma_stock使用的是当前图表的收盘价,而非目标股票的收盘价,会导致判断逻辑错误。需改为获取目标股票的收盘价:
stock_close = request.security(ticker, "D", close) if stock_close < sma_stock stocks_below_sma := stocks_below_sma + 1
步骤3:完整修正后的代码
indicator("DIA ETF: 25% or Fewer Stocks Below 20-Day SMA", overlay=true) // 修正:将字符串序列转为数组 djia_tickers = array.from("AAPL", "MSFT", "JPM", "V", "GS", "DIS", "HD", "INTC", "MCD", "BA","UNH", "KO", "WMT", "PG", "AXP", "CAT", "CVX", "IBM", "MRK", "CSCO","XOM", "COST", "PFE", "TRV", "MMM", "AMGN", "WBA", "HON", "CRM", "NKE", "DD") sma_length = 20 stocks_below_sma = 0 // 现在array.size()可正常作用于数组,for循环语法合法 for i = 0 to array.size(djia_tickers) - 1 ticker = array.get(djia_tickers, i) // 一次性获取目标股票的收盘价和SMA,提升效率 [stock_close, sma_stock] = request.security(ticker, "D", [close, ta.sma(close, sma_length)]) if stock_close < sma_stock stocks_below_sma := stocks_below_sma + 1 percent_below_sma = (stocks_below_sma / array.size(djia_tickers)) * 100 condition = percent_below_sma <= 25 plotshape(series=condition, location=location.belowbar, color=color.red, style=shape.labeldown, title="25% or Fewer Stocks Below 20-Day SMA", text="25% Below SMA") barcolor(condition ? color.red : na)
3. 额外说明
- Pine Script中,数组需通过
array.new_*()或array.from()显式创建,直接逗号分隔的字符串是元组类型,不支持数组操作函数。 request.security()一次性获取多个值(如示例中的收盘价和SMA),可减少网络请求次数,提升脚本运行效率。
内容的提问来源于stack exchange,提问作者Guz
相关产品推荐
相关产品推荐

