开拓者期货期权程序化系统交易论坛

标题: TradeBlazer公式的HelloWorld! [打印本页]

作者: nopain    时间: 2007-7-25 15:42:48     标题: TradeBlazer公式的HelloWorld!

从第一版C语言推出,"Hello World"这个经典程序,就成为全世界程序员挥之不去的情结。那么在TB中的HELLO WORLD是怎么写的呢?
首先,为了方便讨论,我们先设置一下环境:打开超级图表,选择一个当前没有行情的品种,比如IF0705。再鼠标右键菜单中选择“商品设置”,只显示最后5个样本。
然后,新建立一个指标,取名为HelloWorld,输入如下代码并保存:
  1. Begin
  2.         FileAppend("c:\\Formula.log","hello world");
  3. End
复制代码

最后,把指标HelloWorld插入到 超级图表中。
图表上并不会有什么输出,但是C盘根目录下会产生一个Formula.log文件。该文件的内容为:
hello world
hello world
hello world
hello world
hello world

如果你能执行到这一步,看见文件中的5行hello world,那么恭喜你,你的第一个TB语言公式已经完成了!具体有多少行hello world取决于你在超级图表中设置的样本数目,刚才设置了5个样本,所以是5行hello world字符串。

FileAppend函数是TB中的写文件函数,可以在指定文件中追加一行字符串。该函数的语法原型为:
Bool FileAppend(String strPath,String strText);
参数strPath: 指定文件的路径,请使用全路径表示,并使用\\做路径分割符。
参数:strText 输出的字符串内容 。

这个函数非常重要!它不仅仅是写文件这么简单,因为TB中没有公式的单步执行调试工具,所以公式的调试往往是通过把你要查看的变量值输出到文件来完成的。比如,你要查看CLOSE的值,那么
  1. FileAppend("c:\\Formula.log","Close = "+Text(Close));
复制代码

其中Text函数可以把数值类型转换成字符串。
我们可以进一步把HelloWorld中的内容改为:
  1. Begin
  2.         FileAppend("c:\\Formula.log","Bar"+Text(CurrentBar)+"          hello world");
  3. End
复制代码

CurrentBar函数返回的是当前BAR的索引值,该值从0开始递增。如果图表中的样本数是5,那么这5根BAR的索引从左到右分别是:0、1、2、3、4。保存公式之后,文件Formula.log中的内容将是:
Bar0          hello world
Bar1          hello world
Bar2          hello world
Bar3          hello world
Bar4          hello world

这就清楚地显示了FileAppend函数分别在每个一个BAR上都执行了一遍,一共执行了5遍。

你可能认为公式理所当然地应该执行5遍,因为有5个BAR啊。并非如此!不同的软件,不同的语言公式架构是不同的。类分析家语言,比如文华、飞狐等等,都只执行一遍!

我们把一个公式看成是一个整体黑盒,类分析家语言是把5根BAR作为一个整体输入,公式里的每个语句都只执行一遍,整个公式也只执行一遍,然后便输出了。所以,在类分析家语言中是无法实现IF语句和WHILE循环语句的,所有的复合语句都无法实现。要做就只能在底层用C语言遍成函数做特殊处理。如果你是程序员,你大概早就会很奇怪为什么几乎所有语言都有IF语句和WHILE、FOR语句,而分析家、文华、飞狐中却只有IF函数呢?原因就就在这里了。

而TB不是这样。TB是把第一根BAR作为输入传给公式,得到一个输出。然后再传入第二根,第三根……有多少根BAR,公式就会被执行多少次。用这样一种机制,就可以实现公式和算法的精确控制。

很多用惯了类分析家语言平台的投资者总会觉得TB语言很难学。其实并不是语法难学,而在于处理机制不同导致的编程思维模式的不同。如果你要学习TB语言,那么了解它的这个处理框架,从原有的编程思维中跳出来就显得非常重要。

[ 本帖最后由 nopain 于 2007-8-2 16:32 编辑 ]
作者: bcsunwww    时间: 2007-7-25 23:22:24

