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); } }
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>(); }
/// <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); }