以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://222.73.7.161/bbs/index.asp) -- 高级功能研发区 (http://222.73.7.161/bbs/list.asp?boardid=5) ---- 为何不能保存数据? (http://222.73.7.161/bbs/dispbbs.asp?boardid=5&id=184251) |
-- 作者:sword8586 -- 发布时间: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 -- 发布时间:2021/2/9 17:13:48 -- 注意: 1,HistoryDataMode属性为0时,该对象使用一个共有的缓冲区来保存用户打开的市场数据,这意味着用户所调用的数据内容再下次重新调用其他品种或者调用不同种类的数据后会自动失效,若要在不同的品种间做横向数据处理请注意备份之前打开的数据,用户可以使用Visual Basic内部提供的数组,另外还可以使用金字塔为您提供的功能强大的数组类Array. 2,HistoryDataMode属性为1时,不同品种为独立的缓冲区,这样你就可以同时打开多个品种进行横向统计处理了,但是注意当HistoryDataMode=1时,数据使用完毕请调用DestroyHistoryData方法清理内存缓冲区.处于该模式时只有不同的品种才是独立的内存缓冲区,如果相同品种的多次调用,同样是共享缓冲区的. |
-- 作者:yukizzc -- 发布时间:2021/2/9 17:15:26 -- 具体你看下marketdata.GetHistoryData这个方法下面有说明的,建议自己可以体会下 在帮助-vba编程信息这里有 |
-- 作者:sword8586 -- 发布时间: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 -- 发布时间:2021/2/10 9:30:20 -- 实在抱歉,这种偏向二次开发的,你直接扔出代码工作人员很难帮您分析的 你如果可以的话最好定位下具体代码或者尝试,只savedata然后看下数据是否村过去了,然后再time事件里看下 或者我前面说了你把完整需求发出来,看别人代码区理解他意思是非常非常耗时的一件事情 |
-- 作者:sword8586 -- 发布时间:2021/2/13 12:46:11 -- 老师新年好. 经过反复测试。不能保存数据的原因找到了:在期货所有市场call History11.SaveData(xinheyue,xinshichang,1) 可以保存到硬盘,而在股票只能保存在缓存。老师请核实!!
|
-- 作者:sword8586 -- 发布时间:2021/2/13 12:49:43 --
但是期货市场都可以 [此贴子已经被作者于2021/2/13 12:50:28编辑过]
|
-- 作者:sword8586 -- 发布时间:2021/2/13 12:52:56 -- ![]() ![]() |
-- 作者:yukizzc -- 发布时间: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 -- 发布时间:2021/2/17 11:22:23 -- 你用这段程序执行一遍看,是可以添加10001这个合约并且有一分钟数据的 最好用户能提供一段简单可测试的情况或者自己做些简单比如上面我这样测试代码去看 你直接给出自己的项目,这边实在没有办法去给您看,这个工程量是很大的,你应该也能理解看别人代码光看是不够的还需要沟通了解意图这个/ |