Exemple #1
0
        /// <summary>
        /// Сохранение данных по всем сделкам для всех инструментов
        /// </summary>
        /// <param name="tickDispatcher">Диспетчер тиковых данных</param>
        /// <param name="sessionDbPath">Каталог данных текущей сессии (определяется датой)</param>
        public void SaveData(ITickDispatcher tickDispatcher, string sessionDbPath)
        {
            if (tickDispatcher == null)
            {
                throw new ArgumentNullException("tickDispatcher");
            }
            if (string.IsNullOrWhiteSpace(sessionDbPath))
            {
                throw new ArgumentException("SessionDbPath is empty, session not opened.");
            }

            _logger.AddInfo("AllTradesData", "Save data ...");
            try
            {
                var allTradesDir = Path.Combine(sessionDbPath, "AllTrades");

                if (!Directory.Exists(allTradesDir))
                {
                    Directory.CreateDirectory(allTradesDir);
                }

                var insIDs = tickDispatcher.GetInstrumIDs();
                foreach (var insID in insIDs)
                {
                    Instrum ins = _instrumTable.GetInstrum(insID);
                    if (ins == null)
                    {
                        continue;
                    }
                    var ticks = tickDispatcher.GetTicks(insID);
                    if (ticks == null || !ticks.Any())
                    {
                        continue;
                    }

                    var encoder = new AllTradesEncoder(ins.Decimals);
                    var persist = new AllTradesPersist();
                    persist.Initialize(allTradesDir, ins.Ticker);
                    _insStoreData.InitInsStores(insID);

                    foreach (Tick tick in ticks)
                    {
                        uint   seconds = (uint)(tick.Time.Hour * 60 * 60 + tick.Time.Minute * 60 + tick.Time.Second);
                        byte[] buf     = encoder.AddTick(seconds, tick.Price, tick.Lots);
                        persist.Write(buf);
                        _insStoreData.AddTick(insID, tick.Time, tick.Price, tick.Lots);
                    }
                    persist.Close();
                }
                _insStoreData.SaveData();
            }
            catch (Exception ex)
            {
                _logger.AddException("AllTradesData", ex);
            }
            _logger.AddInfo("AllTradesData", "Data saved");
        }
Exemple #2
0
        public PosManager(int insID, IInstrumTable instrums, IHoldingTable holdings, IOrderTable orders, IAccountTable accounts, AlorTradeWrapper alorTrade)
        {
            _holdings = holdings;
            _orders   = orders;
            _instrum  = instrums.GetInstrum(insID);
            if (_instrum == null)
            {
                throw new Exception("Инструмент не найден");
            }

            _account = accounts.GetDefaultAccount();
            if (_account == null)
            {
                throw new Exception("Не найден торговый счет");
            }

            _alorTrade = alorTrade;
        }
Exemple #3
0
        public void OnRecv(byte[] data)
        {
            if (data == null)
            {
                return;
            }

            string cmd = Encoding.UTF8.GetString(data);

            string[] args = Regex.Split(cmd, @"\s+");

            if (args.Length == 2 && args[0] == "GetLastPrices")
            {
                var tickers             = Regex.Split(args[1], @"\s*,\s*");
                List <LastPrice> prices = new List <LastPrice>();
                foreach (var t in tickers)
                {
                    var instrum = _instrumTable.GetInstrum(t);
                    if (instrum == null)
                    {
                        continue;
                    }

                    var tick = _tickDisp.GetLastTick(instrum.InsID);
                    if (tick.InsID == 0)
                    {
                        continue;                  // диспетчер вернул default value структуры Tick, значит тика еще нет
                    }
                    prices.Add(new LastPrice(instrum.Ticker, tick.Time, tick.Price, tick.Lots));
                }

                var json  = JsonConvert.SerializeObject(prices);
                var bytes = Encoding.UTF8.GetBytes(json);
                _core.SendResponseAsync(this, bytes).Wait();
            }

            if (args.Length == 3 && args[0] == "GetLastTicks")
            {
                var ticker  = args[1];
                var instrum = _instrumTable.GetInstrum(ticker);
                if (instrum == null)
                {
                    _core.SendResponseAsync(this, new byte[] { 0xff });
                    return;
                }

                int skip;
                if (!int.TryParse(args[2], out skip))
                {
                    _core.SendResponseAsync(this, new byte[] { 0xfe }).Wait();
                    return;
                }

                var ticks = _tickDisp.GetLastTicks(instrum.InsID, skip);
                if (ticks.Length == 0)
                {
                    _core.SendResponseAsync(this, new byte[] { 0x0 }).Wait();
                    return;
                }

                AllTradesEncoder encoder = new AllTradesEncoder(instrum.Decimals);
                using (MemoryStream ms = new MemoryStream())
                {
                    foreach (var tick in ticks)
                    {
                        uint   seconds = (uint)(tick.Time.Hour * 60 * 60 + tick.Time.Minute * 60 + tick.Time.Second);
                        byte[] buf     = encoder.AddTick(seconds, tick.Price, tick.Lots);
                        ms.Write(buf, 0, buf.Length);
                    }
                    _core.SendResponseAsync(this, ms.ToArray()).Wait();
                }
            }
        }
