private static BotPanel Serialize(string path, string nameClass, string name, StartProgram startProgram) { try { BotPanel result = null; string fileStr = ReadFile(path); //Объявляем провайдер кода С# CSharpCodeProvider prov = new CSharpCodeProvider(); var assemblies = AppDomain.CurrentDomain.GetAssemblies(); var res = Array.ConvertAll <Assembly, string>(assemblies, (x) => { if (!x.IsDynamic) { return(x.Location); } return(null); }); CompilerParameters cp = new CompilerParameters(res); // Помечаем сборку, как временную cp.GenerateInMemory = true; cp.IncludeDebugInformation = true; // Обрабатываем CSC компилятором CompilerResults results = prov.CompileAssemblyFromSource(cp, fileStr); if (results.Errors != null && results.Errors.Count != 0) { string errorString = "Error! Robot script runTime compilation problem! \n"; errorString += "Path to indicator: " + path + " \n"; int errorNum = 1; foreach (var error in results.Errors) { errorString += "Error Number: " + errorNum + " \n"; errorString += error.ToString() + "\n"; errorNum++; } throw new Exception(errorString); } //string name, StartProgram startProgram) List <object> param = new List <object>(); param.Add(name); param.Add(startProgram); result = (BotPanel)results.CompiledAssembly.CreateInstance( results.CompiledAssembly.DefinedTypes.ElementAt(0).FullName, false, BindingFlags.Default, null, param.ToArray(), CultureInfo.CurrentCulture, null); if (result == null) { string errorString = "Error! Robot script runTime compilation problem! \n"; errorString += "Path to indicator: " + path + " \n"; int errorNum = 1; foreach (var error in results.Errors) { errorString += "Error Number: " + errorNum + " \n"; errorString += error.ToString() + "\n"; errorNum++; } throw new Exception(errorString); } return(result); } catch (Exception e) { string errorString = e.ToString(); throw new Exception(errorString); } }
/// <summary> /// запустить ещё одного робота, в рамках оптимизации /// </summary> /// <param name="parametrs">список всех параметров</param> /// <param name="paramOptimized">параметры по которым осуществляется перебор</param> /// <param name="faze">текущая фаза оптимизации</param> /// <param name="botsInFaze">список ботов уже запущенный в текущей фазе</param> /// <param name="botName">имя создаваемого робота</param> private void StartNewBot(List <IIStrategyParameter> parametrs, List <IIStrategyParameter> paramOptimized, OptimizerFaze faze, List <BotPanel> botsInFaze, string botName) { if (!MainWindow.GetDispatcher.CheckAccess()) { MainWindow.GetDispatcher.Invoke( new Action <List <IIStrategyParameter>, List <IIStrategyParameter>, OptimizerFaze, List <BotPanel>, string>(StartNewBot), parametrs, paramOptimized, faze, botsInFaze, botName); Thread.Sleep(1000); return; } // 1. создаём новый сервер для оптимизации. И один поток соответственно OptimizerServer server = ServerMaster.CreateNextOptimizerServer(_master.Storage, _serverNum, _master.StartDepozit); _serverNum++; _servers.Add(server); server.TestingEndEvent += server_TestingEndEvent; server.TypeTesterData = _master.Storage.TypeTesterData; server.TestintProgressChangeEvent += server_TestintProgressChangeEvent; for (int i = 0; i < _master.TabsSimpleNamesAndTimeFrames.Count; i++) { Security secToStart = _master.Storage.Securities.Find(s => s.Name == _master.TabsSimpleNamesAndTimeFrames[i].NameSecurity); server.GetDataToSecurity(secToStart, _master.TabsSimpleNamesAndTimeFrames[i].TimeFrame, faze.TimeStart, faze.TimeEnd); } // 2. создаём нового робота и прогружаем его соответствующими настройками и параметрами BotPanel bot = PanelCreator.GetStrategyForName(_master.StrategyName, botName); for (int i = 0; i < parametrs.Count; i++) { IIStrategyParameter par = paramOptimized.Find(p => p.Name == parametrs[i].Name); if (par == null) { par = parametrs[i]; } if (bot.Parameters[i].Type == StrategyParameterType.Bool) { ((StrategyParameterBool)bot.Parameters[i]).ValueBool = ((StrategyParameterBool)par).ValueBool; } else if (bot.Parameters[i].Type == StrategyParameterType.String) { ((StrategyParameterString)bot.Parameters[i]).ValueString = ((StrategyParameterString)par).ValueString; } else if (bot.Parameters[i].Type == StrategyParameterType.Int) { ((StrategyParameterInt)bot.Parameters[i]).ValueInt = ((StrategyParameterInt)par).ValueInt; } else if (bot.Parameters[i].Type == StrategyParameterType.Decimal) { ((StrategyParameterDecimal)bot.Parameters[i]).ValueDecimal = ((StrategyParameterDecimal)par).ValueDecimal; } } // настраиваем вкладки for (int i = 0; i < _master.TabsSimpleNamesAndTimeFrames.Count; i++) { bot.TabsSimple[i].Connector.ServerType = ServerType.Optimizer; bot.TabsSimple[i].Connector.PortfolioName = server.Portfolios[0].Number; bot.TabsSimple[i].Connector.NamePaper = _master.TabsSimpleNamesAndTimeFrames[i].NameSecurity; bot.TabsSimple[i].Connector.TimeFrameBuilder.TimeFrame = _master.TabsSimpleNamesAndTimeFrames[i].TimeFrame; if (server.TypeTesterData == TesterDataType.Candle) { bot.TabsSimple[i].Connector.TimeFrameBuilder.CandleCreateType = CandleSeriesCreateDataType.Tick; } else if (server.TypeTesterData == TesterDataType.MarketDepthAllCandleState || server.TypeTesterData == TesterDataType.MarketDepthOnlyReadyCandle) { bot.TabsSimple[i].Connector.TimeFrameBuilder.CandleCreateType = CandleSeriesCreateDataType.MarketDepth; } } for (int i = 0; i < _master.TabsIndexNamesAndTimeFrames.Count; i++) { bot.TabsIndex[i].Tabs.Clear(); for (int i2 = 0; i2 < _master.TabsIndexNamesAndTimeFrames[i].NamesSecurity.Count; i2++) { if (i2 >= bot.TabsIndex[i].Tabs.Count) { bot.TabsIndex[i].CreateNewSecurityConnector(); } bot.TabsIndex[i].Tabs[i2].ServerType = ServerType.Optimizer; bot.TabsIndex[i].Tabs[i2].PortfolioName = server.Portfolios[0].Number; bot.TabsIndex[i].Tabs[i2].NamePaper = _master.TabsIndexNamesAndTimeFrames[i].NamesSecurity[i2]; bot.TabsIndex[i].Tabs[i2].TimeFrameBuilder.TimeFrame = _master.TabsIndexNamesAndTimeFrames[i].TimeFrame; if (server.TypeTesterData == TesterDataType.Candle) { bot.TabsIndex[i].Tabs[i2].TimeFrameBuilder.CandleCreateType = CandleSeriesCreateDataType.Tick; } else if (server.TypeTesterData == TesterDataType.MarketDepthAllCandleState || server.TypeTesterData == TesterDataType.MarketDepthOnlyReadyCandle) { bot.TabsIndex[i].Tabs[i2].TimeFrameBuilder.CandleCreateType = CandleSeriesCreateDataType.MarketDepth; } } bot.TabsIndex[i].UserFormula = _master.TabsIndexNamesAndTimeFrames[i].Formula; } // ждём пока робот подключиться к своему серверу данных DateTime timeStartWaiting = DateTime.Now; while (bot.IsConnected == false) { Thread.Sleep(1000); if (timeStartWaiting.AddSeconds(20) < DateTime.Now) { SendLogMessage( "Слишком долгое ожидание подклчючения робота к серверу данных. Что-то пошло не так!", LogMessageType.Error); return; } } server.TestingStart(); botsInFaze.Add(bot); }
/// <summary> /// create robot /// создать робота /// </summary> public static BotPanel GetStrategyForName(string nameClass, string name, StartProgram startProgram, bool isScript) { BotPanel bot = null; // примеры и бесплатные боты if (isScript) { bot = CreateScriptStrategyByName(nameClass, name, startProgram); return(bot); } if (nameClass == "TimeOfDayBot") { bot = new TimeOfDayBot(name, startProgram); } if (nameClass == "Fisher") { bot = new Fisher(name, startProgram); } if (nameClass == "FundBalanceDivergenceBot") { bot = new FundBalanceDivergenceBot(name, startProgram); } if (nameClass == "BbPowerTrade") { bot = new BbPowerTrade(name, startProgram); } if (nameClass == "BollingerRevers") { bot = new BollingerRevers(name, startProgram); } if (nameClass == "BollingerTrailing") { bot = new BollingerTrailing(name, startProgram); } if (nameClass == "CciTrade") { bot = new CciTrade(name, startProgram); } if (nameClass == "MacdRevers") { bot = new MacdRevers(name, startProgram); } if (nameClass == "MacdTrail") { bot = new MacdTrail(name, startProgram); } if (nameClass == "OneLegArbitrage") { bot = new OneLegArbitrage(name, startProgram); } if (nameClass == "PairRsiTrade") { bot = new PairRsiTrade(name, startProgram); } if (nameClass == "PriceChannelBreak") { bot = new PriceChannelBreak(name, startProgram); } if (nameClass == "PriceChannelVolatility") { bot = new PriceChannelVolatility(name, startProgram); } if (nameClass == "RsiTrade") { bot = new RsiTrade(name, startProgram); } if (nameClass == "RviTrade") { bot = new RviTrade(name, startProgram); } if (nameClass == "MomentumMACD") { bot = new MomentumMacd(name, startProgram); } if (nameClass == "Engine") { bot = new CandleEngine(name, startProgram); } if (nameClass == "ClusterEngine") { bot = new ClusterEngine(name, startProgram); } if (nameClass == "PairTraderSimple") { bot = new PairTraderSimple(name, startProgram); } if (nameClass == "EnvelopTrend") { bot = new EnvelopTrend(name, startProgram); } if (nameClass == "ClusterCountertrend") { bot = new ClusterCountertrend(name, startProgram); } if (nameClass == "PatternTrader") { bot = new PatternTrader(name, startProgram); } if (nameClass == "HighFrequencyTrader") { bot = new HighFrequencyTrader(name, startProgram); } if (nameClass == "PivotPointsRobot") { bot = new PivotPointsRobot(name, startProgram); } if (nameClass == "Williams Band") { bot = new StrategyBillWilliams(name, startProgram); } if (nameClass == "MarketMakerBot") { bot = new MarketMakerBot(name, startProgram); } if (nameClass == "Bollinger") { bot = new StrategyBollinger(name, startProgram); } if (nameClass == "ParabolicSarTrade") { bot = new ParabolicSarTrade(name, startProgram); } if (nameClass == "PriceChannelTrade") { bot = new PriceChannelTrade(name, startProgram); } if (nameClass == "WilliamsRangeTrade") { bot = new WilliamsRangeTrade(name, startProgram); } if (nameClass == "SmaStochastic") { bot = new SmaStochastic(name, startProgram); } if (nameClass == "PinBarTrade") { bot = new PinBarTrade(name, startProgram); } if (nameClass == "TwoLegArbitrage") { bot = new TwoLegArbitrage(name, startProgram); } if (nameClass == "ThreeSoldier") { bot = new ThreeSoldier(name, startProgram); } if (nameClass == "RsiContrtrend") { bot = new RsiContrtrend(name, startProgram); } if (nameClass == "PairTraderSpreadSma") { bot = new PairTraderSpreadSma(name, startProgram); } return(bot); }
/// <summary> /// create bot /// создать бота /// </summary> public void CreateNewBot() { try { BotCreateUi ui = new BotCreateUi(BotFactory.GetNamesStrategy(), BotFactory.GetScriptsNamesStrategy(), StartProgram.IsOsTrader); ui.ShowDialog(); if (ui.IsAccepted == false) { return; } if (ui.NameStrategy == "Martingale") { if (ui.NameBot.Split('h').Length != 1) { MessageBox.Show(OsLocalization.Trader.Label6); return; } if (ui.NameBot.Split('l').Length != 1) { MessageBox.Show(OsLocalization.Trader.Label7); return; } } if (File.Exists(@"Engine\" + @"SettingsRealKeeper.txt")) { using (StreamReader reader = new StreamReader(@"Engine\" + @"SettingsRealKeeper.txt")) { while (!reader.EndOfStream) { string[] str = reader.ReadLine().Split('@'); if (str[0] == ui.NameBot) { MessageBox.Show(OsLocalization.Trader.Label8); return; } } } } if (File.Exists(@"Engine\" + @"SettingsTesterKeeper.txt")) { using (StreamReader reader = new StreamReader(@"Engine\" + @"SettingsTesterKeeper.txt")) { while (!reader.EndOfStream) { string[] str = reader.ReadLine().Split('@'); if (str[0] == ui.NameBot) { MessageBox.Show(OsLocalization.Trader.Label8); return; } } } } BotPanel newRobot = BotFactory.GetStrategyForName(ui.NameStrategy, ui.NameBot, _startProgram, ui.IsScript); if (_panelsArray == null) { _panelsArray = new List <BotPanel>(); } _panelsArray.Add(newRobot); SendNewLogMessage(OsLocalization.Trader.Label9 + newRobot.NameStrategyUniq, LogMessageType.System); ReloadActivBot(newRobot); Save(); ReloadRiskJournals(); } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } }
/// <summary> /// start listening to the bot panel /// начать прослушку панели робота /// </summary> public void Listen(BotPanel panel) { panel.LogMessageEvent += ProcessMessage; }
/// <summary> /// начать прослушку панели робота /// </summary> public void Listen(BotPanel panel) { panel.LogMessageEvent += LogMessageEvent; }
/// <summary> /// load robots with saved names /// загрузить роботов по сохранённым именам /// </summary> private void Load() { if (!File.Exists(@"Engine\Settings" + _typeWorkKeeper + "Keeper.txt")) { // if there is no file we need. Just go out // если нет нужного нам файла. Просто выходим return; } int botCount = 0; using (StreamReader reader = new StreamReader(@"Engine\Settings" + _typeWorkKeeper + "Keeper.txt")) { while (!reader.EndOfStream) { if (!string.IsNullOrWhiteSpace(reader.ReadLine())) { botCount++; } } } if (botCount == 0) { return; } _panelsArray = new List <BotPanel>(); int botIterator = 0; using (StreamReader reader = new StreamReader(@"Engine\Settings" + _typeWorkKeeper + "Keeper.txt")) { while (!reader.EndOfStream) { string[] names = reader.ReadLine().Split('@'); BotPanel bot = null; if (names.Length > 2) { try { bot = BotFactory.GetStrategyForName(names[1], names[0], _startProgram, Convert.ToBoolean(names[2])); } catch (Exception e) { SendNewLogMessage(e.ToString(), LogMessageType.Error); } } else { bot = BotFactory.GetStrategyForName(names[1], names[0], _startProgram, false); } if (bot != null) { _panelsArray.Add(bot); _tabBotNames.Items.Add(" " + _panelsArray[botIterator].NameStrategyUniq + " "); SendNewLogMessage(OsLocalization.Trader.Label2 + _panelsArray[botIterator].NameStrategyUniq, LogMessageType.System); botIterator++; } } } if (_panelsArray.Count != 0) { ReloadActivBot(_panelsArray[0]); } }
private BotPanel CreateNewBot(string botName, List <IIStrategyParameter> parametrs, List <IIStrategyParameter> paramOptimized, OptimizerServer server, StartProgram regime) { BotPanel bot = BotFactory.GetStrategyForName(_master.StrategyName, botName, regime, _master.IsScript); for (int i = 0; i < parametrs.Count; i++) { IIStrategyParameter par = paramOptimized.Find(p => p.Name == parametrs[i].Name); if (par == null) { par = parametrs[i]; } if (par.Type == StrategyParameterType.Bool) { ((StrategyParameterBool)bot.Parameters[i]).ValueBool = ((StrategyParameterBool)par).ValueBool; } else if (par.Type == StrategyParameterType.String) { ((StrategyParameterString)bot.Parameters[i]).ValueString = ((StrategyParameterString)par).ValueString; } else if (par.Type == StrategyParameterType.Int) { ((StrategyParameterInt)bot.Parameters[i]).ValueInt = ((StrategyParameterInt)par).ValueInt; } else if (par.Type == StrategyParameterType.Decimal) { ((StrategyParameterDecimal)bot.Parameters[i]).ValueDecimal = ((StrategyParameterDecimal)par).ValueDecimal; } else if (par.Type == StrategyParameterType.TimeOfDay) { ((StrategyParameterTimeOfDay)bot.Parameters[i]).Value = ((StrategyParameterTimeOfDay)par).Value; } } // custom tabs // настраиваем вкладки for (int i = 0; i < _master.TabsSimpleNamesAndTimeFrames.Count; i++) { bot.TabsSimple[i].Connector.ServerType = ServerType.Optimizer; bot.TabsSimple[i].Connector.PortfolioName = server.Portfolios[0].Number; bot.TabsSimple[i].Connector.NamePaper = _master.TabsSimpleNamesAndTimeFrames[i].NameSecurity; bot.TabsSimple[i].Connector.TimeFrame = _master.TabsSimpleNamesAndTimeFrames[i].TimeFrame; bot.TabsSimple[i].Connector.ServerUid = server.NumberServer; bot.TabsSimple[i].ComissionType = _master.CommissionType; bot.TabsSimple[i].ComissionValue = _master.CommissionValue; if (server.TypeTesterData == TesterDataType.Candle) { bot.TabsSimple[i].Connector.CandleMarketDataType = CandleMarketDataType.Tick; } else if (server.TypeTesterData == TesterDataType.MarketDepthAllCandleState || server.TypeTesterData == TesterDataType.MarketDepthOnlyReadyCandle) { bot.TabsSimple[i].Connector.CandleMarketDataType = CandleMarketDataType.MarketDepth; } } for (int i = 0; _master.TabsIndexNamesAndTimeFrames != null && i < _master.TabsIndexNamesAndTimeFrames.Count; i++) { bot.TabsIndex[i].Tabs.Clear(); for (int i2 = 0; i2 < _master.TabsIndexNamesAndTimeFrames[i].NamesSecurity.Count; i2++) { if (i2 >= bot.TabsIndex[i].Tabs.Count) { bot.TabsIndex[i].CreateNewSecurityConnector(); } bot.TabsIndex[i].Tabs[i2].ServerType = ServerType.Optimizer; bot.TabsIndex[i].Tabs[i2].PortfolioName = server.Portfolios[0].Number; bot.TabsIndex[i].Tabs[i2].NamePaper = _master.TabsIndexNamesAndTimeFrames[i].NamesSecurity[i2]; bot.TabsIndex[i].Tabs[i2].ServerUid = server.NumberServer; bot.TabsIndex[i].Tabs[i2].TimeFrame = _master.TabsIndexNamesAndTimeFrames[i].TimeFrame; if (server.TypeTesterData == TesterDataType.Candle) { bot.TabsIndex[i].Tabs[i2].CandleMarketDataType = CandleMarketDataType.Tick; } else if (server.TypeTesterData == TesterDataType.MarketDepthAllCandleState || server.TypeTesterData == TesterDataType.MarketDepthOnlyReadyCandle) { bot.TabsIndex[i].Tabs[i2].CandleMarketDataType = CandleMarketDataType.MarketDepth; } } bot.TabsIndex[i].UserFormula = _master.TabsIndexNamesAndTimeFrames[i].Formula; } return(bot); }
/// <summary> /// create robot /// создать робота /// </summary> public static BotPanel GetStrategyForName(string nameClass, string name, StartProgram startProgram) { BotPanel bot = null; // примеры и бесплатные боты if (nameClass == "ClusterCountertrend") { bot = new ClusterCountertrend(name, startProgram); } if (nameClass == "PatternTrader") { bot = new PatternTrader(name, startProgram); } if (nameClass == "HighFrequencyTrader") { bot = new HighFrequencyTrader(name, startProgram); } if (nameClass == "PivotPointsRobot") { bot = new PivotPointsRobot(name, startProgram); } if (nameClass == "Williams Band") { bot = new StrategyBillWilliams(name, startProgram); } if (nameClass == "MarketMakerBot") { bot = new MarketMakerBot(name, startProgram); } if (nameClass == "Bollinger") { bot = new StrategyBollinger(name, startProgram); } if (nameClass == "ParabolicSarTrade") { bot = new ParabolicSarTrade(name, startProgram); } if (nameClass == "PriceChannelTrade") { bot = new PriceChannelTrade(name, startProgram); } if (nameClass == "WilliamsRangeTrade") { bot = new WilliamsRangeTrade(name, startProgram); } if (nameClass == "SmaStochastic") { bot = new SmaStochastic(name, startProgram); } if (nameClass == "PinBarTrade") { bot = new PinBarTrade(name, startProgram); } if (nameClass == "TwoLegArbitrage") { bot = new TwoLegArbitrage(name, startProgram); } if (nameClass == "ThreeSoldier") { bot = new ThreeSoldier(name, startProgram); } if (nameClass == "RsiContrtrend") { bot = new RsiContrtrend(name, startProgram); } if (nameClass == "PairTraderSpreadSma") { bot = new PairTraderSpreadSma(name, startProgram); } return(bot); }
/// <summary> /// создать бота /// </summary> public void CreateNewBot() { try { // 1 вызываем диалог для выбора имени робота PanelCreateUi ui = new PanelCreateUi(); ui.ShowDialog(); if (ui.IsAccepted == false) { return; } if (ui.NameStrategy == "Martingale") { if (ui.NameBot.Split('h').Length != 1) { MessageBox.Show("Невозможно завершить создание робота. Символ h зарезервирован для ситсемы"); return; } if (ui.NameBot.Split('l').Length != 1) { MessageBox.Show("Невозможно завершить создание робота. Символ l зарезервирован для ситсемы"); return; } } // 2 проверяем, что имя робота не нарушает никаких правил if (File.Exists(@"Engine\" + @"SettingsRealKeeper.txt")) { using (StreamReader reader = new StreamReader(@"Engine\" + @"SettingsRealKeeper.txt")) { while (!reader.EndOfStream) { string[] str = reader.ReadLine().Split('@'); if (str[0] == ui.NameBot) { MessageBox.Show("Не возможно завершить создание робота. Робот с таким именем уже существует."); return; } } } } if (File.Exists(@"Engine\" + @"SettingsTesterKeeper.txt")) { using (StreamReader reader = new StreamReader(@"Engine\" + @"SettingsTesterKeeper.txt")) { while (!reader.EndOfStream) { string[] str = reader.ReadLine().Split('@'); if (str[0] == ui.NameBot) { MessageBox.Show("Не возможно завершить создание робота. Робот с таким именем уже существует."); return; } } } } // 3 создаём робота и сохраняем BotPanel newRobot = PanelCreator.GetStrategyForName(ui.NameStrategy, ui.NameBot); if (_panelsArray == null) { _panelsArray = new List <BotPanel>(); } _panelsArray.Add(newRobot); SendNewLogMessage("Создан новый бот " + newRobot.NameStrategyUniq, LogMessageType.System); ReloadActivBot(newRobot); Save(); // перегружаем риск менеджер ReloadRiskJournals(); } catch (Exception error) { SendNewLogMessage(error.ToString(), LogMessageType.Error); } }
/// <summary> /// Вычитать из бота на форму /// </summary> private void SetComboBoxItemByTab(int index) { setByActiveTab = true; setByActiveTab2 = true; setByActiveTab3 = true; if (_strategyKeeper.PanelsArray.Count > 0 & index != -1) { BotPanel master = _strategyKeeper.PanelsArray[index]; if (master.TabsHandy.Count > 0) { BotTabHandy tab = master.TabsHandy[0]; DataContext = this; ////Combobox Clasters cbItems.Clear(); //Выберем группы и их признак "печать по умолчанию" var grpDict = tab._indicatorOnTheFlyClaster.commonList.GroupBy(p => p.group, p => p.itsForPlot ? 1 : 0, (key, g) => new { Groups = key, Bools = g.Max() }); foreach (var kvp in grpDict) { var cbItem = new ComboBoxItem { Content = kvp.Groups }; if (kvp.Bools == 1) { cbItem.IsSelected = true; SelectedcbItem = cbItem; } cbItems.Add(cbItem); } ////Combobox Candle cbItems2.Clear(); //Выберем группы и их признак "печать по умолчанию" var grpDict2 = tab._indicatorOnTheFlyPrime.commonList.GroupBy(p => p.group, p => p.itsForPlot ? 1 : 0, (key, g) => new { Groups = key, Bools = g.Max() }); foreach (var kvp in grpDict2) { var cbItem = new ComboBoxItem { Content = kvp.Groups }; if (kvp.Bools == 1) { cbItem.IsSelected = true; SelectedcbItem2 = cbItem; } cbItems2.Add(cbItem); } ////Combobox Secondary cbItems3.Clear(); //Выберем группы и их признак "печать по умолчанию" var grpDict3 = tab._indicatorOnTheFlySecondary.commonList.GroupBy(p => p.group, p => p.itsForPlot ? 1 : 0, (key, g) => new { Groups = key, Bools = g.Max() }); foreach (var kvp in grpDict3) { var cbItem = new ComboBoxItem { Content = kvp.Groups }; if (kvp.Bools == 1) { cbItem.IsSelected = true; SelectedcbItem3 = cbItem; } cbItems3.Add(cbItem); } } } setByActiveTab = false; setByActiveTab2 = false; setByActiveTab3 = false; }
public void LoadState(BotPanel bot) { BotName = bot.NameStrategyUniq; // фасуем отчёты по вкладкам List <Position> allPositionsForAllTabs = new List <Position>(); for (int i = 0; i < bot.TabsSimple.Count; i++) { OptimizerReportTab tab = new OptimizerReportTab(); List <Position> positions = bot.TabsSimple[i].GetJournal().AllPosition.FindAll( pos => pos.State != PositionStateType.OpeningFail); if (positions.Count == 0) { continue; } allPositionsForAllTabs.AddRange(positions); Position[] posesArray = positions.ToArray(); tab.SecurityName = bot.TabsSimple[i].Securiti.Name; tab.PositionsCount = positions.Count; tab.TotalProfit = PositionStaticticGenerator.GetAllProfitInPunkt(posesArray); tab.MaxDrowDawn = PositionStaticticGenerator.GetMaxDownPersent(posesArray); tab.AverageProfit = tab.TotalProfit / (posesArray.Length + 1); tab.AverageProfitPercent = PositionStaticticGenerator.GetMidleProfitInPersent(posesArray); tab.ProfitFactor = PositionStaticticGenerator.GetProfitFactor(posesArray); tab.Recovery = PositionStaticticGenerator.GetRecovery(posesArray); tab.PayOffRatio = PositionStaticticGenerator.GetPayOffRatio(posesArray); tab.TabType = bot.TabsSimple[i].GetType().Name; TabsReports.Add(tab); } if (TabsReports.Count == 0) { return; } // формируем общие данные по отчёту if (TabsReports.Count == 1) { PositionsCount = TabsReports[0].PositionsCount; TotalProfit = TabsReports[0].TotalProfit; MaxDrowDawn = TabsReports[0].MaxDrowDawn; AverageProfit = TabsReports[0].AverageProfit; AverageProfitPercent = TabsReports[0].AverageProfitPercent; ProfitFactor = TabsReports[0].ProfitFactor; Recovery = TabsReports[0].Recovery; PayOffRatio = TabsReports[0].PayOffRatio; } else { allPositionsForAllTabs = PositionStaticticGenerator.SortByTime(allPositionsForAllTabs); Position[] posesArray = allPositionsForAllTabs.ToArray(); PositionsCount = allPositionsForAllTabs.Count; TotalProfit = PositionStaticticGenerator.GetAllProfitInPunkt(posesArray); MaxDrowDawn = PositionStaticticGenerator.GetMaxDownPersent(posesArray); AverageProfit = PositionStaticticGenerator.GetMidleProfitInPunkt(posesArray); AverageProfitPercent = PositionStaticticGenerator.GetMidleProfitInPersent(posesArray); ProfitFactor = PositionStaticticGenerator.GetProfitFactor(posesArray); Recovery = PositionStaticticGenerator.GetRecovery(posesArray); PayOffRatio = PositionStaticticGenerator.GetPayOffRatio(posesArray); } }