加载中…
个人资料
tony
tony
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,179
  • 关注人气:83
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

TB策略编辑器(集成开发环境IDE)分析之一TB代码编译原理

(2012-12-09 15:14:49)
标签:

tb

策略

c

编译

财经

分类: 证券交易技术

TB策略编辑器(集成开发环境IDE)分析之一TB代码编译原理

 

2008年开始使用TB算起,已经有近5年的时间了,一直没有仔细看过TB代码的机制。原本一直以为它是解释执行的,直到昨天才心血来潮,看了下TB的安装目录下的文件,纠正了我以前的想法。原来TB代码最终会编译成DLL(Windows下的PE文件)。也就是说TB代码其实就是C++代码,只不过它把它封装了一层,方便策略开发者编写而已,其实质还是C++代码。

 

下面以TB安装目录的文件结构开始说起:

SYSTEM/FORMULA/Bin目录下是代码编译的核心文件,说白了其实就是微软的Visual Studio

http://s6/bmiddle/8a5f025agd0664741bfb5&690

TB安装目录截图)

 

上图中的CL.EXELINK.EXE分别是:Microsoft® C/C++ Compiler DriverMicrosoft® Incremental Linker。这个就是我们平时在Windows平台下使用Microsoft Visual Studio进行C++开发使用的编译和链接器,通过这两个程序把C++源代码编译成可执行文件。那么在写TB代码的时候,写的并不是C++代码,TB又是怎么把编译的呢?请接着看。

 

 

 

 

 

 

 

 

 

 

Ø  TB代码集成开发环境IDE

 

http://s16/bmiddle/8a5f025agd0664832836f&690

TB代码集成开发环境IDE截图)

在编写TB策略的时候,就是在上图所示的界面下编写代码。在安装目录的一层目录下有个TBCompiler.dll的文件,该文件就是TB代码集成开发环境IDE的实现(从TBCompiler.dll的导出函数上推断的)。

在上图所示中,新建了一个公式命名为TS_Test_20121208,里面的代码使用了TB默认提供的代码模版。

当点击编译的时候,TB经过如下阶段处理

1.         编译前预处理:把TB代码处理成C++代码、保存到临时目录下。

2.         编译:调用CL.EXE LINK.EXE进行编译和链接。

3.         编译后处理:删除临时文件、复制DLL文件、更新公式描述文件。

 

 

Ø  编译过程详述

 

1、  编译前预处理

如下图所示,TB会自动生成tbs文件夹,该文件夹内只有一个文件,该文件的内容是经过转换后的C++代码,文件命名方式是:<</span>策略名字>.cpp

http://s10/bmiddle/8a5f025agd06648e9a3e9&690

打开该文件,文件大概有1000多行,其中99%的都是固定的(可以使用公共头文件来include,可能有些原因TB不想公开出来的缘故吧或许是其他因素,所以没有这么做)。

http://s12/bmiddle/8a5f025agd06649d6dc1b&690

上图是TS_Test_20121208.cpp文件内容和TB代码对比。红色框中就是TB代码转换到C++代码的样本。内容几乎完全一样。

 

2、编译

         cl.exe

link.exe

 

详细使用方式,可以参阅微软的帮助文档。

 

3、编译后处理

         编译成功后, 自动删除临时文件、复制DLL文件到study目录下、更新公式描述文件。

 

在对应目录下的文件:

Formula/tree

http://s8/bmiddle/8a5f025agd0664af21467&690

 

Formula/study

http://s8/bmiddle/8a5f025agd0664bba2f47&690

 

CMD环境下输入如下命令:dumpbin /EXPORTS TS_Test_20121208.dll 

如下图中黄色箭头所指该DLL导出Execute函数,在策略运行的时候,TB会装载该DLL,并调用Execute函数。

 

http://s3/bmiddle/8a5f025agd0664d1bc282&690

 

Ø  总结

http://s6/bmiddle/8a5f025agd0664e524fc5&690

TB代码各段含义与C++代码的对应表:

TB代码

C++代码

Params

Exceute函数参数

Vars

Execute函数内临时变量

Begin End

Exceute函数内紧跟临时变量的逻辑代码

 

²  那是否存在自己编写C++代码放到TB里面运行的可能性呢?

请参看《TB策略编辑器(集成开发环境IDE)分析之二使用C++开发TB策略》

 

l  免责声明

上述内容不代码任何观点,仅凭本人兴趣爱好仓促撰写,不保证内容准确性和完整性。











0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有