系统交易论坛 - 开拓者期货自动交易平台's Archiver

brucecolvin 发表于 2010-6-19 11:50

数据库读写函数bug 一个螺丝钉可致航天飞机失事

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

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

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

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

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

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

[size=3][color=black]一个螺丝钉可以导致航天飞机失事,一个bug可以导致亏损过半甚至破产![/color][/size][code]Params

Vars
        Numeric num;
        string vs1;
Begin


        if( SetTBProfileString(Symbol,"SCR",text(close) )==false );
        {
                FileAppend("E://tbs.log",text(CurrentBar)+ " 写入失败" );
        }
        
        vs1 = GetTBProfileString(Symbol,"SCR");
        
        if( vs1==InvalidString )
        {
                FileAppend("E://tbs.log",text(CurrentBar)+ " 无法读取" );
        }
}
end[/code][b]log中只有写入失败,没有读出失败,说明已经完全写入。[/b]

[[i] 本帖最后由 brucecolvin 于 2010-6-22 12:51 编辑 [/i]]

brucecolvin 发表于 2010-6-19 12:06

[b][size=3][color=red]接着看另一个更为严重的问题,SetTBProfileString写入后,GetTBProfileString居然读出无效。。。。可以说它就是让航天飞机失事的故障螺丝钉,很危险![/color][/size][/b]
[b][size=4][color=#ff0000][/color][/size][/b]
[b][size=2][color=black]代码如下[/color][/size][/b]
我的系统中有一个用户函数,代码如下:[code]
UpdateIndicators
Params
Vars

Score  Numeric;

Begin

/*  1  始化代码*/
/*  3  始化代码*/
/*  4  始化代码*/
/*  5  始化代码*/
    。。。。。

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

Score = GetTrendScore(1);
Score = Average(Score,20);
SetTBProfileString(Symbol,"SCR",text(Score));

End
[/code]有另一个函数,代码如下:[code]//------------------------------------------------------------------------
// 简称: mget_scorea
// 名称: 趋势分数的平均值
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------

Params

Vars
string vs1;
Numeric score;

Begin

vs1 = GetTBProfileString(Symbol,"SCR");

if( vs1==InvalidString )
{
score = GetTrendScore(1);

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

}Else
{
score = Value(vs1);
}

return score;

End
[/code]接着在交易指令AAS中使用以上连个函数。代码如下:[code]Params

Vars

Begin

UpdateIndicators();

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

/*  信号处理 */

/*  资金管理 */

score = mget_scorea();  

End
[/code][size=5]结果。。。。。请看,我抓到的证据,有图有真相。。[/size]
[size=5][/size]
[size=5]从图上看,从0 bar到130 bar都是正常的, 131的bar位置写入后,读出无效。接着到214都是正常,215开始读出无效。[/size]

[[i] 本帖最后由 brucecolvin 于 2010-6-22 12:52 编辑 [/i]]

brucecolvin 发表于 2010-6-19 12:22

[size=5]我并不想用数据的方式来记录变量值,但50个全局变量已经被我用过,不够用才用数据方式的变量,强烈建议tb将全局变量增加到500个。。[/size]

brucecolvin 发表于 2010-6-19 12:31

[size=4]通过数据库方式来交换跨周期数据时发现不了数据库读写错误的bug的,因为在tick反复触发,这次无效,下次就有效了,肉眼是看不到的。[/size]

troyhou 发表于 2010-6-21 12:13

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

可有的时候没办法,只能用这种方式来传递数据。

yangtse010 发表于 2010-6-21 17:51

精神可嘉!  TB BUG团队看中你了!  特聘你为TB顾问,监事会成员,独立董事!

tradingart 发表于 2010-6-21 22:36

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

不过TB是应该认真对待反馈的每一个BUG

liq77 发表于 2010-9-8 10:37

这样的情况到底“是"还是"否",怎么就没了下文?希望了解真相。

nopain 发表于 2010-9-8 17:46

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

另外SetTBProfileString永远都不会返回false的。

liq77 发表于 2010-9-8 19:41

谢谢回答!

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.