public bool AddTrade(Trade trade) { var db_trade = _da.GetTrades(trade.AccountID, trade.Time.Date, 0) .FirstOrDefault(t => t.TradeNo == trade.TradeNo); if (db_trade == null) { _da.InsertTrade(trade); } return(true); }
/// <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> 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); } } }
/// <summary> /// Загрузить все данные по торговому счету /// </summary> /// <param name="accountID">Торговый счет</param> public void LoadData(int accountID) { _account = _accountDA.GetAccountByID(accountID); if (_account == null) { throw new ApplicationException("Счет не найден."); } _cash = _accountDA.GetCash(accountID); if (_cash == null) { _cash = new Cash(); _cash.AccountID = accountID; } _holdings = _accountDA.GetHoldings(accountID).ToList(); _orders = _accountDA.GetOrders(accountID).ToList(); _stopOrders = _accountDA.GetStopOrders(accountID).ToList(); _trades = _accountDA.GetTrades(accountID).ToList(); }
public Task Generate(int accountID, Timeline timeline) { return(Task.Run(() => { _cashRow.Clear(); _portfolioRow.Clear(); _equityRow.Clear(); _prices.Clear(); var trades = _accountDA.GetTrades(accountID).OrderBy(r => r.Time).ToList(); var account = _accountDA.GetAccountByID(accountID); var cash = _accountDA.GetCash(accountID); List <EqHold> eqHoldList = new List <EqHold>(); decimal cashSumma = cash.Initial; decimal pfSumma = 0; var bd1 = timeline.GetBarDate(0); var bd2 = timeline.GetBarDate(timeline.Count - 1); if (bd1 == null || bd2 == null) { return; } DateTime date1 = bd1.Value.Start.Date; DateTime date2 = bd2.Value.NextStart.Date; // для таймфреймов day и week загрузим историю на один лишний день int tradeIdx = 0; for (int i = 0; i < timeline.Count; i++) { var barDates = timeline.GetBarDate(i); if (barDates == null) { continue; } while (tradeIdx < trades.Count && trades[tradeIdx].Time < barDates.Value.NextStart) { var trade = trades[tradeIdx]; var instrum = _instrumBL.GetInstrumByID(trade.InsID); // из кеша var tradeSumma = trade.Price * trade.LotCount * instrum.LotSize; var hold = eqHoldList.FirstOrDefault(r => r.InsID == instrum.InsID); if (trade.BuySell == BuySell.Buy) { cashSumma -= tradeSumma; if (hold != null) { hold.LotCount += trade.LotCount; } else { eqHoldList.Add(new EqHold() { InsID = instrum.InsID, LotSize = instrum.LotSize, LotCount = trade.LotCount }); } } else { cashSumma += tradeSumma; if (hold != null) { hold.LotCount -= trade.LotCount; if (hold.LotCount == 0) { eqHoldList.Remove(hold); } } else { eqHoldList.Add(new EqHold() { InsID = instrum.InsID, LotSize = instrum.LotSize, LotCount = -trade.LotCount }); } } tradeIdx++; } // вычисляем сумму портфеля на конец бара pfSumma = 0; foreach (var hold in eqHoldList) { if (!_prices.ContainsKey(hold.InsID)) { BarRow barRow = new BarRow(timeline.Timeframe, hold.InsID); _insStoreBL.LoadHistoryAsync(barRow, hold.InsID, date1, date2).Wait(); _prices.Add(hold.InsID, barRow); } var bars = _prices[hold.InsID]; var bar = bars.Bars.FirstOrDefault(r => r.Time == barDates.Value.Start); if (bar != null) { pfSumma += bar.Close * hold.LotCount * hold.LotSize; } } _cashRow.Add(cashSumma); _portfolioRow.Add(pfSumma); _equityRow.Add(cashSumma + pfSumma); } })); }
/// <summary> /// Получить список сделок по счету /// </summary> /// <param name="accountID">Торговый счет</param> /// <param name="fromID">Начиная с указанного ID или все (null)</param> /// <returns>Список сделок</returns> public IEnumerable <Trade> GetTrades(int accountID, int?fromID = null) { return(_accountDA.GetTrades(accountID, fromID)); }