商品期货量化交易-TradingviewPine语言基础课程(七): 运算符

Author: ianzeng123, Created: 2023-02-07 11:03:06, Updated: 2023-02-10 08:45:04

大家好,本节课我们讲解的内容为运算符。在量化交易中,如何对指标进行加减乘除操作,如何判断入场信号和离场信号,对交易逻辑的处理必然少不了运算符的操作。在本节课的最后,我将带领大家运用本节课的知识打造一个简易的量化策略,大家请安心等待。

img

在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('FMZ'+'AA') //FMZAA
runtime.error('STOP')

“+”号运算符还用作字符串的连接运算符。“FMZ”+"PINE"产生"FMZPINE"字符串。

比较运算符

在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])

img ****

运算符优先级

计算的顺序是由运算符的优先级决定的。优先级较高的运算符会先被计算。下面是一个按优先级递减排序的运算符列表。

优先级 操作符
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)

通过策略回测,我们看到本策略的收益为正。在策略回测日志中,可以看到只有在条件满足的情况下会进行开平仓的操作。通过运算符的学习,我们可以构建一些基础的交易逻辑,对我们日后进行交易逻辑的梳理有着很大的作用,但是大家不要轻易应用于实盘,因为本策略的适用范围为具有较长时间的趋势策略,因此在震荡行情中可能不太适用。所以“市场有风险,入市需谨慎!”。我们下节课再见!

img


更多内容