Pine语法基础

Pine Script 本质上是一门逐根 K 线执行的语言——图表上的每一根 bar,脚本都会从头到尾运行一遍。理解了这个执行模型,再掌握变量、类型、控制流这几块零件,绝大多数脚本都能读懂、改写。本章把核心语法拆成最小单元讲清楚。

声明语句

每个脚本第一行(//@version= 之后)必须是声明语句,定义脚本的类型和属性:

//@version=6
indicator("我的指标", overlay = true)   // 指标类型,叠加在主图

// 或策略类型:
// strategy("我的策略", overlay = true, initial_capital = 100000)
  • indicator() 声明指标脚本,用于画图、分析、预警。
  • strategy() 声明策略脚本,能做模拟交易和回测。
  • overlay = true 叠加主图,false 放副图。

详见后续 strategy策略与回测

变量与赋值

= 声明变量并赋值。默认情况下,变量在每根 K 线上都会被重新声明并赋值

myVar = close    // 每根 K 线上 myVar 都等于当前收盘价

如果你想让变量跨 K 线保持(不每根重置),用 var 关键字:

var int count = 0    // 只在第一根 K 线初始化为 0,之后保持
count := count + 1   // 每根 K 线累加 1
plot(count)          // 画出 1, 2, 3, 4 ...
  • var 变量只在第一根 bar 初始化,后续 bar 上值会保留。
  • 修改变量用 :=(重新赋值运算符)。
  • 类型关键字:int(整数)、float(浮点)、bool(布尔)、string(字符串)、color(颜色)。

历史引用 []

Pine 最强大的特性之一:用方括号取任意变量的历史值。

prevClose = close[1]    // 上一根 K 线的收盘价
twoBarsAgo = close[2]   // 两根前的收盘价
priceChange = close - close[1]   // 与上根的差值

close[1] 表示「上一根 bar 的 close 值」。这在计算涨跌幅、判断金叉死叉时不可或缺。

第一根 K 线上没有历史数据,close[1] 返回 na(Not Available)。处理 na 可用 na() 函数或 nz() 函数(返回 0 代替 na)。

内置行情变量

变量含义
open high low close开高低收
volume成交量
hl2 hlc3 ohlc4典型价组合
time时间戳
bar_indexK 线序号(从 0 开始)
na空值(无数据)

运算符

// 算术
sum = close + open
ratio = close / open

// 比较(返回 bool)
isUp = close > open
isFlat = close == open

// 逻辑
goldenCross = ta.crossover(fastMA, slowMA) and volume > 1000
notDown = not (close < open)
类别运算符
算术+ - * / %
比较> < >= <= == !=
逻辑and or not
条件条件 ? 成立时取值 : 否则取值(三元)
赋值=(声明赋值) :=(重新赋值) += -=

三元运算符是 Pine 里最常用的条件写法:

barColor = close >= open ? color.green : color.red
barcolor(barColor)

条件结构 if / else

if close > open
    label.new(bar_index, high, "阳线", color = color.green)
else
    label.new(bar_index, high, "阴线", color = color.red)
  • if 块内缩进的代码属于局部作用域(local scope)。
  • 条件为 true 时执行该块;else 可选。
  • 块内声明的变量仅在块内有效。

循环 for / while

// 计算 10 根 K 线的平均涨幅
float totalChange = 0.0
for i = 1 to 10
    totalChange := totalChange + (close[i] - close[i - 1])
avgChange = totalChange / 10
  • for i = 起始 to 结束(步进为 1),加 by 可自定义步进。
  • while 条件 在条件为真时持续循环。
  • Pine 的循环主要用于自建复杂计算,大多数常用计算内置函数已经覆盖,不需要手写循环。

自定义函数

//@version=6
indicator("自定义函数示例", overlay = true)

// 定义函数:计算自定制动量指标
myMomentum(src, length) =>
    change = src - src[length]
    percentChange = change / src[length] * 100
    percentChange

plot(myMomentum(close, 14), title = "动量%")
  • 函数名(参数1, 参数2) => 定义,缩进块为函数体。
  • 最后一行表达式的值就是返回值。
  • 函数可以在全局作用域任何地方调用。

输入参数 input

让用户在「设置 → Inputs」面板里调参数,不用改代码:

//@version=6
indicator("可调均线", overlay = true)
length = input.int(20, "均线周期", minval = 1, maxval = 200)
src = input.source(close, "数据源")
ma = ta.sma(src, length)
plot(ma, color = color.blue, linewidth = 2)

常用 input 函数:

函数用途
input.int(defval, title)整数输入
input.float(defval, title)浮点输入
input.bool(defval, title)布尔开关
input.string(defval, title)文本输入
input.source(defval, title)选择数据源(close/open/hl2…)
input.color(defval, title)颜色选择
input.timeframe(defval, title)周期选择

小结

  • 脚本第一行写 //@version=6,第二行写 indicator()strategy() 声明语句。
  • 默认变量每根 K 线重置;var 关键字让变量跨 bar 保留。
  • close[1] 取历史值,是 Pine 的核心能力。
  • 条件用三元运算符或 if/elsefor/while 用于循环;函数名(参数) => 定义自定义函数。
  • input.*() 让参数可调,不用改代码。

语法就这些核心零件。接下来认识最常用的内置技术指标函数:

内置ta指标函数