コード例 #1
0
        public override void EndElement(string endElement)
        {
            if ("instrument" == endElement)
            {
                long   id   = GetLongValue(Id, 0L);
                String name = GetStringValue(Name);

                string symbol     = GetStringValue(Symbol);
                string isin       = GetStringValue(UnderlyingIsin);
                string assetClass = GetStringValue(AssetClass);

                UnderlyingInfo underlying = new UnderlyingInfo(symbol, isin, assetClass);

                DateTime         startTime   = GetDateTime(StartTime, DateTime.MinValue);
                DateTime?        expiryTime  = GetDateTime(EndTime);
                TimeSpan         openOffset  = GetTimeSpan(OpeningOffset, TimeSpan.MinValue);
                TimeSpan         closeOffset = GetTimeSpan(ClosingOffset, TimeSpan.MinValue);
                string           timeZone    = GetStringValue(Timezone);
                List <DayOfWeek> daysOfWeek  = GetDaysOfWeek();

                CalendarInfo calendarInfo = new CalendarInfo(startTime, expiryTime, openOffset, closeOffset, timeZone, daysOfWeek);

                decimal marginRate      = GetDecimalValue(Margin, 0);
                decimal maximumPosition = GetDecimalValue(MaximumPositionThreshold, 0);

                RiskInfo riskInfo = new RiskInfo(marginRate, maximumPosition);

                decimal priceIncrement           = GetDecimalValue(PriceIncrement, 0);
                decimal quantityIncrement        = GetDecimalValue(OrderQuantityIncrement, 0);
                decimal volatilityBandPercentage = GetDecimalValue(RetailVolatilityBandPercentage, 0);

                OrderBookInfo orderBookInfo = new OrderBookInfo(priceIncrement, quantityIncrement, volatilityBandPercentage);

                string  currency      = GetStringValue(Currency);
                decimal unitPrice     = GetDecimalValue(UnitPrice, 0);
                string  unitOfMeasure = GetStringValue(ContractUnitMeasure);
                decimal contractSize  = GetDecimalValue(ContractSize, 0);

                ContractInfo contractInfo = new ContractInfo(currency, unitPrice, unitOfMeasure, contractSize);

                decimal minimumCommission               = GetDecimalValue(MinimumCommission, 0);
                decimal?aggressiveCommissionRate        = GetDecimalValue(AggressiveCommisionRate);
                decimal?passiveCommissionRate           = GetDecimalValue(PassiveCommissionRate);
                decimal?aggressiveCommissionPerContract = GetDecimalValue(AggressiveCommissionPerContract);
                decimal?passiveCommissionPerContract    = GetDecimalValue(PassiveCommissionPerContract);
                string  fundingBaseRate            = GetStringValue(FundingBaseRate);
                int     dailyInterestRateBasis     = GetIntValue(DailyInteresetRateBasis, 0);
                decimal?fundingPremiumPercentage   = GetDecimalValue(FundingPremiumPercentage);
                decimal?fundingReductionPercentage = GetDecimalValue(FundingReductionPercentage);
                decimal?longSwapPoints             = GetDecimalValue(LongSwapPoints);
                decimal?shortSwapPoints            = GetDecimalValue(ShortSwapPoints);

                CommercialInfo commercialInfo = new CommercialInfo(minimumCommission, aggressiveCommissionRate, passiveCommissionRate,
                                                                   aggressiveCommissionPerContract, passiveCommissionPerContract,
                                                                   fundingBaseRate, dailyInterestRateBasis,
                                                                   fundingPremiumPercentage, fundingReductionPercentage, longSwapPoints, shortSwapPoints);

                _instruments.Add(new Instrument(id, name, underlying, calendarInfo, riskInfo, orderBookInfo, contractInfo, commercialInfo));
            }
        }
コード例 #2
0
 public IActionResult Create([Bind] RiskInfo objris)
 {
     if (ModelState.IsValid)
     {
         riskDAL.AddRisk(objris);
         return(RedirectToAction("Index"));
     }
     return(View(objris));
 }
