商品期货量化交易-TradingviewPine语言基础课程(十三):自定义函数和内置变量

Author: ianzeng123, Created: 2023-03-06 09:31:56, Updated:

商品期货量化交易-TradingviewPine语言基础课程(十三):自定义函数和内置变量

大家好,今天我们来学习Pine语言“量化策略弹药组装”的载体–函数。基本上所有信号指标的计算和交易逻辑的判断,使用的都是函数。在Pine语言中,函数的使用贯彻了一贯的简洁优雅的特点。通过准确的使用各个逻辑代码块,可以实现量化策略的“所写即所得”。如果你想偷懒,不想重复的编写成熟的指标计算的轮子,例如MACD,布林带,超级趋势等指标,Pine的内置变量和内置函数一行代码就可以帮你搞定。

自定义函数

Pine语言可以设计自定义函数,首先需要设置函数的名称,和以前的变量命名的规范是一样的;名称过后需要添加一个“()”,里面可以添加需要的参数个数,当然0个也是可以的;“()”后面添加一个箭头“=>”标志;最后书写本地代码块,定义函数的返回内容。

一般来说Pine语言的自定义函数有以下规则:

    1. 所有函数都在脚本的全局范围内定义。不能在另一个函数中声明一个函数,当然可以在另一个函数中使用一个函数。
    1. 不允许函数在自己的代码中调用自己(递归)。
    1. 函数主要是用来编写逻辑策略的,原则上所有PINE语言内置画图函数,不能在自定义函数内调用。
    1. 函数可以写成单行、多行。最后一条语句的返回值为当前函数返回值,返回值可以返回元组形式。

单行自定义函数:

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语言还有一些其他内置变量,我们没有讲解到。大家可以在FMZ社区Pine语言帮助文档查询其他内置变量的功能和使用方法。


更多内容