2、ReportNotify事件
使用ReportNotity來監(jiān)控價格變化比上面的定時讀取價格的方法好的地方是價格的每一次跳動都逃不過這個事件的監(jiān)控,而使用定時器,則會漏掉一些價格,不如:股指每一秒鐘有2筆成交回報,用上面的方法就會漏掉一次價格變化,當然如果你把定時器設(shè)置成500毫秒一次也可以獲取每一次的價格變化,但是這樣對系統(tǒng)資源的消耗會很大的,而是用這個事件相對占用較少系統(tǒng)資源。
如果你是做套利的,那么對價格變動更加敏感,使用這個事件是最好的選擇。
這個事件的使用,需要首先注冊你要監(jiān)控的品種,使用RegReportNotify方法,代碼如下:
sub RegIF() '還是監(jiān)控IF06合約的價格變化
Call MarketData.RegReportNotify("IF06","ZJ")
'要監(jiān)控多個品種,繼續(xù)寫代碼就行了,如:
Call MarketData.RegReportNotify("RB10","SQ") '監(jiān)控上期的螺紋鋼10月份合約
end sub
把這個過程用到VBAStart事件中,就會在啟動VBA時自動注冊對IF06合約的監(jiān)控
到這里為止,你只做了一半事情,很多人就是在這之后不知道怎么獲取行情數(shù)據(jù)了。別擔心,繼續(xù)看下去你就明白了。
注冊了合約之后,需要通過另一個事件來獲取行情數(shù)據(jù),那就是ReportNotify事件,這個事件會返回一個ReportData對象,這個更上面的一樣。
Sub MarketData_ReportNotify(ReportData)
'有人在這里還是用1的方法設(shè)置一個report1變量,然后取report1的返回值,這是多余的,ReportData本身就是返回的數(shù)據(jù),直接取reportData的值就行了。
NewPrice=ReportData.NewPrice
stkLable=ReportData.Label
Application.Msgout Cdate(time) & ",Code:" & stkLabel & ",NewPrice:" & NewPrice
End Sub
}
上面的vba代碼是需要注冊某個股票代碼后才能發(fā)生[事件],如果我不注冊特定的品種,想對整個上證市場的股票進行[行情監(jiān)控]我該怎么做?
使用定時器,遍歷整個市場的合約對象
示例
‘該示例從鄭州市場篩選SR合約得最大持倉量做為主力合約
Sub Test()
Dim MaxCode
Dim MaxVolume
'得到市場所有品種
Count = MarketData.GetReportCount("ZQ")
For i = 0 To Count-1
Set Report1 = MarketData.GetReportDataByIndex("ZQ",i)
'只處理SR合約
if Left(Report1.Label,2) = "SR" Then
'只處理有效合約
if Right(Report1.Label,2) >= "01" And Right(Report1.Label,2) <= "12" Then
If Report1.Volume > MaxVolume Then
MaxCode = Report1.Label
MaxVolume = Report1.Volume
End if
end if
End if
Next
'顯示成交量最大得合約
MsgBox MaxCode
End Sub