讲得真好!FileAppend对调试公式是一个很好的工具,对TB公式的运行机理也更清晰了.
作者: guidaon    时间: 2007-8-16 09:25:47

还有点看不明白
作者: stevehans    时间: 2007-8-24 02:47:12

很有意思,只是有一个问题不明白。在helloword那里,为什么会有这种情况,如果把超级图表中的指标都删除,就不会在根目录里有那个文件了。好像至少要有一个指标的样子,不知道为什么。
作者: nopain    时间: 2007-8-24 08:22:10

您新建的这个HelloWorld指标,必须放在图中才会被执行
作者: stevehans    时间: 2007-8-25 00:01:45

我是说,把别的指标都删除了,只有这一个helloword指标,好像也不能显示阿。好像至少要有ma的样子
作者: nopain    时间: 2007-8-25 06:58:29

原帖由 stevehans 于 2007-8-25 00:01 发表
我是说,把别的指标都删除了,只有这一个helloword指标,好像也不能显示阿。好像至少要有ma的样子


这个指标没有显示内容,只输出调试信息!
作者: nopain    时间: 2007-8-26 09:12:03

原帖由 wgcpsxj 于 2007-8-26 07:54 发表
初学者该如何入手学习
IF语句和WHILE循环语句 、FOR语句?


看看Sumamation,Cum等用户函数就应该能理解IF,For语句,While用的比较少,可暂时不关注!
作者: markjiang    时间: 2007-8-28 22:55:12

学习TB第一天!
立志做一个优秀的程序化交易设计员!
好好学习!
谢谢论坛!
作者: ilian    时间: 2007-9-24 23:30:03

原帖由 nopain 于 2007-7-25 15:42 发表
你可能认为公式理所当然地应该执行5遍,因为有5个BAR啊。并非如此!不同的软件,不同的语言公式架构是不同的。类分析家语言,比如文华、飞狐等等,都只执行一遍!

我们把一个公式看成是一个整体黑盒,类分析家语言是把5根BAR作为一个整体输入,公式里的每个语句都只执行一遍,整个公式也只执行一遍,然后便输出了。所以,在类分析家语言中是无法实现IF语句和WHILE循环语句的,所有的复合语句都无法实现。要做就只能在底层用C语言遍成函数做特殊处理。如果你是程序员,你大概早就会很奇怪为什么几乎所有语言都有IF语句和WHILE、FOR语句,而分析家、文华、飞狐中却只有IF函数呢?原因就就在这里了。


其实分析家等和TB运行机制是一样的哦,平台本身就有一个隐藏的主循环。有多少BAR就执行多少遍语句。而且分析家和飞狐也都有IF语句和WHILE、FOR循环语句的,所有的复合语句都可实现哦。还有分析家的调试工具比TB和TS要强大的多哦。TB参考TS但是还没有把它的程序简洁易懂模仿过来哦。
作者: ATL    时间: 2007-10-14 23:00:14

可否让FileAppend直接生成EXCel格式文件?
作者: pwqzc    时间: 2007-10-15 09:00:57

其实分析家等和TB运行机制是一样的哦,平台本身就有一个隐藏的主循环。有多少BAR就执行多少遍语句。而且分析家和飞狐也都有IF语句和WHILE、FOR循环语句的,所有的复合语句都可实现哦。还有分析家的调试工具比TB和TS要强大的多哦。TB参考TS但是还没有把它的程序简洁易懂模仿过来哦

你大错特错
作者: ilian    时间: 2007-10-15 10:05:08

原帖由 pwqzc 于 2007-10-15 09:00 发表
其实分析家等和TB运行机制是一样的哦,平台本身就有一个隐藏的主循环。有多少BAR就执行多少遍语句。而且分析家和飞狐也都有IF语句和WHILE、FOR循环语句的,所有的复合语句都可实现哦。还有分析家的调试工具比TB和TS要强 ...


哪里错了哦?
作者: hugingco    时间: 2007-10-16 08:45:31

请问,目前不存在的合约如何打开啊?如cu0701
作者: nopain    时间: 2007-10-16 09:21:04

