public static void DoOpen() { LogHelper.WriteInfo("执行期货开市动作DoOpen"); DoBaseData(); try { //还没到开市,不处理 if (CanDoOpen()) { if (ScheduleManager.CanEndCache()) { MemoryDataManager.End(); } DoFutureDayCheck(); } } catch (Exception ex) { LogHelper.WriteError("期货开市DoOpen处理异常", ex); } //add 2010-03-16 添加对期货的清算判断,如果发现前一日没有清算完成则设置期货是否清算异常系统暂停交易,使用期台不能下单 string errMsg = ""; DateTime ReckoningDateTime; bool isReckoning = false; isReckoning = StatusTableChecker.IsFutureReckoningFaultRecovery(out ReckoningDateTime, out errMsg); if (isReckoning) { IList <CM_BreedClass> list = MCService.CommonPara.GetAllBreedClass(); foreach (var item in list) { if (item.BreedClassTypeID.Value == (int)GTA.VTS.Common.CommonObject.Types.BreedClassTypeEnum.CommodityFuture || item.BreedClassTypeID.Value == (int)GTA.VTS.Common.CommonObject.Types.BreedClassTypeEnum.StockIndexFuture) { ScheduleManager.IsFutureReckoningErrorStopTrade = true; break; } } } //else //{ // ScheduleManager.IsFutureReckoningErrorStopTrade = false; //} //================== ScheduleManager.HasDoneFutureOpen = true; ScheduleManager.HasDoneOpenNotify(); }
/// <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; }
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; } } #region update 2009-12-16 不在这里操作内存资金提交加载,在做完撤单等操作后 //收市处理时在不这里马上提交内存的资金表,因为这里如果提交了,在后面还有要预下单再做撤单 //时就会用到内存表的资金这样就无法同步,所以这里应该在做完撤单操作后延时等待撤单都做完时再提交 //内存表资金 ////过了收市时间,开始处理 ////先关闭内存管理器 //MemoryDataManager.End(); ////add 李健华 2009-12-14 ////可能因为有预委托下单,后面清算时还要用到内存表的作内部撤单操作,所以这里先提交一次再打开 ////内存表管理 //MemoryDataManager.Start(); //===================== #endregion LogHelper.WriteInfo("执行现货收市动作DoClose"); //清算之前把所有柜台缓存的清算撮合ID的数据清除 XHCounterCache.Instance.ResetDictionary(); HKCounterCache.Instance.ResetDictionary(); InternalDoClose(); ScheduleManager.HasDoneStockReckoning = true; ScheduleManager.ReckoningDoneNotify(); }
public static void DoOpen() { LogHelper.WriteInfo("执行现货开市动作DoOpen"); try { //关闭内存表管理器 if (ScheduleManager.CanEndCache()) { MemoryDataManager.End(); } } catch (Exception ex) { LogHelper.WriteError("现货开市DoOpen处理异常", ex); } DoBaseData(); //DoCacheOrder(); ScheduleManager.HasDoneStockOpen = true; ScheduleManager.HasDoneOpenNotify(); }
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(); }