设为首页收藏本站

 找回密码
 注册
楼主: ohuangkai
打印 上一主题 下一主题

从头开始TB编程 [复制链接]

Rank: 4

精华
0
UID
35588
积分
470
帖子
100
主题
30
阅读权限
50
注册时间
2011-4-25
最后登录
2021-7-24
11#
发表于 2011-10-17 15:17:15 |只看该作者
先顶你一下,再慢慢看
止损要快

使用道具 举报

Rank: 1

精华
0
UID
48125
积分
32
帖子
16
主题
3
阅读权限
10
注册时间
2011-6-18
最后登录
2012-7-18
12#
发表于 2011-10-17 15:56:54 |只看该作者
本帖最后由 ohuangkai 于 2011-10-18 19:28 编辑

再说序列变量
    在群里,有朋友提醒我:IF ( ) 里面和后面最好不要用序列变量,否则会出错,非常感谢他的提醒。
    那么,到底能不能这样用呢? 毕竟,我前面的程序里有用到。而且,TB的说明里也有这样的警告:可能会发生不可预估的错误。

    前面讲过,每根BAR都有一些系统的序列变量,如:close,open,time 等等,我们创造的序列变量也自动会和他们一样保留下来。所以,才有ma[1]这样的用法。
    那么序列变量有哪些特性呢?
    第一:序列变量在每根BAR上都存在而且会保留下来。这个已经讲过了。
    第二:不能修改当前BAR之前的序列变量,如:ma[1] = 400 这样的语句会出错的。
    第三:序列变量是可以传递的。如果我们在本BAR中没有给他赋值,他会等于上一根BAR的值。这个用处非常大。就像一个全局变量一样,前面曾经定义过的值,以后都能直接拿来用。相应的,普通变量每根bar上开始计算时,他都要归位,不受以前的影响。
   
    因为这些特性,我们写程序时,要注意下面几点:
    1 如果在条件判断语句里给序列变量赋值时,要考虑条件不成立的时候序列变量应该是什么值,比如有一个序列变量 xyz,  
     IF ( 条件 ) { ...;xyz=Close*(1+0.005);...}
                  else { ...;xyz=Close*(1-0.005);...};
     如果你没有第二行,这个值可能会给你以后的程序执行造成一定的麻烦。
     从上面的这个例子也可以看到,序列变量有时候不可避免地要在IF语句里出现,这是没有办法的事,如果他在左侧,我们就要遵循上面这个规则。
    2 在条件判断语句( IF )里,我们要尽量避免序列变量出现在 = 号的右边,如: if ( 条件 ) { ...;mmm = xyz*xyz;...}
        要避免这个现象,我们可以先用一个普通变量保存这个值,然后在条件语句里用:
     Vars
             ...
             NumericSeries xyz;
             Numeric mmm;
             Numeric temp;
       Begin
            ...
           temp = xyz*xyz;
          if ( 条件 )
      {  ...
             mmm = temp;
          };
             ...      
      End
    3 在使用序列变量时,要考虑第一根BAR上使用时,他是否已经被赋值,如果没有,就要给他一个合适的值。还有你引用的是否是不存在的的序列变量,如:你在第三根BAR上用CLOSE[10],很显然,这个值是个无效值.如使用EMA的计算公式方法,构造一个序列变量:
     xyz = xyz/6+close[1]*5/6;
     这个结果会是什么样呢?  在第一根BAR上,CLOSE[1]不存在,那么,xyz就是一个无效值。 在第二根BAR上运行时,close[1]恢复正常,但是等式右边的xyz 却是继承上一根BAR的值----无效值,结果自然还是无效。
知行合一
QQ群:170011617

使用道具 举报

Rank: 2

精华
0
UID
70787
积分
68
帖子
13
主题
1
阅读权限
30
注册时间
2011-10-11
最后登录
2012-1-11
13#
发表于 2011-10-17 17:29:38 |只看该作者
好好学习,楼主好人
初学TB,大家请指教

使用道具 举报

Rank: 1

精华
0
UID
48125
积分
32
帖子
16
主题
3
阅读权限
10
注册时间
2011-6-18
最后登录
2012-7-18
14#
发表于 2011-10-17 20:21:06 |只看该作者
本帖最后由 ohuangkai 于 2011-10-17 20:23 编辑

有错就改。
    刚才我们讲了如何避免序列变量出现在IF 等判断语句里,现在我们看看具体实现出来是什么样子,为了简单而且说明问题,发一个双均线的模型模板:
Params
        Numeric nShort(3);
        Numeric nLong(30);
        Numeric lots(1);
       
Vars
        NumericSeries m0;
        NumericSeries m1;
        Bool c1;
        Bool c2;
