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; } }