以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://weistock.com/bbs/index.asp)
--  高级功能研发区  (http://weistock.com/bbs/list.asp?boardid=5)
----  MarketData.RegReportNotify相关功能能加入遍历机制,会更好。  (http://weistock.com/bbs/dispbbs.asp?boardid=5&id=12044)

--  作者:guotx2010
--  发布时间:2012/5/31 10:06:18
--  MarketData.RegReportNotify相关功能能加入遍历机制,会更好。

    使用MarketData.RegReportNotify来注册要监控的合约价格变化,然后使用MarketData_ReportNotify(reportdata)过程来获取价格信息很强大,我最近使用它来写了一个条件单下单程序,自动根据已经输入的期货品种进行监控,每一次价格跳动都要进行一次对条件单的判断,满足条件就开仓。

    我要取消监控时,需要知道我之前监控了哪些品种,可是我事前并不知道,如果有一个基于0索引的遍历机制,就可以很轻松地取消所有品种的监控了。

 

    还有就是这个监控不会随VBA的停止而自动停止,有点像定时器,你再次启动vba时,之前的监控依然有效。最好能随vba的停止自动取消所有监控。


--  作者:王锋
--  发布时间:2012/5/31 10:07:48
--  

VBA支持遍历功能,你做个定时器就行了


--  作者:guotx2010
--  发布时间:2012/5/31 10:13:03
--  

我是要取消所有品种的监控,可是我不知道具体的品种的,因为那是从数据库中读取的合约,而取消的时候,可能数据库中的记录从外部删除了。

[此贴子已经被作者于2012-5-31 10:15:51编辑过]

--  作者:王锋
--  发布时间:2012/5/31 10:16:47
--  

使用RegReportNotify也不能 保证几百个品种效率能高于你用定时器遍历所有品种的,其实是一样的


--  作者:guotx2010
--  发布时间:2012/5/31 10:25:47
--  

这个我知道,我权衡了这两种方法,最后还是觉得使用RegReportNotify好,因为我监控的品种不会超过10个,一般3-5个,用价格监测,每一笔价格跳动都会到达这个事件进行处理,而是用定时器则会漏掉一些价格,比如使用每1秒循环一次,像某些品种1秒有两次价格跳动,如果是橡胶之类的一跳就是5快钱了,那可能会错过一些开仓机会。

 


--  作者:王锋
--  发布时间:2012/5/31 10:49:51
--  

那就用RegReportNotify好了,可以注册多个品种的


--  作者:guotx2010
--  发布时间:2012/5/31 12:11:49
--  
我的问题就在于,停止vba之后,在外部修改了品种或者删除了部分品种,可是vba再次启动的时候,我从数据库中找到要监控的品种,进行监控,可是那些已经删除的品种,还是在监控,导致出错,如果能遍历,我可以在vbaend事件中逐一取消注册,就不会有问题了。
--  作者:王锋
--  发布时间:2012/5/31 13:35:25
--  
停止VBA时,注销注册监控的品种就好了
--  作者:guotx2010
--  发布时间:2012/5/31 16:31:10
--  

可是我并不知道之前注册了哪些品种啊,是通过读取数据库中的记录来设置的品种,那些品种可能在数据库中已经别修改或删除了。

只能退出金字塔软件,再次进入才可以。

[此贴子已经被作者于2012-5-31 16:32:00编辑过]

--  作者:guotx2010
--  发布时间:2012/5/31 17:16:28
--  

我想出来一个方法了,这里写出来供大家共享

1、注册时将每一个从数据库中读出来的合约代码、市场代码、合约总数写入全局变量

2、vbaend事件中从全局变量中读取合约总数,做一个循环来逐个注销

 

代码如下:

Sub RegisteStock()   \'监控价格变动
 on error resume next
 dim i
 rstCodes.MoveFirst
 if rstCodes.eof then
  exit sub
 end if 
 i=1
 do while not rstCodes.eof           \'从数据库中读取设定的合约,循环体逐个进行合约注册
  sCode=rstCodes("Code")
  sMarket=rstCodes("Market")
  Call Document.SetExtString("Code-" & i,sCode)             \'写入每一个合约的代码
  Call Document.SetExtString("Market-" & i,sMarket)         \'写入对应的市场代码
  Call MarketData.RegReportNotify(sCode,sMarket)
  rstCodes.MoveNext
  i=i+1
 loop
 rstCodes.MoveFirst
 Call Document.SetExtData("CodesCount",i-1)       \'写入监控的合约总数
End Sub

 

Sub Application_VBAEnd()

 iCodesCount=Document.GetExtData("CodesCount")         \'读入监控的合约总数
 for i=1 to iCodesCount 
  sCode=Document.GetExtString("Code-" & i)
  sMarket=Document.GetExtString("Market-" & i)    \'从全局变量中读出合约及市场代码
  Call MarketData.UnRegReportNotify(sCode,sMarket)         \'注销
 next

End Sub

[此贴子已经被作者于2012-6-1 14:08:46编辑过]