Exemple #1
0
 private Task LiqTask(Asset[] assets)
 {
     return(Task.Run(() =>
     {
         ClassAssistant.ReadLiquidity(assets, DateTime.Now);
     }));
 }
Exemple #2
0
        private async void RefreshParameters()
        {
            DateTime dt = File.GetLastWriteTime(Application.StartupPath + "\\assets.txt").Date;

            if (DateTime.Now.Date != dt)
            {
                toolStripStatusLabel.Text = "Обновляем дивидендную доходность...";
                await DividendTask(assets);

                //  list = assets.ToList().OrderBy(x => x.Name).ToList();
                DoTable(list);

                toolStripStatusLabel.Text = "Обновляем ликвидность...";
                await LiqTask(assets);

                DoTable(list);

                toolStripStatusLabel.Text = "Обновляем волатильность и среднюю доходность...";

                List <Asset>[] l = ClassAssistant.FillQueue(assets);
                await VolatilityTask(dataPath, l, trackBar_period.Value);

                DoTable(list);

                dataGridView1.AllowUserToOrderColumns = true;
                toolStripStatusLabel.Text             = "Обновление выполнено";
            }
            RefreshAllPeriods();
        }
 private Task DownloadTask(Asset[] selectedAssets, string path, int period)
 {
     return(Task.Run(() =>
     {
         ClassAssistant.DownloadAllAssets(selectedAssets, path, period, false);
     }));
 }
Exemple #4
0
 private Task DividendTask(Asset[] assets)
 {
     return(Task.Run(() =>
     {
         ClassAssistant.DownloadDividend(assets);
     }));
 }
Exemple #5
0
        private Task VolatilityTask(string filename, List <Asset>[] listAssets, int period)
        {
            return(Task.Run(() =>
            {
                /*
                 * for (int i = 0; i < assets.Length; i++)
                 * {
                 *  ClassAssistant.VolatilityResult(filename, assets[i], period);
                 * }
                 */
                try
                {
                    Task t1 = Task.Factory.StartNew(() =>
                    {
                        foreach (var l in listAssets[0])
                        {
                            double[] data = ClassAssistant.ReadNewData(filename, l, period);
                            ClassAssistant.VolatilityResult(l, data);
                            ClassAssistant.AverageProfit(l, data);
                        }
                    });

                    Task t2 = Task.Factory.StartNew(() =>
                    {
                        foreach (var l in listAssets[1])
                        {
                            double[] data = ClassAssistant.ReadNewData(filename, l, period);
                            ClassAssistant.VolatilityResult(l, data);
                            ClassAssistant.AverageProfit(l, data);
                        }
                    });

                    Task t3 = Task.Factory.StartNew(() =>
                    {
                        foreach (var l in listAssets[2])
                        {
                            double[] data = ClassAssistant.ReadNewData(filename, l, period);
                            ClassAssistant.VolatilityResult(l, data);
                            ClassAssistant.AverageProfit(l, data);
                        }
                    });

                    Task t4 = Task.Factory.StartNew(() =>
                    {
                        foreach (var l in listAssets[3])
                        {
                            double[] data = ClassAssistant.ReadNewData(filename, l, period);
                            ClassAssistant.VolatilityResult(l, data);
                            ClassAssistant.AverageProfit(l, data);
                        }
                    });

                    Task.WaitAll(t1, t2, t3, t4);
                }
                catch (Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.InnerException); }
            }));
        }
