/// <summary> /// Полная синхронизация сделок /// </summary> private async Task SyncTradesFull(ISyncPipeServer sps, int localAccountID, int remoteAccountID) { var remTrades = await sps.GetTrades(remoteAccountID, 0); if (remTrades == null) { return; } var trades = _accountDA.GetTrades(localAccountID); foreach (var rtrd in remTrades) { int insID = 0; // пытаемся сопоставить инструмент if (_instrum_rid_lid.ContainsKey(rtrd.InsID)) { insID = _instrum_rid_lid[rtrd.InsID]; } if (insID == 0) { continue; // если не смогли сопоставить инструмент, то ничего больше сделать не можем } int orderID = 0; // пытаемся сопоставить заявку if (_order_rid_lid.ContainsKey(rtrd.OrderID)) { orderID = _order_rid_lid[rtrd.OrderID]; } if (orderID == 0) { continue; // если не смогли сопоставить заявку, то ничего больше сделать не можем } if (_trade_rid_lid.ContainsKey(rtrd.TradeID)) { int lid = _trade_rid_lid[rtrd.TradeID]; var trade = trades.FirstOrDefault(r => r.TradeID == lid); if (trade == null) // локальный не найден { _trade_rid_lid.Remove(rtrd.TradeID); // удаляем старое соответствие var trd = _accountDA.CreateTrade(localAccountID, orderID, rtrd.Time, insID, rtrd.BuySell, rtrd.LotCount, rtrd.Price, rtrd.Comm, rtrd.TradeNo); _trade_rid_lid.Add(rtrd.TradeID, trd.TradeID); } } else // соответствие не найдено { var trd = _accountDA.CreateTrade(localAccountID, orderID, rtrd.Time, insID, rtrd.BuySell, rtrd.LotCount, rtrd.Price, rtrd.Comm, rtrd.TradeNo); _trade_rid_lid.Add(rtrd.TradeID, trd.TradeID); } } }
public void PosTrades() { var order = _accountDA.CreateOrder(_accountID, DateTime.Today, _gazpID, Platform.BuySell.Buy, 1, null, Platform.OrderStatus.Active, null, 0); var trade = _accountDA.CreateTrade(_accountID, order.OrderID, DateTime.Today, _gazpID, Platform.BuySell.Buy, 1, 100, 0, 0); var newTrades = _positionDA.GetNewTrades(_accountID); if (!newTrades.Any(r => r.TradeID == trade.TradeID)) { throw new Exception(); // должен быть такой trade } var openPos = _positionDA.CreatePosition(_accountID, _gazpID, Common.Data.PosTypes.Long, DateTime.Today, 100, 10, null, null); var closePos = _positionDA.CreatePosition(_accountID, _gazpID, Common.Data.PosTypes.Long, DateTime.Today, 100, 10, DateTime.Today, 100); _positionDA.AddPosTrade(openPos.PosID, trade.TradeID); _positionDA.AddPosTrade(closePos.PosID, trade.TradeID); var posTrades = _positionDA.GetOpenPosTrades(_accountID); // только открытые int c1 = posTrades.Count(r => r.PosID == openPos.PosID && r.TradeID == trade.TradeID); // =1 int c2 = posTrades.Count(r => r.PosID == closePos.PosID && r.TradeID == trade.TradeID); // =0 if (c1 != 1) { throw new Exception(); } if (c2 != 0) { throw new Exception(); } newTrades = _positionDA.GetNewTrades(_accountID); if (newTrades.Any(r => r.TradeID == trade.TradeID)) { throw new Exception(); // не должно быть такого trade, поскольку есть записи posTrades } }
/// <summary> /// Создание сделок при импорте /// </summary> /// <param name="accountID">Торговый счет</param> /// <param name="trades">Список сделок, которые нужно создать</param> /// <returns>Список созданных сделок (может отличаться от исходного списка)</returns> private IEnumerable <Trade> CreateTrades(int accountID, IEnumerable <Trade> trades) { sb.AppendLine("Create trades ..."); var db_trades = _accountDA.GetTrades(accountID); List <Trade> createTrades = new List <Trade>(); foreach (var trade in trades) { var found = db_trades.FirstOrDefault(r => r.BuySell == trade.BuySell && r.InsID == trade.InsID && r.LotCount == trade.LotCount && r.Price == trade.Price && r.Time == trade.Time); if (found != null) { var instrum = _instrumBL.GetInstrumByID(trade.InsID); if (instrum == null) { continue; } sb.AppendLine(string.Format("Trade already exists: {0} {1} {2} {3} {4}", instrum.Ticker, trade.Time.ToString("dd.MM.yyyy HH:mm:ss"), trade.BuySell, trade.Price.ToString(), trade.LotCount.ToString())); continue; } var order = _accountDA.CreateOrder(accountID, trade.Time, trade.InsID, trade.BuySell, trade.LotCount, trade.Price, OrderStatus.Trade, null, 0); var newTrade = _accountDA.CreateTrade(accountID, order.OrderID, trade.Time, trade.InsID, trade.BuySell, trade.LotCount, trade.Price, 0, 0); createTrades.Add(newTrade); } sb.AppendLine("Create trades complete: " + createTrades.Count.ToString()); return(createTrades); }
/// <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); } }