/// <summary> /// Инкрементальная синхронизация заявок /// </summary> /// <param name="sps">Провайдер синхронизации</param> /// <param name="localAccountID">Счет в локальной базе</param> /// <param name="remoteAccountID">Счет в базе Leech</param> /// <returns></returns> private async Task FastSyncOrders(ISyncPipeServer sps, int localAccountID, int remoteAccountID) { // активные заявки могут измениться // по всем активным заявкам составляем список соответствующих remoteID List <int> rids = new List <int>(); var activeOrders = _accountDA.GetOrders(localAccountID, true); foreach (var so in activeOrders) { if (!_order_rid_lid.Values.Contains(so.OrderID)) { continue; } int rid = _order_rid_lid.First(r => r.Value == so.OrderID).Key; rids.Add(rid); } var rOrders = await sps.GetOrders(rids.ToArray()); // список заявок, которые могут измениться if (rOrders == null) { return; } foreach (var rord in rOrders) { var lord = activeOrders.FirstOrDefault(r => r.OrderID == _order_rid_lid[rord.OrderID]); if (lord == null) { continue; } bool isUpdate = false; if (rord.BuySell != lord.BuySell) { lord.BuySell = rord.BuySell; isUpdate = true; } if (rord.LotCount != lord.LotCount) { lord.LotCount = rord.LotCount; isUpdate = true; } if (rord.Price != lord.Price) { lord.Price = rord.Price; isUpdate = true; } if (rord.Status != lord.Status) { lord.Status = rord.Status; isUpdate = true; } if (rord.OrderNo != lord.OrderNo) { lord.OrderNo = rord.OrderNo; isUpdate = true; } if (rord.Time != lord.Time) { lord.Time = rord.Time; isUpdate = true; } int?soID = null; if (rord.StopOrderID != null && _stoporder_rid_lid.ContainsKey(rord.StopOrderID.Value)) { soID = _stoporder_rid_lid[rord.StopOrderID.Value]; } if (lord.StopOrderID != soID) { lord.StopOrderID = soID; isUpdate = true; } if (isUpdate) { _accountDA.UpdateOrder(lord); } } int maxRid = 0; // максимальный реплицированный номер if (_order_rid_lid.Keys.Any()) { maxRid = _order_rid_lid.Keys.Max(); } var newRemoteOrders = await sps.GetOrders(remoteAccountID, maxRid + 1); // новые записи, которые появились на сервере и еще не загружались if (newRemoteOrders == null) { return; } foreach (var rord in newRemoteOrders) { if (!_instrum_rid_lid.ContainsKey(rord.InsID)) { continue; // не смогли установить соответствие инструментов } var ord = _accountDA.CreateOrder(localAccountID, rord.Time, _instrum_rid_lid[rord.InsID], rord.BuySell, rord.LotCount, rord.Price, rord.Status, rord.StopOrderID, rord.OrderNo); _order_rid_lid.Add(rord.OrderID, ord.OrderID); // новое соответствие идентификаторов } }
/// <summary> /// Полная синхронизация заявок /// </summary> private async Task SyncOrdersFull(ISyncPipeServer sps, int localAccountID, int remoteAccountID) { var remOrders = await sps.GetOrders(remoteAccountID, 0); if (remOrders == null) { return; } var orders = _accountDA.GetOrders(localAccountID, false); foreach (var rOrd in remOrders) { int insID = 0; // пытаемся сопоставить инструмент if (_instrum_rid_lid.ContainsKey(rOrd.InsID)) { insID = _instrum_rid_lid[rOrd.InsID]; } if (insID == 0) { continue; // если не смогли сопоставить инструмент, то ничего больше сделать не можем } // ссылка на стоп-заявку int?soID = null; if (rOrd.StopOrderID != null && _stoporder_rid_lid.ContainsKey(rOrd.StopOrderID.Value)) { soID = _stoporder_rid_lid[rOrd.StopOrderID.Value]; } if (_order_rid_lid.ContainsKey(rOrd.OrderID)) { int lid = _order_rid_lid[rOrd.OrderID]; var order = orders.FirstOrDefault(r => r.OrderID == lid); if (order != null) // локальный найден { // сравниваем все по полной, хотя в реальности объект не может так сильно меняться bool isUpdate = false; if (order.InsID != insID) { order.InsID = insID; isUpdate = true; } if (order.BuySell != rOrd.BuySell) { order.BuySell = rOrd.BuySell; isUpdate = true; } if (order.LotCount != rOrd.LotCount) { order.LotCount = rOrd.LotCount; isUpdate = true; } if (order.Status != rOrd.Status) { order.Status = rOrd.Status; isUpdate = true; } if (order.OrderNo != rOrd.OrderNo) { order.OrderNo = rOrd.OrderNo; isUpdate = true; } if (order.Time != rOrd.Time) { order.Time = rOrd.Time; isUpdate = true; } if (order.Price != rOrd.Price) { order.Price = rOrd.Price; isUpdate = true; } if (order.StopOrderID != soID) { order.StopOrderID = soID; isUpdate = true; } if (isUpdate) { _accountDA.UpdateOrder(order); } } else // соответствие есть, но локальный не найден, значит соответствие уже не действительно { _order_rid_lid.Remove(rOrd.OrderID); // удаляем старое соответствие var ord = _accountDA.CreateOrder(localAccountID, rOrd.Time, insID, rOrd.BuySell, rOrd.LotCount, rOrd.Price, rOrd.Status, soID, rOrd.OrderNo); _order_rid_lid.Add(rOrd.OrderID, ord.OrderID); } } else // соответствие не найдено { var ord = _accountDA.CreateOrder(localAccountID, rOrd.Time, insID, rOrd.BuySell, rOrd.LotCount, rOrd.Price, rOrd.Status, soID, rOrd.OrderNo); _order_rid_lid.Add(rOrd.OrderID, ord.OrderID); } } }