private void OnOrderStatusChanged(DispatchedOrder dispatchedOrder) { if (dispatchedOrder == null) { return; } if (dispatchedOrder.Request.AssociatedObject != null) { StoplossOrder order = dispatchedOrder.Request.AssociatedObject as StoplossOrder; if (order == null) { return; } if (TradingHelper.IsFinalStatus(dispatchedOrder.LastStatus)) { lock (_orderLockObj) { if (!IsSentOrder(order)) { return; } ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); if (logger != null) { logger.InfoFormat( "Stoploss order executed: id {0} code {1} status {2} suceeded volume {3}.", order.OrderId, order.SecurityCode, dispatchedOrder.LastStatus, dispatchedOrder.SucceededVolume); } order.UpdateExistingVolume(dispatchedOrder.SucceededVolume); RemoveSentOrder(order); if (order.ExistingVolume > 0) { // the order has not been finished yet, put it back into active order AddActiveStoplossOrder(order); if (TradingHelper.IsSucceededFinalStatus(dispatchedOrder.LastStatus)) { // send out order again SendStoplossOrder(order); } } } } } }
private void QueryOrderStatus(object state) { if (!Monitor.TryEnter(_dispatcherLockObj)) { // ignore this refresh because previous refreshing is still on going. return; } if (_isStopped) { return; } if (_client == null || !_client.IsLoggedOn()) { return; } try { bool hasActiveOrder = false; lock (_orderLockObj) { hasActiveOrder = _allActiveOrders.Count > 0; } if (!hasActiveOrder) { return; } string error; var submittedOrders = _client.QuerySubmittedOrderToday(out error).ToList(); if (submittedOrders.Count() == 0) { if (!string.IsNullOrEmpty(error)) { ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); if (logger != null) { logger.WarnFormat("Failed to query cancellable order. error: {0}", error); } } } else { foreach (var order in submittedOrders) { DispatchedOrder dispatchedOrder; lock (_orderLockObj) { if (!_allActiveOrders.TryGetValue(order.OrderNo, out dispatchedOrder)) { // not submitted by the dispatcher or the order is finished, ignore it. continue; } } // check if order status has been changed and notify client if necessary CheckOrderStatusChangeAndNotify(ref dispatchedOrder, order); // remove order in finished status if (TradingHelper.IsFinalStatus(order.Status)) { lock (_orderLockObj) { _allActiveOrders.Remove(dispatchedOrder.OrderNo); } } } } } catch (Exception ex) { ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); if (logger != null) { logger.ErrorFormat("Exception in querying order status: {0}", ex); } } finally { Monitor.Exit(_dispatcherLockObj); } }