龙听期货论坛's Archiver

龙听 发表于 2017-11-2 13:13

操作符

[p=30, 2, left]操作符是一些象征具体操作运算行为的符号,例如操作符"+"代表对两个数求和,这些操作符适用于数值型、字符串、布尔型的数据。[/p][p=30, 2, left]TradeBlazer公式为您提供了多种操作运算符,便于您对保留字的操作和生成更复杂的数据类型、逻辑型、字符串类型的值。下面有四种不同类型的操作符可用于逻辑表达式、数值表达式、字符串表达式中。[/p]数学操作符[p=30, 2, left]数值型表达式的操作符有几种,如下表所示:[/p][table=98%]
[tr][td=1,1,100][b]操作符[/b][/td][td][b]说明[/b][/td][/tr]
[tr][td=1,1,100][b]+[/b][/td][td]加[/td][/tr]
[tr][td=1,1,100][b]-[/b][/td][td]减[/td][/tr]
[tr][td=1,1,100][b]*[/b][/td][td]乘[/td][/tr]
[tr][td=1,1,100][b]/[/b][/td][td]除[/td][/tr]
[tr][td=1,1,100][b]%[/b][/td][td]求模[/td][/tr]
[tr][td=1,1,100][b]^[/b][/td][td]求幂[/td][/tr]
[tr][td=1,1,100][b]()[/b][/td][td]括号[/td][/tr]
[/table][p=30, 2, left]这些数学操作按其特定的优先级来进行计算,"^"(求幂)最先,其次是"*"(乘法),"/"(除法)和"%"(求模),加和减最后,如果有多个乘法/除发(或者是加法或减法),那么计算顺序是从左边到右边。[/p][p=30, 2, left]例如,在数值型的表达式中:[/p]High+2*range/2;[p=30, 2, left]它首先计算的是range(此处range是指High-Low)与2的积,接着计算与2的商(除法),最后求2*range/2与最高价(High)的和。[/p][p=30, 2, left]如果要找到一个Bar的中间位置,可以尝试写成如下语句:[/p]High+Low/2;[p=30, 2, left]然而在上面语句中,首先运算的是以最低价(Low)除于2,然后再与最高价求和。最后的值不是我们所需要的,并且和原来预想中的值是不一致的。[/p][p=30, 2, left]为了处理上述这样的情况,我们在运算符号中引入了括号"()",可以用括号来操作和控制运算的规则,先计算括号里面的表达式,不考虑外面的操作符和常量。因此,获取某一个Bar上的中间位置(MidPoint)的语句可如下:[/p](High+Low)/2;[p=30, 2, left]该语句就是返回最高价和最低价之和的1/2,即Bar的中间位置。[/p][p=30, 2, left]对于除法,有一些特别的提示,众所周知,0不能作为除数,否则将会导致系统溢出。TradeBlazer公式在对脚本进行执行时,碰到除法符号时,都需要对除数进行是否为0的检查,以保证脚本能够正确的执行下去,当遇到除数为0的情况下,我们将会返回一个无效值。[/p][p=30, 2, left]上面描述到求中间位置(MidPoint)的表达式,其实我们可以用另外一种形式来代替它:[/p](High+Low)*0.5;[p=30, 2, left]对于A/B这样的一个表达式,因为不知道B是否为0,所以总是需要对其进行有效性验证,计算的速度会受到一定的影响,因此,对于除法表达式,我们强烈建议使用时尽可能转换为乘法处理,即提高执行速度,也可以避免未知的错误发生。[/p]字符串操作符[p=30, 2, left]"+"是唯一的可以应用于控制字符串表达式的数学操作符,它可用于连接两个文本字符串为一个字符串。如下:[/p]"这是一个字符串表达式,"+"返回值为数值型。";"This is expression A"+" and this is expression B.";[p=30, 2, left]上面字符串表达式的输出值,应该是"这是一个字符串表达式,返回值为数值型。"和"This is expression A and this is expression B."。[/p]关系操作符[p=30, 2, left]逻辑运算符使用下列标准的比较符号,大于、小于、等于、小于等于、大于等于和不等于。[/p][p=30, 2, left]下列的关系操作符号都可以应用到逻辑表达式中。[/p][table=98%]
[tr][td=1,1,100][b]操作符[/b][/td][td][b]说明[/b][/td][/tr]
[tr][td=1,1,100][b]<[/b][/td][td]小于[/td][/tr]
[tr][td=1,1,100][b]>[/b][/td][td]大于[/td][/tr]
[tr][td=1,1,100][b]<=[/b][/td][td]小于等于[/td][/tr]
[tr][td=1,1,100][b]>=[/b][/td][td]大于等于[/td][/tr]
[tr][td=1,1,100][b]<>[/b][/td][td]不等于[/td][/tr]
[tr][td=1,1,100][b]==[/b][/td][td]等于[/td][/tr]
[/table][p=30, 2, left]应用上述的关系运算符,我们可以对两个数值或字符串表达式进行对比,在下列的语句中,我们就是找到一个Bar,它的前一个Bar收盘价要高于前一个Bar最高价:[/p]Close>High[1];[p=30, 2, left]在字符串的比较运算中,首先是把每一个字符用它的ASCII来代替,其次对两个表达式中的字符逐一比较其ASCII值,从第一个开始,直到两个表达式中的所有字符都已经被计算完为止。例如:[/p]"abcd" < "zyxw";[p=30, 2, left]在这个例子中,我们对把第一个字符串表达式中的字符和第二个表达式中的字符进行比较运算,字母"a"的ASCII值是小于"z"的,同样其它的字符也是一样,所有该表达式的值为True。[/p]逻辑操作符[p=30, 2, left]逻辑运算符常常用于比较两个True/False的表达式,共有三个逻辑操作符:AND(),OR(||),NOT(!)。[/p][p=30, 2, left]下表列出AND逻辑操作符的应用情况:[/p][table=98%]
[tr][td=1,1,100][b]表达式1[/b][/td][td=1,1,100][b]表达式2[/b][/td][td][b]表达式1 AND 表达式2[/b][/td][/tr]
[tr][td=1,1,100][b]True[/b][/td][td=1,1,100][b]True[/b][/td][td][b]True[/b][/td][/tr]
[tr][td=1,1,100][b]True[/b][/td][td=1,1,100][b]False[/b][/td][td][b]False[/b][/td][/tr]
[tr][td=1,1,100][b]False[/b][/td][td=1,1,100][b]True[/b][/td][td][b]False[/b][/td][/tr]
[tr][td=1,1,100][b]False[/b][/td][td=1,1,100][b]False[/b][/td][td][b]False[/b][/td][/tr]
[/table][p=30, 2, left]下表列出OR逻辑操作符的应用情况:[/p][table=98%]
[tr][td=1,1,100][b]表达式1[/b][/td][td=1,1,100][b]表达式2[/b][/td][td][b]表达式1 OR 表达式2[/b][/td][/tr]
[tr][td=1,1,100][b]True[/b][/td][td=1,1,100][b]True[/b][/td][td][b]True[/b][/td][/tr]
[tr][td=1,1,100][b]True[/b][/td][td=1,1,100][b]False[/b][/td][td][b]True[/b][/td][/tr]
[tr][td=1,1,100][b]False[/b][/td][td=1,1,100][b]True[/b][/td][td][b]True[/b][/td][/tr]
[tr][td=1,1,100][b]False[/b][/td][td=1,1,100][b]False[/b][/td][td][b]False[/b][/td][/tr]
[/table][p=30, 2, left]下表列出NOT逻辑操作符的应用情况:[/p][table=98%]
[tr][td=1,1,100][b]表达式1[/b][/td][td][b]NOT表达式1[/b][/td][/tr]
[tr][td=1,1,100][b]True[/b][/td][td][b]False[/b][/td][/tr]
[tr][td=1,1,100][b]False[/b][/td][td][b]True[/b][/td][/tr]
[/table][p=30, 2, left]在上面的表格中,应用OR可以增加表达式的值为True的可能性,仅仅只要两个表达式中,只要有一个的值为True,那么整个表达式的值就为True。[/p][p=30, 2, left]其实在应用的过程中,还包含有一些复杂的组合运算。为了获得一个的关键反转Bar,可以使用如下的表达式:[/p]Low < Low[1] AND Close > High[1];[p=30, 2, left]在上面的表达式中,我们使用了AND逻辑运算符,因而要表达式的值为True,那么当前Bar的最低价一定要小于前一个Bar的最低价,而且当前Bar的收盘价还必须高于前一个Bar的最高价。只有当这两个条件都满足的时候,表达式的值才为True。[/p][p=30, 2, left]再看下面一个例子:[/p]High > 10 OR Vol > 5000;[p=30, 2, left]在上面的表达式中,如果要其值为True,那么只需要任意一个条件满足即值为True,那么表达式的值便为True,如果当前bar的最高价大于 10,或者成交量大于5000,那么表达式的值便为True。而如果需要表达式的值为False时,则两个条件都必须为False,表达式的值才为 False。[/p][p=30, 2, left]逻辑操作符的优先级低于数学操作符和关系操作符。逻辑操作符也遵循先括号的原则,如果没有括号,那么其运算顺序也是从左边到右边。[/p][p=30, 2, left]对于逻辑表达式中不同条件的先后顺序,可能会产生不同的运算逻辑,执行的效率也会有所不同。[/p][p=30, 2, left]以Con1 AND Con2这样的表达式举例,系统从左到右进行逻辑判断,当Con1为True时,需要继续判断Con2是否为True,只有当Con1,Con2都为 True时,整个表达式才为True。但是只要当Con1为False时,就不再需要判断Con2的值,而是直接返回False。[/p][p=30, 2, left]因此,以下的两个表达式在执行效率方面是有差异的:[/p]5 < 4 AND Close > Open;Close > Open AND 5 < 4;[p=30, 2, left]第一条语句的执行速度大部分情况下都比第二条要快。[/p][p=30, 2, left]对于Con1 OR Con2表达式,情况也比较类似,当Con1为False时,需要继续判断Con2是否为False,只有当Con1,Con2都为False时,整个表 达式才为False。但是只要当Con1为True时,就不再需要判断Con2的值,而是直接返回True。[/p][p=30, 2, left]以下两条语句的执行效率也是不一样的:[/p]5 > 4 OR Close > Open;Close > Open OR 5 > 4;[p=30, 2, left]通过上述的说明,我们应该知道,逻辑表达式的组合时,应该尽可能的把容易判别整个表达式逻辑的条件放在前面,以减少整个表达式的计算时间。[/p]

页: [1]