Board logo

標題: [發問] API逐筆運算負擔大,可否精簡 [打印本頁]

作者: dreamsway    時間: 2018-10-13 02:39     標題: API逐筆運算負擔大,可否精簡

各位大大,小弟最近初學VBA,試著土法煉鋼把想要的方式改用VBA操作,巨集雖可以使用,但程式的負荷很重,是否有辦法精簡呢
採用的是API期貨報價,進行逐筆運算(範例的筆數很少,實際情況將隨時間變成幾萬筆資料),並將B欄的成交時間複製到Sht1.Range("C1")
[attach]29524[/attach]
接著依照Sht1.Range("C1")的時間,將運算的結果(Sht2.Cells(4, "J")與Sht2.Cells(5, "J"))   貼在Sht3的B.C欄

[attach]29525[/attach]
  1. Sub 多空紀錄()
  2. Call 共用參照 '測試用

  3. If Sht1.Range("C1") >= TimeValue("08:45:00") And Sht1.Range("C1") < TimeValue("08:50:00") Then
  4. Sht3.Cells(2, "B") = Sht2.Cells(4, "J")
  5. Sht3.Cells(2, "C") = Sht2.Cells(5, "J")
  6. End If

  7. If Sht1.Range("C1") >= TimeValue("08:50:00") And Sht1.Range("C1") < TimeValue("08:55:00") Then
  8. Sht3.Cells(3, "B") = Sht2.Cells(4, "J")
  9. Sht3.Cells(3, "C") = Sht2.Cells(5, "J")
  10. End If
  11. If Sht1.Range("C1") >= TimeValue("08:55:00") And Sht1.Range("C1") < TimeValue("09:00:00") Then
  12. Sht3.Cells(4, "B") = Sht2.Cells(4, "J")
  13. Sht3.Cells(4, "C") = Sht2.Cells(5, "J")
  14. End If
  15. If Sht1.Range("C1") >= TimeValue("09:00:00") And Sht1.Range("C1") < TimeValue("09:05:00") Then
  16. Sht3.Cells(5, "B") = Sht2.Cells(4, "J")
  17. Sht3.Cells(5, "C") = Sht2.Cells(5, "J")
複製代碼
如以上程式每5分鐘一個區間,一直記錄到13:45為止,
由於現在是每一筆成交就進行一次運算,1秒內可能成交很多筆交易,
有想過是否可以改為1秒進行一次紀錄就好,
再麻煩各位高手幫忙,謝謝!
作者: GBKEE    時間: 2018-10-13 08:55

本帖最後由 GBKEE 於 2018-10-13 09:01 編輯

