如何用While/For循环简化Pinescript中的重复代码?
在Pine Script中用循环简化重复逻辑
先模拟一下你现在写的重复代码结构(n从1到9的逻辑基本一致):
// n=1的逻辑 cmb1BuyValue = ta.valuewhen(buyCmbCond1, low, 0) sinceCmb1Buy = ta.barssince(buyCmbCond1) cmb1Buy = if (sinceCmb1Buy < sinceBuyNine) nz(cmb1Buy[1]) + 1 if (buyCmbCond and close <= cmb1BuyValue) else nz(cmb1Buy[1]) else 0 // n=2的逻辑,变量名换后缀,逻辑完全复制 cmb2BuyValue = ta.valuewhen(buyCmbCond2, low, 0) sinceCmb2Buy = ta.barssince(buyCmbCond2) cmb2Buy = if (sinceCmb2Buy < sinceBuyNine) nz(cmb2Buy[1]) + 1 if (buyCmbCond and close <= cmb2BuyValue) else nz(cmb2Buy[1]) else 0 // ... 一直重复到n=9
用For循环简化的核心思路
Pine Script不支持动态生成变量名(比如自动生成cmb{n}Buy这种),所以我们用数组来批量存储不同n对应的状态值,再通过for循环遍历处理每个n的逻辑。
优化后的代码示例
// 先定义你原有的基础变量(替换成你实际的条件) sinceBuyNine = ta.barssince(buyNineCond) buyCmbCond = // 你的通用买入判断条件,比如 close < ta.sma(close, 20) // 初始化数组,用来存储9组数据的状态(n=1到9对应数组索引0到8) var array<float> cmbBuyValues = array.new_float(9) // 存储每个n的cmbBuyValue var array<int> sinceCmbBuys = array.new_int(9) // 存储每个n的sinceCmbBuy var array<int> cmbBuyCounts = array.new_int(9, 0) // 存储每个n的计数结果,初始值0 // 先把n=1到9的触发条件(buyCmbCond1到buyCmbCond9)放进数组 var array<bool> buyCmbCondArray = array.new_bool(9) array.set(buyCmbCondArray, 0, buyCmbCond1) // n=1对应索引0 array.set(buyCmbCondArray, 1, buyCmbCond2) // n=2对应索引1 array.set(buyCmbCondArray, 2, buyCmbCond3) array.set(buyCmbCondArray, 3, buyCmbCond4) array.set(buyCmbCondArray, 4, buyCmbCond5) array.set(buyCmbCondArray, 5, buyCmbCond6) array.set(buyCmbCondArray, 6, buyCmbCond7) array.set(buyCmbCondArray, 7, buyCmbCond8) array.set(buyCmbCondArray, 8, buyCmbCond9) // n=9对应索引8 // 循环处理每个n的逻辑 for i = 0 to 8 // 获取当前n对应的触发条件 currentCond = array.get(buyCmbCondArray, i) // 更新cmbBuyValue和sinceCmbBuy array.set(cmbBuyValues, i, ta.valuewhen(currentCond, low, 0)) array.set(sinceCmbBuys, i, ta.barssince(currentCond)) // 处理计数逻辑 prevCount = nz(array.get(cmbBuyCounts, i)[1]) // 获取上一根bar的计数 currentSince = array.get(sinceCmbBuys, i) currentValue = array.get(cmbBuyValues, i) newCount = if (currentSince < sinceBuyNine) prevCount + 1 if (buyCmbCond and close <= currentValue) else prevCount else 0 array.set(cmbBuyCounts, i, newCount) // 要调用某个n的结果时,直接从数组取 cmb1Buy = array.get(cmbBuyCounts, 0) // n=1的结果 cmb9Buy = array.get(cmbBuyCounts, 8) // n=9的结果
额外优化:如果触发条件是参数化的
如果你的buyCmbCond1到buyCmbCond9只是参数不同(比如用不同周期的RSI),不用手动逐个set条件,直接在循环里生成:
// 示例:每个n对应周期为n*5(n=1→5周期,n=2→10周期...) for i = 0 to 8 currentPeriod = (i + 1) * 5 // i+1对应n=1到9 currentCond = ta.rsi(close, currentPeriod) < 30 // 替换成你的参数化条件 array.set(buyCmbCondArray, i, currentCond)
内容的提问来源于stack exchange,提问作者Tuff Fish
相关产品推荐
相关产品推荐

