public void loadTrades() { var dataStorage = storage.GetTradeStorage(security, null, StorageFormats.Csv); // trades=dataStorage.Load(new DateTime(2017, 2, 13, 0, 0, 0), DateTime.Today + TimeSpan.FromMinutes(1000)); trades = dataStorage.Load(new DateTime(2017, 2, 9, 0, 0, 0), new DateTime(2017, 2, 10, 0, 0, 0)); }
static void Main() { // создаем тестовый инструмент var security = new Security { Id = "TestId", PriceStep = 0.1m, Decimals = 1, }; var trades = new List<Trade>(); // генерируем 1000 произвольных сделок // for (var i = 0; i < 1000; i++) { var t = new Trade { Time = DateTime.Today + TimeSpan.FromMinutes(i), Id = i + 1, Security = security, Volume = RandomGen.GetInt(1, 10), Price = RandomGen.GetInt(1, 100) * security.PriceStep ?? 1m + 99 }; trades.Add(t); } var storage = new StorageRegistry(); // получаем хранилище для тиковых сделок var tradeStorage = storage.GetTradeStorage(security); // сохраняем сделки tradeStorage.Save(trades); // загружаем сделки var loadedTrades = tradeStorage.Load(DateTime.Today, DateTime.Today + TimeSpan.FromMinutes(1000)); foreach (var trade in loadedTrades) { Console.WriteLine(LocalizedStrings.Str2968Params, trade.Id, trade); } Console.ReadLine(); // удаляем сделки (очищаем файл) tradeStorage.Delete(DateTime.Today, DateTime.Today + TimeSpan.FromMinutes(1000)); }
static void Main() { // создаем тестовый инструмент var security = new Security { Id = "TestId", PriceStep = 0.1m, Decimals = 1, }; var trades = new List <Trade>(); // генерируем 1000 произвольных сделок // for (var i = 0; i < 1000; i++) { var t = new Trade { Time = DateTime.Today + TimeSpan.FromMinutes(i), Id = i + 1, Security = security, Volume = RandomGen.GetInt(1, 10), Price = RandomGen.GetInt(1, 100) * security.PriceStep + 99 }; trades.Add(t); } var storage = new StorageRegistry(); // получаем хранилище для тиковых сделок var tradeStorage = storage.GetTradeStorage(security); // сохраняем сделки tradeStorage.Save(trades); // загружаем сделки var loadedTrades = tradeStorage.Load(DateTime.Today, DateTime.Today + TimeSpan.FromMinutes(1000)); foreach (var trade in loadedTrades) { Console.WriteLine(LocalizedStrings.Str2968Params, trade.Id, trade); } Console.ReadLine(); // удаляем сделки (очищаем файл) tradeStorage.Delete(DateTime.Today, DateTime.Today + TimeSpan.FromMinutes(1000)); }
static void Main(string[] args) { var security = new Security() { Id = "RIH7@FORTS", Board = ExchangeBoard.Forts }; StorageRegistry storage = new StorageRegistry(); string path = @"../../../Data/Quik"; //Для работы будем использовать готовое локальное файловое хранилище, в которое данные были предварительно записаны при помощи Гидры. //Создаем экземпляр LocalMarketDataDrive. LocalMarketDataDrive drive = new LocalMarketDataDrive() { Path = path }; //Передаем в StorageRegistry ссылку на локальное файловое хранилище storage.DefaultDrive = drive; DateTime from = new DateTime(2017, 02, 14, 10, 0, 0); DateTime to = new DateTime(2017, 02, 15, 23, 50, 0); // Получаем хранилище сделок для RIH7 IMarketDataStorage <Trade> tradeStorage = storage.GetTradeStorage(security); // Загружаем сделки из хранилища var trades = tradeStorage.Load(from, to); // Отображаем в окне вывода информацию foreach (var trade in trades) { Debug.WriteLine("{0} {1}", trade, trade.OpenInterest); } Console.Read(); }
/// <summary> /// To get the storage of tick trades. /// </summary> /// <param name="security">Security.</param> /// <returns>The storage of tick trades.</returns> protected override IMarketDataStorage <Trade> GetStorage(Security security) { return(StorageRegistry.GetTradeStorage(security, Drive)); }
protected override TimeSpan OnProcess() { var source = new MfdHistorySource(); if (_settings.UseTemporaryFiles != TempFiles.NotUse) { source.DumpFolder = GetTempPath(); } var allSecurity = this.GetAllSecurity(); // если фильтр по инструментам выключен (выбран инструмент все инструменты) var selectedSecurities = (allSecurity != null ? this.ToHydraSecurities(_mfdSecurityStorage.Securities) : Settings.Securities).ToArray(); var hasNonMfd = selectedSecurities.Any(s => !IsMfd(s)); if (selectedSecurities.IsEmpty() || hasNonMfd) { this.AddWarningLog(selectedSecurities.IsEmpty() ? LocalizedStrings.Str2289 : LocalizedStrings.Str2290.Put("MFD")); source.Refresh(_mfdSecurityStorage, new Security(), SaveSecurity, () => !CanProcess(false)); selectedSecurities = (allSecurity != null ? this.ToHydraSecurities(_mfdSecurityStorage.Securities) : Settings.Securities) .Where(s => { var retVal = IsMfd(s); if (!retVal) { this.AddWarningLog(LocalizedStrings.Str2291Params, s.Security.Id, "MFD"); } return(retVal); }).ToArray(); } if (!CanProcess()) { return(base.OnProcess()); } if (selectedSecurities.IsEmpty()) { this.AddWarningLog(LocalizedStrings.Str2292); return(TimeSpan.MaxValue); } var startDate = _settings.StartFrom; var endDate = DateTime.Today - TimeSpan.FromDays(_settings.DayOffset); var allDates = startDate.Range(endDate, TimeSpan.FromDays(1)).ToArray(); foreach (var security in selectedSecurities) { if (!CanProcess()) { break; } #region LoadTrades if ((allSecurity ?? security).IsTicksEnabled()) { var storage = StorageRegistry.GetTradeStorage(security.Security, _settings.Drive, _settings.StorageFormat); var emptyDates = allDates.Except(storage.Dates).ToArray(); if (emptyDates.IsEmpty()) { this.AddInfoLog(LocalizedStrings.Str2293Params, security.Security.Id); } else { foreach (var emptyDate in emptyDates) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !security.IsTradeDate(emptyDate)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, emptyDate); continue; } try { this.AddInfoLog(LocalizedStrings.Str2294Params, emptyDate, security.Security.Id); var ticks = source.GetTicks(security.Security, emptyDate, emptyDate); if (ticks.Any()) { SaveTicks(security, ticks); } else { this.AddDebugLog(LocalizedStrings.NoData); } if (_settings.UseTemporaryFiles == TempFiles.UseAndDelete) { File.Delete(source.GetDumpFile(security.Security, emptyDate, emptyDate, typeof(ExecutionMessage), ExecutionTypes.Tick)); } } catch (Exception ex) { HandleError(new InvalidOperationException(LocalizedStrings.Str2295Params .Put(emptyDate, security.Security.Id), ex)); } } } } else { this.AddDebugLog(LocalizedStrings.MarketDataNotEnabled, security.Security.Id, typeof(Trade).Name); } #endregion if (!CanProcess()) { break; } #region LoadCandles foreach (var pair in (allSecurity ?? security).GetCandleSeries()) { if (!CanProcess()) { break; } if (pair.MessageType != typeof(TimeFrameCandleMessage)) { this.AddWarningLog(LocalizedStrings.Str2296Params, pair); continue; } var tf = (TimeSpan)pair.Arg; var storage = StorageRegistry.GetCandleMessageStorage(pair.MessageType, security.Security, tf, _settings.Drive, _settings.StorageFormat); var emptyDates = allDates.Except(storage.Dates).ToArray(); if (emptyDates.IsEmpty()) { this.AddInfoLog(LocalizedStrings.Str2297Params, tf, security.Security.Id); continue; } var currDate = emptyDates.First(); var lastDate = emptyDates.Last(); while (currDate <= lastDate) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !security.IsTradeDate(currDate)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, currDate); currDate = currDate.AddDays(1); continue; } try { var till = currDate.AddDays(_settings.CandleDayStep - 1); this.AddInfoLog(LocalizedStrings.Str2298Params, tf, currDate, till, security.Security.Id); var candles = source.GetCandles(security.Security, tf, currDate, till); if (candles.Any()) { SaveCandles(security, candles); } else { this.AddDebugLog(LocalizedStrings.NoData); } if (_settings.UseTemporaryFiles == TempFiles.UseAndDelete) { File.Delete(source.GetDumpFile(security.Security, currDate, till, typeof(TimeFrameCandleMessage), tf)); } } catch (Exception ex) { HandleError(new InvalidOperationException(LocalizedStrings.Str2299Params .Put(tf, currDate, security.Security.Id), ex)); } currDate = currDate.AddDays(_settings.CandleDayStep); } } #endregion } if (CanProcess()) { this.AddInfoLog(LocalizedStrings.Str2300); } return(base.OnProcess()); }
protected override TimeSpan OnProcess() { var source = new RtsHistorySource { IsSystemOnly = _settings.IsSystemOnly, LoadEveningSession = _settings.LoadEveningSession, SaveRtsStdTrades = _settings.SaveRtsStdTrades, SaveRtsStdCombinedOnly = _settings.SaveRtsStdCombinedOnly }; if (_settings.UseTemporaryFiles != TempFiles.NotUse) { source.DumpFolder = GetTempPath(); } // если фильтр по инструментам выключен (выбран инструмент все инструменты) var allSecurity = this.GetAllSecurity(); var usdRur = GetUsdRur(source.SecurityIdGenerator.GenerateId("USD/RUR", ExchangeBoard.Forts)); var startDate = _settings.StartFrom; var endDate = DateTime.Today - TimeSpan.FromDays(_settings.DayOffset); var allDates = startDate.Range(endDate, TimeSpan.FromDays(1)).ToArray(); var secMap = new HashSet <Security>(); if (allSecurity == null) { secMap.AddRange(Settings.Securities.Select(s => s.Security)); } foreach (var date in allDates) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !ExchangeBoard.Forts.IsTradeDate(date.ApplyTimeZone(ExchangeBoard.Forts.TimeZone), true)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, date); continue; } this.AddInfoLog(LocalizedStrings.Str2823Params, date); var trades = source.LoadTicks(EntityRegistry.Securities, date); if (trades.Count == 0) { this.AddDebugLog(LocalizedStrings.NoData); } else { if (allSecurity == null) { trades = trades.Where(p => secMap.Contains(p.Key)).ToDictionary(); } foreach (var pair in trades) { SaveSecurity(pair.Key); SaveTicks(pair.Key, pair.Value); } } if (_settings.UseTemporaryFiles == TempFiles.UseAndDelete) { var dir = source.GetDumpFile(null, date, date, typeof(ExecutionMessage), ExecutionTypes.Tick); if (Directory.Exists(dir)) { Directory.Delete(dir, true); } } _settings.StartFrom = date.AddDays(1); SaveSettings(); } if (_settings.IsDownloadUsdRate) { var usdRurStorage = StorageRegistry.GetTradeStorage(usdRur, _settings.Drive, _settings.StorageFormat); foreach (var date in _settings.UsdRurStartFrom .Range(endDate, TimeSpan.FromDays(1)) .Except(usdRurStorage.Dates)) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !usdRur.Board.IsTradeDate(date.ApplyTimeZone(ExchangeBoard.Forts.TimeZone), true)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, date); continue; } this.AddInfoLog(LocalizedStrings.Str2294Params, date, usdRur.Id); var rate = FortsDailyData.GetRate(usdRur, date, date.Add(TimeSpan.FromDays(1))); if (rate.Count == 0) { this.AddDebugLog(LocalizedStrings.NoData); } else { SaveTicks(usdRur, rate.Select(p => new ExecutionMessage { SecurityId = usdRur.ToSecurityId(), TradePrice = p.Value, ServerTime = p.Key, ExecutionType = ExecutionTypes.Tick }).OrderBy(t => t.ServerTime)); } _settings.UsdRurStartFrom = date.AddDays(1); SaveSettings(); } } if (CanProcess()) { this.AddInfoLog(LocalizedStrings.Str2300); } return(base.OnProcess()); }
private void ProcessMarketDataMessage(MarketDataMessage message) { var securityId = message.SecurityId; var security = SecurityProvider.LookupById(securityId.ToStringId()); if (security == null) { RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str704Params.Put(securityId))); return; } if (StorageRegistry == null) { RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str1117Params.Put(message.DataType, securityId))); return; } var history = message as HistorySourceMessage; var storages = BasketStorage.InnerStorages; Exception error = null; switch (message.DataType) { case MarketDataTypes.Level1: { if (message.IsSubscribe) { if (history == null) { storages.Add(StorageRegistry.GetLevel1MessageStorage(security, Drive, StorageFormat)); storages.Add(new InMemoryMarketDataStorage <ClearingMessage>(security, null, date => new[] { new ClearingMessage { LocalTime = date.Date + security.Board.ExpiryTime, SecurityId = securityId, ClearMarketDepth = true } })); } else { storages.Add(new InMemoryMarketDataStorage <Level1ChangeMessage>(security, null, history.GetMessages)); } } else { RemoveStorage <IMarketDataStorage <Level1ChangeMessage> >(security, MessageTypes.Level1Change, null); RemoveStorage <InMemoryMarketDataStorage <ClearingMessage> >(security, ExtendedMessageTypes.Clearing, null); } break; } case MarketDataTypes.MarketDepth: { if (message.IsSubscribe) { if (history == null) { storages.Add((IMarketDataStorage <QuoteChangeMessage>)StorageRegistry.GetMarketDepthStorage(security, Drive, StorageFormat)); } else { storages.Add(new InMemoryMarketDataStorage <QuoteChangeMessage>(security, null, history.GetMessages)); } } else { RemoveStorage <IMarketDataStorage <QuoteChangeMessage> >(security, MessageTypes.QuoteChange, null); } break; } case MarketDataTypes.Trades: { if (message.IsSubscribe) { if (history == null) { storages.Add((IMarketDataStorage <ExecutionMessage>)StorageRegistry.GetTradeStorage(security, Drive, StorageFormat)); } else { storages.Add(new InMemoryMarketDataStorage <ExecutionMessage>(security, null, history.GetMessages)); } } else { RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, ExecutionTypes.Tick); } break; } case MarketDataTypes.OrderLog: { if (message.IsSubscribe) { if (history == null) { storages.Add((IMarketDataStorage <ExecutionMessage>)StorageRegistry.GetOrderLogStorage(security, Drive, StorageFormat)); } else { storages.Add(new InMemoryMarketDataStorage <ExecutionMessage>(security, null, history.GetMessages)); } } else { RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, ExecutionTypes.OrderLog); } break; } case MarketDataTypes.CandleTimeFrame: case MarketDataTypes.CandleTick: case MarketDataTypes.CandleVolume: case MarketDataTypes.CandleRange: case MarketDataTypes.CandlePnF: case MarketDataTypes.CandleRenko: { var msgType = message.DataType.ToCandleMessageType(); if (message.IsSubscribe) { var candleType = message.DataType.ToCandleMessage(); if (history == null) { storages.Add(StorageRegistry.GetCandleMessageStorage(candleType, security, message.Arg, Drive, StorageFormat)); } else { storages.Add(new InMemoryMarketDataStorage <CandleMessage>(security, message.Arg, history.GetMessages, candleType)); } } else { RemoveStorage <IMarketDataStorage <CandleMessage> >(security, msgType, message.Arg); } break; } default: error = new InvalidOperationException(LocalizedStrings.Str1118Params.Put(message.DataType)); break; } RaiseMarketDataMessage(message, error); }
protected override TimeSpan OnProcess() { var allSecurity = this.GetAllSecurity(); // если фильтр по инструментам выключен (выбран инструмент все инструменты) IEnumerable <HydraTaskSecurity> selectedSecurities = (allSecurity != null ? this.ToHydraSecurities(EntityRegistry.Securities.Filter(ExchangeBoard.Ux).Concat(EntityRegistry.Securities.Filter(ExchangeBoard.UxStock))) : Settings.Securities ).ToArray(); var source = new UxHistorySource(); if (selectedSecurities.IsEmpty()) { this.AddWarningLog(LocalizedStrings.Str2289); source.Refresh(EntityRegistry.Securities, new Security(), SaveSecurity, () => !CanProcess(false)); selectedSecurities = this.ToHydraSecurities(EntityRegistry.Securities.Filter(ExchangeBoard.Ux).Concat(EntityRegistry.Securities.Filter(ExchangeBoard.UxStock))); } if (selectedSecurities.IsEmpty()) { this.AddWarningLog(LocalizedStrings.Str2292); return(TimeSpan.MaxValue); } var startDate = _settings.StartFrom; var endDate = DateTime.Today - TimeSpan.FromDays(_settings.DayOffset); var allDates = startDate.Range(endDate, TimeSpan.FromDays(1)).ToArray(); foreach (var security in selectedSecurities) { if (!CanProcess()) { break; } #region LoadTicks if ((allSecurity ?? security).MarketDataTypesSet.Contains(typeof(Trade))) { var storage = StorageRegistry.GetTradeStorage(security.Security, _settings.Drive, _settings.StorageFormat); var emptyDates = allDates.Except(storage.Dates).ToArray(); if (emptyDates.IsEmpty()) { this.AddInfoLog(LocalizedStrings.Str2293Params, security.Security.Id); } else { foreach (var emptyDate in emptyDates) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !security.IsTradeDate(emptyDate)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, emptyDate); continue; } try { this.AddInfoLog(LocalizedStrings.Str2294Params, emptyDate, security.Security.Id); var trades = source.GetTrades(security.Security, emptyDate, emptyDate); if (trades.Any()) { SaveTrades(security, trades); } else { this.AddDebugLog(LocalizedStrings.NoData); } } catch (Exception ex) { HandleError(new InvalidOperationException(LocalizedStrings.Str2295Params .Put(emptyDate, security.Security.Id), ex)); } } } } else { this.AddDebugLog(LocalizedStrings.MarketDataNotEnabled, security.Security.Id, typeof(Trade).Name); } #endregion if (!CanProcess()) { break; } #region LoadCandles foreach (var series in (allSecurity ?? security).CandleSeries) { if (!CanProcess()) { break; } if (series.CandleType != typeof(TimeFrameCandle)) { this.AddWarningLog(LocalizedStrings.Str2296Params, series); continue; } var storage = StorageRegistry.GetCandleStorage(series.CandleType, security.Security, series.Arg, _settings.Drive, _settings.StorageFormat); var emptyDates = allDates.Except(storage.Dates).ToArray(); if (emptyDates.IsEmpty()) { this.AddInfoLog(LocalizedStrings.Str2297Params, series.Arg, security.Security.Id); continue; } foreach (var emptyDate in emptyDates) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !security.IsTradeDate(emptyDate)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, emptyDate); continue; } try { this.AddInfoLog(LocalizedStrings.Str2298Params, series.Arg, emptyDate, security.Security.Id); var candles = source.GetCandles(security.Security, (TimeSpan)series.Arg, emptyDate, emptyDate); if (candles.Any()) { SaveCandles(security, candles); } else { this.AddDebugLog(LocalizedStrings.NoData); } } catch (Exception ex) { HandleError(new InvalidOperationException(LocalizedStrings.Str2299Params .Put(series.Arg, emptyDate, security.Security.Id), ex)); } } } #endregion } if (CanProcess()) { this.AddInfoLog(LocalizedStrings.Str2300); } return(base.OnProcess()); }
protected override TimeSpan OnProcess() { var source = new FinamHistorySource(); if (_settings.UseTemporaryFiles != TempFiles.NotUse) { source.DumpFolder = GetTempPath(); } var allSecurity = this.GetAllSecurity(); // если фильтр по инструментам выключен (выбран инструмент все инструменты) var selectedSecurities = (allSecurity != null ? this.ToHydraSecurities(_finamSecurityStorage.Securities) : Settings.Securities).ToArray(); var hasNonFinam = selectedSecurities.Any(s => !IsFinam(s)); if (selectedSecurities.IsEmpty() || hasNonFinam) { this.AddWarningLog(selectedSecurities.IsEmpty() ? LocalizedStrings.Str2289 : LocalizedStrings.Str2290.Put("Finam")); source.Refresh(_finamSecurityStorage, new Security(), SaveSecurity, () => !CanProcess(false)); selectedSecurities = (allSecurity != null ? this.ToHydraSecurities(_finamSecurityStorage.Securities) : Settings.Securities) .Where(s => { var retVal = IsFinam(s); if (!retVal) { this.AddWarningLog(LocalizedStrings.Str2291Params, s.Security.Id, "Finam"); } return(retVal); }).ToArray(); } if (!CanProcess()) { return(base.OnProcess()); } if (selectedSecurities.IsEmpty()) { this.AddWarningLog(LocalizedStrings.Str2292); return(TimeSpan.MaxValue); } var startDate = _settings.StartFrom; var endDate = DateTime.Today - TimeSpan.FromDays(_settings.DayOffset); var allDates = startDate.Range(endDate, TimeSpan.FromDays(1)).ToArray(); foreach (var security in selectedSecurities) { if (!CanProcess()) { break; } #region LoadTrades if ((allSecurity ?? security).MarketDataTypesSet.Contains(typeof(Trade))) { var storage = StorageRegistry.GetTradeStorage(security.Security, _settings.Drive, _settings.StorageFormat); var emptyDates = allDates.Except(storage.Dates).ToArray(); if (emptyDates.IsEmpty()) { this.AddInfoLog(LocalizedStrings.Str2293Params, security.Security.Id); } else { foreach (var emptyDate in emptyDates) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !security.IsTradeDate(emptyDate)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, emptyDate); continue; } try { this.AddInfoLog(LocalizedStrings.Str2294Params, emptyDate, security.Security.Id); var trades = source.GetTrades(security.Security, emptyDate, emptyDate); if (trades.Any()) { SaveTrades(security, trades); } else { this.AddDebugLog(LocalizedStrings.NoData); } if (_settings.UseTemporaryFiles == TempFiles.UseAndDelete) { File.Delete(source.GetDumpFile(security.Security, emptyDate, emptyDate, typeof(Trade), null)); } } catch (Exception ex) { HandleError(new InvalidOperationException(LocalizedStrings.Str2295Params .Put(emptyDate, security.Security.Id), ex)); } } } } else { this.AddDebugLog(LocalizedStrings.MarketDataNotEnabled, security.Security.Id, typeof(Trade).Name); } #endregion if (!CanProcess()) { break; } #region LoadCandles foreach (var series in (allSecurity ?? security).CandleSeries) { if (!CanProcess()) { break; } if (series.CandleType != typeof(TimeFrameCandle)) { this.AddWarningLog(LocalizedStrings.Str2296Params, series); continue; } var storage = StorageRegistry.GetCandleStorage(series.CandleType, security.Security, series.Arg, _settings.Drive, _settings.StorageFormat); var emptyDates = allDates.Except(storage.Dates).ToArray(); if (emptyDates.IsEmpty()) { this.AddInfoLog(LocalizedStrings.Str2297Params, series.Arg, security.Security.Id); continue; } foreach (var emptyDate in emptyDates) { if (!CanProcess()) { break; } if (_settings.IgnoreWeekends && !security.IsTradeDate(emptyDate)) { this.AddDebugLog(LocalizedStrings.WeekEndDate, emptyDate); continue; } try { this.AddInfoLog(LocalizedStrings.Str2298Params, series.Arg, emptyDate, security.Security.Id); var candles = source.GetCandles(security.Security, (TimeSpan)series.Arg, emptyDate, emptyDate); if (candles.Any()) { SaveCandles(security, candles); } else { this.AddDebugLog(LocalizedStrings.NoData); } if (_settings.UseTemporaryFiles == TempFiles.UseAndDelete) { File.Delete(source.GetDumpFile(security.Security, emptyDate, emptyDate, typeof(TimeFrameCandle), series.Arg)); } } catch (Exception ex) { HandleError(new InvalidOperationException(LocalizedStrings.Str2299Params .Put(series.Arg, emptyDate, security.Security.Id), ex)); } } } #endregion } if (CanProcess()) { this.AddInfoLog(LocalizedStrings.Str2300); _settings.StartFrom = endDate; SaveSettings(); } return(base.OnProcess()); }
static void Main(string[] args) { var tradeBufferMax = 200; var depthBufferMax = 1000; var tradeBuffers = new Dictionary <string, List <Trade> >(); var depthBuffers = new Dictionary <string, List <MarketDepth> >(); var tradeStorages = new Dictionary <string, IMarketDataStorage <Trade> >(); var depthStorages = new Dictionary <string, IMarketDataStorage <MarketDepth> >(); List <string> securityIds = new List <string>(); StorageFormats storageFormat; string storagePath; var settings = XElement.Load("settings.xml"); storagePath = @settings.Element("storage-path").Value; storageFormat = (StorageFormats)Enum.Parse(typeof(StorageFormats), settings.Element("storage-format").Value.ToUpper()); foreach (var item in settings.Element("securities").Elements()) { var secId = item.Element("security").Value; securityIds.Add(secId); depthBuffers.Add(secId, new List <MarketDepth>()); tradeBuffers.Add(secId, new List <Trade>()); } var storage = new StorageRegistry() { DefaultDrive = new LocalMarketDataDrive { Path = storagePath } }; var connector = new QuikTrader(); // Ставим false, чтобы квик при старте не загрузил все 30 тыс инструментов connector.RequestAllSecurities = false; // Контролируем соединение в течение работы срочного рынка connector.ReConnectionSettings.WorkingTime = ExchangeBoard.Forts.WorkingTime; // Обработчик события успешного соединения connector.Connected += () => { Console.WriteLine("Соединение установлено!"); if (securityIds.Any()) { // Запрашиваем инструменты foreach (var id in securityIds) { connector.LookupSecurities(new Security() { Code = id.Split('@')[0], Board = ExchangeBoard.GetBoard(id.Split('@')[1]) }); } } else { Console.WriteLine("Нет инструментов для запроса!"); } }; connector.LookupSecuritiesResult += (ex, securities) => { foreach (var security in securities) { if (tradeStorages.ContainsKey(security.Id) || depthStorages.ContainsKey(security.Id)) { continue; } // Инициализируем специализированные хранилища tradeStorages.Add(security.Id, storage.GetTradeStorage(security, null, storageFormat)); depthStorages.Add(security.Id, storage.GetMarketDepthStorage(security, null, storageFormat)); // Региструем получение сделок if (!connector.RegisteredTrades.Contains(security)) { connector.RegisterTrades(security); } // Региструем получение стаканов if (!connector.RegisteredMarketDepths.Contains(security)) { connector.RegisterMarketDepth(security); } } }; connector.NewTrades += trades => { foreach (var trade in trades) { var secId = trade.Security.Id; tradeBuffers[secId].Add(trade); if (tradeBuffers[secId].Count >= tradeBufferMax) { var forsave = tradeBuffers[secId].TakeLast(tradeBufferMax); tradeBuffers[secId] = tradeBuffers[secId].Except(forsave).ToList(); var task = Task.Factory.StartNew(() => tradeStorages[secId].Save(forsave)); } } }; connector.MarketDepthsChanged += depths => { foreach (var depth in depths) { var secId = depth.Security.Id; depthBuffers[secId].Add(depth); if (depthBuffers[secId].Count >= depthBufferMax) { var forsave = depthBuffers[secId].TakeLast(depthBufferMax); depthBuffers[secId] = depthBuffers[secId].Except(forsave).ToList(); var task = Task.Factory.StartNew(() => depthStorages[secId].Save(forsave)); } } }; // Обработчик события разрыва соединения connector.Disconnected += () => Console.WriteLine("Соединение разорвано!"); // Команда соединения connector.Connect(); Console.Read(); var ttasks = new List <Task>(); var dtasks = new List <Task>(); foreach (var security in connector.Securities) { // Отменяем регистрацию сделок if (connector.RegisteredTrades.Contains(security)) { connector.UnRegisterTrades(security); } // Отменяем получение стаканов if (connector.RegisteredMarketDepths.Contains(security)) { connector.UnRegisterMarketDepth(security); } // Записываем остатки данных ttasks.Add(Task.Factory.StartNew(() => tradeStorages[security.Id].Save(tradeBuffers[security.Id]))); dtasks.Add(Task.Factory.StartNew(() => depthStorages[security.Id].Save(depthBuffers[security.Id]))); } Console.WriteLine("Записываем остатки данных!"); // Чуток ждем Task.WaitAll(ttasks.ToArray()); Task.WaitAll(dtasks.ToArray()); // Команда разрыва соединения connector.Disconnect(); }
private void ProcessMarketDataMessage(MarketDataMessage message) { var security = _sessionHolder.SecurityProvider.LookupById(message.SecurityId.SecurityCode + "@" + message.SecurityId.BoardCode); if (security == null) { RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str704Params.Put(message.SecurityId))); return; } if (TryGetGenerator(message) != null) { RaiseMarketDataMessage(message, null); return; } if (StorageRegistry == null) { RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str1117Params.Put(message.DataType, message.SecurityId))); return; } Exception error = null; switch (message.DataType) { case MarketDataTypes.Level1: { if (message.IsSubscribe) { _basketStorage.InnerStorages.Add(StorageRegistry.GetLevel1MessageStorage(security, Drive, StorageFormat)); _basketStorage.InnerStorages.Add(new InMemoryMarketDataStorage <ClearingMessage>(date => new[] { new ClearingMessage { LocalTime = date.Date + security.Board.ExpiryTime, SecurityId = message.SecurityId, ClearMarketDepth = true } })); } else { RemoveStorage <IMarketDataStorage <Level1ChangeMessage> >(security, MessageTypes.Level1Change, message.Arg); RemoveStorage <InMemoryMarketDataStorage <ClearingMessage> >(security, ExtendedMessageTypes.Clearing, message.Arg); } break; } case MarketDataTypes.MarketDepth: { if (message.IsSubscribe) { _basketStorage.InnerStorages.Add((IMarketDataStorage <QuoteChangeMessage>)StorageRegistry.GetMarketDepthStorage(security, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <QuoteChangeMessage> >(security, MessageTypes.QuoteChange, message.Arg); } break; } case MarketDataTypes.Trades: { if (message.IsSubscribe) { _basketStorage.InnerStorages.Add((IMarketDataStorage <ExecutionMessage>)StorageRegistry.GetTradeStorage(security, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, message.Arg); } break; } case MarketDataTypes.OrderLog: { if (message.IsSubscribe) { //var msg = "OrderLog".ValidateLicense(); //if (msg == null) _basketStorage.InnerStorages.Add((IMarketDataStorage <ExecutionMessage>)StorageRegistry.GetOrderLogStorage(security, Drive, StorageFormat)); //else // SessionHolder.AddErrorLog(msg); } else { RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, message.Arg); } break; } case MarketDataTypes.CandleTimeFrame: case MarketDataTypes.CandleTick: case MarketDataTypes.CandleVolume: case MarketDataTypes.CandleRange: case MarketDataTypes.CandlePnF: case MarketDataTypes.CandleRenko: { Type candleMessageType; MessageTypes msgType; switch (message.DataType) { case MarketDataTypes.CandleTimeFrame: msgType = MessageTypes.CandleTimeFrame; candleMessageType = typeof(TimeFrameCandleMessage); break; case MarketDataTypes.CandleTick: msgType = MessageTypes.CandleTick; candleMessageType = typeof(TickCandleMessage); break; case MarketDataTypes.CandleVolume: msgType = MessageTypes.CandleVolume; candleMessageType = typeof(VolumeCandleMessage); break; case MarketDataTypes.CandleRange: msgType = MessageTypes.CandleRange; candleMessageType = typeof(RangeCandleMessage); break; case MarketDataTypes.CandlePnF: msgType = MessageTypes.CandlePnF; candleMessageType = typeof(PnFCandleMessage); break; case MarketDataTypes.CandleRenko: msgType = MessageTypes.CandleRenko; candleMessageType = typeof(RenkoCandleMessage); break; default: throw new InvalidOperationException(); } if (message.IsSubscribe) { _basketStorage.InnerStorages.Add(StorageRegistry.GetCandleMessageStorage(candleMessageType, security, message.Arg, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <CandleMessage> >(security, msgType, message.Arg); } break; } default: error = new InvalidOperationException(LocalizedStrings.Str1118Params.Put(message.DataType)); break; } RaiseMarketDataMessage(message, error); }
private void ProcessMarketDataMessage(MarketDataMessage message) { var generatorMessage = message as GeneratorMarketDataMessage; if (generatorMessage != null) { if (generatorMessage.Generator == null) { throw new ArgumentException("message"); } var tradeGen = generatorMessage.Generator as TradeGenerator; if (tradeGen != null) { if (generatorMessage.IsSubscribe) { _tradeGenerators.Add(generatorMessage.SecurityId, tradeGen); } else { _tradeGenerators.Remove(generatorMessage.SecurityId); } } else { var depthGen = generatorMessage.Generator as MarketDepthGenerator; if (depthGen != null) { if (generatorMessage.IsSubscribe) { _depthGenerators.Add(generatorMessage.SecurityId, depthGen); } else { _depthGenerators.Remove(generatorMessage.SecurityId); } } else { var olGen = generatorMessage.Generator as OrderLogGenerator; if (olGen != null) { if (generatorMessage.IsSubscribe) { _orderLogGenerators.Add(generatorMessage.SecurityId, olGen); } else { _orderLogGenerators.Remove(generatorMessage.SecurityId); } } else { throw new InvalidOperationException(); } } } return; } var security = SecurityProvider.LookupById(message.SecurityId.SecurityCode + "@" + message.SecurityId.BoardCode); if (security == null) { RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str704Params.Put(message.SecurityId))); return; } if (TryGetGenerator(message) != null) { RaiseMarketDataMessage(message, null); return; } if (StorageRegistry == null) { RaiseMarketDataMessage(message, new InvalidOperationException(LocalizedStrings.Str1117Params.Put(message.DataType, message.SecurityId))); return; } Exception error = null; switch (message.DataType) { case MarketDataTypes.Level1: { if (message.IsSubscribe) { BasketStorage.InnerStorages.Add(StorageRegistry.GetLevel1MessageStorage(security, Drive, StorageFormat)); BasketStorage.InnerStorages.Add(new InMemoryMarketDataStorage <ClearingMessage>(date => new[] { new ClearingMessage { LocalTime = date.Date + security.Board.ExpiryTime, SecurityId = message.SecurityId, ClearMarketDepth = true } })); } else { RemoveStorage <IMarketDataStorage <Level1ChangeMessage> >(security, MessageTypes.Level1Change, message.Arg); RemoveStorage <InMemoryMarketDataStorage <ClearingMessage> >(security, ExtendedMessageTypes.Clearing, message.Arg); } break; } case MarketDataTypes.MarketDepth: { if (message.IsSubscribe) { BasketStorage.InnerStorages.Add((IMarketDataStorage <QuoteChangeMessage>)StorageRegistry.GetMarketDepthStorage(security, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <QuoteChangeMessage> >(security, MessageTypes.QuoteChange, message.Arg); } break; } case MarketDataTypes.Trades: { if (message.IsSubscribe) { BasketStorage.InnerStorages.Add((IMarketDataStorage <ExecutionMessage>)StorageRegistry.GetTradeStorage(security, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, message.Arg); } break; } case MarketDataTypes.OrderLog: { if (message.IsSubscribe) { BasketStorage.InnerStorages.Add((IMarketDataStorage <ExecutionMessage>)StorageRegistry.GetOrderLogStorage(security, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <ExecutionMessage> >(security, MessageTypes.Execution, message.Arg); } break; } case MarketDataTypes.CandleTimeFrame: case MarketDataTypes.CandleTick: case MarketDataTypes.CandleVolume: case MarketDataTypes.CandleRange: case MarketDataTypes.CandlePnF: case MarketDataTypes.CandleRenko: { Type candleMessageType; MessageTypes msgType; switch (message.DataType) { case MarketDataTypes.CandleTimeFrame: msgType = MessageTypes.CandleTimeFrame; candleMessageType = typeof(TimeFrameCandleMessage); break; case MarketDataTypes.CandleTick: msgType = MessageTypes.CandleTick; candleMessageType = typeof(TickCandleMessage); break; case MarketDataTypes.CandleVolume: msgType = MessageTypes.CandleVolume; candleMessageType = typeof(VolumeCandleMessage); break; case MarketDataTypes.CandleRange: msgType = MessageTypes.CandleRange; candleMessageType = typeof(RangeCandleMessage); break; case MarketDataTypes.CandlePnF: msgType = MessageTypes.CandlePnF; candleMessageType = typeof(PnFCandleMessage); break; case MarketDataTypes.CandleRenko: msgType = MessageTypes.CandleRenko; candleMessageType = typeof(RenkoCandleMessage); break; default: throw new InvalidOperationException(); } if (message.IsSubscribe) { BasketStorage.InnerStorages.Add(StorageRegistry.GetCandleMessageStorage(candleMessageType, security, message.Arg, Drive, StorageFormat)); } else { RemoveStorage <IMarketDataStorage <CandleMessage> >(security, msgType, message.Arg); } break; } default: error = new InvalidOperationException(LocalizedStrings.Str1118Params.Put(message.DataType)); break; } RaiseMarketDataMessage(message, error); }