返回列表 上一主題 發帖

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

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

TOP

回復 19# GBKEE
謝謝超版G大,之前在盤後使用完全正常,一到盤中實測就冒出問題
測試了好幾天,終於調整好了,謝謝!

TOP

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

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

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

謝謝!

TOP

[版主管理留言]
  • GBKEE(2018/10/30 18:40): 附上檔案看一下

回復 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大您提供的的代碼卻又正常:'( :'(

TOP

回復 22# GBKEE

雲端檔案
再麻煩G大解惑了,謝謝!

TOP

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

TOP

回復 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的語法呢
謝謝!

TOP

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

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

TOP

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

TOP

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

TOP

        靜思自在 : 一句溫暖的話,就像往別人身上灑香水,自己會沾到兩三滴。
返回列表 上一主題