设为首页收藏本站

 找回密码
 注册
查看: 73674|回复: 77
打印 上一主题 下一主题

TradeBlazer公式的HelloWorld! [复制链接]

Rank: 10Rank: 10Rank: 10

精华
20
UID
4
积分
22709
帖子
4802
主题
64
阅读权限
255
注册时间
2007-7-20
最后登录
2024-1-15
跳转到指定楼层
1#
发表于 2007-7-25 15:42:48 |只看该作者 |正序浏览
从第一版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 编辑 ]

Rank: 1

精华
0
UID
199442
积分
3
帖子
2
主题
1
阅读权限
10
注册时间
2014-12-17
最后登录
1970-1-1
78#
发表于 2015-6-2 08:26:15 |只看该作者
岁数大了,学的慢,但是我不会停下拉

使用道具 举报

Rank: 4

精华
0
UID
113129
积分
486
帖子
363
主题
32
阅读权限
50
注册时间
2012-10-26
最后登录
2021-4-26
77#
发表于 2012-12-24 21:06:19 |只看该作者
顶顶更健康

使用道具 举报

Rank: 1

精华
0
UID
111621
积分
21
帖子
1
主题
0
阅读权限
10
注册时间
2012-7-20
最后登录
2013-4-26
76#
发表于 2012-10-18 10:35:51 |只看该作者
原来加号是连接符号呀,嗯嗯,受教了!

使用道具 举报

Rank: 5Rank: 5

精华
0
UID
32158
积分
731
帖子
176
主题
53
阅读权限
60
注册时间
2011-4-5
最后登录
2023-1-17
75#
发表于 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的结果不是和数?
微信公众号:tuwening

使用道具 举报

Rank: 2

精华
0
UID
59002
积分
101
帖子
16
主题
1
阅读权限
30
注册时间
2011-8-11
最后登录
2011-9-9
74#
发表于 2011-8-14 01:16:44 |只看该作者
进来学习
变变变

使用道具 举报

Rank: 1

精华
0
UID
57192
积分
17
帖子
2
主题
0
阅读权限
10
注册时间
2011-8-2
最后登录
2011-8-8
73#
发表于 2011-8-4 09:45:15 |只看该作者
楼主讲的不错,好好学习了
学习,分享

使用道具 举报

Rank: 1

精华
0
UID
49398
积分
13
帖子
3
主题
0
阅读权限
10
注册时间
2011-6-24
最后登录
2011-6-26
72#
发表于 2011-6-25 18:49:52 |只看该作者
从现在开始学TB编程
谢谢老师!

使用道具 举报

Rank: 1

精华
0
UID
39776
积分
26
帖子
3
主题
2
阅读权限
10
注册时间
2011-5-14
最后登录
2011-8-18
71#
发表于 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
罗和勇

使用道具 举报

Rank: 1

精华
0
UID
37383
积分
30
帖子
2
主题
0
阅读权限
10
注册时间
2011-5-3
最后登录
2011-8-1
70#
发表于 2011-5-10 15:59:24 |只看该作者
谢谢老师

使用道具 举报

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

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-5 04:54

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部