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_index | K 线序号(从 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/else;for/while用于循环;函数名(参数) =>定义自定义函数。 input.*()让参数可调,不用改代码。
语法就这些核心零件。接下来认识最常用的内置技术指标函数: