5评论

1收藏

TradeBlazer公式支持有三种基本数据类型:数值型、字符串、布尔型

avatar EA狙击手 | 6760 人阅读 | 5 人评论 | 2013-07-16

数据类型
TradeBlazer公式支持有三种基本数据类型:数值型、字符串、布尔型。
为了通过用户函数返回多个值,我们对三种数据类型进行了扩展,增加了引用数据类型。另外,为了对变量,参数进行回溯,我们增加了序列数据类型。因此,我们的数据类型共有九种,如下表所示:
名称
说明
Bool
布尔型。
BoolRef
布尔型引用。
BoolSeries
和周期长度一致的Bool型序列值。
Numeric
数值型。
NumericRef
数值型引用。
NumericSeries
和周期长度一致的Numeric型序列值。
String
字符串。
StringRef
字符串引用。
StringSeries
和周期长度一致的String型序列值。
命名规则
公式名称规则:
§ 不区分大小写;
§ 不能超过32个英文字符;
§ 每一类公式不能出现相同的名称;
§ 公式名称不能出现字母、数字、下划线以外的其他字符;
§ 公式名称不能和系统保留字,系统函数等重名。
变量,参数规则:
§ 不区分大小写;
§ 不能超过32个英文字符;
§ 每一个公式内部能不能重复命名;
§ 名称不能出现字母、数字、下划线以外的其他字符;
§ 名称不能和系统保留字,系统函数等重名;
§ 不能使用已定义的用户函数名。
注意: 建议采取匈牙利命名规则命名变量,匈牙利命名规则是 Charles Simonyi 发明的一种给变量取名字的方式。他 在变量前加上变量的类型,这样,看看变量的名字就知道变量的类型了。
语句
一个语句代表一个完全的指示或描述,语句中包含有保留字、操作符、符号。并且语句总是以""作为语句结束的标志。
以下为语句的一些例子:
1.           This is one statement;
2.           This is another statement;
3.           This is
one statement;
4.           This is
another
statement
;
5.           This is yet another;
6.           This is one statement;This is another;
赋值语句
赋值语句用于给公式变量指定一个具体的值的语句,赋值语句使用赋值操作符(=)进行处理。
以下为赋值语句的一些例子:
Vars    Bool b;Begin    B = true;    ...EndVars    Numeric Value1;Begin    Value1 = (Close + Open)/2;    ...EndVars    String str;Begin    str ="It Is A Test!";    ...End
变量在赋值的时候忽略其扩展数据类型,只考虑其基本数据类型,即NumericSeriesNumericRefNumeric之间可以相互赋值。此时序列数据类型只是对当前Bar的值进行操作。
保留字
保留字都有自己独特的意思或用途,主要是一些功能关键字,系统函数,以及数据类型等。
下面分类列举出系统主要的保留字。
数据类型包含3种基本类型,共9种数据类型能够,详细说明参见数据类型
运算符
类型
保留字
算术运算符
+ - * / % ^
关系运算符
> >= < <= == <>
逻辑运算符
AND/&& OR/|| NOT/!
括号
(){} []
其它
. ,
功能关键字
保留字
说明
Params
用该关键字宣告参数定义的起始,参数必须填写默认值。
Vars
用该关键字宣告变量定义的起始(可以赋初值), 变量不填写初值时,系统将自动为其填充初值。
If
条件语句。
Else
条件语句。
Begin
用该关键字宣告程序主体的起始。
End
用该关键字宣告程序主体的结束。
For
循环语句。
To
循环语句。
DownTo
循环语句。
While
循环语句。
Break
循环语句。
Continue
循环语句。
True
真。
False
假。
数据源
保留字
说明
Data0-Data49
支持50个数据源。
数据输出
保留字
说明
FieldBool
用户字段的布尔型返回数据。
FieldNumeric
用户字段的数值型返回数据。
FieldString
用户字段的字符串返回数据。
PlotBool
输出布尔型值。
PlotNumeric
输出数值型值。
PlotString
输出字符串值。
PlotBar
画K线型态。
UnPlot
取消指定位置的输出。
Alert
报警输出。
Buy
买入操作。
Sell
卖出操作。
...
其他系统函数。
操作符
操作符是一些象征具体操作运算行为的符号,例如操作符"+"代表对两个数求和,这些操作符适用于数值型、字符串、布尔型的数据。
TradeBlazer公式为您提供了多种操作运算符,便于您对保留字的操作和生成更复杂的数据类型、逻辑型、字符串类型的值。下面有四种不同类型的操作符可用于逻辑表达式、数值表达式、字符串表达式中。
数学操作符数值型表达式的操作符有几种,如下表所示:
操作符
说明
+
-
*
/
%
求模
^
求幂
()
括号
这些数学操作按其特定的优先级来进行计算,"^"(求幂)最先,其次是"*"(乘法)"/"(除法)"%"(求模),加和减最后,如果有多个乘法/除发(或者是加法或减法),那么计算顺序是从左边到右边。
例如,在数值型的表达式中:
High+2*range/2;
它首先计算的是range(此处range是指High-Low)2的积,接着计算与2的商(除法),最后求2*range/2与最高价(High)的和。
如果要找到一个Bar的中间位置,可以尝试写成如下语句:
High+Low/2;
然而在上面语句中,首先运算的是以最低价(Low)除于2,然后再与最高价求和。最后的值不是我们所需要的,并且和原来预想中的值是不一致的。
为了处理上述这样的情况,我们在运算符号中引入了括号"()",可以用括号来操作和控制运算的规则,先计算括号里面的表达式,不考虑外面的操作符和常量。因此,获取某一个Bar上的中间位置(MidPoint)的语句可如下:
(High+Low)/2;
该语句就是返回最高价和最低价之和的1/2,即Bar的中间位置。
对于除法,有一些特别的提示,众所周知,0不能作为除数,否则将会导致系统溢出。TradeBlazer公式在对脚本进行执行时,碰到除法符号时,都需要对除数进行是否为0的检查,以保证脚本能够正确的执行下去,当遇到除数为0的情况下,我们将会返回一个无效值。
上面描述到求中间位置(MidPoint)的表达式,其实我们可以用另外一种形式来代替它:
(High+Low)*0.5;
对于A/B这样的一个表达式,因为不知道B是否为0,所以总是需要对其进行有效性验证,计算的速度会受到一定的影响,因此,对于除法表达式,我们强烈建议使用时尽可能转换为乘法处理,即提高执行速度,也可以避免未知的错误发生。
字符串操作符"+"是唯一的可以应用于控制字符串表达式的数学操作符,它可用于连接两个文本字符串为一个字符串。如下:
"这是一个字符串表达式,"+"返回值为数值型。";"This is expression A"+" and this is expression B.";
上面字符串表达式的输出值,应该是"这是一个字符串表达式,返回值为数值型。""This is expression A and this is expression B."
关系操作符逻辑运算符使用下列标准的比较符号,大于、小于、等于、小于等于、大于等于和不等于。
下列的关系操作符号都可以应用到逻辑表达式中。
操作符
说明
<
小于
>
大于
<=
小于等于
>=
大于等于
<>
不等于
==
等于
应用上述的关系运算符,我们可以对两个数值或字符串表达式进行对比,在下列的语句中,我们就是找到一个Bar,它的前一个Bar收盘价要高于前一个Bar最高价:
Close>High[1];
在字符串的比较运算中,首先是把每一个字符用它的ASCII来代替,其次对两个表达式中的字符逐一比较其ASCII值,从第一个开始,直到两个表达式中的所有字符都已经被计算完为止。例如:
"abcd" < "zyxw";
在这个例子中,我们对把第一个字符串表达式中的字符和第二个表达式中的字符进行比较运算,字母"a"ASCII值是小于"z"的,同样其它的字符也是一样,所有该表达式的值为True
逻辑操作符逻辑运算符常常用于比较两个True/False的表达式,共有三个逻辑操作符:AND(&&)OR(||)NOT(!)
下表列出AND逻辑操作符的应用情况:
表达式1
表达式2
表达式1 AND 表达式2
True
True
True
True
False
False
False
True
False
False
False
False
下表列出OR逻辑操作符的应用情况:
表达式1
表达式2
表达式1 OR 表达式2
True
True
True
True
False
True
False
True
True
False
False
False
下表列出NOT逻辑操作符的应用情况:
表达式1
NOT表达式1
True
False
False
True
在上面的表格中,应用OR可以增加表达式的值为True的可能性,仅仅只要两个表达式中,只要有一个的值为True,那么整个表达式的值就为True
其实在应用的过程中,还包含有一些复杂的组合运算。为了获得一个的关键反转Bar,可以使用如下的表达式:
Low < Low[1] AND Close > High[1];
在上面的表达式中,我们使用了AND逻辑运算符,因而要表达式的值为True,那么当前Bar的最低价一定要小于前一个Bar的最低价,而且当前Bar的收盘价还必须高于前一个Bar的最高价。只有当这两个条件都满足的时候,表达式的值才为True
再看下面一个例子:
High > 10 OR Vol > 5000;
在上面的表达式中,如果要其值为True,那么只需要任意一个条件满足即值为True,那么表达式的值便为True,如果当前bar的最高价大于10,或者成交量大于5000,那么表达式的值便为True。而如果需要表达式的值为False时,则两个条件都必须为False,表达式的值才为False
逻辑操作符的优先级低于数学操作符和关系操作符。逻辑操作符也遵循先括号的原则,如果没有括号,那么其运算顺序也是从左边到右边。
对于逻辑表达式中不同条件的先后顺序,可能会产生不同的运算逻辑,执行的效率也会有所不同。
Con1 AND Con2这样的表达式举例,系统从左到右进行逻辑判断,当Con1True时,需要继续判断Con2是否为True,只有当Con1Con2都为True时,整个表达式才为True。但是只要当Con1False时,就不再需要判断Con2的值,而是直接返回False
因此,以下的两个表达式在执行效率方面是有差异的:
5 < 4 AND Close > Open;Close > Open AND 5 < 4;
第一条语句的执行速度大部分情况下都比第二条要快。
对于Con1 OR Con2表达式,情况也比较类似,当Con1False时,需要继续判断Con2是否为False,只有当Con1Con2都为False时,整个表达式才为False。但是只要当Con1True时,就不再需要判断Con2的值,而是直接返回True
以下两条语句的执行效率也是不一样的:
5 > 4 OR Close > Open;Close > Open OR 5 > 4;
通过上述的说明,我们应该知道,逻辑表达式的组合时,应该尽可能的把容易判别整个表达式逻辑的条件放在前面,以减少整个表达式的计算时间。
表达式
表达式是操作符和保留字的有机组合,任意表达式都代表了一个值,表达式的值只能是以下的三种类型:
§ 数值型: 即Numeric,NumericRef,NumericSeries三种数据类型。
§ 布尔型: 即Bool,BoolRef,BoolSeries三种数据类型。
§ 字符串: 即String,StringRef,StringSeries三种数据类型。
当您使用TradeBlazer公式的过程中,便可应用三种广泛数据类型的表达式,来完成您自己的程序。
数值型的表达式可以是一个数字,当然,他们也可以是一个数值型的保留字,例如:保留字"Close"。或者是通过运算符号组合的一个计算表达式,该表达式的结果是数值型。下文中的例子都是数值型的表达式。
154;
Vol;
(High+Low)/2;