cu0701的数据已经合并到cu0801的连续图中了,您选中cu0801,在图表工具栏中选择CC按钮,多取一段数据,前面的就是cu0701的数据,当然,您可以通过时间段的方式取出所有的cu0701的数据。
作者: lvpeng1020    时间: 2007-11-6 11:09:20     标题: 顶!!!

正在学习
作者: jxll    时间: 2007-12-8 08:36:15     标题: HelloWorld

我按版主的方式操作,没有出现输入代码的窗口。

我的操作是这样的,打开超级图表,右键,点商品设置,样本数选5,确定:然后在TB公式栏选新建技术指标,简称——HelloWorld,名称——HelloWorld,其他不变,点确定。然后点公式管理器----没有反映------是那里出错了,望指点。
作者: skywalker    时间: 2007-12-8 14:34:31

原帖由 jxll 于 2007-12-8 08:36 发表
我按版主的方式操作,没有出现输入代码的窗口。

我的操作是这样的,打开超级图表,右键,点商品设置,样本数选5,确定:然后在TB公式栏选新建技术指标,简称——HelloWorld,名称——HelloWorld,其他不变,点确定。然后点公式管理器---- ...


图表上是没有反应的.因为HELLO WORLD并不是把结果输出图表,而是把结果输出到文件.你要找到那个输出文件,然后查看该文件的内容.
作者: winade    时间: 2007-12-25 11:29:43

你好,版主,我是初学者。“超级图表”是什么意思?
作者: 小米    时间: 2007-12-25 11:31:58

你好,版主,我是初学者。“超级图表”是什么意思?


超级图表就是指K线图.打开来看一下就明白了.
作者: nickchen    时间: 2007-12-25 20:08:55

还是边学公式边在TB上练习效果最好 不明白的地方可以到这里来请教老师们的 俺也是这样学的 尽管还没有学到老师的真经 但是还是感觉这里的老师都非常的好 而且都非常的祥和!常在这里一定能学到真东东的
作者: TB游戈    时间: 2007-12-30 10:46:37

有点看懂了。
看来我还是懂的太少了。
作者: hongweilei    时间: 2008-1-12 15:01:53

TradeBlazer程序员
本人从事TradeBlazer公式开发已有一段时间
作者: feng1234567    时间: 2008-1-23 17:24:47

学习了哦
顶上!!
作者: kelly    时间: 2008-2-4 11:02:08

还是边学公式边在TB上练习效果最好 不明白的地方可以到这里来请教老师们的 俺也是这样学的 尽管还没有学到老师的真经 但是还是感觉这里的老师都非常的好 而且都非常的祥和!常在这里一定能学到真东东的

确实如此,我也正在学习中! 并在此提前跟论坛的各位老师拜年了,祝TB论坛越办越好!
作者: biblinvest    时间: 2008-4-11 15:16:28

这个例子非常的好,尤其选择写入文件这样的对调试有重要意义的函数来做例子,真是一个非常好的入门教程!感谢管理员!
作者: 牛在天上飞    时间: 2008-5-29 22:33:23

开始学习了,眼前一片迷芒,不知从何处入手
作者: 小米    时间: 2008-5-30 09:18:31

看把F1里面的帮助文档看一遍
作者: f600624    时间: 2008-9-26 21:43:25

感觉没用过文华的C、Pascal程序员学起来比较方便。
作者: sparrow    时间: 2008-11-2 10:22:12     标题: 学习了

顶顶
学习了学习了~!!1
作者: sparrow    时间: 2008-11-2 10:23:20     标题: 呵呵


学习公式~!
作者: kam58    时间: 2008-11-2 11:13:34

支持楼主,不错!
作者: xixi23242008    时间: 2008-12-15 13:42:29

新手,真的希望能学会设计程序啊,不知道行不行!
作者: cfmx2007    时间: 2008-12-15 15:24:11

学习 C# 2008、SQL Server2008、WPF吧。。。
作者: 如影随形    时间: 2008-12-29 00:15:03

从此开始学习编程,踏上程式化交易之路,借TB之道通向交易的自由王国!!!
        立此帖为证,2009年的今日学会TB编程!!!
作者: zihonggu    时间: 2009-1-3 00:05:33     标题: 我也想这样

