示例#1
0
        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);
            }
        }
示例#2
0
        /// <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("添加成功!");
        }