/// <summary>按时间频率修正时间 /// </summary> /// <param name="dtBase"></param> /// <param name="timeFrequency"></param> /// <returns></returns> public static DateTime CheckTime(DateTime dtBase, typeTimeFrequency timeFrequency, bool bFirst = true) { DateTime dtTime = dtBase; switch (timeFrequency) { case typeTimeFrequency.day: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, 0, 0, 0); break; case typeTimeFrequency.m1: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, dtBase.Minute, 0); break; case typeTimeFrequency.m5: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, (int)Math.Floor(dtBase.Minute / 5.0) * 5, 0); break; case typeTimeFrequency.m10: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, (int)Math.Floor(dtBase.Minute / 10.0) * 10, 0); break; case typeTimeFrequency.m15: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, (int)Math.Floor(dtBase.Minute / 15.0) * 15, 0); break; case typeTimeFrequency.m30: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, (int)Math.Floor(dtBase.Minute / 30.0) * 30, 0); break; case typeTimeFrequency.m60: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, 0, 0); break; case typeTimeFrequency.m120: dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, 0, 0); break; //case typeTimeFrequency.Week: // dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, 0, 0, 0); // break; //case typeTimeFrequency.Second_30: // dtTime = new DateTime(dtBase.Year, dtBase.Month, dtBase.Day, dtBase.Hour, dtBase.Minute, (int)Math.Floor(dtBase.Second / 30.0) * 30); // break; default: break; } //向后修正 if (!bFirst) { dtTime = dtTime.AddSeconds((int)timeFrequency.Get_Value()); } return(dtTime); }
DateTime _dtDataNow; //当前数据时间步 public DataCache_Set(string tagName, DateTime dtBase, typeTimeFrequency typeTimeFrequency, int cacheNums, IData_Factor infoFactor, IDataCache_Set srcDataCache_Set = null) : base(tagName) { if (tagName == "") { tagName = infoFactor.ID; } _id = tagName; _Info_Factor = infoFactor; _tagName = tagName; _Time_Frequency = typeTimeFrequency; _sumStep = cacheNums; _dtStep = (int)_Time_Frequency.Get_Value(); _dtBase = dtBase; _Parent = srcDataCache_Set; this.InitTime(dtBase, typeTimeFrequency); }
/// <summary>查询行情(历史) /// </summary> /// <param name="endTime">结束时间</param> /// <param name="quoteBars">标的行情数</param> /// <param name="quoteTime">行情时间类型</param> /// <param name="autoUpdate">是否自动更新本地库表</param> /// <returns></returns> public List <Data_Quote> Query(DateTime endTime, int quoteBars = 1, typeTimeFrequency quoteTime = typeTimeFrequency.day, bool autoUpdate = true) { //修正时间 if (endTime == DateTime.MinValue) { endTime = DateTime.Now; } //自动更新修正数据 if (autoUpdate) { if (!this.Query_Check(endTime.AddSeconds(-quoteBars * (int)quoteTime.Get_Value()), endTime, quoteBars, quoteTime, true)) { return(null); } } //查询库表 List <Data_Quote> lstQuote = _dtQuote.FindAll(e => e.DateTime <= endTime && e.QuoteTimeType == quoteTime && e.IsDel == false).OrderByDescending(t => t.DateTime).Take(quoteBars).ToList(); return(lstQuote); }
/// <summary>查询历史行情 (含自算实时-当未过时间标识时) /// </summary> /// <param name="pStockInfo">标的信息</param> /// <param name="startTime">开始时间</param> /// <param name="endTime">结束时间</param> /// <param name="quoteTime">时间类型</param> /// <param name="quoteBase">基础行情数据</param> /// <returns></returns> protected internal Data_Quote Query(StockInfo pStockInfo, DateTime endTime, typeTimeFrequency quoteTime = typeTimeFrequency.m5, Data_Quote quoteBase = null, bool autoStatics = false) { if (pStockInfo == null) { return(null); } //校正时间 Data_Quote pQuote = null; DateTime dtEnd = zxcTimeHelper.CheckTime(endTime, quoteTime, true); if (DateTime.Now > dtEnd) { pQuote = QuoteQuery._Query.Query(pStockInfo.StockID_Tag, dtEnd, 1, quoteTime, true).FirstOrDefault(); if (pQuote != null && pQuote.DateTime == dtEnd) { if (pQuote.GetStockInfo() == null) { pQuote.SetStockInfo(pStockInfo); } //修正开盘值 if (pQuote.Price_Per == 0 && double.IsInfinity(pQuote.Value_RF)) { Data_Quote pQuote_Day = QuoteQuery._Query.Query(pStockInfo.StockID_Tag, dtEnd, 1, typeTimeFrequency.day, true).FirstOrDefault(); if (pQuote_Day != null) { pQuote.Init_Price_Base(pQuote_Day.Price_Per); } } return(pQuote); } } if (!autoStatics) { return(null); } //获取最数据,自行计算 if ((int)quoteTime < 4) { return(null); } int nCount = (int)quoteTime.Get_Value() / 60; List <Data_Quote> lstQuotes = QuoteQuery._Query.Query(pStockInfo.StockID_Tag, dtEnd, nCount, typeTimeFrequency.m1, true); //统计最大最小 DataStatistics pStatistics = new DataStatistics(); pStatistics.Init(lstQuotes[0].Price_Close, lstQuotes[0].DateTime); foreach (var item in lstQuotes) { pStatistics.Statistics(item.Price_High, item.DateTime); pStatistics.Statistics(item.Price_Low, item.DateTime); pStatistics.Statistics(item.Price_Close, item.DateTime); } if (quoteBase != null) { pStatistics.Statistics(quoteBase.Price_High, quoteBase.DateTime); pStatistics.Statistics(quoteBase.Price_Low, quoteBase.DateTime); pStatistics.Statistics(quoteBase.Price_Close, quoteBase.DateTime); } //实例新数据 Data_Quote pQuote_New = new Data_Quote(pStockInfo) { Price_Close = pStatistics.Value_Original, Price_High = pStatistics.Max_Original, Price_Low = pStatistics.Min_Original, QuotePlat = typeQuotePlat.none, QuoteTimeType = quoteTime, DateTime = dtEnd, IsDel = true }; return(pQuote_New); }