回復 1# dreamsway
參考看看
  1. Option Explicit
  2. Public uMode&, StartTime, EndTime
  3. Public MyBook As Workbook, Sht1 As Worksheet, Sht2 As Worksheet, Sht3 As Worksheet, xRow&
  4. Sub 共用參照()
  5.     Set MyBook = ThisWorkbook
  6.     Set Sht1 = MyBook.Sheets("多空藍圖")
  7.     Set Sht2 = MyBook.Sheets("報價數據")
  8.     Set Sht3 = MyBook.Sheets("多空數據")
  9.     StartTime = "08:44:50"  '開盤時間(提早十秒開始,才可記錄開盤量價)
  10. End Sub
  11. Sub 報價運算()
  12.     Dim xTime As Date
  13.     Call 共用參照 '測試用
  14.     If Sht2.Range("H2") <> 1 Then '開盤條件
  15.         Sht2.Range("J2,J4,J5").ClearContents '清除紀錄資料
  16.         Sht2.Range("K2") = Sht2.Range("I2") '判斷價改為開盤價
  17.     End If
  18.     i = 1
  19.     xTime = Time
  20.     Do
  21.                 If Time > xTime Then  'Time 以秒計算的 ** Time > xTime = >下一秒 **
  22.             i = i + 1: xTime = Time
  23.             If Sht2.Cells(2, "J") = "↑" And Sht2.Cells(i, "H") <> 1 Then '多方加總
  24.                 Sht2.Range("J4") = Sht2.Range("J4") + Sht2.Range("D" & i)
  25.             End If
  26.             If Sht2.Cells(2, "J") = "↓" And Sht2.Cells(i, "H") <> 1 Then '空方加總
  27.                 Sht2.Range("J5") = Sht2.Range("J5") + Sht2.Range("D" & i)
  28.             End If
  29.             If Sht2.Cells(i, "H") <> 1 Then '報價時間傳送到多空藍圖
  30.                 Sht1.Cells(1, "C") = Sht2.Range("B" & i)
  31.             End If
  32.             Call 多空紀錄
  33.             Sht2.Cells(i, "H") = 1 '運算過的進行標記避免重複運算
  34.         End If
  35.     Loop Until Sht2.Range("C" & i + 1) = 0 '迴圈停止條件
  36. End Sub
  37. Sub 多空紀錄()
  38.      Dim xMinute As Integer
  39.         Call 共用參照 '測試用
  40.         xMinute = Int(Application.Text(Time - #8:45:00 AM#, "[M]") / 5)
  41.         '*** xMinute 以 Time 距 8:45 的分鐘數 / 5 傳回的整數
  42.         '*** Time 小於 8:45 得到負數
  43.         If xMinute > -1 And Time <= #1:45:00 PM# Then
  44.             xMinute = xMinute + 2   '*** 從第2列開始
  45.             Sht3.Cells(xMinute, "B") = Sht2.Cells(4, "J")
  46.             Sht3.Cells(xMinute, "C") = Sht2.Cells(5, "J")
  47.         End If
  48. End Sub
  49. Sub 清除標記()
  50.     Call 共用參照 '測試用
  51.     Sht2.Columns("H").Clear
  52.     Sht2.Cells(1, "H").Value = "標記"
  53. End Sub
  54. Sub 清除報價()
  55.     Dim qyt As QueryTable '刪除外部連線
  56.     Call 共用參照 '測試用
  57.     With Sht2
  58.         .Columns("A:G").Clear '刪除後將標題名稱填入
  59.         .Columns("A:G").Rows(1) = Array("代號", "時間", "成交價", "單量", "總量", "最高價", "最高價", "最低價")
  60.         For Each qyt In .QueryTables
  61.             qyt.Delete
  62.         Next
  63.     End With
  64. End Sub
複製代碼

作者: dreamsway    時間: 2018-10-13 11:45

回復 2# GBKEE
謝謝超版G大的協助
試運行了程式,發現會連報價運算的部分都變成1秒計算一次,
而多空紀錄似乎是以電腦時間來做紀錄,

因為小弟初學VBA,不確定是否有可能實現,
讓Sub 報價運算()的部分以正常速度運行,但Sub 多空紀錄()以程式的時間進行1秒1次(或是加條件新時間>舊時間)再判斷時間條件後記錄呢
作者: GBKEE    時間: 2018-10-13 12:47

回復 3# dreamsway
請自行試改看看
Sub 多空紀錄() 中 Time 改成 Sht1.Range("C1")
  1. Sub 報價運算()
  2.     Dim xTime As Date
  3.     Call 共用參照 '測試用
  4.     If Sht2.Range("H2") <> 1 Then '開盤條件
  5.         Sht2.Range("J2,J4,J5").ClearContents '清除紀錄資料
  6.         Sht2.Range("K2") = Sht2.Range("I2") '判斷價改為開盤價
  7.     End If
  8.     i = 1
  9.     xTime = Time
  10.     Do
  11.         i = i + 1
  12.         If Sht2.Cells(2, "J") = "↑" And Sht2.Cells(i, "H") <> 1 Then '多方加總
  13.             Sht2.Range("J4") = Sht2.Range("J4") + Sht2.Range("D" & i)
  14.         End If
  15.         If Sht2.Cells(2, "J") = "↓" And Sht2.Cells(i, "H") <> 1 Then '空方加總
  16.             Sht2.Range("J5") = Sht2.Range("J5") + Sht2.Range("D" & i)
  17.         End If
  18.         If Sht2.Cells(i, "H") <> 1 Then '報價時間傳送到多空藍圖
  19.             Sht1.Cells(1, "C") = Sht2.Range("B" & i)
  20.         End If
  21.         If Time > xTime Then  '** 一秒運行一次    **
  22.             xTime = Time
  23.             Call 多空紀錄
  24.         End If
  25.         Sht2.Cells(i, "H") = 1 '運算過的進行標記避免重複運算
  26.     Loop Until Sht2.Range("C" & i + 1) = 0 '迴圈停止條件
  27. End Sub
複製代碼

作者: dreamsway    時間: 2018-10-13 19:12

回復 4# GBKEE
謝謝G大 原本遇到一些問題,
研究了一下,紀錄的部分都解決了!
謝謝!
作者: dreamsway    時間: 2018-10-14 17:22

回復 4# GBKEE
不好意思,再另做一個紀錄15分K開高低收的巨集上遇到了困難(由於這跟原標題不完全符合,若需另主題再麻煩告知)
希望在原本逐筆計算的過程中,將每15分鐘的開高低收價格紀錄起來,運用o,h,l,c 四個變數
請問要如何在每15分鐘紀錄那邊,要換行紀錄時才將o,h,l變數歸0並重新計算呢
  1. Option Explicit
  2. Public uMode&, StartTime, EndTime
  3. Public MyBook As Workbook, Sht1 As Worksheet, Sht2 As Worksheet, Sht3 As Worksheet, xRow&
  4. Public o As Single, h As Single, l As Single c As Single

  5. Sub 共用參照()
  6.     Set MyBook = ThisWorkbook
  7.     Set Sht1 = MyBook.Sheets("多空藍圖")
  8.     Set Sht2 = MyBook.Sheets("報價數據")
  9.     Set Sht3 = MyBook.Sheets("多空數據")
  10.     StartTime = "08:44:50"  '開盤時間(提早十秒開始,才可記錄開盤量價)
  11. End Sub
  12. Sub 報價運算()
  13.     Dim xTime As Date
  14.     Dim i As Long
  15.    
  16.     Call 共用參照 '測試用
  17.     If Sht2.Range("H2") <> 1 Then '開盤條件
  18.         Sht2.Range("J2,J4,J5").ClearContents '清除紀錄資料
  19.         Sht2.Range("K2") = Sht2.Range("I2") '判斷價改為開盤價
  20.     End If
  21.     i = 1
  22.    
  23.     Do
  24.         i = i + 1
  25.         
  26.         If Sht2.Cells(2, "J") = "↑" And Sht2.Cells(i, "H") <> 1 Then '多方加總
  27.             Sht2.Range("J4") = Sht2.Range("J4") + Sht2.Range("D" & i)
  28.         End If
  29.         If Sht2.Cells(2, "J") = "↓" And Sht2.Cells(i, "H") <> 1 Then '空方加總
  30.             Sht2.Range("J5") = Sht2.Range("J5") + Sht2.Range("D" & i)
  31.         End If
  32.         If Sht2.Cells(i, "H") <> 1 Then
  33.             Sht1.Cells(1, "C") = Sht2.Range("B" & i) '報價時間傳送到多空藍圖
  34.         End If

  35. '***以下新增15分K紀錄
  36. c = Sht2.Range("C" & i)
  37.    If c > h Then h = c '更新最高價
  38.    If c < l Then l = c '更新最低價
  39.    If o = 0 Then o = Sht2.Range("C" & i) Else o = o
  40.    If l = 0 Then l = Sht2.Range("C" & i) Else l = l
  41.    If h = 0 Then h = Sht2.Range("C" & i) Else h = h
  42. Sht2.Range("O2").Value = o '填開盤價
  43. Sht2.Range("P2").Value = h '填最高價
  44. Sht2.Range("Q2").Value = l '填最低價
  45. Sht2.Range("R2").Value = c '填收盤價
  46.         
  47.         If Sht1.Range("C1") > xTime Then  '** 一秒運行一次    **
  48.             
  49.             Call 多空紀錄
  50.             Call 分K開高低收
  51.         End If
  52.         

  53.         Sht2.Cells(i, "H") = 1 '運算過的進行標記避免重複運算
  54.     Loop Until Sht2.Range("C" & i + 1) = 0 '迴圈停止條件
  55. End Sub

  56. Sub 分K開高低收()
  57. Call 共用參照 '測試用

  58.   Dim xMinute As Integer
  59.    
  60.         
  61.         xMinute = Int(Application.Text(Sht1.Range("C1") - #8:45:00 AM#, "[M]") / 15)
  62.         '*** xMinute 以 Time 距 8:45 的分鐘數 / 15 傳回的整數
  63.         '*** Time 小於 8:45 得到負數
  64.         If xMinute > -1 And Sht1.Range("C1") <= #1:45:00 PM# Then
  65.             xMinute = xMinute + 3   '*** 從第2列開始
  66.             Sht2.Cells(xMinute, "O") = Sht2.Cells(2, "O")
  67.             Sht2.Cells(xMinute, "P") = Sht2.Cells(2, "P")
  68.             Sht2.Cells(xMinute, "Q") = Sht2.Cells(2, "Q")
  69.             Sht2.Cells(xMinute, "R") = Sht2.Cells(2, "R")
  70.         End If
  71.       
  72. End Sub
複製代碼

作者: GBKEE    時間: 2018-10-15 15:34

回復 6# dreamsway

明天開盤 可測看看

    [attach]29535[/attach]
作者: dreamsway    時間: 2018-10-15 20:35

回復 7# GBKEE
謝謝超版G大,明天盤中測試看看,
雖然說這次的程式對我實在太深奧了,
還有好長的一條路,我會努力學習的!
作者: dreamsway    時間: 2018-10-16 10:36

回復 7# GBKEE
早安G大,因為這次的程式,小弟慢慢查MSDN一些程式的含意仍然不甚了解,我大概描述一下使用上的問題,再請您多多指導,
一開始照著說明存檔後重開(您提供的原檔),沒有任何反應,也覺得很奇怪這樣沒報價的數據怎麼運算呢,
接著觀察到以下代碼,
  1. Set Rng = Sheets("多空藍圖").Range("A2") '** 指數 代號
複製代碼
並將Sheets("多空藍圖").Range("A2")填上代碼後存檔重開,即新創了一個試算表,試算表名稱為指數的代號,
其試算表也跑出
  1. Names.Add "Ar", Array("1分", "5分", "10分", "15分", "20分", "30分", "60分")
複製代碼
等各項欄位名稱,但因為沒有報價數據,所以並沒有在運算,
接下來我把程式貼到我原本的檔案,並將
  1. Set Rng = Sheets("多空藍圖").Range("A2") '** 指數 代號
複製代碼
改成我原本的報價區域
  1. Set Rng = Sheets("報價數據").Range("A2") '** 指數 代號
複製代碼
重啟後EXCEL呈現負載沒回應的狀態,嘗試等了5分鐘以上,其新的試算表(1-60分K紀錄)仍然為空白,接著就EXCEL無回應崩潰了,
之後在檔案重啟後關閉巨集運行,進行數次偵錯
都顯示在以下程式碼
  1. .Offset(1).Resize(, 3) = Array("時間", "多方加總", "空方加總")
複製代碼
不知是小弟哪邊操作上有誤嗎!?
作者: GBKEE    時間: 2018-10-16 10:50

本帖最後由 GBKEE 於 2018-10-16 10:53 編輯

回復 9# dreamsway

由於現在是每一筆成交就進行一次運算,1秒內可能成交很多筆交易

這資料是哪裡來的



多空藍圖 上是需填上Dee公式的如你沒有
請附上你的原始檔案看看
作者: dreamsway    時間: 2018-10-16 15:48

回復 10# GBKEE
G大午安
報價數據是透過期貨商API的將報價傳輸到電腦成為txt檔(這樣較能避免傳統DDE/RTD漏tick的情況發生),再透過EXCEL去取得txt資料(附件裡面20180724_Match 這個txt檔),我有設了巨集但路徑應該需要更改
由於是隨時間增加報價內容,而EXCEL似乎不會自動更新(我看內建最短要1分鐘),所以將會設一個短時間延遲的報價連線的重新整理(視程式負擔)
附件為原始檔,原本有RTD的部分,需要外掛一堆期貨商的程式,所以先把那些欄位資料清掉了,因為那些資料只是呈現而已,巨集不會運用到,
再麻煩G大了,謝謝!
作者: GBKEE    時間: 2018-10-16 16:32

本帖最後由 GBKEE 於 2018-10-16 18:13 編輯

回復 11# dreamsway

"透過期貨商API的將報價傳輸到電腦成為txt檔"
是股市營業時間一直在接收 然後"成為txt檔" ?

"原本有RTD的部分,需要外掛一堆期貨商的程式"
給你的檔案就是輸入這些的公式,於股市營業時間接收資料
我是用台新證券的智多星看盤 接收資料

[attach]29539[/attach]

這裡要修改
ThisWorkbook.Sheets("多空藍圖").Range("A2") '** 指數 代號
  1. Sub AUTO_OPEN()
  2. Dim i As Integer, A, Rng As Range, xName As String, n As Name
  3. '*** 設定分鐘的間隔***
  4. Names.Add "Ar", Array("1分", "5分", "10分", "15分", "20分", "30分", "60分")
  5. Set Rng = ThisWorkbook.Sheets("多空藍圖").Range("A2") '** 指數 代號
  6. On Error GoTo Sh_Add '處理程式錯誤時的措施
複製代碼
這裡要修改
Dim 成交價 As Double, 多空 As Long, 多放 As Long
With ThisWorkbook.Sheets(Rng(1).Value) '**工作表(指數代號)
  1. Private Sub Worksheet_Calculate()
  2. Dim Rng(1 To 2) As Range, i As Integer, xName As String, xTime(1 To 2) As Date, T(1 To 2) As Integer
  3. Dim 成交價 As Double, 多空 As Long, 多放 As Long
  4. If IsError([sum(a:e)]) Then Exit Sub '**開盤前的清盤DEE有時會傳回空值 #NA
  5. Set Rng(1) = [a2] '**第一個指數代號
  6. xTime(1) = #8:45:00 AM# '**開盤時間
  7. Do While Rng(1) <> "" '**執行迴圈的條件是 指數代號<>""
  8. With ThisWorkbook.Sheets(Rng(1).Value) '**工作表(指數代號)
複製代碼

作者: dreamsway    時間: 2018-10-16 21:37

回復 12# GBKEE

是股市營業時間一直在接收 然後"成為txt檔" ?

是的,我用元大的SMART API  ,開盤前先設定好商品名,就會在指定點建立一個無資料的txt,當開盤後開始有資料就會一直覆蓋,
我用過元大、永豐、XQ的DDE/RTD
但期貨交易太快,漏tick嚴重,快市交易之前測過,整天成交量漏了3成以上
所以才選用txt這種比較麻煩的方法,但是數據幾乎不會漏
作者: GBKEE    時間: 2018-10-17 09:24

回復 13# dreamsway

但期貨交易太快,漏tick嚴重,快市交易之前測過,整天成交量漏了3成以上
所以才選用txt這種比較麻煩的方法,但是數據幾乎不會漏

    檔案上另加一模組複製這程式 試試看
  1. Option Explicit
  2. Const 間隔 = #12:15:00 AM#   '這裡修改分鐘間隔
  3. Const 開盤 = #8:45:00 AM#
  4. Sub k_15()
  5.     Dim i As Long, Ti As Integer, 成交價 As Double, 多空 As Long, 多放 As Long
  6.     Dim xTime As Date
  7.     xTime = 開盤 + 間隔
  8.     i = 0: Ti = 0
  9.     Do
  10.         With Sheets("報價數據").Range("b2").Offset(i)
  11.             If 成交價 < .Cells(1, 2) Then 多放 = 多放 + .Cells(1, 3) Else 多空 = 多空 + .Cells(1, 3)
  12.             成交價 = .Cells(1, 2)
  13.             If .Value > xTime + 間隔 Then
  14.                 With Sheets("多空數據").Range("A2").Offset(Ti)
  15.                     .Resize(, 3) = Array(xTime, 多放, 多空)
  16.                     .NumberFormatLocal = "hh:mm;@"
  17.                 End With
  18.                  xTime = xTime + 間隔: Ti = Ti + 1
  19.              Else
  20.                 If .Cells.Offset(1) = "" And Format(TimeValue(.Cells.Text), "HH:MM") = "13:45" Then
  21.                     xTime = xTime + 間隔
  22.                     With Sheets("多空數據").Range("A2").Offset(Ti)
  23.                         .Resize(, 3) = Array(xTime, 多放, 多空)
  24.                         .NumberFormatLocal = "hh:mm;@"
  25.                     End With
  26.                     Exit Do
  27.                 ElseIf .Cells.Offset(1) = "" Then '****程式運行速度很快會跑完報價數據 **
  28.                      Do
  29.                         DoEvents
  30.                            '***程式等候... 報價文字檔的資料傳入**
  31.                      Loop Until Time >= xTime + #12:00:30 AM#
  32.                      匯入API報價文字檔
  33.                 End If
  34.             End If
  35.         End With
  36.         DoEvents
  37.         i = i + 1
  38.     Loop
  39.     MsgBox "工作完成"
  40. End Sub
複製代碼

作者: dreamsway    時間: 2018-10-18 09:58

回復 14# GBKEE
G大早安,經過兩天的測試,發現可以運行,但都會在當下時間的前一筆紀錄的區域發生錯誤,例如現在時間9:36 就會只記錄到09:30後需要偵錯
  1. If .Cells.Offset(1) = "" And Format(TimeValue(.Cells.Text), "HH:MM") = "13:45" Then
複製代碼
標記這行代碼,但我也看不出是哪邊有問題,不過若以盤後執行的話速度確實飛快呀!!(盤後可以完整運行無偵錯)
以下是我調整過的
  1. Option Explicit
  2. Const 間隔 = #12:05:00 AM#   '這裡修改分鐘間隔
  3. Const 開盤 = #8:45:00 AM#
  4. Sub k_15()
  5.     Dim i As Long, Ti As Integer, 成交價 As Double, 多空 As Long, 多放 As Long
  6.     Dim xTime As Date
  7.     xTime = 開盤 + 間隔
  8.     i = 0: Ti = 0
  9.     Do
  10.         With Sheets("報價數據").Range("b2").Offset(i)
  11.             If 成交價 < .Cells(1, 2) Then 多放 = 多放 + .Cells(1, 3) Else 多空 = 多空 + .Cells(1, 3)
  12.             成交價 = .Cells(1, 2)
  13.             If .Value > xTime + 間隔 Then
  14.                 With Sheets("多空數據").Range("A2").Offset(Ti)
  15.                     .Resize(, 3) = Array(xTime, 多放, 多空)
  16.                     .NumberFormatLocal = "hh:mm;@"
  17.                 End With
  18.                  xTime = xTime + 間隔: Ti = Ti + 1
  19.              Else
  20.                 If .Cells.Offset(1) = "" And Format(TimeValue(.Cells.Text), "HH:MM") = "13:45" Then
  21.                     xTime = xTime + 間隔
  22.                     With Sheets("多空數據").Range("A2").Offset(Ti)
  23.                         .Resize(, 3) = Array(xTime, 多放, 多空)
  24.                         .NumberFormatLocal = "hh:mm;@"
  25.                     End With
  26.                     Exit Do
  27.                 ElseIf .Cells.Offset(1) = "" Then '****程式運行速度很快會跑完報價數據 **
  28.                      Do
  29.                         DoEvents
  30.                            '***程式等候... 報價文字檔的資料傳入**
  31.                      Loop Until Time >= xTime + #12:00:20 AM#
  32.                      重新整理
  33.                 End If
  34.             End If
  35.         End With
  36.         DoEvents
  37.         i = i + 1
  38.     Loop
  39.     MsgBox "工作完成"
  40. End Sub
複製代碼
  1. Sub 重新整理()
  2.     ActiveWorkbook.RefreshAll
  3. End Sub
複製代碼
報價數據的更新採用重新整理,其價格就會更新了,
另外,我看G大把巨集名稱設為K15,然後看執行的結果似乎是以15分鐘去紀錄多方加總與空方加總,
小弟愚笨,想詢問該如何調整為6樓的那項開高低收價格呢,謝謝!
作者: GBKEE    時間: 2018-10-18 17:23

本帖最後由 GBKEE 於 2018-10-18 17:25 編輯

回復 15# dreamsway
再試試看
  1. Option Explicit
  2. Const K = #12:15:00 AM#   '這裡修改
  3. Const 開盤 = #8:45:00 AM#
  4. Sub k_15()
  5.     Dim i As Long, Ti(1 To 3) As Integer, 成交價 As Double
  6.     Dim xTime As Date, AR(1 To 6)
  7.     AR(1) = "時間": AR(2) = "開盤": AR(3) = "最高": AR(4) = "最低": AR(5) = "收盤": AR(6) = "成交量"
  8.     With Sheets("多空數據")
  9.         .UsedRange.Clear                                                      '清盤
  10.         .[A1].Resize(, UBound(AR)) = AR                                       '給標頭
  11.     End With
  12.     xTime = 開盤 + IIf(K = #12:01:00 AM#, 0, K)                         '開盤+ K 的分鐘數
  13.     Ti(2) = Application.Text(xTime, "[m]")
  14.     Ti(3) = 0       'K數次
  15.     i = 0
  16.     AR(1) = xTime: AR(2) = 0: AR(3) = 0: AR(4) = 0: AR(5) = 0: AR(6) = 0
  17.     Do
  18.         With Sheets("報價數據").Range("b2").Offset(i)
  19.             成交價 = .Range("B1")
  20.             Ti(1) = Application.Text(.Cells.Offset(1), "[m]")                   '下一個報價時間的分鐘數
  21.             AR(2) = IIf(AR(2) = 0, 成交價, AR(2))                               '開盤
  22.             AR(3) = IIf(成交價 >= AR(3), 成交價, AR(3))                         '最高
  23.             AR(4) = IIf(AR(4) = 0, 成交價, IIf(成交價 <= AR(4), 成交價, AR(4))) '最低
  24.             AR(6) = AR(6) + .Range("C1")                                        '成交量
  25.             If Ti(1) > Ti(2) Then
  26.                 AR(5) = 成交價                                                  '收盤"
  27.                 With Sheets("多空數據").Range("A2").Offset(Ti(3))
  28.                     .Resize(, UBound(AR)) = AR
  29.                     .NumberFormatLocal = "hh:mm;@"
  30.                 End With
  31.                 xTime = xTime + K                     '下一個K時間點
  32.                 Ti(2) = Application.Text(xTime, "[m]")   '重新計算K時間點的分鐘數
  33.                 Ti(3) = Ti(3) + 1                        'K數次+1
  34.                 AR(1) = xTime: AR(2) = 0: AR(3) = 0: AR(4) = 0: AR(5) = 0: AR(6) = 0 ''陣列重新給值
  35.              Else
  36.                 If .Cells.Offset(1) = "" And CDate(.Cells.Value) = CDate(#1:45:00 PM#) Then
  37.                     AR(5) = .Cells.Offset(0, 1)                             '收盤"
  38.                     With Sheets("多空數據").Range("A2").Offset(Ti(3))
  39.                         .Resize(, UBound(AR)) = AR
  40.                         .NumberFormatLocal = "hh:mm;@"
  41.                     End With
  42.                     Exit Do
  43.                 ElseIf .Cells.Offset(1) = "" Then
  44.                     匯入API報價文字檔
  45.                 End If
  46.             End If
  47.         End With
  48.         DoEvents
  49.         i = i + 1
  50.     Loop
  51. End Sub
複製代碼

作者: dreamsway    時間: 2018-10-20 16:42

回復 16# GBKEE

謝謝G大,昨天不知是不是沒有開盤前執行,有一些小問題需要研究一番,等週一再來完整的測測看
作者: dreamsway    時間: 2018-10-21 15:43

回復 16# GBKEE
G大您好! 原本之前以為是沒在開盤前執行,所以數據抓得不準確,
後來自己手動把原始的報價數據做過調整方便對照,
發現原本應該只到09:00:00的數據會記錄到09:00:59;09:15:00的數據則會記錄到09:15:59 (會往後推59秒.以此類推)
設想應該可以從程式判定分鐘的部分做調整,又或者把開盤時間設定往前移,(開盤設08:44:59,則會只紀錄到08:59:59)
但我試著更改了幾個部分皆無效,想詢問是否有改善方法呢,謝謝!
作者: GBKEE    時間: 2018-10-22 07:43

回復 18# dreamsway
試試看
  1. Option Explicit
  2. Const K = #12:15:00 AM#
  3. Const 開盤 = #8:45:00 AM#
  4. Sub k_15()
  5.     Dim i As Long, Ti(1 To 3) As Long, 成交價 As Double
  6.     Dim xTime As Date, AR(1 To 6)
  7.     AR(1) = "時間": AR(2) = "開盤": AR(3) = "最高": AR(4) = "最低": AR(5) = "收盤": AR(6) = "成交量"
  8.     With Sheets("多空數據")
  9.         .UsedRange.Clear                                                      '清盤
  10.         .[A1].Resize(, UBound(AR)) = AR                                       '給標頭
  11.     End With
  12.     xTime = 開盤 + IIf(K = #12:01:00 AM#, 0, K)                               '第一個K時間點
  13.     Ti(1) = Application.Text(xTime, "[S]")                                    'K時間點的秒數
  14.     Ti(3) = 0                                                                 'K數次
  15.     i = 0                                                                     '指定報價的列號                                               '
  16.     AR(1) = Format(xTime, "hh:mm"): AR(2) = 0: AR(3) = 0: AR(4) = 0: AR(5) = 0: AR(6) = 0 '陣列重新給值
  17.     Do
  18.         With Sheets("報價數據").Range("b2").Offset(i)
  19.             成交價 = .Range("B1")
  20.             Ti(2) = Application.Text(.Cells.Offset(1), "[S]")                   '.Cells.Offset(1) -> 下一個報價時間秒數
  21.             AR(2) = IIf(AR(2) = 0, 成交價, AR(2))                               '開盤
  22.             AR(3) = IIf(成交價 >= AR(3), 成交價, AR(3))                         '最高
  23.             AR(4) = IIf(AR(4) = 0, 成交價, IIf(成交價 <= AR(4), 成交價, AR(4))) '最低
  24.             AR(5) = 成交價                                                      '收盤
  25.             AR(6) = AR(6) + .Range("C1")                                        '成交量
  26.             If Ti(2) > Ti(1) Then                                               '下一個報價時間秒數 >     K點時間的秒數
  27.                 Sheets("多空數據").Range("A2").Offset(Ti(3)).Resize(, UBound(AR)) = AR  'k時間點導入陣列
  28.                 xTime = xTime + K                                               '下一個K時間點
  29.                 Ti(1) = Application.Text(xTime, "[S]")                          '下一個 K 點時間的秒數
  30.                 Ti(3) = Ti(3) + 1                                               'K數次+1
  31.                 AR(1) = Format(xTime, "hh:mm"): AR(2) = 0: AR(3) = 0: AR(4) = 0: AR(5) = 0: AR(6) = 0 '陣列重新給值
  32.              Else
  33.                 If .Cells.Offset(1) = "" And CDate(.Cells.Value) = CDate(#1:45:00 PM#) Then
  34.                     '下一個報價時間="" 且 報價時間=收盤時間
  35.                     Sheets("多空數據").Range("A2").Offset(Ti(3)).Resize(, UBound(AR)) = AR 'k時間點導入陣列
  36.                     Exit Do                                                      '離開迴圈
  37.                 ElseIf .Cells.Offset(1) = "" Then            '這條件不成立 (下一個報價時間="" 且 報價時間=收盤時間  )
  38.                     匯入API報價文字檔
  39.                 End If
  40.             End If
  41.         End With
  42.         DoEvents     '暫停執行,以便讓作業系統可以處理其它的事件
  43.         i = i + 1    '報價的列號 +1
  44.     Loop
  45. End Sub
複製代碼

作者: dreamsway    時間: 2018-10-25 12:07

回復 19# GBKEE
謝謝超版G大,之前在盤後使用完全正常,一到盤中實測就冒出問題
測試了好幾天,終於調整好了,謝謝!
作者: dreamsway    時間: 2018-10-29 18:43

回復 19# GBKEE
不好意思 G大 又有問題想請教您了!
前幾天試著用檔案內的"sub執行",採用"sub報價運算"搭配其他程序,在盤後運算非常快速沒問題,
盤中運算在開盤時數據較少,初期都可以正常運作,但後期就會變得一直運算,沒有顯示任何運算結果,直到excel崩潰或手動停止;
因為在盤後運行(數據不會更新)的情況下都可以非常順利運作,所以我試著改變報價及運算迴圈方式("sub執行"的方式),讓每一個sub都跑完再進行重新整理來更新報價數據,卻也一樣一直運算而沒有結果(運作中沒有任何結果,但手動按下停止後運算結果就全部顯現...),
設想是因為迴圈綁架了CPU之類的,觀察了CPU/記憶體使用率卻也不到50%,

為了試著將程式負擔再降低,想起之前您在本串14樓的時候有幫我寫過一個針對多空加總運算的sub (放在模組3的K心態),當時沒有完整的多空判斷,現在想加入判斷式來歸類在多空上(請參考"sub報價運算"),
可能思考上一直碰壁,對Offset的方式一直無法整個理解,試著改來改去都失敗,
所以想詢問
1.此段程序該如何加上新增的判斷式呢
2.就您的經驗與在盤中執行遇到的問題,改成執行完後再進行報價更新,是否有幫助呢

因檔案超過附件容量限制,所以上傳至雲端Google雲端

謝謝!
作者: GBKEE    時間: 2018-10-30 06:57

回復 21# dreamsway
修改看看
  1. ElseIf .Cells.Offset(1) = "" Then '****程式運行速度很快會跑完報價數據 **
  2.                     wTime = Time   '**請在程式碼開端 Dim wTime As Date
  3.                     Do
  4.                         If wTime > Time - #12:00:30 AM# Then '30秒 重新整理 一次
  5.                             Application.StatusBar = "重新整理...."
  6.                             重新整理
  7.                             wTime = Time
  8.                         End If
  9.                         DoEvents
  10.                     Loop While .Cells.Offset(1) = ""  '**當 .Cells.Offset(1) = ""  一直執行下去
  11.                     Application.StatusBar = False
  12.                 End If
複製代碼

作者: dreamsway    時間: 2018-10-30 14:47

回復 22# GBKEE
G大午安,因為我還在試著學習更改新的多空判斷條件套用在這種相對路徑的寫法,所以這個時間延遲的部分可能需要明後天才能測試,
我想在原本的條件
  1.   Do
  2.         With Sheets("報價數據").Range("b2").Offset(i)
  3.             If 成交價 < .Cells(1, 2) Then 多放 = 多放 + .Cells(1, 3) Else 多空 = 多空 + .Cells(1, 3)
  4.             成交價 = .Cells(1, 2)
複製代碼
更改為
  1. Do
  2.         With Sheets("報價數據").Range("b1").Offset(i)
  3.         If 成交價 < .Cells(1, 2) Then 方向 = "↑"
  4.         If 成交價 > .Cells(1, 2) Then 方向 = "↓"
  5.         If 成交價 <= .Cells(1, 2) And 方向 = "↑" Then 多總 = 多總 + .Cells(2, 3)
  6.         If 成交價 >= .Cells(1, 2) And 方向 = "↓" Then 空總 = 空總 + .Cells(2, 3)
  7.         成交價 = .Cells(1, 2)
複製代碼
想詢問為什麼這一行一直顯示錯誤
  1. 成交價 = .Cells(1, 2)
複製代碼
[/code]
查了一下微軟說明顯示:嘗試指派值給 With...End With 陳述式中使用的結構成員,將會收到錯誤,但G大您提供的的代碼卻又正常:'( :'(
作者: dreamsway    時間: 2018-10-30 19:00

回復 22# GBKEE

雲端檔案
再麻煩G大解惑了,謝謝!
作者: GBKEE    時間: 2018-10-30 19:42

回復 24# dreamsway
Range.Offset 屬性  會傳回 Range 物件,代表從指定之範圍位移的範圍。
可再詳看說明
  1. i = 0     '**b1 是標頭為文字   i=0  -->  .Offset(i) 還是b1,  成交價 As Double  ,所以有形態的錯誤
  2. Do
  3.         With Sheets("報價數據").Range("b1").Offset(i)
  4.            
  5.    
複製代碼
可修改

  1.     i = 1
  2.    Do
  3.    With Sheets("報價數據").Range("b1").Offset(i)
  4. 或是
  5.     i = 0
  6.    Do
  7.    With Sheets("報價數據").Range("b2").Offset(i)
複製代碼

作者: dreamsway    時間: 2018-10-31 20:42

回復 22# GBKEE

G大您好!25樓的部分修改後已測試可以正確運算了,但21樓的問題仍在,
想詢問代碼的意思是每過30秒會執行迴圈嗎!? 因為單執行K心態sub,只會執行一次將現有的報價跑完,跳出MsgBox工作完成後就沒有任何動作,期間的重新整理也沒反應(執行前的報價跟執行結束的報價沒變,讓巨集運行整個停止也是沒變)
我試著用以下代碼的執行sub,讓他重新整理來獲取報價再執行K心態sub,則會讓K心態跑一次後一直呈現運轉狀態,但這期間報價不會更新、DDE數據也同步停止;直到我手動讓巨集停止運行後才會把這段期間的報價一次顯現出來
  1. Sub 執行()
  2. Call 共用參照
  3. Sht1.Range("J1") = "運行中.."
  4. uMode = 1

  5. Do
  6. Call 重新整理
  7. Call K心態

  8. Loop Until uMode = 0

  9. If uMode = 0 Then
  10. Sht1.Range("J1") = ">停止<"
  11. End If
  12. End Sub
複製代碼
附檔
作者: GBKEE    時間: 2018-11-1 15:51

回復 26# dreamsway

想詢問代碼的意思是每過30秒會執行迴圈嗎!? 因為單執行K心態sub,只會執行一次將現有的報價跑完,跳出後就沒有任何動作

是數據已跑到收盤時間了嗎?

請看一下註解的說明
  1. Option Explicit
  2. Const 間隔 = #12:05:00 AM#   '這裡修改分鐘間隔
  3. Const 開盤 = #8:45:00 AM#
  4. Sub K心態()
  5.     Dim i As Long, Ti As Integer, 成交價 As Double, 多總 As Long, 空總 As Long, 方向 As String
  6.     Dim xTime As Date, wTime As Date
  7.     xTime = 開盤 + 間隔
  8.     i = 1: Ti = 0: 多總 = 0: 空總 = 0
  9.     成交價 = Sheets("多空藍圖").Range("M4") '欄位暫代
  10.     Do
  11.         With Sheets("報價數據").Range("b1").Offset(i)
  12.         '**間隔為  #12:05:00 AM#  這"↑","↓"數據 準確嗎?***
  13.         If 成交價 < .Cells(1, 2) Then 方向 = "↑"
  14.         If 成交價 > .Cells(1, 2) Then 方向 = "↓"
  15.         
  16.         If 成交價 <= .Cells(1, 2) And 方向 = "↑" Then 多總 = 多總 + .Cells(2, 3)
  17.         If 成交價 >= .Cells(1, 2) And 方向 = "↓" Then 空總 = 空總 + .Cells(2, 3)
  18.         成交價 = .Cells(1, 2)
  19.             If .Value > xTime + 間隔 Then
  20.                 With Sheets("測試").Range("A2").Offset(Ti)
  21.                     .Resize(, 3) = Array(xTime, 多總, 空總)
  22.                     .NumberFormatLocal = "hh:mm;@"
  23.                 End With
  24.                  xTime = xTime + 間隔: Ti = Ti + 1
  25.              Else
  26.                 If .Cells.Offset(1) = "" And Format(TimeValue(.Cells.Text), "HH:MM") = "13:45" Then
  27.                     '***程式運行速度很快會跑完報價數據,時間已到"13:45"收盤 不再有數據了 **
  28.                     xTime = xTime + 間隔
  29.                     With Sheets("測試").Range("A2").Offset(Ti)
  30.                         .Resize(, 3) = Array(xTime, 多總, 空總)
  31.                         .NumberFormatLocal = "hh:mm;@"
  32.                     End With
  33.                     Exit Do
  34.                 ElseIf .Cells.Offset(1) = "" Then
  35.                     '****程式運行速度很快會跑完報價數據,但是數據還會有 因時間還未到"13:45"收盤 時 ...  **
  36.                     '**程式到這理 執行  重新整理 的程式 有更新到   _20180724_Match  對嗎? **
  37.                      '**********************************************
  38.                       Do
  39.                         If wTime > Time - #12:00:30 AM# Then '30秒 重新整理 一次
  40.                             '**試稍待一下等候新的數據
  41.                             Application.StatusBar = "重新整理...."
  42.                             重新整理   '** 更新   _20180724_Match 如有新的資料進來
  43.                                        '*************************.Cells.Offset(1)就 <>""  ***
  44.                             wTime = Time
  45.                             End If
  46.                         DoEvents
  47.                     Loop While .Cells.Offset(1) = ""  '**還是沒有新的數據就一直等候...
  48.                     '*** 如有新的資料進來 離開迴圈 繼續下去到  i = i + 1 的地方 再 Loop 下去 ***
  49.                     Application.StatusBar = False
  50.                 End If
  51.             End If
  52.         End With
  53.         DoEvents
  54.         i = i + 1
  55.     Loop
  56.     MsgBox "工作完成"
  57. End Sub
複製代碼

作者: dreamsway    時間: 2018-11-2 22:05

回復 27# GBKEE
G大您好! 今天在盤中測試發現狀況照舊,試著把報價手動作了調整後用一筆一筆F8監測,發現就算符合條件的情況下
  1. If .Cells.Offset(1) = "" Then
複製代碼
但每次都會把wTime = Time以及重整的語法跳過去,所以之前都不會進行後面的重新整理
後來我把wTime = Time換了位置,變成以下代碼
  1. Do
  2.                       wTime = Time '語法位置調整
  3.                         If wTime > Time - #12:00:30 AM# Then '30秒 重新整理 一次
  4.                             '**試稍待一下等候新的數據
  5.                             Application.StatusBar = "重新整理...."
  6.                             重新整理   '** 更新   _20180724_Match 如有新的資料進來
  7.                                        '*************************.Cells.Offset(1)就 <>""  ***
  8.                             'wTime = Time 原本位置
  9.                             End If
  10.                         DoEvents
複製代碼
改完之後雖然會重新整理了....但每次回圈都重整,不會有30秒才重整的情況
  1. if wTime > Time - #12:00:30 AM# Then '30秒 重新整理 一次
複製代碼
接著就是持續不間斷重新整理到EXCEL崩潰的情況發生
我在想是不是可以從重新整理那邊做調整
  1. Sub 重新整理()
  2. ActiveWorkbook.RefreshAll
  3. End Sub
複製代碼
請問G大是否能改成像是5秒內再度執行會exit sub的語法呢
謝謝!
作者: GBKEE    時間: 2018-11-3 14:40

回復 28# dreamsway

程式碼有點錯誤請更正看看
  1. ElseIf .Cells.Offset(1) = "" Then
  2.                     '****程式運行速度很快會跑完報價數據,但是數據還會有 因時間還未到"13:45"收盤 時 ...  **
  3.                     '**程式到這理 執行  重新整理 的程式 有更新到   _20180724_Match  對嗎? **
  4.                      '**********************************************
  5.                       wtime = Time   '** 抱歉這裡遺漏了*****
  6.                       Do
  7.                         '*** 還有應是 If wtime < Time - #12:00:30 AM# Then 才對
  8.                         If wtime < Time - #12:00:30 AM# Then '30秒 重新整理 一次
  9.                             '**試稍待一下等候新的數據
  10.                             Application.StatusBar = "重新整理...."
  11.                             重新整理   '** 更新   _20180724_Match 如有新的資料進來
  12.                                        '*************************.Cells.Offset(1)就 <>""  ***
  13.                             wtime = Time
  14.                             End If
  15.                         DoEvents
  16.                     Loop While .Cells.Offset(1) = ""  '**還是沒有新的數據就一直等候...
  17.                     '*** 如有新的資料進來 離開迴圈 繼續下去到  i = i + 1 的地方 再 Loop 下去 ***
  18.                     Application.StatusBar = False
  19.                 End If
複製代碼

作者: dreamsway    時間: 2018-11-6 11:48

本帖最後由 dreamsway 於 2018-11-6 11:49 編輯

回復 29# GBKEE
G大早安 測了幾天,若用手動F8測試已可以執行到重新整理及30秒的部分沒問題,
不過盤中在重整的地方一直卡關,手動重整是沒問題可以完整運行(約1秒就可以更新完),但如果是透過巨集則會卡關,呈現一直轉圈但沒報價出現的情況,直到手動強制中斷巨集才會出現,
不知道是不是電腦太爛...不過CPU跟記憶體使用率都還頗低(最高只到35%左右),這幾天找時間跟朋友借個好一點的電腦跑跑看,
另外在運算結果(多空數據)的呈現上,報價時間的最新兩個紀錄點不會記錄,例如報價已更新到16分,但15分跟20分的數據並不會顯現,
因為不會做GIF檔..所以用錄製的方式表現重整的狀況  影片
作者: GBKEE    時間: 2018-11-6 15:48

本帖最後由 GBKEE 於 2018-11-6 15:50 編輯

回復 30# dreamsway

11# 上 的 多空藍圖beta不含RTD.xls 中 Sub 匯入API報價文字檔()  '** 不就是在更新   _20180724_Match 的資料
    替代 重新整理看看
作者: dreamsway    時間: 2018-11-6 17:04

回復 31# GBKEE
因為現在改用2019版EXCEL(元大的RTD才能使用在win10及API才能使用數據超過65536筆),
所以匯入外部txt的方式變得比較不同,若用巨集重複執行匯入txt就會出現以下訊息
[attach]29651[/attach]
因此才改用重新整理的方式
作者: GBKEE    時間: 2018-11-6 18:59

回復 32# dreamsway

試試看
  1. Option Explicit
  2. Const 間隔 = #12:05:00 AM#   '這裡修改分鐘間隔
  3. Const 開盤 = #8:45:00 AM#
  4. Public Sht2 As Worksheet
  5. Sub K心態()
  6.     Dim i As Long, Ti As Integer, 成交價 As Double, 多總 As Long, 空總 As Long, 方向 As String
  7.     Dim xTime As Date, wTime As Date, Q As Variant
  8.     '*************************************
  9.     Set Sht2 = Sheets("報價數據")
  10.     With Sht2
  11.         For Each Q In .QueryTables
  12.             Q.Delete
  13.         Next
  14.         For Each Q In .Names
  15.             Q.Delete
  16.         Next
  17.     End With
  18.     匯入API報價文字檔
  19.     '**************************************
  20.     xTime = 開盤 + 間隔
  21.     i = 1: Ti = 0: 多總 = 0: 空總 = 0
  22.     成交價 = Sheets("多空藍圖").Range("M4") '欄位暫代
  23.     Do
  24.         With Sht2.Range("b1").Offset(i)
  25.         '**間隔為  #12:05:00 AM#  這"↑","↓"數據 準確嗎?***
  26.         If 成交價 < .Cells(1, 2) Then 方向 = "↑"
  27.         If 成交價 > .Cells(1, 2) Then 方向 = "↓"
  28.         
  29.         If 成交價 <= .Cells(1, 2) And 方向 = "↑" Then 多總 = 多總 + .Cells(2, 3)
  30.         If 成交價 >= .Cells(1, 2) And 方向 = "↓" Then 空總 = 空總 + .Cells(2, 3)
  31.         成交價 = .Cells(1, 2)
  32.             If .Value > xTime + 間隔 Then
  33.                 With Sheets("測試").Range("A2").Offset(Ti)
  34.                     .Resize(, 3) = Array(xTime, 多總, 空總)
  35.                     .NumberFormatLocal = "hh:mm;@"
  36.                 End With
  37.                  xTime = xTime + 間隔: Ti = Ti + 1
  38.              Else
  39.                 If .Cells.Offset(1) = "" And Format(TimeValue(.Cells.Text), "HH:MM") = "13:45" Then
  40.                     '***程式運行速度很快會跑完報價數據,時間已到"13:45"收盤 不再有數據了 **
  41.                     xTime = xTime + 間隔
  42.                     With Sheets("測試").Range("A2").Offset(Ti)
  43.                         .Resize(, 3) = Array(xTime, 多總, 空總)
  44.                         .NumberFormatLocal = "hh:mm;@"
  45.                     End With
  46.                     Exit Do
  47.                 ElseIf .Cells.Offset(1) = "" Then
  48.                     '****程式運行速度很快會跑完報價數據,但是數據還會有 因時間還未到"13:45"收盤 時 ...  **
  49.                     '**程式到這理 執行  重新整理 的程式 有更新到   _20180724_Match  對嗎? **
  50.                      '**********************************************
  51.                       wTime = Time
  52.                       Do
  53.                         If wTime < Time - #12:00:30 AM# Then '30秒 重新整理 一次
  54.                             '**試稍待一下等候新的數據
  55.                             Application.StatusBar = "重新整理...."
  56.                             匯入API報價文字檔   '** 更新   _20180724_Match 如有新的資料進來
  57.                                        '*************************.Cells.Offset(1)就 <>""  ***
  58.                             wTime = Time
  59.                             End If
  60.                         DoEvents
  61.                     Loop While .Cells.Offset(1) = ""  '**還是沒有新的數據就一直等候...
  62.                     '*** 如有新的資料進來 離開迴圈 繼續下去到  i = i + 1 的地方 再 Loop 下去 ***
  63.                     Application.StatusBar = False
  64.                 End If
  65.             End If
  66.         End With
  67.         DoEvents
  68.         i = i + 1
  69.     Loop
  70.     MsgBox "工作完成"
  71. End Sub
  72. Sub 匯入API報價文字檔() '還沒調整路徑字串,路徑2組日期改為當日日期,TXFH8則為sht1多空藍圖的A4儲存格
  73.     With Sht2
  74.         If .QueryTables.Count = 0 Then
  75.             With .QueryTables.Add(Connection:= _
  76.                 "TEXT;C:\API\20180724\TXFH8\20180724_Match.txt", Destination:=.Range("$A$2"))
  77.                 .Name = "20180724_Match"
  78.                 '.FieldNames = True         '預設值為 True 可不用列出
  79.                 .RowNumbers = False
  80.                 .FillAdjacentFormulas = False
  81.                 '.PreserveFormatting = True  '預設值為 True。可不用列出
  82.                 '.RefreshOnFileOpen = False   '預設值為 False。可不用列出
  83.                 .RefreshStyle = xlInsertDeleteCells
  84.                 .SavePassword = False
  85.                 .SaveData = True
  86.                '.AdjustColumnWidth = True      '預設值為 True。可不用列出
  87.                 .RefreshPeriod = 0
  88.                 '.TextFilePromptOnRefresh = False      '預設值為 False。可不用列出
  89.                 .TextFilePlatform = 950
  90.                 .TextFileStartRow = 1
  91.                 .TextFileParseType = xlDelimited
  92.                 .TextFileTextQualifier = xlTextQualifierDoubleQuote
  93.                 '.TextFileConsecutiveDelimiter = False  '預設值為 False 。可不用列出
  94.                 .TextFileTabDelimiter = True
  95.                 '.TextFileSemicolonDelimiter = False    '預設值為 False 。可不用列出
  96.                 .TextFileCommaDelimiter = True
  97.                 '.TextFileSpaceDelimiter = False         '預設值為 False 。可不用列出
  98.                 .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1)
  99.                 .TextFileTrailingMinusNumbers = True
  100.                 .Refresh BackgroundQuery:=False
  101.             End With
  102.         Else
  103.             .QueryTables(1).Refresh
  104.         End If
  105.         .Columns("B:B").NumberFormatLocal = "h:mm:ss;@"
  106.     End With
  107. End Sub
複製代碼

作者: dreamsway    時間: 2018-11-7 17:43

回復 33# GBKEE
謝謝G大,今天盤中實測的情況可以一直更新報價的數據了,不過會變成多空數據的部分跑不出來(8:50前測試情況),
若在8:50後才執行巨集,則會持續更新報價,然後多空數據會跑一次初次的報價(只會記錄一次),接著就是持續更新報價,但後續更新的報價運算的多空數據皆不會顯現。
但詭異的是...我試著手動F8測試,用監看每個變數卻又完全正常,可以跑報價也能跑多總空總的判斷,
小弟對VBA了解不多,不禁在想...會不會這兩種巨集自動運行時會衝突呀...一下是報價不會更新...這回是運算不會動...但手動F8卻又正常
不曉得是否這樣的運算對EXCEL.VBA來說負荷過重,一直請G大協助的情況感覺很過意不去...
作者: GBKEE    時間: 2018-11-8 13:18

回復 34# dreamsway
  '**間隔為  #12:05:00 AM#  這"↑","↓"數據 準確嗎?***

我不是有這疑問嗎?
作者: dreamsway    時間: 2018-11-9 16:10

本帖最後由 dreamsway 於 2018-11-9 16:12 編輯

回復 35# GBKEE
G大午安,那個↑↓指標的判斷是正確的,
我目前測到用這樣自動更新的方式,採用較之前您幫我修改的報價運算sub搭配多空紀錄sub,放在自動更新的sub內,報價及運算已測試兩天皆可順利運行,就是...盤中交易量大一點的瞬間會稍微頓一下(可能電腦該換了...)
雖然有點納悶為什麼自動更新可以,之前的重新整理就不行...
  1. Sub 執行()
  2. Call 共用參照
  3. Sht1.Range("J1") = "運行中.."
  4. uMode = "Start"

  5. Call 自動更新

  6. If uMode = "Stop" Then
  7. Sht1.Range("J1") = ">停止<"
  8. Exit Sub
  9. End If
  10. End Sub
複製代碼
  1. Sub 自動更新()
  2. On Error Resume Next
  3. ActiveWorkbook.RefreshAll
  4. If uMode = "Stop" Then Exit Sub
  5. Application.OnTime Now + TimeValue("00:00:15"), "自動更新"
  6. Call 報價運算 '裡面會再call 多空紀錄
  7. Call 高低更新
  8. Call K15
  9. Call 動態價
  10. End Sub
複製代碼
但若是我把自動更新sub裡面的call 報價運算改為K心態sub
若跑一輪沒在自動更新設定的15秒內跑完,就會開始之前的情況,導致報價一直更新但K心態也跑不完的狀況
另外,因為其他的sub都需要報價時間來做判斷,我試著在K心態內加上報價時間傳送到sht1.Range("C1") ,結果速度變得奇慢無比..
請問是不是這種寫法不適用這種逐筆更新另一個儲存格內容的狀況呢,因為目前的K心態是K棒時間收定後看到上一根運算的結果(例如現在09:49但只會看到09:45運算的結果)
不曉得能否看到即時的運算(例如報價時間09:49就看到運算到09:49的數據,而不用等到09:50過後)
如果不行的話就先採用目前已能順利運行的方式去跑,因為G大您幫我改過的多空紀錄,已經比我最原始的紀錄方式運行速度快非常多了

檔案
作者: GBKEE    時間: 2018-11-9 18:13

回復 36# dreamsway

未能實際參與你的檔案,很難幫你修改.
期貨我是門外漢,我有台新證券,智多星軟體,但找不到你 TXFH8 指數
作者: dreamsway    時間: 2018-11-9 18:56

回復 37# GBKEE
謝謝G大這陣子的協助,我先用目前的版本就可以了,
這個代碼似乎只限於元大的EASYWIN軟體用的,但是元大的DDE/RTD/API都是綁這個。




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