private OptimizerServer CreateNewServer(OptimazerFazeReport report) { // 1. Create a new server for optimization. And one thread respectively // 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; _master.TabsSimpleNamesAndTimeFrames != null && 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, report.Faze.TimeStart, report.Faze.TimeEnd); } for (int i = 0; _master.TabsIndexNamesAndTimeFrames != null && i < _master.TabsIndexNamesAndTimeFrames.Count; i++) { List <string> secNames = _master.TabsIndexNamesAndTimeFrames[i].NamesSecurity; for (int i2 = 0; secNames != null && i2 < secNames.Count; i2++) { string curSec = secNames[i2]; Security secToStart = _master.Storage.Securities.Find(s => s.Name == curSec); server.GetDataToSecurity(secToStart, _master.TabsIndexNamesAndTimeFrames[i].TimeFrame, report.Faze.TimeStart, report.Faze.TimeEnd); } } return(server); }
/// <summary> /// launch another robot as part of optimization /// запустить ещё одного робота, в рамках оптимизации /// </summary> /// <param name="parametrs">list of all parameters/список всех параметров</param> /// <param name="paramOptimized">brute force options/параметры по которым осуществляется перебор</param> /// <param name="faze">current optimization phase/текущая фаза оптимизации</param> /// <param name="botsInFaze">list of bots already running in the current phase/список ботов уже запущенный в текущей фазе</param> /// <param name="botName">the name of the created robot/имя создаваемого робота</param> private async 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); await Task.Delay(1000); return; } // 1. Create a new server for optimization. And one thread respectively // 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. create a new robot and upload it with the appropriate settings and parameters // 2. создаём нового робота и прогружаем его соответствующими настройками и параметрами BotPanel bot = BotFactory.GetStrategyForName(_master.StrategyName, botName, StartProgram.IsOsOptimizer, _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 (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; } } // 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; 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; 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].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; } // wait for the robot to connect to its data server // ждём пока робот подключиться к своему серверу данных DateTime timeStartWaiting = DateTime.Now; while (bot.IsConnected == false) { await Task.Delay(1000); if (timeStartWaiting.AddSeconds(20) < DateTime.Now) { SendLogMessage( OsLocalization.Optimizer.Message10, LogMessageType.Error); return; } } server.TestingStart(); botsInFaze.Add(bot); }
/// <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.Bool) { ((StrategyParameterBool)bot.Parameters[i]).ValueBool = ((StrategyParameterBool)par).ValueBool; } } // настраиваем вкладки 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); }