/// <summary>
        ///     Constructor
        /// </summary>
        public Generator()
        {
            GeneratedDescription = string.Empty;
            strategyBest = Data.Strategy.Clone();
            bestValue = isOOS ? Backtester.Balance(barOOS) : Backtester.NetBalance;
            isGenerating = false;
            isStartegyChanged = false;
            indicatorBlackList = new List<string>();

            colorText = LayoutColors.ColorControlText;

            toolStrip = new ToolStrip();
            strategyField = new StrategyLayout(strategyBest);
            pnlCommon = new FancyPanel(Language.T("Common"));
            pnlCriteriaBase = new FancyPanel(Language.T("Acceptance Criteria"));
            criteriaPanel = new ScrollFlowPanel();
            criteriaControls = new CriteriaControls();
            pnlSettings = new FancyPanel(Language.T("Settings"));
            pnlSorting = new FancyPanel(Language.T("Custom Sorting"));
            pnlTop10 = new FancyPanel(Language.T("Top 10"));
            pnlIndicators = new FancyPanel(Language.T("Indicators"));
            balanceChart = new SmallBalanceChart();
            infpnlAccountStatistics = new InfoPanel();
            progressBar = new ProgressBar();
            lblCalcStrInfo = new Label();
            lblCalcStrNumb = new Label();
            lblBenchmarkInfo = new Label();
            lblBenchmarkNumb = new Label();
            btnAccept = new Button();
            btnGenerate = new Button();
            btnCancel = new Button();
            chbGenerateNewStrategy = new CheckBox();
            chbPreserveSameDirAction = new CheckBox();
            chbPreserveOppDirAction = new CheckBox();
            chbPreservePermSL = new CheckBox();
            chbPreservePermTP = new CheckBox();
            chbPreserveBreakEven = new CheckBox();
            chbInitialOptimization = new CheckBox();
            nudWorkingMinutes = new NumericUpDown();
            chbWorkingMinutes = new CheckBox();

            MaximizeBox = false;
            Icon = Data.Icon;
            FormBorderStyle = FormBorderStyle.FixedDialog;
            BackColor = LayoutColors.ColorFormBack;
            AcceptButton = btnGenerate;
            Text = Language.T("Strategy Generator") + " - " + Data.Symbol + " " + Data.PeriodString + ", " +
                   Data.Bars + " " + Language.T("bars");
            FormClosing += GeneratorFormClosing;

            // Tool Strip
            toolStrip.Parent = this;
            toolStrip.Dock = DockStyle.Top;
            toolStrip.AutoSize = true;

            // Creates a Strategy Layout
            strategyField.Parent = this;
            strategyField.ShowAddSlotButtons = false;
            strategyField.ShowRemoveSlotButtons = false;
            strategyField.ShowPadlockImg = true;
            strategyField.SlotPropertiesTipText = Language.T("Lock or unlock the slot.");
            strategyField.SlotToolTipText = Language.T("Lock, link, or unlock the slot.");

            pnlCommon.Parent = this;
            pnlCriteriaBase.Parent = this;
            pnlSettings.Parent = this;
            pnlSorting.Parent = this;
            pnlTop10.Parent = this;
            pnlIndicators.Parent = this;

            // Small Balance Chart
            balanceChart.Parent = this;
            balanceChart.BackColor = LayoutColors.ColorControlBack;
            balanceChart.Visible = true;
            balanceChart.Cursor = Cursors.Hand;
            balanceChart.IsContextButtonVisible = true;
            balanceChart.PopUpContextMenu.Items.AddRange(GetBalanceChartContextMenuItems());
            balanceChart.Click += AccountOutputClick;
            balanceChart.DoubleClick += AccountOutputClick;
            toolTip.SetToolTip(balanceChart, Language.T("Show account statistics."));
            balanceChart.SetChartData();

            // Info Panel Account Statistics
            infpnlAccountStatistics.Parent = this;
            infpnlAccountStatistics.Visible = false;
            infpnlAccountStatistics.Cursor = Cursors.Hand;
            infpnlAccountStatistics.IsContextButtonVisible = true;
            infpnlAccountStatistics.PopUpContextMenu.Items.AddRange(GetInfoPanelContextMenuItems());
            infpnlAccountStatistics.Click += AccountOutputClick;
            infpnlAccountStatistics.DoubleClick += AccountOutputClick;
            toolTip.SetToolTip(infpnlAccountStatistics, Language.T("Show account chart."));

            // ProgressBar
            progressBar.Parent = this;
            progressBar.Minimum = 1;
            progressBar.Maximum = 100;
            progressBar.Step = 1;

            //Button Generate
            btnGenerate.Parent = this;
            btnGenerate.Name = "Generate";
            btnGenerate.Text = Language.T("Generate");
            btnGenerate.Click += BtnGenerateClick;
            btnGenerate.UseVisualStyleBackColor = true;

            //Button Accept
            btnAccept.Parent = this;
            btnAccept.Name = "Accept";
            btnAccept.Text = Language.T("Accept");
            btnAccept.Enabled = false;
            btnAccept.DialogResult = DialogResult.OK;
            btnAccept.UseVisualStyleBackColor = true;

            //Button Cancel
            btnCancel.Parent = this;
            btnCancel.Text = Language.T("Cancel");
            btnCancel.DialogResult = DialogResult.Cancel;
            btnCancel.UseVisualStyleBackColor = true;

            // BackgroundWorker
            bgWorker = new BackgroundWorker {WorkerReportsProgress = true, WorkerSupportsCancellation = true};
            bgWorker.DoWork += BgWorkerDoWork;
            bgWorker.ProgressChanged += BgWorkerProgressChanged;
            bgWorker.RunWorkerCompleted += BgWorkerRunWorkerCompleted;

            // Apply a Cryptographic Random Seed
            var rng = new RNGCryptoServiceProvider();
            var rndBytes = new byte[4];
            rng.GetBytes(rndBytes);
            int rand = BitConverter.ToInt32(rndBytes, 0);
            random = new Random(rand);

            SetButtonsStrategy();
            SetButtonsGenerator();
            SetPanelCommon();
            SetCriteriaPanel();
            SetPanelSettings();
            SetPanelSorting();
            SetPanelTop10();
            SetPanelIndicators();
            LoadOptions();
            SetCustomSortingUI();
            SetStrategyDescriptionButton();

            chbHideFsb.CheckedChanged += HideFSBClick;

            if (Data.AutostartGenerator)
                BtnGenerateClick(this, new EventArgs());
        }
        /// <summary>
        ///     Initializes main controls of optimizer.
        /// </summary>
        private void InitializeControls()
        {
            pnlParamsBase    = new Panel();
            pnlParamsBase2   = new Panel();
            pnlCaptions      = new Panel();
            pnlParams        = new Panel();
            pnlCriteriaBase  = new FancyPanel(Language.T("Acceptance Criteria"));
            criteriaPanel    = new ScrollFlowPanel();
            criteriaControls = new CriteriaControls();
            pnlSettings      = new FancyPanel(Language.T("Settings"));
            scrollBar        = new VScrollBar();
            balanceChart     = new SmallBalanceChart();
            progressBar      = new ProgressBar();
            btnOptimize      = new Button();
            btnAccept        = new Button();
            btnCancel        = new Button();

            lblNoParams = new Label();

            fontIndicator = new Font(Font.FontFamily, 11);
            colorText     = LayoutColors.ColorControlText;

            // Panel Parameters Base
            pnlParamsBase.Parent    = this;
            pnlParamsBase.BackColor = LayoutColors.ColorControlBack;
            pnlParamsBase.Paint    += PnlParamsBasePaint;

            // Panel Captions
            pnlCaptions.Parent    = pnlParamsBase;
            pnlCaptions.Dock      = DockStyle.Top;
            pnlCaptions.BackColor = LayoutColors.ColorCaptionBack;
            pnlCaptions.ForeColor = LayoutColors.ColorCaptionText;
            pnlCaptions.Paint    += PnlCaptionsPaint;

            // Panel Parameters Base 2
            pnlParamsBase2.Parent    = pnlParamsBase;
            pnlParamsBase2.BackColor = LayoutColors.ColorControlBack;
            pnlParamsBase2.Resize   += PnlParamsBase2Resize;

            // ScrollBar
            scrollBar.Parent        = pnlParamsBase2;
            scrollBar.Dock          = DockStyle.Right;
            scrollBar.TabStop       = true;
            scrollBar.ValueChanged += ScrollBarValueChanged;
            scrollBar.MouseWheel   += ScrollBarMouseWheel;

            // Panel Parameters
            pnlParams.Parent    = pnlParamsBase2;
            pnlParams.BackColor = LayoutColors.ColorControlBack;

            // Label No Parameters
            lblNoParams.Parent   = pnlParams;
            lblNoParams.Text     = Language.T("There are no parameters suitable for optimization.");
            lblNoParams.AutoSize = true;
            lblNoParams.Visible  = false;

            // Panel Limitations
            pnlCriteriaBase.Parent  = this;
            pnlCriteriaBase.Visible = false;

            // Panel Settings
            pnlSettings.Parent  = this;
            pnlSettings.Visible = false;

            // Small Balance Chart
            balanceChart.Parent    = this;
            balanceChart.BackColor = LayoutColors.ColorControlBack;
            balanceChart.SetChartData();

            // ProgressBar
            progressBar.Parent  = this;
            progressBar.Minimum = 1;
            progressBar.Maximum = 100;
            progressBar.Step    = 1;

            // Button Optimize
            btnOptimize.Parent   = this;
            btnOptimize.Name     = "btnOptimize";
            btnOptimize.Text     = Language.T("Optimize");
            btnOptimize.TabIndex = 0;
            btnOptimize.Click   += BtnOptimizeClick;
            btnOptimize.UseVisualStyleBackColor = true;

            // Button Accept
            btnAccept.Parent                  = this;
            btnAccept.Name                    = "btnAccept";
            btnAccept.Text                    = Language.T("Accept");
            btnAccept.TabIndex                = 1;
            btnAccept.Enabled                 = false;
            btnAccept.DialogResult            = DialogResult.OK;
            btnAccept.UseVisualStyleBackColor = true;

            // Button Cancel
            btnCancel.Parent                  = this;
            btnCancel.Text                    = Language.T("Cancel");
            btnCancel.TabIndex                = 2;
            btnCancel.DialogResult            = DialogResult.Cancel;
            btnCancel.UseVisualStyleBackColor = true;

            // BackGroundWorker
            bgWorker = new BackgroundWorker {
                WorkerReportsProgress = true, WorkerSupportsCancellation = true
            };
            bgWorker.DoWork             += BgWorkerDoWork;
            bgWorker.ProgressChanged    += BgWorkerProgressChanged;
            bgWorker.RunWorkerCompleted += BgWorkerRunWorkerCompleted;
        }
        /// <summary>
        ///     Initializes main controls of optimizer.
        /// </summary>
        private void InitializeControls()
        {
            pnlParamsBase = new Panel();
            pnlParamsBase2 = new Panel();
            pnlCaptions = new Panel();
            pnlParams = new Panel();
            pnlCriteriaBase = new FancyPanel(Language.T("Acceptance Criteria"));
            criteriaPanel = new ScrollFlowPanel();
            criteriaControls = new CriteriaControls();
            pnlSettings = new FancyPanel(Language.T("Settings"));
            scrollBar = new VScrollBar();
            balanceChart = new SmallBalanceChart();
            progressBar = new ProgressBar();
            btnOptimize = new Button();
            btnAccept = new Button();
            btnCancel = new Button();

            lblNoParams = new Label();

            fontIndicator = new Font(Font.FontFamily, 11);
            colorText = LayoutColors.ColorControlText;

            // Panel Parameters Base
            pnlParamsBase.Parent = this;
            pnlParamsBase.BackColor = LayoutColors.ColorControlBack;
            pnlParamsBase.Paint += PnlParamsBasePaint;

            // Panel Captions
            pnlCaptions.Parent = pnlParamsBase;
            pnlCaptions.Dock = DockStyle.Top;
            pnlCaptions.BackColor = LayoutColors.ColorCaptionBack;
            pnlCaptions.ForeColor = LayoutColors.ColorCaptionText;
            pnlCaptions.Paint += PnlCaptionsPaint;

            // Panel Parameters Base 2
            pnlParamsBase2.Parent = pnlParamsBase;
            pnlParamsBase2.BackColor = LayoutColors.ColorControlBack;
            pnlParamsBase2.Resize += PnlParamsBase2Resize;

            // ScrollBar
            scrollBar.Parent = pnlParamsBase2;
            scrollBar.Dock = DockStyle.Right;
            scrollBar.TabStop = true;
            scrollBar.ValueChanged += ScrollBarValueChanged;
            scrollBar.MouseWheel += ScrollBarMouseWheel;

            // Panel Parameters
            pnlParams.Parent = pnlParamsBase2;
            pnlParams.BackColor = LayoutColors.ColorControlBack;

            // Label No Parameters
            lblNoParams.Parent = pnlParams;
            lblNoParams.Text = Language.T("There are no parameters suitable for optimization.");
            lblNoParams.AutoSize = true;
            lblNoParams.Visible = false;

            // Panel Limitations
            pnlCriteriaBase.Parent = this;
            pnlCriteriaBase.Visible = false;

            // Panel Settings
            pnlSettings.Parent = this;
            pnlSettings.Visible = false;

            // Small Balance Chart
            balanceChart.Parent = this;
            balanceChart.BackColor = LayoutColors.ColorControlBack;
            balanceChart.SetChartData();

            // ProgressBar
            progressBar.Parent = this;
            progressBar.Minimum = 1;
            progressBar.Maximum = 100;
            progressBar.Step = 1;

            // Button Optimize
            btnOptimize.Parent = this;
            btnOptimize.Name = "btnOptimize";
            btnOptimize.Text = Language.T("Optimize");
            btnOptimize.TabIndex = 0;
            btnOptimize.Click += BtnOptimizeClick;
            btnOptimize.UseVisualStyleBackColor = true;

            // Button Accept
            btnAccept.Parent = this;
            btnAccept.Name = "btnAccept";
            btnAccept.Text = Language.T("Accept");
            btnAccept.TabIndex = 1;
            btnAccept.Enabled = false;
            btnAccept.DialogResult = DialogResult.OK;
            btnAccept.UseVisualStyleBackColor = true;

            // Button Cancel
            btnCancel.Parent = this;
            btnCancel.Text = Language.T("Cancel");
            btnCancel.TabIndex = 2;
            btnCancel.DialogResult = DialogResult.Cancel;
            btnCancel.UseVisualStyleBackColor = true;

            // BackGroundWorker
            bgWorker = new BackgroundWorker {WorkerReportsProgress = true, WorkerSupportsCancellation = true};
            bgWorker.DoWork += BgWorkerDoWork;
            bgWorker.ProgressChanged += BgWorkerProgressChanged;
            bgWorker.RunWorkerCompleted += BgWorkerRunWorkerCompleted;
        }