googleandy 發表於 15-9-28 19:40

請教PC執行效率問題


如圖片1, 借用VB語法說明. 如果想買100支商品(數目誇張,是為了說明方便),最直接的想法就是從第1支循序買到第100支.
如圖片2, 如果打算提升效率,可否切割成十支副程式,然後呼叫執行? 請教諸位大大:問題1, 圖片2的方法是否真能提升交易速度?問題2, 圖片2的方法是否真的”兵分十路”同步平行進行?      還是第一支副程式執行完了才執行第二支,第三支….問題3, 圖片2的方法,假設副程式三卡關(有bug),那麼以下第四支,第五支…會繼續執行嗎? 以上,thanks.

jackthetan 發表於 15-9-28 21:31

你的下單方式, 如果是 Multicharts 內建下單機, 那我不知道,
如果是自己寫 API 去下單,
那麼
1. 沒差
2. 還是會一個個作
3. 會等卡住的作完再作下一個

如果你要加速買進的動作,
要用 Thread(執行緒)的方式去作下單動作, 才可以1-100個商品
同時啟動買進動作.

googleandy 發表於 15-9-28 21:36


不好意思,自行回答.
經進一步實驗,如圖,想要以分割副程式方法來增進速度似乎行不通!因為實驗結果證實---所有副程式還是要一個一個”照步來”,不能”平行”進行!!


zaqimon 發表於 15-9-28 21:53

主要是看你的下單API是否會blocking
如果會blocking那就要看下單API是否支援多個thread同時call
就算下單API不會blocking
也不代表它就會同時下單到主機端
也不代表主機端就會同時處理你所下過來的所有單子

gryphoner 發表於 15-9-28 21:54

本帖最後由 gryphoner 於 15-9-28 21:56 編輯

近兩年小弟較常研究Golang與Erlang這兩種併發式程式語言,寫起這類需要同時數百個不同任務進行的程式較為簡單

VB應屬於順序型的程式語言(對VB不甚熟悉),也就是從第一行執行至最後一行

因此,如果要避免執行到某一行後因為Bug或訊號源延遲而卡住,可以增設一個錯誤出現時的判斷條件較佳

如果是小弟的撰寫習慣,會把符合條件的商品整理為一個陣列,再由另一個買入的子程式解析後下單

最近有空滿想試著用Erlang來撰寫整套下單軟體,Erlnag的語言特性很適合撰寫全年無休的應用......現在正用它在寫Game Server

wldtw2008 發表於 15-9-30 00:10

本帖最後由 wldtw2008 於 15-9-30 00:32 編輯

我的經驗是, 這跟券商的API有關.


我親自測過, 永豐金的API, 我寫了一個C#測下單的工具, 在2核心的虛擬機上測試, 從下單到收到全部委託回報的時間差.
1. 開1個工具,正常交易時段瞬間打出100筆選擇權買方IOC委託單, 約需要6.9秒.
2. 開2個工具,正常交易時段瞬間打出各100筆選擇權買方IOC委託單(也就是總計200筆), 測出來一個12.6秒, 另一個13秒.


==>小結論, 不論我開幾個工具平行執行, 雖然多執行緒能夠讓效能快一點點, 但並不令人驚艷, 單一台PC 打單的極限大概就是65~70ms per Order. 從各種測試結果推估, 小弟研判應該是因為該API DLL使用了全系統共用同一個Queue的技術(也許是用share memory實現), 也就是不管幾個執行緒幾個程式在丟單, 最後都是丟到同一個Queue去, 然後再由API循序送到券商後台.

我想不同期貨商API就會有不同行為, 若您要用在永豐金的API上, 那不管用什麼語言, 用幾個執行緒, 結果都差異不大的. 建議在真正這樣做之前, 先像我一樣做一個小工具測測看, 到底多行程下單是否有顯著加速, 不要像我一樣下單機都弄成多行程平行分散下單了,才發現速度一點也沒有起色, 徒勞無功.


另外, 可以的話, 可以分享一下各位打100筆委託所需要消耗的時間. 大家互相分享分享. (永豐是因為便宜我才用他的, 但他的速度我還是不太滿意就是了)


PS. 測試方法建議一次打出的筆數越多越好(100筆以上), 結果越準確. 並請量測送單到收到最後一筆單的回報的時間差.因為像永豐API, 他在20筆以內, 會有瞬間0.01秒收單成功的假象(但實際上委託回報姍姍來遲算來還是70ms).

googleandy 發表於 15-9-30 10:49

wldtw2008 發表於 15-9-30 00:10 static/image/common/back.gif
我的經驗是, 這跟券商的API有關.




感謝W大詳細解說和分享實驗成果,
另外,請教W大:

若用2部PC分工下單,會不會比較快?
thanks.

zaqimon 發表於 15-9-30 11:33

下單API的速度限制不會是在PC或本地端程式
而是券商如何設計API及主機端如何處理短時間內所下的多筆訂單

例如IB API是non-blocking的設計
也就是你可以在瞬間用IB API連續送出10筆訂單
但它就是每隔200ms才會回覆一筆訂單已成功送出的event
也就是10筆訂單大約需要2秒才算全部送出
這也不是使用任何方式能夠加速的

wldtw2008 發表於 15-9-30 12:59

本帖最後由 wldtw2008 於 15-9-30 13:04 編輯

zaqimon 發表於 15-9-30 11:33 static/image/common/back.gif
下單API的速度限制不會是在PC或本地端程式
而是券商如何設計API及主機端如何處理短時間內所下的多筆訂單


原來如此, 難怪我總覺得下單到TWS時, 在打好多個單子的狀況下有點慢.

一般人關心的是下一口單到交易所的速度. 但某些狀況需要考慮到下100口單的速度, 不同的券商就會有不同的延遲行為, 真的只能靠自己摸索了。

不過提一下,IB這種第一筆單處理完才處理第二筆的行為, 是有點阻塞式的意味, 應該是稱之為blocking (非同步)才對.

googleandy 發表於 15-9-30 19:22

wldtw2008 發表於 15-9-30 00:10 static/image/common/back.gif
我的經驗是, 這跟券商的API有關.






我也以永豐API測試,委託200筆,耗時約17秒,但這是下午5:30分,非交易時段委託的.

googleandy 發表於 15-10-1 09:15

googleandy 發表於 15-9-30 19:22 static/image/common/back.gif
我也以永豐API測試,委託200筆,耗時約17秒,但這是下午5:30分,非交易時段委託的.
...

今天在交易時段實測,結果是--委託200筆,耗時30秒!
頁: [1]
查看完整版本: 請教PC執行效率問題