使用MarketData.RegReportNotify来注册要监控的合约价格变化,然后使用MarketData_ReportNotify(reportdata)过程来获取价格信息很强大,我最近使用它来写了一个条件单下单程序,自动根据已经输入的期货品种进行监控,每一次价格跳动都要进行一次对条件单的判断,满足条件就开仓。
我要取消监控时,需要知道我之前监控了哪些品种,可是我事前并不知道,如果有一个基于0索引的遍历机制,就可以很轻松地取消所有品种的监控了。
还有就是这个监控不会随VBA的停止而自动停止,有点像定时器,你再次启动vba时,之前的监控依然有效。最好能随vba的停止自动取消所有监控。
VBA支持遍历功能,你做个定时器就行了
我是要取消所有品种的监控,可是我不知道具体的品种的,因为那是从数据库中读取的合约,而取消的时候,可能数据库中的记录从外部删除了。
使用RegReportNotify也不能 保证几百个品种效率能高于你用定时器遍历所有品种的,其实是一样的
这个我知道,我权衡了这两种方法,最后还是觉得使用RegReportNotify好,因为我监控的品种不会超过10个,一般3-5个,用价格监测,每一笔价格跳动都会到达这个事件进行处理,而是用定时器则会漏掉一些价格,比如使用每1秒循环一次,像某些品种1秒有两次价格跳动,如果是橡胶之类的一跳就是5快钱了,那可能会错过一些开仓机会。
那就用RegReportNotify好了,可以注册多个品种的
可是我并不知道之前注册了哪些品种啊,是通过读取数据库中的记录来设置的品种,那些品种可能在数据库中已经别修改或删除了。
只能退出金字塔软件,再次进入才可以。
我想出来一个方法了,这里写出来供大家共享
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