欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件公式模型编写问题提交 → 不同策略用DBTABLE2调用同一数据库中结构相同的两张表会发生干扰

   

欢迎使用金字塔普通技术服务论坛,您可以在相关区域发表技术支持贴。
我司技术服务人员将优先处理 VIP客服论坛 服务贴,普通区问题处理速度慢,请耐心等待。谢谢您对我们的支持与理解。    


  共有2997人关注过本帖树形打印复制链接

主题:不同策略用DBTABLE2调用同一数据库中结构相同的两张表会发生干扰

帅哥哟,离线,有人找我吗?
wudin23
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:57 积分:0 威望:0 精华:0 注册:2012/3/27 21:43:11
不同策略用DBTABLE2调用同一数据库中结构相同的两张表会发生干扰  发帖心情 Post By:2013/7/10 11:49:56    Post IP:112.91.114.190[显示全部帖子]

管理员您好。

 

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

 

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

 

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

 

感谢!


 回到顶部
帅哥哟,离线,有人找我吗?
wudin23
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:57 积分:0 威望:0 精华:0 注册:2012/3/27 21:43:11
  发帖心情 Post By:2013/7/10 13:21:28    Post IP:112.91.114.190[显示全部帖子]

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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:57 积分:0 威望:0 精华:0 注册:2012/3/27 21:43:11
  发帖心情 Post By:2013/7/10 13:59:02    Post IP:112.91.114.190[显示全部帖子]

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

 

在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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:57 积分:0 威望:0 精华:0 注册:2012/3/27 21:43:11
  发帖心情 Post By:2013/7/10 14:25:42    Post IP:112.91.114.190[显示全部帖子]

刚才又做了测试。发现问题出在不能在if条件语句后用dbtable2,如果完全分开放在两个策略里就没有问题。这是个bug么?

 回到顶部
帅哥哟,离线,有人找我吗?
wudin23
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:57 积分:0 威望:0 精华:0 注册:2012/3/27 21:43:11
  发帖心情 Post By:2013/7/10 14:47:10    Post IP:112.91.114.190[显示全部帖子]

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

 

如下:

aa:='15M';

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

 


 回到顶部
帅哥哟,离线,有人找我吗?
wudin23
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:新手上路 帖子:57 积分:0 威望:0 精华:0 注册:2012/3/27 21:43:11
  发帖心情 Post By:2013/7/10 17:44:08    Post IP:112.91.114.190[显示全部帖子]

谢谢管理员的解答。这样的话确实是没有办法了。那请问是不是在DBTABLE中的SELECT语句里不能使用变量也是这个原因?使用变量在编译的时候会不知道引用的哪张表?

 回到顶部