Ejemplo n.º 1
0
        /// <summary>
        /// 创建一个今日委托记录
        /// </summary>
        /// <param name="registerTable">登记表实体</param>
        /// <param name="intNum">分红过户量</param>里
        /// <returns>今日委托实体</returns>
        private static XH_TodayEntrustTableInfo GetHistoryEntrustTable(XH_MelonCutRegisterTableInfo registerTable, int intNum)
        {
            XH_TodayEntrustTableInfo todayEntrustTable = new XH_TodayEntrustTableInfo();

            todayEntrustTable.EntrustNumber  = XHCommonLogic.BuildXHOrderNo();
            todayEntrustTable.CurrencyTypeId = registerTable.TradeCurrencyType;
            todayEntrustTable.TradeUnitId    = MCService.GetPriceUnit(registerTable.Code);
            todayEntrustTable.EntrustAmount  = intNum;
            todayEntrustTable.EntrustPrice   = 0;
            todayEntrustTable.EntrustTime    = DateTime.Now;
            todayEntrustTable.OfferTime      = DateTime.Now;

            todayEntrustTable.BuySellTypeId = (int)GTA.VTS.Common.CommonObject.Types.TransactionDirection.Buying;
            todayEntrustTable.OrderStatusId = (int)Types.OrderStateType.DOSDealed;
            todayEntrustTable.StockAccount  = registerTable.UserAccountDistributeLogo;//持仓账号,在分红记录中都是持仓账号
            //====通过持仓账号查询相关联的资金账号
            UA_UserAccountAllocationTableDal  dal    = new UA_UserAccountAllocationTableDal();
            UA_UserAccountAllocationTableInfo uaUser = dal.GetUserHoldAccountByUserCapitalAccount(registerTable.UserAccountDistributeLogo);

            todayEntrustTable.CapitalAccount = uaUser.UserAccountDistributeLogo;
            //=====
            todayEntrustTable.PortfolioLogo     = "";
            todayEntrustTable.SpotCode          = registerTable.Code;
            todayEntrustTable.TradeAmount       = intNum;
            todayEntrustTable.TradeAveragePrice = 0;
            todayEntrustTable.CancelAmount      = 0;
            todayEntrustTable.IsMarketValue     = false;
            todayEntrustTable.OrderMessage      = "股票分红生成委托记录";
            todayEntrustTable.McOrderId         = Guid.NewGuid().ToString();

            return(todayEntrustTable);
        }
        /// <summary>
        /// 获取用户指定类型的账户
        /// </summary>
        /// <param name="user"></param>
        /// <param name="accountTypeID"></param>
        /// <returns></returns>
        public static List <UA_UserAccountAllocationTableInfo> GetAccountList(UA_UserBasicInformationTableInfo user, int accountTypeID)
        {
            string where = string.Format("UserID = '{0}' AND AccountTypeLogo= '{1}'",
                                         user.UserID, accountTypeID);
            UA_UserAccountAllocationTableDal ua_UserAccountAllocationTableDal = new UA_UserAccountAllocationTableDal();

            return(ua_UserAccountAllocationTableDal.GetListArray(where));
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 根据持仓账户和商品代码获取资金账户
        /// </summary>
        /// <param name="holdAccount"></param>
        /// <param name="code"></param>
        /// <returns></returns>
        public static UA_UserAccountAllocationTableInfo GetCapitalAccountByHoldAccount(string holdAccount, string code)
        {
            UA_UserAccountAllocationTableDal dal = new UA_UserAccountAllocationTableDal();

            string where = string.Format(" UserAccountDistributeLogo = '{0}' ", holdAccount);
            //var account = DataRepository.UaUserAccountAllocationTableProvider.GetByUserAccountDistributeLogo(holdAccount);
            var account = dal.GetModel(holdAccount);

            if (account != null)
            {
                string id = account.UserID;

                return(GetCapitalAccount(id, code));
            }

            return(null);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 根据帐户类型和交易员ID找出对应的帐户和帐户所属类型
        /// </summary>
        /// <param name="freeTransfer">转帐实体</param>
        /// <param name="outMessage"></param>
        public static bool AccountTransferEntityChange(ref FreeTransferEntity freeTransfer, ref string outMessage)
        {
            string where = string.Format("UserID = '{0}' AND AccountTypeLogo= '{1}'", freeTransfer.TraderID, freeTransfer.FromCapitalAccountType);
            UA_UserAccountAllocationTableDal         dal             = new UA_UserAccountAllocationTableDal();
            List <UA_UserAccountAllocationTableInfo> AccountListFrom = dal.GetListArray(where);

            if (AccountListFrom == null || AccountListFrom.Count < 1)
            {
                outMessage = "转出资金帐号不存在";
                return(false);
            }
            if (AccountListFrom[0].WhetherAvailable == false)
            {
                outMessage = "转出资金帐户被冻结,不能转帐";
                return(false);
            }

            where = string.Format("UserID = '{0}' AND AccountTypeLogo= '{1}'", freeTransfer.TraderID, freeTransfer.ToCapitalAccountType);
            List <UA_UserAccountAllocationTableInfo> AccountListTo = dal.GetListArray(where);

            if (AccountListTo == null || AccountListTo.Count < 1)
            {
                outMessage = "转入资金帐号不存在";
                return(false);
            }
            if (AccountListTo[0].WhetherAvailable == false)
            {
                outMessage = "转入资金帐户被冻结,不能转帐";
                return(false);
            }

            BD_AccountTypeDal  acTypeDal         = new BD_AccountTypeDal();
            BD_AccountTypeInfo FrombdAccountType = acTypeDal.GetModel(freeTransfer.FromCapitalAccountType);
            BD_AccountTypeInfo TobdAccountType   = acTypeDal.GetModel(freeTransfer.ToCapitalAccountType);

            if (FrombdAccountType == null || TobdAccountType == null)
            {
                outMessage = "帐号所属类型匹配失败";
                return(false);
            }
            freeTransfer.FromCapitalAccount = AccountListFrom[0].UserAccountDistributeLogo;
            freeTransfer.ToCapitalAccount   = AccountListTo[0].UserAccountDistributeLogo;
            //freeTransfer.FromCapitalAccountType = (int)FrombdAccountType.ATCId;
            //freeTransfer.ToCapitalAccountType = (int)TobdAccountType.ATCId;
            return(true);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 依据交易员ID,帐户类型取帐户信息
        /// </summary>
        /// <param name="strTraderId"></param>
        /// <param name="iAccountTypeId"></param>
        /// <returns></returns>
        public static UA_UserAccountAllocationTableInfo GetAccountByTraderInfo(string strTraderId, int iAccountTypeId)
        {
            //陈武民修改 2009年7月9日
            UA_UserAccountAllocationTableInfo result = null;
            UA_UserAccountAllocationTableDal  dal    = new UA_UserAccountAllocationTableDal();

            string where = string.Format(" UserID = '{0}' ", strTraderId);
            List <UA_UserAccountAllocationTableInfo> list = dal.GetListArray(where);

            // DataRepository.UaUserAccountAllocationTableProvider.GetByUserId(strTraderId);

            foreach (UA_UserAccountAllocationTableInfo accountAllocationTable in list)
            {
                if (accountAllocationTable.AccountTypeLogo == iAccountTypeId)
                {
                    result = accountAllocationTable;
                }
            }

            return(result);
        }
        /// <summary>
        /// 写交易员帐户列表
        /// </summary>
        /// <param name="account">账户实体对象</param>
        /// <param name="outMessage">输出信息</param>
        /// <param name="db"></param>
        /// <param name="tm">事务对象,如果为null不开启事务</param>
        public bool AddTraderAccountToUserAccountAllocation(AccountEntity account, out string outMessage,
                                                            Database db, DbTransaction tm)
        {
            outMessage = string.Empty;
            if (account == null)
            {
                outMessage = "帐户对象为空!";
                return(false);
            }
            try
            {
                //先判断该交易账号是否已经存在
                //var result = DataRepository.UaUserAccountAllocationTableProvider.Find(tm, string.Format("UserAccountDistributeLogo='{0}'", account.Account));
                UA_UserAccountAllocationTableDal dal = new UA_UserAccountAllocationTableDal();

                //if (result == null || result.Count > 0)
                if (dal.Exists(account.Account))
                {
                    outMessage = "交易账号已经存在!" + account.Account;
                    return(false);
                }
                //var _UserAccountAllocation = new SqlUaUserAccountAllocationTableProvider(TransactionFactory.RC_ConnectionString, true, "");
                UA_UserAccountAllocationTableInfo model = new UA_UserAccountAllocationTableInfo();
                model.UserAccountDistributeLogo = account.Account;
                model.UserID           = account.TraderID;
                model.WhetherAvailable = true;
                model.AccountTypeLogo  = Convert.ToInt32(account.AccountType);
                dal.Add(model, db, tm);
                return(true);
            }
            catch (Exception ex)
            {
                outMessage = ex.Message.ToString();
                LogHelper.WriteError(ex.ToString(), ex);
                return(false);
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 更新过户记录
        /// </summary>
        /// <param name="tm">TransactionManager</param>
        /// <param name="cash">分红信息</param>
        /// <param name="tables">登记列表</param>
        private static bool UpdateStockCut(ReckoningTransaction tm, List <XH_MelonCutRegisterTableInfo> tables)
        {
            #region old code 李健华 2010-06-11 改为因为在每天开市时处理那么生成为当日委托我成交
            //List<XH_AccountHoldTableInfo> accountHoldList = new List<XH_AccountHoldTableInfo>();
            //List<XH_HistoryTradeTableInfo> historyTradeList = new List<XH_HistoryTradeTableInfo>();

            ////add 2010-1-15 因为数据库表有的成交记录是根据委托编号有外键关系,所以这里要生成委托记录
            //List<XH_HistoryEntrustTableInfo> historyEntrustList = new List<XH_HistoryEntrustTableInfo>();
            ////========

            //foreach (XH_MelonCutRegisterTableInfo registerTable in tables)
            //{
            //    //更新持仓表
            //    List<XH_AccountHoldTableInfo> accountHoldTables = GetAccountHoldList(
            //        registerTable.UserAccountDistributeLogo,
            //        registerTable.TradeCurrencyType, registerTable.Code);
            //    if (Utils.IsNullOrEmpty(accountHoldTables))
            //        continue;

            //    //过户的量
            //    decimal num = registerTable.RegisterAmount;
            //    //四舍五入
            //    num = Math.Round(num);
            //    int intNum = decimal.ToInt32(num);

            //    XH_AccountHoldTableInfo accountTable = accountHoldTables[0];
            //    SetAccountTable(accountTable, intNum);

            //    accountHoldList.Add(accountTable);

            //    //更新委托记录表
            //    XH_HistoryEntrustTableInfo historyEntrustTable = GetHistoryEntrustTable(registerTable, intNum);
            //    historyEntrustList.Add(historyEntrustTable);
            //    //更新历史成交表
            //    XH_HistoryTradeTableInfo historyTradeTable = GetHistoryTradeTable(registerTable, intNum);
            //    historyTradeTable.EntrustNumber = historyEntrustTable.EntrustNumber;
            //    historyTradeTable.CapitalAccount = historyEntrustTable.CapitalAccount;
            //    historyTradeList.Add(historyTradeTable);

            //    string format = "MelonCutService.UpdateStockCut进行股票分红[商品代码={0},持仓帐号={1},分红金额={2}]";
            //    string desc = string.Format(format, registerTable.Code, registerTable.UserAccountDistributeLogo, num);
            //    LogHelper.WriteDebug(desc);
            //}


            //XH_AccountHoldTableDal xh_AccountHoldTableDal = new XH_AccountHoldTableDal();
            //if (accountHoldList.Count > 0)
            //{
            //    foreach (var holdTableInfo in accountHoldList)
            //    {
            //        xh_AccountHoldTableDal.Update(holdTableInfo, tm.Database, tm.Transaction);
            //    }
            //}

            ////先添加委托记录
            //XH_HistoryEntrustTableDal xh_HistoryEntrustTableDal = new XH_HistoryEntrustTableDal();
            //if (historyEntrustList.Count > 0)
            //{
            //    foreach (XH_HistoryEntrustTableInfo item in historyEntrustList)
            //    {

            //        xh_HistoryEntrustTableDal.Add(item, tm.Database, tm.Transaction);
            //    }
            //}
            ////添加成交记录
            ////DataRepository.XhAccountHoldTableProvider.Update(tm, accountHoldList);

            ////DataRepository.XhHistoryTradeTableProvider.BulkInsert(historyTradeList);
            //XH_HistoryTradeTableDal xh_HistoryTradeTableDal = new XH_HistoryTradeTableDal();
            //if (historyTradeList.Count > 0)
            //{
            //    foreach (XH_HistoryTradeTableInfo historyTradeTable in historyTradeList)
            //    {
            //        //DataRepository.XhHistoryTradeTableProvider.Insert(tm, historyTradeTable);
            //        xh_HistoryTradeTableDal.Add(historyTradeTable, tm.Database, tm.Transaction);
            //    }
            //}


            ////删除对应的登记记录
            ////DataRepository.XhMelonCutRegisterTableProvider.Delete(tm, tables);
            //XH_MelonCutRegisterTableDal xh_MelonCutRegisterTableDal = new XH_MelonCutRegisterTableDal();
            //if (tables.Count > 0)
            //{
            //    foreach (var data in tables)
            //    {
            //        xh_MelonCutRegisterTableDal.Delete(data, tm.Database, tm.Transaction);
            //    }
            //}
            #endregion

            #region new code 李健华 2010-06-11 改为因为在每天开市时处理那么生成为当日委托我成交
            bool issuc = true;
            try
            {
                List <XH_AccountHoldTableInfo> accountHoldList = new List <XH_AccountHoldTableInfo>();
                List <XH_TodayTradeTableInfo>  todayTradeList  = new List <XH_TodayTradeTableInfo>();

                //add 2010-1-15 因为数据库表有的成交记录是根据委托编号有外键关系,所以这里要生成委托记录
                List <XH_TodayEntrustTableInfo>  todayEntrustList = new List <XH_TodayEntrustTableInfo>();
                UA_UserAccountAllocationTableDal dal = new UA_UserAccountAllocationTableDal();

                //========

                foreach (XH_MelonCutRegisterTableInfo registerTable in tables)
                {
                    //更新持仓表
                    List <XH_AccountHoldTableInfo> accountHoldTables = GetAccountHoldList(registerTable.UserAccountDistributeLogo, registerTable.TradeCurrencyType, registerTable.Code);
                    if (Utils.IsNullOrEmpty(accountHoldTables))
                    {
                        continue;
                    }

                    //过户的量
                    decimal num = registerTable.RegisterAmount;
                    //四舍五入
                    num = Math.Round(num);
                    int intNum = decimal.ToInt32(num);

                    XH_AccountHoldTableInfo accountTable = accountHoldTables[0];
                    SetAccountTable(accountTable, intNum);

                    accountHoldList.Add(accountTable);

                    //更新委托记录表
                    XH_TodayEntrustTableInfo todayEntrustTable = GetHistoryEntrustTable(registerTable, intNum);
                    todayEntrustList.Add(todayEntrustTable);
                    //更新历史成交表
                    XH_TodayTradeTableInfo todayTradeTable = GetTodayTradeTable(registerTable, intNum);
                    todayTradeTable.EntrustNumber  = todayEntrustTable.EntrustNumber;
                    todayTradeTable.CapitalAccount = todayEntrustTable.CapitalAccount;
                    todayTradeList.Add(todayTradeTable);
                    UA_UserAccountAllocationTableInfo userModel = dal.GetModel(registerTable.UserAccountDistributeLogo);
                    #region 回推相关成交记录信息
                    ReckonEndObject <XH_TodayEntrustTableInfo, XH_TodayTradeTableInfo> reckonEndObject = new ReckonEndObject <XH_TodayEntrustTableInfo, XH_TodayTradeTableInfo>();
                    reckonEndObject.IsSuccess    = true;
                    reckonEndObject.EntrustTable = todayEntrustTable;
                    List <XH_TodayTradeTableInfo> tradeModels = new List <XH_TodayTradeTableInfo>();
                    tradeModels.Add(todayTradeTable);
                    reckonEndObject.TradeTableList = tradeModels;
                    if (userModel != null)
                    {
                        reckonEndObject.TradeID = userModel.UserID;
                    }
                    reckonEndObject.Message = "分红委托成交";

                    CounterOrderService.Instance.AcceptStockDealOrder(reckonEndObject);
                    #endregion

                    string format = "MelonCutService.UpdateStockCut进行股票分红[商品代码={0},持仓帐号={1},分红金额={2}]";
                    string desc   = string.Format(format, registerTable.Code, registerTable.UserAccountDistributeLogo, num);
                    LogHelper.WriteDebug(desc);
                }


                XH_AccountHoldTableDal xh_AccountHoldTableDal = new XH_AccountHoldTableDal();
                if (accountHoldList.Count > 0)
                {
                    foreach (var holdTableInfo in accountHoldList)
                    {
                        xh_AccountHoldTableDal.Update(holdTableInfo, tm.Database, tm.Transaction);
                    }
                }

                //先添加委托记录
                XH_TodayEntrustTableDal xh_HistoryEntrustTableDal = new XH_TodayEntrustTableDal();
                if (todayEntrustList.Count > 0)
                {
                    foreach (XH_TodayEntrustTableInfo item in todayEntrustList)
                    {
                        xh_HistoryEntrustTableDal.Add(item, tm.Database, tm.Transaction);
                    }
                }
                //添加成交记录
                //DataRepository.XhAccountHoldTableProvider.Update(tm, accountHoldList);

                //DataRepository.XhHistoryTradeTableProvider.BulkInsert(historyTradeList);
                XH_TodayTradeTableDal xh_todayTradeTableDal = new XH_TodayTradeTableDal();
                if (todayTradeList.Count > 0)
                {
                    foreach (XH_TodayTradeTableInfo todayTradeTable in todayTradeList)
                    {
                        //DataRepository.XhHistoryTradeTableProvider.Insert(tm, historyTradeTable);
                        xh_todayTradeTableDal.Add(todayTradeTable, tm);
                    }
                }


                //删除对应的登记记录
                //DataRepository.XhMelonCutRegisterTableProvider.Delete(tm, tables);
                XH_MelonCutRegisterTableDal xh_MelonCutRegisterTableDal = new XH_MelonCutRegisterTableDal();
                if (tables.Count > 0)
                {
                    foreach (var data in tables)
                    {
                        xh_MelonCutRegisterTableDal.Delete(data, tm.Database, tm.Transaction);
                    }
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteError("过户分红异常" + ex.Message, ex);
                issuc = false;
            }
            return(issuc);

            #endregion
        }
        /// <summary>
        /// 追加资金
        /// </summary>
        /// <param name="addCapital"></param>
        /// <param name="outMessage"></param>
        /// <returns></returns>
        public bool AddCapital(AddCapitalEntity addCapital, out string outMessage)
        {
            outMessage = string.Empty;
            //TransactionManager tm = TransactionFactory.GetTransactionManager();
            //tm.BeginTransaction();
            try
            {
                if (addCapital == null)
                {
                    return(false);
                }
                UA_UserAccountAllocationTableDal userAccountDal = new UA_UserAccountAllocationTableDal();
                // new SqlUaUserAccountAllocationTableProvider(TransactionFactory.RC_ConnectionString, true, "");
                string findCodition = string.Format(" UserID='{0}' AND AccountTypeLogo='{1}'", addCapital.TraderID, 1);
                List <UA_UserAccountAllocationTableInfo> list = userAccountDal.GetListArray(findCodition);
                if (list == null || list.Count < 1)
                {
                    outMessage = "该交易员的银行帐号不存在!";
                    return(false);
                }
                if (list[0].UserAccountDistributeLogo != addCapital.BankCapitalAccount)
                {
                    outMessage = "银行帐号不正确!";
                    return(false);
                }

                UA_BankAccountTableDal _BankAccount = new UA_BankAccountTableDal();
                //new SqlUaBankAccountTableProvider(TransactionFactory.RC_ConnectionString, true, "");
                UA_CapitalFlowTableDal _UaCapitalFlow = new UA_CapitalFlowTableDal();
                //new SqlUaCapitalFlowTableProvider(TransactionFactory.RC_ConnectionString, true, "");
                Database db = DatabaseFactory.CreateDatabase();
                using (DbConnection conn = db.CreateConnection())
                {
                    conn.Open();
                    DbTransaction trm = conn.BeginTransaction();

                    try
                    {
                        if (addCapital.AddRMBAmount > 0 && addCapital.AddRMBAmount != decimal.MaxValue)
                        {
                            #region 增加人民币
                            var _record = _BankAccount.GetModel((int)Types.CurrencyType.RMB, addCapital.BankCapitalAccount);
                            if (_record == null)
                            {
                                outMessage = "币种为人民币的银行帐号不存在!";
                                return(false);
                            }
                            #region old code
                            ////_record.CapitalRemainAmount = _record.CapitalRemainAmount + addCapital.AddRMBAmount;
                            ////_record.AvailableCapital += addCapital.AddRMBAmount;
                            ////_record.TodayOutInCapital += addCapital.AddRMBAmount;
                            ////if (!_BankAccount.Update(tm, _record))
                            ////{
                            ////    outMessage = "更新人民币银行帐号失败!";
                            ////    return false;
                            ////}
                            //string sql =
                            //    string.Format(
                            //        "Update UA_BankAccountTable set CapitalRemainAmount=CapitalRemainAmount+{0},AvailableCapital=AvailableCapital+{0},TodayOutInCapital=TodayOutInCapital+{0} where TradeCurrencyTypeLogo={1} AND UserAccountDistributeLogo='{2}'",
                            //        addCapital.AddRMBAmount, (int)Types.CurrencyType.RMB, addCapital.BankCapitalAccount);
                            //DataRepository.Provider.ExecuteNonQuery(tm, CommandType.Text, sql);
                            #endregion
                            _BankAccount.AddCapital(addCapital.AddRMBAmount, addCapital.BankCapitalAccount, Types.CurrencyType.RMB, db, trm);

                            var _UaCapitalFlowTable = new UA_CapitalFlowTableInfo();
                            _UaCapitalFlowTable.TradeCurrencyType  = (int)Types.CurrencyType.RMB;
                            _UaCapitalFlowTable.FromCapitalAccount = string.Empty;
                            _UaCapitalFlowTable.ToCapitalAccount   = addCapital.BankCapitalAccount;
                            _UaCapitalFlowTable.TransferAmount     = addCapital.AddRMBAmount;
                            _UaCapitalFlowTable.TransferTime       = System.DateTime.Now;
                            _UaCapitalFlowTable.TransferTypeLogo   =
                                (int)ReckoningCounter.Entity.Contants.Types.TransferType.AddCapital;
                            _UaCapitalFlow.Add(_UaCapitalFlowTable, db, trm);
                            //if (!_UaCapitalFlow.Insert(tm, _UaCapitalFlowTable))
                            //{
                            //outMessage = "记录资金流水失败";
                            //return false;
                            //}
                            #endregion
                        }
                        if (addCapital.AddHKAmount > 0 && addCapital.AddHKAmount != decimal.MaxValue)
                        {
                            #region 增加港币
                            var _record = _BankAccount.GetModel((int)Types.CurrencyType.HK, addCapital.BankCapitalAccount);
                            //var _record =  _BankAccount.GetByTradeCurrencyTypeLogoUserAccountDistributeLogo((int)Types.CurrencyType.HK,
                            //                                                                     addCapital.BankCapitalAccount);
                            if (_record == null)
                            {
                                outMessage = "币种为港元的银行帐号不存在!";
                                return(false);
                            }
                            #region old code
                            ////_record.CapitalRemainAmount += addCapital.AddHKAmount;
                            ////_record.AvailableCapital += addCapital.AddHKAmount;
                            ////_record.TodayOutInCapital += addCapital.AddHKAmount;
                            ////if (!_BankAccount.Update(tm, _record))
                            ////{
                            ////    outMessage = "更新港元银行帐号失败!";
                            ////    return false;
                            ////}
                            //string sql =
                            //   string.Format(
                            //       "Update UA_BankAccountTable set CapitalRemainAmount=CapitalRemainAmount+{0},AvailableCapital=AvailableCapital+{0},TodayOutInCapital=TodayOutInCapital+{0} where TradeCurrencyTypeLogo={1} AND UserAccountDistributeLogo='{2}'",
                            //       addCapital.AddHKAmount, (int)Types.CurrencyType.HK, addCapital.BankCapitalAccount);
                            //DataRepository.Provider.ExecuteNonQuery(tm, CommandType.Text, sql);
                            #endregion
                            _BankAccount.AddCapital(addCapital.AddHKAmount, addCapital.BankCapitalAccount, Types.CurrencyType.HK, db, trm);

                            var _UaCapitalFlowTable = new UA_CapitalFlowTableInfo();
                            _UaCapitalFlowTable.TradeCurrencyType  = (int)Types.CurrencyType.HK;
                            _UaCapitalFlowTable.FromCapitalAccount = string.Empty;
                            _UaCapitalFlowTable.ToCapitalAccount   = addCapital.BankCapitalAccount;
                            _UaCapitalFlowTable.TransferAmount     = addCapital.AddHKAmount;
                            _UaCapitalFlowTable.TransferTime       = System.DateTime.Now;
                            _UaCapitalFlowTable.TransferTypeLogo   =
                                (int)ReckoningCounter.Entity.Contants.Types.TransferType.AddCapital;
                            _UaCapitalFlow.Add(_UaCapitalFlowTable, db, trm);
                            //if (!_UaCapitalFlow.Insert(tm, _UaCapitalFlowTable))
                            //{
                            //    outMessage = "记录资金流水失败";
                            //    return false;
                            //}
                            #endregion
                        }
                        if (addCapital.AddUSAmount > 0 && addCapital.AddUSAmount != decimal.MaxValue)
                        {
                            #region 增加美元
                            //var _record =
                            //    _BankAccount.GetByTradeCurrencyTypeLogoUserAccountDistributeLogo((int)Types.CurrencyType.US,
                            //                                                                     addCapital.BankCapitalAccount);
                            var _record = _BankAccount.GetModel((int)Types.CurrencyType.US, addCapital.BankCapitalAccount);

                            if (_record == null)
                            {
                                outMessage = "币种为美元的银行帐号不存在!";
                                return(false);
                            }
                            //_record.CapitalRemainAmount += addCapital.AddUSAmount;
                            //_record.AvailableCapital += addCapital.AddUSAmount;
                            //_record.TodayOutInCapital += addCapital.AddUSAmount;
                            //if (!_BankAccount.Update(tm, _record))
                            //{
                            //    outMessage = "更新美元银行帐号失败!";
                            //    return false;
                            //}

                            //string sql =
                            //  string.Format(
                            //      "Update UA_BankAccountTable set CapitalRemainAmount=CapitalRemainAmount+{0},AvailableCapital=AvailableCapital+{0},TodayOutInCapital=TodayOutInCapital+{0} where TradeCurrencyTypeLogo={1} AND UserAccountDistributeLogo='{2}'",
                            //      addCapital.AddUSAmount, (int)Types.CurrencyType.US, addCapital.BankCapitalAccount);
                            //DataRepository.Provider.ExecuteNonQuery(tm, CommandType.Text, sql);
                            _BankAccount.AddCapital(addCapital.AddUSAmount, addCapital.BankCapitalAccount, Types.CurrencyType.US, db, trm);

                            var _UaCapitalFlowTable = new UA_CapitalFlowTableInfo();
                            _UaCapitalFlowTable.TradeCurrencyType  = (int)Types.CurrencyType.US;
                            _UaCapitalFlowTable.FromCapitalAccount = string.Empty;
                            _UaCapitalFlowTable.ToCapitalAccount   = addCapital.BankCapitalAccount;
                            _UaCapitalFlowTable.TransferAmount     = addCapital.AddUSAmount;
                            _UaCapitalFlowTable.TransferTime       = System.DateTime.Now;
                            _UaCapitalFlowTable.TransferTypeLogo   =
                                (int)ReckoningCounter.Entity.Contants.Types.TransferType.AddCapital;
                            _UaCapitalFlow.Add(_UaCapitalFlowTable, db, trm);

                            //if (!_UaCapitalFlow.Insert(tm, _UaCapitalFlowTable))
                            //{
                            //    outMessage = "记录资金流水失败";
                            //    return false;
                            //}
                            #endregion
                        }
                        trm.Commit();
                    }
                    catch (Exception ex)
                    {
                        trm.Rollback();
                        outMessage = ex.Message.ToString();
                        LogHelper.WriteError(outMessage, ex);
                        return(false);
                    }
                    finally
                    {
                        trm.Dispose();
                    }
                }
                outMessage = "追加资金成功!";
                return(true);
            }
            catch (Exception ex)
            {
                outMessage = ex.Message.ToString();
                LogHelper.WriteError(outMessage, ex);
                return(false);
            }
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Create by:李健华
        /// Create date:2010-06-08
        /// Desc.: 初始货配对资金账号与持仓账号
        /// </summary>
        /// <param name="capitalAccountType"></param>
        /// <param name="userID">交易员ID</param>
        public static List <AccountPair> InitializeAccountPair(BD_AccountTypeInfo capitalAccountType)
        {
            List <AccountPair> AccountPairList = new List <AccountPair>();

            try
            {
                List <UA_UserBasicInformationTableInfo> userBasicList = new List <UA_UserBasicInformationTableInfo>();
                UA_UserBasicInformationTableDal         ubDal         = new UA_UserBasicInformationTableDal();
                userBasicList = ubDal.GetAll();
                if (userBasicList == null)
                {
                    return(AccountPairList);
                }
                UA_UserAccountAllocationTableDal dal = new UA_UserAccountAllocationTableDal();
                foreach (var item in userBasicList)
                {
                    string where = string.Format("UserID = '{0}' AND AccountTypeLogo= '{1}'", item.UserID, capitalAccountType.AccountTypeLogo);

                    List <UA_UserAccountAllocationTableInfo> capitalAccountList = dal.GetListArray(where);

                    if (Utils.IsNullOrEmpty(capitalAccountList))
                    {
                        continue;
                    }

                    //对应资金账户类型的只能有一个资金交易账户
                    UA_UserAccountAllocationTableInfo capitalAccount = capitalAccountList[0];

                    #region  查找对应的持仓交易账户
                    //查找对应的持仓交易账户
                    int?relationID = capitalAccountType.RelationAccountId;
                    if (!relationID.HasValue)
                    {
                        continue;
                    }

                    int holdAccountTypeID = relationID.Value;
                    where = string.Format("UserID = '{0}' AND AccountTypeLogo= '{1}'", item.UserID, holdAccountTypeID);

                    List <UA_UserAccountAllocationTableInfo> HoldAccountList = dal.GetListArray(where);

                    if (Utils.IsNullOrEmpty(HoldAccountList))
                    {
                        //IsInitializeSuccess = false;
                        continue;
                    }

                    //对应持仓账户类型的只能有一个持仓交易账户
                    UA_UserAccountAllocationTableInfo holdAccount = HoldAccountList[0];
                    #endregion

                    AccountPair accountPair = new AccountPair {
                        CapitalAccount = capitalAccount, HoldAccount = holdAccount
                    };
                    AccountPairList.Add(accountPair);
                }
            }
            catch (Exception ex)
            {
                LogHelper.WriteError("期货盘前检查初始货配对资金账号与持仓账号异常" + ex.Message, ex);
                AccountPairList = null;
            }
            return(AccountPairList);
        }
        /// <summary>
        /// 商品期货强行平仓
        /// Create by:董鹏
        /// Create Date:2010-02-04
        /// </summary>
        /// <param name="orderAccepter">委托接收对象</param>
        /// <param name="holdTable">持仓实体</param>
        /// <param name="price">委托价格</param>
        /// <param name="amount">委托数量</param>
        /// <param name="isExpiredContract">是否是过期的合约需要平仓</param>
        private void CloseCommoditiesContract(OrderAccepter orderAccepter, QH_HoldAccountTableInfo holdTable, float price, float amount, Types.QHForcedCloseType closeType, Entity.Contants.Types.FutureOpenCloseType closeType2)
        {
            if (holdTable == null)
            {
                return;
            }
            if (holdTable.HistoryHoldAmount == 0 && closeType2 == ReckoningCounter.Entity.Contants.Types.FutureOpenCloseType.ClosePosition)
            {
                return;
            }
            if (holdTable.TodayHoldAmount == 0 && closeType2 == ReckoningCounter.Entity.Contants.Types.FutureOpenCloseType.CloseTodayPosition)
            {
                return;
            }

            MercantileFuturesOrderRequest2 request = null;

            request = new MercantileFuturesOrderRequest2();
            string type = "";

            switch (closeType)
            {
            case Types.QHForcedCloseType.Expired:
                // request.IsExpiredContract = true;
                type = "过期合约持仓检查平仓";
                break;

            case Types.QHForcedCloseType.CapitalCheck:
                //request.IsCapitalCheckContract = true;
                type = "资金检查平仓";
                break;

            case Types.QHForcedCloseType.OverHoldLimit:
                //request.IsOverHoldLimitContract = true;
                type = "持仓限制检查平仓";
                break;

            case Types.QHForcedCloseType.NotModMinUnit:
                //request.IsNotModMinUnitContract = true;
                type = "最小交割单位整数倍持仓检查平仓";
                break;
            }

            request.QHForcedCloseType  = closeType; //盘前检查强行平仓类型
            request.IsForcedCloseOrder = true;      //是否盘前检查强行平仓

            //{
            //    request = new MercantileFuturesOrderRequest2 { IsExpiredContract = true, IsCapitalCheckContract = false };
            //}
            //else
            //{
            //    request = new MercantileFuturesOrderRequest2 { IsExpiredContract = false, IsCapitalCheckContract = true };
            //}

            var buySellType = holdTable.BuySellTypeId == (int)Types.TransactionDirection.Buying
                                  ? Types.TransactionDirection.Selling
                                  : Types.TransactionDirection.Buying;

            request.BuySell       = buySellType;
            request.Code          = holdTable.Contract;
            request.FundAccountId = capitalAccount.UserAccountDistributeLogo;
            request.OpenCloseType = closeType2;

            request.OrderAmount = amount;//(float)holdTable.HistoryHoldAmount;

            //和刘丹确认过,不是过期合约平仓或者价格为0时,取当日的涨停价或跌停价报盘,买平用涨停价,卖平用跌停价,add by 董鹏 2010-02-23
            //2010-04-02 和刘丹、苏婷再次讨论,定为先取行情最新价,若取不到在使用涨跌停价 update by 董鹏 2010-04-02
            if (closeType != Types.QHForcedCloseType.Expired || price == 0)
            {
                string errMsg;
                int    errcount = 0;

                //获取行情最新成交价
                MarketDataLevel marketData = null;
                while (marketData == null)
                {
                    marketData = RealTimeMarketUtil.GetInstance().GetLastPriceByCode(holdTable.Contract, (int)Types.BreedClassTypeEnum.CommodityFuture, out errMsg);
                    errcount++;
                    if (errcount > 10)
                    {
                        LogHelper.WriteDebug("期货强行平仓,无法获取到行情最新成交价。CloseCommoditiesContract");
                        break;
                    }
                    if (marketData == null)
                    {
                        Thread.Sleep(10000);
                    }
                }
                if (marketData != null && marketData.LastPrice != 0)
                {
                    price = (float)marketData.LastPrice;
                }
                else
                {
                    //取不到行情成交价,取涨跌停板价
                    HighLowRangeValue hlValue = null;

                    while (hlValue == null)
                    {
                        hlValue = MCService.HLRangeProcessor.GetHighLowRangeValueByCommodityCode(holdTable.Contract, 0);
                        errcount++;
                        if (errcount > 10)
                        {
                            LogHelper.WriteDebug("期货强行平仓,无法获取到涨跌停板价格。CloseCommoditiesContract");
                            return;
                        }
                        if (hlValue == null)
                        {
                            Thread.Sleep(10000);
                        }
                    }
                    price = holdTable.BuySellTypeId == (int)Types.TransactionDirection.Buying
                                      ? (float)hlValue.HighRangeValue
                                      : (float)hlValue.LowRangeValue;
                }
            }
            request.OrderPrice    = price;
            request.OrderUnitType = Types.UnitType.Hand;
            request.OrderWay      = Entity.Contants.Types.OrderPriceType.OPTLimited;

            string format = "FutureDayChecker开盘持仓检查强制平仓[UserAccountDistributeLogo={0},AccountHoldLogoId={1},Code={2}, Price={3}, 平仓类型={4}]-委托信息:" + request;
            string msg    = string.Format(format, holdTable.UserAccountDistributeLogo, holdTable.AccountHoldLogoId, holdTable.Contract, price, type);

            LogHelper.WriteDebug(msg + holdTable);

            UA_UserAccountAllocationTableDal ua_UserAccountAllocationTableDal = new UA_UserAccountAllocationTableDal();
            //设置为其所属的交易员
            var userAccountAllocationTable = ua_UserAccountAllocationTableDal.GetModel(capitalAccount.UserAccountDistributeLogo);

            if (userAccountAllocationTable == null)
            {
                string msg2 = "开盘检查强行平仓失败!无法获取资金账户信息,ID=" + capitalAccount.UserAccountDistributeLogo;
                LogHelper.WriteInfo(msg2);
                return;
            }
            UA_UserBasicInformationTableDal ua_UserBasicInformationTableDal = new UA_UserBasicInformationTableDal();
            var user = ua_UserBasicInformationTableDal.GetModel(userAccountAllocationTable.UserID);

            if (user == null)
            {
                string msg3 = "开盘检查强行平仓失败!无法获取交易员信息,UserID=" + userAccountAllocationTable.UserID;
                LogHelper.WriteInfo(msg3);
                return;
            }

            request.TraderId       = user.UserID;
            request.TraderPassword = user.Password;

            orderAccepter.DoMercantileFuturesOrder(request);
        }
        /// <summary>
        /// 平仓股指期货合约
        /// </summary>
        /// <param name="orderAccepter"></param>
        /// <param name="holdTable">持仓合约</param>
        /// <param name="price">价格</param>
        /// <param name="isExpiredContract">是否是过期的合约需要平仓</param>
        private void CloseStockIndexContract(OrderAccepter orderAccepter, QH_HoldAccountTableInfo holdTable, float price, bool isExpiredContract)
        {
            if (holdTable == null)
            {
                return;
            }

            //if (holdTable.HistoryHoldAmount<0.00m)
            //    return;

            if (holdTable.HistoryHoldAmount == 0)
            {
                return;
            }

            StockIndexFuturesOrderRequest request = null;

            if (isExpiredContract)
            {
                request = new StockIndexFuturesOrderRequest2 {
                    IsForcedCloseOrder = true, QHForcedCloseType = Types.QHForcedCloseType.Expired
                };
            }
            else
            {
                request = new StockIndexFuturesOrderRequest2 {
                    IsForcedCloseOrder = true, QHForcedCloseType = Types.QHForcedCloseType.CapitalCheck
                };
            }

            var buySellType = holdTable.BuySellTypeId == (int)Types.TransactionDirection.Buying
                                  ? Types.TransactionDirection.Selling
                                  : Types.TransactionDirection.Buying;

            request.BuySell       = buySellType;
            request.Code          = holdTable.Contract;
            request.FundAccountId = capitalAccount.UserAccountDistributeLogo;
            request.OpenCloseType = Entity.Contants.Types.FutureOpenCloseType.ClosePosition;

            request.OrderAmount = (float)holdTable.HistoryHoldAmount;

            request.OrderPrice    = price;
            request.OrderUnitType = Types.UnitType.Hand;
            request.OrderWay      = price == 0
                                   ? Entity.Contants.Types.OrderPriceType.OPTMarketPrice
                                   : Entity.Contants.Types.OrderPriceType.OPTLimited;

            string type   = isExpiredContract ? "持仓检查平仓" : "资金检查平仓";
            string format =
                "FutureDayChecker开盘持仓检查强制平仓[UserAccountDistributeLogo={0},AccountHoldLogoId={1},Code={2}, Price={3}, 平仓类型={4}]-委托信息:" +
                request;
            string msg = string.Format(format, holdTable.UserAccountDistributeLogo, holdTable.AccountHoldLogoId,
                                       holdTable.Contract, price, type);

            LogHelper.WriteDebug(msg + holdTable);
            UA_UserAccountAllocationTableDal ua_UserAccountAllocationTableDal = new UA_UserAccountAllocationTableDal();
            //设置为其所属的交易员
            var userAccountAllocationTable =
                ua_UserAccountAllocationTableDal.GetModel(
                    capitalAccount.UserAccountDistributeLogo);

            if (userAccountAllocationTable == null)
            {
                string msg2 = "开盘检查强行平仓失败!无法获取资金账户信息,ID=" + capitalAccount.UserAccountDistributeLogo;
                LogHelper.WriteInfo(msg2);
                return;
            }
            UA_UserBasicInformationTableDal ua_UserBasicInformationTableDal = new UA_UserBasicInformationTableDal();
            var user =
                ua_UserBasicInformationTableDal.GetModel(userAccountAllocationTable.UserID);

            if (user == null)
            {
                string msg3 = "开盘检查强行平仓失败!无法获取交易员信息,UserID=" + userAccountAllocationTable.UserID;
                LogHelper.WriteInfo(msg3);
                return;
            }

            request.TraderId       = user.UserID;
            request.TraderPassword = user.Password;

            orderAccepter.DoStockIndexFuturesOrder(request);
        }
        /// <summary>
        /// 进行持仓检查,对已经过期的合约按昨日结算价进行强制平仓
        /// </summary>
        private void CheckHoldTable()
        {
            //LogHelper.WriteDebug("FutureDayChecker.CheckHoldTable开始检查持仓表");

            OrderAccepter          orderAccepter = OrderAccepterService.Service;
            QH_HoldAccountTableDal dal           = new QH_HoldAccountTableDal();

            string where = string.Format("UserAccountDistributeLogo = '{0}'", holdAccount.UserAccountDistributeLogo);
            List <QH_HoldAccountTableInfo> listCheck = dal.GetListArray(where);

            // DataRepository.QhHoldAccountTableProvider.GetByUserAccountDistributeLogo(
            //     holdAccount.UserAccountDistributeLogo);

            if (Utils.IsNullOrEmpty(listCheck))
            {
                return;
            }

            decimal price = 0;
            List <QH_HoldAccountTableInfo> list = new List <QH_HoldAccountTableInfo>();

            //这里是要分开处理,已经是过期的合约前面就已经强行平仓掉就没有后面的持仓限制和最小单位整数倍的判断
            foreach (var holdTable in listCheck)
            {
                //如果不是交易日,不进行强行平仓 add by 董鹏 2010-05-05
                if (!CommonParaProxy.GetInstance().IsTradeDate(holdTable.Contract))
                {
                    continue;
                }
                if (MCService.IsExpireLastedTradeDate(holdTable.Contract))
                {
                    //在最后交易日 进行平仓
                    //string msg = "";
                    //bool canGetPrice = MCService.GetFutureYesterdayPreSettlementPrice(holdTable.Contract, out price,
                    //                                                                  ref msg);
                    //if (!canGetPrice)
                    //{
                    //    string format = "FutureDayChecker.CheckHoldTable无法获取合约{0}的昨日收盘结算价,错误信息:{1}";
                    //    string msg2 = string.Format(format, holdTable.Contract, msg);
                    //    LogHelper.WriteDebug(msg2);
                    //    continue;
                    //}

                    //每天清算后,持仓均价就是结算价
                    price = holdTable.HoldAveragePrice;

                    #region  账户类型进行商品期货、股指期货平仓 add by 董鹏 2010-02-03
                    UA_UserAccountAllocationTableDal accDal = new UA_UserAccountAllocationTableDal();
                    var acc = accDal.GetModel(holdTable.UserAccountDistributeLogo);
                    if (acc.AccountTypeLogo == (int)Types.AccountType.CommodityFuturesHoldCode)
                    {
                        //此处原来只有HistoryHoldAmount,造成未清算成功的持仓平不掉,因此加上TodayHoldAmount;
                        //而TodayFreezeAmount清算是否成功都没有影响 -- update by 董鹏 2010-03-29
                        //CloseCommoditiesContract(orderAccepter, holdTable, (float)price, (float)(holdTable.HistoryHoldAmount + holdTable.TodayHoldAmount), Types.QHForcedCloseType.Expired);
                        //平历史
                        CloseCommoditiesContract(orderAccepter, holdTable, (float)price, (float)holdTable.HistoryHoldAmount, Types.QHForcedCloseType.Expired, ReckoningCounter.Entity.Contants.Types.FutureOpenCloseType.ClosePosition);
                        //平今
                        CloseCommoditiesContract(orderAccepter, holdTable, (float)price, (float)holdTable.TodayHoldAmount, Types.QHForcedCloseType.Expired, ReckoningCounter.Entity.Contants.Types.FutureOpenCloseType.CloseTodayPosition);
                    }
                    if (acc.AccountTypeLogo == (int)Types.AccountType.StockFuturesHoldCode)
                    {
                        CloseStockIndexContract(orderAccepter, holdTable, (float)price, true);
                    }
                    #endregion
                    //CloseStockIndexContract(orderAccepter, holdTable, (float)price, true);
                }
                else
                {
                    list.Add(holdTable);
                }
            }


            #region 商品期货进行持仓限制、最小交割单位整数倍检验,并平仓超出量 add by 董鹏 2010-02-04
            if (holdAccount.AccountTypeLogo == (int)Types.AccountType.CommodityFuturesHoldCode)
            {
                LogHelper.WriteDebug("---->商品期货持仓限制、最小小交割单位整数倍验证,UserAccountDistributeLogo=" + holdAccount.UserAccountDistributeLogo);
                List <QH_HoldAccountTableInfo> listCloseContract;

                price = 0;

                //记录超出持仓限制的量:<持仓记录主键,超出量>
                Dictionary <int, decimal> dicAmount;
                // 超过最大持仓限制
                listCloseContract = FindWillClosedContractOverMaxHoldLimit(list, out dicAmount);
                foreach (var holdTable in listCloseContract)
                {
                    CloseCommoditiesContract(orderAccepter, holdTable, (float)price, (float)dicAmount[holdTable.AccountHoldLogoId], Types.QHForcedCloseType.OverHoldLimit, ReckoningCounter.Entity.Contants.Types.FutureOpenCloseType.ClosePosition);
                    //进行了持仓限制平仓的不再进行最小交割单位验证,下次持仓检查的时候才进行。
                    list.Remove(holdTable);
                }
                //超出最小交割量整数倍
                listCloseContract = FindWillClosedContractNotModMinUnitLimit(list, out dicAmount);
                foreach (var holdTable in listCloseContract)
                {
                    CloseCommoditiesContract(orderAccepter, holdTable, (float)price, (float)dicAmount[holdTable.AccountHoldLogoId], Types.QHForcedCloseType.NotModMinUnit, ReckoningCounter.Entity.Contants.Types.FutureOpenCloseType.ClosePosition);
                }
            }
            #endregion
            //LogHelper.WriteDebug("FutureDayChecker.CheckHoldTable结束检查持仓表");
        }