如何修复Pine Script v5中数组赋值的'='语法错误?
Pine Script循环优化:数组赋值错误修复
问题背景
原有代码包含大量重复的request.security调用,试图用循环+数组简化逻辑,但在数组赋值时出现语法错误,无论使用=还是:=都无法解决。
原重复代码
GreenTriggerCond = ta.crossover(FSR, FSRup) RedTriggerCond = ta.crossunder(FSR, FSRdn) PreRedTriggerCond = fsr1 > 80 PreGreenTriggerCond = fsr1 < 20 GreenAnchor = GreenAreaCond BlueAnchor = BlueAreaCond RedAnchor = RedAreaCond OrangeAnchor = OrangeAreaCond GreenTrigger = GreenTriggerCond RedTrigger = RedTriggerCond PreGreenTrigger = PreGreenTriggerCond PreRedTrigger = PreRedTriggerCond [GreenAnchor01, BlueAnchor01, RedAnchor01, OrangeAnchor01, GreenAreaCond01, BlueAreaCond01, RedAreaCond01, OrangeAreaCond01, fsr01_TF1, LeFV01_TF1, EMA01_TF1, price01] = request.security(ticker.modify(s01, syminfo.session), TF1, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, EMA100, close]) [GreenAnchor02, BlueAnchor02, RedAnchor02, OrangeAnchor02, GreenAreaCond02, BlueAreaCond02, RedAreaCond02, OrangeAreaCond02, fsr02_TF1, LeFV02_TF1, EMA02_TF1, price02] = request.security(ticker.modify(s02, syminfo.session), TF1, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, EMA100, close]) [GreenAnchor03, BlueAnchor03, RedAnchor03, OrangeAnchor03, GreenAreaCond03, BlueAreaCond03, RedAreaCond03, OrangeAreaCond03, fsr03_TF1, LeFV03_TF1, EMA03_TF1, price03] = request.security(ticker.modify(s03, syminfo.session), TF1, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, EMA100, close]) [GreenAnchor04, BlueAnchor04, RedAnchor04, OrangeAnchor04, GreenAreaCond04, BlueAreaCond04, RedAreaCond04, OrangeAreaCond04, fsr04_TF1, LeFV04_TF1, EMA04_TF1, price04] = request.security(ticker.modify(s04, syminfo.session), TF1, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, EMA100, close]) [GreenAnchor05, BlueAnchor05, RedAnchor05, OrangeAnchor05, GreenAreaCond05, BlueAreaCond05, RedAreaCond05, OrangeAreaCond05, fsr05_TF1, LeFV05_TF1, EMA05_TF1, price05] = request.security(ticker.modify(s05, syminfo.session), TF1, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, EMA100, close]) [GreenAnchor21, BlueAnchor21, RedAnchor21, OrangeAnchor21, GreenAreaCond21, BlueAreaCond21, RedAreaCond21, OrangeAreaCond21, fsr21_TF2, LeFV21_TF2, GreenTrigger01,RedTrigger01, PreGreenTrigger01, PreRedTrigger01, price21] = request.security(ticker.modify(s01, syminfo.session), TF2, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, GreenTriggerCond,RedTriggerCond, PreGreenTriggerCond,PreRedTriggerCond, close]) [GreenAnchor22, BlueAnchor22, RedAnchor22, OrangeAnchor22, GreenAreaCond22, BlueAreaCond22, RedAreaCond22, OrangeAreaCond22, fsr22_TF2, LeFV22_TF2, GreenTrigger02,RedTrigger02, PreGreenTrigger02, PreRedTrigger02, price22] = request.security(ticker.modify(s02, syminfo.session), TF2, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, GreenTriggerCond,RedTriggerCond, PreGreenTriggerCond,PreRedTriggerCond, close]) [GreenAnchor23, BlueAnchor23, RedAnchor23, OrangeAnchor23, GreenAreaCond23, BlueAreaCond23, RedAreaCond23, OrangeAreaCond23, fsr23_TF2, LeFV23_TF2, GreenTrigger03,RedTrigger03, PreGreenTrigger03, PreRedTrigger03, price23] = request.security(ticker.modify(s03, syminfo.session), TF2, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, GreenTriggerCond,RedTriggerCond, PreGreenTriggerCond,PreRedTriggerCond, close]) [GreenAnchor24, BlueAnchor24, RedAnchor24, OrangeAnchor24, GreenAreaCond24, BlueAreaCond24, RedAreaCond24, OrangeAreaCond24, fsr24_TF2, LeFV24_TF2, GreenTrigger04,RedTrigger04, PreGreenTrigger04, PreRedTrigger04, price24] = request.security(ticker.modify(s04, syminfo.session), TF2, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, GreenTriggerCond,RedTriggerCond, PreGreenTriggerCond,PreRedTriggerCond, close]) [GreenAnchor25, BlueAnchor25, RedAnchor25, OrangeAnchor25, GreenAreaCond25, BlueAreaCond25, RedAreaCond25, OrangeAreaCond25, fsr25_TF2, LeFV25_TF2, GreenTrigger05,RedTrigger05, PreGreenTrigger05, PreRedTrigger05, price25] = request.security(ticker.modify(s05, syminfo.session), TF2, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, GreenAnchor, BlueAnchor, RedAnchor, OrangeAnchor, fsr1, LeFV1, GreenTriggerCond,RedTriggerCond, PreGreenTriggerCond,PreRedTriggerCond, close])
尝试的错误循环代码
var bool[] GreenAnchor = array.new_bool(40) var bool[] BlueAnchor = array.new_bool(40) var bool[] RedAnchor = array.new_bool(40) var bool[] OrangeAnchor = array.new_bool(40) var bool[] GreenTrigger = array.new_bool(40) var bool[] RedTrigger = array.new_bool(40) var bool[] PreGreenTrigger = array.new_bool(40) var bool[] PreRedTrigger = array.new_bool(40) for i = 0 to 4 var securityRes1 = request.security(syminfo.tickerid + "s" + tostring(i + 1), "D", [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, FSR, LeFV, EMA100, close]) GreenAnchor[i] = securityRes1[0] BlueAnchor[i] = securityRes1[1] RedAnchor[i] = securityRes1[2] OrangeAnchor[i] = securityRes1[3] var securityRes2 = request.security(syminfo.tickerid + "s" + tostring(i + 1), "D", [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, FSR, LeFV, GreenTriggerCond, RedTriggerCond, PreGreenTriggerCond, PreRedTriggerCond, close]) GreenTrigger[i] = securityRes2[8] RedTrigger[i] = securityRes2[9] PreGreenTrigger[i] = securityRes2[10] PreRedTrigger[i] = securityRes2[11]
错误原因
- 数组赋值方式错误:Pine Script不支持
数组[索引] = 值的赋值语法,必须使用array.set()函数操作数组元素。 var关键字误用:循环内的securityRes1和securityRes2添加var会导致变量仅在第一次循环初始化,后续循环不会更新数据,需去掉var。- 合约拼接逻辑偏差:原代码使用
ticker.modify(s01, syminfo.session)处理合约,循环中直接拼接tickerid的方式可能不符合实际合约格式,应保持与原代码一致的合约引用方式。
修复后的代码
// 初始化存储数组(大小对应5个合约) var bool[] GreenAnchor = array.new_bool(5) var bool[] BlueAnchor = array.new_bool(5) var bool[] RedAnchor = array.new_bool(5) var bool[] OrangeAnchor = array.new_bool(5) var bool[] GreenTrigger = array.new_bool(5) var bool[] RedTrigger = array.new_bool(5) var bool[] PreGreenTrigger = array.new_bool(5) var bool[] PreRedTrigger = array.new_bool(5) // 存储合约列表(对应原代码的s01-s05) var string[] tickers = array.new_string(5, [s01, s02, s03, s04, s05]) // 循环处理TF1周期数据 for i = 0 to 4 currentTicker = array.get(tickers, i) securityRes1 = request.security(ticker.modify(currentTicker, syminfo.session), TF1, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, fsr1, LeFV1, EMA100, close]) // 使用array.set赋值数组元素 array.set(GreenAnchor, i, securityRes1[0]) array.set(BlueAnchor, i, securityRes1[1]) array.set(RedAnchor, i, securityRes1[2]) array.set(OrangeAnchor, i, securityRes1[3]) // 循环处理TF2周期数据 for i = 0 to 4 currentTicker = array.get(tickers, i) securityRes2 = request.security(ticker.modify(currentTicker, syminfo.session), TF2, [GreenAreaCond, BlueAreaCond, RedAreaCond, OrangeAreaCond, fsr1, LeFV1, GreenTriggerCond, RedTriggerCond, PreGreenTriggerCond, PreRedTriggerCond, close]) array.set(GreenTrigger, i, securityRes2[8]) array.set(RedTrigger, i, securityRes2[9]) array.set(PreGreenTrigger, i, securityRes2[10]) array.set(PreRedTrigger, i, securityRes2[11])
优化说明
- 将合约存入数组统一管理,避免重复编写
ticker.modify逻辑,提升可维护性。 - 拆分两个周期的循环,逻辑更清晰,方便后续单独调整某一周期的处理规则。
- 数组大小设置为5(对应5个合约),避免不必要的资源占用。
内容的提问来源于stack exchange,提问作者mgoblue33
相关产品推荐
相关产品推荐

