private void LoadStatementFromCFMMC(CookieContainer cookie, Guid accountId) { StatementParseWay parseWay = StatementParseWay.html; lock (locker) { // StatementContext statement = new StatementContext(); Account account = statement.Accounts.FirstOrDefault(model => model.Id == accountId); //try //{ DateTime startDate = DateTime.Now.AddDays(-186).Date; DateTime endDate = DateTime.Now.Date; decimal close = 0; decimal? yesterdayBalance, todayBalance, remittance, amount; int dataCount = 0; FundStatus lastFundStatus; Stock lastStock; // TransactionOptions transactionOptions = new TransactionOptions(); transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; transactionOptions.Timeout = new TimeSpan(0, 30, 0); //using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) //{ lastStock = statement.Stocks.Where(s => s.AccountId == account.Id).OrderByDescending(s => s.Date).FirstOrDefault(); if (lastStock == null) { ProgressInfoVisible((endDate - startDate).Days + 1); // bool firstLine = true; // while (startDate <= endDate) { SetProgressText(string.Concat("【", account.AccountNumber, "】 ", startDate.ToString("yyyy年MM月dd日"))); if (parseWay == StatementParseWay.html) { _Helper.GetStatementByRequestHtml(cookie, startDate, SettlementType.date, statement, out yesterdayBalance, out todayBalance, out remittance, out amount, account.Id); } else { _Helper.GetStatementByLoadExcel(cookie, startDate, SettlementType.date, statement, out yesterdayBalance, out todayBalance, out remittance, out amount, account.Id); } if (yesterdayBalance.HasValue && todayBalance.HasValue && remittance.HasValue && amount.HasValue) { Stock stock = new Stock(); stock.Id = Guid.NewGuid(); if (firstLine) { stock.Date = startDate.Date; stock.Open = yesterdayBalance.Value + remittance.Value; stock.Close = close = todayBalance.Value; if (stock.Close > stock.Open) { stock.High = stock.Close; stock.Low = stock.Open; } else { stock.High = stock.Open; stock.Low = stock.Close; } stock.Volume = amount.Value; stock.AccountId = account.Id; firstLine = false; } else { stock.Date = startDate.Date; stock.Open = close; stock.Close = close += todayBalance.Value - yesterdayBalance.Value - remittance.Value; if (stock.Close > stock.Open) { stock.High = stock.Close; stock.Low = stock.Open; } else { stock.High = stock.Open; stock.Low = stock.Close; } stock.Volume = amount.Value; stock.AccountId = account.Id; } statement.AddStock(stock); dataCount++; } // startDate = startDate.AddDays(1); AddProgressValue(1); } } else { startDate = lastStock.Date.AddDays(1).Date; ProgressInfoVisible((endDate - startDate).Days + 1); // close = lastStock.Close; while (startDate <= endDate) { SetProgressText(string.Concat("【", account.AccountNumber, "】 ", startDate.ToString("yyyy年MM月dd日"))); if (parseWay == StatementParseWay.html) { _Helper.GetStatementByRequestHtml(cookie, startDate, SettlementType.date, statement, out yesterdayBalance, out todayBalance, out remittance, out amount, account.Id); } else { _Helper.GetStatementByLoadExcel(cookie, startDate, SettlementType.date, statement, out yesterdayBalance, out todayBalance, out remittance, out amount, account.Id); } if (yesterdayBalance.HasValue && todayBalance.HasValue && remittance.HasValue && amount.HasValue) { Stock stock = new Stock(); stock.Id = Guid.NewGuid(); stock.Date = startDate.Date; stock.Open = close; stock.Close = close += todayBalance.Value - yesterdayBalance.Value - remittance.Value; if (stock.Close > stock.Open) { stock.High = stock.Close; stock.Low = stock.Open; } else { stock.High = stock.Open; stock.Low = stock.Close; } stock.Volume = amount.Value; stock.AccountId = account.Id; statement.AddStock(stock); dataCount++; } // startDate = startDate.AddDays(1); AddProgressValue(1); } } // 复权处理 var stocks = statement.Stocks.Where(s => s.AccountId == account.Id).OrderBy(s => s.Date); lastStock = stocks.LastOrDefault(); lastFundStatus = statement.FundStatus.Where(fs => fs.AccountId == account.Id).OrderBy(fs => fs.Date).LastOrDefault(); if (lastStock != null && lastFundStatus != null) { decimal tmp = lastStock.Close - lastFundStatus.TodayBalance; if (tmp != 0) { SetProgressText(string.Format("<{0}>图表复权...", account.AccountNumber)); foreach (var stock in stocks) { stock.Open -= tmp; stock.High -= tmp; stock.Low -= tmp; stock.Close -= tmp; } statement.UpdateStocks(stocks); } } // SetProgressText(string.Format("<{0}>保存数据...", account.AccountNumber)); statement.SaveChanged(); if (dataCount > 0) { InitializeUserControlsThreadStart(); } _settingUserControl.AddLog(string.Format("账户<{0}>下载数据完毕,新增 {1} 天数据。", account.AccountNumber, dataCount)); ProgressInfoHidden(); //} //catch (Exception) //{ // throw; //} //finally //{ // this.ProgressInfoHidden(); //} // 备份数据至邮箱。 //MailYunBackup(true); } }
/// <summary> /// 从文华6月结单解析数据,得到蜡烛图数据 /// </summary> /// <param name="wh6MonthStatementsDirPath">从文华6软件导出的月结单文件夹</param> private void ImportStocksFromWh6MonthStatement(string wh6MonthStatementsDirPath) { try { List <Wh6Trade> wh6Trades = new List <Wh6Trade>(); using (StatementContext statement = new StatementContext(typeof(Account), typeof(Stock))) { var currentAccount = statement.Accounts.FirstOrDefault(model => model.Id == _Session.SelectedAccountId); var files = Directory.GetFileSystemEntries(wh6MonthStatementsDirPath, "*.*.txt"); //初始化状态 InitialStatusAndProgressBar(5); // foreach (var file in files) { //更新状态 UpdateStatusAndProgressBar(string.Format("正在处理月结算文件{0}", System.IO.Path.GetFileName(file))); // var reader = new StreamReader(File.OpenRead(file), Encoding.GetEncoding("gb2312")); string monthStatement = reader.ReadToEnd(); //****************************** // 客户信息 //更新状态 UpdateStatusAndProgressBar("导入客户信息", 1); monthStatement = monthStatement.Substring(monthStatement.IndexOf("交易结算")); string info = monthStatement.Substring(0, monthStatement.IndexOf("资金状况")); Wh6Info wh6Info = ParseWh6Info(info); //****************************** //******************* // 检验导入的数据是否与本地选定的账户匹配 if (currentAccount != null) { if (!currentAccount.AccountNumber.Contains(wh6Info.AccountNumber)) { this.AddLog(string.Format("不允许从<{0}>向<{1}>导入数据,导入数据必须与当前选定账户匹配!", wh6Info.AccountNumber, currentAccount.AccountNumber)); this.OverStatusAndProgressBar(); return; } } else { this.AddLog("未发现选定账户!"); this.OverStatusAndProgressBar(); return; } //******************* //****************************** // 成交记录 //更新状态 UpdateStatusAndProgressBar("导入成交记录", 1); monthStatement = monthStatement.Substring(monthStatement.IndexOf("成交记录")); string trades = monthStatement.Substring(0, monthStatement.IndexOf("平仓明细")); wh6Trades.AddRange(ImportWh6Trades(trades)); //****************************** } //******************************** // 得到蜡烛图数据 //更新状态 UpdateStatusAndProgressBar("生成蜡烛图数据", 1); var firstStock = statement.Stocks.Where(model => model.AccountId == currentAccount.Id).OrderBy(model => model.Date).FirstOrDefault(); var firstWh6Trade = wh6Trades.OrderBy(model => model.Date).FirstOrDefault(); if (firstStock != null) { if (firstWh6Trade != null) { DateTime firstDate = firstWh6Trade.Date; DateTime lastDate = firstStock.Date.AddDays(-1); decimal open = firstStock.Open, close = firstStock.Close, high = firstStock.High, low = firstStock.Low; while (firstDate <= lastDate) { if (lastDate.DayOfWeek != DayOfWeek.Saturday && lastDate.DayOfWeek != DayOfWeek.Sunday) { var tempWh6Trades = wh6Trades.Where(model => model.Date == lastDate); decimal profit = 0, volume = 0; foreach (var wh6Trade in tempWh6Trades) { profit += wh6Trade.ClosedProfit - wh6Trade.Commission; volume += wh6Trade.Amount; } Stock stock = new Stock(); stock.Id = Guid.NewGuid(); stock.Date = lastDate.Date.Date; stock.Close = open; stock.Open = stock.Close - profit; stock.High = stock.Close > stock.Open ? stock.Close : stock.Open; stock.Low = stock.Close < stock.Open ? stock.Close : stock.Open; stock.AccountId = currentAccount.Id; stock.Volume = volume; statement.AddStock(stock); } lastDate = lastDate.AddDays(-1); } // 更新状态 UpdateStatusAndProgressBar("保存数据", 1); this.AddLog(string.Format("从文华6月结单导入数据完毕!", currentAccount.AccountNumber)); this.OverStatusAndProgressBar(); } } else { this.AddLog(string.Format("本地没有<{0}>的数据,请先从保证金监控中心下载数据,然后再手动导入数据!", currentAccount.AccountNumber)); this.OverStatusAndProgressBar(); } //******************************** UpdateStatusAndProgressBar(progressBarValueIncrease: 1); } } catch (Exception) { throw; } finally { this.OverStatusAndProgressBar(); } }
private void _button确认_Click(object sender, RoutedEventArgs e) { decimal profit = 0, commission = 0, remittance = 0, volume = 0; int bing = 0; try { profit = Decimal.Parse(_textBox盈利.Text.Trim()); bing = 1; commission = Decimal.Parse(_textBox手续费.Text.Trim()); bing = 2; remittance = Decimal.Parse(_textBox出入金.Text.Trim()); bing = 3; volume = Decimal.Parse(_textBox成交额.Text.Trim()); } catch (FormatException) { switch (bing) { case 0: MessageBox.Show("盈利必须为数字!"); break; case 1: MessageBox.Show("手续费必须为数字!"); break; case 2: MessageBox.Show("出入金必须为数字!"); break; case 3: MessageBox.Show("成交额必须为数字!"); break; } } catch (OverflowException) { switch (bing) { case 0: MessageBox.Show("盈利超出数字范围!"); break; case 1: MessageBox.Show("手续费超出数字范围!"); break; case 2: MessageBox.Show("出入金超出数字范围!"); break; case 3: MessageBox.Show("成交额超出数字范围!"); break; } } using (StatementContext statement = new StatementContext(typeof(FundStatus), typeof(Account), typeof(Stock))) { var cooperate = statement.Accounts.FirstOrDefault(m => m.Id == accountId); if (cooperate == null) { throw new Exception(string.Concat("不存在ID为:", accountId, "的配资账户!")); } var sto = statement.Stocks.FirstOrDefault(m => m.AccountId == accountId && m.Date == _datePicker日期.SelectedDate.Value); if (sto != null) { MessageBox.Show(string.Concat("此账户【", _datePicker日期.SelectedDate.Value, "】数据已经存在!")); return; } var allStocks = statement.Stocks.Where(m => m.AccountId == accountId).OrderBy(m => m.Date); var beforeStocks = allStocks.Where(m => m.Date < _datePicker日期.SelectedDate.Value); var afterStocks = allStocks.Where(m => m.Date > _datePicker日期.SelectedDate.Value); var lastStock = beforeStocks.LastOrDefault(); Stock stock = new Stock(); if (lastStock != null) { stock.Open = lastStock.Close; } else { stock.Open = remittance; } stock.Close = stock.Open + profit - commission; stock.High = stock.Open < stock.Close ? stock.Close : stock.Open; stock.Low = stock.Open > stock.Close ? stock.Close : stock.Open; stock.Date = _datePicker日期.SelectedDate.Value; stock.Volume = volume; stock.AccountId = accountId; // statement.AddStock(stock); // if (afterStocks.Count() != 0 && stock.Close != stock.Open) { foreach (var st in afterStocks) { st.Open += stock.Close - stock.Open; st.Close += stock.Close - stock.Open; st.High += stock.Close - stock.Open; st.Low += stock.Close - stock.Open; } statement.UpdateStocks(afterStocks); } if (remittance != 0) { var stocks = statement.Stocks.Where(m => m.AccountId == accountId); foreach (var st in stocks) { st.Open += remittance; st.Close += remittance; st.High += remittance; st.Low += remittance; } statement.UpdateStocks(stocks); } statement.SaveChanged(); } DialogResult = true; MessageBox.Show("添加成功!"); }