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


金字塔客服中心 - 专业程序化交易软件提供商金字塔软件高级功能研发区 → 为何不能保存数据?

   

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


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

主题:为何不能保存数据?

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


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
为何不能保存数据?  发帖心情 Post By:2021/2/9 17:00:51 [只看该作者]

问题:1老合约数据可以拷贝的数组,再从数组可以拷贝到History11(marketdate)中——采用application.MsgOut cstr(History11.Count)显示出count数量不为0,等于老合约的数据量。
         2、但是再在Application_Timer(ID)调用新合约1分钟数据为0!
         3、单独不做全市场扫描,只将一个股票采用上述代码,可以完整的建立新的股票代码,即直接把变量laoheyue赋值为恒量“000722”这种方式,则不会导致上面1、2点问题。

'___________________________目标合约、代码设置______________________
'###################################################################
dim oldContinueArray(8000)'合约代码
dim oldMarketArray(8000)'老市场代码
dim newContinueArray(8000)'新合约代码
dim newMarketArray(8000)'老市场代码
dim pk
pk=0


dim xinheyue
xinheyue = ""  
dim xinshichang
xinshichang = "" 

dim laoheyue
laoheyue = "" '合约代码
dim laoshichang
laoshichang = "" '合约市场

dim laoheyueStartDate
laoheyueStartDate = laoheyue+"StartDate" '合约的开始日期
dim laoheyueDataCount
laoheyueDataCount = laoheyue+"DataCount" '合约的数

dim newKOpen'新合约的K的Open
newKOpen=0
dim newKClose'合约的K的Close
newKClose=0
dim newKHigh'合约的K的High
newKHigh=0
dim newKLow'合约的K的Low
newKLow=0
dim newKVolume'合约的K的High
newKVolume=0
dim mxVolume'合约的K的High
mxVolume=0
dim newKDate'合约的K的Low 
newKDate=0
dim newkOpenInt'合约的K的High
newkOpenInt=0

'___________________________目标合约、代码设置______________________
'###################################################################
dim endminutdate
endminutdate=0
dim PKOpen
dim PKClose
dim PKHigh
dim PKLow
dim PKVolume
dim PKDate
dim PKOpenInt

'________________公式专用________
'================================
'================================

'该函数查找主力合约
Sub SearchStart()
  application.MsgOut Date &" " &Time& "检索股票名称及代码"
Dim marketName
marketName=Array("SZ","SH")'此处只查上海及深圳A股"SZ","SH"。不查期货市场"SQ","DQ","ZQ","ZJ",
'找到股票的代码及名称
'dim labels
dim markets
For j=0 To UBound(marketName)
n=marketData.GetReportCount(marketName(j))
markets=marketName(j)
For i=0 To n-1
Set reportData=marketdata.GetReportDataByIndex(marketName(j),i)
if IsNumeric(Left(reportData.Label,1))=true then
    if (Cint(Left(reportData.Label,1))=0 or Cint(Left(reportData.Label,1))=3) and j=0 then‘股票代码起始为0的主板股票或起始代码为3的创业版股票
       laoheyue=Trim(reportData.Label)'股票的老代码
       laoshichang=Trim(marketName(j))'股票所在市场的老代码
       xinheyue=9000000+laoheyue'股票的新代码
       oldContinueArray(pk)=Trim(laoheyue)'股票的老代码——赋值给数组保存
       oldMarketArray(pk)=Trim(laoshichang)'股票所在市场的老代码——赋值给数组保存
       newMarketArray(pk)=Trim(laoshichang)'股票在市场的代码——赋值给数组保存        
       newContinueArray(pk)=Trim(xinheyue) '股票的代码——赋值给数组保存
       if j<UBound(marketName) and i<n-1 then
      pk=pk+1
   end if                
end if
Next
Next
End Sub

sub cushihua()
    Call SearchStart()'只能一次

for y=0 to pk      
       laoheyue=oldContinueArray(y)'股票的老代码
       laoshichang=oldMarketArray(y)'股票的老市场名称        
       xinheyue=newContinueArray(y)'股票的新名称
       xinshichang=newMarketArray(y)'股票的市场名称
       'Application.MsgOut  laoheyue +"laoheyue"+xinheyue +"xinheyue"+xinmingcheng +"xinmingcheng"+xinheyue +"xinheyue"
       if laoheyue = "000722" then
       Call lishishuju()'只能一次
       end if
       '-------------------------------------------------------------------------------------------------------------

       '-------------------------------------------------------------------------------------------------------------
       'Call addtodaydata()'只能一次        
             next 
end sub