Exemple #6
0
        public static List <Portfolio> DoListPortfolio(double[,] finalArray, Asset[] selectedAssets, double start, double finish, double step, double[] constraints)
        {
            List <Portfolio> results = new List <Portfolio>();
            double           r = 0, p = 0;
            bool             isCycle = false;

            while (start <= finish && !isCycle)
            {
                Portfolio result = ClassAssistant.DoCalculations(finalArray, selectedAssets, start, false, constraints);

                if (result.Profit == p && result.Risk == r)
                {
                    break;
                }
                else
                {
                    if (start > result.Profit)
                    {
                        break;
                    }
                    else
                    {
                        double t = Math.Truncate(result.Profit / step);
                        start = step * t + step;
                    }

                    p = result.Profit;
                    r = result.Risk;
                    double sum = 0;
                    for (int k = 0; k < result.ConvertPortfolio().Length; k++)
                    {
                        result.ConvertPortfolio()[k] = Math.Round(result.ConvertPortfolio()[k], 4) * 100;
                    }
                    result.Profit = Math.Round(result.Profit, 5) * 100;
                    result.Risk   = Math.Round(result.Risk, 4) * 100;
                    sum           = result.GetSum;
                    foreach (var res in results)
                    {
                        if (res.Profit == result.Profit && res.Risk == result.Risk)
                        {
                            isCycle = true;
                        }
                    }
                    if (Math.Abs(sum - 100) <= 0.1 && !isCycle)
                    {
                        double[,] profit = CalculationClass.Profitability(finalArray);
                        result.StandDev  = Math.Round(CalculationClass.StandardDeviation(profit, result), 4) * 100;

                        //  result.Cost = Math.Round(CalculationClass.PortfolioCost(finalArray, result), 2);

                        results.Add(result);
                    }
                }
            }
            return(results);
        }
