Correlation

Created at 20 Sep 2018, 23:41
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
DelFonseca's avatar

DelFonseca

Joined 25.06.2017

Correlation
20 Sep 2018, 23:41


Good evening,

I am developing a correlation bot but im stuck in the correlation calculation.

Result indicates that its not a number.

Follow the code below and thank you for your cooperation.

 

        private void CoefCorrel()
        {
            int index = 0;
            SubSymbolGetSeries = MarketData.GetSeries(SubSymbol, TimeFrame);
            var SubSymbolGetSymbol = MarketData.GetSymbol(SubSymbol);
            int CountOfBars = 24;
            double Result = 0;

            double sumX = 0, sumY = 0, sumXY = 0, sumX2 = 0, sumY2 = 0;
            double x, y, x2, y2;

            int index2 = GetIndexByDate(SubSymbolGetSeries, SubSymbolGetSeries.OpenTime[index]);

            if (index2 == -1)
                return;

            for (int i = 0; i < CountOfBars; i++)
            {
                x = MarketSeries.Close[index - i];
                y = SubSymbolGetSeries.Close[index2 - i];

                x2 = x * x;
                y2 = y * y;
                sumX += x;
                sumY += y;
                sumXY += x * y;
                sumX2 += x2;
                sumY2 += y2;
            }

            Result = (CountOfBars * (sumXY) - sumX * sumY) / Math.Sqrt((CountOfBars * sumX2 - sumX * sumX) * (CountOfBars * sumY2 - sumY * sumY));

            ChartObjects.DrawText("LabelCorrel2", "\n\n\n\n\n\n\n\n\nAverageSubSymbol: " + Result, StaticPosition.TopLeft, Colors.GreenYellow);
        }

        private int GetIndexByDate(MarketSeries series, DateTime time)
        {
            for (int i = SubSymbolGetSeries.Close.Count - 1; i >= 0; i--)
            {
                if (time == SubSymbolGetSeries.OpenTime[i])
                    return i;
            }
            return -1;
        }

 


@DelFonseca
Replies

afhacker
21 Sep 2018, 07:16

        public static double GetCorrelation(DataSeries dataSeries, DataSeries otherDataSeries)
        {
            double[] values1 = new double[dataSeries.Count];
            double[] values2 = new double[dataSeries.Count];

            for (int i = 0; i < dataSeries.Count; i++)
            {
                values1[i] = dataSeries.Last(i);
                values2[i] = otherDataSeries.Last(i);
            }

            var avg1 = values1.Average();
            var avg2 = values2.Average();

            var sum = values1.Zip(values2, (x1, y1) => (x1 - avg1) * (y1 - avg2)).Sum();

            var sumSqr1 = values1.Sum(x => Math.Pow((x - avg1), 2.0));
            var sumSqr2 = values2.Sum(y => Math.Pow((y - avg2), 2.0));

            return Math.Round(sum / Math.Sqrt(sumSqr1 * sumSqr2), 2);
        }

This function returns the correlation between two data series.


@afhacker

afhacker
21 Sep 2018, 07:21

For double generic collections you can use this method:

        public static double Correlation(IEnumerable<double> x, IEnumerable<double> y)
        {
            double xSum = x.Sum();
            double ySum = y.Sum();

            double xSumSquared = Math.Pow(xSum, 2);
            double ySumSquared = Math.Pow(ySum, 2);

            double xSquaredSum = x.Select(value => Math.Pow(value, 2)).Sum();
            double ySquaredSum = y.Select(value => Math.Pow(value, 2)).Sum();

            double xAndyProductSum = x.Zip(y, (value1, value2) => value1 * value2).Sum();

            double n = x.Count();

            return ((n * xAndyProductSum) - (xSum * ySum)) / Math.Sqrt(((n * xSquaredSum) - xSumSquared) * ((n * ySquaredSum) - ySumSquared));
        }

 


@afhacker

DelFonseca
21 Sep 2018, 20:36

RE:

afhacker said:

For double generic collections you can use this method:

        public static double Correlation(IEnumerable<double> x, IEnumerable<double> y)
        {
            double xSum = x.Sum();
            double ySum = y.Sum();

            double xSumSquared = Math.Pow(xSum, 2);
            double ySumSquared = Math.Pow(ySum, 2);

            double xSquaredSum = x.Select(value => Math.Pow(value, 2)).Sum();
            double ySquaredSum = y.Select(value => Math.Pow(value, 2)).Sum();

            double xAndyProductSum = x.Zip(y, (value1, value2) => value1 * value2).Sum();

            double n = x.Count();

            return ((n * xAndyProductSum) - (xSum * ySum)) / Math.Sqrt(((n * xSquaredSum) - xSumSquared) * ((n * ySquaredSum) - ySumSquared));
        }

 

Thank you very much for your feedback.
Please tell me how I can make correlation value print.


@DelFonseca