public MarketOrder(int id, string ticker, Instrument instrument, int volume, int side, OrderPricing orderPricing, string accountGroupCode) { AccountGroupCode = accountGroupCode; brokerOrder = new BrokerOrder { Id = id, Ticker = ticker, Instrument = instrument, Volume = volume, Side = side, OrderPricing = orderPricing }; }
public MarketOrder(int id, string ticker, Instrument instrument, int volume, int side, OrderPricing orderPricing, decimal? requestedPrice, decimal? enabledAbsoluteSlippage, string accountGroupCode) { AccountGroupCode = accountGroupCode; brokerOrder = new BrokerOrder { Id = id, Ticker = ticker, Instrument = instrument, Volume = volume, Side = side, OrderPricing = orderPricing, RequestedPrice = requestedPrice, Slippage = enabledAbsoluteSlippage }; }
public MarketOrder(BrokerOrder brokerOrder) { this.brokerOrder = brokerOrder; }
public void SaveProviderMessage(BrokerOrder msg) { using (var ctx = DatabaseContext.Instance.Make()) { var brokOrder = LinqToEntity.UndecorateBrokerOrder(msg); ctx.BROKER_ORDER.Add(brokOrder); ctx.SaveChanges(); } }
/// <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 static BROKER_ORDER UndecorateBrokerOrder(BrokerOrder ord) { var order = new BROKER_ORDER { RequestID = ord.RequestId, ID = ord.Id, Ticker = ord.Ticker, Instrument = (int)ord.Instrument, Volume = ord.Volume, Side = ord.Side, OrderPricing = (int)ord.OrderPricing, RequestedPrice = ord.RequestedPrice, Slippage = ord.Slippage, Dealer = ord.DealerCode, AccountID = ord.AccountID, ClosingPositionID = ord.ClosingPositionID, TimeCreated = ord.TimeCreated, Magic = ord.Magic, Comment = ord.Comment, ExpertComment = ord.ExpertComment, Markup = ord.MarkupAbs }; return order; }