/// <summary> /// Инкрементальная синхронизация стоп-заявок /// </summary> /// <param name="sps">Провайдер синхронизации</param> /// <param name="localAccountID">Счет в локальной базе</param> /// <param name="remoteAccountID">Счет в базе Leech</param> /// <returns></returns> private async Task FastSyncStopOrders(ISyncPipeServer sps, int localAccountID, int remoteAccountID) { // активные заявки могут измениться // по всем активным заявкам составляем список соответствующих remoteID List <int> rids = new List <int>(); var activeStopOrders = _accountDA.GetStopOrders(localAccountID, true); foreach (var so in activeStopOrders) { if (!_stoporder_rid_lid.Values.Contains(so.StopOrderID)) { continue; } int rid = _stoporder_rid_lid.First(r => r.Value == so.StopOrderID).Key; rids.Add(rid); } var rStopOrders = await sps.GetStopOrders(rids.ToArray()); // список заявок, которые могут измениться if (rStopOrders == null) { return; } foreach (var rso in rStopOrders) { var lso = activeStopOrders.FirstOrDefault(r => r.StopOrderID == _stoporder_rid_lid[rso.StopOrderID]); if (lso == null) { continue; } bool isUpdate = false; if (rso.AlertPrice != lso.AlertPrice) { lso.AlertPrice = rso.AlertPrice; isUpdate = true; } if (rso.BuySell != lso.BuySell) { lso.BuySell = rso.BuySell; isUpdate = true; } if (rso.CompleteTime != lso.CompleteTime) { lso.CompleteTime = rso.CompleteTime; isUpdate = true; } if (rso.EndTime != lso.EndTime) { lso.EndTime = rso.EndTime; isUpdate = true; } if (rso.LotCount != lso.LotCount) { lso.LotCount = rso.LotCount; isUpdate = true; } if (rso.Price != lso.Price) { lso.Price = rso.Price; isUpdate = true; } if (rso.Status != lso.Status) { lso.Status = rso.Status; isUpdate = true; } if (rso.StopOrderNo != lso.StopOrderNo) { lso.StopOrderNo = rso.StopOrderNo; isUpdate = true; } if (rso.StopType != lso.StopType) { lso.StopType = rso.StopType; isUpdate = true; } if (rso.Time != lso.Time) { lso.Time = rso.Time; isUpdate = true; } if (isUpdate) { _accountDA.UpdateStopOrder(lso); } } int maxRid = 0; // максимальный реплицированный номер if (_stoporder_rid_lid.Keys.Any()) { maxRid = _stoporder_rid_lid.Keys.Max(); } var newRemoteStopOrders = await sps.GetStopOrders(remoteAccountID, maxRid + 1); // новые записи, которые появились на сервере и еще не загружались if (newRemoteStopOrders == null) { return; } foreach (var rso in newRemoteStopOrders) { if (!_instrum_rid_lid.ContainsKey(rso.InsID)) { continue; // не смогли установить соответствие инструментов } var sOrd = _accountDA.CreateStopOrder(localAccountID, rso.Time, _instrum_rid_lid[rso.InsID], rso.BuySell, rso.StopType, rso.EndTime, rso.AlertPrice, rso.Price, rso.LotCount, rso.Status, rso.CompleteTime, rso.StopOrderNo); _stoporder_rid_lid.Add(rso.StopOrderID, sOrd.StopOrderID); // новое соответствие идентификаторов } }
/// <summary> /// Полная синхронизация стоп-заявок /// </summary> private async Task SyncStopOrdersFull(ISyncPipeServer sps, int localAccountID, int remoteAccountID) { var remStopOrders = await sps.GetStopOrders(remoteAccountID, 0); if (remStopOrders == null) { return; } var stopOrders = _accountDA.GetStopOrders(localAccountID, false); foreach (var rso in remStopOrders) { int insID = 0; // пытаемся сопоставить инструмент if (_instrum_rid_lid.ContainsKey(rso.InsID)) { insID = _instrum_rid_lid[rso.InsID]; } if (insID == 0) { continue; // если не смогли сопоставить инструмент, то ничего больше сделать не можем } if (_stoporder_rid_lid.ContainsKey(rso.StopOrderID)) { int lid = _stoporder_rid_lid[rso.StopOrderID]; var stopOrder = stopOrders.FirstOrDefault(r => r.StopOrderID == lid); if (stopOrder != null) // локальный найден { // сравниваем все по полной, хотя в реальности объект не может так сильно меняться bool isUpdate = false; if (stopOrder.InsID != insID) { stopOrder.InsID = insID; isUpdate = true; } if (stopOrder.AlertPrice != rso.AlertPrice) { stopOrder.AlertPrice = rso.AlertPrice; isUpdate = true; } if (stopOrder.BuySell != rso.BuySell) { stopOrder.BuySell = rso.BuySell; isUpdate = true; } if (stopOrder.LotCount != rso.LotCount) { stopOrder.LotCount = rso.LotCount; isUpdate = true; } if (stopOrder.Status != rso.Status) { stopOrder.Status = rso.Status; isUpdate = true; } if (stopOrder.StopOrderNo != rso.StopOrderNo) { stopOrder.StopOrderNo = rso.StopOrderNo; isUpdate = true; } if (stopOrder.StopType != rso.StopType) { stopOrder.StopType = rso.StopType; isUpdate = true; } if (stopOrder.Time != rso.Time) { stopOrder.Time = rso.Time; isUpdate = true; } if (stopOrder.Price != rso.Price) { stopOrder.Price = rso.Price; isUpdate = true; } if (stopOrder.EndTime != rso.EndTime) { stopOrder.EndTime = rso.EndTime; isUpdate = true; } if (stopOrder.CompleteTime != rso.CompleteTime) { stopOrder.CompleteTime = rso.CompleteTime; isUpdate = true; } if (isUpdate) { _accountDA.UpdateStopOrder(stopOrder); } } else // соответствие есть, но локальный не найден, значит соответствие уже не действительно { _stoporder_rid_lid.Remove(rso.StopOrderID); // удаляем старое соответствие var so = _accountDA.CreateStopOrder(localAccountID, rso.Time, insID, rso.BuySell, rso.StopType, rso.EndTime, rso.AlertPrice, rso.Price, rso.LotCount, rso.Status, rso.CompleteTime, rso.StopOrderNo); _stoporder_rid_lid.Add(rso.StopOrderID, so.StopOrderID); } } else // соответствие не найдено { var so = _accountDA.CreateStopOrder(localAccountID, rso.Time, insID, rso.BuySell, rso.StopType, rso.EndTime, rso.AlertPrice, rso.Price, rso.LotCount, rso.Status, rso.CompleteTime, rso.StopOrderNo); _stoporder_rid_lid.Add(rso.StopOrderID, so.StopOrderID); } } }