Pine Script数组访问语法错误及替代实现方案咨询
问题解决:Pine Script数组语法错误及替代实现
错误原因
你遇到的Error at 10:0 Syntax error at input '['是因为Pine Script v4不支持用方括号[]直接访问数组元素,必须使用官方提供的数组操作函数。同时你定义标的列表的方式不符合v4的数组规范,需要用专门的字符串数组API创建和操作。
修改后的正确代码
以下是修复数组语法、修正逻辑错误后的完整代码:
//@version=4 study("Buy Now", overlay=true) // 输入参数 poleLength = input(title="Pole Length", type=input.integer, defval=30) flagLength = input(title="Flag Length", type=input.integer, defval=10) threshold = input(title="Percentage Threshold", type=input.float, defval=2.0, step=0.1) // 定义要分析的标的数组(Pine Script v4 标准写法) var stocks = array.new_string(3) if barstate.isfirst array.set(stocks, 0, "COINBASE:LTCUSD") array.set(stocks, 1, "COINBASE:ETCUSD") array.set(stocks, 2, "COINBASE:BTCUSD") // 遍历数组中的每个标的 for i = 0 to array.size(stocks)-1 current_ticker = array.get(stocks, i) // 加载当前标的的15分钟收盘价 price = security(current_ticker, "15", close) // 识别看涨旗形形态 poleHigh = highest(price, poleLength) flagLow = lowest(price, flagLength) flagHigh = highest(price, flagLength) // 修正阈值计算逻辑:原代码用poleLength计算百分比,改为用极点高点的百分比 pattern = poleHigh > flagHigh and (poleHigh - flagLow) > (poleHigh * threshold / 100) // 计算目标价 target = pattern ? flagHigh + (flagHigh - flagLow) : na // 触发警报(用遍历的标的名代替当前图表标的) if pattern alert("Buy: " + current_ticker + " at "+ tostring(price,'#.##') +" and sell at " + tostring(target, "#.##") + " for profit "+ tostring((target-price), "#.##"))
关键修改点
- 用
var array.new_string()创建字符串数组,barstate.isfirst确保仅初始化一次 - 用
array.get(stocks, i)替代stocks[i]获取数组元素 - 修正阈值计算逻辑,原逻辑不符合百分比阈值的实际意义
- 警报中使用
current_ticker代替syminfo.ticker,确保显示的是触发形态的标的
替代实现方案
方案1:输入选择器(适合手动切换标的)
如果不需要自动遍历,而是手动选择单个标的分析,这种方式更简洁,避免循环的性能开销:
//@version=4 study("Buy Now Single Ticker", overlay=true) // 输入参数 poleLength = input(title="Pole Length", type=input.integer, defval=30) flagLength = input(title="Flag Length", type=input.integer, defval=10) threshold = input(title="Percentage Threshold", type=input.float, defval=2.0, step=0.1) // 做成下拉选择器,手动切换标的 current_ticker = input(title="Select Ticker", type=input.string, defval="COINBASE:LTCUSD", options=["COINBASE:LTCUSD", "COINBASE:ETCUSD", "COINBASE:BTCUSD"]) // 加载价格数据 price = security(current_ticker, "15", close) // 识别看涨旗形形态 poleHigh = highest(price, poleLength) flagLow = lowest(price, flagLength) flagHigh = highest(price, flagLength) pattern = poleHigh > flagHigh and (poleHigh - flagLow) > (poleHigh * threshold / 100) // 计算目标价 target = pattern ? flagHigh + (flagHigh - flagLow) : na // 触发警报 if pattern alert("Buy: " + current_ticker + " at "+ tostring(price,'#.##') +" and sell at " + tostring(target, "#.##") + " for profit "+ tostring((target-price), "#.##"))
方案2:函数封装逻辑(提高代码复用性)
把形态识别和目标价计算逻辑封装成函数,便于后续扩展和维护:
//@version=4 study("Buy Now with Function", overlay=true) // 封装看涨旗形识别函数 isBullishFlag(price, poleLen, flagLen, threshold) => poleHigh = highest(price, poleLen) flagLow = lowest(price, flagLen) flagHigh = highest(price, flagLen) poleHigh > flagHigh and (poleHigh - flagLow) > (poleHigh * threshold / 100) // 封装目标价计算函数 getTargetPrice(price, flagLen) => flagLow = lowest(price, flagLen) flagHigh = highest(price, flagLen) flagHigh + (flagHigh - flagLow) // 输入参数 poleLength = input(title="Pole Length", type=input.integer, defval=30) flagLength = input(title="Flag Length", type=input.integer, defval=10) threshold = input(title="Percentage Threshold", type=input.float, defval=2.0, step=0.1) // 标的数组 var stocks = array.new_string(3) if barstate.isfirst array.set(stocks, 0, "COINBASE:LTCUSD") array.set(stocks, 1, "COINBASE:ETCUSD") array.set(stocks, 2, "COINBASE:BTCUSD") // 遍历处理每个标的 for i = 0 to array.size(stocks)-1 ticker = array.get(stocks, i) price = security(ticker, "15", close) pattern = isBullishFlag(price, poleLength, flagLength, threshold) target = pattern ? getTargetPrice(price, flagLength) : na if pattern alert("Buy: " + ticker + " at "+ tostring(price,'#.##') +" and sell at " + tostring(target, "#.##") + " for profit "+ tostring((target-price), "#.##"))
内容的提问来源于stack exchange,提问作者Kurkula
相关产品推荐
相关产品推荐

