Beispiel #1
0
        /// <summary>
        /// Тиковый источник данных
        /// </summary>
        /// <param name="tickSourceID">ID источника</param>
        /// <returns>Тиковый источник или null</returns>
        public TickSource GetTickSourceByID(int tickSourceID)
        {
            if (tickSourceID <= 0)
            {
                return(null);
            }

            try
            {
                var ts = _tickSourceDA.GetTickSourceByID(tickSourceID);
                if (ts == null || ts.DataStr == null)
                {
                    return(null);
                }

                var tickSource = new TickSource(_instrumBL, _insStoreBL, _tickHistoryBL);
                tickSource.TickSourceID = ts.TickSourceID;
                tickSource.Name         = ts.Name;
                XDocument xd = XDocument.Parse(ts.DataStr);
                tickSource.Initialize(xd);

                return(tickSource);
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Ошибка при извлечении тикового источника", ex);
            }
        }
Beispiel #2
0
        public LeechPlatform(TickSource tickSrc, IInstrumBL instrumBL, IInsStoreBL insStoreBL, TradeEngine engine, 
            TradeEngineData data, SeriesData seriesData, ILogger logger)
        {
            _tickSource = tickSrc;
            _instrumBL = instrumBL;
            _insStoreBL = insStoreBL;
            _engine = engine;
            _data = data;
            _seriesData = seriesData;
            _logger = logger;

            _barRows = new List<BarRow>();
            _tickSource.OnTick += _tickSource_OnTick;
            _insID_onTicks = new Dictionary<int, List<OnTickDelegate>>();
            _insID_pm = new Dictionary<int, IPosManager>();
        }
Beispiel #3
0
        /// <summary>
        /// Сохранение тикового источника
        /// </summary>
        /// <param name="tickSource">Тиковый источник</param>
        public void SaveTickSource(TickSource tickSource)
        {
            if (tickSource == null)
            {
                throw new ArgumentNullException("tickSource");
            }

            string xml = "";
            var    xd  = tickSource.Serialize();

            if (xd != null)
            {
                xml = xd.ToString(SaveOptions.DisableFormatting);
            }

            DbTickSource dbts = new DbTickSource()
            {
                TickSourceID = tickSource.TickSourceID, Name = tickSource.Name, DataStr = xml
            };

            try
            {
                if (tickSource.TickSourceID > 0)
                {
                    _tickSourceDA.UpdateTickSource(dbts);
                }
                else
                {
                    tickSource.TickSourceID = _tickSourceDA.InsertTickSource(dbts);
                }
            }
            catch (Exception ex)
            {
                throw new ApplicationException("Ошибка при сохранении тикового источника", ex);
            }
        }
Beispiel #4
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);
        }