返回列表 上一主題 發帖

[發問] API逐筆運算負擔大,可否精簡

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 6# dreamsway

明天開盤 可測看看

    依時間紀錄.zip (29.26 KB)
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

回復 9# dreamsway

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

這資料是哪裡來的



多空藍圖 上是需填上Dee公式的如你沒有
請附上你的原始檔案看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

回復 11# dreamsway

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

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



這裡要修改
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) '**工作表(指數代號)
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 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)
複製代碼
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

        靜思自在 : 【行善要及時】行善要及時,功德要持續。如燒開水一般,未燒開之前千萬不要停熄火候,否則重來就太費事了。
返回列表 上一主題