Exemple #7
0
        private async void Test()
        {
            this.Cursor = Cursors.WaitCursor;
            if (comboBox_test.SelectedItem == null)
            {
                MessageBox.Show("Выберите значение", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            else
            {
                checkBox1_index.Checked = false;
                checkBox_sp.Checked     = false;
                profitYear = new Dictionary <double, double>();
                string   text = comboBox_test.SelectedItem.ToString();
                string[] t    = text.Split(' ');
                t[1] = t[1].Remove(t[1].Length - 1);
                double    prof   = Convert.ToDouble(t[1]);
                double    risk   = Convert.ToDouble(t[2]);
                Portfolio result = null;

                foreach (var res in results)
                {
                    if (Math.Abs(res.Profit - prof) < 0.001 && Math.Abs(res.Risk - risk) < 0.001)
                    {
                        result = res;
                        int j = 0;

                        foreach (DataGridViewRow a in Program.form.dataGridView2.Rows)
                        {
                            Asset asset = (Asset)a.Cells[0].Value;
                            dataGridView[1, j].Value = res.ConvertPortfolio()[j] + "%";
                            j++;
                        }
                        dataGridView[1, j].Value = res.GetSum + "%";
                        // double st = ;
                        label_stand.Text   = res.StandDev.ToString() + "%";
                        label_profitV.Text = prof + "%";
                        label_riskV.Text   = risk + "%";
                        // label_cost.Text = string.Format("{0:###,###.##} руб.", Math.Round(res.Cost));
                    }
                }
                await DownloadTask(selectedAssets, path, year + 1);

                try
                {
                    finalArray = ClassAssistant.ReadData(selectedAssets, path);
                    weeks      = ClassAssistant.DateTimeArray(selectedAssets, path);
                    checkBox1_index.Enabled = true;
                    checkBox_sp.Enabled     = true;

                    DoGraphProfit(finalArray, result);
                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }//button_test_Click(sender, e); }
            }
            this.Cursor         = Cursors.Default;
            dataGridView.Cursor = Cursors.Default;
        }
Exemple #8
0
        private void CorrelationPortfolio(Asset[] allAssets, int count, int period)
        {
            ParallelOptions parOpts = new ParallelOptions();

            parOpts.CancellationToken = cancelToken.Token;
            try
            {
                parOpts.CancellationToken.ThrowIfCancellationRequested();

                double[,] finalArray = ClassAssistant.ReadDataForCorrelation(allAssets, Program.path + "\\data.txt", period); //ClassAssistant.ReadData(allAssets, path);
                parOpts.CancellationToken.ThrowIfCancellationRequested();

                double[] average = CalculationClass.AverageProfitability(finalArray);
                parOpts.CancellationToken.ThrowIfCancellationRequested();
                for (int i = count; i < allAssets.Length; i++)
                {
                    double sum = 0;
                    for (int j = 0; j < count; j++)
                    {
                        sum += CalculationClass.Cor(finalArray, average, i, j);
                    }
                    allAssets[i].Correlation = Math.Round(sum / count, 2);
                    parOpts.CancellationToken.ThrowIfCancellationRequested();
                }
            }
            catch (IOException ex)
            {
                string[] exception = ex.Message.Split(' ');
                //  DialogResult dr = MessageBox.Show("Ошибка при считывании файла " + exception[exception.Length - 1] + ". Замените этот актив или попробуйте еще раз.\nПовторить попытку?",
                //       "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                // MessageBox.Show(ex.Message);
                counter++;
                if (counter == 3)
                {
                    MessageBox.Show("Ошибка при расчете корреляции!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    counter = 0;
                }
                else
                {
                    CorrelationPortfolio(allAssets, count, period);
                }
            }
            catch (OperationCanceledException ex) { throw ex; }
            catch (Exception ex)
            {
                string[]     exception = ex.Message.Split(' ');
                DialogResult dr        = MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                if (dr == System.Windows.Forms.DialogResult.Retry)
                {
                    CorrelationPortfolio(allAssets, count, period);
                }
            }
        }
Exemple #9
0
        private void trackBar_period_MouseLeave(object sender, EventArgs e)
        {
            if (isChange)
            {
                isChange = false;

                /*
                 * List<Asset>[] l = ClassAssistant.FillQueue(assets);
                 * toolStripStatusLabel.Text = "Обновляем волатильность и среднюю доходность...";
                 *
                 * await VolatilityTask(dataPath, l, trackBar_period.Value);
                 *
                 * //  list = list.OrderBy(x => x.Name).ToList();
                 * DoTable(list);
                 */

                assets = ClassAssistant.DoAssetsArray(Program.path + "\\" + trackBar_period.Value + ".txt");
                List <Asset> lst = new List <Asset>();
                foreach (var a in list)
                {
                    for (int i = 0; i < assets.Length; i++)
                    {
                        if (assets[i].Name == a.Name)
                        {
                            lst.Add(assets[i]);
                            break;
                        }
                    }
                }
                list = lst;
                DoTable(list);

                if (dataGridView2.Rows.Count != 0 && dataGridView1.RowCount != 0)
                {
                    cancelToken.Cancel(true);
                    cancelToken = new CancellationTokenSource();
                    int     i        = 0;
                    Asset[] selected = new Asset[dataGridView2.Rows.Count];
                    foreach (DataGridViewRow t in dataGridView2.Rows)
                    {
                        Asset a = (Asset)t.Cells[0].Value;
                        selected[i] = a;
                        i++;
                    }
                    CorrelationTask(selected);
                }
            }
        }
Exemple #10
0
        private async void dataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                double   sum = 0;
                double[] w   = new double[dataGridView.Rows.Count - 1];
                for (int i = 0; i < dataGridView.Rows.Count - 1; i++)
                {
                    try
                    {
                        w[i] = Convert.ToDouble(dataGridView[1, i].Value.ToString());
                        sum += w[i];
                    }
                    catch (FormatException) { MessageBox.Show("Неверный формат числа!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); break; }
                }
                dataGridView[1, dataGridView.Rows.Count - 1].Value = sum + "%";
                if (dataGridView[1, dataGridView.Rows.Count - 1].Value.ToString() == "100%")
                {
                    await DownloadTask(selectedAssets, path, year + 1);

                    try
                    {
                        for (int i = 0; i < dataGridView.Rows.Count - 1; i++)
                        {
                            dataGridView[1, i].Value = dataGridView[1, i].Value.ToString() + "%";
                        }
                        finalArray = ClassAssistant.ReadData(selectedAssets, path);
                        weeks      = ClassAssistant.DateTimeArray(selectedAssets, path);
                        checkBox1_index.Enabled = true;
                        checkBox_sp.Enabled     = true;

                        Portfolio p = new Portfolio(w, 0, 0);
                        //  p.Cost = CalculationClass.PortfolioCost(finalArray, p);

                        // label_cost.Text = string.Format("{0:###,###.##} руб.", Math.Round(p.Cost));
                        profitYear = new Dictionary <double, double>();
                        DoGraphProfit(finalArray, p);
                        dataGridView.Columns[1].ReadOnly = true;
                        label2.Visible = false;
                    }
                    catch (Exception ex) { MessageBox.Show(ex.Message); }
                }
                else
                {
                    MessageBox.Show("Сумма долей должна быть равна 100%!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
Exemple #11
0
        private async void RefreshAllPeriods()
        {
            Asset[]        newassets = assets;
            List <Asset>[] l         = ClassAssistant.FillQueue(newassets);

            for (int i = 3; i < 13; i++)
            {
                if ((File.GetLastWriteTime(Program.path + "\\" + i + ".txt").Date != DateTime.Now.Date) || !File.Exists(Program.path + "\\" + i + ".txt"))
                {
                    await VolatilityTask(dataPath, l, i);

                    ClassAssistant.SaveData(Program.path + "\\" + i + ".txt", newassets);
                }
            }
            isCalculate = true;
        }
Exemple #12
0
        private void checkBox1_index_CheckedChanged(object sender, EventArgs e)
        {
            GraphPane pane = zGC.GraphPane;

            if (checkBox1_index.Checked)
            {
                Asset[] a = new Asset[1];
                a[0] = new Asset("MICEXINDEXCF", "MICEX", 13851);
                ClassAssistant.DownloadAllAssets(a, path, year + 1, false);
                Dictionary <double, double> profitIndex = new Dictionary <double, double>();
                double[] y = ClassAssistant.ReadAssets(path + a[0].Ticker + ".txt", weeks);
                for (int i = 0; i < y.Length; i++)
                {
                    profitIndex.Add(x[i], y[i]);
                }

                double[] y_profit = new double[y.Length];
                y_profit[0] = 0;
                for (int i = 1; i < y_profit.Length; i++)
                {
                    y_profit[i] = ((y[i] / y[0]) - 1) * 100;
                }

                double t   = (y[y.Length - 1] - y[0]) / y[0];
                double ddr = 0;
                Drawdown(profitIndex, out ddr);

                label_i.Visible        = true;
                label_indProfit.Text   = Math.Round(t * 100, 2).ToString() + "%";
                label_indDrowdown.Text = Math.Round(ddr, 2).ToString() + "%";

                index = pane.AddCurve("ММВБ", x, y_profit, Color.Blue, SymbolType.Square);
                index.Symbol.Fill.Type = FillType.Solid;
                CurveList cl = pane.CurveList;
                zGC.AxisChange();
                zGC.Invalidate();
            }
            else
            {
                pane.CurveList.Remove(index);
                zGC.AxisChange();
                zGC.Invalidate();
                label_i.Visible        = false;
                label_indProfit.Text   = "";
                label_indDrowdown.Text = "";
            }
        }
Exemple #13
0
 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
 {
     try
     {
         ClassAssistant.SaveData(Application.StartupPath + "\\assets.txt", assets);
         using (StreamWriter sw = new StreamWriter(Application.StartupPath + "\\options.txt", false, Encoding.GetEncoding(1251)))
         {
             sw.WriteLine("period=" + trackBar_period.Value);
             if (dataGridView2.Rows.Count != 0)
             {
                 foreach (DataGridViewRow r in dataGridView2.Rows)
                 {
                     sw.WriteLine(r.Cells[0].Value + ";" + r.Cells[1].Value);
                 }
             }
         }
     }
     catch (Exception) { }
 }
Exemple #14
0
        private Task Download(List <Asset>[] lst, string path, int period)
        {
            return(Task.Run(() =>
            {
                //ClassAssistant.DownloadAllAssets(allAssets, path, period, false);
                Asset[] asset1 = lst[0].ToArray();
                Asset[] asset2 = lst[1].ToArray();
                Asset[] asset3 = lst[2].ToArray();
                Asset[] asset4 = lst[3].ToArray();

                try
                {
                    Task t1 = Task.Factory.StartNew(() =>
                    {
                        ClassAssistant.DownloadAllAssets(asset1, path, period, false);
                    });

                    Task t2 = Task.Factory.StartNew(() =>
                    {
                        ClassAssistant.DownloadAllAssets(asset2, path, period, false);
                    });

                    Task t3 = Task.Factory.StartNew(() =>
                    {
                        ClassAssistant.DownloadAllAssets(asset3, path, period, false);
                    });

                    Task t4 = Task.Factory.StartNew(() =>
                    {
                        ClassAssistant.DownloadAllAssets(asset4, path, period, false);
                    });

                    Task.WaitAll(t1, t2, t3, t4);
                }
                catch (Exception ex) { MessageBox.Show(ex.Message + "\n" + ex.InnerException); }
            }));
        }
        private async void LoadForm()
        {
            this.Cursor = Cursors.WaitCursor;

            zGC.GraphPane.CurveList.Clear();

            GraphPane pane = zGC.GraphPane;

            pane.Title.Text = "Граница эффективных портфелей";
            zGC.GraphPane.YAxis.Title.Text = "Доходность (%)";
            zGC.GraphPane.XAxis.Title.Text = "Риск (%)";
            zGC.GraphPane.XAxis.Scale.Min  = -0.1;

            label_step.Text = "0.1%";

            selectedAssets = new Asset[Program.form.dataGridView2.Rows.Count];
            constraints    = new double[Program.form.dataGridView2.Rows.Count];
            int j = 0;

            foreach (DataGridViewRow t in Program.form.dataGridView2.Rows)
            {
                Asset a = (Asset)t.Cells[0].Value;
                selectedAssets[j] = a;
                constraints[j]    = Convert.ToDouble(t.Cells[1].Value.ToString().Replace('.', ','));
                j++;
            }
            await DownloadTask(selectedAssets, Program.path, Program.form.trackBar_period.Value);

            // ClassAssistant.DownloadAllAssets(selectedAssets, Program.path, Program.form.trackBar_period.Value, false);

            try
            {
                finalArray = ClassAssistant.ReadData(selectedAssets, Program.path);

                sp = ClassAssistant.SinglePortfolio(finalArray);

                DoEffectiveLine();
                if (results.Count != 0)
                {
                    DoTable(results.Last());
                }
                this.Cursor         = Cursors.Default;
                dataGridView.Cursor = Cursors.Default;
            }
            catch (System.IO.IOException ex)
            {
                string[] exception = ex.Message.Split(' ');
                //  DialogResult dr = MessageBox.Show("Ошибка при считывании файла " + exception[exception.Length - 1] + ". Замените этот актив или попробуйте еще раз.\nПовторить попытку?",
                //      "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                //  if (dr == System.Windows.Forms.DialogResult.Retry) LoadForm();
                //  else this.Close();
                count++;
                if (count == 3)
                {
                    // DialogResult dr = MessageBox.Show("Ошибка при считывании файла " + exception[exception.Length - 1] + ". Замените этот актив.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    DialogResult dr = MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    count = 0;
                    if (dr == System.Windows.Forms.DialogResult.OK)
                    {
                        this.Close();
                    }
                }
                else
                {
                    LoadForm();
                }
            }
            catch (Exception ex)
            {
                string[]     exception = ex.Message.Split(' ');
                DialogResult dr        = MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                if (dr == System.Windows.Forms.DialogResult.Retry)
                {
                    LoadForm();
                }
                else
                {
                    this.Close();
                }
            }
        }
        public void DoEffectiveLine()
        {
            try
            {
                results = new List <Portfolio>(); //new List<double[]>();


                if (start == 0)
                {
                    start = step;
                }
                if (start > finish)
                {
                    finish = 1;
                }

                results = ClassAssistant.DoListPortfolio(finalArray, selectedAssets, start, finish, step, constraints);

                GraphPane gp = zGC.GraphPane;
                gp.CurveList.Clear();

                zGC.AxisChange();
                zGC.Invalidate();

                if (results.Count == 0)
                {
                    MessageBox.Show("Решения для данных параметров не найдены", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                else
                {
                    zGC.IsShowPointValues = true;

                    double[] x = new double[results.Count];
                    double[] y = new double[results.Count];
                    int      i = 0;
                    foreach (var a in results)
                    {
                        x[i] = a.Risk;
                        y[i] = a.Profit;
                        i++;
                    }
                    LineItem line = gp.AddCurve("Эффективная граница", x, y, Color.Red);
                    line.Symbol.Fill.Type = FillType.Solid;

                    CurveList cl = gp.CurveList;
                    zGC.AxisChange();
                    zGC.Invalidate();

                    double[] xSP = new double[1];
                    double[] ySP = new double[1];
                    xSP[0] = sp.Risk;
                    ySP[0] = sp.Profit;
                    LineItem lineSP = gp.AddCurve("ЕП", xSP, ySP, Color.Blue);
                    lineSP.Symbol.Fill.Type = FillType.Solid;

                    cl = gp.CurveList;
                    zGC.AxisChange();
                    zGC.Invalidate();
                    label_.Text = "Портфели: " + Convert.ToString(results.Count);
                }
            }
            catch (FormatException)
            {
                MessageBox.Show("Неверный формат числа!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
Exemple #17
0
        public async void DoList()
        {
            this.Cursor = Cursors.WaitCursor;
            try
            {
                int j = 0;
                comboBox_test.Items.Clear();

                //ClassAssistant.DownloadAllAssets(selectedAssets, path, year, false);

                await DownloadTask(selectedAssets, path, year);

                finalArray = ClassAssistant.ReadData(selectedAssets, path);

                double start = -0.02, finish = 1, step = 0.001;
                results = ClassAssistant.DoListPortfolio(finalArray, selectedAssets, start, finish, step, constraints);

                if (results.Count == 0)
                {
                    MessageBox.Show("Решения не найдены", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    this.Close();
                }
                else
                {
                    j = 1;
                    foreach (var t in results)
                    {
                        comboBox_test.Items.Add(j + ": " + t.Profit.ToString() + "; " + t.Risk.ToString());
                        j++;
                    }
                }
                dataGridView.Cursor = Cursors.Default;
                this.Cursor         = Cursors.Default;
            }
            catch (System.IO.IOException ex)
            {
                string[] exception = ex.Message.Split(' ');
                count++;
                if (count == 3)
                {
                    // DialogResult dr = MessageBox.Show("Нет данных для " + exception[exception.Length - 1] + ". Замените этот актив.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    DialogResult dr = MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    count = 0;
                    if (dr == System.Windows.Forms.DialogResult.OK)
                    {
                        this.Close();
                    }
                }
                else
                {
                    DoList();
                }
            }
            catch (Exception ex)
            {
                string[]     exception = ex.Message.Split(' ');
                DialogResult dr        = MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                if (dr == System.Windows.Forms.DialogResult.Retry)
                {
                    DoList();                                               //Form4_test_Load(sender, e);
                }
                // else this.Close();
            }
        }
Exemple #18
0
        private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                dataPath = Program.path + "\\data.txt";
                ClassAssistant.DownloadData(dataPath);

                dataGridView1.AllowUserToOrderColumns = true;
                dataGridView1.SelectionMode           = DataGridViewSelectionMode.FullRowSelect;
                assets = ClassAssistant.DoAssetsArray(Application.StartupPath + "\\assets.txt");
                list   = assets.ToList <Asset>();
                list   = list.OrderBy(x => x.Name).ToList();
                if (File.Exists(Application.StartupPath + "\\options.txt"))
                {
                    using (StreamReader sr = new StreamReader(Application.StartupPath + "\\options.txt", Encoding.GetEncoding(1251)))
                    {
                        string[] text = sr.ReadToEnd().Split('\n');
                        trackBar_period.Value = Convert.ToInt32(text[0].Split('=')[1]);
                        for (int i = 1; i < text.Length - 1; i++)
                        {
                            string[] line = text[i].Split(';');
                            foreach (var a in assets)
                            {
                                if (a.Name == line[0])
                                {
                                    dataGridView2.Rows.Add(a, Convert.ToDouble(line[1].Replace('.', ',')));
                                    list.Remove(a);
                                    break;
                                }
                            }
                        }
                    }
                }


                DoTable(list);
                try
                {
                    ClassAssistant.ReadCapitalization(list, 2017, Application.StartupPath);
                }
                catch (FileNotFoundException) { MessageBox.Show("Файл с данными о капитализации не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error); }
                DoTable(list);

                RefreshParameters();

                if (dataGridView2.Rows.Count != 0 && dataGridView1.RowCount != 0)
                {
                    cancelToken.Cancel(true);
                    cancelToken = new CancellationTokenSource();
                    int     i        = 0;
                    Asset[] selected = new Asset[dataGridView2.Rows.Count];
                    foreach (DataGridViewRow t in dataGridView2.Rows)
                    {
                        Asset a = (Asset)t.Cells[0].Value;
                        selected[i] = a;
                        i++;
                    }
                    CorrelationTask(selected);
                }
            }
            catch (System.IO.FileNotFoundException)
            {
                MessageBox.Show("Файл с данными об акциях не найден!", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        private async void Correlation()
        {
            this.Cursor    = Cursors.WaitCursor;
            selectedAssets = new Asset[Program.form.dataGridView2.Rows.Count];
            int j = 0;

            foreach (DataGridViewRow t in Program.form.dataGridView2.Rows)
            {
                Asset a = (Asset)t.Cells[0].Value;
                selectedAssets[j] = a;
                j++;
            }
            string path = Program.path + "cor\\";

            await DownloadTask(selectedAssets, path, Program.form.trackBar_period.Value);

            try
            {
                finalArray = ClassAssistant.ReadData(selectedAssets, path);

                dataGridView.Columns.Add("colName", "Актив");
                for (int i = 0; i < selectedAssets.Length; i++)
                {
                    dataGridView.Columns.Add(selectedAssets[i].Ticker, selectedAssets[i].Name);
                    dataGridView.Rows.Add(selectedAssets[i].Name);
                }
                this.FillTable(finalArray);
                for (int i = 0; i < dataGridView.Columns.Count; i++)
                {
                    dataGridView.Columns[i].Width = 60;
                }
                this.Cursor = Cursors.Default;
            }
            catch (System.IO.IOException ex)
            {
                //Form5_cor_Load(sender, e);
                string[] exception = ex.Message.Split(' ');

                /*   DialogResult dr = MessageBox.Show("Ошибка при считывании файла " + exception[exception.Length - 1] + ". Замените этот актив или попробуйте еще раз.\nПовторить попытку?",
                 *     "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                 * if (dr == System.Windows.Forms.DialogResult.Retry) Correlation();
                 * else this.Close();
                 */
                count++;
                if (count == 3)
                {
                    DialogResult dr = MessageBox.Show("Ошибка при считывании файла " + exception[exception.Length - 1] + ". Замените этот актив.", "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    count = 0;
                    if (dr == System.Windows.Forms.DialogResult.OK)
                    {
                        this.Close();
                    }
                }
                else
                {
                    Correlation();
                }
            }
            catch (Exception ex)
            {
                string[]     exception = ex.Message.Split(' ');
                DialogResult dr        = MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
                if (dr == System.Windows.Forms.DialogResult.Retry)
                {
                    Correlation();
                }
                else
                {
                    this.Close();
                }
            }
        }