Pine Script技术咨询:如何计算多条简单移动平均线(SMA)的最大值与最小值
解决Pine Script中多序列MA的最大/最小值计算问题
首先提个小细节:你代码里的sma50m应该是笔误,应该是sma50,先把这个小问题修正过来~
至于你用max()/min()直接传5个MA没生效的原因,其实是Pine Script内置的max()和min()函数每次只能接收两个输入序列,没法一次性处理多个参数。不过有两种简单的方法可以搞定这个需求:
方法1:嵌套调用内置max/min函数
既然每次只能传两个参数,我们可以通过嵌套调用的方式,逐步缩小范围算出最终的最大/最小值,逻辑直观易懂:
//@version=5 indicator("多MA最大最小值计算", overlay=true) // 定义各周期简单移动平均线 sma250 = ta.sma(close, 250) sma100 = ta.sma(close, 100) sma50 = ta.sma(close, 50) sma20 = ta.sma(close, 20) sma10 = ta.sma(close, 10) // 嵌套计算最大值和最小值 HH = ta.max(ta.max(ta.max(ta.max(sma250, sma100), sma50), sma20), sma10) LL = ta.min(ta.min(ta.min(ta.min(sma250, sma100), sma50), sma20), sma10) // 可选:可视化所有MA和最值点 plot(sma250, color=color.blue) plot(sma100, color=color.orange) plot(sma50, color=color.green) plot(sma20, color=color.red) plot(sma10, color=color.purple) plot(HH, color=color.yellow, style=plot.style_circles, title="MA最大值") plot(LL, color=color.gray, style=plot.style_circles, title="MA最小值")
这种方法适合MA数量不多的场景,代码简洁直接。
方法2:用数组存储MA,调用数组的max/min方法
如果以后你需要添加更多MA,嵌套写法会越来越冗长,这时用数组来处理会更优雅,扩展性也更强:
//@version=5 indicator("多MA最大最小值计算(数组版)", overlay=true) // 定义各周期简单移动平均线 sma250 = ta.sma(close, 250) sma100 = ta.sma(close, 100) sma50 = ta.sma(close, 50) sma20 = ta.sma(close, 20) sma10 = ta.sma(close, 10) // 创建数组并添加所有MA序列 var maArray = array.new_float() array.set(maArray, 0, sma250) array.set(maArray, 1, sma100) array.set(maArray, 2, sma50) array.set(maArray, 3, sma20) array.set(maArray, 4, sma10) // 从数组中获取最大/最小值 HH = array.max(maArray) LL = array.min(maArray) // 可选:可视化所有MA和最值点 plot(sma250, color=color.blue) plot(sma100, color=color.orange) plot(sma50, color=color.green) plot(sma20, color=color.red) plot(sma10, color=color.purple) plot(HH, color=color.yellow, style=plot.style_circles, title="MA最大值") plot(LL, color=color.gray, style=plot.style_circles, title="MA最小值")
用数组的好处是,以后要加新的MA,只需要往数组里多添加一个元素就行,完全不用修改最值的计算逻辑,非常方便。
两种方法都能完美解决你的问题,根据自己的需求选就行~
内容的提问来源于stack exchange,提问作者Elton
相关产品推荐
相关产品推荐

