开拓者期货期权程序化系统交易论坛
标题:
数据库读写函数bug 一个螺丝钉可致航天飞机失事
[打印本页]
作者:
brucecolvin
时间:
2010-6-19 11:50:26
标题:
数据库读写函数bug 一个螺丝钉可致航天飞机失事
很早我就发现了,多次给tb反应,他们总说我们测试没有问题!!!!
我很无奈,也很害怕,因为系统存在缺陷和bug,时刻危及到你财产的安全。
下面建一个交易指令,SetTBProfileString明明已经写入数据库,居然总是返回失败,
这么显而易见的问题TB测试,为何发现不了?
做软件,特别是做程序化交易软件的要严谨,这个不亚于设计航天飞机,
航天飞机关系到人的生命,而交易系统关系到人的财产安全。
一个螺丝钉可以导致航天飞机失事,一个bug可以导致亏损过半甚至破产!
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
复制代码
log中只有写入失败,没有读出失败,说明已经完全写入。
[
本帖最后由 brucecolvin 于 2010-6-22 12:51 编辑
]
作者:
brucecolvin
时间:
2010-6-19 12:06:56
接着看另一个更为严重的问题,SetTBProfileString写入后,GetTBProfileString居然读出无效。。。。可以说它就是让航天飞机失事的故障螺丝钉,很危险!
代码如下
我的系统中有一个用户函数,代码如下:
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
复制代码
有另一个函数,代码如下:
//------------------------------------------------------------------------
// 简称: 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
复制代码
接着在交易指令AAS中使用以上连个函数。代码如下:
Params
Vars
Begin
UpdateIndicators();
/* 很多代码,趋势决策 */
/* 信号处理 */
/* 资金管理 */
score = mget_scorea();
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