/// <summary> /// отдельный класс читает очередь сообщений от провайдеров /// каждый FIX-дилер получает сообщения своей группы /// </summary> public void ProcessExecutionReport(BrokerResponse response, BrokerOrder request) { Logger.InfoFormat("Запрос ({0}), ответ ({1})", request, response); requestWatchdog.OnRequestProcessed(response.RequestId); // сообщить клиенту об отказе обработать ордер // вынимаем ордер из базы MarketOrder order; int orderId; if (request.ClosingPositionID != null && request.ClosingPositionID > 0) orderId = (int)request.ClosingPositionID; else { orderId = request.RequestId; Logger.InfoFormat("Запрос GetMarketOrder orderId={0} requestId={1}", orderId, request.RequestId); } Logger.InfoFormat("Запрос GetMarketOrder accountId={0}, orderId={1}", request.AccountID, orderId); var res = ServerInterface.GetMarketOrder(orderId, out order); if (res == false) { errorStorage.AddMessage(new ErrorMessage(DateTime.Now, ErrorMessageType.ОтказСервера, string.Format("Дилер {0}: не найдена позиция ID={0} для обработка запроса [{1}]-[счет {2}, пара {3}]", request.RequestId, request.Id, request.AccountID, request.Instrument), null)); ServerInterface.NotifyClientOnOrderRejected(order, "не найден ордер"); return; } if (response.Status == OrderStatus.Отклонен) { var rejectReasonStr = string.IsNullOrEmpty(response.RejectReasonString) ? (response.RejectReason ?? OrderRejectReason.None).ToString() : response.RejectReasonString; ServerInterface.NotifyClientOnOrderRejected(order, rejectReasonStr); errorStorage.AddMessage(new ErrorMessage(DateTime.Now, ErrorMessageType.ОтказСервера, string.Format("Дилер {0}: отказ сервера [{1}] на запрос [{2}]-[счет {3}, пара {4}]", DealerCode, rejectReasonStr, request.Id, request.AccountID, request.Instrument), null)); return; } if (!response.Price.HasValue) { errorStorage.AddMessage(new ErrorMessage(DateTime.Now, ErrorMessageType.ОтказСервера, string.Format("Дилер {0}: отказ сервера [нет цены] на запрос [{1}]-[счет {2}, пара {3}]", DealerCode, request.Id, request.AccountID, request.Instrument), null)); ServerInterface.NotifyClientOnOrderRejected(order, "Нет цены"); return; } var deltaMarkup = request.MarkupAbs * order.Side; // закрытие позиции - ордер обработан if (request.ClosingPositionID.HasValue) { var reason = exitReasonByOrderId.ReceiveValue(order.ID); // закрыть ордер немедленно ServerInterface.CloseOrder(order.ID, response.Price.Value - (decimal)deltaMarkup, reason); return; } // открытие позы - обработано order.TimeEnter = response.ValueDate; order.PriceEnter = (float)response.Price.Value + deltaMarkup; order.State = PositionState.Opened; ServerInterface.ModifyMarketOrder(order); }
public ExecutionReport() { brokerResponse = new BrokerResponse(); }
public static BROKER_RESPONSE UndecorateBrokerResponse(BrokerResponse resp) { return new BROKER_RESPONSE { ID = resp.Id, RequestID = resp.RequestId, Price = resp.Price, Swap = resp.Swap, Status = (int)resp.Status, RejectReason = resp.RejectReason == null ? (int?)null : (int)resp.RejectReason, RejectReasonString = resp.RejectReasonString, ValueDate = resp.ValueDate }; }