網路城邦
上一篇 回創作列表 下一篇   字體:
[Excel VBA]如何把個股每5分鐘的成交價格記錄下來?
2009/04/30 18:25:08瀏覽26403|回應5|推薦0


使用DDE將股票看盤軟體中的某個股成交價連結到 Sheet1 的[A2],當 DDE 有資料變動的時候會觸發工作表的 Calculate 事件,所以我們可以把程式碼寫在 Sheet1 的 Worksheet_Calculate() 裡,以每五分鐘為一時段,記錄成交的價格:

D 欄:記錄這個時段的開始價,就是第一筆成交價。
E 欄:記錄這個時段的最高價。
F 欄:記錄這個時段的最低價。
G 欄:記錄這個時段的結束價,就是最後一筆成交價。

這個程式裡面的關鍵就是 Excel 的 "時間值 (TimeValue)",Now() 函數會從系統時鐘取得執行當時的 "日期和時間" 時間值。時間值是一個實數,它的整數部份代表日期,小數部份代表時間。
Excel 用小於1的正小數來表示一天從午夜開始算起的秒數,一天有24x60x60=86400秒,所以每天的第一秒, "12:00:01 AM" 用時間值表示就是 1/86400 (86400分之一, 大約 0.00115741), 第二秒就是 2/86400......依此類推。
所以若要把每 5 分鐘的資料歸在一列, 就產生了 288 這個 "魔術數字",288 = 86400/ (5x60) 就是這麼來的。



Private Sub Worksheet_Calculate()
Dim NowDateTime, nowTime, startTime, stopTime
Dim tr As String
NowDateTime = Now '現在的時間值, 去掉整數部份,
nowTime = (NowDateTime - Int(NowDateTime)) '得到現在的時間值
startTime = Range("A6") '開盤時間, 例如: "09:00:00 AM"
stopTime = Range("A8") '收盤時間, 例如: "01:30:00 PM"
If nowTime <= startTime Then '尚未開盤
    Exit Sub
ElseIf nowTime > stopTime Then '已經收盤
    Exit Sub
ElseIf [A2] <> "-" And [A2] <> "###" Then '清盤的狀態, 不取其資料
    tr = Int((nowTime - startTime) * 288) + 2 '每差 300 秒就換一列
    If Range("D" & tr) = "" Then
        Range("D" & tr) = Range("A2") '開始價
    End If
    If Range("E" & tr) = "" Or Range("A2") > Range("E" & tr) Then
        Range("E" & tr) = Range("A2") '最高價
    End If
    If Range("F" & tr) = "" Or Range("A2") < Range("F" & tr) Then
        Range("F" & tr) = Range("A2") '最低價
    End If
    Range("G" & tr) = Range("A2") '結束價
End If
End Sub

( 興趣嗜好電腦3C )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=WayCheng&aid=2902612

 回應文章


2021/02/06 11:00
求檔案 感謝(howstyle666@gmail.com)

george
等級:2
留言加入好友
2020/10/06 19:39
"A2"試紙甚麼?

Wilson
2013/11/18 12:54

Hello :

這裡有一個問題,就是此五分鐘的第一個成交價格若與上五分鐘的成交價格一樣的話,Calculate()並不會被觸發,這樣本五分鐘的時段之開盤價就不正確了。而且,如果本時段成交價格都和上一時段收盤價一樣的話,Calculate()都不會被觸發,整個時段價格都不會被記錄下來。

 Wilson

 

(a41100@gmail.com)
ThisIsTheWay(WayCheng) 於 2017-05-19 16:15 回覆:
不,只要成交價有變動,Calculate事件就會被觸發,Calculate()就會被執行,但是我的程式這次計算出來的 tr (列號) 每隔五分鐘才會增家1,因此,五分鐘內若有多次成交價變動,後來的數值會蓋掉前面的數值。

有另一種作法是 Calculate()每次執行都換列記錄,可以設一個 static 變數 ,記住現在存到第幾列,Calculate() 每執行一次就加1,這樣就會把成交價所有的變化值都記錄下來了。

wearnks
[Excel VBA]如何把個股每5分鐘的成交價格記錄下來?
2010/08/31 17:10
請問:如何向您請教用法?謝謝。

hk
開放程式碼
2009/09/21 11:55

無法下載程式碼

還是謝謝

但本人已下載完成只是花點時間修改才能用