以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  反馈一个奇怪的问题  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=87304)

--  作者:dwjgwsm
--  发布时间:2015/11/15 20:11:12
--  反馈一个奇怪的问题

[此贴子已经被作者于2015/11/15 20:12:35编辑过]

--  作者:dwjgwsm
--  发布时间:2015/11/15 20:33:43
--  
Sub findfirstsecondOPI(Precode,tMarket)
      on error resume next \'有可能没有某些合约,如02合约通常没有
      for k=1 to 12  \'3 遍历同一品种所有合约
        if k<10 then
          icode=Precode & "0" & cstr(k)
        else
          icode=Precode & cstr(k)
        end if
 
        set History2 = marketdata.GetHistoryData(iCode,tMarket,5)   \'由于这一句可能会发生错误,导致cs中输出日期错误,怎么解释?
      next \'3 
End Sub


Sub cs()
on error resume next
    T=25  
    Precode="CS"
    tMarket="DQ"
    
    set History1 = marketdata.GetHistoryData(Precode & "00",tMarket,5)
    M=History1.Count-1
    for j=0 to M  
      tdate=cdate(History1.Date(j))  
      findfirstsecondOPI Precode,tMarket
      application.msgout tdate 
    next  
End Sub

得到错误的日期输出:
2014-12-19
2014-12-23   ‘从这里开始就不对了
2014-12-24
2015-01-06
2015-01-08
2015-01-19
2015-01-20
2015-01-21
2015-01-22
2015-01-30
2015-02-05
2015-03-10
2015-03-12
2015-03-16
2015-03-20
2015-04-02
2015-04-15
2015-04-29
2015-05-06
2015-05-07
2015-05-11
2015-05-14
2015-05-26
2015-06-01
2015-06-25
2015-06-30
2015-09-22
2015-09-28
2015-10-15
2015-10-16
2015-10-27
2015-11-02
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00
0:00:00

--  作者:dwjgwsm
--  发布时间:2015/11/15 20:53:55
--  
即便在
findfirstsecondOPI Precode,tMarket
后面再加一句err.number=0也不管用

但是,在后面加一句
set History1 = marketdata.GetHistoryData(Precode & "00",tMarket,5)
重新set一下倒是管用,不过其中的原因想不明白,为什么后面的错误在已经on error resume next 或者err.number=0后会导致早前声明的History1 对象毁了。是不是可以进一步推广,任何语句中的错误(无论之前之后发生的)都会导致所有与之相关的子程序中的对象被毁?!
[此贴子已经被作者于2015/11/15 20:55:25编辑过]

--  作者:yukizzc
--  发布时间:2015/11/16 11:19:06
--  
marketdata.HistoryDataMode=1\'不同品种为独立的缓冲区
加一句这个,您看下GetHistoryData函数说明里的注意,默认对象共享同一个缓冲区。