Board logo

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

作者: lieh_chun    時間: 2012-8-20 16:05     標題: 請教抓取太平洋證卷的DDE 要如何從中抓取每分鐘的最大成交價及最小成交價

網站各為先進您好~
想請教一下,小弟目前是太平洋證卷抓取DDE相關資料到EXCEL,,再用簡單的EXCEL程式去最運算,
想請教一下,如果我要去記錄每分鐘K線的高低價,該如何去寫ㄋ??
請各為提供意見
感謝萬分
作者: c_c_lai    時間: 2012-8-21 06:32

回復 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
複製代碼

作者: lieh_chun    時間: 2012-8-21 12:29

回復 2# c_c_lai

板大您好~
感謝您熱心分享,我想要的期貨每分鐘的成交價高點和低點,不知該如何去編寫??
另外請教一下,如果要記錄每分鐘期貨成交價的高低點,是不是就要改成每秒寫入還是每筆寫入ㄋ??
作者: c_c_lai    時間: 2012-8-21 14:01

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

回復 4# c_c_lai

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

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

回復 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月以前的台指奇多空力道的資料及成交價ㄇ??

感謝您
作者: c_c_lai    時間: 2012-8-24 08:09

回復 7# lieh_chun
你把檔案當附件傳來,再幫你看看如何要如何處哩,
因為你哪一個欄位是哪一個,實在無法得知。
作者: lieh_chun    時間: 2012-8-24 22:50

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

感謝您!!
作者: GBKEE    時間: 2012-8-25 10:32

回復 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
複製代碼

作者: c_c_lai    時間: 2012-8-26 07:11

回復 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
複製代碼
[attach]12294[/attach]
作者: c_c_lai    時間: 2012-8-26 07:25

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

回復 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))'收盤價
作者: c_c_lai    時間: 2012-8-26 08:43

回復 13# GBKEE
請教您它為何一直不動? Worksheet_Calculate() 是 User Define Or Worksheet 內定觸發程式?
因為我很少使用 Excel 類似此類的方法 (Method), 請您指導!
[attach]12297[/attach]
作者: GBKEE    時間: 2012-8-26 11:43

本帖最後由 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
複製代碼

作者: c_c_lai    時間: 2012-8-26 13:13

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

回復 11# c_c_lai


奇怪了,大大您所提供的程式碼,我下去RUN,居然不會動ㄟ,連我改了系統的時間,還是不會動,不知道是那兒有問題??
作者: lieh_chun    時間: 2012-8-27 23:07

回復 15# GBKEE

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

感謝您的回覆與分享
作者: c_c_lai    時間: 2012-8-28 07:43

回復 18# lieh_chun
上傳你整理過後之檔案!
作者: GBKEE    時間: 2012-8-28 09:12

回復 18# lieh_chun
工作表1模組 是 WorkSheet 物件的模組
15# 工作表1模組的程式碼, 可複製在任一 WorkSheet 物件的模組
作者: ribbits    時間: 2012-9-9 14:31

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

麻煩您了謝謝!!
作者: c_c_lai    時間: 2012-9-9 22:28

回復  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
複製代碼
因為你目前無權下載,所以將執行畫面貼示,你只要照著修正即可:
[attach]12429[/attach]
[attach]12430[/attach]
作者: c_c_lai    時間: 2012-9-9 22:44

回復 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
複製代碼
謝謝!
作者: steveyeh168    時間: 2012-9-10 00:29

請教c_clai大,有辦法盤中即時畫出一個總委買口減去總委賣口的圖嗎?
謝謝回答
作者: c_c_lai    時間: 2012-9-10 07:31

請教c_clai大,有辦法盤中即時畫出一個總委買口減去總委賣口的圖嗎?
謝謝回答
steveyeh168 發表於 2012-9-10 00:29

你只要多增加一個欄位名稱假設定為 "散戶方向",
然後以此欄作為 "選取資料" 項就可以畫出圖表了。
作者: ribbits    時間: 2012-9-10 10:20

回復 23# c_c_lai


   我對VBA真的不懂,剛剛把程式碼照單貼上還是錯誤一堆,請問是貼在WORKBOOK上嗎?

還有你這所謂的錯誤從上面看兩個程式碼是完全一樣的啊!!

真的不懂:(
作者: c_c_lai    時間: 2012-9-10 12:11

本帖最後由 c_c_lai 於 2012-9-10 12:13 編輯

回復 26# ribbits
貼在 ThisWorkbook 內。
舊的友加上 '
正確地已刪掉 '
作者: steveyeh168    時間: 2012-9-10 15:14

c_c_lai大,我是小學生,專程請教......
1.打開easywin,
2.DDE欄位要先跟前圖一像欄位?
3.然後把source code貼到ThisWorkbook,另存再打開?
4.隔日開盤等畫圖(還未加入委買賣口相減)嗎?
謝謝幫忙
作者: ribbits    時間: 2012-9-10 23:09

回復 27# c_c_lai

編譯時都會跳到這Private Sub Workbook_Open()
然後無法執行,這問題出現在哪邊?

還有,原始的DDE訊號欄是在策略記錄還是Data上?

另外關於您這些與法與抓取模式能詳細說明一下嗎?讓初學者把基礎弄清楚而不是照抄而不知所云,謝謝!

或者,您能指引一下哪邊有能針對VBA做詳細說明的???
作者: c_c_lai    時間: 2012-9-11 08:42

回復  c_c_lai

編譯時都會跳到這Private Sub Workbook_Open()
然後無法執行,這問題出現在哪邊?

還 ...
ribbits 發表於 2012-9-10 23:09

這份圖表應該已回答你的問題了,如仍不解你只好祈求上蒼了!
[attach]12450[/attach]
作者: steveyeh168    時間: 2012-9-12 00:45

C_C_lai 好偉大~試試看.......感謝...so great~
作者: ribbits    時間: 2012-9-15 22:41

本帖最後由 ribbits 於 2012-9-15 22:42 編輯

回復 30# c_c_lai


    謝謝大大的詳細講解,相信對VBA門外漢的大家都將幫助不少


作者: lieh_chun    時間: 2012-9-20 23:46

請教一下~
目前抓的可以記錄每分鐘的高低點了,但是有一個問題就是時間,總是無法在整數時提供數據,我發現有時在1X/2X/5X 才會紀錄數據,這樣不就數據失真了ㄇ??想請教各位,用EXCEL VBA去寫,到頭來還是無法準確抓到每分鐘的最高最低開盤收盤 成交價ㄇ??




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)