Market News & Insights
Market News & Insights
TradingView编程系列5:循环结构(上)
Michael Miao
22/12/2025
0 min read
Share this post
Copy URL

TradingView编程系列5:循环结构(上)

循环(Loops) 是一种结构,它会根据指定的条件反复执行一段语句块。它们允许脚本在不需要重复编写代码的情况下完成重复性的任务。Pine Script提供了三种不同的循环类型:forwhilefor…in

一、隐式循环

Pine Script的执行模型和时间序列结构,使得在许多情况下并不需要写出明显的循环。

当用户将一个 Pine 脚本添加到图表中时,脚本会在一个等同于“大循环”的环境中运行:它会在可用数据中的每一根历史 K 线以及每一个实时 tick 上各执行一次代码。脚本可以通过历史引用运算符(history-referencing operator)访问之前 K 线上的执行结果;而通过使用 var 或 varip 关键字声明的变量,其计算结果可以在多次执行之间保持不变。这些特性使脚本能够通过逐 K 线(bar-by-bar)的计算来完成各种任务,而无需依赖显式的循环。

下面我们来看一个简单的示例,说明在 Pine Script 中不必要地使用循环的情况。

A screenshot of a computer programAI-generated content may be incorrect.

下面按逐行解释这段 Pine Script 代码的含义和执行逻辑:

首先,声明这是一个指标脚本(indicator)。test是指标在图表上显示的名称。overlay = true 表示该指标绘制在主价格图表上。

其次,声明一个整数类型变量名为lengthInput的变量。input.int()为创建一个用户可在参数设置中修改的整数输入项,其中默认值为 20 根 K 线。在参数面板中显示的名称为length。

接下来,再声明一个初始化变量为 0,浮点数类型的变量closeSum。注意,由于没有使用 var 关键字,在每一根 K 线上脚本执行时,closeSum 都会被重新置为 0。

然后进入for循环,对最近的 lengthInput 根 K 线进行循环,将每根 K 线的收盘价累加到 closeSum。在循环体中,把最近 lengthInput 根 K 线的收盘价逐一相加。

再之后,用收盘价总和除以 K 线数量,计算平均值,保存到变量avgClose中。

最后,将数据画成线,其中"Average close"为图例名称,线条颜色为橙色,线条宽度为2。

总结来说,这段代码就是用for循环计算并绘制最近 lengthInput 根 K 线的收盘价平均值。

其实,这个示例的重点在于演示 “不必要的循环”,在 Pine Script 中,这种均值计算可以直接使用内置函数ta.sma,例如:

avgClose = ta.sma(close, lengthInput)

二、显性循环

尽管 Pine 的执行模型、时间序列结构以及可用的内置函数在许多情况下都能消除对循环的需求,但并非所有迭代任务都可以不用循环。在以下几类任务中,循环是必不可少的:

  • 遍历或操作集合(如数组、矩阵和映射)
  • 执行无法通过无循环表达式或现有内置函数完成的计算
  • 回溯历史数据以分析过去的 K 线,而比较所需的参考值仅在当前 K 线上才可用

例如,要判断哪些过去的 K 线的最高价(high)高于当前 K 线的最高价,就必须使用循环。

这是因为:当前 K 线的数值在脚本运行于之前的历史 K 线时是无法获取的。脚本只能在执行到当前 K 线时访问该 K 线的数值,并且必须在这次执行过程中向后回溯历史序列,将之前的数值与当前值进行比较。

例如,下面的脚本使用 for 循环,将之前 lengthInput 根 K 线的最高价与最后一根历史 K 线的最高价进行比较。在循环中,它调用 label.new(),在每一根最高价高于最后一根历史 K 线最高价的过去 K 线上方绘制一个圆形标签:

A screenshot of a computer codeAI-generated content may be incorrect.

首先,声明这是一个名为test2的指标脚本。此脚本允许最多绘制 500 个label,否则在绘制大量标签时会触发限制错误。然后设置lengthInput变量,该变量表示要拿多少根过去的 K 线的最高价(high),来和最后一根历史 K 线的最高价比较,1和500为允许输入的最小值和最大值。

接下来,判断当前是否是最后一根已确认的历史 K 线。barstate.islastconfirmedhistory在历史数据的最后一根 K 线时返回 true,在实时 K 线或更早的历史 K 线上返回 false。

在最后一根历史K线的最高价位置画一条水平虚线。其中line.new的前四个参数分别为起点横坐标,起点纵坐标,终点横坐标,终点纵坐标。

接下来进入For循环,首先判断过去某根 K 线的最高价 > 当前(最后历史)K 线的最高价,如果高于,则紫色圆形标签自动绘制在 K 线柱的上方。

最后一行代码,使用三元运算符判断给最后一根历史 K 线上色高亮。如果是最后一根历史 K 线,则为橙色,否则不改变颜色。

A screenshot of a graphAI-generated content may be incorrect.

可以看到,当我们将长度参数设置为 60 后,图表中会在最高价高于当前 K 线最高价的历史 K 线上方显示紫色圆点,同时还会绘制一条表示当前 K 线最高价的水平虚线,用于直观地标示该参考价位。

综上所述,本文通过示例对比说明了 Pine Script 中“不必要循环”和“必须使用循环”的典型场景。合理理解 Pine 的执行模型,优先使用内置函数,可以提升脚本的简洁性与性能;而在需要基于当前 K 线回溯并分析历史数据时,循环则不可或缺。掌握循环的正确使用方式,有助于编写更高效、清晰且功能强大的 Pine Script 脚本。

Related Articles

Recent Articles