以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  公式模型编写问题提交  (http://weistock.com/bbs/list.asp?boardid=4)
----  不同策略用DBTABLE2调用同一数据库中结构相同的两张表会发生干扰  (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=53807)

--  作者:wudin23
--  发布时间:2013/7/10 11:49:56
--  不同策略用DBTABLE2调用同一数据库中结构相同的两张表会发生干扰

管理员您好。

 

我发现不同策略调用同一数据库中表结构相同表名称不同的两张表会发生干扰,用的是DBTABLE2函数。也就是说从数据库DB1中的表TB1和TB2中抓出的同一字段CL1的值是一样的,而实际这两个值不一样。

 

如果是从不同的数据库DB1和DB2中调用就不会发生这种现象。

 

这样如果多策略操控同品种的话我就不得不建立多个数据库,造成资源浪费。本来在同一个数据库中用不同的表就能解决了。

 

感谢!


--  作者:王锋
--  发布时间:2013/7/10 12:01:59
--  
能不能提供一下相关示例代码
--  作者:wudin23
--  发布时间:2013/7/10 13:21:28
--  

DATABASE(\'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Winstockdata\\TFV\\TFV.mdb\');
if versionA then begin
 DBTABLE2(\'Select * From D_AHoldings Order By Updatetime\');
 goto databaseselectend;
end
if versionB then begin
 DBTABLE2(\'Select * From D_BHoldings Order By Updatetime\'); 
 goto databaseselectend;
end

 

databaseselectend@;


 

LH:= DBVALUE(stklabel&\'LH\');

 

 

上述代码,同时用在两个策略里面。由于versionA versionB条件不同,一个读取D_AHoldings这个表,另一个读取D_BHoldings这个表

读出来的LH是一样的。


--  作者:wudin23
--  发布时间:2013/7/10 13:59:02
--  

再直接点写个简单的小策略如下。

 

在D盘建立个数据库TEST.mdb,里面建两个表30MHoldings和15MHoldings, 表结构都一样,只有一个字段LH。字段分别填入30和15。

 

然后用如下代码运行,随便监控同一个品种,分别监控30分钟和15分钟。发现读出来的LH值都是15,而没有30.

 

if not(islastbar) then exit;

 

DATABASE(\'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\TEST.mdb\');
if datatype = 4 then begin
 DBTABLE2(\'Select * From 30MHoldings Order By Updatetime\');

 goto databaseselectend;
end
if datatype = 3 then begin
 DBTABLE2(\'Select * From 15MHoldings Order By Updatetime\');
 goto databaseselectend;
end

 

databaseselectend@;


 


LH:= DBVALUE(\'LH\');
if datatype = 4 then debugfile(\'d:\\testA.txt\',\':LH:%.2f\',LH);
if datatype = 3 then debugfile(\'d:\\testB.txt\',\':LH:%.2f\',LH);


--  作者:wudin23
--  发布时间:2013/7/10 14:25:42
--  
刚才又做了测试。发现问题出在不能在if条件语句后用dbtable2,如果完全分开放在两个策略里就没有问题。这是个bug么?
--  作者:wudin23
--  发布时间:2013/7/10 14:47:10
--  

另外 DBTABLE2(\'Select * From 15MHoldings Order By Updatetime\');
dbtable2后面不能用变量,比如用变量替代15M就会出问题。这应该也是个bug

 

如下:

aa:=\'15M\';

DBTABLE2(\'Select * From \'&aa&\'Holdings Order By Updatetime\');

 


--  作者:王锋
--  发布时间:2013/7/10 17:27:27
--  

看到你的描述了,原因在于金字塔的数据库处理逻辑并不像我们代码编写的那么个逻辑执行,为了考虑效率,在公式编译时就直接绑定了数据库表,因此只有第一个表会被绑定,而第二个就是无效的了。

你目前只能采取分2个不同的公式,分别处理2个不同的表才可以


--  作者:wudin23
--  发布时间:2013/7/10 17:44:08
--  
谢谢管理员的解答。这样的话确实是没有办法了。那请问是不是在DBTABLE中的SELECT语句里不能使用变量也是这个原因?使用变量在编译的时候会不知道引用的哪张表?
--  作者:王锋
--  发布时间:2013/7/10 18:28:36
--  

原因是一样的,变量要到执行的时候才能确定。