예제 #1
0
        protected override TimeSpan OnProcess()
        {
            if (_settings.ExportType == ExportTypes.Sql && _settings.Connection == null)
            {
                this.AddErrorLog(LocalizedStrings.Str3768);
                return(TimeSpan.MaxValue);
            }

            var allSecurity        = this.GetAllSecurity();
            var supportedDataTypes = (allSecurity == null
                                        ? Enumerable.Empty <Type>()
                                        : SupportedMarketDataTypes.Intersect(allSecurity.MarketDataTypes)
                                      ).ToArray();

            this.AddInfoLog(LocalizedStrings.Str2306Params.Put(_settings.StartFrom));

            Func <int, bool> isCancelled = count => !CanProcess();

            var hasSecurities = false;

            foreach (var security in GetWorkingSecurities())
            {
                hasSecurities = true;

                if (!CanProcess())
                {
                    break;
                }

                var path = _settings.ExportFolder;

                if (path.IsEmpty())
                {
                    path = DriveCache.Instance.DefaultDrive.Path;
                }

                foreach (var t in (allSecurity == null ? security.MarketDataTypes : supportedDataTypes))
                {
                    if (!CanProcess())
                    {
                        break;
                    }

                    var arg      = _settings.CandleSettings.Arg;
                    var dataType = t.ToMessageType(ref arg);

                    this.AddInfoLog(LocalizedStrings.Str3769Params.Put(security.Security.Id, dataType.Name, _settings.ExportType));

                    var fromStorage = StorageRegistry.GetStorage(security.Security, dataType, arg, _settings.Drive, _settings.StorageFormat);

                    var from = fromStorage.GetFromDate();
                    var to   = fromStorage.GetToDate();

                    if (from == null || to == null)
                    {
                        this.AddWarningLog(LocalizedStrings.Str3770);
                        continue;
                    }

                    from = _settings.StartFrom.Max(from.Value);
                    to   = (DateTime.Today - TimeSpan.FromDays(_settings.Offset)).Min(to.Value);

                    if (from > to)
                    {
                        continue;
                    }

                    BaseExporter exporter;

                    if (_settings.ExportType == ExportTypes.Sql)
                    {
                        exporter = new DatabaseExporter(security.Security, arg, isCancelled, _settings.Connection)
                        {
                            BatchSize   = _settings.BatchSize,
                            CheckUnique = _settings.CheckUnique,
                        };
                    }
                    else
                    {
                        var fileName = Path.Combine(path, security.Security.GetFileName(
                                                        dataType, arg, from.Value, to.Value, _settings.ExportType));

                        switch (_settings.ExportType)
                        {
                        case ExportTypes.Excel:
                            exporter = new ExcelExporter(security.Security, arg, isCancelled, fileName, () => this.AddErrorLog(LocalizedStrings.Str3771));
                            break;

                        case ExportTypes.Xml:
                            exporter = new XmlExporter(security.Security, arg, isCancelled, fileName);
                            break;

                        case ExportTypes.Txt:
                            exporter = new TextExporter(security.Security, arg, isCancelled, fileName, GetTxtTemplate(dataType, arg), _settings.Header);
                            break;

                        case ExportTypes.Bin:
                            exporter = new BinExporter(security.Security, arg, isCancelled, DriveCache.Instance.GetDrive(path));
                            break;

                        default:
                            throw new ArgumentOutOfRangeException();
                        }
                    }

                    foreach (var date in from.Value.Range(to.Value, TimeSpan.FromDays(1)))
                    {
                        if (!CanProcess())
                        {
                            break;
                        }

                        try
                        {
                            this.AddInfoLog(LocalizedStrings.Str3772Params.Put(security.Security.Id, dataType.Name, _settings.ExportType, date));
                            exporter.Export(dataType, fromStorage.Load(date));
                        }
                        catch (Exception ex)
                        {
                            HandleError(ex);
                        }
                    }
                }
            }

            if (!hasSecurities)
            {
                this.AddWarningLog(LocalizedStrings.Str2292);
                return(TimeSpan.MaxValue);
            }

            if (CanProcess())
            {
                this.AddInfoLog(LocalizedStrings.Str2300);

                _settings.StartFrom = DateTime.Today - TimeSpan.FromDays(_settings.Offset);
                SaveSettings();
            }

            return(base.OnProcess());
        }
