Board logo

標題: 如何將台指期的每一分鐘資料都紀錄在sheet 1裡..請教版上高手前輩~~ [打印本頁]

作者: cfuxiong    時間: 2012-9-29 09:43     標題: 如何將台指期的每一分鐘資料都紀錄在sheet 1裡..請教版上高手前輩~~

各位高手前輩:中秋佳節快樂

我曾套用,版上大分享的程式碼,連上[看盤軟體DDE]卻不會動。想請問版大,我該怎麼改才可以使用。
現在我想重新建立新的檔,請先讓我簡單說明我的需求:
1.sheet 4 是看盤軟體DDE輸出到Excel的資料。
2.我希望能將台指期的每一分鐘資料都紀錄在sheet 1裡,不是直接紀錄DDE回傳的資料,
  而是紀錄sheet 4每一分鐘的[成交價][最高][最低][成交量]
以上用Excel不知是否可行?請教版上高手前輩~~

附上:我的[看盤軟體DDE]轉出到Excel沒程式碼的(如圖)
作者: c_c_lai    時間: 2012-9-29 12:42

回復 1# cfuxiong
中秋佳節快樂!
我在 Sheet4 多增加一個欄位,專為處理每一分鐘後之 "成交量" 數據。
[attach]12631[/attach]
[attach]12632[/attach]
作者: cfuxiong    時間: 2012-9-29 13:21

回復 2# c_c_lai
最佳的中秋節禮物...擁滿懷的『感謝』給你[c_c_lai]~~
剛剛測試很滿意,接著等星期一再實測了~~謝謝~~
作者: c_c_lai    時間: 2012-9-29 21:04

為了讓更多人進一步明瞭整體的作業過程,未來也可以自己在實務上實際演練
及摩擬,故將作業畫面與程式一併貼附上來分享。
希望每個人都能從中學習領悟、寫出更佳的程式,再將成果分享提供給大家!
  1. Option Explicit

  2. Dim Ov As Single, Hv As Single, Lv As Single, Cv As Single
  3. Dim timerEnabled As Boolean    ' 判定開啟本工作表單的時段是否為開盤前啟動。
  4. Public turnKey As Integer

  5. Private Sub Workbook_Open()
  6.     timerEnabled = False
  7.     Sheets("Sheet4").[I2] = Sheets("Sheet4").[H2]     ' 設定前成交量
  8.     Call timerStart            ' 程式一啟始,便去自動執行 timerStart
  9. End Sub

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

  16. Public Sub RTimer(tm As Date)
  17.     Dim TimeRange As Range, Rng As Range
  18.     Dim pos As Integer
  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("Sheet1")
  26.             If Not IsError(.[B2]) Then
  27.                 .[B1] = "成交價"
  28.                 .[C1] = "最高價"
  29.                 .[D1] = "最低價"
  30.                 .[E1] = "成交量"
  31.                
  32.                 Set TimeRange = .[A:A].Find(TimeSerial(Hour(tm), Minute(tm), 0))  ' 檢查 "A" 欄位對應之時間資料
  33.                 Set Rng = TimeRange.Offset(, 1).Resize(1, 4)
  34.                
  35.                 Rng(1) = Cv                                             ' 成交價
  36.                 Rng(2) = Hv                                             ' 最高價
  37.                 Rng(3) = Lv                                             ' 最低價
  38.                 Rng(4) = Sheets("Sheet4").[H2] - Sheets("Sheet4").[I2]  ' 成交量
  39.                 Sheets("Sheet4").[I2] = Sheets("Sheet4").[H2]           ' 重新設定前成交量
  40.             End If
  41.         End With
  42.     End If
  43. End Sub

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

  65. Private Sub inProcess()
  66.     Static Msg As Boolean          ' 用以判定是否為每日第一次執行
  67.     Static timeCalc As Date        ' 記錄每分鐘的時間
  68.    
  69.     On Error Resume Next
  70.     If (TimeValue(Now) < TimeValue("08:45:00") Or TimeValue(Now) > TimeValue("13:46:01")) Then Exit Sub
  71.       
  72.     If Msg = False Then
  73.         timeCalc = TimeSerial(Hour(Time), Minute(Time), 0)   ' 設定目前起始的時間
  74.         Msg = True
  75.     End If
  76.    
  77.     If IsError(Sheets("Sheet4").Range("B2").Value) Then
  78.         Cv = 0
  79.     Else
  80.         Cv = Sheets("Sheet4").Range("B2").Value    ' 成交價
  81.     End If
  82.          
  83.     If (turnKey = 0 Or Ov = 0) Then
  84.         Ov = Cv                                      ' 開盤價
  85.         Hv = Cv                                      ' 最高價
  86.         Lv = Cv                                      ' 最低價
  87.     End If
  88.         
  89.     If (Cv > Hv) Then Hv = Cv                        ' 最高價
  90.     If (Cv < Lv) Then Lv = Cv                        ' 最低價
  91.          
  92.     turnKey = turnKey + 1
  93.     Sheets("Sheet4").[A3] = "( " & turnKey & " 秒 )"
  94.     If Time >= timeCalc + #12:01:00 AM# Then
  95.         If (Cv > 0) Then Call RTimer(Time)
  96.         timeCalc = TimeSerial(Hour(Time), Minute(Time), 0)   ' 重新設定下一分鐘比對的時間
  97.         If timerEnabled Then Call timerStart
  98.     Else
  99.         Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.inProcess"
  100.     End If
  101. End Sub
複製代碼
[attach]12635[/attach]
作者: cfuxiong    時間: 2012-10-3 17:56

回復 4# c_c_lai
c_c_lai版大你好;經過三天的實測,有時會當機(資料沒進來)待多觀測幾日再請教了,
整體上非常滿意~~...謝謝!!
作者: c_c_lai    時間: 2012-10-3 20:22

回復 5# cfuxiong
在跑這支程式執行中,切記勿開啟另一隻Excel 程式,請回憶看看是否有這種情形?
如果只是單純跑這隻的話,除非是電腦本身有狀況,你說的情況是不可能會發生的!
作者: c_c_lai    時間: 2012-10-3 20:28

回復 5# cfuxiong
還有如果券商的軟體掛了重新開啟, EXCEL 亦要一併先予關閉後再開 (重新連結DDE)。
作者: cfuxiong    時間: 2012-10-4 19:10

