pfanag期货程序化交易交易开拓者TradeBlazer公式详细介Word文档格式.doc
- 文档编号:8556911
- 上传时间:2023-05-11
- 格式:DOC
- 页数:46
- 大小:383KB
pfanag期货程序化交易交易开拓者TradeBlazer公式详细介Word文档格式.doc
《pfanag期货程序化交易交易开拓者TradeBlazer公式详细介Word文档格式.doc》由会员分享,可在线阅读,更多相关《pfanag期货程序化交易交易开拓者TradeBlazer公式详细介Word文档格式.doc(46页珍藏版)》请在冰点文库上搜索。
T
当前Bar的时间。
Open
O
当前Bar的开盘价。
High
H
当前Bar的最高价。
Low
L
当前Bar的最低价。
Close
C
当前Bar的收盘价。
Vol
V
当前Bar的成交量。
OpenInt
无
当前Bar的持仓量。
CurrentBar
当前Bar的索引值,从0开始计数。
BarStatus
当前Bar的状态值,0表示为第一个Bar,1表示为中间的普通Bar,2表示最后一个Bar。
计算方法
TradeBlazer公式在计算时按照Bar数据的Bar数目,从第一个Bar到最后一个Bar,依次进行计算,如果公式中出现了调用Bar数据函数的,则取出当前Bar的相应值,进行运算。
如下图箭头所示,公式执行从上至下,Bar从左到右执行。
例如,现在有如下语句需要执行,Bar数据如下表所示:
Value1=Close-Open;
Value1
2005/04/04
15:
00
2970
2979
2951
2974
18
4
1
2005/04/05
2960
2946
14
2
2005/04/06
2980
2963
30
12
3
2005/04/07
3048
2968
2995
120
-57
2005/04/08
2985
2987
10
...
如上表所示,从CurrentBar=0开始,依次计算每个Bar进行计算;
在公式的编写中,经常会遇到当前Bar的数据和上一个Bar,上N个Bar数据进行比较,计算的情况,针对这种情况,TradeBlazer公式提供了一种处理机制:
回溯。
即对数据的向前引用,比如,获取上一个Bar的收盘价:
Close[1],获取10天前的成交量:
Vol[10]。
以下提供一个简单的例子来说明如何进行回溯处理。
假定有如下语句:
If(Close>
Close[1])
{
Buy(1,Close);
}
以上公式执行一个简单的操作,当前Bar的收盘价大于上一个Bar的收盘价,即执行按照当前收盘价买入1手的动作。
根据上表的数据,公式将在CurrentBar为2和3的时候调用Buy指令。
如果您足够仔细的话,您会发现:
对于上面的一段公式的执行,有一个小小的问题,当第一次计算公式时,即CurrentBar=0时,这个时候需要获取上一个Bar的数据,但是当前Bar已经是第一个Bar,这个时候就存在着问题,如何来获取此时的Close[1]呢,TradeBlazer公式将默认Close[1]为无效值,即系统函数中的InvalidNumeric,Close>
Close[1]的表达式计算结果是一个Bool值,其结果也是一个无效值,对于Bool值,我们将False作为其无效值。
因此,第一个Bar计算时,Buy指令不会被执行。
对于技术分析这类公式来说,假定Bar数据的总数共有100,相同的代码将从CurrentBar=0到CurrentBar=99共执行100遍,分别输出公式中的结果值。
注意:
在执行TradeBlazer公式时,可能出现数据不存在的情况,可通过系统函数HistoryDataExist进行判断,如果该函数返回True,即为Bar数据有效。
叠加数据
交易开拓者的超级图表支持商品叠加的显示,当叠加的图表调用各项公式时,可能有需要使用叠加的商品对应的基础数据,针对这样的需求,TradeBlazer公式提供了叠加数据的支持。
假定,我们新建一个超级图表模块,其主数据对应的商品为:
cu0503,在此基础上,我们叠加了cu0504和cu0505。
此时,根据叠加操作的先后顺序,cu0503为Data0,cu0504为Data1,cu0505为Data2,在TradeBlazer公式中,我们可以通过Data1.Close(),Data2.Vol()类似方法调用叠加Bar数据,叠加Bar数据的函数和Bar数据一样,只是需要在调用的时候加上数据源。
我们也可以使用Data0.Open()来调用Bar数据,默认情况下,可以省略对主数据源的指定,为了方便,一般直接使用Open()来代替Data0.Open()。
行情数据
除了Bar数据之外,TradeBlazer公式还可以支持实时行情数据的调用,行情数据是指当前商品最新的报价数据,该数据和Bar无关,行情数据的回溯没有意义。
行情数据只在最后Bar是有意义的,其他Bar会返回无效值。
因此,在调用行情数据函数时,为了提高效率,最好按照以下方法:
If(BarStatus()==2)
//调用行情数据函数
行情数据函数都按照以下格式命名Q_XXXXX,比如Q_Close,Q_BidPrice。
在调用行情数据的时候,需要判断当前行情数据是否有效,系统提供函数QuoteDataExist来对有效性进行判断。
如果行情数据已经准备好,返回True,否则,返回False。
属性数据
除了以上的各项数据之外,TradeBlazer公式还提供一组重要的属性数据,反映了该商品的一些基本信息,比如当前数据周期,买卖盘个数、保证金设置等信息。
在所有的Bar上面获取的市场属性数据都是一样的,属性数据的回溯没有意义。
关于属性数据的详细说明参见帮助文件附录。
数据类型
TradeBlazer公式支持有三种基本数据类型:
数值型、字符串、布尔型。
为了通过用户函数返回多个值,我们对三种数据类型进行了扩展,增加了引用数据类型。
另外,为了对变量,参数进行回溯,我们增加了序列数据类型。
因此,我们的数据类型共有九种,如下表所示:
名称
说明
Bool
布尔型。
BoolRef
布尔型引用。
BoolSeries
和周期长度一致的Bool型序列值。
Numeric
数值型。
NumericRef
数值型引用。
NumericSeries
和周期长度一致的Numeric型序列值。
String
字符串。
StringRef
字符串引用。
StringSeries
和周期长度一致的String型序列值。
命名规则
公式名称规则:
不区分大小写;
不能超过32个英文字符;
每一类公式不能出现相同的名称;
公式名称不能出现字母、数字、下划线以外的其他字符;
公式名称不能和系统保留字,系统函数等重名。
变量,参数规则:
每一个公式内部能不能重复命名;
名称不能出现字母、数字、下划线以外的其他字符;
名称不能和系统保留字,系统函数等重名;
不能使用已定义的用户函数名。
建议采取匈牙利命名规则命名变量,匈牙利命名规则是CharlesSimonyi发明的一种给变量取名字的方式。
他在变量前加上变量的类型,这样,看看变量的名字就知道变量的类型了。
语句
一个语句代表一个完全的指示或描述,语句中包含有保留字、操作符、符号。
并且语句总是以"
;
"
作为语句结束的标志。
以下为语句的一些例子:
1.Thisisonestatement;
2.Thisisanotherstatement;
3.Thisis
onestatement;
4.Thisis
another
statement
;
5.Thisisyetanother;
6.Thisisonestatement;
Thisisanother;
赋值语句
赋值语句用于给公式变量指定一个具体的值的语句,赋值语句使用赋值操作符(=)进行处理。
以下为赋值语句的一些例子:
Vars
Boolb;
Begin
B=true;
...
End
NumericValue1;
Value1=(Close+Open)/2;
Stringstr;
str="
ItIsATest!
变量在赋值的时候忽略其扩展数据类型,只考虑其基本数据类型,即NumericSeries,NumericRef,Numeric之间可以相互赋值。
此时序列数据类型只是对当前Bar的值进行操作。
保留字
保留字都有自己独特的意思或用途,主要是一些功能关键字,系统函数,以及数据类型等。
下面分类列举出系统主要的保留字。
包含3种基本类型,共9种数据类型能够,详细说明参见数据类型。
运算符
类型
算术运算符
+-*/%^
关系运算符
>
>
=<
<
===<
逻辑运算符
AND/&
&
OR/||NOT/!
括号
(){}[]
其它
.,
功能关键字
Params
用该关键字宣告参数定义的起始,参数必须填写默认值。
用该关键字宣告变量定义的起始(可以赋初值),变量不填写初值时,系统将自动为其填充初值。
If
条件语句。
Else
用该关键字宣告程序主体的起始。
用该关键字宣告程序主体的结束。
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,所以总是需要对其进行有效性验证,计算的速度会受到一定的影响,因此,对于除法表达式,我们强烈建议使用时尽可能转换为乘法处理,即提高执行速度,也可以避免未知的错误发生。
字符串操作符
是唯一的可以应用于控制字符串表达式的数学操作符,它可用于连接两个文本字符串为一个字符串。
如下:
这是一个字符串表达式,"
返回值为数值型。
ThisisexpressionA"
andthisisexpressionB."
上面字符串表达式的输出值,应该是"
这是一个字符串表达式,返回值为数值型。
和"
ThisisexpressionAandthisisexpressionB."
。
关系操作符
逻辑运算符使用下列标准的比较符号,大于、小于、等于、小于等于、大于等于和不等于。
下列的关系操作符号都可以应用到逻辑表达式中。
<
小于
大于
=
小于等于
大于等于
不等于
==
等于
应用上述的关系运算符,我们可以对两个数值或字符串表达式进行对比,在下列的语句中,我们就是找到一个Bar,它的前一个Bar收盘价要高于前一个Bar最高价:
Close>
High[1];
在字符串的比较运算中,首先是把每一个字符用它的ASCII来代替,其次对两个表达式中的字符逐一比较其ASCII值,从第一个开始,直到两个表达式中的所有字符都已经被计算完为止。
例如:
abcd"
"
zyxw"
在这个例子中,我们对把第一个字符串表达式中的字符和第二个表达式中的字符进行比较运算,字母"
a"
的ASCII值是小于"
z"
的,同样其它的字符也是一样,所有该表达式的值为True。
逻辑操作符
逻辑运算符常常用于比较两个True/False的表达式,共有三个逻辑操作符:
AND(&
),OR(||),NOT(!
)。
下表列出AND逻辑操作符的应用情况:
表达式1
表达式2
表达式1AND表达式2
下表列出OR逻辑操作符的应用情况:
表达式1OR表达式2
下表列出NOT逻辑操作符的应用情况:
NOT表达式1
在上面的表格中,应用OR可以增加表达式的值为True的可能性,仅仅只要两个表达式中,只要有一个的值为True,那么整个表达式的值就为True。
其实在应用的过程中,还包含有一些复杂的组合运算。
为了获得一个的关键反转Bar,可以使用如下的表达式:
Low<
Low[1]ANDClose>
High[1];
在上面的表达式中,我们使用了AND逻辑运算符,因而要表达式的值为True,那么当前Bar的最低价一定要小于前一个Bar的最低价,而且当前Bar的收盘价还必须高于前一个Bar的最高价。
只有当这两个条件都满足的时候,表达式的值才为True。
再看下面一个例子:
High>
10ORVol>
5000;
在上面的表达式中,如果要其值为True,那么只需要任意一个条件满足即值为True,那么表达式的值便为True,如果当前bar的最高价大于10,或者成交量大于5000,那么表达式的值便为True。
而如果需要表达式的值为False时,则两个条件都必须为False,表达式的值才为False。
逻辑操作符的优先级低于数学操作符和关系操作符。
逻辑操作符也遵循先括号的原则,如果没有括号,那么其运算顺序也是从左边到右边。
对于逻辑表达式中不同条件的先后顺序,可能会产生不同的运算逻辑,执行的效率也会有所不同。
以Con1ANDCon2这样的表达式举例,系统从左到右进行逻辑判断,当Con1为True时,需要继续判断Con2是否为True,只有当Con1,Con2都为True时,整个表达式才为True。
但是只要当Con1为False时,就不再需要判断Con2的值,而是直接返回False。
因此,以下的两个表达式在执行效率方面是有差异的:
5<
4ANDClose>
Open;
Close>
OpenAND5<
4;
第一条语句的执行速度大部分情况下都比第二条要快。
对于Con1ORCon2表达式,情况也比较类似,当Con1为False时,需要继续判断Con2是否为False,只有当Con1,Con2都为False时,整个表达式才为False。
但是只要当Con1为True时,就不再需要判断Con2的值,而是直接返回True。
以下两条语句的执行效率也是不一样的:
5>
4ORClose>
OpenOR5>
通过上述的说明,我们应该知道,逻辑表达式的组合时,应该尽可能的把容易判别整个表达式逻辑的条件放在前面,以减少整个表达式的计算时间。
表达式
表达式是操作符和保留字的有机组合,任意表达式都代表了一个值,表达式的值只能是以下的三种类型:
数值型:
即Numeric,NumericRef,NumericSeries三种数据类型。
布尔型:
即Bool,BoolRef,BoolSeries三种数据类型。
字符串:
即String,StringRef,StringSeries三种数据类型。
当您使用TradeBlazer公式的过程中,便可应用三种广泛数据类型的表达式,来完成您自己的程序。
数值型的表达式可以是一个数字,当然,他们也可以是一个数值型的保留字,例如:
保留字"
Close"
或者是通过运算符号组合的一个计算表达式,该表达式的结果是数值型。
下文中的例子都是数值型的表达式。
154;
Vol;
布尔型的表达式能够返回一个值True/False,或者说它可以对表达式的值进行评估,然后返回其值,要么为True,要么为False。
逻辑表达式永远要涉及到比较运算,下面我们有一些逻辑表达式,它也就是对一个表达式的值是True还是False进行判断。
2;
字符串的表达式可以是单个字符串,也可以字符串的组合,或者返回值为字符串的系统函数,如下,就是一个字符串的表达式:
Thisisateststringexpression"
;
Hello"
World"
Trim("
ILoveThisGame!
);
使用注释
注释可以标注解释语句,公式在编译执行时会忽略注释语句。
注释分为单行注释和多行注释。
单行注释
在单行中对需要注释部分之前通过添加//,使//之后的语句形成注释。
以下是注释的例子:
//这是一个注释语句;
多行注释
在需要注释的部分之前添加/*,之后添加*/,形成注释。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pfanag 期货 程序化 交易 开拓者 TradeBlazer 公式 详细