private Task LiqTask(Asset[] assets) { return(Task.Run(() => { ClassAssistant.ReadLiquidity(assets, DateTime.Now); })); }
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); })); }
private Task DividendTask(Asset[] assets) { return(Task.Run(() => { ClassAssistant.DownloadDividend(assets); })); }
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); } })); }
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); }
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; }
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); } } }
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); } } }
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); } } }
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; }
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 = ""; } }
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) { } }
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); } }
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(); } }
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(); } } }