练习编写第一个指标
//@version=5 ------这是一个包含编译器指令的注释,告诉编译器脚本将使用 Pine Script™ 版本 5
indicator("MACD #1") ------图表上的脚本名称定义为“MACD”
fast = 12
slow = 26
fastMA = ta.ema(close, fast) -----以收盘价计算EMA(指数移动平均),计算时间跨度为fast(26)
slowMA = ta.ema(close, slow)
macd = fastMA - slowMA
signal = ta.ema(macd, 9) ------以长度为9的ema算法平滑macd指标
plot(macd, color = color.blue) ---------画线,为macd指标,使用蓝线输出变量
plot(signal, color = color.orange)
改进代码为
//@version=5
indicator("MACD #2")
fastInput = input(12, "Fast lengthhhh") ----参数为: value, key
slowInput = input(26, "Slow lengthhhh")
[macdLine, signalLine, histLine] = ta.macd(close, fastInput, slowInput, 9)
plot(macdLine, color = color.blue)
plot(signalLine, color = color.orange)
内置方法的入参数写在小括号中,出参数写在中括号中。如例子中的ta.macd方法。
此时双击图表中的指标线,多了“输入”标签,可以对输入的两个参数进行图形化的编辑:
几点说明
“指标”和“策略”
“指标”计算不需要“经纪商模拟器”,所以计算耗费资源更少,计算速度更快。
两者都可以在叠加模式(在价格图表上)或独立窗格模式(在图表下方或上方的单独部分中)运行。
两者都可以在各自的空间中绘制信息,并且都可以生成警报事件。
脚本的执行
脚本运行时已经结束的k线叫做“历史k线”(historical bars)
最新的还没结束的K线叫做“实时K线”(realtime bar)
当脚本在历史K线上执行时,close内置变量保存该柱的收盘价。
当脚本在实时K线上执行时,close返回交易品种的当前价格,直到这个K线的时间结束。
用运算符“[]”引用时间序列的过去值。例如,close[1]
指的是脚本正在执行的K线前一个K线的close值。
语法
运行模型
脚本执行方式:从左到右,一个K线柱一个K线柱依次执行,每个K线柱执行一次脚本。
OHLCV: 在K线上执行脚本之前,内置变量(如 open
、high
、low
、close
和volume
)被设置。计算每移动到一个新的K线柱上,这些内置变量的值就会随之更新成当前柱对应的值。
实时k线的计算:策略默认是只在实时k线结束的时候计算一次,但是可以将策略的calc_on_every_tick参数设置为true在每次当前实时K线数据更新的时候计算。
用户自定义的变量在每个K线上的重新赋值不会被带到下一个K线中。
免费用户能看大约5k个k线,pro/pro+用户能看1w个k线,高级用户能看2w个k线。
函数块内的函数脚本和上下文的执行,不调用就不刷新(有的条件执行的语句确实不能每次都强制执行),因此要注意函数块内的是不是每次都需要更新。需要的话需要放到函数块外。
脚本结构
注释://
代码块要空4格或者tab
脚本类型声明:每个脚本必须声明脚本是什么类型:indicator()/strategy()/library()即指标/策略/库
“指标”类型必须有至少一个输出函数,例如plot()
“策略”必须至少一个strategy.*()调用
“库”至少包含一个库函数声明
自定义变量
常量用大写的SNAKE_CASE
运算符
=给新变量赋值
:=给定义过的变量赋值(与go语言相反)
运算符及优先级
条件语句
某些 Pine Script™ 内置函数无法在条件结构的执行语句中调用。它们是: alertcondition() , barcolor() , fill() , hline() , indicator() , library() , plot() , plotbar() , plotcandle() , plotchar() , plotshape() , strategy()
无括号、无冒号、无花括号
if xxx
xxxx
else if xxx
xxxx
else
xxxx
xxxx
循环语句
for
for offset = 0 to MA_LENGTH - 1
sumOfCloses := sumOfCloses + close[offset]
while
while i <= lookbackInput
if high[i] > high
higherBars += 1
else if high[i] < high
lowerBars += 1
// Counter must be managed "manually".
i += 1
类型系统
pine使用form-type对来描述所有的值
forms
form描述一个值何时得到,type描述一个值的性质。
form从弱到强:const < input < simple < series
- “const”编译时已知
- “input” 输入时知道
- “simple”索引为0的k线时就已经知道的
- “series”移动到当前k线才知道的值
要求强form的地方可以用更弱的form。
types
- 基本类型 “int”, “float”, “bool”, “color” and “string”
- 特殊类型“plot”, “hline”, “line”, “label”, “box”, “table”, “array”
- “void”
- tuples
特殊类型都包含一个指向对象的ID(指针)
内置函数/变量
同族的函数和变量共享命名空间,命名空间是用函数前缀表示的,如ta.sma()函数表示“技术分析”(technical analysis)。
有些变量也提供对应的函数,比如time和time(timeframe)。