public void LoadFromString(string saveStr) { string[] str = saveStr.Split('^'); Faze = new OptimizerFaze(); Faze.LoadFromString(str[0]); for (int i = 1; i < str.Length - 1; i++) { OptimizerReport newReport = new OptimizerReport(); newReport.LoadFromString(str[i]); Reports.Add(newReport); } }
/// <summary> /// filtering results at the end of the current phase /// фильтрация результатов в конце текущей фазы /// </summary> private void EndOfFazeFiltration(List <BotPanel> bots, OptimizerFaze faze, List <BotPanel> botsToOutOfSample) { int startCount = bots.Count; for (int i = 0; i < bots.Count; i++) { if (_master.FilterMiddleProfitIsOn && bots[i].MiddleProfitInPersent < _master.FilterMiddleProfitValue) { } else if (_master.FilterProfitIsOn && bots[i].TotalProfitInPersent < _master.FilterProfitValue) { } else if (_master.FilterMaxDrowDownIsOn && bots[i].MaxDrowDown < _master.FilterMaxDrowDownValue) { } else if (_master.FilterProfitFactorIsOn && bots[i].ProfitFactor < _master.FilterProfitFactorValue) { } else if (_master.FilterWinPositionIsOn && bots[i].WinPositionPersent < _master.FilterWinPositionValue / 100) { } else if (_master.FilterDealsCountIsOn && bots[i].PositionsCount < _master.FilterDealsCountValue) { } else { botsToOutOfSample.Add(bots[i]); } } if (botsToOutOfSample.Count == 0) { SendLogMessage(OsLocalization.Optimizer.Message8, LogMessageType.System); MessageBox.Show(OsLocalization.Optimizer.Message8); NeadToMoveUiToEvent(NeadToMoveUiTo.TabsAndTimeFrames); } else if (startCount != botsToOutOfSample.Count) { SendLogMessage(OsLocalization.Optimizer.Message9 + (startCount - botsToOutOfSample.Count), LogMessageType.System); } }
/// <summary> /// фильтрация результатов в конце текущей фазы /// </summary> private void EndOfFazeFiltration(List <BotPanel> bots, OptimizerFaze faze, List <BotPanel> botsToOutOfSample) { int startCount = bots.Count; for (int i = 0; i < bots.Count; i++) { if (_master.FilterMiddleProfitIsOn && bots[i].MiddleProfitInPersent < _master.FilterMiddleProfitValue) { } else if (_master.FilterProfitIsOn && bots[i].TotalProfitInPersent < _master.FilterProfitValue) { } else if (_master.FilterMaxDrowDownIsOn && bots[i].MaxDrowDown < _master.FilterMaxDrowDownValue) { } else if (_master.FilterProfitFactorIsOn && bots[i].ProfitFactor < _master.FilterProfitFactorValue) { } else if (_master.FilterWinPositionIsOn && bots[i].WinPositionPersent < _master.FilterWinPositionValue / 100) { } else { botsToOutOfSample.Add(bots[i]); } } if (botsToOutOfSample.Count == 0) { SendLogMessage("К сожалению все боты были отфильтрованы. Поставьте более щадящие настройки для выбраковки результатов", LogMessageType.System); MessageBox.Show("К сожалению все боты были отфильтрованы. Поставьте более щадящие настройки для выбраковки результатов"); NeadToMoveUiToEvent(NeadToMoveUiTo.TabsAndTimeFrames); } else if (startCount != botsToOutOfSample.Count) { SendLogMessage("Отфильтрованно ботов: " + (startCount - botsToOutOfSample.Count), LogMessageType.System); } }
/// <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); }
private async void StartOptimazeFazeInSample(OptimizerFaze faze, OptimazerFazeReport report, List <IIStrategyParameter> allParameters, List <bool> parametersToOptimization) { ReloadAllParam(allParameters); // 2 проходим первую фазу, когда нужно обойти все варианты List <IIStrategyParameter> optimizedParamStart = new List <IIStrategyParameter>(); for (int i = 0; i < allParameters.Count; i++) { if (parametersToOptimization[i]) { optimizedParamStart.Add(allParameters[i]); } } List <IIStrategyParameter> optimizeParamCurrent = CopyParameters(optimizedParamStart); ReloadAllParam(optimizeParamCurrent); bool isStart = true; while (true) { bool isAndOfFaze = false; // all parameters passed/все параметры пройдены for (int i2 = 0; i2 < optimizeParamCurrent.Count + 1; i2++) { if (i2 == optimizeParamCurrent.Count) { isAndOfFaze = true; break; } if (isStart) { isStart = false; break; } if (optimizeParamCurrent[i2].Type == StrategyParameterType.Int) { StrategyParameterInt parameter = (StrategyParameterInt)optimizeParamCurrent[i2]; if (parameter.ValueInt < parameter.ValueIntStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueInt = parameter.ValueInt + parameter.ValueIntStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizeParamCurrent[i3]); } } break; } } else if (optimizeParamCurrent[i2].Type == StrategyParameterType.Decimal ) { StrategyParameterDecimal parameter = (StrategyParameterDecimal)optimizeParamCurrent[i2]; if (parameter.ValueDecimal < parameter.ValueDecimalStop) { // at the current index you can increment the value // по текущему индексу можно приращивать значение parameter.ValueDecimal = parameter.ValueDecimal + parameter.ValueDecimalStep; if (i2 > 0) { for (int i3 = 0; i3 < i2; i3++) { // reset all previous parameters to zero // сбрасываем все предыдущие параметры в ноль ReloadParam(optimizeParamCurrent[i3]); } } break; } } } if (isAndOfFaze) { break; } while (_servers.Count >= _master.ThreadsCount) { Thread.Sleep(50); } if (_neadToStop) { while (true) { Thread.Sleep(50); if (_servers.Count == 0) { break; } } TestReadyEvent?.Invoke(ReportsToFazes); _primeThreadWorker = null; return; } while (_botsInTest.Count >= _master.ThreadsCount) { Thread.Sleep(50); } //SendLogMessage("BotInSample" ,LogMessageType.System); StartNewBot(_parameters, optimizeParamCurrent, report, " InSample"); } while (true) { Thread.Sleep(50); if (_servers.Count == 0) // || _botsInTest.Count == 0) { break; } } SendLogMessage(OsLocalization.Optimizer.Message5, LogMessageType.System); }
/// <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); }
/// <summary> /// разбить общее время на фазы /// </summary> public void ReloadFazes() { int fazeCount = _fazeCount; if (fazeCount < 1) { fazeCount = 1; } fazeCount *= 2; int dayAll = Convert.ToInt32((TimeEnd - TimeStart).TotalDays); if (dayAll < 2) { SendLogMessage("Число дней в истории слишком мало для оптимизации", LogMessageType.System); return; } while (dayAll / fazeCount < 1) { fazeCount -= 2; } int dayOutOfSample = Convert.ToInt32(dayAll * (_percentOnFilration / 100)) / (fazeCount / 2); if (dayOutOfSample < 1) { dayOutOfSample = 1; } int dayInSample = (dayAll - (dayOutOfSample * (fazeCount / 2))) / (fazeCount / 2); if (dayInSample < 0) { dayInSample = 1; } List <int> fazesLenght = new List <int>(); for (int i = 0; i < fazeCount; i++) { if (i % 2 == 0) { fazesLenght.Add(dayInSample); } else { fazesLenght.Add(dayOutOfSample); } } while (fazesLenght.Sum() > dayAll) { for (int i = 0; i < fazesLenght.Count; i++) { if (fazesLenght[i] != 1) { fazesLenght[i] -= 1; break; } if (i + 1 == fazesLenght.Count) { SendLogMessage("Слишком малое кол-во дней для такого количества фаз", LogMessageType.System); return; } } } while (fazesLenght.Sum() < dayAll) { fazesLenght[0] += 1; } Fazes = new List <OptimizerFaze>(); DateTime time = _timeStart; for (int i = 0; i < fazeCount; i++) { OptimizerFaze newFaze = new OptimizerFaze(); newFaze.TimeStart = time; time = time.AddDays(fazesLenght[i]); newFaze.TimeEnd = time; newFaze.Days = fazesLenght[i]; if (i % 2 != 0) { newFaze.TypeFaze = OptimizerFazeType.OutOfSample; } else { newFaze.TypeFaze = OptimizerFazeType.InSample; } Fazes.Add(newFaze); } }
/// <summary> /// break the total time into phases /// разбить общее время на фазы /// </summary> public void ReloadFazes() { int fazeCount = IterationCount; if (fazeCount < 1) { fazeCount = 1; } if (TimeEnd == DateTime.MinValue || TimeStart == DateTime.MinValue) { SendLogMessage(OsLocalization.Optimizer.Message12, LogMessageType.System); return; } int dayAll = Convert.ToInt32((TimeEnd - TimeStart).TotalDays); if (dayAll < 2) { SendLogMessage(OsLocalization.Optimizer.Message12, LogMessageType.System); return; } int daysOnIteration = dayAll / fazeCount; int daysOnForward = Convert.ToInt32(daysOnIteration * (_percentOnFilration / 100)); int daysOnInSample = (dayAll - daysOnForward) / fazeCount; Fazes = new List <OptimizerFaze>(); DateTime time = _timeStart; for (int i = 0; i < fazeCount; i++) { OptimizerFaze newFaze = new OptimizerFaze(); newFaze.TypeFaze = OptimizerFazeType.InSample; newFaze.TimeStart = time; time = time.AddDays(daysOnInSample); newFaze.Days = daysOnInSample; Fazes.Add(newFaze); OptimizerFaze newFazeOut = new OptimizerFaze(); newFazeOut.TypeFaze = OptimizerFazeType.OutOfSample; newFazeOut.TimeStart = time; newFazeOut.Days = daysOnForward; Fazes.Add(newFazeOut); } while (DaysInFazes(Fazes) != dayAll) { int daysGone = DaysInFazes(Fazes) - dayAll; for (int i = 0; i < Fazes.Count && daysGone != 0; i++) { if (daysGone > 0) { Fazes[i].Days--; if (Fazes[i].TypeFaze == OptimizerFazeType.InSample) { Fazes[i + 1].TimeStart = Fazes[i + 1].TimeStart.AddDays(-1); } daysGone--; } else if (daysGone < 0) { Fazes[i].Days++; if (Fazes[i].TypeFaze == OptimizerFazeType.InSample) { Fazes[i + 1].TimeStart = Fazes[i + 1].TimeStart.AddDays(+1); } daysGone++; } } } }