Sub lishishuju()
        '查询品种是否存在,不存在则新建
        cunzai = marketdata.IsExistStock(xinheyue,xinshichang)
        if cunzai = 0 then
           call marketdata.AddStock(xinheyue,xinshichang, xinmingcheng) 
           application.MsgOut "新K线【创建成功】!"
           shanchu = 0 
        else
           '删除历史数据,创建第一根K线
           shanchu = 1
           application.MsgOut "等价K线【已经存在】!"                       
        end if
        if shanchu = 1 then     
           Set History1 =marketdata.GetHistoryData(xinheyue,xinshichang,0)
           if History1.Count>1 then'!!!!特别注意不能全部清空数组,否则为《空数组》,会导致错误及意外!!!
              for j = 1 to History1.Count-1
                  History1.RemoveAt(j)
                 next          
           end if         
           call History1.SaveData(xinheyue,xinshichang,1)
           call MarketData.DestroyHistoryData        
           application.MsgOut "新K线【历史数据初始化】成功!"
        end if       
        '+++++++++++++++++++更新新合约的历史数据++++++++++++++++++++++++++          
      
           Set PKOpen=CreateObject("Stock.Array")
           Set PKClose=CreateObject("Stock.Array")
           Set PKHigh=CreateObject("Stock.Array")
           Set PKLow=CreateObject("Stock.Array")
           Set PKVolume=CreateObject("Stock.Array")
           Set PKDate=CreateObject("Stock.Array")
           Set PKOpenInt=CreateObject("Stock.Array")             
           Set History00 = marketdata.GetHistoryData(laoheyue,laoshichang,0)'取老合约1分钟数据,将其拷贝到数组,以便拷贝到新合约之中                    
           h00=History00.Count-1               
           for i = 0 to  H00
               PKOpen.AddBack(History00.Open(i))
               PKClose.AddBack(History00.close(i))
               PKHigh.AddBack(History00.high(i))
               PKLow.AddBack(History00.low(i))
               PKVolume.AddBack(History00.Volume(i))
               PKDate.AddBack(History00.date(i))
               PKOpenInt.AddBack(History00.OpenInt(i))
               call MarketData.DestroyHistoryData
           Next            


                  Set History11=marketdata.GetHistoryData(xinheyue,xinshichang,0)'取老合约1分钟数据                                                    
           for i = 0 to  PKOpen.Count-1              
               '#############加载历史数据给等价k新合约的newkopen、newkhigh、newklow、newkVolume 
               '#############加载历史数据给等价k新合约的newkclose。newkclose在abs(Tclose-newkopen) > qj成立时生成
               newkhigh=PKHigh.GetAt(i) 
               newklow=PKLow.GetAt(i)               
               newkVolume=PKVolume.GetAt(i) 
               newkDate=PKDate.GetAt(i)                 
                  newkopen=PKOpen.GetAt(i)
                  newkHigh=Thigh
                  newkLow=Tlow
               newkOpenInt=PKOpenInt.GetAt(i)  
                                                                                    
             '新合约数据转存到marketdate之中                           

                  h11c=History11.Count             
                  call History11.InsertAt(h11c)           
                  History11.Open(h11c)=newkOpen
                  History11.Close(h11c)=newkClose
                  History11.High(h11c)=newkHigh
                  History11.Low(h11c)=newkLow
                  History11.Volume(h11c)=newkVolume
                  History11.Date(h11c)=newkDate
                  History11.OpenInt(h11c)=newkOpenInt
                  call History11.SaveData(xinheyue,xinshichang,1) 
                  'application.MsgOut cstr(History11.Open(i))+"dddddd=====新K线======"  + cstr(i)+ "------------OPEN==========" +cstr(PKOpen.GetAt(i))                                                 
           next
           application.MsgOut cstr(History11.Count)                                          ’备注:History12.Count的结果是拷贝成功,count数与原数据一致!!!           
           MarketData.DestroyHistoryData                    


             Set PKOpen=nothing
             Set PKClose=nothing  
             Set PKHigh=nothing
             Set PKLow=nothing
             Set PKVolume=nothing
             Set PKDate=nothing
             Set PKOpenInt=nothing           
         
End Sub
Sub APPLICATION_VBAStart()
         
    call Application.SetTimer(0,1000) '创建一个0号定时器,间隔时间1秒
End Sub
Sub APPLICATION_VBAend()    
    call Application.KillTimer(0) '创建一个0号定时器,间隔时间1秒
End Sub

Sub APPLICATION_Timer(ID) 
    if ID = 0 then      
        '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~全市场扫描~~~~~~~~~~~~~~~~~~~~~~~~~~~
        '########################################################################
        for k=0 to PK
      laoheyue = oldContinueArray(k)
      laoshichang = oldMarketArray(k)
      xinshichang = newMarketArray(k)        
      xinheyue = newContinueArray(k)
            '~~~~~~~~~~~~~~~~~~~~~~~以下开始交易~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if laoheyue="000722" then

                  Set History12 = marketdata.GetHistoryData("9000722","SZ",0)
                        Application.MsgOut cstr(History12.Count)+"--------000722=========="+cstr(xinheyue)+cstr(xinshichang)       备注:History12.Count的结果是0,为何?
                  for i= h12-1 to 0
                      datex=History12.Date(i)
                      datei=History12.date(i-1) 
                      if DateDiff("d",date1x,datei)>=1 then
                         N=h12-i+1
                         Application.MsgOut cstr(N)+"=============000722=========="
                         exit for           
                      end if   
                  Next            

            '_______________________以上开始交易___________________________ 
