大家好,本节课我们讲解的内容为运算符。在量化交易中,如何对指标进行加减乘除操作,如何判断入场信号和离场信号,对交易逻辑的处理必然少不了运算符的操作。在本节课的最后,我将带领大家运用本节课的知识打造一个简易的量化策略,大家请安心等待。
在Pine语言中,运算符主要分为以下几种:
下面我将为大家逐一讲解。
= 用于给变量赋值,但仅在声明变量时(第一次使用)。基本作为常量赋值,在函数体外使用。
:= 赋值运算符,给左侧变量赋值。用于为先前声明的变量赋值。基本在函数内使用,随着函数逻辑的判断对变量进行重新赋值。
运算符 | 功能 |
---|---|
/+ | 加法和字符串连接 |
/- | 减法 |
/* | 乘法 |
/ | 除法 |
% | 取模(除法后的余数) |
runtime.log('加法', 1+1)//2
runtime.log('减法', 1-1)//0
runtime.log('乘法', 1*2)//2
runtime.log('除法', 1/2)//0.5
runtime.log('取模', 1%2)//1
runtime.error('STOP')
a = a 符号(±*/%) b a 符号(±*/%)= b
上面的算术运算符都是二进制的。如果两个操作数都是数字,但其中至少一个是float类型,则结果也将是float。如果两个操作数都是int类型,则结果也将是int。如果至少一个操作数是string,则结果也是string。
runtime.log(1+0.1) // 1.1
runtime.log(1+0.1+'AA') //1.1AA
runtime.log('优宽'+'AA') //优宽AA
runtime.error('STOP')
“+”号运算符还用作字符串的连接运算符。“优宽”+"PINE"产生"优宽PINE"字符串。
在Pine Script中,有六个比较运算符。
运算符 | 功能 |
---|---|
< | 小于 |
<= | 小于或等于 |
! = | 不等于 |
== | 等于 |
> | 大于 |
>= | 大于或等于 |
比较操作是二进制的。如果两个操作数都是数值,结果将是bool类型,即 “true”、"false "。
a = 2
b = 3
runtime.log('等号',a==b)
runtime.log('不等号',a!=b)
runtime.error('stop')
在Pine Script中,有三个逻辑运算符(not, and, or)。
not 假 = 真 not 真 = 假
a | b | a and b | a or b |
---|---|---|---|
true | true | true | true |
true | false | true | true |
false | true | true | true |
false | false | false | false |
逻辑运算符常用于Pine语言逻辑的判断,比如交易信号的判断,比如价格连续上涨加上交易量的连续上涨,两个条件都需要满足,就可以使用’and’,作为你可以判断为进场的信号;价格连续下跌或者交易量的连续下跌,两个条件满足其一,可以使用’or’,作为出场的信号。
?:三元运算符用于为符合条件的信号创造表达式的,相当于一个ifelse的简写:
条件 ? 如果为真返回值 : 如果为假返回值
三元运算符返回的结果取决于条件的值。如果它是 “真”,那么返回第二个参数的值。如果条件是假或na,那么将返回第三个参数的值。
conditionsig = close > open ? 1 : 0 // if close > open, 返回1, 否则返回0
runtime.log(conditionsig)
可以使用[]历史引用操作符来引用时间序列的过去值。过去的数值是指变量在当前脚本执行的条形图之前的数值,即当前条形图。在变量、表达式或函数调用之后使用[]操作符。操作符的方括号内使用的值是我们要引用的过去的偏移量。要引用volume内置变量的值,离当前柱状体有两个柱状体,我们可以使用volume[2]。
strategy(overlay=true)
plot(volume)
plot(volume[1])
plot(volume[2])
****
计算的顺序是由运算符的优先级决定的。优先级较高的运算符会先被计算。下面是一个按优先级递减排序的运算符列表。
优先级 | 操作符 |
---|---|
9 | [] |
8 | +, -, not |
7 | *, % |
6 | +, - |
5 | >, <, >=, <= |
4 | ==, != |
3 | and |
2 | or |
1 | ?: |
如果在一个表达式中,有几个具有相同优先级的运算符,那么它们将被从左到右计算。如果表达式必须以不同于优先级的顺序进行计算,那么表达式的部分内容可以用圆括号分组。请注意优先级为8的’±’(一元运算符)和优先级为6的’±’(二元运算符)并不一致。
通过上述的讲解,我相信大家对于Pine语言的运算符系统有了一个清晰的认识。下面我将用上述的运算符打造一个简单的量化策略,只是为了说明运算符的应用,大家对于实盘操作要谨慎尝试。
首先我们来定义一个hloc值,这个值是在一个策略周期内,高低开收的平均值,当然也****可以使用内置变量OHLC4值,我们后续会介绍 接下来我们来定义一个价格连续上涨的指标,利用三元表达式,判断当满足,条件1:前日的价格大于大前日的价格,条件2:昨日的价格大于前日的价格,两个条件都满足时,设定价格连续上涨的指标为1,否则为0;因为需要两个条件都满足,所以需要’and’操作符; 成交量连续上涨的指标也一样,利用’and’判断前日大于大前日,昨日大于大前日。这里提醒以下哈,为了避免未来函数,我们使用的都是过去的指标。
下面我们来使用if逻辑判断,这个后续我们也会介绍。因为入场信号比较谨慎,所以我们需要判断的是当价格和成交量都要连续上涨的时候,使用’and’符号确定满足两个条件, 我们进场, 利用stategy交易函数开多仓;
因为我们比较谨慎,所以感觉有风吹草动时,就是当价格或者交易量其中之一出现下降的时候,我们就要及时止盈,迅速离场,平掉多仓。因此这里使用’or’判断满足一个条件(价格下跌 or 成交量下跌)就可以。
最后,我们打印出价格连续上涨和交易量连续上涨的指标的日志。
hloc = (high + low + open + close)/4 //可以使用内置变量hlcc4,后续介绍
pricesignal = (hloc[2] > hloc[3] and hloc[1] > hloc[2]) ? 1 : 0
volumesignal = (volume[2] > volume[3] and volume[2] > volume[1]) ? 1 : 0
if pricesignal == 1 and volumesignal ==1
strategy.entry("buy", strategy.long)
if pricesignal == 0 or volumesignal ==0
strategy.close_all("buy", comment = "close long")
runtime.log('pricesignal',pricesignal)
runtime.log('volumesignal',volumesignal)
通过策略回测,我们看到本策略的收益为正。在策略回测日志中,可以看到只有在条件满足的情况下会进行开平仓的操作。通过运算符的学习,我们可以构建一些基础的交易逻辑,对我们日后进行交易逻辑的梳理有着很大的作用,但是大家不要轻易应用于实盘,因为本策略的适用范围为具有较长时间的趋势策略,因此在震荡行情中可能不太适用。所以“市场有风险,入市需谨慎!”。我们下节课再见!