示例#1
0
        /// <summary>
        /// 期货盘后清算
        /// </summary>
        public static bool DoReckoning()
        {
            if (StatusTableChecker.HasDoneFutureReckoning(DateTime.Now))
            {
                return(true);
            }

            LogHelper.WriteInfo("------------开始期货收市处理-DoReckoning[期货盘后清算]");

            bool result = false;

            try
            {
                result = ReckoningService.ProcessFuture();
                if (!result)
                {
                    LogHelper.WriteInfo("***期货收市处理-DoReckoning[期货盘后清算]第1次失败!进行第2次处理");
                    result = ReckoningService.ProcessFuture();
                }

                if (!result)
                {
                    LogHelper.WriteInfo("***期货收市处理-DoReckoning[期货盘后清算]第2次失败!进行第3次处理");
                    result = ReckoningService.ProcessFuture();
                }

                if (!result)
                {
                    LogHelper.WriteInfo("***期货收市处理-DoReckoning[期货盘后清算]第3次失败!!退出");
                }
                else
                {
                    LogHelper.WriteInfo("------------完成期货收市处理-DoReckoning[期货盘后清算]");
                }

                LogHelper.WriteInfo("------------完成期货收市处理-DoReckoning[期货盘后清算]");
            }
            catch (Exception ex)
            {
                LogHelper.WriteError(ex.ToString(), ex);
                LogHelper.WriteInfo("------------期货收市处理失败-DoReckoning[期货盘后清算]");
            }

            return(result);
        }
示例#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();
        }