返回列表 上一主題 發帖

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

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

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

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

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

回復 9# lieh_chun
  1. '[策略記錄] 工作表的程式碼(重算事件 )
  2. Private Sub Worksheet_Calculate()
  3.     Static Msg As Boolean                      '用以判定是否為每日第一次執行
  4.     Static Time_Calculate As Date              '記錄每分鐘的時間
  5.     Static AR                                  '陣列:記錄成交價格
  6.     If Time < #8:30:00 AM# Then Exit Sub
  7.     Application.EnableEvents = False           '停止物件能觸發事件(Worksheet_Calculate)
  8.     If Msg = False Then
  9.         Time_Calculate = TimeSerial(Hour(Time), Minute(Time), 0) '每分鐘的時間
  10.         Range("A12").CurrentRegion.Offset(1) = ""                '清理昨日資料
  11.         ReDim AR(0)                                              '重新設為一元素
  12.     End If
  13.     Msg = True
  14.     If Time >= Time_Calculate + #12:01:00 AM# Then
  15.             With IIf([A13] = "", [A13], Cells(Rows.Count, 1).End(xlUp).Offset(1))
  16.                 .Cells(1, 1) = Time_Calculate                    '時間
  17.                 .Cells(1, 2) = AR(0)                             '開盤價
  18.                 .Cells(1, 3) = Application.Max(AR)               '最高價
  19.                 .Cells(1, 4) = Application.Min(AR)               '最低價
  20.                 .Cells(1, 5) = AR(UBound(AR))                    '收盤價
  21.             End With
  22.             Time_Calculate = TimeSerial(Hour(Time), Minute(Time), 0)
  23.             ReDim AR(0)
  24.     End If
  25.     If AR(UBound(AR)) <> "" Then ReDim Preserve AR(UBound(AR) + 1) '重新再加上一元素
  26.     AR(UBound(AR)) = [f2]                                          '記錄成交價格成交價
  27.     Application.EnableEvents = True           '恢復物件能觸發事件(Worksheet_Calculate)
  28. End Sub
複製代碼

TOP

回復 8# c_c_lai
您好~
附檔為我目前用最簡單的時間去紀錄相關資料,幾個問題請教
如果要讓它自動寫入,而不透過前一頁太平洋好神通的DDE抓取
該如何修改程式碼??另外在請教  如果我要記錄每分鐘成交價的最高及最低點
又該如何抓取ㄋ??煩請您幫忙解惑

感謝您!!

DDE.rar (57.81 KB)

TOP

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

TOP

回復 6# c_c_lai

您好~
我的只是用很簡單的資料去抓取一些相關資料只有設定每分鐘抓取DDE儲存格的資料來做紀錄
您看一下

Option Explicit
Dim LastMin As Integer

Private Sub Workbook_Open()
    Sheets("策略記錄").Cells(4, 2) = 12
    LastMin = Minute(Time)
    Call Timer
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer", , False
End Sub


Public Sub Timer()
    Dim Pos As Integer, i As Integer, RangeStr As String
        
    On Error Resume Next
    Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer" '每秒顯示
    Sheets("策略記錄").Cells(1, 1) = Time '將時間show至策略的a1欄位
    Dim HHMM As Integer
    HHMM = Hour(Time) * 100 + Minute(Time)
    If (HHMM < 830 Or HHMM > 1346) Then Exit Sub '營業時間才執行
    If Minute(Time) <> LastMin Then '開始後做
        With Sheets("策略記錄")
            .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
            Pos = .Cells(4, 2)
            .Cells(Pos, 1) = Time
            .Cells(Pos, 2) = .Cells(2, 2)
            .Cells(Pos, 3) = .Cells(2, 3)
            .Cells(Pos, 4) = .Cells(2, 4)
            .Cells(Pos, 5) = .Cells(2, 5)
            .Cells(Pos, 6) = .Cells(2, 6)
            .Cells(Pos, 7) = .Cells(2, 7)
            .Cells(Pos, 8) = .Cells(2, 8)
            .Cells(Pos, 9) = .Cells(2, 9)
            .Cells(Pos, 10) = .Cells(2, 10)
            .Cells(Pos, 11) = .Cells(2, 11)
            .Cells(Pos, 12) = .Cells(2, 12)
            .Cells(Pos, 13) = .Cells(2, 13)
            .Cells(Pos, 14) = .Cells(2, 14)
            .Cells(Pos, 15) = .Cells(2, 15)
            .Cells(Pos, 16) = .Cells(2, 16)
            .Cells(Pos, 17) = .Cells(2, 17)
            
            



         
        End With
   
        LastMin = Minute(Time)
    End If
End Sub


像您貼的檔案,我就真的不知道還要修改哪邊,才能自動寫入了,煩請您教導一下(因為我完全不懂VBA編碼........請別見笑)
另外想向您請教一下,您有6月以前的台指奇多空力道的資料及成交價ㄇ??

感謝您

TOP

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

TOP

回復 4# c_c_lai

感謝板大熱心分享,對於EXCEL寫VBA,我是完全門外漢,冒昧請教,我如果如接複製您的程式碼到EXCEL 編碼那貼上,可以執行試跑ㄇ
還是有哪邊需要再修改才能跑??感謝分享:)

TOP

        靜思自在 : 不要隨心所欲,要隨心教育自己。
返回列表 上一主題