返回列表 上一主題 發帖

[發問] 請教抓取太平洋證卷的DDE 要如何從中抓取每分鐘的最大成交價及最小成交價

請教c_clai大,有辦法盤中即時畫出一個總委買口減去總委賣口的圖嗎?
謝謝回答

TOP

回復 21# ribbits
對不起,剛才為了測試而忘瞭將它更改回來,請將下列之 Remark 修正回來:
  1. Public Sub ATimer()
  2.     Dim Pos As Long             ' 將每隔 "多少時間" 處理時段,移到此處來處理。
  3.    
  4.     On Error Resume Next
  5.     ' If (TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub
複製代碼
正確為 (最後一行):
  1. Public Sub ATimer()
  2.     Dim Pos As Long             ' 將每隔 "多少時間" 處理時段,移到此處來處理。
  3.    
  4.     On Error Resume Next
  5.     If (TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub
複製代碼
謝謝!

TOP

回復  c_c_lai
我是使用EASYWIN的dde訊號,如果要每30秒記錄一趟上面所有的資料該如何寫VBA?因為套表上去 ...
ribbits 發表於 2012-9-9 14:31

貼上程式碼,供你參考:
  1. Option Explicit
  2. Dim timerEnabled As Boolean    ' 判定開啟本工作表單的時段是否為開盤前啟動。

  3. Private Sub Workbook_Open()
  4.     Dim Pos As Long             ' 將每隔 "多少時間" 處理時段,移到此處來處理。
  5.     timerEnabled = False

  6.     Pos = Sheets("Data").Range("A" & Rows.Count).End(xlUp).Row   ' 求出該欄之最後使用列數
  7.     If (Pos <= 1) Then Pos = 1
  8.     Sheets("策略記錄").[A4] = "已匯入 " & (Pos - 1) & " 筆資料"
  9.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart
  10. End Sub

  11. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  12.     On Error Resume Next
  13.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.ATimer", , False
  14.    
  15.     Me.Save
  16. End Sub

  17. Public Sub ATimer()
  18.     Dim Pos As Long             ' 將每隔 "多少時間" 處理時段,移到此處來處理。
  19.    
  20.     On Error Resume Next
  21.     ' If (TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub
  22.    
  23.     If (TimeValue(Now) >= TimeValue("08:45:00")) Then         ' 開盤、收盤時段設定
  24.         ' 盤中處理,將資料匯入寫入工作表單內儲存。
  25.         With Sheets("Data")
  26.             Pos = .Range("B" & Rows.Count).End(xlUp).Row   ' 求出該欄之最後使用列數
  27.             If (Pos <= 1) Then Pos = 1
  28.             Pos = Pos + 1                   ' 將變動行號加一行
  29.             Sheets("策略記錄").[A4] = "已匯入 " & (Pos - 1) & " 筆資料"

  30.             If Not IsError(Sheets("策略記錄").[E2]) Then
  31.                  .Cells(Pos, 1) = Date                              ' 日期
  32.                  .Cells(Pos, 2) = Time                              ' 時間
  33.                  .Cells(Pos, 3) = Sheets("策略記錄").[E2]           ' 成交價
  34.                  .Cells(Pos, 4).Offset(0).Resize(, 3) = Sheets("策略記錄").[G2:I2].Value
  35.                  .Cells(Pos, 7) = Sheets("策略記錄").[K2]           ' 成交量
  36.                 .Cells(Pos, 8).Offset(0).Resize(, 8) = Sheets("策略記錄").[O2:V2].Value
  37.             End If
  38.         End With
  39.     End If
  40.     If timerEnabled Then Call timerStart
  41. End Sub

  42. Sub timerStart()
  43.     If timerEnabled Then
  44.         ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
  45.         Application.OnTime (Now + TimeValue("00:00:30")), "ThisWorkbook.ATimer"
  46.     Else
  47.         timerEnabled = True
  48.         
  49.         ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
  50.         If (TimeValue(Now) <= TimeValue("08:45:00")) Then
  51.             Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.ATimer"
  52.         Else
  53.             ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  54.             ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  55.             Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ATimer"
  56.         End If
  57.     End If
  58. End Sub
複製代碼
因為你目前無權下載,所以將執行畫面貼示,你只要照著修正即可:

EASYWIN0909.rar (12.11 KB)

TOP

回復 8# c_c_lai
我是使用EASYWIN的dde訊號,如果要每30秒記錄一趟上面所有的資料該如何寫VBA?因為套表上去都會產生錯誤搞不清楚問題出在哪???

麻煩您了謝謝!!

EASYWIN0909.rar (1.95 KB)

TOP

回復 18# lieh_chun
這 工作表1模組 是 WorkSheet 物件的模組
15# 工作表1模組的程式碼, 可複製在任一 WorkSheet 物件的模組

TOP

回復 18# lieh_chun
上傳你整理過後之檔案!

TOP

回復 15# GBKEE

板大 您好~
似乎看不是很懂您的程式碼?不知您的意思是指 ThisWorkbook 的內碼改成您的程式碼??
另外再插入一個模組(工作表1.紀錄)把您的文貼上去這樣就可以執行ㄇ??

感謝您的回覆與分享

TOP

回復 11# c_c_lai


奇怪了,大大您所提供的程式碼,我下去RUN,居然不會動ㄟ,連我改了系統的時間,還是不會動,不知道是那兒有問題??

TOP

回復 15# GBKEE
謝謝您讓我體會到 Excel method 的一些使用,但我發覺 DoEvents 幾乎完全佔據了整個作業時間,
再分時分工上會不會造成是一種負擔呢?

TOP

本帖最後由 GBKEE 於 2012-8-26 11:49 編輯

回復 14# c_c_lai
ThisWorkbook  模組的程式碼
  1. Public 紀錄_Msg As Boolean
  2. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  3.     紀錄_Msg = True
  4. End Sub
  5. Private Sub Workbook_Open()
  6.     Run "工作表1.紀錄"     ' 程式一啟始,便去自動執行 工作表1.紀錄
  7. End Sub
  8. Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
  9.     'ThisWorkbook 的重算事件
  10.     'Sh 傳回是哪一個工作表有重算
  11. End Sub
複製代碼
工作表1模組的程式碼
  1. '工作表1模組的程式碼(重算事件 )
  2. '工作表1 的A1 B1 C2 D1 E1 : 時間/開盤/價最高價/最低價/收盤價
  3. Private Sub Worksheet_Calculate()
  4.     Static Msg As Boolean                      '用以判定是否為每日第一次執行
  5.     Static Time_Calculate As Date              '記錄每分鐘的時間
  6.     Static AR                                  '陣列:記錄成交價格
  7.     If Time < #8:30:00 AM# Then Exit Sub
  8.     Application.EnableEvents = False           '停止物件能觸發事件(Worksheet_Calculate)
  9.     If Msg = False Then
  10.         Time_Calculate = TimeSerial(Hour(Time), Minute(Time), 0) '每分鐘的時間
  11.         Range("A1").CurrentRegion.Offset(1) = ""                '清理昨日資料
  12.         ReDim AR(0)                                              '重新設為一元素
  13.     End If
  14.     Msg = True
  15.     If Time >= Time_Calculate + #12:01:00 AM# Then
  16.             With Cells(Rows.Count, 1).End(xlUp).Offset(1)
  17.                 .Cells(1, 1) = Time_Calculate                    '時間
  18.                 .Cells(1, 2) = AR(0)                             '開盤價
  19.                 .Cells(1, 3) = Application.Max(AR)               '最高價
  20.                 .Cells(1, 4) = Application.Min(AR)               '最低價
  21.                 .Cells(1, 5) = AR(UBound(AR))                    '收盤價
  22.             End With
  23.             Time_Calculate = TimeSerial(Hour(Time), Minute(Time), 0)
  24.             ReDim AR(0)
  25.     End If
  26.     If AR(UBound(AR)) <> "" Then ReDim Preserve AR(UBound(AR) + 1) '重新再加上一元素
  27.     AR(UBound(AR)) = [iv1]                      '記錄成交價格成交價
  28.     Application.EnableEvents = True           '恢復物件能觸發事件(Worksheet_Calculate)
  29. End Sub
  30. '樓主檔案是引用太平洋證券的DDE =好神通!D4 不必有此程序
  31. '紀錄程序:是測試Worksheet_Calculate的正確性
  32. Private Sub 紀錄()
  33.     '紀錄時間執行迴圈 勿執行其他程式或輸入資料
  34.     Dim t As Date, 價格(1 To 4) As Single
  35.     價格(1) = 100
  36.     價格(2) = Round(價格(1) + 價格(1) * 0.07, 2)
  37.     價格(3) = Round(價格(1) - 價格(1) * 0.07, 2)
  38.     t = Time
  39.     Do
  40.         DoEvents
  41.         If Time > t + #12:00:05 AM# Then
  42.             t = Time
  43.             價格(4) = Round((價格(2) - 價格(3) + 1) * Rnd() + 價格(3), 2) '成交價的亂數
  44.             If 價格(4) > 價格(2) Then 價格(4) = 價格(2)
  45.             If 價格(4) < 價格(3) Then 價格(4) = 價格(3)
  46.             [iv1] = "=" & 價格(4)      '儲存格公式
  47.     '****    要觸動Worksheet_Calculate: 儲存格公式之值有變動  ****
  48.             Debug.Print [iv1]
  49.         End If
  50.     Loop While ThisWorkbook.紀錄_Msg = True Or Time <= #1:30:00 PM#
  51.     '關閉檔檔案 或 1:30:00 PM  停止紀錄
  52. End Sub
複製代碼

TOP

        靜思自在 : 能幹不幹,不如苦幹實幹。
返回列表 上一主題