private async void createNewSetting(string SecCode, DateTime lastDT)
        {
            if (stockID == 0)
            {
                stockID = (from s in dbStocks
                           where s.ticker == SecCode
                           select s.id).FirstOrDefault();
            }

            bool found = false;

            DateTime lastCandleTime = DateTime.MinValue;

            if (lastDateTimeSetting.TryGetValue(SecCode, out lastCandleTime) == false)
            {
                // начальная установка даты и времени отсчета
                lastCandleTime = lastDT;
                lastDT         = firstTickDt;          // ставим на начало сессии

                lastDateTimeSetting[SecCode] = lastDT; // сохраняем!
            }

            SettingDataElement lastEl2 = new SettingDataElement(SecCode, lastDT);

            lock (SettingVector)
            {
                Dictionary <DateTime, SettingDataElement> settings = new Dictionary <DateTime, SettingDataElement>();
                lock (settings)
                {
                    if (SettingVector.TryGetValue(SecCode, out settings) == false) // ищем по текущему Коду SecCode есть ли уже значение settings оно одно для каждого элемента
                    {
                        settings = new Dictionary <DateTime, SettingDataElement>();
                        SettingDataElement sde = new SettingDataElement(SecCode, lastDT);
                        settings[lastDT]       = sde;
                        SettingVector[SecCode] = settings;
                    }
                    else
                    {
                        if (settings.TryGetValue(lastCandleTime, out lastEl2) == true)
                        {
                            found = true;
                        }

                        SettingDataElement sde = new SettingDataElement(SecCode, lastDT);
                        settings[lastDT]       = sde;
                        SettingVector[SecCode] = settings;
                    }
                }
            }

            lastDateTimeSetting[SecCode] = lastDT; // сохраняем!

            if (found)
            {
                lastEl2.DateTime = lastCandleTime; // будет одной временной точкой
                await saveSettingElementToDB(lastEl2);
            }
        }
        private Task saveSettingElementToDB(SettingDataElement element)
        {
            return(Task.Run(() =>
            {
                if (element.MatDate == null)
                {
                    return;
                }

                lock (contextSet)
                {
                    //Int64 stockID = (from s in dbStocks
                    //                 where s.ticker == element.SecCode
                    //                 select s.id).FirstOrDefault();
                    //if (stockID == 0)
                    //{
                    //    stocks ns = new stocks();
                    //    ns.ticker = element.SecCode;
                    //    ns.enddate = null;
                    //    ns.pricestep = 50;
                    //    ns.active = true;
                    //    contextSet.stocks.InsertOnSubmit(ns);
                    //    contextSet.SubmitChanges();

                    //    dbStocks = from s in contextSet.stocks
                    //               where s.active == true
                    //               select s;
                    //    stockID = (from s in dbStocks
                    //               where s.ticker == element.SecCode
                    //               select s.id).FirstOrDefault();
                    //}

                    settingquotes nq = new settingquotes();

                    nq.stock = stockID;
                    nq.timeframe = currentTimeFrameId;
                    nq.datetime = element.DateTime;

                    nq.seccode = element.SecCode;                     // код бумаги
                    nq.classcode = element.ClassCode;                 // код класса
                    nq.classname = element.ClassName;                 // класс бумаги
                    nq.optionbase = element.OptionBase;               // +1 базовый актив опциона
                    nq.matdate = element.MatDate;                     // +1 дата погашения
                    nq.daystomatdate = element.DaysToMatDate;         // дней до погашения

                    nq.numbidsopen = element.NumbidsOpen;             // количество заявкок на покупку
                    nq.numbidshigh = element.NumbidsHigh;             // количество заявкок на покупку
                    nq.numbidslow = element.NumbidsLow;               // количество заявкок на покупку
                    nq.numbidsclose = element.NumbidsClose;           // количество заявкок на покупку

                    nq.numoffersopen = element.NumoffersOpen;         // количество заявок на продажу
                    nq.numoffershigh = element.NumoffersHigh;         // количество заявок на продажу
                    nq.numofferslow = element.NumoffersLow;           // количество заявок на продажу
                    nq.numoffersclose = element.NumoffersClose;       // количество заявок на продажу

                    nq.biddepthtopen = element.BiddepthtOpen;         // суммарный спрос контрактов
                    nq.biddepththigh = element.BiddepthtHigh;         // суммарный спрос контрактов
                    nq.biddepthtlow = element.BiddepthtLow;           // суммарный спрос контрактов
                    nq.biddepthtclose = element.BiddepthtClose;       // суммарный спрос контрактов

                    nq.offerdepthtopen = element.OfferdepthtOpen;     // суммарное предложение контрактов
                    nq.offerdepththigh = element.OfferdepthtHigh;     // суммарное предложение контрактов
                    nq.offerdepthtlow = element.OfferdepthtLow;       // суммарное предложение контрактов
                    nq.offerdepthtclose = element.OfferdepthtClose;   // суммарное предложение контрактов

                    nq.voltoday = element.Voltoday;                   // количество во всех сделках
                    nq.valtoday = element.Valtoday;                   // текущий оборот в деньгах
                    nq.numtrades = element.Numtrades;                 // количество сделок за сегодня

                    nq.numcontractsopen = element.NumcontractsOpen;   // количество открытых позиций (Открытый Интерес)
                    nq.numcontractshigh = element.NumcontractsHigh;   // количество открытых позиций (Открытый Интерес)
                    nq.numcontractslow = element.NumcontractsLow;     // количество открытых позиций (Открытый Интерес)
                    nq.numcontractsclose = element.NumcontractsClose; // количество открытых позиций (Открытый Интерес)

                    nq.selldepo = element.Selldepo;                   // ГО продавца
                    nq.buydepo = element.Buydepo;                     // ГО покупателя
                    nq.strike = element.Strike;                       // +1 цена страйк
                    nq.optiontype = element.OptionType;               // +1 тип опциона CALL PUT
                    nq.volatility = element.Volatility;               // +1 волатильность опциона


                    contextSet.settingquotes.InsertOnSubmit(nq);
                    contextSet.SubmitChanges();
                }
            }));
        }
        // **********************************************************************

        public override void ProcessSetting(Setting setting)
        {
            if (setting.DateTime < firstTickDt)
            {
                return;
            }

            lock (SettingVector)
            {
                string SecCode = setting.SecCode;

                DateTime lastDT = DateTime.MinValue;
                if (lastDateTimeSetting.TryGetValue(SecCode, out lastDT) == false)
                {
                    // начальная установка даты и времени отсчета
                    lastDT = setting.DateTime;
                }

                Dictionary <DateTime, SettingDataElement> settings = new Dictionary <DateTime, SettingDataElement>();
                if (SettingVector.TryGetValue(SecCode, out settings) == false)
                {
                    createNewSetting(SecCode, lastDT);

                    SettingVector.TryGetValue(SecCode, out settings);
                }

                SettingDataElement sde = new SettingDataElement(SecCode, lastDT);
                settings.TryGetValue(lastDT, out sde);

                // если время больше XXX мин, делаем новую группу
                long csTicks = currentTimeFrame * TimeSpan.TicksPerSecond;
                if (setting.DateTime.Ticks - lastDT.Ticks >= csTicks)
                { // новая группа
                    lastDT = setting.DateTime;
                    createNewSetting(SecCode, lastDT);
                    settings.TryGetValue(lastDT, out sde);
                }

                sde.ClassCode     = setting.ClassCode;     // код класса
                sde.ClassName     = setting.ClassName;     // класс бумаги
                sde.OptionBase    = setting.OptionBase;    // +1 базовый актив опциона
                sde.MatDate       = setting.MatDate;       // +1 дата погашения
                sde.DaysToMatDate = setting.DaysToMatDate; // дней до погашения

                if (sde.NumbidsOpen == 0)
                {
                    sde.NumbidsOpen = setting.Numbids;
                }
                if (sde.NumbidsHigh == 0)
                {
                    sde.NumbidsHigh = setting.Numbids;
                }
                else
                if (sde.NumbidsHigh < setting.Numbids)
                {
                    sde.NumbidsHigh = setting.Numbids;
                }
                if (sde.NumbidsLow == 0)
                {
                    sde.NumbidsLow = setting.Numbids;
                }
                else
                if (sde.NumbidsLow > setting.Numbids)
                {
                    sde.NumbidsLow = setting.Numbids;
                }
                sde.NumbidsClose = setting.Numbids;

                if (sde.NumoffersOpen == 0)
                {
                    sde.NumoffersOpen = setting.Numoffers;
                }
                if (sde.NumoffersHigh == 0)
                {
                    sde.NumoffersHigh = setting.Numoffers;
                }
                else
                if (sde.NumoffersHigh < setting.Numoffers)
                {
                    sde.NumoffersHigh = setting.Numoffers;
                }
                if (sde.NumoffersLow == 0)
                {
                    sde.NumoffersLow = setting.Numoffers;
                }
                else
                if (sde.NumoffersLow > setting.Numoffers)
                {
                    sde.NumoffersLow = setting.Numoffers;
                }
                sde.NumoffersClose = setting.Numoffers;

                if (sde.BiddepthtOpen == 0)
                {
                    sde.BiddepthtOpen = setting.Biddeptht;
                }
                if (sde.BiddepthtHigh == 0)
                {
                    sde.BiddepthtHigh = setting.Biddeptht;
                }
                else
                if (sde.BiddepthtHigh < setting.Biddeptht)
                {
                    sde.BiddepthtHigh = setting.Biddeptht;
                }
                if (sde.BiddepthtLow == 0)
                {
                    sde.BiddepthtLow = setting.Biddeptht;
                }
                else
                if (sde.BiddepthtLow > setting.Biddeptht)
                {
                    sde.BiddepthtLow = setting.Biddeptht;
                }
                sde.BiddepthtClose = setting.Biddeptht;

                if (sde.OfferdepthtOpen == 0)
                {
                    sde.OfferdepthtOpen = setting.Offerdeptht;
                }
                if (sde.OfferdepthtHigh == 0)
                {
                    sde.OfferdepthtHigh = setting.Offerdeptht;
                }
                else
                if (sde.OfferdepthtHigh < setting.Offerdeptht)
                {
                    sde.OfferdepthtHigh = setting.Offerdeptht;
                }
                if (sde.OfferdepthtLow == 0)
                {
                    sde.OfferdepthtLow = setting.Offerdeptht;
                }
                else
                if (sde.OfferdepthtLow > setting.Offerdeptht)
                {
                    sde.OfferdepthtLow = setting.Offerdeptht;
                }
                sde.OfferdepthtClose = setting.Offerdeptht;

                sde.Voltoday  = setting.Voltoday;  // количество во всех сделках
                sde.Valtoday  = setting.Valtoday;  // текущий оборот в деньгах
                sde.Numtrades = setting.Numtrades; // количество сделок за сегодня

                if (sde.NumcontractsOpen == 0)
                {
                    sde.NumcontractsOpen = setting.Numcontracts;
                }
                if (sde.NumcontractsHigh == 0)
                {
                    sde.NumcontractsHigh = setting.Numcontracts;
                }
                else
                if (sde.NumcontractsHigh < setting.Numcontracts)
                {
                    sde.NumcontractsHigh = setting.Numcontracts;
                }
                if (sde.NumcontractsLow == 0)
                {
                    sde.NumcontractsLow = setting.Numcontracts;
                }
                else
                if (sde.NumcontractsLow > setting.Numcontracts)
                {
                    sde.NumcontractsLow = setting.Numcontracts;
                }
                sde.NumcontractsClose = setting.Numcontracts;

                sde.Selldepo   = setting.Selldepo;   // ГО продавца
                sde.Buydepo    = setting.Buydepo;    // ГО покупателя
                sde.Strike     = setting.Strike;     // +1 цена страйк
                sde.OptionType = setting.OptionType; // +1 тип опциона CALL PUT
                sde.Volatility = setting.Volatility; // +1 волатильность опциона

                settings[lastDT]       = sde;
                SettingVector[SecCode] = settings;
            }
        }