Exemplo n.º 1
0
        /// <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"));
                }
            }
        }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        /// <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()));
            }
        }
Exemplo n.º 4
0
        /// <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);
                }
            }
        }
Exemplo n.º 5
0
        /// <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);
            }
        }
Exemplo n.º 6
0
        /// <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);
        }
Exemplo n.º 7
0
        /// <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);
        }