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}"); } }
/// <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; } }
/// <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); }