回復 7# c_c_lai
c_c_lai版大你好;昨天實測是有與[量態]同時使用....
今天就沒問題了...那要與[量態]併用是否就無解?
因看盤軟體dde有[委買賣量]沒有[委買賣筆數]不能計算[量態]~
謝謝回應與指導~~
能否給與指導 [email protected]
作者: c_c_lai    時間: 2012-10-4 21:14

回復  c_c_lai
c_c_lai版大你好;昨天實測是有與[量態]同時使用....
今天就沒問題了...那要與[量態]併用 ...
cfuxiong 發表於 2012-10-4 19:10

能不能將它們合併在一個 EXCEL 內應用?
這也是我一直的困擾,不知是 EXCEL 的 VBA 相互間處理所導致,還是其它因素?
作者: cfuxiong    時間: 2012-10-18 16:15

回復 9# c_c_lai
c_c_lai版大你好;今天換倉DDE又要重新建立,那我們所編輯的VBA要如何移轉。
請給予指導...謝謝!!
作者: c_c_lai    時間: 2012-10-18 21:45

回復 10# cfuxiong
你直接將DDE匯入字串公式 J2 改成 K2 就 OK 了。
作者: cfuxiong    時間: 2012-10-18 22:00

DDE匯入字串公式 J2 改成 K2=>找不到位址再哪?可以告訴我嗎?
作者: cfuxiong    時間: 2012-10-18 22:00

回復 11# c_c_lai
DDE匯入字串公式 J2 改成 K2=>找不到位址再哪?可以告訴我嗎?
作者: c_c_lai    時間: 2012-10-18 22:10

回復 13# cfuxiong
你的券商是用哪家?
譬如:元大       成交價    =YT|KS!TXFJ2.124   --->   =YT|KS!TXFK2.124
            易利得   成交價    =CATDDE|'FUTOPT<FO>TXFJ2     '!CurPrice   --->   =CATDDE|'FUTOPT<FO>TXFK2     '!CurPrice
以此類推。
作者: c_c_lai    時間: 2012-10-18 22:28

