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

标题: 数据库读写函数bug 一个螺丝钉可致航天飞机失事 [打印本页]

作者: brucecolvin    时间: 2010-6-19 11:50:26     标题: 数据库读写函数bug 一个螺丝钉可致航天飞机失事

很早我就发现了,多次给tb反应,他们总说我们测试没有问题!!!!

我很无奈,也很害怕,因为系统存在缺陷和bug,时刻危及到你财产的安全。

下面建一个交易指令,SetTBProfileString明明已经写入数据库,居然总是返回失败,

这么显而易见的问题TB测试,为何发现不了?

做软件,特别是做程序化交易软件的要严谨,这个不亚于设计航天飞机,

航天飞机关系到人的生命,而交易系统关系到人的财产安全。

一个螺丝钉可以导致航天飞机失事,一个bug可以导致亏损过半甚至破产!
  1. Params

  2. Vars
  3.         Numeric num;
  4.         string vs1;
  5. Begin


  6.         if( SetTBProfileString(Symbol,"SCR",text(close) )==false );
  7.         {
  8.                 FileAppend("E://tbs.log",text(CurrentBar)+ " 写入失败" );
  9.         }
  10.         
  11.         vs1 = GetTBProfileString(Symbol,"SCR");
  12.         
  13.         if( vs1==InvalidString )
  14.         {
  15.                 FileAppend("E://tbs.log",text(CurrentBar)+ " 无法读取" );
  16.         }
  17. }
  18. end
复制代码
log中只有写入失败,没有读出失败,说明已经完全写入。

[ 本帖最后由 brucecolvin 于 2010-6-22 12:51 编辑 ]
作者: brucecolvin    时间: 2010-6-19 12:06:56

接着看另一个更为严重的问题,SetTBProfileString写入后,GetTBProfileString居然读出无效。。。。可以说它就是让航天飞机失事的故障螺丝钉,很危险!

代码如下
我的系统中有一个用户函数,代码如下:

  1. UpdateIndicators
  2. Params
  3. Vars

  4. Score  Numeric;

  5. Begin

  6. /*  1  始化代码*/
  7. /*  3  始化代码*/
  8. /*  4  始化代码*/
  9. /*  5  始化代码*/
  10.     。。。。。

  11. /* 以上代码绝无if和for等分支,也无return指令,特此说明,是想说明下面的代码是绝对能执行到的*/

  12. Score = GetTrendScore(1);
  13. Score = Average(Score,20);
  14. SetTBProfileString(Symbol,"SCR",text(Score));

  15. End
复制代码
有另一个函数,代码如下:
  1. //------------------------------------------------------------------------
  2. // 简称: mget_scorea
  3. // 名称: 趋势分数的平均值
  4. // 类别: 用户函数
  5. // 类型: 用户函数
  6. // 输出: 数值型
  7. //------------------------------------------------------------------------

  8. Params

  9. Vars
  10. string vs1;
  11. Numeric score;

  12. Begin

  13. vs1 = GetTBProfileString(Symbol,"SCR");

  14. if( vs1==InvalidString )
  15. {
  16. score = GetTrendScore(1);

  17. FileAppend("E://tb.log",text(CurrentBar));

  18. }Else
  19. {
  20. score = Value(vs1);
  21. }

  22. return score;

  23. End
复制代码
接着在交易指令AAS中使用以上连个函数。代码如下:
  1. Params

  2. Vars

  3. Begin

  4. UpdateIndicators();

  5. /*   很多代码,趋势决策 */

  6. /*  信号处理 */

  7. /*  资金管理 */

  8. score = mget_scorea();  

  9. End
复制代码
结果。。。。。请看,我抓到的证据,有图有真相。。

从图上看,从0 bar到130 bar都是正常的, 131的bar位置写入后,读出无效。接着到214都是正常,215开始读出无效。

[ 本帖最后由 brucecolvin 于 2010-6-22 12:52 编辑 ]
作者: brucecolvin    时间: 2010-6-19 12:22:34

我并不想用数据的方式来记录变量值,但50个全局变量已经被我用过,不够用才用数据方式的变量,强烈建议tb将全局变量增加到500个。。
作者: brucecolvin    时间: 2010-6-19 12:31:30

通过数据库方式来交换跨周期数据时发现不了数据库读写错误的bug的,因为在tick反复触发,这次无效,下次就有效了,肉眼是看不到的。
作者: troyhou    时间: 2010-6-21 12:13:52

我也遇到过类似的问题,我想原因可能是频繁读写文件导致的。

可有的时候没办法,只能用这种方式来传递数据。
作者: yangtse010    时间: 2010-6-21 17:51:29

精神可嘉!  TB BUG团队看中你了!  特聘你为TB顾问,监事会成员,独立董事!
作者: tradingart    时间: 2010-6-21 22:36:44

50个全局变量都用完了?真夸张,怎么用的啊

不过TB是应该认真对待反馈的每一个BUG
作者: liq77    时间: 2010-9-8 10:37:53

这样的情况到底“是"还是"否",怎么就没了下文?希望了解真相。
作者: nopain    时间: 2010-9-8 17:46:38

楼主的代码:
if( SetTBProfileString(Symbol,"SCR",text(close) )==false );
多了一个分号。

另外SetTBProfileString永远都不会返回false的。
作者: liq77    时间: 2010-9-8 19:41:50

谢谢回答!
作者: noego345    时间: 2017-7-18 20:44:08

nopain 发表于 2010-9-8 17:46
楼主的代码:
if( SetTBProfileString(Symbol,"SCR",text(close) )==false );
多了一个分号。

请问,永远不会返回false,那么我怎么知道是否有效写入。今天我就检测到数据库写入失败,给我造成巨大损失。




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