예제 #2
0
        public void Start(Security security, Type dataType, object arg, IEnumerableEx values, object path)
        {
            if (dataType == null)
            {
                throw new ArgumentNullException("dataType");
            }

            if (security == null && dataType != typeof(NewsMessage) && dataType != typeof(SecurityMessage))
            {
                throw new ArgumentNullException("security");
            }

            if (values == null)
            {
                throw new ArgumentNullException("values");
            }

            var currProgress = 5;

            var valuesPerPercent = (values.Count / (100 - currProgress)).Max(1);
            var valuesPerCount   = (valuesPerPercent / 10).Max(1);
            var currCount        = 0;
            var valuesCount      = 0;

            Func <int, bool> isCancelled = count =>
            {
                var isCancelling = _worker.CancellationPending;

                if (!isCancelling)
                {
                    valuesCount += count;

                    if (valuesCount / valuesPerPercent > currProgress)
                    {
                        currProgress = valuesCount / valuesPerPercent;
                        _worker.ReportProgress(currProgress);
                    }

                    if (valuesCount > currCount)
                    {
                        currCount = valuesCount + valuesPerCount;
                        this.GuiAsync(() => UpdateCount(valuesCount));
                    }
                }

                return(isCancelling);
            };

            string       fileName;
            BaseExporter exporter;

            switch (_button.ExportType)
            {
            case ExportTypes.Excel:
                fileName = (string)path;
                exporter = new ExcelExporter(security, arg, isCancelled, fileName, () => GuiDispatcher.GlobalDispatcher.AddSyncAction(TooManyValues));
                break;

            case ExportTypes.Xml:
                fileName = (string)path;
                exporter = new XmlExporter(security, arg, isCancelled, fileName);
                break;

            case ExportTypes.Txt:
                var wnd = new ExportTxtPreviewWindow
                {
                    DataType = dataType,
                    Arg      = arg
                };

                var registry = ((HydraEntityRegistry)ConfigManager.GetService <IEntityRegistry>()).Settings.TemplateTxtRegistry;

                if (dataType == typeof(SecurityMessage))
                {
                    wnd.TxtTemplate = registry.TemplateTxtSecurity;
                }
                else if (dataType == typeof(NewsMessage))
                {
                    wnd.TxtTemplate = registry.TemplateTxtNews;
                }
                else if (dataType.IsSubclassOf(typeof(CandleMessage)))
                {
                    wnd.TxtTemplate = registry.TemplateTxtCandle;
                }
                else if (dataType == typeof(Level1ChangeMessage))
                {
                    wnd.TxtTemplate = registry.TemplateTxtLevel1;
                }
                else if (dataType == typeof(QuoteChangeMessage))
                {
                    wnd.TxtTemplate = registry.TemplateTxtDepth;
                }
                else if (dataType == typeof(ExecutionMessage))
                {
                    if (arg == null)
                    {
                        throw new ArgumentNullException("arg");
                    }

                    switch ((ExecutionTypes)arg)
                    {
                    case ExecutionTypes.Tick:
                        wnd.TxtTemplate = registry.TemplateTxtTick;
                        break;

                    case ExecutionTypes.Order:
                    case ExecutionTypes.Trade:
                        wnd.TxtTemplate = registry.TemplateTxtTransaction;
                        break;

                    case ExecutionTypes.OrderLog:
                        wnd.TxtTemplate = registry.TemplateTxtOrderLog;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                else
                {
                    throw new ArgumentOutOfRangeException("dataType", dataType, LocalizedStrings.Str721);
                }


                if (!wnd.ShowModal(this))
                {
                    return;
                }

                if (dataType == typeof(SecurityMessage))
                {
                    registry.TemplateTxtSecurity = wnd.TxtTemplate;
                }
                else if (dataType == typeof(NewsMessage))
                {
                    registry.TemplateTxtNews = wnd.TxtTemplate;
                }
                else if (dataType.IsSubclassOf(typeof(CandleMessage)))
                {
                    registry.TemplateTxtCandle = wnd.TxtTemplate;
                }
                else if (dataType == typeof(Level1ChangeMessage))
                {
                    registry.TemplateTxtLevel1 = wnd.TxtTemplate;
                }
                else if (dataType == typeof(QuoteChangeMessage))
                {
                    registry.TemplateTxtDepth = wnd.TxtTemplate;
                }
                else if (dataType == typeof(ExecutionMessage))
                {
                    if (arg == null)
                    {
                        throw new ArgumentNullException("arg");
                    }

                    switch ((ExecutionTypes)arg)
                    {
                    case ExecutionTypes.Tick:
                        registry.TemplateTxtTick = wnd.TxtTemplate;
                        break;

                    case ExecutionTypes.Order:
                    case ExecutionTypes.Trade:
                        registry.TemplateTxtTransaction = wnd.TxtTemplate;
                        break;

                    case ExecutionTypes.OrderLog:
                        registry.TemplateTxtOrderLog = wnd.TxtTemplate;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                else
                {
                    throw new ArgumentOutOfRangeException("dataType", dataType, LocalizedStrings.Str721);
                }

                fileName = (string)path;
                exporter = new TextExporter(security, arg, isCancelled, fileName, wnd.TxtTemplate, wnd.TxtHeader);
                break;

            case ExportTypes.Sql:
                fileName = null;
                exporter = new DatabaseExporter(security, arg, isCancelled, (DatabaseConnectionPair)path)
                {
                    CheckUnique = false
                };
                break;

            case ExportTypes.Bin:
                var drive = (IMarketDataDrive)path;
                fileName = drive is LocalMarketDataDrive ? drive.Path : null;
                exporter = new BinExporter(security, arg, isCancelled, drive);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            CreateWorker(values.Count, fileName);

            _worker.DoWork += (s, e) =>
            {
                _worker.ReportProgress(currProgress);

                exporter.Export(dataType, values);

                _worker.ReportProgress(100);
                Thread.Sleep(500);
                _worker.ReportProgress(0);
            };

            _worker.RunWorkerAsync();
        }
예제 #3
0
		protected override TimeSpan OnProcess()
		{
			if (_settings.ExportType == ExportTypes.Sql && _settings.Connection == null)
			{
				this.AddErrorLog(LocalizedStrings.Str3768);
				return TimeSpan.MaxValue;
			}

			var allSecurity = this.GetAllSecurity();
			var supportedDataTypes = (allSecurity == null
					? Enumerable.Empty<DataType>()
					: SupportedDataTypes.Intersect(allSecurity.DataTypes)
				).ToArray();

			this.AddInfoLog(LocalizedStrings.Str2306Params.Put(_settings.StartFrom));

			Func<int, bool> isCancelled = count => !CanProcess();

			var hasSecurities = false;

			foreach (var security in GetWorkingSecurities())
			{
				hasSecurities = true;

				if (!CanProcess())
					break;

				foreach (var t in (allSecurity == null ? security.DataTypes : supportedDataTypes))
				{
					if (!CanProcess())
						break;

					var dataType = t.MessageType;
					var arg = t.Arg;

					this.AddInfoLog(LocalizedStrings.Str3769Params.Put(security.Security.Id, dataType.Name, _settings.ExportType));

					var fromStorage = StorageRegistry.GetStorage(security.Security, dataType, arg, _settings.Drive, _settings.StorageFormat);

					var from = fromStorage.GetFromDate();
					var to = fromStorage.GetToDate();

					if (from == null || to == null)
					{
						this.AddWarningLog(LocalizedStrings.Str3770);
						continue;
					}

					from = _settings.StartFrom.Max(from.Value);
					to = (DateTime.Today - TimeSpan.FromDays(_settings.Offset)).Min(to.Value);

					if (from > to)
						continue;

					BaseExporter exporter;

					if (_settings.ExportType == ExportTypes.Sql)
					{
						exporter = new DatabaseExporter(security.Security, arg, isCancelled, _settings.Connection)
						{
							BatchSize = _settings.BatchSize,
							CheckUnique = _settings.CheckUnique,
						};
					}
					else
					{
						var path = _settings.ExportFolder;

						if (path.IsEmpty())
							path = DriveCache.Instance.DefaultDrive.Path;

						var fileName = Path.Combine(path, security.Security.GetFileName(
							dataType, arg, from.Value, to.Value, _settings.ExportType));

						switch (_settings.ExportType)
						{
							case ExportTypes.Excel:
								exporter = new ExcelExporter(security.Security, arg, isCancelled, fileName, () => this.AddErrorLog(LocalizedStrings.Str3771));
								break;
							case ExportTypes.Xml:
								exporter = new XmlExporter(security.Security, arg, isCancelled, fileName);
								break;
							case ExportTypes.Txt:
								exporter = new TextExporter(security.Security, arg, isCancelled, fileName, GetTxtTemplate(dataType, arg), _settings.Header);
								break;
							case ExportTypes.Bin:
								exporter = new BinExporter(security.Security, arg, isCancelled, DriveCache.Instance.GetDrive(path));
								break;
							default:
								throw new ArgumentOutOfRangeException();
						}
					}

					foreach (var date in from.Value.Range(to.Value, TimeSpan.FromDays(1)))
					{
						if (!CanProcess())
							break;

						try
						{
							this.AddInfoLog(LocalizedStrings.Str3772Params.Put(security.Security.Id, dataType.Name, _settings.ExportType, date));
							exporter.Export(dataType, fromStorage.Load(date));
						}
						catch (Exception ex)
						{
							HandleError(ex);
						}
					}
				}
			}

			if (!hasSecurities)
			{
				this.AddWarningLog(LocalizedStrings.Str2292);
				return TimeSpan.MaxValue;
			}

			if (CanProcess())
			{
				this.AddInfoLog(LocalizedStrings.Str2300);

				_settings.StartFrom = DateTime.Today - TimeSpan.FromDays(_settings.Offset);
				SaveSettings();
			}

			return base.OnProcess();
		}
예제 #4
0
        public void Start(Security security, Type dataType, object arg, IEnumerableEx values, object path)
        {
            if (security == null && dataType != typeof(News) && dataType != typeof(Security))
            {
                throw new ArgumentNullException("security");
            }

            if (dataType == null)
            {
                throw new ArgumentNullException("dataType");
            }

            if (values == null)
            {
                throw new ArgumentNullException("values");
            }

            var currProgress = 5;

            var valuesPerPercent = (values.Count / (100 - currProgress)).Max(1);
            var valuesPerCount   = (valuesPerPercent / 10).Max(1);
            var currCount        = 0;
            var valuesCount      = 0;

            Func <int, bool> isCancelled = count =>
            {
                var isCancelling = _worker.CancellationPending;

                if (!isCancelling)
                {
                    valuesCount += count;

                    if (valuesCount / valuesPerPercent > currProgress)
                    {
                        currProgress = valuesCount / valuesPerPercent;
                        _worker.ReportProgress(currProgress);
                    }

                    if (valuesCount > currCount)
                    {
                        currCount = valuesCount + valuesPerCount;
                        this.GuiAsync(() => UpdateCount(valuesCount));
                    }
                }

                return(isCancelling);
            };

            string       fileName;
            BaseExporter exporter;

            switch (_button.ExportType)
            {
            case ExportTypes.Excel:
                fileName = (string)path;
                exporter = new ExcelExporter(security, arg, isCancelled, fileName, () => GuiDispatcher.GlobalDispatcher.AddSyncAction(TooManyValues));
                break;

            case ExportTypes.Xml:
                fileName = (string)path;
                exporter = new XmlExporter(security, arg, isCancelled, fileName);
                break;

            case ExportTypes.Txt:
                fileName = (string)path;
                exporter = new TextExporter(security, arg, isCancelled, fileName);
                break;

            case ExportTypes.Sql:
                fileName = null;
                exporter = new DatabaseExporter(security, arg, isCancelled, (DatabaseConnectionPair)path)
                {
                    CheckUnique = false
                };
                break;

            case ExportTypes.Bin:
                var drive = (IMarketDataDrive)path;
                fileName = drive is LocalMarketDataDrive ? drive.Path : null;
                exporter = new BinExporter(security, arg, isCancelled, drive);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            CreateWorker(values.Count, fileName);

            _worker.DoWork += (s, e) =>
            {
                _worker.ReportProgress(currProgress);

                exporter.Export(dataType, values);

                _worker.ReportProgress(100);
                Thread.Sleep(500);
                _worker.ReportProgress(0);
            };

            _worker.RunWorkerAsync();
        }