protected override CMState RouteNewOrder(Wrapper wrapper) { try { Order order = GetOrder(wrapper); try { lock (tLock) { //RunUpperTick(order); ExecutionReport exRep = OrderManager.PlaceOrder(order); BitMexActiveOrders.Add(order.ClOrdId, order); if (exRep.OrderID != null) { OrderIdMappers.Add(exRep.OrderID, order.ClOrdId); } //The new ER will arrive through the websockets //ExecutionReportWrapper erWrapper = new ExecutionReportWrapper(exRep, order); //OnMessageRcv(erWrapper); } } catch (Exception ex) { zHFT.OrderRouters.Bitmex.Common.DTO.ErrorMessage errMsg = JsonConvert.DeserializeObject <zHFT.OrderRouters.Bitmex.Common.DTO.ErrorMessage>(ex.Message); ExecutionReportWrapper erWrapper = new ExecutionReportWrapper(GetRejectedExecutionReport(order, errMsg.error.message != null ? errMsg.error.message : ex.Message), order); OnMessageRcv(erWrapper); } return(CMState.BuildSuccess()); } catch (Exception ex) { return(CMState.BuildFail(ex)); } }
protected void ProcessExecutionReports(WebSocketSubscriptionEvent subscrEvent) { WebSocketExecutionReportEvent reports = (WebSocketExecutionReportEvent)subscrEvent; foreach (zHFT.OrderRouters.Bitmex.Common.DTO.ExecutionReport execReportDTO in reports.data) { try { string clOrdId = ""; if (OrderIdMappers.ContainsKey(execReportDTO.OrderID)) { clOrdId = OrderIdMappers[execReportDTO.OrderID]; if (BitMexActiveOrders.ContainsKey(clOrdId)) { Order order = BitMexActiveOrders[clOrdId]; lock (tLock) { if (execReportDTO.ExecType == ExecType.New.ToString()) { order.OrderId = execReportDTO.OrderID; } if (execReportDTO.ExecType == ExecType.Replaced.ToString()) { BitMexActiveOrders.Remove(clOrdId); order.ClOrdId = order.PendingClOrdId; order.PendingClOrdId = null; BitMexActiveOrders.Add(order.ClOrdId, order); OrderIdMappers[execReportDTO.OrderID] = order.ClOrdId; } if (execReportDTO.ExecType == ExecType.Canceled.ToString() || execReportDTO.ExecType == ExecType.Stopped.ToString() || execReportDTO.ExecType == ExecType.Rejected.ToString() || execReportDTO.ExecType == ExecType.Suspended.ToString() || execReportDTO.ExecType == ExecType.Expired.ToString()) { BitMexActiveOrders.Remove(order.ClOrdId); OrderIdMappers.Remove(order.OrderId); } } WSExecutionReportWrapper wrapper = new WSExecutionReportWrapper(execReportDTO, order); OnMessageRcv(wrapper); } } else { DoLog(string.Format("Unknown order processing execution report for OrderId {0} ", execReportDTO.OrderID), Main.Common.Util.Constants.MessageType.Information); } } catch (Exception ex) { DoLog(string.Format("Error processing execution report for ClOrdId {0}:{1} ", execReportDTO.ClOrdID, ex.Message), Main.Common.Util.Constants.MessageType.Error); } } }