Пример #1
0
        /// <summary>
        /// 用于故障恢复清算
        /// </summary>
        /// <param name="recktime">要清算的日期</param>
        public static void DoFaultRecoveryClose(string recktime)
        {
            //add 2010-03-16
            //2.可以清算时,先初始化所有的今日结算价
            //3.检查当前持仓表中所有持仓合约都能获取得到结算价时再执行清算

            //2.
            MCService.IniFutureTodayPreSettlementPriceRecovery();
            //3.
            QH_HoldAccountTableDal         dal    = new QH_HoldAccountTableDal();
            List <QH_HoldAccountTableInfo> models = dal.GetAllListArray();
            decimal price;

            foreach (var item in models)
            {
                //如果持仓量有就要获取,如果都已经没有了持仓量证明已经清算完毕不再再清算
                if (item.HistoryFreezeAmount + item.HistoryHoldAmount + item.TodayFreezeAmount + item.TodayHoldAmount > 0)
                {
                    if (!MCService.GetFutureTodayPreSettlementPriceByCache(item.Contract, out price))
                    {
                        LogHelper.WriteError("故障恢复期货清算获取今日结算价无法获取:" + item.Contract, new Exception("清算中止"));
                        return;
                    }
                }
            }
            //把是否正在做故障恢复清算状态修改回来为true,正在进行
            ScheduleManager.IsFaultRecoveryFutureReckoning          = true;
            ScheduleManager.CurrentFaultRecoveryFutureReckoningDate = DateTime.Parse(recktime);
            InternalDoClose();

            //现货也设置清算完成,为了后面能提交现货的相关数据内存表中的数据
            ScheduleManager.HasDoneStockReckoning  = true;
            ScheduleManager.HasDoneFutureReckoning = true;

            ScheduleManager.ReckoningDoneNotify();

            //证明已经故障恢复清算已经成功那么更新清算记录表记录
            if (ScheduleManager.IsFutureReckoningErrorStopTrade == false)
            {
                //故障恢复清算完成修改清算日期标志,因为内部之前 的方法直接修改为当前的了,这里要修改回当招提交的数据日期
                recktime = DateTime.Parse(recktime).ToShortDateString() + " " + DateTime.Now.ToString("HH:mm:ss");
                StatusTableChecker.UpdateFutureReckoningDate(recktime, null);
            }
            //清空当前所有的缓存当前清算时添加的缓存数据
            MCService.ClearFuterTodayPreSettlemmentPrice();

            //把是否正在做故障恢复清算状态修改回来为false
            ScheduleManager.IsFaultRecoveryFutureReckoning = false;
        }
Пример #2
0
        public static void DoClose()
        {
            //还没到收市,不处理
            if (DateTime.Now.Hour < ScheduleManager.LastEndTime.Hour)
            {
                return;
            }

            if (DateTime.Now.Hour == ScheduleManager.LastEndTime.Hour)
            {
                if (DateTime.Now.Minute < ScheduleManager.LastEndTime.Minute)
                {
                    return;
                }
            }

            LogHelper.WriteInfo("执行期货收市动作DoClose");

            //===update 李健华  2009-12-14
            //这里已经在现货清算中提交过,也再得新加载过,在清算完成后会统一再提交一次
            //先关闭内存管理器
            // MemoryDataManager.End();
            //==========

            MCService.DoMarketCloseJob();

            //add 2010-03-16
            //1.发现前一日没有清算完成今日也不能清算 (这个不用了,系统自动清算只要把当日或者前一日的清算完成即可,系统只要保证没有清算完成不可下单操作即可)
            //2.可以清算时,先初始化所有的今日结算价
            //3.检查当前持仓表中所有持仓合约都能获取得到结算价时再执行清算
            //===============
            //1.

            string   errMsg = "";
            bool     isReck = false;
            DateTime recktime;

            isReck = StatusTableChecker.IsFutureTodayReckoning(out recktime, out errMsg);
            //if (!isReck)
            //{
            //    LogHelper.WriteError("今日期货清算不能执行清算,时间获取为:" + recktime, new Exception(errMsg));
            //    return;
            //}
            //2.

            //3.
            QH_HoldAccountTableDal         dal    = new QH_HoldAccountTableDal();
            List <QH_HoldAccountTableInfo> models = dal.GetAllListArray();
            decimal price;

            foreach (var item in models)
            {
                //如果持仓量有就要获取,如果都已经没有了持仓量证明已经清算完毕不再再清算
                if (item.HistoryFreezeAmount + item.HistoryHoldAmount + item.TodayFreezeAmount + item.TodayHoldAmount > 0)
                {
                    if (!MCService.GetFutureTodayPreSettlementPriceByCache(item.Contract, out price))
                    {
                        //如果代码还是可以交易的代码则中止清算,已经过期忽略不理,内部清算的时候获取不到会不会修改持仓均价相关的内容
                        if (!MCService.IsExpireLastedTradeDate(item.Contract))
                        {
                            //但当代码当日为非交易日时也可以放过
                            //如果发现前一日没有清算完成今日获取不到价格不能放过
                            if (!isReck || MCService.CommonPara.IsTradeDate(item.Contract, DateTime.Now))
                            {
                                //为了防止每日重启程序时时间已经过了收市时间即到了清算时间所作的每次清算而已经清算成功的再设置为不清算成功
                                //如:20100402的五点时重启程序,这时已经四点半已经清算成功,那些这里再清算而又获取不到行情就会设置错误,而这里应该不设置,放过
                                //因为内部还会检查是否清算成功过
                                if (!StatusTableChecker.HasDoneFutureReckoning(DateTime.Now))
                                {
                                    LogHelper.WriteError("今日期货清算获取今日结算价无法获取:" + item.Contract, new Exception("清算中止"));
                                    //暂停交易
                                    ScheduleManager.IsFutureReckoningErrorStopTrade = true;
                                    return;
                                }
                            }
                            ////如果发现前一日没有清算完成今日获取不到价格不能放过
                            //else if (!isReck)
                            //{
                            //    LogHelper.WriteError("今日期货清算获取今日结算价无法获取:" + item.Contract, new Exception("前一日清算异常,今日清算中止"));
                            //    //暂停交易
                            //    ScheduleManager.IsFutureReckoningErrorStopTrade = true;
                            //    return;

                            //}
                        }
                    }
                }
            }
            //清算之前把所有柜台缓存的清算撮合ID的数据清除
            QHCounterCache.Instance.ResetDictionary();

            InternalDoClose();

            ScheduleManager.HasDoneFutureReckoning = true;
            ScheduleManager.ReckoningDoneNotify();

            ////过了收市时间,开始处理,延时5分钟,等现货做完后再做
            //timer = new Timer();
            //timer.Interval = 1*60*1000;
            //timer.Elapsed += delegate
            //                     {
            //                         timer.Enabled = false;
            //                         LogHelper.WriteInfo("执行期货收市动作DoClose");
            //                         InternalDoClose();
            //                         InternalDoClose();
            //                         InternalDoClose();
            //                     };
            //timer.Enabled = true;
            //期货清算完成后把资金管理的相关账号清除,释放内存
            AccountManager.Instance.Reset();
        }
Пример #3
0
        /// <summary>
        /// 获取全部持仓
        /// </summary>
        /// <returns></returns>
        public List <QH_HoldAccountTableInfo> GetAllBaseTable()
        {
            QH_HoldAccountTableDal dal = new QH_HoldAccountTableDal();

            return(dal.GetAllListArray());
        }