Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }