Ejemplo n.º 1
0
        private async Task HandleAsync(QLFill message)
        {
            try
            {
                Logger.Debug().Print($"Handle(QLFill): {message}");

                var instrument = await adapter.ResolveInstrumentAsync(message.sec_code);

                if (instrument == null)
                {
                    Logger.Error().Print($"Unable to resolve instrument for {message.sec_code}");
                    return;
                }

                // если заявка отправлялась в текущей сессии работы программы, то нужно убедиться, что oscm по ней уже отправлялся
                if (container.IsCurrentSessionOrder(message.order_num))
                {
                    var lastOscm = container.GetLastOrderStateChangeForOrderId(message.order_num);
                    if (lastOscm == null)
                    {
                        Logger.Debug()
                        .Print("Handle(QLFill): Fill will be processed later, no OSCM received",
                               LogFields.Message(message));
                        container.PutPendingFill(message);
                        return;
                    }
                }
                else if (container.HasUnrepliedTransactions())
                {
                    Logger.Debug()
                    .Print($"Handle(QLFill): Fill will be processed later, there are unreplied transactions",
                           LogFields.Message(message));
                    container.PutPendingFill(message);
                    return;
                }

                OnMessageReceived(new FillMessage
                {
                    Instrument      = instrument,
                    Account         = message.account,
                    Quantity        = (uint)message.qty,
                    ClientCode      = message.account,
                    ExchangeId      = message.trade_num.ToString(),
                    ExchangeOrderId = message.order_num.ToString(),
                    Price           = message.price,
                    Operation       = message.Operation,
                    DateTime        = message.Time
                });
            }
            catch (Exception e)
            {
                Logger.Error().Print(e, $"Failed to handle {message}");
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Сохранить сделку, требующую отложенной обработки
        /// </summary>
        /// <param name="message"></param>
        public void PutPendingFill(QLFill message)
        {
            log.Debug().Print("Postpone fill processing", LogFields.Message(message));
            using (locker.WriteLock())
            {
                if (pendingFills.ContainsKey(message.trade_num))
                {
                    log.Warn().Print($"Fill duplicate received", LogFields.Id(message.trade_num));
                    return;
                }

                pendingFills[message.trade_num] = message;
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Сохранить идентификатор полученной сделки. Для дальнейшего анализа на получение дубликата сообщения
        /// </summary>
        /// <param name="id">Биржевой идентификатор сделки</param>
        /// <returns>true - если сделка уже есть в контейнере, иначе false</returns>
        public bool PutFillId(QLFill fill)
        {
            using (lockerReceivedFills.WriteLock())
            {
                if (receivedFills.Contains(fill.trade_num))
                {
                    log.Warn().Print($"Fill duplicate received", LogFields.Id(fill.trade_num));
                    return(true);
                }

                receivedFills.Add(fill.trade_num);
            }

            return(false);
        }