/// <summary>
        ///     Returns the Simple Custom Sorting Value for the Generator
        /// </summary>
        /// <param name="cga">CustomGeneratorAnalysis Data</param>
        /// <param name="value">Simple Custom Sorting Value</param>
        /// <param name="displayName">Simple Custom Sorting Option Display Name</param>
        public static void GetSimpleCustomSortingValue(ref CustomGeneratorAnalytics cga,
                                                       out float value,
                                                       out string displayName)
        {
            // Set the initial output values
            displayName = cga.SimpleSortOption;
            value       = 0;

            // Perform simple custom sorting calculations
            switch (cga.SimpleSortOption)
            {
            case "System Quality Number":
                value = Calc.SystemQualityNumber(ref cga.Positions);
                break;
            }
        }
        /// <summary>
        ///     Returns the Simple Custom Sorting Value for the Generator
        /// </summary>
        /// <param name="cga">CustomGeneratorAnalysis Data</param>
        /// <param name="value">Simple Custom Sorting Value</param>
        /// <param name="displayName">Simple Custom Sorting Option Display Name</param>
        public static void GetSimpleCustomSortingValue(ref CustomGeneratorAnalytics cga,
                                                       out float value,
                                                       out string displayName)
        {
            // Set the initial output values 
            displayName = cga.SimpleSortOption;
            value = 0;

            // Perform simple custom sorting calculations
            switch (cga.SimpleSortOption)
            {
                case "System Quality Number":
                    value = Calc.SystemQualityNumber(ref cga.Positions);
                    break;
            }
        }
        /// <summary>
        ///     Returns the Advanced Custom Sorting Value for the Generator
        /// </summary>
        /// <param name="cga">CustomGeneratorAnalysis Data</param>
        /// <param name="value">Simple Custom Sorting Value</param>
        /// <param name="displayName">Advanced Custom Sorting Option Display Name</param>
        public static void GetAdvancedCustomSortingValue(ref CustomGeneratorAnalytics cga,
                                                         out float value,
                                                         out string displayName)
        {
            // Set the initial output values
            displayName = cga.AdvancedSortOption;
            value       = 0;

            // Build the comparison curve
            var curve = new List <double>();

            switch (cga.AdvancedSortOptionCompareTo)
            {
            case "Balance":
                foreach (Position pos in cga.Positions)
                {
                    if (pos.Transaction != Transaction.Transfer)
                    {
                        curve.Add(pos.Balance);
                    }
                }
                break;

            case "Balance (with Transfers)":
                foreach (Position pos in cga.Positions)
                {
                    curve.Add(pos.Balance);
                }
                break;

            case "Equity":
                foreach (Position pos in cga.Positions)
                {
                    if (pos.Transaction != Transaction.Transfer)
                    {
                        curve.Add(pos.Equity);
                    }
                }
                break;

            case "Equity (with Transfers)":
                foreach (Position pos in cga.Positions)
                {
                    curve.Add(pos.Equity);
                }
                break;
            }

            // Perform advanced custom sorting calculations
            const double epsilon = 0.000001;

            switch (cga.AdvancedSortOption)
            {
            case "Correlation":
                value = (float)Calc.Correlation(curve);
                if (Math.Abs(value - 1) < epsilon)
                {
                    value = 0;
                }
                break;
            }
        }
        /// <summary>
        ///     Returns the Advanced Custom Sorting Value for the Generator
        /// </summary>
        /// <param name="cga">CustomGeneratorAnalysis Data</param>
        /// <param name="value">Simple Custom Sorting Value</param>
        /// <param name="displayName">Advanced Custom Sorting Option Display Name</param>
        public static void GetAdvancedCustomSortingValue(ref CustomGeneratorAnalytics cga,
                                                         out float value,
                                                         out string displayName)
        {
            // Set the initial output values 
            displayName = cga.AdvancedSortOption;
            value = 0;

            // Build the comparison curve
            var curve = new List<double>();
            switch (cga.AdvancedSortOptionCompareTo)
            {
                case "Balance":
                    foreach (Position pos in cga.Positions)
                        if (pos.Transaction != Transaction.Transfer)
                            curve.Add(pos.Balance);
                    break;
                case "Balance (with Transfers)":
                    foreach (Position pos in cga.Positions)
                        curve.Add(pos.Balance);
                    break;
                case "Equity":
                    foreach (Position pos in cga.Positions)
                        if (pos.Transaction != Transaction.Transfer)
                            curve.Add(pos.Equity);
                    break;
                case "Equity (with Transfers)":
                    foreach (Position pos in cga.Positions)
                        curve.Add(pos.Equity);
                    break;
            }

            // Perform advanced custom sorting calculations
            const double epsilon = 0.000001;
            switch (cga.AdvancedSortOption)
            {
                case "Correlation":
                    value = (float) Calc.Correlation(curve);
                    if (Math.Abs(value - 1) < epsilon)
                        value = 0;
                    break;
            }
        }