布尔型的表达式能够返回一个值True/False,或者说它可以对表达式的值进行评估,然后返回其值,要么为True,要么为False。逻辑表达式永远要涉及到比较运算,下面我们有一些逻辑表达式,它也就是对一个表达式的值是True还是False进行判断。
Close > Open;
5 < 2;

字符串的表达式可以是单个字符串,也可以字符串的组合,或者返回值为字符串的系统函数,如下,就是一个字符串的表达式:
"This is a test string expression" ;
"Hello"+"World" ;
Trim(" I Love This Game! ");

使用注释
注释可以标注解释语句,公式在编译执行时会忽略注释语句。
注释分为单行注释和多行注释。
单行注释在单行中对需要注释部分之前通过添加//,使//之后的语句形成注释。以下是注释的例子:
//这是一个注释语句;
多行注释在需要注释的部分之前添加/*,之后添加*/,形成注释。以下是注释的例子:
/*这是一个多行注释的语句;*/
系统函数
TradeBlazer公式的系统函数,可根据使用范围在相应类型的公式中直接调用,计算后返回结果值。
目前的系统函数支持四种数据类型,除了TradeBlazer公式中定义的三种基本数据类型:Bool,Numeric,String之外,新加入Long(长整型)类型,使系统函数能够更加快捷的进行计算,TradeBlazer公式在处理的时候自动将Numeric和Long进行转化,用户无需进行特别的处理。
TradeBlazer公式现有的系统函数主要分为:数据函数、时间函数、数学函数、其它函数、交易函数、属性函数、账户函数、颜色函数、字符串函数等。每个系统函数都有自己的适用范围和使用规范,详细说明参见附录。
标点符号
通常,在写语句的过程中,会用到很多的标点符号。可用来定义参数、定义变量、创建规则的优先权。
例如,TradeBlazer公式用";"来标注一个语句结束。标点符号也是一个保留字,因为符号也是语言结构的一部分,在下表中列出了TradeBlazer公式中所用到的标点符号,和该标点符号所表达的意思:
符号
名称
说明
;
分号
语句结束的标志。
,
逗号
当函数带有多个参数时,用于分隔多个参数。
()
小括号
括号之内的表达式有计算的优先权。
""
双引号
字符串常量。
[]
中括号
回溯数据,引用以前的数据,或者数组中的元素。
{}
大括号
控制语句的起始。
.
扩展数据源的数据调用。
控制语句
TradeBlazer公式支持两大类的控制语句:条件语句循环语句
条件语句条件语句包括以下四类表达方式:
IfIf语句是一个条件语句,当特定的条件满足后执行一部分操作。
语法如下:
If (Condition){    TradeBlazer公式语句;}
Condition是一个逻辑表达式,当ConditionTrue的时候,TradeBlazer公式语句将会被执行,Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}
例如,您可以计算图表中上升缺口(当前Bar的开盘价高于上一个Bar的最高价)出现了多少次,只要在图表中使用If语句,当找到一个满足条件的Bar时,即条件为真时,变量加1,脚本如下:
Vars    NumericSeries Counter(0);Begin    If ( Open > High[1])    {        Counter = Counter[1] + 1;        ...    }       ...End
TradeBlazer公式中,If语句被广泛使用,如K线型态和特征走势,都需要大量的使用If语句,当条件满足的时候,在满足条件的Bar上面进行标记。例如,下面的语句就是特征走势的例子:
If(High > High[1] AND Low < Low[1]){    PlotNumeric("Outside Bar",High);}
If语句在不是用括号的情况,只执行下面的第一条语句,如下的语句,Alert不会只在条件为True时执行,而是每次都执行。
If(High > High[1] AND Low < Low[1])    PlotNumeric("Outside Bar",High);Alert("Outside Bar");
要想Alert只在条件为True时执行,您需要按照下面的格式编写:
If(High > High[1] AND Low < Low[1]){    PlotNumeric("Outside Bar",High);    Alert("Outside Bar");}
If-ElseIf-Else语句是对指定条件进行判断,如果条件满足执行If后的语句。否则执行Else后面的语句。
语法如下:
If (Condition){    TradeBlazer公式语句1;}Else{    TradeBlazer公式语句2;}
Condition是一个逻辑表达式,当ConditionTrue的时候,TradeBlazer公式语句1将会被执行;ConditionFalse时,TradeBlazer公式语句2将会被执行。Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}
例如,比较当前Bar和上一个Bar的收盘价,如果Close > Close[1]Value1 = Value1 + Vol;否则Value1 = Value1 - Vol,脚本如下:
If (Colse > Close[1])    Value1 = Value1 + Vol;Else    Value1 = Value1 - Vol;
If-Else-IfIf-Else-If是在If-Else的基础上进行扩展,支持条件的多重分支。
语法如下:
If (Condition1){    TradeBlazer公式语句1;}Else If(Condition2){    TradeBlazer公式语句2;}Else{     TradeBlazer公式语句3;}
Condition1是一个逻辑表达式,当Condition1True的时候,TradeBlazer公式语句1将会被执行,Condition1False时,将会继续判断Condition2的值,当Condition2True时,TradeBlazer公式语句2将会被执行。Condition2False时,TradeBlazer公式语句3将会被执行。Condition1Condition2可以是多个条件表达式的逻辑组合,条件表达式必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}
If-Else-If的语句可以根据需要一直扩展,在最后的Else之后再加If(Condition)和新的执行代码即可。当然您也可以省略最后的Else分支,语法如下:
If (Condition1){    TradeBlazer公式语句1;}Else If(Condition2){    TradeBlazer公式语句2;}
If-Else的嵌套If-Else的嵌套是在If-Else的执行语句中包含新的条件语句,即一个条件被包含在另一个条件中。
语法如下:
If (Condition1){    If (Condition2)    {        TradeBlazer公式语句1;    }Else    {        TradeBlazer公式语句2;    }}Else{    If (Condition3)    {        TradeBlazer公式语句3;    }Else    {        TradeBlazer公式语句4;    }}
Condition1是一个逻辑表达式,当Condition1True的时候,将会继续判断Condition2的值,当Condition2True时,TradeBlazer公式语句1将会被执行。Condition2False时,TradeBlazer公式语句2将会被执行。当Condition1False的时候,将会继续判断Condition3的值,当Condition3True时,TradeBlazer公式语句3将会被执行。Condition3False时,TradeBlazer公式语句4将会被执行。Condition1Condition2Condition3可以是多个条件表达式的逻辑组合,条件表达式必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}
例如,在一个交易指令中,条件设置如下:当前行情上涨的时候,如果收盘价高于开盘价时,则产生一个以收盘价买入1张合约;否则产生一个以开盘价买入1张合约。当前行情没有上涨的时候,如果收盘价高于开盘价,则产生一个以收盘价卖出1张合约;否则产生一个以开盘价卖出1张合约。脚本如下:
If (Open > High[1]){    If (Close>Open)    {        Buy(1,Open);    }Else    {        Buy(1,Close);    }}Else{    If (Close > Open)    {           Sell(1,Open);    }Else    {        Sell (1,Close);    }}
循环语句循环语句包括两种表达方式:ForWhile
ForFor语句是一个循环语句,重复执行某项操作,直到循环结束。
语法如下:
For 循环变量 = 初始值 To 结束值{    TradeBlazer公式语句;}
循环变量为在之前已经定义的一个数值型变量,For循环的执行是从循环变量从初始值到结束值,按照步长为1递增,依次执行TradeBlazer公式语句。结束值必须大于或等于初始值才有意义,初始值和结束值可以使用浮点数,但是在执行过程中会被直接取整。只计算其整数部分。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}
第一次执行时,首先将循环变量赋值为初始值,然后判断循环变量是否小于等于结束值,如果满足条件,则执行TradeBlazer公式语句,同时循环变量加1。接着重新判断循环变量是否小于等于结束值,一直到条件为False,退出循环。
例如,以下的用户计算Price最近Length周期的和。
Params    NumericSeries Price(1);    Numeric Length(10);Vars    Numeric SumValue(0);    Numeric i;Begin    for i = 0 to Length - 1    {        SumValue = SumValue + Price;    }    Return SumValue;End
如果希望For语句从大到小进行循环,可以使用以下的语法:
For 循环变量 = 初始值 DownTo 结束值{    TradeBlazer公式语句;}
For-DownTo让循环变量从结束值每次递减1直到等于结束值,依次调用TradeBlazer公式语句执行,初始值必须大于或等于结束值才有意义。
For语句是比较常用的一种循环控制语句,它应用于知道循环次数的地方,很多内建用户函数中都使用For语句来完成相应的功能,比如SummationHighestLowestLinearReg等。
WhileWhile语句在条件为真的时候重复执行某一项操作。即,只要条件表达式的值为真(True)时,就重复执行某个动作。直到行情信息改变以致条件为假(False)时,循环才结束。
语法如下:
While (Condition){    TradeBlazer公式语句;}
Condition是一个逻辑表达式,当ConditionTrue的时候,TradeBlazer公式语句将会被循环执行,Condition可以是多个条件表达式的逻辑组合,Condition必须用()括起来。
TradeBlazer公式语句是一些语句的组合,如果TradeBlazer公式语句是单条,您可以省略{},二条或者二条以上的语句必须使用{}
例如,以下的公式用来计算要产生大于100000成交量需要最近Bar的个数:
Vars    Numeric       SumVolume(0);    Numeric       Counter (0);Begin    While (SumVolume < 100000)    {        SumVolume = SumVolume + Vol[Counter]        Counter = Counter + 1;    }End
首先,我们定义两个变量SumVolumeCounter,并将其默认值设为0。当SumVolume <100000这个表达式为True时,While内的TradeBlazer公式语句一直被调用,将前CounterBarVol加到SumVolume中,当SumVolume大于等于100000时,退出循环。
在使用While循环的时候,有可能会遇到循环一直执行,永远不能退出的情况,这种情况我们称之为死循环,比如下面的语句;
While (True){    TradeBlazer公式语句;}
在这种情况下,循环将一直执行,导致程序不能继续工作,在这种情况,我们可以使用Break来跳出循环,详细情况参加下节。
Break针对上节的例子,要想从死循环中跳出,我们可以在循环之中添加Break语句,如下:
While (True){    TradeBlazer公式语句;    If (Condition)        Break;}
循环在每次执行后,都将判断Condition的值,当ConditionTrue时,则执行Break语句,跳出整个循环。
Continue有的时候在循环中,我们可能希望跳过后面的代码,进入下一次循环,在这种情况下,可以使用Continue语句来达到目的,如下:
While (Condition1){    TradeBlazer公式语句1;    If (Condition2)             Continue;    TradeBlazer公式语句2;}
Condition1满足时,循环被执行,在执行完TradeBlazer公式语句1后,将判断Condition2的值,当Condition2True,将跳过TradeBlazer公式语句2,重新判断Condition1的值,进入下一次循环。否则将继续执行TradeBlazer公式语句2
""
还没有人打赏,支持一下

评论|共 5 个

胡姬花看看

发表于 2014-12-9 12:05:51 | 显示全部楼层

看看,看看。谢谢。你要发,我也要发。

besodk

发表于 2015-1-29 17:13:28 | 显示全部楼层

赚钱,赚积分。顶....

王城

发表于 2015-2-2 12:52:21 | 显示全部楼层


继续,学习了

sznon

发表于 2015-2-21 22:44:25 | 显示全部楼层

路过。。看下先。

jianghai123

发表于 2015-2-22 11:06:01 | 显示全部楼层

今天黄金怎么操作

您需要登录后才可以回帖 登录 | 注册 微信登录

EA之家评论守则