コード例 #3
0
 public Instrument(long id, string name, UnderlyingInfo underlying, CalendarInfo calendar, RiskInfo risk, OrderBookInfo orderBook, ContractInfo contract, CommercialInfo commercial)
 {
     this._id         = id;
     this._name       = name;
     this._underlying = underlying;
     this._calendar   = calendar;
     this._risk       = risk;
     this._orderBook  = orderBook;
     this._contract   = contract;
     this._commercial = commercial;
 }
コード例 #4
0
        public IActionResult Edit(int?id, [Bind] RiskInfo objris)
        {
            if (id == null)
            {
                return(NotFound());
            }

            if (ModelState.IsValid)
            {
                riskDAL.UpdateRisk(objris);
                return(RedirectToAction("Index"));
            }
            return(View(riskDAL));
        }
コード例 #5
0
        public IActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(NotFound());
            }
            RiskInfo ris = riskDAL.GetRiskById(id);

            if (ris == null)
            {
                return(NotFound());
            }
            return(View(ris));
        }
コード例 #6
0
ファイル: riskmonitor.cs プロジェクト: fffweb/MoneyFramework
        /// <summary>
        /// 风控检测
        /// 仅针对股票买入和期货开仓进行判断
        /// 新交易影响持仓参数:
        ///     股票:
        ///         可用资金减少
        ///         股票成本增加
        ///         风控冻结资金量增加
        ///     期货:
        ///         期货冻结资金增加
        ///         可用资金减少
        /// </summary>
        /// <param name="alias">用户名</param>
        /// <param name="orderlist">交易列表</param>
        /// <param name="result">结果</param>
        /// <returns>是否通过风控</returns>
        public static bool RiskDetection(string alias, List <TradeOrderStruct> orderlist, out string result)
        {
            result = string.Empty;
            if (alias == null)
            {
                return(false);
            }
            //第一步: 计算新交易引入后对于股票,期货持仓参数的预见性影响
            alias = alias.Trim();

            //风控错误码
            int errCode = 0;

            //默认策略号
            String StrategyId = "000";

            if (orderlist != null && orderlist.Count > 0)
            {
                StrategyId = orderlist[0].belongStrategy;
            }


            //获取真实实时账户信息
            UserInfo user = DBAccessLayer.GetOneUser(alias);

            if (user == null)
            {
                result = "未查到用户:" + alias;
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = 0,
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            //刷新内存中的资金信息
            AccountInfo current_account = accountMonitor.UpdateAccountList(user);

            StockAccountTable stock_account = accountMonitor.GetStockAccount(alias);

            if (stock_account == null)
            {
                result = "stockAccountDictionary中不存在用户:" + alias;
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = 0,
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            FutureAccountTable future_account = accountMonitor.GetFutureAccount(alias);

            if (future_account == null)
            {
                result = "futureAccountDictionary中不存在用户: " + alias;
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = 0,
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            //计划买入股票交易列表
            var Stock_to_buy_var = (from item
                                    in orderlist
                                    where item.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionBuy &&
                                    (item.cSecurityType == "S" || item.cSecurityType == "s")
                                    select item);


            List <TradeOrderStruct> Stock_to_buy = new List <TradeOrderStruct>();

            if (Stock_to_buy_var.Count() != 0)
            {
                Stock_to_buy = Stock_to_buy_var.ToList();
            }

            //计划卖出股票交易列表
            var Stock_to_sell_var = (from item
                                     in orderlist
                                     where item.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionSell &&
                                     (item.cSecurityType == "S" || item.cSecurityType == "s")
                                     select item);

            List <TradeOrderStruct> Stock_to_sell = new List <TradeOrderStruct>();

            if (Stock_to_sell_var.Count() != 0)
            {
                Stock_to_sell = Stock_to_sell_var.ToList();
            }

            //计划开仓期货交易列表
            var Future_to_open_var = (from item
                                      in orderlist
                                      where item.cOffsetFlag == TradeOrientationAndFlag.FutureTradeOffsetOpen &&
                                      (item.cSecurityType == "F" || item.cSecurityType == "f")
                                      select item);

            List <TradeOrderStruct> Future_to_open = new List <TradeOrderStruct>();

            if (Future_to_open_var.Count() != 0)
            {
                Future_to_open = Future_to_open_var.ToList();
            }

            //计划平仓期货交易列表
            var Future_to_close_var = (from item
                                       in orderlist
                                       where item.cOffsetFlag == TradeOrientationAndFlag.FutureTradeOffsetClose &&
                                       (item.cSecurityType == "F" || item.cSecurityType == "f")
                                       select item);

            List <TradeOrderStruct> Future_to_close = new List <TradeOrderStruct>();

            if (Future_to_close_var.Count() != 0)
            {
                Future_to_close = Future_to_close_var.ToList();
            }

            //计算预期购买股票成本
            double stock_etimate_add_cost = 0;

            foreach (TradeOrderStruct order in Stock_to_buy)
            {
                stock_etimate_add_cost += order.dOrderPrice * order.nSecurityAmount;
            }

            //计算预期期货追加保证金
            double future_estimate_add_deposit = 0;

            //计算预期期货对应股票市值变化值
            double future_estimate_market_value = 0;

            foreach (TradeOrderStruct order in Future_to_open)
            {
                future_estimate_add_deposit += (order.nSecurityAmount * order.dOrderPrice * AccountPARA.MarginValue * AccountPARA.Factor(order.cSecurityCode));
                if (order.cTradeDirection == TradeOrientationAndFlag.FutureTradeDirectionBuy)
                {
                    future_estimate_market_value += (order.nSecurityAmount * order.dOrderPrice * AccountPARA.Factor(order.cSecurityCode));
                }
                else if (order.cTradeDirection == TradeOrientationAndFlag.FutureTradeDirectionSell)
                {
                    future_estimate_market_value -= (order.nSecurityAmount * order.dOrderPrice * AccountPARA.Factor(order.cSecurityCode));
                }
            }



            //第二步: 计算修改的资金账户参数是否满足风控指标要求

            //判断卖出/平仓证券是否小于持仓

            #region 黑白名单判断及总股本限制

            //获得白名单
            List <BWNameTable> BWRecords = DBAccessLayer.GetWBNamwList();

            foreach (TradeOrderStruct tos in orderlist)
            {
                BWNameTable BW_record = BWRecords.Find(delegate(BWNameTable item) { return(item.Code.Trim() == tos.cSecurityCode.Trim()); });

                if (BW_record == null)
                {
                    errCode = 4;
                    result  = accountMonitor.GetErrorCode(errCode, tos.cSecurityCode);
                    RiskInfo info = new RiskInfo()
                    {
                        alias       = alias,
                        price       = tos.dOrderPrice,
                        amount      = Convert.ToInt32(tos.nSecurityAmount),
                        err         = result,
                        orientation = tos.cTradeDirection,
                        code        = tos.cSecurityCode.Trim(),
                        strid       = tos.belongStrategy
                    };
                    ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));

                    return(false);
                }

                if (tos.cSecurityType.ToUpper() == "S" && tos.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionBuy)
                {
                    //判断总股本数量和流通股数量限制
                    double buylimit  = Convert.ToDouble(BW_record.PercentageA) * Convert.ToDouble(BW_record.Amount);
                    double buylimit2 = Convert.ToDouble(BW_record.PercentageB) * Convert.ToDouble(BW_record.Value);

                    int entrust_amount = 0;

                    AccountEntrust entrust_record = current_account.entrusts.Find(
                        delegate(AccountEntrust item)
                    {
                        return(item.code == tos.cSecurityCode);
                    }
                        );

                    if (entrust_record != null)
                    {
                        entrust_amount = Convert.ToInt32(entrust_record.dealAmount);
                    }

                    int position_amount = 0;

                    AccountPosition position_record = current_account.positions.Find(
                        delegate(AccountPosition item)
                    {
                        return(item.code == tos.cSecurityCode);
                    }
                        );

                    if (position_record != null)
                    {
                        position_amount = Convert.ToInt32(position_record.amount);
                    }

                    //总股本限制
                    if (tos.nSecurityAmount + entrust_amount + position_amount > buylimit)
                    {
                        errCode = 5;
                        result  = accountMonitor.GetErrorCode(errCode, tos.cSecurityCode);
                        RiskInfo info = new RiskInfo()
                        {
                            alias       = alias,
                            price       = tos.dOrderPrice,
                            amount      = Convert.ToInt32(tos.nSecurityAmount),
                            err         = result,
                            orientation = tos.cTradeDirection,
                            code        = tos.cSecurityCode.Trim(),
                            strid       = tos.belongStrategy
                        };
                        ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                        return(false);
                    }

                    //流通股限制
                    if (tos.nSecurityAmount + entrust_amount + position_amount > buylimit2)
                    {
                        errCode = 5;
                        result  = accountMonitor.GetErrorCode(errCode, tos.cSecurityCode);
                        RiskInfo info = new RiskInfo()
                        {
                            alias       = alias,
                            price       = tos.dOrderPrice,
                            amount      = Convert.ToInt32(tos.nSecurityAmount),
                            err         = result,
                            orientation = tos.cTradeDirection,
                            code        = tos.cSecurityCode.Trim(),
                            strid       = tos.belongStrategy
                        };
                        ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                        return(false);
                    }
                }
            }

            #endregion

            #region 判断卖出/平仓证券是否小于持仓
            foreach (TradeOrderStruct order in orderlist)
            {
                if (order.cSecurityType == "F" || order.cSecurityType == "f")
                {
                    if (order.cOffsetFlag == TradeOrientationAndFlag.FutureTradeOffsetClose)
                    {
                        int position_amount = 0;

                        //期货平仓交易,需要判断对应开仓数量是否满足
                        if (order.cTradeDirection == TradeOrientationAndFlag.FutureTradeDirectionBuy)
                        {
                            //买入平仓,需要判断卖出开仓数量

                            AccountPosition position_record = current_account.positions.Find(
                                delegate(AccountPosition item)
                            {
                                return(item.direction == TradeOrientationAndFlag.FutureTradeDirectionSell && order.cSecurityCode == item.code);
                            }
                                );

                            if (position_record != null)
                            {
                                position_amount = Convert.ToInt32(position_record.amount);
                            }

                            if (order.nSecurityAmount > position_amount)
                            {
                                //买入平仓数量小于卖出仓位,交易被拒绝。
                                errCode = 12;
                                result  = accountMonitor.GetErrorCode(errCode, order.cSecurityCode + "|" + position_amount + "|" + order.cTradeDirection);
                                RiskInfo info = new RiskInfo()
                                {
                                    alias       = alias,
                                    price       = order.dOrderPrice,
                                    amount      = Convert.ToInt32(order.nSecurityAmount),
                                    err         = result,
                                    orientation = order.cTradeDirection,
                                    code        = order.cSecurityCode.Trim(),
                                    strid       = order.belongStrategy
                                };
                                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                                return(false);
                            }
                        }
                        else if (order.cTradeDirection == TradeOrientationAndFlag.FutureTradeDirectionSell)
                        {
                            //卖出平仓,需要判断买入开仓的数量

                            AccountPosition position_record = current_account.positions.Find(
                                delegate(AccountPosition item)
                            {
                                return(item.direction == TradeOrientationAndFlag.FutureTradeDirectionBuy && order.cSecurityCode == item.code);
                            }
                                );

                            if (position_record != null)
                            {
                                position_amount = Convert.ToInt32(position_record.amount);
                            }

                            if (order.nSecurityAmount > position_amount)
                            {
                                //卖出平仓数量小于买入仓位,交易被拒绝。
                                errCode = 12;
                                result  = accountMonitor.GetErrorCode(errCode, order.cSecurityCode + "|" + position_amount + "|" + order.cTradeDirection);
                                RiskInfo info = new RiskInfo()
                                {
                                    alias       = alias,
                                    price       = order.dOrderPrice,
                                    amount      = Convert.ToInt32(order.nSecurityAmount),
                                    err         = result,
                                    orientation = order.cTradeDirection,
                                    code        = order.cSecurityCode.Trim(),
                                    strid       = order.belongStrategy
                                };
                                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                                return(false);
                            }
                        }
                    }
                }
                else if (order.cSecurityType == "S" || order.cSecurityType == "s")
                {
                    if (order.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionSell)
                    {
                        //股票卖出交易,需要判断当前持仓数量是否满足
                        int entrust_amount = 0;

                        AccountEntrust entrust_record = current_account.entrusts.Find(
                            delegate(AccountEntrust item)
                        {
                            return(item.code == order.cSecurityCode && item.direction == TradeOrientationAndFlag.StockTradeDirectionSell);
                        }
                            );

                        if (entrust_record != null)
                        {
                            entrust_amount = Convert.ToInt32(entrust_record.dealAmount);
                        }

                        int position_amount = 0;

                        AccountPosition position_record = current_account.positions.Find(
                            delegate(AccountPosition item)
                        {
                            return(item.code == order.cSecurityCode);
                        }
                            );

                        if (position_record != null)
                        {
                            position_amount = Convert.ToInt32(position_record.amount);
                        }

                        //判断当前持仓和委托+下单卖出总和比较
                        if (order.nSecurityAmount + entrust_amount > position_amount)
                        {
                            errCode = 11;
                            result  = accountMonitor.GetErrorCode(errCode, order.cSecurityCode + "|" + (entrust_amount + position_amount).ToString());
                            RiskInfo info = new RiskInfo()
                            {
                                alias       = alias,
                                price       = order.dOrderPrice,
                                amount      = Convert.ToInt32(order.nSecurityAmount),
                                err         = result,
                                orientation = order.cTradeDirection,
                                code        = order.cSecurityCode.Trim(),
                                strid       = order.belongStrategy
                            };
                            ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                            return(false);
                        }
                    }
                }
            }
            #endregion

            #region 判断买入股票和期货需要资金是否高于当前可用资金

            //预期股票剩余资金
            double stock_balance = Convert.ToDouble(current_account.account) - stock_etimate_add_cost;

            if (stock_balance <= 0)
            {
                errCode = 1;
                result  = accountMonitor.GetErrorCode(errCode, string.Empty);
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = Convert.ToInt32(0),
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            //预期期货可用资金
            double future_balance = Convert.ToDouble(current_account.faccount) - future_estimate_add_deposit;

            if (future_balance <= 0)
            {
                errCode = 2;
                result  = accountMonitor.GetErrorCode(errCode, string.Empty);
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = Convert.ToInt32(0),
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            #endregion

            #region 单一股票占总资产不超过5%

            //总资产
            double totalAccount = Convert.ToDouble(current_account.account) + Convert.ToDouble(current_account.fstockvalue) + Convert.ToDouble(current_account.fvalue);

            foreach (TradeOrderStruct tos in orderlist)
            {
                if (tos.cSecurityType.ToUpper() == "S")
                {
                    if (CheckStockException(tos.cSecurityCode))
                    {
                        continue;
                    }

                    if (tos.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionBuy)
                    {
                        double entrust_value = 0;

                        AccountEntrust entrust_record = current_account.entrusts.Find(
                            delegate(AccountEntrust item)
                        {
                            return(item.code == tos.cSecurityCode);
                        }
                            );

                        if (entrust_record != null)
                        {
                            entrust_value = Convert.ToDouble(entrust_record.dealMoney) * Convert.ToDouble(entrust_record.dealAmount);
                        }

                        double position_value = 0;

                        AccountPosition position_record = current_account.positions.Find(
                            delegate(AccountPosition item)
                        {
                            return(item.code == tos.cSecurityCode);
                        }
                            );

                        if (position_record != null)
                        {
                            position_value = Convert.ToDouble(position_record.price) * Convert.ToDouble(position_record.amount);
                        }

                        if ((tos.nSecurityAmount * tos.dOrderPrice + entrust_value + position_value) / totalAccount > riskPara.PerStockCostPercentage)
                        {
                            errCode = 6;
                            result  = accountMonitor.GetErrorCode(errCode, tos.cSecurityCode);
                            RiskInfo info = new RiskInfo()
                            {
                                alias       = alias,
                                price       = 0,
                                amount      = Convert.ToInt32(0),
                                err         = result,
                                orientation = "0",
                                code        = "000",
                                strid       = StrategyId
                            };
                            ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                            return(false);
                        }
                    }
                }
            }

            #endregion

            #region 股票所占投资总额不超过80%
            //总市值,totalAccount
            //当前股票成本 , current_account.cost + 委托中的买入股票成本
            double estimate_stock_value = Convert.ToDouble(current_account.value);

            foreach (AccountEntrust record in current_account.entrusts)
            {
                if (record.direction == TradeOrientationAndFlag.StockTradeDirectionBuy)
                {
                    estimate_stock_value += Convert.ToDouble(record.dealMoney) * Convert.ToDouble(record.dealAmount);
                }
            }

            foreach (RiskFrozenInfo record in current_account.riskFrozenInfo)
            {
                if (record.Type.ToUpper() == "S" && record.TradeDirection == TradeOrientationAndFlag.StockTradeDirectionBuy)
                {
                    estimate_stock_value += Convert.ToDouble(record.FrozenCost);
                }
            }

            estimate_stock_value += stock_etimate_add_cost;

            if (estimate_stock_value / totalAccount > riskPara.stockRatio)
            {
                errCode = 13;
                result  = accountMonitor.GetErrorCode(errCode, (estimate_stock_value / totalAccount * 100).ToString());
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = Convert.ToInt32(0),
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }
            #endregion

            #region 单日期货交易次数不超过10手

            if (FutureTradeTimes.Keys.Contains(alias))
            {
                if (DateTime.Now.Hour > 16)
                {
                    //下午四点后,默认计数清零
                    FutureTradeTimes[alias] = 0;
                }

                if (DateTime.Now.DayOfWeek == DayOfWeek.Saturday || DateTime.Now.DayOfWeek == DayOfWeek.Sunday)
                {
                    //周末直接清零
                    FutureTradeTimes[alias] = 0;
                }
            }
            else
            {
                FutureTradeTimes.Add(alias, 0);
            }


            int future_trade_hand_count = 0;

            foreach (TradeOrderStruct tos in orderlist)
            {
                if (tos.cSecurityType.ToUpper() == "F" && tos.cOffsetFlag == TradeOrientationAndFlag.FutureTradeOffsetOpen)
                {
                    //只有期货开仓才会计入数量限制,平仓不限
                    future_trade_hand_count += Convert.ToInt32(tos.nSecurityAmount);
                }
            }


            if (FutureTradeTimes[alias] + future_trade_hand_count > 10)
            {
                errCode = 10;
                result  = accountMonitor.GetErrorCode(errCode, string.Empty);
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = Convert.ToInt32(0),
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            #endregion

            #region 期货风险度和敞口比例

            //期货风险度
            double risk_radio = (Convert.ToDouble(current_account.fbond) + future_estimate_add_deposit) / (Convert.ToDouble(current_account.fvalue));

            if (risk_radio >= riskPara.riskLevel)
            {
                errCode = 8;
                result  = accountMonitor.GetErrorCode(errCode, string.Empty);
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = Convert.ToInt32(0),
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }


            #endregion

            #region 监控用户登录判断

            if (!userOper.CheckMonitorUser(CONFIG.GlobalMonitor))
            {
                errCode = 14;
                result  = accountMonitor.GetErrorCode(errCode, string.Empty);
                RiskInfo info = new RiskInfo()
                {
                    alias       = alias,
                    price       = 0,
                    amount      = Convert.ToInt32(0),
                    err         = result,
                    orientation = "0",
                    code        = "000",
                    strid       = StrategyId
                };
                ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                return(false);
            }

            #endregion


            //敞口
            foreach (TradeOrderStruct tos in orderlist)
            {
                //股票卖出和期货平仓交易不计算敞口
                if (tos.cSecurityType.ToUpper() == "S" && tos.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionSell)
                {
                    continue;
                }
                if (tos.cSecurityType.ToUpper() == "F" && tos.cOffsetFlag == TradeOrientationAndFlag.FutureTradeOffsetClose)
                {
                    continue;
                }

                //股票买入和期货开仓需要通过敞口验证
                double changkouRatio = 0;

                if (!((Convert.ToDouble(current_account.value) + stock_etimate_add_cost) == 0))
                {
                    changkouRatio = (Convert.ToDouble(current_account.fstockvalue) + future_estimate_market_value + Convert.ToDouble(current_account.value) + stock_etimate_add_cost) / (Convert.ToDouble(current_account.value) + stock_etimate_add_cost);
                    if (Math.Abs(changkouRatio) > riskPara.changkouRatio)
                    {
                        errCode = 9;
                        result  = accountMonitor.GetErrorCode(errCode, changkouRatio.ToString());
                        RiskInfo info = new RiskInfo()
                        {
                            alias       = alias,
                            price       = 0,
                            amount      = Convert.ToInt32(0),
                            err         = result,
                            orientation = "0",
                            code        = "000",
                            strid       = StrategyId
                        };
                        ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                        //return false;
                    }
                }
                else
                {
                    errCode = 9;
                    result  = accountMonitor.GetErrorCode(errCode, "无穷大");
                    RiskInfo info = new RiskInfo()
                    {
                        alias       = alias,
                        price       = 0,
                        amount      = Convert.ToInt32(0),
                        err         = result,
                        orientation = "0",
                        code        = "000",
                        strid       = StrategyId
                    };
                    ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(info));
                    //return false;
                }
            }

            //第三部: 实际减少股票资金

            foreach (TradeOrderStruct tos in orderlist)
            {
                if (tos.cSecurityType.ToUpper() == "S")
                {
                    if (tos.cTradeDirection == TradeOrientationAndFlag.StockTradeDirectionBuy)
                    {
                        //股票交易买入需要计入风控列表
                        accountMonitor.UpdateRiskFrozonAccount(user.alias, tos.cSecurityCode, Convert.ToInt32(tos.nSecurityAmount), tos.nSecurityAmount
                                                               * tos.dOrderPrice, "S", tos.cTradeDirection);
                    }
                }
                else if (tos.cSecurityType.ToUpper() == "F")
                {
                    if (tos.cOffsetFlag == TradeOrientationAndFlag.FutureTradeOffsetOpen)
                    {
                        //期货交易开仓需要计入风控列表
                        accountMonitor.UpdateRiskFrozonAccount(user.alias, tos.cSecurityCode, Convert.ToInt32(tos.nSecurityAmount), tos.nSecurityAmount * tos.dOrderPrice, "F", tos.cTradeDirection);
                    }
                }
            }

            errCode = 0;

            result = accountMonitor.GetErrorCode(errCode, string.Empty);

            RiskInfo infoSuccess = new RiskInfo()
            {
                alias       = alias,
                price       = 0,
                amount      = Convert.ToInt32(0),
                err         = result,
                orientation = "0",
                code        = "000",
                strid       = StrategyId
            };
            ThreadPool.QueueUserWorkItem(new WaitCallback(DBAccessLayer.AddRiskRecord), (object)(infoSuccess));

            return(true);
        }