回復 13# cfuxiong
送你一支轉換涵式,你只要更換成你寫入的欄位便成 (元大及易利得)。
  1. Sub changeMonth()               ' 執行結算轉月
  2.     Dim sCode, tCode As String, mArray()
  3.    
  4.     sCode = Sheets("Omega").Range("U17").Value       '   [color=Red]目前(本月)引入值為   "K211"[/color]

  5.     If (Len(sCode) = 4) Then
  6.         mArray = Array("一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月")
  7.         tCode = Right(sCode, 2)
  8.         sCode = Left(sCode, 2)
  9.          
  10.         With Sheets("Omega")
  11.             .Range("A2").Value = "TXF" & sCode                   '  元大
  12.             .Range("B2").Formula = "=YT|KS!TXF" & sCode & ".402"
  13.             .Range("C2").Formula = "=YT|KS!TXF" & sCode & ".122"
  14.             .Range("D2").Formula = "=YT|KS!TXF" & sCode & ".123"
  15.             .Range("E2").Formula = "=YT|KS!TXF" & sCode & ".124"
  16.             .Range("F2").Formula = "=YT|KS!TXF" & sCode & ".125"
  17.             .Range("G2").Formula = "=YT|KS!TXF" & sCode & ".126"
  18.             .Range("H2").Formula = "=YT|KS!TXF" & sCode & ".128"
  19.             .Range("I2").Formula = "=YT|KS!TXF" & sCode & ".130"
  20.             .Range("J2").Formula = "=YT|KS!TXF" & sCode & ".131"
  21.             .Range("K2").Formula = "=YT|KS!TXF" & sCode & ".132"
  22.             .Range("L2").Formula = "=YT|KS!TXF" & sCode & ".133"
  23.             .Range("M2").Formula = "=YT|KS!TXF" & sCode & ".135"
  24.             .Range("N2").Formula = "=YT|KS!TXF" & sCode & ".136"
  25.             .Range("O2").Formula = "=YT|KS!TXF" & sCode & ".437"
  26.             .Range("P2").Formula = "=YT|KS!TXF" & sCode & ".405"
  27.             .Range("Q2").Formula = "=YT|KS!TXF" & sCode & ".406"
  28.             .Range("R2").Formula = "=YT|KS!TXF" & sCode & ".407"
  29.             .Range("S2").Formula = "=YT|KS!TXF" & sCode & ".422"
  30.             .Range("T2").Formula = "=YT|KS!TXF" & sCode & ".423"
  31.             .Range("U2").Formula = "=YT|KS!TXF" & sCode & ".431"
  32.             .Range("V2").Formula = "=YT|KS!TXF" & sCode & ".170"
  33.             .Range("W2").Formula = "=YT|KS!TXF" & sCode & ".172"
  34.             .Range("X2").Formula = "=YT|KS!TXF" & sCode & ".171"
  35.             .Range("Y2").Formula = "=YT|KS!TXF" & sCode & ".173"
  36.             .Range("Z2").Formula = "=YT|KS!TXF" & sCode & ".290"
  37.             .Range("AA2").Formula = "=YT|KS!TXF" & sCode & ".291"
  38.             .Range("AB2").Formula = "=YT|KS!TXF" & sCode & ".201"
  39.             .Range("AC2").Formula = "=YT|KS!TXF" & sCode & ".202"
  40.             .Range("AD2").Formula = "=YT|KS!TXF" & sCode & ".203"
  41.             .Range("AE2").Formula = "=YT|KS!TXF" & sCode & ".204"
  42.             .Range("AF2").Formula = "=YT|KS!TXF" & sCode & ".205"
  43.             .Range("AG2").Formula = "=YT|KS!TXF" & sCode & ".211"
  44.             .Range("AH2").Formula = "=YT|KS!TXF" & sCode & ".212"
  45.             .Range("AI2").Formula = "=YT|KS!TXF" & sCode & ".213"
  46.             .Range("AJ2").Formula = "=YT|KS!TXF" & sCode & ".214"
  47.             .Range("AK2").Formula = "=YT|KS!TXF" & sCode & ".215"
  48.             .Range("AL2").Formula = "=YT|KS!TXF" & sCode & ".221"
  49.             .Range("AM2").Formula = "=YT|KS!TXF" & sCode & ".222"
  50.             .Range("AN2").Formula = "=YT|KS!TXF" & sCode & ".223"
  51.             .Range("AO2").Formula = "=YT|KS!TXF" & sCode & ".224"
  52.             .Range("AP2").Formula = "=YT|KS!TXF" & sCode & ".225"
  53.             .Range("AQ2").Formula = "=YT|KS!TXF" & sCode & ".231"
  54.             .Range("AR2").Formula = "=YT|KS!TXF" & sCode & ".232"
  55.             .Range("AS2").Formula = "=YT|KS!TXF" & sCode & ".233"
  56.             .Range("AT2").Formula = "=YT|KS!TXF" & sCode & ".234"
  57.             .Range("AU2").Formula = "=YT|KS!TXF" & sCode & ".235"
  58.             .Range("AV2").Formula = "=YT|KS!TXF" & sCode & ".147"
  59.             .Range("AW2").Formula = "=YT|KS!TXF" & sCode & ".148"

  60.             .Range("A12").Value = "台期 " & tCode                          '  易利得
  61.             .Range("B12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!BuyPrice1"
  62.             .Range("B13").Value = "臺指     " & tCode
  63.             .Range("C12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!SellPrice1"
  64.             .Range("D12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!CurPrice"
  65.             .Range("E12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!TickVol"
  66.             .Range("F12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!Volume"
  67.             .Range("G12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!High"
  68.             .Range("H12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!Low"
  69.             .Range("I12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!Diff"
  70.             .Range("J12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!DiffRate"
  71.             .Range("K12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!UpLimit"
  72.             .Range("L12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!DownLimit"
  73.             .Range("M12").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!TheoryPrice"
  74.             .Range("D13").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & "     '!TrustBuyVol"
  75.             .Range("D14").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & "     '!TrustSellVol"
  76.             .Range("F13").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & "     '!TotalBuyCnt"
  77.             .Range("F14").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & "     '!TotalSellCnt"
  78.             .Range("H13").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & "     '!TrustBuyCnt"
  79.             .Range("H14").Formula = "=CATDDE|'FUTOPTTRADE<T>TXF" & sCode & "     '!TrustSellCnt"
  80.             .Range("K14").Formula = "=CATDDE|'FUTOPT<FO>TXF" & sCode & "     '!Open"
  81.             .Range("A18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyVol1"
  82.             .Range("A19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyVol2"
  83.             .Range("A20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyVol3"
  84.             .Range("A21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyVol4"
  85.             .Range("A22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyVol5"
  86.             .Range("A23").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!TotalBuyVol"
  87.             .Range("B18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyPrice1"
  88.             .Range("B19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyPrice2"
  89.             .Range("B20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyPrice3"
  90.             .Range("B21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyPrice4"
  91.             .Range("B22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!BuyPrice5"
  92.             .Range("C18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellPrice1"
  93.             .Range("C19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellPrice2"
  94.             .Range("C20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellPrice3"
  95.             .Range("C21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellPrice4"
  96.             .Range("C22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellPrice5"
  97.             .Range("D18").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellVol1"
  98.             .Range("D19").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellVol2"
  99.             .Range("D20").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellVol3"
  100.             .Range("D21").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellVol4"
  101.             .Range("D22").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!SellVol5"
  102.             .Range("D23").Formula = "=CATDDE|'FUTOPT<FO>GTF" & sCode & "     '!TotalSellVol"
  103.         End With
  104.     End If
  105. End Sub
複製代碼

作者: momowu    時間: 2012-10-22 11:27

感謝兩位C大的討論後成果的分享
因為小弟僅需要5min的量資料而已
去哪改從1min成5min呢?
謝謝
作者: momowu    時間: 2012-10-22 11:36

這邊小弟有個想法,如果使用DDE的成交量
然後用時間來截止每分鐘(因人而異)紀錄一次成交量
作個簡單減法,就可以知道這一分鐘或這五分鐘,成交量增加了多少
程式會不會變得簡單一點呢?
作者: c_c_lai    時間: 2012-10-22 12:07

這邊小弟有個想法,如果使用DDE的成交量
然後用時間來截止每分鐘(因人而異)紀錄一次成交量
作個簡單減法, ...
momowu 發表於 2012-10-22 11:36

無論是一分鐘、五分鐘、十分鐘、基本上你還是需要有每一循環的成交量起始值,
程式碼並不會因此而有所增減,變的只是使用端的需求不同罷了。
作者: wengin66    時間: 2012-10-22 22:50

謝謝分享~~~
作者: cfuxiong    時間: 2012-12-8 12:53

回復 18# c_c_lai
c_c_lai大你好;
能否把 附件【策略記錄】欄[摩台][韓國][日本]也增列每30秒記錄?
連同[量態]1分也改30秒~~
我用併湊整合都未能合意..是我資質太差,懇請能幫忙..謝謝!!
我EMail:[email protected]  歡迎指教
作者: c_c_lai    時間: 2012-12-9 07:43

回復  c_c_lai
c_c_lai大你好;
能否把 附件【策略記錄】欄[摩台][韓國][日本]也增列每30秒記錄?
連同 ...
cfuxiong 發表於 2012-12-8 12:53

看了你策略記錄的內容,匯入時間是固定欄紀錄時間
(目前是每一分鐘記錄一筆),你說的 "也增列" 每30秒記錄?
不太明白你想的是甚麼?
又、 [摩台][韓國][日本] 資料源在哪裡?
作者: cfuxiong    時間: 2012-12-9 10:25

回復 21# c_c_lai
c_c_lai大 早安;
述說不清楚,對不起..重新說明;
[摩台][韓國][日本]在【DDE報價】欄,每[1分]記錄即可
(資料範圍屬性是1分更新)。[台指期]就不用了..減少浪費電腦資源,
懇請能幫忙..謝謝!!...我EMail:[email protected] 歡迎來函
作者: cfuxiong    時間: 2012-12-9 10:31

回復 21# c_c_lai

忘了補上(附件)...
作者: GBKEE    時間: 2012-12-9 11:19

回復 23# cfuxiong
試試看
  1. Option Explicit
  2. Private Sub Workbook_Open()
  3.     With Sheets("策略記錄")
  4.         .Cells(4, 2) = 9 ' 紀錄從10列開始
  5.         .Range(.Cells(10, 1), .Cells(10, 1).End(xlDown).Offset(, 8)) = ""
  6.         '清除 舊有資料
  7.     End With
  8.     Timer_DEE
  9. End Sub
  10. Private Sub Workbook_BeforeClose(Cancel As Boolean)
  11.     On Error Resume Next
  12.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer_DEE", , False
  13. End Sub
  14. Public Sub Timer_DEE()
  15.     'Timer 函數 傳回一 Single,其內容為從前一個午夜算起到現在所經過的秒數。
  16.     '變數,程序:名稱要避免使用VBA 的內定關鍵字
  17.     Dim Pos As Integer, i As Integer, RangeStr As String
  18.     On Error Resume Next
  19.     Application.OnTime Now + TimeValue("00:00:01"), "ThisWorkbook.Timer_DEE"    '每秒顯示
  20.     Sheets("策略記錄").Cells(3, 2) = Time                                   '將時間show至策略的b3欄位
  21.     'Dim HHMM As Integer
  22.     'HHMM = Hour(Time) * 100 + Minute(Time)
  23.     'If (HHMM < 845 Or HHMM > 1345) Then Exit Sub '營業時間才執行
  24.     If Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '營業時間才執行
  25.     If Second(Time) Mod 30 = 0 Then '間隔30秒
  26.     'If Second(Time) Mod 5 = 0 Then '間隔5秒 10秒 15秒 ....
  27.         With Sheets("策略記錄")
  28.             .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
  29.             Pos = .Cells(4, 2)
  30.             .Cells(Pos, 1) = Time
  31.             .Cells(Pos, 2).Resize(, 8) = .[b2:i2].Value
  32.             'Sheets("策略記錄").[b2:i2] 分別是以下的DEE
  33.             '[多空力道][反向勢力][主力控盤][台指期 成交價][台指期 成交價][摩台指][韓國綜合][日經指數]
  34.         End With
  35.     End If
  36. End Sub
複製代碼

作者: c_c_lai    時間: 2012-12-9 12:01

回復 23# cfuxiong
上層 GBKEE 版大提示的明細範例,
是否已解決了你的問題?
作者: cfuxiong    時間: 2012-12-9 12:11

回復 25# c_c_lai
c_c_lai大你好;
我照[GBKEE大]的指導,複製貼上不知是否可行?就待明天測試了!!
附件是有加[GBKEE大]的巨集,請[c_c_lai大][GBKEE大]指導..謝謝!!
作者: GBKEE    時間: 2012-12-9 12:47

本帖最後由 GBKEE 於 2012-12-9 12:49 編輯

回復 26# cfuxiong
不是加上: 是要修改ThisWorkbook 上的程式碼 (copy 覆蓋掉 ThisWorkbook 上的程式碼)
作者: cfuxiong    時間: 2012-12-9 12:59

回復 27# GBKEE
GBKEE大你好;
能給個正確的[Zip檔]讓我學習嗎?謝謝~~
作者: GBKEE    時間: 2012-12-9 14:07

本帖最後由 GBKEE 於 2012-12-9 14:09 編輯

回復 28# cfuxiong
沒有那麼難的,照我說的去試試看!!!

這裡改依改就可  
'Sheets("策略記錄").[b2:i2] 分別是以下的DEE
'[多空力道][反向勢力][主力控盤][台指期 成交價][台指期 成交價][摩台指][韓國綜合][日經指數]
作者: cfuxiong    時間: 2012-12-9 14:24

回復 29# GBKEE
[台指期]刪除...如此改對嗎?
'Sheets("策略記錄").[b10:i10] 分別是以下的DEE
            '[多空力道][反向勢力][主力控盤][摩台指][韓國綜合][日經指數]
        End With
    End If
End Sub
作者: GBKEE    時間: 2012-12-9 14:59

回復 30# cfuxiong
  1. .Cells(Pos, 2).Resize(, 8) = .[b2:i2].Value
  2.             ' ****** Sheets("策略記錄").[b2:i2] 分別是以下的DEE   ******
  3.            '****[多空力道][反向勢力][主力控盤][台指期 成交價][台指期 成交價][摩台指][韓國綜合][日經指數]****
複製代碼

24#程式碼 : 工作表 Sheets("策略記錄").[B2:I2] 這8個儲存格 ,要改成那些DEE的公式
                      程式每隔?秒,要抓取.[b2:i2].Value 這些資料到  .Cells(Pos, 2).Resize(, 8) 這裡
完成上面步驟,VBA 視窗裡:ThisWorkbook模組 刪掉所有程式碼 ,貼上 24# 所有程式碼?
明天看是否成功!!!!
作者: cfuxiong    時間: 2012-12-9 19:00

回復 31# GBKEE
GBKEE大你好;
弄了半天..增加好多個???看來我是舉雙手投降了..以下是改的..不知是否正確?
請高手指導~~謝謝~~

'If (HHMM < 845 Or HHMM > 1345) Then Exit Sub '營業時間才執行
    If Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '營業時間才執行
※上面二行[營業時間才執行]時間未何不一致?
    If Second(Time) Mod 30 = 0 Then '間隔30秒
    'If Second(Time) Mod 5 = 0 Then '間隔5秒 10秒 15秒 ....
※上面二行如我需要1分,是否二行都要改 Mod 60 = 0 Then,間隔60秒
This Workbook已改成;
'Sheets("策略記錄").[b10:g10] 分別是以下的DEE
            '[多空力道][反向勢力][主力控盤][摩台指][韓國綜合][日經指數]
作者: f3202    時間: 2012-12-9 20:12

回復 32# cfuxiong
   
If Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '營業時間才執行

改為     If Time < #9:00:00 AM# Or Time > #11:30:00 PM# Then Exit Sub  '營業時間才執行

測試就知道
作者: cfuxiong    時間: 2012-12-9 21:08

回復 33# f3202
改為     If Time < #9:00:00 AM# Or Time > #11:30:00 PM# Then Exit Sub
為何是[#11:30:00 PM#]?
作者: f3202    時間: 2012-12-9 21:25

回復 34# cfuxiong

=23:00:00
正常13:45:00即停止執行vba
作者: GBKEE    時間: 2012-12-10 07:20

本帖最後由 GBKEE 於 2012-12-15 07:19 編輯

回復 32# cfuxiong
This Workbook已改成;'Sheets("策略記錄").[b10:g10] 分別是以下的DEE
如圖 工作表也要改:輸入公式(圖中是示範的公式,看那些DEE在哪裡)

[attach]13486[/attach]


附檔的程式碼你有修改:你須再修改
  1. With Sheets("策略記錄")
  2.             .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
  3.             Pos = .Cells(4, 2)
  4.             .Cells(Pos, 1) = Time
  5.          '   .Cells(Pos, 2).Resize(, 8) = .[b10:g10].Value  'b10:g10 只有6欄  且位址也不對
  6.             .Cells(Pos, 2).Resize(, 6) = .[b2:g2].Value   '要修改為 6
  7.             'Sheets("策略記錄").[b2:i2] 分別是以下的DEE
  8.             '[多空力道][反向勢力][主力控盤][摩台指][韓國綜合][日經指數]  '只有6欄
  9.         End With
複製代碼
Mod 60 = 0 Then,間隔60秒    試試就知
作者: cfuxiong    時間: 2012-12-10 19:59

回復 36# GBKEE
GBKEE大你好;請教2個問題...
Cells(4, 2) = 9 ' 紀錄從10列開始  [對嗎?]

If Second(Time) Mod 60 = 0 Then '間隔60秒
'If Second(Time) Mod 5 = 0 Then '間隔5秒 10秒 15秒 ....
[是改一行還是二行都要改?]

附件;請指導是否OK...謝謝!!
作者: GBKEE    時間: 2012-12-11 07:39

本帖最後由 GBKEE 於 2012-12-15 07:21 編輯

回復 37# cfuxiong
程式碼中 每行程式碼 前面的 ' 是作為程式碼的註解(解釋用) 程式不會執行的
  1. If Time < #9:00:00 AM# Or Time > #1:30:00 PM# Then Exit Sub  '營業時間才執行
  2.     If Second(Time) Mod 60 = 0 Then '間隔60秒         
  3.     'If Second(Time) Mod 5 = 0 Then '間隔5秒 10秒 15秒 ....  這行是註解解釋 舉列 5 為每5秒  類推....     
  4.         With Sheets("策略記錄")
  5.             .Cells(4, 2) = .Cells(4, 2) + 1 '將變動行號加一行
  6.             Pos = .Cells(4, 2)
  7.             .Cells(Pos, 1) = Time
  8.           '  .Cells(Pos, 2).Resize(, 8) = .[b10:g10].Value   '** 如執行此行 會有2個 "#NA"
  9.              '  ***** Resize(, 8)這裡是8欄  ,[b10:g10]  這裡 b:g  只有6欄
  10.             .Cells(Pos, 2).Resize(, 6) = .[b2:g2].Value   ' 執行此行就可以  ** 要修改為 6及位址 **
  11.             'Sheets("策略記錄").[b2:i2] 分別是以下的DEE
  12.             '[多空力道][反向勢力][主力控盤][摩台指][韓國綜合][日經指數]  '只有6欄
  13.         End With
  14.     End If
複製代碼

作者: cfuxiong    時間: 2012-12-14 21:50

回復 38# GBKEE
GBKEE大你好;能否煩請查核[巨集]是否編輯正確,(8:45~13:45)資料是有撈進來但卻不能記錄~~
作者: cfuxiong    時間: 2012-12-14 21:52

回復 38# GBKEE
對不起~~~忘了附件~~
作者: bobo177    時間: 2012-12-14 22:39

回復  cfuxiong
還有如果券商的軟體掛了重新開啟, EXCEL 亦要一併先予關閉後再開 (重新連結DDE)。
c_c_lai 發表於 2012-10-3 20:28



    有時會發生一種情形, 就是DDE都有顯示連結成功. 但是真的到盤中時, 卻沒跳動. 解決方式確實是重開券商軟體, 連同EXCEL一起更好.
只是很奇怪的是, 為什麼會有這種情形呢?  
作者: GBKEE    時間: 2012-12-15 07:24

回復 40# cfuxiong
38# : 只改到欄數,沒改到位址!!!  ,已更正可再參考一下!

  1.             ' .Cells(Pos, 2).Resize(, 8) = .[b10:g10].Value  'b10:g10 只有6欄 ***這行不要了****
  2.            ' .Cells(Pos, 2).Resize(, 6) = .[b10:g10].Value   '只要修改到欄數為 6 , 沒改到位址
  3.              .Cells(Pos, 2).Resize(, 6) = .[b2:g2].Value   ' *** 這才完全正確 ***
複製代碼

作者: c_c_lai    時間: 2012-12-15 08:17

本帖最後由 c_c_lai 於 2012-12-15 08:20 編輯
有時會發生一種情形, 就是DDE都有顯示連結成功. 但是真的到盤中時, 卻沒跳動. 解決方式確實是重開 ...
bobo177 發表於 2012-12-14 22:39

還是老話一句:
1.  如果券商的軟體掛了重新開啟, EXCEL 亦要一併先予關閉後再開 (重新連結DDE)。
     程序是:1. 券商的軟體、以及已開啟的 EXCEL 兩者均要先行關閉;
                     2. 先開啟券商軟體、之後再開啟  EXCEL。
2.  如果券商的軟體開啟正常, EXCEL 都有顯示DDE連結成功,而正常開啟後,
     如果有去瀏覽程式碼不小心異動了程式、或者是之後又另外開啟另一支有 VBA
    執行的 EXCEL (此過程先前已開啟的 EXCEL  依然還在執行中),極有可能它會影響
    到之前已開啟的 EXCEL 而造成不意中斷。此時先前已開啟的 EXCEL 亦要一併先予
    關閉後再重開 (重新連結DDE), 當然之後第二支另外開啟的 EXCEL 要先關閉。
3. 如都不是,那就要評估你的 EXCEL 程式碼了。
作者: cfuxiong    時間: 2012-12-16 10:18

回復 42# GBKEE
感謝GBKEE大指導..今早測機已能順暢記錄,謝謝!!明天再實機連線,有問題再請教....
也感謝c_c_lai大的指導...現在對[巨集]的編輯是有些概念了...謝謝!!
作者: cfuxiong    時間: 2012-12-16 10:22

回復 43# c_c_lai
感謝c_c_lai大的指導...現在對[巨集]的編輯是有些概念了...謝謝!!
今早測機已能順暢記錄,謝謝!!明天再實機連線,有問題再請教....
作者: cfuxiong    時間: 2012-12-17 21:26

回復 42# GBKEE
今天實測OK了...謝謝指導~~
作者: cfuxiong    時間: 2012-12-22 19:36

回復 43# c_c_lai
c_c_lai你好;能否幫忙在[巨集]編輯器,要增加一行[摩台指]資料,
來源[Sheet4][J2]記錄到[Sheet1][F欄]只要1分收盤即可。
附件;是之前經你指導的[台指]..請給於再指導..謝謝!!
作者: c_c_lai    時間: 2012-12-22 20:23

回復 47# cfuxiong
增加 "摩台指"!
[attach]13656[/attach]
作者: cfuxiong    時間: 2012-12-23 19:40

回復 48# c_c_lai
c_c_lai你好;再次謝謝您這麼熱心的幫忙,
明天實測有問題再請教...真的感謝您!!
作者: c_c_lai    時間: 2012-12-23 19:49

回復 49# cfuxiong
你的摩台指 DDE 匯入來源並非有連結券商,
請再檢查一下你的 Excel!
作者: cfuxiong    時間: 2012-12-23 21:39

回復 50# c_c_lai
c_c_lai你好;是的...我是連結網頁的,理論上是可以,
只要抓網頁與DDE連結時不要同時間,應可改善搶頻寬的問題。
明天實測再告訴你..晚安!!       EMail:[email protected]
作者: cfuxiong    時間: 2012-12-28 19:34

回復 50# c_c_lai
c_c_lai大;晚安你好
經5天的實測[DDE+網頁]是OK的。再次謝謝您這麼熱心的幫忙。
作者: osmonda    時間: 2013-1-8 08:57

很實用,感謝您提供詳細的內容
作者: devidlin    時間: 2013-1-19 10:40

回復 20# cfuxiong


    請問c大,態量.xls檔案內的  圖表區程式碼要如何寫出來?謝謝。
作者: devidlin    時間: 2013-1-19 10:42

回復 13# cfuxiong


    請問c大,態量.xls檔案內的  圖表區程式碼要如何寫出來?謝謝。
作者: devidlin    時間: 2013-1-19 20:30

回復 21# c_c_lai


    請問c大,態量.xls檔案內的  圖表區程式碼要如何寫出來?謝謝。
作者: c_c_lai    時間: 2013-1-20 05:28

回復  c_c_lai


    請問c大,態量.xls檔案內的  圖表區程式碼要如何寫出來?謝謝。
devidlin 發表於 2013-1-19 20:30

態量.xls 在哪裡?請上傳檔案看看!
作者: devidlin    時間: 2013-1-20 07:55

回復 57# c_c_lai


    請參考,謝謝。
作者: c_c_lai    時間: 2013-1-20 11:02

回復 58# devidlin
如果你是在問如何製作圖表,可請參考:
K 線股票圖如何能與主力、散戶、及成交量線共存?
或本論壇內其他相關之討論,你都可以從中獲取不錯的實務題材的。
作者: devidlin    時間: 2013-1-20 13:43

回復 57# c_c_lai


    小弟比較愚笨,程式碼如下,如果說在圖表區要增加台指期每分鐘之價格邀如何修改?謝謝。

    Option Explicit
Dim LastMin As Integer

Private Sub Workbook_Open()
    Sheets("策略記錄").Cells(4, 2) = 10
    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(3, 2) = Time '將時間show至策略的b3欄位
    Dim HHMM As Integer
    HHMM = Hour(Time) * 100 + Minute(Time)
    If (HHMM < 845 Or HHMM > 2045) 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)
         
        End With
   
        LastMin = Minute(Time)
    End If
End Sub
作者: c_c_lai    時間: 2013-1-20 15:48

回復 60# devidlin
你可以將你目前運用的 Excel 檔案上傳,抽時間我幫你看看該如何修正,
每個人都各自有他們運作的模式與喜好、以及獨到見解、策略應用,
切不要完全套用他人的內容全數抄襲,如此使用起來也完全沒有
個人的風格了、亦無個人之成就感。
作者: cfuxiong    時間: 2013-1-20 20:42

回復 55# devidlin
To devidlin:量態的計算方式,在[DDE報價]表格..就可看出。
[圖表區]可按[右鍵]從[來源資料]就可看出端倪。
我是新手..是從版上高手文章檔案併湊而成~~
這是我知的範圍答覆你,也請版上高手能幫你解答...謝謝!!
作者: n8975067    時間: 2013-4-19 11:23

回復 4# c_c_lai
請教 c_c_lai大大
若我要每五分鐘紀錄期貨的委買口數 委賣口數 委買筆數 委賣筆數 委買均口 委賣均口等即時資料,我要如何修改裡面的變數?
作者: c_c_lai    時間: 2013-4-19 14:19

回復  c_c_lai
請教 c_c_lai大大
若我要每五分鐘紀錄期貨的委買口數 委賣口數 委買筆數 委賣筆數 委買均 ...
n8975067 發表於 2013-4-19 11:23
  1. If (Minute(Time) * 60 + Second(Time)) Mod 300 = 0 Then          '  每隔5分鐘執行一次 (5 x 60)
  2.     '  ------ Your statement -------
  3. End If
複製代碼

作者: peter95    時間: 2017-3-2 12:57

為了讓更多人進一步明瞭整體的作業過程,未來也可以自己在實務上實際演練
及摩擬,故將作業畫面與程式一併 ...
c_c_lai 發表於 2012-9-29 21:04


請問老師
關於下列這段語法的意思是

turnKey = turnKey + 1
    Sheets("Sheet4").[A3] = "( " & turnKey & " 秒 )"
    If Time >= timeCalc + #12:01:00 AM# Then
        If (Cv > 0) Then Call RTimer(Time)
        timeCalc = TimeSerial(Hour(Time), Minute(Time), 0)   ' 重新設定下一分鐘比對的時間
        If timerEnabled Then Call timerStart
    Else
        Application.OnTime (Now + TimeValue("00:00:01")), "ThisWorkbook.inProcess"
    End If



感謝老師指導 謝謝老師 感謝
作者: winwin    時間: 2017-12-7 22:20

c_c_lai 發表於 2013-4-19 14:19



    請問這是程式的那一個部分?
我在一分K的開盤價、成交價、最高價、最低價、成交量的程式是沒問題;

我想把它改成5分K的開盤價、成交價、最高價、最低價、成交量,

可是把它改成了N次,奮戰多時, 總是不成功............

可以協助一下嗎? 已經奮戰多時,皆以失敗告終......................

[attach]28094[/attach]
作者: winwin    時間: 2017-12-7 22:25

回復 66# winwin
作者: c_c_lai    時間: 2017-12-8 07:16

本帖最後由 c_c_lai 於 2017-12-8 07:17 編輯

回復 67# winwin
請將你程式內之 RTimer(tm As Date) 模組替換成下列之更新模組,
再試試看。
  1. Public Sub RTimer(tm As Date)
  2.     Dim TimeRange As Range, Rng As Range
  3.     Dim pos As Integer
  4.    
  5.     On Error Resume Next
  6.     If (TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub
  7.    
  8.     If (TimeValue(Now) >= TimeValue("08:45:00")) Then         ' 開盤、收盤時段設定
  9.         ' 盤中處理,將資料匯入寫入工作表單內儲存。
  10.         With Sheets("Sheet1")
  11.             If Not IsError(.[B2]) Then
  12.                 .[C1] = "成交價"
  13.                 .[D1] = "最高價"
  14.                 .[E1] = "最低價"
  15.                 .[F1] = "成交量"
  16.                
  17.                 Set TimeRange = .[A:A].Find(TimeSerial(Hour(tm), Minute(tm), 0))  ' 檢查 "A" 欄位對應之時間資料
  18.                 Set Rng = TimeRange.Offset(, 1).Resize(1, 4)
  19.                
  20.                 Rng(1) = Cv                                             ' 成交價
  21.                 Rng(2) = Hv                                             ' 最高價
  22.                 Rng(3) = Lv                                             ' 最低價
  23.                 Rng(4) = Sheets("Sheet4").[H2] - Sheets("Sheet4").[I2]  ' 成交量
  24.                 Sheets("Sheet4").[I2] = Sheets("Sheet4").[H2]           ' 重新設定前成交量
  25.             End If
  26.         End With
  27.          
  28.         '  加入五分鐘之判斷
  29.         If (Minute(tm) * 60 + Second(tm)) Mod 300 = 0 Then                              '  每隔5分鐘執行一次 (5 x 60)
  30.             With Sheets("5K")
  31.                 If Not IsError(.[B2]) Then
  32.                     .[C1] = "成交價"
  33.                     .[D1] = "最高價"
  34.                     .[E1] = "最低價"
  35.                     .[F1] = "成交量"
  36.                     
  37.                     Set TimeRange = .[A:A].Find(TimeSerial(Hour(tm), Minute(tm), 0))  ' 檢查 "A" 欄位對應之時間資料
  38.                     Set Rng = TimeRange.Offset(, 1).Resize(1, 4)
  39.                     
  40.                     Rng(1) = Cv                                             ' 成交價
  41.                     Rng(2) = Hv                                             ' 最高價
  42.                     Rng(3) = Lv                                             ' 最低價
  43.                     Rng(4) = Sheets("Sheet4").[H2] - Sheets("Sheet4").[I2]  ' 成交量
  44.                     Sheets("Sheet4").[I2] = Sheets("Sheet4").[H2]           ' 重新設定前成交量
  45.                 End If
  46.             End With
  47.         End If
  48.     End If
  49. End Sub
複製代碼

作者: winwin    時間: 2017-12-8 14:31

本帖最後由 winwin 於 2017-12-8 14:33 編輯

回復 68# c_c_lai


    感謝鼎力相助, 踓然程式還有一點小問題,但是已經可以讓我把問題 把它處理好,真的幫我解決了大麻煩;真是感謝高手相助!

本著回饋的精祌, 我會把檔案放上來。 我的解決方法法就是為5分K多設一個資料源, 這樣我就可以同時看5分及1分K的量。
[attach]28099[/attach]
可是我發現一個問題, 就是盤中的高低點位有時與券商的看盤軟體實際上的相差有點大, 不知道可有先進已有解決方案?
還有, 13:45 這一盤的收盤資料一直空白,不會完成。不知問題出在那?

第二個問題, 我想要增加一個或多個其他欄位;(如圖)對EXCEL VBA 實在是不懂; 可以再幫忙一次忙,寫一個例子,真的是非常感謝,謝謝!
[attach]28098[/attach]
作者: c_c_lai    時間: 2017-12-10 07:09

回復 69# winwin
試試看
  1. Public Sub RTimer(tm As Date)
  2.     Dim TimeRange As Range, Rng As Range
  3.     Dim pos As Integer
  4.    
  5.     On Error Resume Next
  6.     '  If (TimeValue(Now) > TimeValue("13:45:00")) Then Exit Sub
  7.     '  13:45 這一盤的收盤資料一直空白
  8.     If (TimeValue(Now) > TimeValue("13:46:00")) Then Exit Sub
  9.    
  10.     If (TimeValue(Now) >= TimeValue("08:45:00")) Then         ' 開盤、收盤時段設定
  11.         ' 盤中處理,將資料匯入寫入工作表單內儲存。
  12.         With Sheets("1K")
  13.             If Not IsError(.[B2]) Then
  14.                 .[C1] = "成交價"
  15.                 .[D1] = "最高價"
  16.                 .[E1] = "最低價"
  17.                 .[F1] = "成交量"
  18.                
  19.                 Set TimeRange = .[A:A].Find(TimeSerial(Hour(tm), Minute(tm), 0))  ' 檢查 "A" 欄位對應之時間資料
  20.                 Set Rng = TimeRange.Offset(, 2).Resize(1, 4)
  21.                
  22.                 Rng(1) = Cv                                             ' 成交價
  23.                 Rng(2) = Hv                                             ' 最高價
  24.                 Rng(3) = Lv                                             ' 最低價
  25.                 Rng(4) = Sheets("Sheet1").[H2] - Sheets("Sheet1").[I2]  ' 成交量
  26.                 Sheets("Sheet1").[I2] = Sheets("Sheet1").[H2]           ' 重新設定前成交量
  27.             End If
  28.         End With
  29.          
  30.         '  加入五分鐘之判斷
  31.         If (Minute(tm) * 60 + Second(tm)) Mod 300 = 0 Then                              '  每隔5分鐘執行一次 (5 x 60)
  32.             With Sheets("5K")
  33.                 If Not IsError(.[B2]) Then
  34.                     .[C1] = "成交價"
  35.                     .[D1] = "最高價"
  36.                     .[E1] = "最低價"
  37.                     .[F1] = "成交量"
  38.                     
  39.                     Set TimeRange = .[A:A].Find(TimeSerial(Hour(tm), Minute(tm), 0))  ' 檢查 "A" 欄位對應之時間資料
  40.                     Set Rng = TimeRange.Offset(, 2).Resize(2, 4)
  41.                     
  42.                     '  增加 "漲跌" 欄位之同步寫入
  43.                     Rng(0) = Sheets("Sheet5").[C2]                          ' 漲跌
  44.                     Rng(1) = Cv                                             ' 成交價
  45.                     Rng(2) = Hv                                             ' 最高價
  46.                     Rng(3) = Lv                                             ' 最低價
  47.                     Rng(4) = Sheets("Sheet5").[H2] - Sheets("Sheet5").[I2]  ' 5分成交量
  48.                     Sheets("Sheet5").[I2] = Sheets("Sheet5").[H2]           ' 重新設定前成交量
  49.                 End If
  50.             End With
  51.         End If
  52.     End If
  53. End Sub
複製代碼

作者: winwin    時間: 2017-12-11 16:08

回復 70# c_c_lai


   
    感謝您的斧正!  我再度修改後, 現在大致上己沒有問題了;尾盤資料消失的問題己經解決了!

但是5分K 的部分還是會偶爾一、二行時間沒有資料,出現空白。(不知是何問題?  但是1分K的話, 就很正常。)

我明天再測試一下, 不管有沒有問題, 我再把檔案上傳。
作者: winwin    時間: 2017-12-11 16:25

回復 71# winwin

整理好了, 先放上來, 請高手指回, 感恩!

    [attach]28107[/attach]
作者: c_c_lai    時間: 2017-12-12 07:05

回復 72# winwin
你把 Dim O5v As Single, H5v As Single, L5v As Single, C5v As Single 相關語句移除
拿掉,不管是 一分 或者是 五分,全都帶入Ov, Hv, Lv, Cv, 因為當時之價量是一樣的。
太多的 IF 也未必是好的處裡, 徒增 CPU 耗時過濾。
然後再試試看。
作者: winwin    時間: 2017-12-12 23:53

回復 73# c_c_lai

謝謝您的幫忙及指點!  
   
對呀! 填入5分K資料時, 除了 5分K的O5v之外(因為一分K的開盤價與5分K的開盤價是不同的!),而高、低價的Hv, Lv, 的值都是相同的!

我再想想, 要如何去改.......................

謝謝指點!   再不行的話, 真的只能土法煉鋼了(利用1分K的量價,把它轉成5分K).................

我也在思考, 如果有一天要使用15分K或10分K的價量 我該用什麼的方式, 可以直接更改分鐘數, 同時抓取1分、5分、15分,而不用一直更改程式?

感謝您的協助!
作者: winwin    時間: 2017-12-13 16:59

回復 73# c_c_lai

    我可能找到5分K與1分K 數字有所差距的原因了;(資料是12/11 的小期指;本來還在修改; 這幾筆資料還算正確)

由這張圖可看出,5分K棒的正確的開盤價、最高價、最低價應該是下方1分K的  10465(紅色); 10472(黃色), 10459(橘色)

如果都只用1分K的9:40分來作為5分K的,開盤價、最高價、最低價,5分K的開、高、低、的值是會有很大的誤差。

所以, 還是要區分為5分K的O、H、L 不然5分K的值永遠都會有很大的誤差的......................

如已抓到1分K的資料, 如果再使用程式,把1分K的資料再轉換成5分、 或15分K的數據, 會不會比較容易?

這樣就可以不必重複抓取資料, 資料的誤差會不會比較小一點?程式的效能, 會不會好一點?

Excel 也換成64Bits 版本了............我的CPU是4核心, 8執行緒; 應該很夠力

看似簡單的抓取即時數據, 還真的是不簡單啊! 或者是我的程度太差了, 我沒有想要做到數據能夠如券商完全相同(那是不可能的事; 傳輸、網路都會出現問題)

請高手再幫忙, 謝謝!

後續我還想分析一下數據; 沒想到連導出個正確數據都這麼難!

程式設計分析趨勢, 果然是不容易啊!..................

[attach]28111[/attach]
作者: c_c_lai    時間: 2017-12-14 05:02

回復 75# winwin
[attach]28119[/attach]
你可依你的方式自行修正。
作者: c_c_lai    時間: 2017-12-14 05:17

回復 75# winwin
成交價與開盤價未必是一致的,
所以在判斷上使應以最先值為最其初始值,
然後再做後續變化值的給值。
至於如何判定你可依你的實務經驗來衡量,
如此所得出之數據應較為準確。
有些人是直接抓 DDE 匯入之最高價、最低價,
然結果並非其期間之最高價、最低價。
作者: winwin    時間: 2017-12-14 22:43

本帖最後由 winwin 於 2017-12-14 22:45 編輯

回復 77# c_c_lai

感謝c_c_lai 的回覆!


    有些人是直接抓 DDE 匯入之最高價、最低價,然結果並非其期間之最高價、最低價

==>不論是DDE, RTD, 對於每一根的K棒的開盤價, 都會有問題的!

因為即使前一根的收盤價, 並不保證就是當根的開盤價! 因為會有跳空的問題! 就如台指期的每天跳空; 12/13的收盤是10450,
但是12/14的開盤卻是開在10508。前收K棒, 不保證就是今開K棒的開盤價; 但是我們面對不想花錢就想取得券商的資訊源, 面對連續跳動,
而券商又無心幫客戶解決這些問題的情形之下,這就無解了。(即使可以付費, 我想價格也不是一般人所能負擔的)

而許多人認為DDE的開盤價, 就是當根的開盤價, 其實是錯的; 因為這個開盤價是當天的開盤價! 而不是當根K棒的開盤價!
如果券商的DDE有這麼友善, 就已經把K棒的時間畫分好,券商就已幫我們把這個EXCEL 處理好了!  其他的高、低、收、量, 我想信直接抓取DDE應更精準。
如果有那一家券商有提供這樣的DDE或RTD,  請分享,我一定會立馬去開戶。
作者: jackyq    時間: 2017-12-14 23:49

回復 78# winwin

不需要用1k 去轉成 5k

統一用 tick 轉 1l, 5k ,15k

大大你會卡輕鬆滴
作者: winwin    時間: 2017-12-16 00:32

回復 79# jackyq


    我也想啊! 可是一直不順.................................
作者: Scott090    時間: 2017-12-16 09:52

回復 80# winwin


參考 下列主題
    http://forum.twbts.com/thread-19707-1-1.html
作者: winwin    時間: 2017-12-19 18:23

回復 81# Scott090


    謝謝!




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