从此开始学习编程,踏上程式化交易之路,借TB之道通向交易的自由王国!!!
        立此帖为证,20010年的今日学会TB编程!!!
作者: linqian    时间: 2009-1-4 16:47:21

这样看来是和指南针的编程方式一样的!

文华、分析家、飞狐很多指标是无法实现的!

文华可以看到很多外盘数据和股市,不知TB是否可以实现?
作者: helloworld    时间: 2009-1-8 13:32:58

感谢nopain大哥!  NOpain NOgain,2009年加油!

非常感谢
作者: wk668668    时间: 2009-2-20 22:34:46

我也是刚开始学习TB的编程,祝大家在学习中进步!感谢各位高手和老师的指导!
作者: gambro    时间: 2009-2-26 17:00:41

学习TB第一天!
立志做一个优秀的程序化交易设计员!
好好学习!
谢谢论坛!
作者: chenjunruonline    时间: 2009-4-11 10:47:05

不错    学习

[ 本帖最后由 chenjunruonline 于 2009-4-11 10:52 编辑 ]
作者: 高架桥    时间: 2009-5-29 21:12:38

我先粗粗学习了一下F1,回头来看这个贴,很容易懂啊
不过报告Nopain老师,我的文件输出有3种情况
第一种:按照设定IF0804,设置5个样本,再调用helloworld指标,输出的确同顶楼所示

第二种:紧接着删去Formula.log,商品切换成IF0805,文件里显示
Bar0          hello world
Bar1          hello world
Bar2          hello world
Bar3          hello world
Bar4          hello world
Bar4          hello world
也就是最后一根BAR多执行了一遍

第三种:再紧接着删去Formula.log,商品切换成IF0804,文件里显示
Bar0          hello world
Bar1          hello world
Bar2          hello world
Bar3          hello world
Bar4          hello world
Bar0          hello world
Bar1          hello world
Bar2          hello world
Bar3          hello world
Bar4          hello world
也就是全部BAR被执行了2遍,有点晕啊

再试,第一次切换到一个品种IF0903的话,又正常了,回头删去文件第二次切换IF0903,又执行了2遍
作者: 高架桥    时间: 2009-5-29 21:15:09

也就是一个品种第一遍执行是正常的,删去文件后切换回第2遍就不太正常了,难道是没有执行传说中的文件 CLOSE 命令?
作者: 高架桥    时间: 2009-5-29 21:36:52

不删文件,每次进入商品设置确定一下,文件增加行数的就是2遍的BAR数
作者: yz2222    时间: 2009-7-30 09:36:09

学习TB第一天!
立志做一个优秀的程序化交易设计员!
好好学习!希望版主和大家支持!
谢谢论坛!
作者: lh948    时间: 2009-7-30 10:04:45     标题: 回复 46# yz2222 的帖子

努力加油,有问题自己解决不了可以在论坛上提出
作者: dragonlong    时间: 2009-8-10 10:38:46

每次运行的时候是不是上一次的运行结果保留在内存里啊 每次重新运行打开formula都有很多记录
作者: lh948    时间: 2009-8-10 10:47:53     标题: 回复 48# dragonlong 的帖子

每次运行完都会保留在formula里的,所以再次打开可以看到之前的记录的
作者: dragonlong    时间: 2009-8-10 11:01:52

那我可以删掉这些记录吗 而且我删掉这个文件后再次运行仍然还有

[ 本帖最后由 dragonlong 于 2009-8-10 11:46 编辑 ]
作者: lh948    时间: 2009-8-10 17:39:29     标题: 回复 50# dragonlong 的帖子

可以删掉的
作者: aaaddd3    时间: 2009-9-22 09:26:58     标题: 请问

取名为HelloWorld,输入如下代码并保存: 复制内容到剪贴板 代码:Begin
        FileAppend("c:\\Formula.log","hello world");
End
在哪里输入代码啊?
作者: aaaddd3    时间: 2009-9-22 09:34:15     标题: 多用示意图解释就好了

俗话说,一图胜千言万语,多用图解释我们不懂编程的菜鸟就容易理解了。
作者: sy6789    时间: 2009-11-15 19:22:38

