/// <summary> /// Optimize all the checked parameters /// </summary> private void OptimizeParams(BackgroundWorker worker, DoWorkEventArgs e) { int bestBalance = (_isOOS ? Backtester.Balance(_barOOS) : Backtester.NetBalance); // First Optimization Cycle for (int round = 0; round < _checkedParams && _isOptimizing; round++) { if (worker.CancellationPending) break; int param = _aiChecked[round]; var min = (double) AnudParameterMin[param].Value; var max = (double) AnudParameterMax[param].Value; var step = (double) AnudParameterStep[param].Value; for (double value = min; value <= max; value += step) { if (worker.CancellationPending) break; AParameter[param].Value = value; if (AParameter[param].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param].SlotNumber); Backtester.Calculate(); Backtester.CalculateAccountStats(); if (ChbOptimizerWritesReport.Checked) FillInReport(); int balance = _isOOS ? Backtester.Balance(_barOOS) : Backtester.NetBalance; if (balance > bestBalance && IsLimitationsFulfilled()) { bestBalance = balance; AParameter[param].BestValue = value; ShowParamBestValue(param); BalanceChart.SetChartData(); BalanceChart.InitChart(); BalanceChart.Invalidate(); _isStartegyChanged = true; SetStrategyToGeneratorHistory(); } // Report progress as a percentage of the total task. _computedCycles++; int percentComplete = 100*_computedCycles/_cycles; percentComplete = percentComplete > 100 ? 100 : percentComplete; if (percentComplete > _progressPercent) { _progressPercent = percentComplete; worker.ReportProgress(percentComplete); } } AParameter[param].Value = AParameter[param].BestValue; if (AParameter[param].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param].SlotNumber); Backtester.Calculate(); Backtester.CalculateAccountStats(); } if (worker.CancellationPending) { e.Cancel = true; return; } if (_checkedParams < 2) return; // Counts the necessary round int rounds = 0; for (int i = 0; i < _checkedParams - 1; i++) for (int j = 0; j < _checkedParams; j++) if (i < j) rounds++; var aCP = new CoupleOfParams[rounds]; var aCPTemp = new CoupleOfParams[rounds]; rounds = 0; for (int i = 0; i < _checkedParams - 1; i++) for (int j = 0; j < _checkedParams; j++) if (i < j) { aCPTemp[rounds].Param1 = _aiChecked[i]; aCPTemp[rounds].Param2 = _aiChecked[j]; aCPTemp[rounds].IsPassed = false; rounds++; } // Shaking the parameters for (int round = 0; round < rounds; round++) { int couple; do { couple = _rand.Next(rounds); } while (aCPTemp[couple].IsPassed); aCPTemp[couple].IsPassed = true; aCP[round] = aCPTemp[couple]; } // The Optimization Cycle for (int round = 0; round < rounds; round++) { if (worker.CancellationPending) break; int param1 = aCP[round].Param1; int param2 = aCP[round].Param2; bool isOneIndicator = (AParameter[param1].Type == OptimizerParameterType.Indicator && AParameter[param2].Type == OptimizerParameterType.Indicator && AParameter[param1].IndParam.IndicatorName == AParameter[param2].IndParam.IndicatorName); var min1 = (double) AnudParameterMin[param1].Value; var max1 = (double) AnudParameterMax[param1].Value; var step1 = (double) AnudParameterStep[param1].Value; var min2 = (double) AnudParameterMin[param2].Value; var max2 = (double) AnudParameterMax[param2].Value; var step2 = (double) AnudParameterStep[param2].Value; for (double value1 = min1; value1 <= max1; value1 += step1) { if (worker.CancellationPending) break; if (!isOneIndicator) { AParameter[param1].Value = value1; if (AParameter[param1].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param1].SlotNumber); } for (double value2 = min2; value2 <= max2; value2 += step2) { if (worker.CancellationPending) break; if (isOneIndicator) { AParameter[param1].Value = value1; AParameter[param2].Value = value2; if (AParameter[param1].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param1].SlotNumber); } else { AParameter[param2].Value = value2; if (AParameter[param2].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param2].SlotNumber); } // Calculates the Strategy Backtester.Calculate(); Backtester.CalculateAccountStats(); if (ChbOptimizerWritesReport.Checked) FillInReport(); int balance = _isOOS ? Backtester.Balance(_barOOS) : Backtester.NetBalance; if (balance > bestBalance && IsLimitationsFulfilled()) { bestBalance = balance; AParameter[param1].BestValue = value1; AParameter[param2].BestValue = value2; ShowParamBestValue(param1); ShowParamBestValue(param2); BalanceChart.SetChartData(); BalanceChart.InitChart(); BalanceChart.Invalidate(); _isStartegyChanged = true; SetStrategyToGeneratorHistory(); } // Report progress as a percentage of the total task. _computedCycles++; int percentComplete = 100*_computedCycles/_cycles; percentComplete = percentComplete > 100 ? 100 : percentComplete; if (percentComplete > _progressPercent) { _progressPercent = percentComplete; worker.ReportProgress(percentComplete); } } } AParameter[param1].Value = AParameter[param1].BestValue; AParameter[param2].Value = AParameter[param2].BestValue; if (isOneIndicator) { if (AParameter[param1].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param1].SlotNumber); } else { if (AParameter[param1].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param1].SlotNumber); if (AParameter[param2].Type == OptimizerParameterType.Indicator) CalculateIndicator(AParameter[param2].SlotNumber); } Backtester.Calculate(); Backtester.CalculateAccountStats(); } if (worker.CancellationPending) { e.Cancel = true; } }
/// <summary> /// Optimize all the checked parameters /// </summary> private void OptimizeParams(BackgroundWorker worker, DoWorkEventArgs e) { int bestBalance = (_isOOS ? Backtester.Balance(_barOOS) : Backtester.NetBalance); // First Optimization Cycle for (int round = 0; round < _checkedParams && _isOptimizing; round++) { if (worker.CancellationPending) { break; } int param = _aiChecked[round]; var min = (double)AnudParameterMin[param].Value; var max = (double)AnudParameterMax[param].Value; var step = (double)AnudParameterStep[param].Value; for (double value = min; value <= max; value += step) { if (worker.CancellationPending) { break; } AParameter[param].Value = value; if (AParameter[param].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param].SlotNumber); } Backtester.Calculate(); Backtester.CalculateAccountStats(); if (ChbOptimizerWritesReport.Checked) { FillInReport(); } int balance = _isOOS ? Backtester.Balance(_barOOS) : Backtester.NetBalance; if (balance > bestBalance && IsLimitationsFulfilled()) { bestBalance = balance; AParameter[param].BestValue = value; ShowParamBestValue(param); BalanceChart.SetChartData(); BalanceChart.InitChart(); BalanceChart.Invalidate(); _isStartegyChanged = true; SetStrategyToGeneratorHistory(); } // Report progress as a percentage of the total task. _computedCycles++; int percentComplete = 100 * _computedCycles / _cycles; percentComplete = percentComplete > 100 ? 100 : percentComplete; if (percentComplete > _progressPercent) { _progressPercent = percentComplete; worker.ReportProgress(percentComplete); } } AParameter[param].Value = AParameter[param].BestValue; if (AParameter[param].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param].SlotNumber); } Backtester.Calculate(); Backtester.CalculateAccountStats(); } if (worker.CancellationPending) { e.Cancel = true; return; } if (_checkedParams < 2) { return; } // Counts the necessary round int rounds = 0; for (int i = 0; i < _checkedParams - 1; i++) { for (int j = 0; j < _checkedParams; j++) { if (i < j) { rounds++; } } } var aCP = new CoupleOfParams[rounds]; var aCPTemp = new CoupleOfParams[rounds]; rounds = 0; for (int i = 0; i < _checkedParams - 1; i++) { for (int j = 0; j < _checkedParams; j++) { if (i < j) { aCPTemp[rounds].Param1 = _aiChecked[i]; aCPTemp[rounds].Param2 = _aiChecked[j]; aCPTemp[rounds].IsPassed = false; rounds++; } } } // Shaking the parameters for (int round = 0; round < rounds; round++) { int couple; do { couple = _rand.Next(rounds); } while (aCPTemp[couple].IsPassed); aCPTemp[couple].IsPassed = true; aCP[round] = aCPTemp[couple]; } // The Optimization Cycle for (int round = 0; round < rounds; round++) { if (worker.CancellationPending) { break; } int param1 = aCP[round].Param1; int param2 = aCP[round].Param2; bool isOneIndicator = (AParameter[param1].Type == OptimizerParameterType.Indicator && AParameter[param2].Type == OptimizerParameterType.Indicator && AParameter[param1].IndParam.IndicatorName == AParameter[param2].IndParam.IndicatorName); var min1 = (double)AnudParameterMin[param1].Value; var max1 = (double)AnudParameterMax[param1].Value; var step1 = (double)AnudParameterStep[param1].Value; var min2 = (double)AnudParameterMin[param2].Value; var max2 = (double)AnudParameterMax[param2].Value; var step2 = (double)AnudParameterStep[param2].Value; for (double value1 = min1; value1 <= max1; value1 += step1) { if (worker.CancellationPending) { break; } if (!isOneIndicator) { AParameter[param1].Value = value1; if (AParameter[param1].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param1].SlotNumber); } } for (double value2 = min2; value2 <= max2; value2 += step2) { if (worker.CancellationPending) { break; } if (isOneIndicator) { AParameter[param1].Value = value1; AParameter[param2].Value = value2; if (AParameter[param1].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param1].SlotNumber); } } else { AParameter[param2].Value = value2; if (AParameter[param2].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param2].SlotNumber); } } // Calculates the Strategy Backtester.Calculate(); Backtester.CalculateAccountStats(); if (ChbOptimizerWritesReport.Checked) { FillInReport(); } int balance = _isOOS ? Backtester.Balance(_barOOS) : Backtester.NetBalance; if (balance > bestBalance && IsLimitationsFulfilled()) { bestBalance = balance; AParameter[param1].BestValue = value1; AParameter[param2].BestValue = value2; ShowParamBestValue(param1); ShowParamBestValue(param2); BalanceChart.SetChartData(); BalanceChart.InitChart(); BalanceChart.Invalidate(); _isStartegyChanged = true; SetStrategyToGeneratorHistory(); } // Report progress as a percentage of the total task. _computedCycles++; int percentComplete = 100 * _computedCycles / _cycles; percentComplete = percentComplete > 100 ? 100 : percentComplete; if (percentComplete > _progressPercent) { _progressPercent = percentComplete; worker.ReportProgress(percentComplete); } } } AParameter[param1].Value = AParameter[param1].BestValue; AParameter[param2].Value = AParameter[param2].BestValue; if (isOneIndicator) { if (AParameter[param1].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param1].SlotNumber); } } else { if (AParameter[param1].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param1].SlotNumber); } if (AParameter[param2].Type == OptimizerParameterType.Indicator) { CalculateIndicator(AParameter[param2].SlotNumber); } } Backtester.Calculate(); Backtester.CalculateAccountStats(); } if (worker.CancellationPending) { e.Cancel = true; } }