Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
                }
            }
        }
Ejemplo n.º 4
0
        /// <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();
        }
Ejemplo n.º 5
0
        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);
                }
            }));
        }
Ejemplo n.º 6
0
 /// <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));
 }