我也想这样
从此开始学习编程,踏上程式化交易之路,借TB之道通向交易的自由王国!!!
        立此帖为证,20010年的今日学会TB编程!!!
作者: ZCQ    时间: 2009-11-15 22:27:18

开拓者的工作人员辛苦了!
作者: pwg18    时间: 2009-12-7 13:14:40

晕,看不懂啊.不知从何入手啊.
程序没文化那么简单容易上手啊.由其是对英文不懂的人.很想入手却不知怎么入.还望TB能有所简化.
作者: tcpx    时间: 2010-1-25 15:44:05

看的和天文一样,斑竹能否指点一二,我的qq170838704
作者: 63111    时间: 2010-4-7 20:35:23

学习TB第一天!搞懂了
作者: 林斌林    时间: 2010-4-10 00:55:00

您新建的这个HelloWorld指标,必须放在图中才会被执行
作者: 江听    时间: 2010-8-12 13:46:53

学习了
谢谢,林夕
作者: bbkingmax    时间: 2010-8-25 20:45:53

尝试了好几遍 测试老通不过 能出本手册就好了
作者: ccbban    时间: 2010-10-23 22:17:31

昨天开始正式学习,今天已经试验过3中交易系统了,奇怪的是,收益率的图显示的时间总是不对头。
作者: lyj19870105    时间: 2010-10-26 20:38:42

不做程序员很久了  还要慢慢捡回来啊
作者: hyqhgs    时间: 2011-2-11 13:10:00

看帖留名 养成好习惯

讲的很详细


作者: eagle    时间: 2011-2-12 10:44:40

成功执行!
留爪庆贺!!
作者: 旅行者    时间: 2011-2-20 10:44:30

基本弄明白了
想咨询下 Bar"+Text(CurrentBar)+" 这几个+号作用是什么。开始以为是空格 删掉后不能编译…… 请指教
作者: czs    时间: 2011-2-21 12:59:31

有点懂了、、、、、、、、
作者: 半话李    时间: 2011-3-16 14:23:27

回复 66# 旅行者


    加号是字符串的连接符号
作者: 一网情深    时间: 2011-4-17 21:20:08

看贴留名 正式开始学习tb 争取一年后走上程序化交易之路
作者: sorry2008    时间: 2011-5-10 15:59:24

谢谢老师
作者: jyzqluohy    时间: 2011-5-15 18:08:13

Begin
        FileAppend("E:\\TB\\Formula.log","bar:"+text(CurrentBar)+ " Close = "+Text(Close)+" Open="+Text(Open));
End
修改成这样,可以看到每根K线的收盘和开盘,更好理解一些.
只是不明白为何结果文件里的小数点是4位?  如:  Close = 3132.4000 Open=3129.4000
作者: 狼牙    时间: 2011-6-25 18:49:52

从现在开始学TB编程
谢谢老师!
作者: zhoutian    时间: 2011-8-4 09:45:15

楼主讲的不错,好好学习了
作者: 亚历山大弟    时间: 2011-8-14 01:16:44

进来学习
作者: jiaoyizhe    时间: 2011-10-2 15:35:00

看看Sumamation,Cum等用户函数就应该能理解IF,For语句,While用的比较少,可暂时不关注! ...
nopain 发表于 2007-8-26 09:12

Params
Vars
  Numeric s;
  Numeric a;
Begin
   S=Summation(Close, 12);
   a=Cum(Close);
   Commentary("s="+text(s));
   Commentary("a="+text(a));
End


为什么S与想象的结果不一样 Summation(Close, 12)是计算12周期以来收盘价的和,那么不到12个bar的时候,是按照现有个数计算累计? 还有为什么Commentary出的s的结果不是和数?
作者: mazeppa3    时间: 2012-10-18 10:35:51

原来加号是连接符号呀,嗯嗯,受教了!
作者: yhp2012    时间: 2012-12-24 21:06:19

顶顶更健康
作者: qq1301035003    时间: 2015-6-2 08:26:15

岁数大了,学的慢,但是我不会停下拉




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2