网站首页 >> 交易开拓者程序化平台介绍 >> 第五章 TB公式—初识公式

三、TB公式的运行机制

1TB公式的运行机制

TB语言做为一种高级语言,其语法简洁易懂,介于C++Pascal之间。其程序语言可以由多重数学、布尔值的计算以及逻辑判断等组成。TB公式属于编译型公式,即只有通过编译的公式程序方可被应用于图表,这样使得公式的执行更有效率。

n  TradeBlazer公式的运算步骤:

公式进行计算时,都是建立在基本数据源“Bar数据”之上。这里所指的“Bar数据”是指商品在不同时间周期下形成的序列数据,在单独的每个Bar上面包含开盘价、最高价、最低价、收盘价、成交量、持仓量以及时间等信息数据。Bar数据也是我们口头上常说的K线数据。(有关Bar数据参见后续的详细介绍)

TradeBlazer公式在计算时按照“Bar数据”的Bar数目,从左边第一个Bar依次执行到右边最后一个Bar,在单个Bar数据上的公式运算为从上到下完整执行公式中所有语句,即每次公式的运算都是从公式最上方的语句“参数的声明、变量的声明”开始直至公式的计算主体BeginEnd结束。如图5-5所示:

图5-5.             TB公式运行机制

n  实时数据的运算:

对于实时数据,每当有新的Tick进来,公式都会在当前Bar上对新数据执行一次完整的运算。若当前公式所应用的合约交易非常活跃并且公式程序较长、计算较复杂时,当前Tick到来之后与下一个Tick到来之前的这段时间之内,可能无法完成公式代码完整执行一遍的计算。 此时,虽然新的Tick到来,但是不会触发公式的重新运行,依然继续执行之前的计算直至代码的最后一行。 之后,当最新的Tick到来时,才会再次触发新一轮的公式运算。也就是说,在这种情况下,不是Bar中每一个Tick到来时都触发公式重新计算一次。

表:历史回测和实时交易的区别

 

历史回测

实时交易

Bar数据

确定不变

实时更新

公式运行

每根Bar一次

每个Tick一次

交易信号

固定不变

有可能变化

是否发单

是(受公式机制控制)

函数调用

部分函数无效

有效

2TB公式的分类

n  用户函数

用户函数是能够通过函数名称进行引用的指令集,它执行一系列操作实现一定的功能,返回一个结果值。用户函数不能直接加载在图表上,只能在其他用户函数或公式应用中调用。

n  公式应用

公式应用可直接应用于图表,分为技术分析和交易策略两类。其中技术分析类公式通过语句的控制在图表上输出数据、线型,借助这些图型的显示交易者可进行一系列直观的分析;交易策略类公式通过条件语句判断交易的入场点与出场点,在图表上对买卖点做出标识(交易信号)。

3TB公式的结构

TB公式一般分为三段,公式参数段,公式变量段,公式脚本段。

示例:在公式编辑器中打开系统公式DualMA,如图5-6所示:

图5-6.             TB公式的结构

n  公式参数段

定义公式中使用的参数,在Params之后。

参数是一个预先声明的地址,用来存放输入参数的值,在声明之后,可以在公式代码段使用该参数的名称来引用其值。

参数的值在公式的内部不能被修改,在整个程序中一直保持不变,不能对参数进行赋值操作(引用参数是个特例)

使用参数的优点:

²  调用公式应用时,根据需要指定相应的参数参与公式的计算,而不需要修改公式,重新编译;

²  可以通过修改公式应用不同的参数,测试交易策略的性能优劣,达到优化参数的目的。

 

n  公式变量段

定义公式应用中使用的变量,在Vars之后。

变量是一个存储值的地址,当变量被声明之后,就可以在脚本中使用变量,可以对其赋值,也可以引用变量的值进行计算。要对变量进行操作,直接使用变量名称即可。

变量的主要用处在于它可以存放计算或比较的结果,以方便在之后的脚本中直接引用,而无需重现计算过程。

使用变量的优点:

²  变量有助于程序的优化,有时TB公式必须重复调用一些数据,这些数据可能是某些函数(如:Bar数据,CloseVol等),也可能是通过表达式执行计算和比较的结果。因此,不重复运算,直接使用变量可以提高程序的运行速度,节约内存空间;

²  使用变量也可以避免输入错误,提高程序的可读性。

 

n  公式脚本段

编写公式应用的代码,包含在Begin End 之间。

公式脚本段是用户自由书写代码的位置,可以赋值、调用函数、使用控制语句……将自己的思路转换为符合TB语言语法的语句,通过编译之后加载到图表自动运行。