Begin
        If (CurrentBar < Max(nShort,nLong)) Return;
       
        m0 = AverageFC(Close,nSHort);
        m1 = XAverage(Close,nLong);
       
        PlotNumeric("m0",m0);
        PlotNumeric("m1",m1);
       
        c1 = CrossOver(m0[1],m1[1]);  // 向上穿越
        c2 = CrossUnder(m0[1],m1[1]); // 向下穿越
       
        If (c1 ) Buy(lots,Open);
        If (c2) SellShort(lots,Open);
       
End
知行合一
QQ群:170011617

使用道具 举报

Rank: 2

精华
0
UID
70582
积分
70
帖子
4
主题
1
阅读权限
30
注册时间
2011-10-10
最后登录
2012-4-5
15#
发表于 2011-10-17 20:25:02 |只看该作者
顶,谢谢老大,例子很好
新手学习,多谢各路大神教导

使用道具 举报

Rank: 4

精华
0
UID
71013
积分
447
帖子
119
主题
6
阅读权限
50
注册时间
2011-10-12
最后登录
2011-12-19
16#
发表于 2011-10-18 09:05:40 |只看该作者
回复 1# ohuangkai


    在交易中不断学习,在学习中不断进步
学习就是力量

使用道具 举报

Rank: 4

精华
0
UID
71013
积分
447
帖子
119
主题
6
阅读权限
50
注册时间
2011-10-12
最后登录
2011-12-19
17#
发表于 2011-10-18 15:23:14 |只看该作者
回复 4# ohuangkai


    坐下啦慢慢学
学习就是力量

使用道具 举报

Rank: 1

精华
0
UID
48125
积分
32
帖子
16
主题
3
阅读权限
10
注册时间
2011-6-18
最后登录
2012-7-18
18#
发表于 2011-10-20 18:13:07 |只看该作者
本帖最后由 ohuangkai 于 2011-10-20 20:46 编辑

这两天有一个朋友要我看看他程序错在哪里了。我看了后,发现他程序比较专业,循环控制一类的语句都用到了,可他TB编程用的是对图表遍历,出发点就错了。
   TB的程序是在每根BAR上运行的,而不是在整个表上遍历的。这个是最初编程的要点,所以再次提及一下。
   这个和文华交易系统有差异,从思想上来说,TB实际上更容易,也更灵活一些。

代码跟踪与调试
    继续侃调试方法。
    编程语法错误是最容易修正的,提示也基本到位。但改完了,没有按照自己想象的方式运行,错误的现象不可思议,这时候,就考验基本功了。
    commentary: 在关键的地方前面和后面,显示你认为可能有问题的变量,如xyz, 我们可以插入一行:commentary("xyz="+text(xyz))  这样在每根K线上都可能显示出:xyz=.... 这样的东西。 我们就能知道XYZ的变化了。
    fileappend: 这个命令把结果写到一个文件里,是跟踪的最好的办法。比如:fileappend("d:\\1.txt"," xyz="+text(xyz)) ,这样,你在D盘根目录下就能找到1.txt,打开来看就行了。
                这个命令有个缺点,因为程序在每根BAR上都执行一次,你的这个记录就会很多,查找起来非常麻烦。实际上,你只想看在某一根BAR上的输出结果,找出你的逻辑问题。
                你可以设计一个变量: Bool cFile;    然后, cFile= DATE==20110924&&TIME==0.0935  输出时,就用: if ( cFile ) fileappend("d:\\1.txt"," xyz="+text(xyz)) 这样类似的语句,大量的输出你需要的信息,可以很精细地进行调试。
    用上面两个语句,也是程序员们经常用到的技巧。
    TB编程最容易出错的地方是序列变量。
    序列变量的用法。前面也说到过,序列变量的第一次前一定要赋值,否则,麻烦就跟影子一样,给你带来一些说不清楚的麻烦。如果在条件语句里赋值,那么要考虑没有满足条件的时候,这个序列变量应该是什么值,给他了没有。

        恩,就到这里吧。写程序是件快乐的事,调试程序是件很让人上火的事。技巧方法不一而足,做得多了,就简单了。
知行合一
QQ群:170011617

使用道具 举报

Rank: 3Rank: 3

精华
0
UID
32736
积分
160
帖子
8
主题
2
阅读权限
40
注册时间
2011-4-9
最后登录
2013-7-29
19#
发表于 2011-10-20 19:18:35 |只看该作者
学习了   楼主继续
坚持就能胜利

使用道具 举报

Rank: 2

精华
0
UID
70582
积分
70
帖子
4
主题
1
阅读权限
30
注册时间
2011-10-10
最后登录
2012-4-5
20#
发表于 2011-10-24 13:12:00 |只看该作者
谢谢,学习了
新手学习,多谢各路大神教导

使用道具 举报

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

bottom

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

GMT+8, 2024-4-30 17:55

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部