管理员您好。
我发现不同策略调用同一数据库中表结构相同表名称不同的两张表会发生干扰,用的是DBTABLE2函数。也就是说从数据库DB1中的表TB1和TB2中抓出的同一字段CL1的值是一样的,而实际这两个值不一样。
如果是从不同的数据库DB1和DB2中调用就不会发生这种现象。
这样如果多策略操控同品种的话我就不得不建立多个数据库,造成资源浪费。本来在同一个数据库中用不同的表就能解决了。
感谢!
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是一样的。
再直接点写个简单的小策略如下。
在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);
另外 DBTABLE2('Select * From 15MHoldings Order By Updatetime');
dbtable2后面不能用变量,比如用变量替代15M就会出问题。这应该也是个bug
如下:
aa:='15M';
DBTABLE2('Select * From '&aa&'Holdings Order By Updatetime');
看到你的描述了,原因在于金字塔的数据库处理逻辑并不像我们代码编写的那么个逻辑执行,为了考虑效率,在公式编译时就直接绑定了数据库表,因此只有第一个表会被绑定,而第二个就是无效的了。
你目前只能采取分2个不同的公式,分别处理2个不同的表才可以
原因是一样的,变量要到执行的时候才能确定。