返回列表 上一主題 發帖

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

回復 10# GBKEE
lieh_chun 他要的是盤中的 Open/High/Low/Close 而不是 Max、Min。
回復 9# lieh_chun
因你無權限下載,所以只好將程式貼上,你將它全部覆蓋到你的 ThisWorkbook 程式區內儲存,再重啟就 OK 了!
  1. Option Explicit
  2. Dim Ov As Single, Hv As Single, Lv As Single, Cv As Single, cIndex As Single
  3. Dim timerEnabled As Boolean    ' 判定開啟本工作表單的時段是否為開盤前啟動。
  4. Public turnKey As Integer

  5. Private Sub Workbook_Open()
  6.     timerEnabled = False

  7.     Call timerStart      ' 程式一啟始,便去自動執行 timerStart
  8. End Sub

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

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

  27.             If Not IsError(.[B2]) Then
  28.                 .[T1] = "開盤價"
  29.                 .[U1] = "最高價"
  30.                 .[V1] = "最低價"
  31.                 .[W1] = "成交價"
  32.                 .[T2] = Ov      ' 開盤價
  33.                 .[U2] = Hv      ' 最高價
  34.                 .[V2] = Lv      ' 最低價
  35.                 .[W2] = Cv      ' 成交價
  36.                  
  37.                  .Cells(Pos, 1) = Time           ' 時間
  38.                 ' 多空力道、反向勢力、主力控盤、內外盤比%、成交價、漲跌、
  39.                 ' 總量、最高、最低、加權指數、漲跌、累計委買、累委買筆、
  40.                 ' 累計委賣、累委賣筆、基差、委比、委買賣差、
  41.                 ' 開盤價、最高價、最低價、收盤價
  42.                 .Cells(Pos, 2).Offset(0).Resize(, 22) = .[B2:W2].Value
  43.             End If
  44.         End With
  45.     End If
  46. End Sub

  47. Sub timerStart()
  48.     turnKey = 0
  49.     Sheets("策略記錄").Range("B6").Value = 0
  50.    
  51.     If timerEnabled Then
  52.         ' 第二次(含)以後均以設定之 "間隔時段" 來處理執行序的作業。
  53.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  54.     Else
  55.         timerEnabled = True
  56.         
  57.         ' 將第一次啟動時間更改為設定 "開盤時間"前,如果開啟 Excel 時,已經過了設定 "開盤時間",則一進入系統即直接去執行紀錄作業。
  58.         If (TimeValue(Now) <= TimeValue("08:45:00")) Then
  59.             Application.OnTime (TimeValue("08:45:00")), "ThisWorkbook.ExeSelf"
  60.         Else
  61.             ' 系統剛連上 DDE 至資料匯入Excel工作表單,須有一個緩衝時段,
  62.             ' 這時如果馬上去抓取DDE資料,會有型態不符的錯誤訊息產生,並中斷執行序的作業。
  63.             Application.OnTime (Now + TimeValue("00:00:05")), "ThisWorkbook.ExeSelf"
  64.         End If
  65.     End If
  66. End Sub

  67. Private Sub ExeSelf()
  68.     Dim nums As Integer            ' 預設為 60 秒
  69.    
  70.     nums = 60
  71.     On Error Resume Next
  72.     If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:46:01")) Then Exit Sub
  73.       
  74.     If IsError(Sheets("策略記錄").Range("F2").Value) Then
  75.         Cv = 0
  76.     Else
  77.         Cv = Sheets("策略記錄").Range("F2").Value    ' 成交價
  78.     End If
  79.          
  80.     If (turnKey = 0 Or Ov = 0) Then
  81.         Ov = Cv                                      ' 開盤價
  82.         Hv = Cv                                      ' 最高價
  83.         Lv = Cv                                      ' 最低價
  84.     End If
  85.         
  86.     turnKey = turnKey + 1
  87.            
  88.     If (Cv > Hv) Then Hv = Cv                        ' 最高價
  89.     If (Cv < Lv) Then Lv = Cv                        ' 最低價
  90.       
  91.     Sheets("策略記錄").Range("B6").Value = " ( " & turnKey & " 秒 )"
  92.    
  93.     If (turnKey < nums) Then
  94.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  95.     Else
  96.         If (Cv > 0) Then Call ATimer
  97.         If timerEnabled Then Call timerStart
  98.     End If
  99. End Sub
複製代碼
DDE for lieh_chun.rar (62.46 KB)

TOP

回復 10# GBKEE
您的運算方法我會抽空來試試看,它的確也是不錯的處理方式,
我是用比較直接的方式來處哩,變數、與陣列的使用雖結果一樣,
我圖的只是以後好 Maintenance、且易判別之故。

TOP

回復 11# c_c_lai
lieh_chun 他要的是盤中的 Open/High/Low/Close 而不是 Max、Min
9# 我要記錄每分鐘成交價的最高及最低點    10#程式碼可達成此效果
Open/High/Low/Close 不是對應著每分鐘的  AR(0)'開盤價 /Application.Max(AR)'最高價 / Application.Min(AR)'最低價 /AR(UBound(AR))'收盤價

TOP

回復 13# GBKEE
請教您它為何一直不動? Worksheet_Calculate() 是 User Define Or Worksheet 內定觸發程式?
因為我很少使用 Excel 類似此類的方法 (Method), 請您指導!
DDE for GBKEE.rar (10.12 KB)

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

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

TOP

回復 11# c_c_lai


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

TOP

回復 15# GBKEE

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

感謝您的回覆與分享

TOP

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

TOP

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

TOP

        靜思自在 : 待人退一步,愛人寬一寸,就會活得很快樂。
返回列表 上一主題