'~~~~~~~~~~~~~~~~~~~~~~~以下开始数据刷新~~~~~~~~~~~~~~~~~~~~~~~
'Call RefreshData()
'_______________________以上开始数据刷新_______________________             
        next
        '########################################################################     
     end if
end sub

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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2021/2/9 17:13:48 [只看该作者]

注意:

1,HistoryDataMode属性为0,该对象使用一个共有的缓冲区来保存用户打开的市场数据,这意味着用户所调用的数据内容再下次重新调用其他品种或者调用不同种类的数据后会自动失效,若要在不同的品种间做横向数据处理请注意备份之前打开的数据,用户可以使用Visual Basic内部提供的数组,另外还可以使用金字塔为您提供的功能强大的数组类Array.

2,HistoryDataMode属性为1,不同品种为独立的缓冲区,这样你就可以同时打开多个品种进行横向统计处理了,但是注意当HistoryDataMode=1,数据使用完毕请调用DestroyHistoryData方法清理内存缓冲区.处于该模式时只有不同的品种才是独立的内存缓冲区,如果相同品种的多次调用,同样是共享缓冲区的.


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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2021/2/9 17:15:26 [只看该作者]

具体你看下marketdata.GetHistoryData这个方法下面有说明的,建议自己可以体会下

在帮助-vba编程信息这里有


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


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By:2021/2/10 7:15:37 [只看该作者]

老师您请明说,我要保存新合约数据我要选那种状态。我试过多种状态模式组合在实际保存的都在缓存——根本不能保存在当地硬盘。难道我得放在数据库!?。在APPLICATION_Timer(ID)再调用便消失!

                 call  History11.InsertAt(h11c)           

                  History11.Open(h11c)=newkOpen
                  History11.Close(h11c)=newkClose
                  History11.High(h11c)=newkHigh
                  History11.Low(h11c)=newkLow
                  History11.Volume(h11c)=newkVolume
                  History11.Date(h11c)=newkDate
                  History11.OpenInt(h11c)=newkOpenInt
                  call History11.SaveData(xinheyue,xinshichang,1) 
这种模式都是保存在缓存吗?如何真正的写入History11.SaveData(xinheyue,xinshichang,1) 之中存入本地数据呢?

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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2021/2/10 9:30:20 [只看该作者]

 实在抱歉,这种偏向二次开发的,你直接扔出代码工作人员很难帮您分析的

你如果可以的话最好定位下具体代码或者尝试,只savedata然后看下数据是否村过去了,然后再time事件里看下


或者我前面说了你把完整需求发出来,看别人代码区理解他意思是非常非常耗时的一件事情


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


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By:2021/2/13 12:46:11 [只看该作者]

老师新年好.

经过反复测试。不能保存数据的原因找到了:在期货所有市场call History11.SaveData(xinheyue,xinshichang,1) 可以保存到硬盘,而在股票只能保存在缓存。老师请核实!!

 


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


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By:2021/2/13 12:49:43 [只看该作者]


我们可以看到在缓存形成了10000多根K!不能再调用,退出软件重启也看不到数据!

但是期货市场都可以

[此贴子已经被作者于2021/2/13 12:50:28编辑过]

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


加好友 发短信
等级:论坛游侠 帖子:388 积分:0 威望:0 精华:0 注册:2014/11/22 18:13:16
  发帖心情 Post By:2021/2/13 12:52:56 [只看该作者]


图片点击可在新窗口打开查看此主题相关图片如下:捕获1.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2021/2/17 11:21:00 [只看该作者]


call marketdata.AddStock("10001","SZ", "测试")
Set History1 = marketdata.GetHistoryData("10001","SZ",0) 
call History1.InsertAt(History1.Count) 
 History1.Date(history1.Count-1) = "1970-1-1 08:00:00"   
 History1.open(history1.Count-1) = 1
 History1.high(history1.Count-1) = 1
 History1.low(history1.Count-1) = 1
 History1.close(history1.Count-1) = 1
 History1.Volume(history1.Count-1) = 1
 History1.Amount(history1.Count-1) = 1
 
 call History1.SaveData("10001","SZ",1)

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


加好友 发短信
等级:超级版主 帖子:21598 积分:0 威望:0 精华:1 注册:2010/7/31 16:35:30
  发帖心情 Post By:2021/2/17 11:22:23 [只看该作者]

你用这段程序执行一遍看,是可以添加10001这个合约并且有一分钟数据的

最好用户能提供一段简单可测试的情况或者自己做些简单比如上面我这样测试代码去看

你直接给出自己的项目,这边实在没有办法去给您看,这个工程量是很大的,你应该也能理解看别人代码光看是不够的还需要沟通了解意图这个/


 回到顶部