Esempio n. 1
0
        public decimal GetCommPerc()
        {
            if (_data == null) return 0;
            var account = _data.GetAccount();
            if (account == null) return 0;

            return account.CommPerc;
        }
Esempio n. 2
0
        private void ViewData(TradeEngineData data)
        {
            var acc  = data.GetAccount();
            var cash = data.GetCash();

            var accStr = string.Format("Торговый счет: Id = {0}\nCode:{1}\nName:{2}",
                                       acc.AccountID.ToString(), acc.Code, acc.Name);

            _console.WriteLine(accStr);

            decimal init = cash.Initial;
            decimal curr = cash.Current;

            var cashStr = string.Format("Cash initial={0}, current={1}",
                                        init.ToString(), curr.ToString());

            _console.WriteLine(cashStr);

            if (init != 0)
            {
                var profitStr = string.Format("Profit={0} ({1} %)",
                                              (curr - init).ToString(), ((curr - init) / init * 100m).ToString());
                _console.WriteLine(profitStr);
            }
        }
Esempio n. 3
0
        private void Complete()
        {
            // закрытие открытых позиций
            var instrums = _tickSource.GetInstrums();

            foreach (var instrum in instrums)
            {
                var tick = _tickSource.GetLastTick(instrum.InsID);
                if (tick == null)
                {
                    continue;
                }

                _engine.ClosePosition(tick.Value);
            }

            // сохранение данных
            _data.SaveData();
            var account = _data.GetAccount();

            _posBL.RefreshPositions(account.AccountID);
            _seriesData.SetAccount(account.AccountID);
            _seriesData.SaveData();

            // сохранить метаданные
            if (_tickSource != null && account != null)
            {
                AccountMeta meta = new AccountMeta();
                meta.TickSource_StartDate = _tickSource.StartDate;
                meta.TickSource_EndDate   = _tickSource.EndDate;
                meta.TickSource_Tickers   = string.Join(',', _tickSource.GetInstrums().Select(r => r.Ticker).ToArray());
                meta.TestRun_CompleteTime = DateTime.Now;
                var json = JsonConvert.SerializeObject(meta);
                _reposBL.SetStringParam(ACCOUNT_META + account.AccountID.ToString(), json);
            }
        }
Esempio n. 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);
        }