Exemple #4
0
        private void OnAddRow(int OpenID, int RowID, object Fields)
        {
            object[] fields = (object[])Fields;

            if (_all_trades_table != null && OpenID == _all_trades_table.ID)
            {
                if (RowID <= _allTrades_lastRowID)
                {
                    return;
                }
                _allTrades_lastRowID = RowID;

                string secboard = Convert.ToString(fields[5]).Trim();
                if (secboard != _secBoard)
                {
                    return;
                }

                string   ticker  = Convert.ToString(fields[6]).Trim();
                long     tradeNo = Convert.ToInt64(fields[2]);
                DateTime msktime = Convert.ToDateTime(fields[3]).AddHours(_addHours);
                if (msktime.TimeOfDay < _startSessionMskTime)
                {
                    msktime = new DateTime(msktime.Year, msktime.Month, msktime.Day, _startSessionMskTime.Hours, _startSessionMskTime.Minutes, _startSessionMskTime.Seconds);
                }
                if (msktime.TimeOfDay > _endSessionMskTime)
                {
                    msktime = new DateTime(msktime.Year, msktime.Month, msktime.Day, _endSessionMskTime.Hours, _endSessionMskTime.Minutes, _endSessionMskTime.Seconds);
                }

                int    lots  = Convert.ToInt32(fields[8]);
                double price = Convert.ToDouble(fields[9]);

                Common.Data.Instrum ins = _instrumTable.GetInstrum(ticker);
                if (ins == null)
                {
                    return;
                }

                _tickDispatcher.AddTick(new Tick(tradeNo, msktime, ins.InsID, lots, (decimal)price));
            }
            else if (_securities_table != null && OpenID == _securities_table.ID)
            {
                if (RowID <= _securities_lastRowID)
                {
                    return;
                }
                _securities_lastRowID = RowID;

                string secboard = Convert.ToString(fields[1]).Trim();
                if (secboard != _secBoard)
                {
                    return;
                }

                string  ticker    = Convert.ToString(fields[2]).Trim();
                string  name      = Convert.ToString(fields[3]).Trim();
                string  shortname = Convert.ToString(fields[4]).Trim();
                int     lotsize   = Convert.ToInt32(fields[13]);
                decimal pricestep = Convert.ToDecimal(fields[15]);
                int     decimals  = Convert.ToInt32(fields[17]);

                _instrumTable.SyncInstrum(ticker, shortname, name, lotsize, decimals, pricestep);
            }
            else if (_trdacc_table != null && OpenID == _trdacc_table.ID)
            {
                string account = Convert.ToString(fields[1]).Trim();
                string name    = Convert.ToString(fields[2]).Trim();
                _accountTable.AddAccount(account, name);
            }
            else if (_orders_table != null && OpenID == _orders_table.ID)
            {
                var ticker = Convert.ToString(fields[21]).Trim();
                var ins    = _instrumTable.GetInstrum(ticker);
                if (ins == null)
                {
                    return;
                }

                string accCode = Convert.ToString(fields[19]).Trim();
                var    acc     = _accountTable.GetAccount(accCode);
                if (acc == null)
                {
                    return;
                }

                Order order = new Order();
                order.OrderNo   = Convert.ToInt64(fields[1]);
                order.Time      = Convert.ToDateTime(fields[3]).AddHours(_addHours);
                order.InsID     = ins.InsID;
                order.AccountID = acc.AccountID;

                var bs = Convert.ToString(fields[12]).Trim();
                order.BuySell = bs == "B" ? BuySell.Buy : BuySell.Sell;

                order.LotCount = Convert.ToInt32(fields[25]);

                order.Price = Convert.ToDecimal(fields[23]);
                if (order.Price == 0)
                {
                    order.Price = null;
                }

                var status = Convert.ToString(fields[10]).Trim();
                if (status == "M")
                {
                    order.Status = OrderStatus.Trade;
                }
                else if (status == "C")
                {
                    order.Status = OrderStatus.EndTime;
                }
                else if (status == "N")
                {
                    order.Status = OrderStatus.Reject;
                }
                else if (status == "W")
                {
                    order.Status = OrderStatus.Remove;
                }
                else
                {
                    order.Status = OrderStatus.Active; // A, O
                }
                _orderTable.AddOrder(order);
            }
            else if (_stoporders_table != null && OpenID == _stoporders_table.ID)
            {
                string secboard = Convert.ToString(fields[4]).Trim();
                if (secboard != _secBoard)
                {
                    return;
                }

                var ticker = Convert.ToString(fields[5]).Trim();
                var ins    = _instrumTable.GetInstrum(ticker);
                if (ins == null)
                {
                    return;
                }

                string accCode = Convert.ToString(fields[21]).Trim();
                var    acc     = _accountTable.GetAccount(accCode);
                if (acc == null)
                {
                    return;
                }

                StopOrder so = new StopOrder();
                so.StopOrderNo = Convert.ToInt64(fields[3]);
                so.Time        = Convert.ToDateTime(fields[1]).AddHours(_addHours);
                so.InsID       = ins.InsID;
                so.AccountID   = acc.AccountID;

                var bs = Convert.ToString(fields[6]).Trim();
                so.BuySell = bs == "B" ? BuySell.Buy : BuySell.Sell;

                var st = Convert.ToString(fields[10]).Trim();
                so.StopType = StopOrderType.TakeProfit;
                if (st == "L")
                {
                    so.StopType = StopOrderType.StopLoss;
                }
                else if (st == "P")
                {
                    so.StopType = StopOrderType.TakeProfit;
                }

                so.AlertPrice = Convert.ToDecimal(fields[13]);

                so.Price = Convert.ToDecimal(fields[14]);
                if (so.Price == 0)
                {
                    so.Price = null;
                }

                so.LotCount = Convert.ToInt32(fields[15]);
                var status = Convert.ToString(fields[18]).Trim();
                if (status == "M")
                {
                    so.Status = StopOrderStatus.Order;
                }
                else if (status == "E")
                {
                    so.Status = StopOrderStatus.EndTime;
                }
                else if (status == "R")
                {
                    so.Status = StopOrderStatus.Reject;
                }
                else if (status == "W")
                {
                    so.Status = StopOrderStatus.Remove;
                }
                else
                {
                    so.Status = StopOrderStatus.Active; // A, O, space
                }
                so.EndTime = (DateTime?)fields[11];     // если время не указать, то сначала оно будет null, а потом сработает update, поменяется статус на Активный и время завершения установится на конец торговой сессии
                if (so.EndTime != null)
                {
                    so.EndTime = so.EndTime.Value.AddHours(_addHours);
                }
                _stopOrderTable.AddStopOrder(so, GetCurrentTime());
            }
            else if (_trades_table != null && OpenID == _trades_table.ID)
            {
                var ticker = Convert.ToString(fields[6]).Trim();
                var ins    = _instrumTable.GetInstrum(ticker);
                if (ins == null)
                {
                    return;
                }

                string accCode = Convert.ToString(fields[29]).Trim();
                var    acc     = _accountTable.GetAccount(accCode);
                if (acc == null)
                {
                    return;
                }

                long  orderNo = Convert.ToInt64(fields[2]);
                Order order   = _orderTable.GetOrder(orderNo);
                if (order == null)
                {
                    return;
                }

                Trade trade = new Trade();
                trade.TradeNo   = Convert.ToInt64(fields[1]);
                trade.OrderID   = order.OrderID;
                trade.Time      = Convert.ToDateTime(fields[3]).AddHours(_addHours);
                trade.InsID     = ins.InsID;
                trade.AccountID = acc.AccountID;
                var bs = Convert.ToString(fields[8]).Trim();
                trade.BuySell  = bs == "B" ? BuySell.Buy : BuySell.Sell;
                trade.LotCount = Convert.ToInt32(fields[9]);
                trade.Price    = Convert.ToDecimal(fields[10]);

                _tradeTable.AddTrade(trade);
            }
            else if (_holding_table != null && OpenID == _holding_table.ID)
            {
                var ticker = Convert.ToString(fields[5]).Trim();
                var ins    = _instrumTable.GetInstrum(ticker);
                if (ins == null)
                {
                    return;
                }

                var acc = _accountTable.GetDefaultAccount();
                if (acc == null)
                {
                    return;
                }

                int lots = Convert.ToInt32(fields[8]);
                _holdingTable.SetHolding(acc.AccountID, ins.InsID, lots);
            }
            else if (_positions_table != null && OpenID == _positions_table.ID)
            {
                string accCode = Convert.ToString(fields[2]).Trim();
                var    acc     = _accountTable.GetAccount(accCode);
                if (acc == null)
                {
                    return;
                }

                double  pos    = Convert.ToDouble(fields[11]);
                decimal curPos = (decimal)pos;
                _positionTable.SetPosition(acc.AccountID, curPos);
            }
        }
Exemple #5
0
 public IInstrum GetInstrum(string ticker)
 {
     return(_instrumTable.GetInstrum(ticker));
 }