/// <summary> /// 获取交易日(临时做法周五不适用)。 /// </summary> /// <returns></returns> private string GetTradeDayPath() { TradeCalendar tradeCalendar = m_tradeCalendar.GetTradeCalendar(DateTime.Today); if (tradeCalendar == null) { string text = string.Format("未能找到{0:yyyy-MM-dd}交易日历", DateTime.Today); m_eventLogger.WriteError(text); USeNotifyEventArgs arg = new USeNotifyEventArgs(USeNotifyLevel.Error, text); SafeRaiseNotifyEvent(this, arg); return(DateTime.Today.ToString("yyyyMMdd")); } else { if (tradeCalendar.IsTradeDay) { if (DateTime.Now.TimeOfDay > new TimeSpan(20, 0, 0)) { return(tradeCalendar.NextTradeDay.ToString("yyyyMMdd")); } else { return(DateTime.Today.ToString("yyyyMMdd")); } } else { return(tradeCalendar.NextTradeDay.ToString("yyyyMMdd")); } } }
/// <summary> /// 加载交易日历。 /// </summary> private void LoadTradeCalendar() { try { string strSel = string.Format(@"select * from {0}.trade_calendar where today >= '{1}' order by today limit 0,15 ;", m_alphaDBName, DateTime.Today.ToString("yyyy-MM-dd")); DataTable table = MySQLDriver.GetTableFromDB(m_dbConnStr, strSel); List <TradeCalendar> calendarList = new List <TradeCalendar>(); foreach (DataRow row in table.Rows) { TradeCalendar calendar = new TradeCalendar() { Today = Convert.ToDateTime(row["today"]), IsTradeDay = Convert.ToInt32(row["is_trading_day"]) == 1, PreTradeDay = Convert.ToDateTime(row["pre_trade_day"]), NextTradeDay = Convert.ToDateTime(row["next_trade_day"]) }; calendarList.Add(calendar); } m_tradeCalendarList = calendarList; } catch (Exception ex) { throw new Exception("加载交易日历失败," + ex.Message); } }
/// <summary> /// 加载交易日历。 /// </summary> /// <returns></returns> private TradeCalendar GetTradeCalendar() { string strSel = string.Format(@"select * from {0}.trade_calendar where today = '{1:yyyy-MM-dd}';", m_alphaDBName, DateTime.Today); DataTable table = new DataTable(); using (MySqlConnection connection = new MySqlConnection(m_dbConnStr)) { MySqlDataAdapter adapter = new MySqlDataAdapter(strSel, connection); adapter.Fill(table); adapter.Dispose(); } if (table != null && table.Rows.Count > 0) { Debug.Assert(table.Rows.Count == 1); DataRow row = table.Rows[0]; TradeCalendar calendar = new TradeCalendar() { Today = Convert.ToDateTime(row["today"]), IsTradeDay = Convert.ToBoolean(row["is_trading_day"]), PreTradeDay = Convert.ToDateTime(row["pre_trade_day"]), NextTradeDay = Convert.ToDateTime(row["next_trade_day"]) }; return(calendar); } else { throw new Exception(string.Format("未找到[{0}]交易日历", DateTime.Today.ToDate())); } }
/// <summary> /// 初始化。 /// </summary> public void Initialize(DateTime?beginDate = null, DateTime?endDate = null) { m_tradingDateDic.Clear(); StringBuilder sbCmdText = new StringBuilder(); sbCmdText.Append(string.Format("select * from {0}.trade_calendar", m_alphaDBName)); if (beginDate.HasValue || endDate.HasValue) { sbCmdText.Append(" where"); bool flag = false; if (beginDate.HasValue) { if (flag) { sbCmdText.Append(" and"); } sbCmdText.Append(string.Format(" (today >= '{0:yyyy-MM-dd}')", beginDate.Value)); flag = true; } if (endDate.HasValue) { if (flag) { sbCmdText.Append(" and"); } sbCmdText.Append(string.Format(" (today <= '{0:yyyy-MM-dd}')", endDate.Value)); flag = true; } } sbCmdText.Append(" order by today;"); DataTable table = MySQLDriver.GetTableFromDB(m_dbConnStr, sbCmdText.ToString()); if (table != null && table.Rows.Count > 0) { foreach (DataRow row in table.Rows) { TradeCalendar calendar = new TradeCalendar() { IsTradeDay = Convert.ToBoolean(row["is_trading_day"]), NextTradeDay = Convert.ToDateTime(row["next_trade_day"]), PreTradeDay = Convert.ToDateTime(row["pre_trade_day"]), Today = Convert.ToDateTime(row["today"]) }; m_tradingDateDic.Add(calendar.Today, calendar); } } }
/// <summary> /// 加载主力合约信息。 /// </summary> private void LoadMainContract() { try { TradeCalendar tradeCalendar = GetTradeCalendar(); DateTime tradeDay = DateTime.Today; //[yangming]强制设定17点为一天的分隔点,后续在完善 if (DateTime.Now.TimeOfDay > new TimeSpan(17, 0, 0)) { tradeDay = tradeCalendar.NextTradeDay; } string strSel = string.Format(@"select * from {0}.main_contract where settlement_date = '{1:yyyy-MM-dd}' and exchange in ({2});", m_alphaDBName, tradeDay, USeTraderProtocol.GetInternalFutureMarketSqlString()); DataTable table = new DataTable(); using (MySqlConnection connection = new MySqlConnection(m_dbConnStr)) { MySqlDataAdapter adapter = new MySqlDataAdapter(strSel, connection); adapter.Fill(table); adapter.Dispose(); } Dictionary <string, USeInstrument> mainContractDic = new Dictionary <string, USeInstrument>(); foreach (DataRow row in table.Rows) { string varieties = row["varieties"].ToString(); string mainContractCode = row["main_contract"].ToString(); USeMarket exchange = (USeMarket)Enum.Parse(typeof(USeMarket), row["exchange"].ToString()); if (string.IsNullOrEmpty(mainContractCode) == false) { USeInstrument mainContract = new USeInstrument(mainContractCode, mainContractCode, exchange); mainContractDic.Add(varieties, mainContract); } } m_mainContractDic = mainContractDic; } catch (Exception ex) { throw new Exception("加载主力合约信息失败," + ex.Message); } }
/// <summary> /// 计算指定日主力合约。 /// </summary> /// <param name="settlementDate"></param> /// <returns></returns> private bool CalculateMainContract(DateTime settlementDate, List <ErrorVarieties> errorList) { string text = string.Empty; TradeCalendar tradeCalendar = m_tradingDateManager.GetTradeCalendar(settlementDate); if (tradeCalendar.IsTradeDay == false) { text = string.Format("{0:yyyy-MM-dd}为非交易日,无需计算", settlementDate); USeConsole.WriteLine(text); return(true); } //[yangming]历史数据未维护暂不校验 //if (CheckBaseDataIsReady(settlementDate) == false) //{ // text = string.Format("{0:yyyy-MM-dd}结算数据未就绪,无法计算", settlementDate); // m_logger.WriteWarning(text); // USeConsole.WriteLine(text); // errorList.Add(new ErrorVarieties() { // Varieties = "All", // SettlementDate = settlementDate, // ErrorMessage = text // }); // return false; //} Debug.Assert(m_varietiesList != null && m_varietiesList.Count > 0); foreach (USeProduct varieties in m_varietiesList) { //if (varieties.ProductCode != "CF") continue; try { string mainContract = GetMaxVolumeInstrument(varieties, settlementDate); //mainContract = "CF709"; List <string> hisMainContractList = GetHistoryMainContract(varieties, settlementDate); if (hisMainContractList != null && hisMainContractList.Count > 0) { string lastMainContract = hisMainContractList[0]; if (mainContract != lastMainContract) { //主力合约不同于昨日,且曾经为主力合约,则主力合约不切换 if (hisMainContractList.Contains(mainContract)) { mainContract = lastMainContract; } } } SaveMainContract(varieties, tradeCalendar.NextTradeDay, mainContract); text = string.Format("{0}@{1:yyyy-MM-dd}主力合约计算完成,主力合约:{2}", varieties.ProductCode, settlementDate, mainContract); m_logger.WriteInformation(text); USeConsole.WriteLine(text); } catch (Exception ex) { text = string.Format("{0}@{1:yyyy-MM-dd}主力合约计算失败,{2}", varieties.ProductCode, settlementDate, ex.Message); m_logger.WriteInformation(text); USeConsole.WriteLine(text); errorList.Add(new ErrorVarieties() { Varieties = varieties.ProductCode, SettlementDate = settlementDate, ErrorMessage = ex.Message }); } } return(true); }
/// <summary> /// 运行。 /// </summary> public int Start() { try { m_serverLogger = AppLogger.InitInstance(); } catch (Exception ex) { throw new ApplicationException("Initialize applogger failed," + ex.Message); } m_serverLogger.LineFeed(); string message = string.Empty; TradingDaySection config = ConfigurationManager.GetSection("TradingDayManager") as TradingDaySection; if (config == null) { message = "Not found [TradingDayManager] config."; WriteConsoleLog(message); m_serverLogger.WriteError(message); return(-1); } try { m_dbConn = ConfigurationManager.ConnectionStrings["KLineDB"].ConnectionString; if (string.IsNullOrEmpty(m_dbConn)) { throw new ApplicationException("KLineDB connection string is null"); } } catch (Exception ex) { message = "Read db connection string failed," + ex.Message; WriteConsoleLog(message); m_serverLogger.WriteError(message); return(-1); } message = "Begin process trading day."; WriteConsoleLog(message); m_serverLogger.WriteInformation(message); DateTime startDate; DateTime endDate; startDate = config.BeginDay; endDate = config.EndDay; List <string> commands = new List <string>(); DateTime currDate = startDate; List <TradeCalendar> calendarList = new List <TradeCalendar>(); while (currDate <= endDate) { bool isTradingDay = false; switch (currDate.DayOfWeek) { case DayOfWeek.Monday: case DayOfWeek.Tuesday: case DayOfWeek.Wednesday: case DayOfWeek.Thursday: case DayOfWeek.Friday: isTradingDay = !IsHoliday(config, currDate); break; default: isTradingDay = false; break; } TradeCalendar calendar = new TradeCalendar() { Today = currDate, IsTradeDay = isTradingDay, PreTradeDay = DateTime.MinValue, NextTradeDay = DateTime.MinValue }; calendarList.Add(calendar); currDate = currDate.AddDays(1); } for (int i = 0; i < calendarList.Count; i++) { TradeCalendar calendar = calendarList[i]; //补前一交易日 for (int j = i - 1; j >= 0; j--) { if (calendarList[j].IsTradeDay) { calendar.PreTradeDay = calendarList[j].Today; break; } } if (calendar.PreTradeDay == DateTime.MinValue) { calendar.PreTradeDay = config.BeginDayPreTradeDay; } //补下一交易日 for (int j = i + 1; j < calendarList.Count; j++) { if (calendarList[j].IsTradeDay) { calendar.NextTradeDay = calendarList[j].Today; break; } } if (calendar.NextTradeDay == DateTime.MinValue) { calendar.NextTradeDay = config.EndDayNextTradeDay; } } try { SaveToMySqlDB(calendarList, config.BeginDay, config.EndDay); } catch (Exception ex) { message = string.Format("Save data to db failed,Error:{0}.", ex.Message); WriteConsoleLog(message); m_serverLogger.WriteError(message); return(-2); } message = "End process trading day."; WriteConsoleLog(message); m_serverLogger.WriteInformation(message); return(0); }