大家好,今天我们来学习Pine语言“量化策略弹药组装”的载体–函数。基本上所有信号指标的计算和交易逻辑的判断,使用的都是函数。在Pine语言中,函数的使用贯彻了一贯的简洁优雅的特点。通过准确的使用各个逻辑代码块,可以实现量化策略的“所写即所得”。如果你想偷懒,不想重复的编写成熟的指标计算的轮子,例如MACD,布林带,超级趋势等指标,Pine的内置变量和内置函数一行代码就可以帮你搞定。
Pine语言可以设计自定义函数,首先需要设置函数的名称,和以前的变量命名的规范是一样的;名称过后需要添加一个“()”,里面可以添加需要的参数个数,当然0个也是可以的;“()”后面添加一个箭头“=>”标志;最后书写本地代码块,定义函数的返回内容。
一般来说Pine语言的自定义函数有以下规则:
barIsUp() => close > open
该函数返回当前BAR是否为阳线。这里如果要打印该函数的话,需要引用的方式如下,这里不能省略括号。
runtime.log(barIsUp())
自定义函数也可以设计成多行的自定义函数,本地块语句需要以四个空格或者一个tab键换行;伴随下一个逻辑块,继续进行标准缩进。
该函数的意思是计算所需交易指标(data)的指定期间(length)的平均数。在函数体内,设置本地变量(i和sum),然后伴随while的循环,本地变量不断更新,直至循环结束,返回平均数(sum / length)。
sma(data, length) =>
i = 0
sum = 0
while i < 10
sum += data[i]
i += 1
sum / length
还有,也可以实现多变量的返回,使用一个元祖“[]”就可以。
twoEMA(data, fastPeriod, slowPeriod) =>
fast = ta.ema(data, fastPeriod)
slow = ta.ema(data, slowPeriod)
[fast, slow]
请注意,这里自定义函数内部,使用了一个内置函数(ta.ema),下部分我将为大家讲解。
这个函数通过三个参数(交易指标,快线周期,慢线周期),最后返回的是每个策略周期内,快线和慢线的平均数,以元组的形式。
在介绍内置函数之前,我先为大家介绍一下Pine语言中的内置变量,这类变量不需要使用函数的形式,即不用添加参数,可以直接使用。内置变量数目有很多,在以往的课程中某些会涉及到,在这里为大家查漏补缺下,挑选一下重要的内置变量为大家讲解下。
指标计算类是量化策略中的常用的计算指标,Pine语言对此实现了封装,大家可以直接使用。
math.e
//是欧拉数的命名常数。它等于2.7182818284590452。
math.phi
//是黄金分割的命名常数。等于1.6180339887498948。
math.pi
//是阿基米德常数的命名常数。它等于3.1415926535897932。
math.rphi
//是黄金分割率的命名常数。它等于0.6180339887498948。
Pine语言对关键词赋予了交易指标的函数,可以直接调用计算,并且简单的合成指标也可以直接引用。
close
open
high
low
volume
hl2 //(最高价 + 最低价)/2的快捷键
hlc3 //(最高价+最低价+收盘价)/3的快捷键
hlcc4 //(高+低+收+收)/4的快捷键
ohlc4 //(开盘价 + 最高价 + 最低价 + 收盘价)/4的快捷键
量化策略中,具有很多成熟的指标,然而计算公式比较复杂,在Pine语言中实现了直接调用。请注意,这类指标是不需要参数的,如有需要参数,可以参考内置函数内容,我们后续会为大家讲述。
ta.accdist
累积/分布指数
ta.iii
盘中强度指数
ta.nvi
负量指标。
ta.pvi
正量指标
ta.obv
能量潮指标
ta.pvt
价量趋势指标
ta.wad
威廉多空力度线
ta.wvad
威廉变异离散量
这类变量都可以使用自定义函数进行计算,比如最后威廉变异离散量,使用的自定义函数如下:
plot(ta.wvad, title = '内置wvad', color=color.yellow)
f_wvad() =>
(close - open) / (high - low) * volume
plot(f_wvad(), title = '自定义wvad')
时间序列类变量是确定策略执行的时间或者查询bar状态。
bar_index
//目前的价格棒指数。 编号从零开始,第一个条的索引为0。
last_bar_index
//最后一根图表K线的索引。K线索引以第一根K线为零开始。请注意,使用此变量可能会导致指标重绘。
time
//UNIX格式的当前k线时间。 这是自1970年1月1日00:00:00 UTC以来的毫秒数。
year
//交易所时区的当前年份
month
//交易所时区的当前月数
hour
//交易所时区的当前小时数
minute
//交易所时区的当前分钟数
weekofyear
//交易所时区的当前k线时段的周数
dayofmonth
//交易所时区的当前k线时间的日期
dayofweek
//交易所时区的当前k线时间的星期
barstate.ishistory
//如果当前k线为历史k线,则返回true,否则返回false。
barstate.isnew
//如果脚本目前在新k线上计算着,则返回true,否则返回false。使用此变量的PineScript代码可以对历史记录和实时数据进行不同的计算。请注意,使用此变量/函数可能会导致指标重新绘制。
这些内置变量主要是限制策略执行的时间,比如在早上开盘前十五分钟小时内,大盘波动比较剧烈,匆忙的进行开平仓操作可能造成不必要的损失。例如可用以下限制,在早上9点前十五分钟内(hour == 9 and minute <= 15),不进行策略运行。具体的代码设置如下:
if not (hour == 9 and minute <= 15)
runtime.log('策略开始')
Pine语言还有一些其他内置变量,我们没有讲解到。大家可以在优宽社区Pine语言帮助文档查询其他内置变量的功能和使用方法。