返回列表 上一主題 發帖

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

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

回復 30# dreamsway

11# 上 的 多空藍圖beta不含RTD.xls 中 Sub 匯入API報價文字檔()  '** 不就是在更新   _20180724_Match 的資料
    替代 重新整理看看
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

回復 31# GBKEE
因為現在改用2019版EXCEL(元大的RTD才能使用在win10及API才能使用數據超過65536筆),
所以匯入外部txt的方式變得比較不同,若用巨集重複執行匯入txt就會出現以下訊息
1541491846897.jpg
因此才改用重新整理的方式

TOP

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

TOP

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

TOP

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

我不是有這疑問嗎?
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

本帖最後由 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大您幫我改過的多空紀錄,已經比我最原始的紀錄方式運行速度快非常多了

檔案

TOP

回復 36# dreamsway

未能實際參與你的檔案,很難幫你修改.
期貨我是門外漢,我有台新證券,智多星軟體,但找不到你 TXFH8 指數
感恩的心......(在麻辣家族討論區.用心學習會有進步的)
但資源無限,後援有限,  一天1元的贊助,人人有能力.

TOP

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

TOP

        靜思自在 : 做好事不能少我一人,做壞事不能多我一人。
返回列表 上一主題