/// <summary> /// Добавить новую дочернюю фоновую задачу /// </summary> /// <param name="name">Наименование</param> /// <returns></returns> public BgTaskProgress AddChildProgress(string name) { BgTaskProgress item = new BgTaskProgress(_syncContext, name); _syncContext.RunAsync(() => { _children.Add(item); }); return(item); }
/// <summary> /// Инициализация объекта Тестовый прогон /// </summary> /// <param name="tickSourceID">Источник тиковых данных</param> /// <param name="testConfigID">Тестовая конфигурация</param> /// <param name="accountID">Торговый счет, если не указан, то создается новый, иначе берется указанный, в нем очищаются все данные и он заполняется новыми данными</param> /// <param name="progress">Индикатор прогресса</param> /// <returns>true-успешно, false-ошибка</returns> public async Task <bool> Initialize(int tickSourceID, int testConfigID, int?accountID, BgTaskProgress progress = null) { _tickSource = _tickSourceBL.GetTickSourceByID(tickSourceID); var testConfig = _testConfigBL.GetTestConfig(testConfigID); if (_tickSource == null || testConfig == null) { return(false); } if (accountID != null) { var account = _accountBL.GetAccountByID(accountID.Value); if (account == null) { throw new ApplicationException("Указанный счет не найден."); } if (account.AccountType != AccountTypes.Test) { throw new ApplicationException("Указанный счет не может использоваться для тестирования."); } } _progress = progress; _data = new TradeEngineData(_accountDA); _engine = new TradeEngine(_data, _instrumBL, (ITimeProvider)_tickSource); _seriesData = new SeriesData(_accountDA); _tickSource.OnTick += _tickSource_OnTick; _tickSource.OnStateChange += _tickSource_OnStateChange; if (accountID != null) { _accountBL.DeleteTestAccountData(accountID.Value, false); _data.LoadData(accountID.Value); _seriesData.LoadData(accountID.Value); } var acc = _data.GetAccount(); acc.AccountType = AccountTypes.Test; acc.CommPerc = testConfig.CommPerc; acc.IsShortEnable = testConfig.IsShortEnable; acc.Name = testConfig.Name + " - " + _tickSource.Name; acc.Code = DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss"); var cash = _data.GetCash(); cash.Initial = cash.Current = testConfig.InitialSumma; var botConfigs = testConfig.GetBotConfigs(); foreach (var conf in botConfigs) { try { string asmPath = ""; if (Path.IsPathRooted(conf.Assembly)) { asmPath = conf.Assembly; } else { string botsPath = _config.GetBotsPath(); asmPath = Path.Combine(botsPath, conf.Assembly); } var asm = Assembly.LoadFrom(asmPath); if (asm == null) { throw new ApplicationException("Сборка не загружена: " + asmPath); } var type = asm.GetType(conf.Class); if (type == null) { throw new ApplicationException("Тип не найден: " + conf.Class); } var platform = new LeechPlatform(_tickSource, _instrumBL, _insStoreBL, _engine, _data, _seriesData, _logger); IBot bot = null; try { bot = Activator.CreateInstance(type, platform) as IBot; } catch (Exception ex) { throw new ApplicationException("Ошибка при создании бота: " + conf.Key, ex); } if (bot == null) { throw new ApplicationException("Бот не создан: " + conf.Key); } var loader = new BotParamsLoader(); var botParams = loader.Load(asmPath, conf.Class); if (loader.Exception != null) { throw new ApplicationException("Ошибка при загрузке файла конфигурации бота: " + conf.Key, loader.Exception); } if (botParams == null) { botParams = loader.Load(conf.InitData); if (loader.Exception != null) { throw new ApplicationException("Ошибка при загрузке данных инициализации бота: " + conf.Key, loader.Exception); } } if (botParams == null) { botParams = new BotParams(null); } try { var botResult = await bot.Initialize(botParams); if (botResult != null && !botResult.IsSuccess) { throw new ApplicationException("Ошибка при инициализации бота: " + botResult.Message); } _bot_platform.Add(bot, platform); } catch (Exception ex) { throw new ApplicationException("Ошибка при инициализации бота: " + conf.Key, ex); } } catch (Exception ex) { throw new ApplicationException("Ошибка при инициализации ботов.", ex); } } int count = await _tickSource.LoadDataAsync(); return(count > 0); }