Exemple #1
0
 /// <summary>
 /// Сохранение данных фин. инструмента в базе
 /// </summary>
 /// <param name="ins">Фин. инструмент</param>
 public void SaveInstrum(CommonData.Instrum ins)
 {
     if (ins.InsID > 0)
     {
         _instrumDA.UpdateInstrum(ins.InsID, ins.Ticker, ins.ShortName, ins.Name, ins.LotSize, ins.Decimals, ins.PriceStep);
     }
     else
     {
         ins.InsID = _instrumDA.InsertInstrum(ins.Ticker, ins.ShortName, ins.Name, ins.LotSize, ins.Decimals, ins.PriceStep);
     }
 }
Exemple #2
0
        public PositionTest()
        {
            DbContextOptionsBuilder <DaContext> builder = new DbContextOptionsBuilder <DaContext>();

            builder.UseNpgsql("Username=postgres;Password=123;Host=localhost;Port=5432;Database=pulxer_test");
            _options = builder.Options;

            _insDA      = new InstrumDA(_options);
            _accountDA  = new AccountDA(_options);
            _positionDA = new PositionDA(_options);

            // создание
            var gazp = _insDA.GetInstrum(0, "GAZP");

            if (gazp == null)
            {
                _gazpID = _insDA.InsertInstrum("GAZP", "Газпром", "Газпром", 10, 2, 1);
            }
            else
            {
                _gazpID = gazp.InsID;
            }

            var lkoh = _insDA.GetInstrum(0, "LKOH");

            if (lkoh == null)
            {
                _lkohID = _insDA.InsertInstrum("LKOH", "Лукойл", "Лукойл", 1, 0, 0);
            }
            else
            {
                _lkohID = lkoh.InsID;
            }

            _accountID = _accountDA.CreateAccount("", "", 0, false, Common.Data.AccountTypes.Test).AccountID;
        }
Exemple #3
0
 /// <summary>
 /// Синхронизировать фин. инструмент (изменить или создать новый)
 /// </summary>
 /// <param name="ticker">Тикер</param>
 /// <param name="shortname">Краткое наименование</param>
 /// <param name="name">Полное наименование</param>
 /// <param name="lotsize">Размер лота</param>
 /// <param name="decimals">Кол-во десятичных знаков после запятой в цене</param>
 /// <param name="pricestep">Шаг цены</param>
 /// <returns>Фин. инструмент после синхронизации</returns>
 public Instrum SyncInstrum(string ticker, string shortname, string name, int lotsize, int decimals, decimal pricestep)
 {
     if (!_ticker_instrum.ContainsKey(ticker))
     {
         Instrum db_ins = _da.GetInstrum(0, ticker);
         if (db_ins == null)
         {
             var ins = new Instrum
             {
                 InsID     = 0,
                 Ticker    = ticker,
                 ShortName = shortname,
                 Name      = name,
                 LotSize   = lotsize,
                 Decimals  = decimals,
                 PriceStep = pricestep
             };
             _da.InsertInstrum(ins);
             _ticker_instrum.Add(ticker, ins);
             _insID_instrum.Add(ins.InsID, ins);
             return(ins);
         }
         else
         {
             UpdateInstrum(db_ins, shortname, name, lotsize, decimals, pricestep);
             _ticker_instrum.Add(ticker, db_ins);
             _insID_instrum.Add(db_ins.InsID, db_ins);
             return(db_ins);
         }
     }
     else
     {
         var ins = _ticker_instrum[ticker];
         UpdateInstrum(ins, shortname, name, lotsize, decimals, pricestep);
         return(ins);
     }
 }
Exemple #4
0
        /// <summary>
        /// Синхронизация фин инструментов
        /// </summary>
        private async Task SyncInstrums(ISyncPipeServer sps)
        {
            var remInstrums = await sps.GetInstrumList();

            if (remInstrums == null)
            {
                return;
            }

            var instrums = _instrumDA.GetInstrums();

            foreach (var rIns in remInstrums)
            {
                if (_instrum_rid_lid.ContainsKey(rIns.InsID))
                {
                    int lid = _instrum_rid_lid[rIns.InsID];
                    var ins = instrums.FirstOrDefault(r => r.InsID == lid);
                    if (ins != null) // локальный найден
                    {
                        if (ins.Ticker != rIns.Ticker ||
                            ins.ShortName != rIns.ShortName ||
                            ins.Name != rIns.Name ||
                            ins.LotSize != rIns.LotSize ||
                            ins.Decimals != rIns.Decimals ||
                            ins.PriceStep != rIns.PriceStep)
                        {
                            _instrumDA.UpdateInstrum(ins.InsID, rIns.Ticker, rIns.ShortName, rIns.Name,
                                                     rIns.LotSize, rIns.Decimals, rIns.PriceStep);
                        }
                    }
                    else // соответствие есть, но локальный не найден, значит соответствие уже не действительно
                    {
                        int insID = _instrumDA.InsertInstrum(
                            rIns.Ticker,
                            rIns.ShortName,
                            rIns.Name,
                            rIns.LotSize,
                            rIns.Decimals,
                            rIns.PriceStep);
                        _instrum_rid_lid[rIns.InsID] = insID; // прописываем новый ключ
                    }
                }
                else // соответствие не найдено
                {
                    int insID = _instrumDA.InsertInstrum(
                        rIns.Ticker,
                        rIns.ShortName,
                        rIns.Name,
                        rIns.LotSize,
                        rIns.Decimals,
                        rIns.PriceStep);
                    _instrum_rid_lid.Add(rIns.InsID, insID);
                }
            }

            // отследим ситуацию, когда удаленный объект удален, а локальный остался
            // если локальный объект есть, а репликации для него нет, то значит этот объект не реплицировался и мы его не трогаем
            // если локальный объект есть и репликация для него есть, то мы смотрим remote-объект
            // если remote-объект есть, то здесь ничего не делаем (эту ситуацию мы обработали выше)
            // если remote-объекта нет, то локальный объект НЕ удаляем и не меняем, а просто удаляем для него репликацию
            // удалить локальный объект нельзя, т.к. на него могут быть ссылки, т.е. он остается, но больше не будет реплицироваться
            // если в удаленной базе объект снова возникнет под прежним id (что вряд-ли возможно),
            // то локально будет создан новый объект, а старый также останется
            foreach (var ins in instrums)
            {
                if (!_instrum_rid_lid.ContainsValue(ins.InsID))
                {
                    continue;                                                           // запись не реплицировалась и мы ее пропускаем
                }
                var repl  = _instrum_rid_lid.FirstOrDefault(r => r.Value == ins.InsID); // обязательно будет не null
                var found = remInstrums.FirstOrDefault(r => r.InsID == repl.Key);
                if (found == null)                                                      // соответствующей remote-записи нет, значит локальную запись удаляем и убираем для нее репликацию
                {
                    _instrum_rid_lid.Remove(repl.Key);
                }
            }
        }