|
樓主 |
發表於 17-10-13 19:25
|
顯示全部樓層
程式還有一個會出錯的地方 : 取消停損單(單子會取消, 但委託簿卻沒有反應最新的狀況)
這是因為停損單取消成功後, 程式會立即向主機查詢最新停損單狀態
但因為時間間隔太短, 主機還在處理停損單的狀態, 所以回復一個 QUERY_IN_PRPCESSING的錯誤訊息,
導致程式無法更新停損單狀態.
Remedy是 在取消停損單後, 讓執行緒暫停個一小段時間(say 1.5秒鐘, 時間長點比較保險)再去更新停損狀態
最簡單的修改是在 CancelOrder() Method 加入以下紅字修正:
. .
.
else if (orderType == "停損單")
{
code = SKOrder.CancelFutureStopLoss(User.ID, false, User.FutureAccount, seqNo, "STP", out string message);
WriteMessage("Order", "CancelFutueStopLoss", code);
if (code == 0)
{
Thread.Sleep(1500);
UpdateStopOrders();
}
}
老實說, 讓執行緒pending 個一秒半 , 對一個分秒必爭 的 Trader 而言, 並不是個太理想的辦法
另外兩個做法是:
1. 設定一個Timer, 使得要求更新停損單(UpdateStopOrder)的Call在取消停損單後一段時間再執行
2.解析傳回的錯誤訊息, 如果內容包刮"取消" 及委託書號, 則解讀為停損刪單成功
這兩個做法, 程式要怎麼修改, 就留給客倌您自己了
|
|