返回列表 上一主題 發帖

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

回復 1# lieh_chun
你要的是不是這支程式內容所描述的?
  1. Sub ExeSelf()
  2.     timerEnabled = True

  3.     Sheets("策略記錄").Cells(2, 1) = Now()
  4.    
  5.     On Error Resume Next
  6.     If (TimeValue(Now) > TimeValue("13:46:01")) Then Exit Sub
  7.    
  8.     If (TimeValue(Now) >= TimeValue("08:45:00")) Then         ' 開盤、收盤時段設定
  9.         If IsError(Sheets("策略記錄").Range("B2").Value) Then ' 假設 B2 欄位為多空力道
  10.             Cv(1) = 0
  11.             Cv(2) = 0
  12.             Cv(3) = 0
  13.         Else
  14.             Cv(1) = Sheets("策略記錄").Range("B2").Value   ' 多空力道成交價
  15.             Cv(2) = Sheets("策略記錄").Range("C2").Value   ' 反向勢力成交價
  16.             Cv(3) = Sheets("策略記錄").Range("D2").Value   ' 主力控盤成交價
  17.         End If
  18.          
  19.         If (turnKey = 0 Or Ov(1) = 0) Then ' 當 turnKey 值為0,表示其為初始值設定。
  20.             ' 為考量系統剛連上DDE,有時在第一根數值產生時Ov = Cv值可能為 0 的狀態)。
  21.             Ov(1) = Cv(1)                  ' 多空力道開盤價初始值設定
  22.             Hv(1) = Cv(1)                  ' 多空力道最高價初始值設定
  23.             Lv(1) = Cv(1)                  ' 多空力道最低價初始值設定
  24.                
  25.             Ov(2) = Cv(2)                  ' 反向勢力開盤價初始值設定
  26.             Hv(2) = Cv(2)                  ' 反向勢力最高價初始值設定
  27.             Lv(2) = Cv(2)                  ' 反向勢力最低價初始值設定
  28.                   
  29.             Ov(3) = Cv(3)                  ' 主力控盤開盤價初始值設定
  30.             Hv(3) = Cv(3)                  ' 主力控盤最高價初始值設定
  31.             Lv(3) = Cv(3)                  ' 主力控盤最低價初始值設定
  32.         End If

  33.         turnKey = turnKey + 1
  34.         Sheets("策略記錄").Cells(10, 2) = turnKey & " 秒"

  35.         If (Cv(1) > Hv(1)) Then Hv(1) = Cv(1) ' 判斷多空力道最高價
  36.         If (Cv(2) > Hv(2)) Then Hv(2) = Cv(2) ' 判斷反向勢力最高價
  37.         If (Cv(3) > Hv(3)) Then Hv(3) = Cv(3) ' 判斷主力控盤最高價
  38.          
  39.         If (Cv(1) < Lv(1)) Then Lv(1) = Cv(1) ' 判斷多空力道最低價
  40.         If (Cv(2) < Lv(2)) Then Lv(2) = Cv(2) ' 判斷反向勢力最低價
  41.         If (Cv(3) < Lv(3)) Then Lv(3) = Cv(3) ' 判斷主力控盤最低價
  42.                
  43.     End If
  44.    
  45.     If (turnKey < nums) Then
  46.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.ExeSelf"
  47.     Else
  48.         If (Cv(1) <> 0) Then Call Timer
  49.         ' Call Timer
  50.         Call timerStart
  51.     End If
  52. End Sub
複製代碼

TOP

回復 3# lieh_chun
上面的實例並非是樣本,它是將每一秒得 O、H、L、C 分別記錄下來,當滿足設定時間(例如一分鐘)
就將資料寫入到指定欄位儲存,如此紀錄上的每分鐘開盤價、最高價、最低價、收盤價都記錄下,
便可做一些統計分析了。

TOP

回復 5# lieh_chun
我只將處理 O、H、L、C 、 以及如何應用的模組 (已貼示) 貼上,其它部分須配合
你實際的應用,因每個人切入角度的不同 (券商、需求、應用面等),故此處論壇僅能
提供你個人參考、研究、以及彼此間之討論而已 。
你可以將你目前已成形的檔案以附件上傳,大家再看看能否幫得上忙。

TOP

回復 7# lieh_chun
你把檔案當附件傳來,再幫你看看如何要如何處哩,
因為你哪一個欄位是哪一個,實在無法得知。

TOP

回復 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

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

TOP

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

TOP

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

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

        靜思自在 : 知識要用心體會,才能變成自己的智慧。
返回列表 上一主題