/// <summary> /// Сохранить все данные по торговому счету /// </summary> public void SaveData() { if (_account.AccountID <= 0) { _account = _accountDA.CreateAccount(_account.Code, _account.Name, _account.CommPerc, _account.IsShortEnable, _account.AccountType); _cash.AccountID = _account.AccountID; foreach (Holding holding in _holdings) { holding.AccountID = _account.AccountID; } foreach (Order order in _orders) { order.AccountID = _account.AccountID; } foreach (StopOrder stopOrder in _stopOrders) { stopOrder.AccountID = _account.AccountID; } foreach (Trade trade in _trades) { trade.AccountID = _account.AccountID; } } else { _accountDA.UpdateAccount(_account); } if (_cash.CashID <= 0) { _cash = _accountDA.CreateCash(_cash.AccountID, _cash.Initial, _cash.Current, _cash.Sell, _cash.Buy, _cash.SellComm, _cash.BuyComm); } else { _accountDA.UpdateCash(_cash); } foreach (var holding in _holdings) { if (holding.HoldingID <= 0) { _accountDA.CreateHolding(holding.AccountID, holding.InsID, holding.LotCount); } else { _accountDA.UpdateHolding(holding); // holdings всегда обновляем, так проще } } var createStopOrders = _stopOrders.Where(r => r.StopOrderID <= 0).ToList(); _stopOrders.RemoveAll(r => r.StopOrderID <= 0); foreach (var so in _stopOrders) { if (_modifiedStopOrders.Contains(so)) { _accountDA.UpdateStopOrder(so); } } _modifiedStopOrders.Clear(); foreach (var so in createStopOrders) { var newSo = _accountDA.CreateStopOrder(so.AccountID, so.Time, so.InsID, so.BuySell, so.StopType, so.EndTime, so.AlertPrice, so.Price, so.LotCount, so.Status, so.CompleteTime, so.StopOrderNo); _stopOrders.Add(newSo); var orders = _orders.Where(r => r.StopOrderID == so.StopOrderID).ToList(); foreach (var ord in orders) { ord.StopOrderID = newSo.StopOrderID; if (ord.OrderID > 0) { MarkAsModified(ord); } } } var createOrders = _orders.Where(r => r.OrderID <= 0).ToList(); _orders.RemoveAll(r => r.OrderID <= 0); foreach (var order in _orders) { if (_modifiedOrders.Contains(order)) { _accountDA.UpdateOrder(order); } } _modifiedOrders.Clear(); foreach (var ord in createOrders) { var newOrd = _accountDA.CreateOrder(ord.AccountID, ord.Time, ord.InsID, ord.BuySell, ord.LotCount, ord.Price, ord.Status, ord.StopOrderID, ord.OrderNo); _orders.Add(newOrd); var trades = _trades.Where(r => r.OrderID == ord.OrderID).ToList(); foreach (var trd in trades) { trd.OrderID = newOrd.OrderID; } } var newTrades = _trades.Where(r => r.TradeID <= 0).ToList(); _trades.RemoveAll(r => r.TradeID <= 0); foreach (var nt in newTrades) { var t = _accountDA.CreateTrade(nt.AccountID, nt.OrderID, nt.Time, nt.InsID, nt.BuySell, nt.LotCount, nt.Price, nt.Comm, nt.TradeNo); _trades.Add(t); } }
/// <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); } } }