含na值时ta.sma的行为疑问:两段Pine Script代码结果为何不同?
问题原因:
ta.sma()与手动循环的计算逻辑差异 你的两段代码结果不一致,核心是ta.sma()的计算逻辑和你手动实现的逻辑存在本质区别,关键在于对na值的处理和平均值的计算方式:
1. ta.sma()的真实计算逻辑
ta.sma(source, length)的核心特性是:
- 自动忽略序列中的
na值 - 计算的是当前窗口内所有有效非
na值的算术平均值,即总和除以窗口内的有效样本数,而非固定的length参数(这里的20)
举个例子:如果近20期K线中只有12期满足close > 0,那么ta.sma(close > 0 ? close : na, 20)会用这12期收盘价的总和除以12,而不是除以20。
2. 你的手动循环逻辑问题
你手动实现的逻辑是:累加20期内符合条件的收盘价,然后固定除以20,不管窗口内实际有多少个有效样本。哪怕只有5期符合条件,你依然用总和除以20,这和ta.sma()的动态除数逻辑完全不同,结果自然不一致。
修正手动循环逻辑(与ta.sma()对齐)
如果要让手动代码和ta.sma()结果一致,需要统计窗口内的有效样本数,用总和除以有效数,而非固定20:
// 修正后的手动计算,匹配ta.sma逻辑 sum_pos = 0 count_pos = 0 sum_neg = 0 count_neg = 0 for i = 0 to 19 // 处理close>0的情况 val_pos = close[i] > 0 ? close[i] : na if not na(val_pos) sum_pos += val_pos count_pos += 1 // 处理close<0的情况 val_neg = close[i] < 0 ? close[i] : na if not na(val_neg) sum_neg += val_neg count_neg += 1 manual_sma_pos = count_pos > 0 ? sum_pos / count_pos : na manual_sma_neg = count_neg > 0 ? sum_neg / count_neg : na
总结
ta.sma()的核心是动态计算有效样本的平均值,而非固定周期数的平均。你之前误解了它的逻辑,以为是固定除以周期参数,但实际上它会根据窗口内的非na值数量调整除数。
内容的提问来源于stack exchange,提问作者user15097658
相关产品推荐
相关产品推荐

