private void button4_Click(object sender, EventArgs e)
        {
            //initialize the cursor to waiting while updating
            //Cursor = Cursors.WaitCursor;
            Cursor = Cursors.WaitCursor;
            string sourcePath = System.Configuration.ConfigurationManager.AppSettings["SourceDirectory"];
            string destPath = System.Configuration.ConfigurationManager.AppSettings["DestDirectory"];
            string ticker = textBox1.Text;
            int holdDays = int.Parse(textBox3.Text);
            double cutoff = double.Parse(textBox4.Text);
            int rollingDays = int.Parse(textBox5.Text);
            //instantiate a new back test for the symbol
            BackTest test = new BackTest(ticker, sourcePath, cutoff);
            test.BackTestLongShort(holdDays, rollingDays);

            //update the database for the test results via Entity Framework
            try
            {
                using (NetEntities db = new NetEntities())
                {
                    //use a stored procedure to delete all the data in the database that matches the symbol
                    db.DeleteData(ticker);
                }

                string sql = "Select * from Table5";

                SQLConnection Test1 = new SQLConnection();
                Test1.ExecuteSelect(sql, test.DT);
            }
            catch
            {
                Cursor = Cursors.Default;
            }

            Cursor = Cursors.Default;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string sourcePath = System.Configuration.ConfigurationManager.AppSettings["SourceDirectory"];
            string destPath = System.Configuration.ConfigurationManager.AppSettings["DestDirectory"];
            string ticker = textBox1.Text;
            int holdDays = 0;
            double cutoff = 0.00;
            int rollingDays = 0;
            try
            {
                holdDays = int.Parse(textBox3.Text);
                cutoff = double.Parse(textBox4.Text);
                rollingDays = int.Parse(textBox5.Text);
            }
            catch
            {

                MessageBox.Show("Inputs are in the wrong format - Try again!");
                //Application.Run(new Test.Form1());
                Application.ExitThread();
                Application.Exit();
                Application.Restart();
                Environment.Exit(0);
            }

            Cursor = Cursors.WaitCursor;
            //instantiate a new back test for the symbol
            BackTest test = new BackTest(ticker, sourcePath, cutoff);
            test.BackTestLongShort(holdDays, rollingDays);

            //bind data to the data grid
            BindingSource bSource = new BindingSource();
            bSource.DataSource = test.DT;
            dataGridView1.DataSource = bSource;

            DataRow last = test.DT.Rows[test.DT.Rows.Count - 1];
            double zroll = Convert.ToDouble(last["ZscoreRolling"]);
            textBox6.Text = Convert.ToString(Math.Round((zroll * 1), 4));
            double zstatic = Convert.ToDouble(last["ZscoreStatic"]);
            textBox2.Text = Convert.ToString(Math.Round((zstatic * 1), 4));
            textBox7.Text = Convert.ToString(Math.Round((cutoff * 1), 4));
            textBox8.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test.DT) * 1), 4));
            textBox9.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreStaticCount(test.DT) * 1), 4));
            textBox10.Text = Convert.ToString(Math.Round((MathFunctions.AverageAllPNLrollHold(test.DT) * 26000), 4));
            double RealCum = Convert.ToDouble(last["CumRealPNLrollHold"]);
            textBox11.Text = Convert.ToString(Math.Round((RealCum * 100), 4));
            textBox12.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test.DT) / holdDays), 0));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test.DT) * 26000), 4) > 0) textBox13.Text = Convert.ToString(Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test.DT) / holdDays) / (MathFunctions.ZscoreRollCount(test.DT) / holdDays))) * 100, 4)));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test.DT) * 26000), 4) < 0) textBox13.Text = Convert.ToString(-1 * Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test.DT) / holdDays) / (MathFunctions.ZscoreRollCount(test.DT) / holdDays))) * 100, 4)));
            textBox14.Text = Convert.ToString(Math.Round((MathFunctions.SharpePNLrollHold(test.DT)), 4));
            textBox15.Text = Convert.ToString(Math.Round((MathFunctions.StdDevAllPNLrollHold(test.DT) * Math.Sqrt(260) * 100), 4));
            double aclose = Convert.ToDouble(last["AdjustedClose"]);
            textBox16.Text = Convert.ToString(Math.Round((aclose * 1), 2));

            //double zroll = Convert.ToDouble(last["ZscoreRolling"]);
            textBox28.Text = Convert.ToString(Math.Round((zroll * 1), 4));
            //double zstatic = Convert.ToDouble(last["ZscoreStatic"]);
            textBox27.Text = Convert.ToString(Math.Round((zstatic * 1), 4));
            textBox26.Text = Convert.ToString(Math.Round((cutoff * 1), 4));
            textBox25.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test.DT) * 1), 4));
            textBox24.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreStaticCount(test.DT) * 1), 4));
            textBox23.Text = Convert.ToString(Math.Round((MathFunctions.AverageAllPNLrollHold(test.DT) * 26000 * -1), 4));
            //double RealCum = Convert.ToDouble(last["CumRealPNLrollHold"]);
            textBox22.Text = Convert.ToString(Math.Round((RealCum * -100), 4));
            textBox21.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test.DT) / holdDays), 0));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test.DT) * 26000 * -1), 4) > 0) textBox20.Text = Convert.ToString(Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test.DT) / holdDays) / (MathFunctions.ZscoreRollCount(test.DT) / holdDays))) * 100, 4)));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test.DT) * 26000 * -1), 4) < 0) textBox20.Text = Convert.ToString(-1 * Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test.DT) / holdDays) / (MathFunctions.ZscoreRollCount(test.DT) / holdDays))) * 100, 4)));
            textBox19.Text = Convert.ToString(Math.Round((MathFunctions.SharpePNLrollHold(test.DT) * -1), 4));
            textBox18.Text = Convert.ToString(Math.Round((MathFunctions.StdDevAllPNLrollHold(test.DT) * Math.Sqrt(260) * 100), 4));
            //double aclose = Convert.ToDouble(last["AdjustedClose"]);
            textBox17.Text = Convert.ToString(Math.Round((aclose * 1), 2));

            /*
             * bind data to a chart using LINQ and the
             * data table property for the BackTest data table instance
             */
            chart1.Series[0].Points.Clear();
            var d = from data in test.DT.AsEnumerable()
                    select new
                    {
                        Date = data.Field<DateTime>("Date"),
                        ZscoreRolling = data.Field<Object>("ZscoreRolling")
                    };

            foreach (var item in d)
            {
                if (item.Date != null && item.ZscoreRolling != null)
                    chart1.Series["Series1"].Points.AddXY(item.Date.Date.ToString("d"), item.ZscoreRolling);
            }
            chart1.DataBind();

            chart2.Series[0].Points.Clear();
            chart2.Series[1].Points.Clear();
            var dd = from data in test.DT.AsEnumerable()
                    select new
                    {
                        Date = data.Field<DateTime>("Date"),
                        AdjustedClose = data.Field<Object>("AdjustedClose"),
                        RollingAverage = data.Field<Double?>("RollingAverage")
                    };

            foreach (var item in dd)
            {
                if (item.Date != null && item.AdjustedClose != null /*&& item.RollingAverage != null*/)
                {
                    chart2.Series["Series1"].Points.AddXY(item.Date.Date.ToString("d"), item.AdjustedClose);
                    chart2.Series["Series2"].Points.AddXY(item.Date.Date.ToString("d"), item.RollingAverage);
                }
            }
            chart2.DataBind();

            chart3.Series[0].Points.Clear();
            var ddd = from data in test.DT.AsEnumerable()
                     select new
                     {
                         Date = data.Field<DateTime>("Date"),
                         CumRealPNLrollHold = data.Field<Object>("CumRealPNLrollHold")
                     };

            foreach (var item in ddd)
            {
                if (item.Date != null && item.CumRealPNLrollHold != null)
                    chart3.Series["Series1"].Points.AddXY(item.Date.Date.ToString("d"), item.CumRealPNLrollHold);
            }
            chart3.DataBind();
            //chart3.ChartAreas[0].AxisY.LabelStyle.Format = "{0.00}" + "%";
            Cursor = Cursors.Default;
        }
        private void button3_Click(object sender, EventArgs e)
        {
            // BRUTE FORCE OPTIMIZE - LOOP THRU ALL COMBINATIONS OF PARAMETERS IN BACKTEST
            string sourcePath = System.Configuration.ConfigurationManager.AppSettings["SourceDirectory"];
            string destPath = System.Configuration.ConfigurationManager.AppSettings["DestDirectory"];
            string ticker = textBox1.Text;
            //int[] holdDays = { 3, 5, 8 };
            double[] cutoff = { 1, 2, 3, 4};
            //int[] rollingDays = { 30, 60, 90};
            double lens = Math.Pow(3,(cutoff.Length));
            int len = Convert.ToInt32(lens);
            double[,] table = new double[len, 4];
            int count = 0;
            Cursor = Cursors.WaitCursor;

            Console.WriteLine(lens);
            var geneticsArray = new[] { new[] { 2, 3, 5, 8}, new[] { 1, 2, -1, -2 }, new[] { 10, 20, 40, 60 } };
            var perms = from a in geneticsArray[0]
                        from b in geneticsArray[1]
                        from c in geneticsArray[2]
                        select new { a, b, c };
            try
            {
                foreach (var value in perms)
                {
                    //double result;

                    BackTest test = new BackTest(ticker, sourcePath, value.b);

                    test.BackTestLongShort(value.a, value.c);

                    double sharpe = MathFunctions.SharpePNLrollHold(test.DT);

                    table[count, 0] = sharpe;
                    table[count, 1] = value.a;
                    table[count, 2] = value.b;
                    table[count, 3] = value.c;

                    count = count + 1;

                }
            }
            catch
            {
                MessageBox.Show("Optimization Failed - Check parameters and try again!");
            }

            double max = 0.00;
            int z = 0;
            for (int i = 0; i < len; i++)
            {
                if (table[i, 0] > max) max = table[i, 0];
                if (max == table[i, 0]) z=i;
            }

            BackTest test1 = new BackTest(ticker, sourcePath, table[z,2]);
            test1.BackTestLongShort(Convert.ToInt32(table[z, 1]), Convert.ToInt32(table[z, 3]));

            textBox3.Text = Convert.ToString(table[z, 1]);
            textBox4.Text = Convert.ToString(table[z, 2]);
            textBox5.Text = Convert.ToString(table[z, 3]);

            BindingSource bSource = new BindingSource();
            bSource.DataSource = test1.DT;
            dataGridView1.DataSource = bSource;

            DataRow last = test1.DT.Rows[test1.DT.Rows.Count - 1];
            double zroll = Convert.ToDouble(last["ZscoreRolling"]);
            textBox6.Text = Convert.ToString(Math.Round((zroll * 1), 4));
            double zstatic = Convert.ToDouble(last["ZscoreStatic"]);
            textBox2.Text = Convert.ToString(Math.Round((zstatic * 1), 4));
            textBox7.Text = Convert.ToString(Math.Round((table[z, 2] * 1), 4));
            textBox8.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test1.DT) * 1), 4));
            textBox9.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreStaticCount(test1.DT) * 1), 4));
            textBox10.Text = Convert.ToString(Math.Round((MathFunctions.AverageAllPNLrollHold(test1.DT) * 26000), 4));
            double RealCum = Convert.ToDouble(last["CumRealPNLrollHold"]);
            textBox11.Text = Convert.ToString(Math.Round((RealCum * 100), 4));
            textBox12.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test1.DT) / table[z, 1]), 0));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test1.DT) * 26000), 4) > 0) textBox13.Text = Convert.ToString(Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test1.DT) / table[z, 1]) / (MathFunctions.ZscoreRollCount(test1.DT) / table[z, 1]))) * 100, 4)));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test1.DT) * 26000), 4) < 0) textBox13.Text = Convert.ToString(-1 * Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test1.DT) / table[z, 1]) / (MathFunctions.ZscoreRollCount(test1.DT) / table[z, 1]))) * 100, 4)));
            textBox14.Text = Convert.ToString(Math.Round((MathFunctions.SharpePNLrollHold(test1.DT)), 4));
            textBox15.Text = Convert.ToString(Math.Round((MathFunctions.StdDevAllPNLrollHold(test1.DT) * Math.Sqrt(260) * 100), 4));
            double aclose = Convert.ToDouble(last["AdjustedClose"]);
            textBox16.Text = Convert.ToString(Math.Round((aclose * 1), 2));

            //double zroll = Convert.ToDouble(last["ZscoreRolling"]);
            textBox28.Text = Convert.ToString(Math.Round((zroll * 1), 4));
            //double zstatic = Convert.ToDouble(last["ZscoreStatic"]);
            textBox27.Text = Convert.ToString(Math.Round((zstatic * 1), 4));
            textBox26.Text = Convert.ToString(Math.Round((table[z, 2] * 1), 4));
            textBox25.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test1.DT) * 1), 4));
            textBox24.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreStaticCount(test1.DT) * 1), 4));
            textBox23.Text = Convert.ToString(Math.Round((MathFunctions.AverageAllPNLrollHold(test1.DT) * 26000 * -1), 4));
            //double RealCum = Convert.ToDouble(last["CumRealPNLrollHold"]);
            textBox22.Text = Convert.ToString(Math.Round((RealCum * -100), 4));
            textBox21.Text = Convert.ToString(Math.Round((MathFunctions.ZscoreRollCount(test1.DT) / table[z, 1]), 0));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test1.DT) * 26000 * -1), 4) > 0) textBox20.Text = Convert.ToString(Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test1.DT) / table[z, 1]) / (MathFunctions.ZscoreRollCount(test1.DT) / table[z, 1]))) * 100, 4)));
            if (Math.Round((MathFunctions.AverageAllPNLrollHold(test1.DT) * 26000 * -1), 4) < 0) textBox20.Text = Convert.ToString(-1 * Math.Abs(Math.Round((((MathFunctions.CountPNLrollHold(test1.DT) / table[z, 1]) / (MathFunctions.ZscoreRollCount(test1.DT) / table[z, 1]))) * 100, 4)));
            textBox19.Text = Convert.ToString(Math.Round((MathFunctions.SharpePNLrollHold(test1.DT) * -1), 4));
            textBox18.Text = Convert.ToString(Math.Round((MathFunctions.StdDevAllPNLrollHold(test1.DT) * Math.Sqrt(260) * 100), 4));
            //double aclose = Convert.ToDouble(last["AdjustedClose"]);
            textBox17.Text = Convert.ToString(Math.Round((aclose * 1), 2));

            /*
             * bind data to a chart using LINQ and the
             * data table property for the BackTest data table instance
             */
            chart1.Series[0].Points.Clear();
            var d = from data in test1.DT.AsEnumerable()
                    select new
                    {
                        Date = data.Field<DateTime>("Date"),
                        ZscoreRolling = data.Field<Object>("ZscoreRolling")
                    };

            foreach (var item in d)
            {
                if (item.Date != null && item.ZscoreRolling != null)
                    chart1.Series["Series1"].Points.AddXY(item.Date.Date.ToString("d"), item.ZscoreRolling);
            }
            chart1.DataBind();

            chart2.Series[0].Points.Clear();
            var dd = from data in test1.DT.AsEnumerable()
                     select new
                     {
                         Date = data.Field<DateTime>("Date"),
                         AdjustedClose = data.Field<Object>("AdjustedClose")
                     };

            foreach (var item in dd)
            {
                if (item.Date != null && item.AdjustedClose != null)
                    chart2.Series["Series1"].Points.AddXY(item.Date.Date.ToString("d"), item.AdjustedClose);
            }
            chart2.DataBind();

            chart3.Series[0].Points.Clear();
            var ddd = from data in test1.DT.AsEnumerable()
                      select new
                      {
                          Date = data.Field<DateTime>("Date"),
                          CumRealPNLrollHold = data.Field<Object>("CumRealPNLrollHold")
                      };

            foreach (var item in ddd)
            {
                if (item.Date != null && item.CumRealPNLrollHold != null)
                    chart3.Series["Series1"].Points.AddXY(item.Date.Date.ToString("d"), item.CumRealPNLrollHold);
            }
            chart3.DataBind();
            //chart3.ChartAreas[0].AxisY.LabelStyle.Format = "{0.00}" + "%";

            Cursor = Cursors.Default;
        }