Example #1
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);
                }
            }
        }
Example #2
0
        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
            }
        }
Example #3
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);
        }
Example #4
0
        /// <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);
            }
        }