如何在Pine Script 5的for循环中正确使用ta.correlation()?
Pine Script 5 解决ta.correlation()在双层for循环中的调用问题
问题重现
- 编译器触发警告:
The function 'ta.correlation' should be called on each calculation for consistency. It is recommended to extract the call from this scope
- 双层循环计算后存入矩阵的相关性结果(plot1),与直接调用
ta.correlation的结果(plot2)不一致 - 尝试用
var/varip初始化变量后,仍无法解决错误结果与警告问题
原因分析
- 参数类型错误:
ta.correlation需要接收序列数据(即包含每根K线历史值的序列),而非单根K线的标量值。原代码中array.get(A_close,counterIn)仅获取当前K线的收盘价(标量),无法计算正确的历史相关性。 - 状态型函数调用规则:
ta.correlation是依赖内部历史状态的函数,必须在每根K线的全局上下文稳定调用,不能被循环的局部作用域限制,否则会破坏状态一致性,触发警告并导致结果错误。
解决方案
核心思路是:为每个标的存储完整的close序列,确保ta.correlation接收正确的序列数据;同时在全局上下文执行循环,保证函数每根K线都稳定调用。
修正后的代码示例
//@version=5 indicator(title = "FAQ-HX1", shorttitle ="FAQ-HX1") // 存储每个标的的close序列(varip保证序列状态持续更新) varip series_close = array.new_series<float>(5) // 获取标的的日频close序列 f_GetCloseSeries(ticker) => request.security(ticker, "D", close) // 初始化并更新各标的序列 array.set(series_close, 1, f_GetCloseSeries("NYSE:PFE")) array.set(series_close, 2, f_GetCloseSeries("SIX:ROG")) array.set(series_close, 3, f_GetCloseSeries("SIX:NOVN")) array.set(series_close, 4, f_GetCloseSeries("NYSE:JNJ")) array.set(series_close, 5, f_GetCloseSeries("NYSE:MRK")) // 初始化相关性矩阵(varip保留矩阵状态) varip mcc = matrix.new<float>(5,5,na) // 全局上下文遍历标的对,计算相关性 for counterOut = 1 to 5 for counterIn = 1 to 5 seq_out = array.get(series_close, counterOut) seq_in = array.get(series_close, counterIn) // 传递序列数据调用ta.correlation,符合全局调用要求 corr_val = ta.correlation(seq_in, seq_out, 5) matrix.set(mcc, counterIn-1, counterOut-1, corr_val) // 矩阵索引从0开始 // 验证结果:矩阵值与直接调用结果一致 plot(matrix.get(mcc,1,2), color=color.orange) // 对应标的2和3(序号转索引需减1) plot(ta.correlation(array.get(series_close,2), array.get(series_close,3),5), color=color.black)
关键说明
- 使用
varip初始化序列数组和矩阵,确保它们在每根K线都能保留状态并更新 - 直接通过
request.security获取标的的完整close序列,传递给ta.correlation的是历史序列而非单值 - 循环在全局上下文执行,每根K线都会遍历所有标的对,满足
ta.correlation的一致性调用要求,消除警告 - 注意矩阵索引从0开始,需将标的序号转换为对应索引
内容的提问来源于stack exchange,提问作者Hendrix
相关产品推荐
相关产品推荐

