public void Test1() { string zipPath = @"..\..\..\Task3.zip"; using (var archive = ZipFile.OpenRead(zipPath)) { foreach (var entry in archive.Entries) { if (!entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase)) { continue; } using (var reader = new StreamReader(entry.Open())) { var portfolioWight = int.Parse(reader.ReadLine()); var countOrder = int.Parse(reader.ReadLine()); var weights = reader.ReadLine() .Split(" ") .Where(x => !string.IsNullOrEmpty(x)) .Select(x => int.Parse(x)) .ToList(); var prices = reader.ReadLine() .Split(" ") .Where(x => !string.IsNullOrEmpty(x)) .Select(x => int.Parse(x)) .ToList(); var orders = new List <Order>(); for (var i = 0; i < countOrder; i++) { orders.Add(new Order { Id = i, Price = prices[i], Weight = weights[i] }); } var portfolioReq = new PortfolioReqursion(orders); var portfolioTable = new PortfolioTable(orders); Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); var optReq = portfolioReq.GetOrders(portfolioWight); stopWatch.Stop(); var timeReq = stopWatch.Elapsed; stopWatch.Restart(); var optTabl = portfolioTable.GetOrders(portfolioWight); stopWatch.Stop(); var timeTabl = stopWatch.Elapsed; Debug.WriteLine($"{entry.Name}\t{timeReq.TotalMilliseconds}\t{timeTabl.TotalMilliseconds}\t{2 * (timeReq - timeTabl) / (timeReq + timeTabl)}"); Equals(optReq, optTabl); } } } }
public void UpdateSummary(string portfolio) { string[] list = new string[] { "Portfolio Investment", "Portfolio Return If Unchange", "Portfolio Current Return", "Portfolio Theta [day]" }; foreach (string item in list) { bool is_new = false; DataRow row = SummaryTable.FindByCriteria(item); if (row == null) { row = SummaryTable.NewRow(); is_new = true; } row["Criteria"] = item; row["Total"] = DBNull.Value; row["TotalPrc"] = DBNull.Value; if (is_new) { SummaryTable.Rows.Add(row); } SummaryTable.AcceptChanges(); } try { // get portfolio rows DataRow[] portfolio_rows = PortfolioTable.Select("PortfolioMembership LIKE '*" + portfolio + ",*'"); // update net-investment double net_investment = 0; foreach (DataRow prw in portfolio_rows) { net_investment += (double)prw["NetInvestment"]; } DataRow row = SummaryTable.FindByCriteria(list[0]); if (row != null) { row["Total"] = net_investment; } // update return-if-unchange double return_if_unchanged = 0; foreach (DataRow prw in portfolio_rows) { return_if_unchanged += (double)prw["ReturnIfUnchange"]; } row = SummaryTable.FindByCriteria(list[1]); if (row != null) { row["Total"] = return_if_unchanged; double prc = return_if_unchanged / net_investment; if (double.IsNaN(prc)) { row["TotalPrc"] = DBNull.Value; } else { row["TotalPrc"] = prc; } row["IsCredit"] = true; } // update current-return double current_return = 0; foreach (DataRow prw in portfolio_rows) { current_return += (double)prw["CurrentReturn"]; } row = SummaryTable.FindByCriteria(list[2]); if (row != null) { row["Total"] = current_return; double prc = current_return / net_investment; if (double.IsNaN(prc)) { row["TotalPrc"] = DBNull.Value; } else { row["TotalPrc"] = prc; } row["IsCredit"] = true; } // update total-theta double total_theta = 0; foreach (DataRow prw in portfolio_rows) { if (!double.IsNaN((double)prw["TotalTheta"])) { total_theta += (double)prw["TotalTheta"]; } } row = SummaryTable.FindByCriteria(list[3]); if (row != null) { row["Total"] = total_theta; double prc = total_theta / net_investment; if (double.IsNaN(prc)) { row["TotalPrc"] = DBNull.Value; } else { row["TotalPrc"] = prc; } row["IsCredit"] = true; } } catch { } }
public void UpdateStrategy(string portfolio, string opo_file, bool force_update, BackgroundWorker bg_worker) { // check that opo file is valid and exist if (opo_file == null || opo_file == "" || !File.Exists(opo_file)) { return; } // start data loading PortfolioTable.BeginLoadData(); bool is_new = false; DataRow row = FindRowByField(PortfolioTable, "OpoFile", opo_file); if (row == null) { row = PortfolioTable.NewRow(); is_new = true; } if (is_new || force_update) { // report progress if background worker is set if (bg_worker != null) { bg_worker.ReportProgress(0, "Loading " + opo_file + "..."); } // load opo file, and freeze position core.Load(opo_file); // check that strategy has positions if (core.PositionsTable.Rows.Count == 0) { return; } // freeze positions prices and commissions core.FreezeAll(); row["Stock"] = core.StockSymbol; row["Name"] = core.Name; row["StockLastPrice"] = core.StockLastPrice; row["StockImpVolatility"] = core.GetStockVolatility("Implied"); row["StockHisVolatility"] = core.GetStockVolatility("Historical"); row["EndDate"] = core.EndDate; row["StartDate"] = core.StartDate; row["Notes"] = core.Notes; row["OpoFile"] = opo_file; // recalculate all results core.rm.WizardMode = true; core.rm.CalculateAllResults(); double breakeven_prob = double.NaN; double protection_prob = double.NaN; foreach (DataRow rwr in core.ResultsTable.Rows) { switch ((string)rwr["Criteria"]) { case "Total Investment": row["NetInvestment"] = rwr["Total"]; break; case "Interest Paid": row["InterestPaid"] = rwr["Total"]; break; case "Maximum Profit Potential": row["MaxProfitPotential"] = rwr["Total"]; if (rwr["TotalPrc"] != DBNull.Value) { row["MaxProfitPotentialPrc"] = (double)rwr["TotalPrc"]; } break; case "Maximum Loss Risk": row["MaxLossRisk"] = rwr["Total"]; if (rwr["TotalPrc"] != DBNull.Value) { row["MaxLossRiskPrc"] = (double)rwr["TotalPrc"]; } break; case "Lower Protection": row["LowerBreakeven"] = rwr["Change"]; if (rwr["Prob"] != DBNull.Value) { if (double.IsNaN(protection_prob)) { protection_prob = (double)rwr["Prob"]; } else { protection_prob += (double)rwr["Prob"]; } } if (rwr["Price"] != DBNull.Value) { row["BreakevenPrice"] = rwr["Price"]; } break; case "Upper Protection": row["UpperBreakeven"] = rwr["Change"]; if (rwr["Prob"] != DBNull.Value) { if (double.IsNaN(protection_prob)) { protection_prob = (double)rwr["Prob"]; } else { protection_prob += (double)rwr["Prob"]; } } if (rwr["Price"] != DBNull.Value) { row["BreakevenPrice"] = rwr["Price"]; } break; case "Lower Breakeven": row["LowerBreakeven"] = rwr["Change"]; if (rwr["Prob"] != DBNull.Value) { if (double.IsNaN(breakeven_prob)) { breakeven_prob = (double)rwr["Prob"]; } else { breakeven_prob += (double)rwr["Prob"]; } } if (rwr["Price"] != DBNull.Value) { row["BreakevenPrice"] = rwr["Price"]; } break; case "Upper Breakeven": row["UpperBreakeven"] = rwr["Change"]; if (rwr["Prob"] != DBNull.Value) { if (double.IsNaN(breakeven_prob)) { breakeven_prob = (double)rwr["Prob"]; } else { breakeven_prob += (double)rwr["Prob"]; } } if (rwr["Price"] != DBNull.Value) { row["BreakevenPrice"] = rwr["Price"]; } break; case "Return if Unchanged": row["ReturnIfUnchange"] = rwr["Total"]; if (rwr["TotalPrc"] != DBNull.Value) { row["ReturnIfUnchangePrc"] = (double)rwr["TotalPrc"]; } break; case "Current Return": row["CurrentReturn"] = rwr["Total"]; if (rwr["TotalPrc"] != DBNull.Value) { row["CurrentReturnPrc"] = (double)rwr["TotalPrc"]; } break; case "Return at Target": row["ReturnAtTarget"] = rwr["Total"]; if (rwr["TotalPrc"] != DBNull.Value) { row["ReturnAtTargetPrc"] = (double)rwr["TotalPrc"]; } break; case "Expected Return": row["ExpectedReturn"] = rwr["Total"]; if (rwr["TotalPrc"] != DBNull.Value) { row["ExpectedReturnPrc"] = (double)rwr["TotalPrc"]; } break; case "Total Delta": row["TotalDelta"] = rwr["Total"]; break; case "Total Gamma": row["TotalGamma"] = rwr["Total"]; break; case "Total Theta [day]": row["TotalTheta"] = rwr["Total"]; break; case "Total Vega [% volatility]": row["TotalVega"] = rwr["Total"]; break; } } // additional result columns if (double.IsNaN(breakeven_prob)) { row["BreakevenProb"] = DBNull.Value; } else if (double.IsNaN(protection_prob)) { row["BreakevenProb"] = DBNull.Value; } else { row["BreakevenProb"] = 1 - protection_prob; } } // update portfolio membership if (row["PortfolioMembership"] == DBNull.Value || (string)row["PortfolioMembership"] == "") { row["PortfolioMembership"] = portfolio + ","; } else { row["PortfolioMembership"] = (string)row["PortfolioMembership"] + portfolio + ","; } // accept changes to table if (is_new) { PortfolioTable.Rows.Add(row); } PortfolioTable.AcceptChanges(); // end data loading PortfolioTable.EndLoadData(); }