/// <summary> /// /// </summary> /// <param name="timeGetter"></param> /// <param name="time"></param> /// <param name="startIndex"></param> /// <param name="endIndex"></param> /// <param name="findBackward"></param> /// <param name="indexIfRepeat"></param> /// <returns></returns> private int IndexOf(TimeGetter timeGetter, double time, int startIndex, int endIndex, bool findBackward, int indexIfRepeat) { if (findBackward && time > timeGetter.GetTime(timeGetter.Count - 1)) { return(timeGetter.Count - 1); } if (!findBackward && time < timeGetter.GetTime(0)) { return(0); } if (endIndex - startIndex <= 1) { double startTime = timeGetter.GetTime(startIndex); if (startTime == time) { return(FindRepeatIndex(timeGetter, startIndex, findBackward, indexIfRepeat)); } if (time < startTime) { return(-1); } double endTime = timeGetter.GetTime(endIndex); if (endTime == time) { return(FindRepeatIndex(timeGetter, endIndex, findBackward, indexIfRepeat)); } if (time > endTime) { return(-1); } return(findBackward ? startIndex : endIndex); //if (findBackward) // return FindRepeatIndex(timeGetter, startIndex, findBackward, indexIfRepeat); //return FindRepeatIndex(timeGetter, endIndex, findBackward, indexIfRepeat); } int currentIndex = (endIndex + startIndex) / 2; double currentTime = timeGetter.GetTime(currentIndex); if (currentTime == time) { return(FindRepeatIndex(timeGetter, currentIndex, findBackward, indexIfRepeat)); } if (currentTime > time) { return(IndexOf(timeGetter, time, startIndex, currentIndex, findBackward, indexIfRepeat)); } else { return(IndexOf(timeGetter, time, currentIndex, endIndex, findBackward, indexIfRepeat)); } }
private int FindEndRepeatIndex(TimeGetter timeGetter, int index, bool findBackward) { double time = timeGetter.GetTime(index); double currentTime = time; while (time == currentTime) { index++; if (index >= timeGetter.Count) { return(index - 1); } currentTime = timeGetter.GetTime(index); } return(index - 1); }
private int FindFirstRepeatIndex(TimeGetter timeGetter, int index, bool findBackward) { double time = timeGetter.GetTime(index); double currentTime = time; while (time == currentTime) { index--; if (index < 0) { return(0); } currentTime = timeGetter.GetTime(index); } return(index + 1); }
/// <summary> /// 返回一个整型数组的list /// 整型数组第一项是日期,第二项是index /// </summary> /// <param name="timeGetter"></param> /// <returns></returns> public static List <SplitterResult> Split(TimeGetter timeGetter, ITradingTimeReader_Code tradingSessionReader) { List <SplitterResult> indeies = new List <SplitterResult>(500); double time = timeGetter.GetTime(0); int date = tradingSessionReader.GetTradingDay(time); indeies.Add(new SplitterResult(date, 0)); for (int index = 1; index < timeGetter.Count; index++) { time = timeGetter.GetTime(index); if (tradingSessionReader.IsStartTime(time)) { date = tradingSessionReader.GetTradingDay(time); indeies.Add(new SplitterResult(date, index)); } } return(indeies); }
/// <summary> /// /// </summary> /// <param name="timeGetter"></param> /// <param name="time"></param> /// <param name="findBackward"></param> /// <param name="indexIfRepeat"></param> /// <returns></returns> public int IndexOf(TimeGetter timeGetter, double time, bool findBackward, int indexIfRepeat) { int startIndex = 0; int endIndex = timeGetter.Count - 1; double ctime = timeGetter.GetTime(startIndex); if (time < ctime) { return(-1); } return(IndexOf(timeGetter, time, 0, endIndex, findBackward, indexIfRepeat)); }
/// <summary> /// 返回一个整型数组的list /// 整型数组第一项是日期,第二项是index /// </summary> /// <param name="timeGetter"></param> /// <returns></returns> public static List <SplitterResult> Split(TimeGetter timeGetter) { double lastTime = timeGetter.GetTime(0); if (timeGetter.Count <= 1) { List <SplitterResult> results = new List <SplitterResult>(1); results.Add(new SplitterResult((int)lastTime, 0)); return(results); } double time = timeGetter.GetTime(1); //算法 List <SplitterResult> indeies = new List <SplitterResult>(500); int len = timeGetter.Count; int currentIndex = 0; bool hasNight = IsNight(timeGetter.GetTime(0)); bool overNight = false; for (int index = 1; index < len; index++) { time = timeGetter.GetTime(index); int date = (int)time; int lastDate = (int)lastTime; /* * 四种情况: * 1.无夜盘,直接生成即可:如20100105090000、... * 2.有夜盘,但夜盘不过夜:如20160329210000、...、20160329233000、...、20160330090000 * 3.有夜盘,要过夜,不是周末:如20150324210000、...、20150325023000、...、20150325090000 * 4.有夜盘,要过夜,而且是周末:如20141226210000、...、20141227023000、...、20141229090000 */ /* * 规则: * 1.夜盘开始,一定是新的一天开始 * 2. */ //夜盘开始,则一定是新的一天开始 if (IsNightStart(time, lastTime)) { indeies.Add(new SplitterResult((int)lastTime, currentIndex)); overNight = false; currentIndex = index; hasNight = true; } else if (hasNight) { if (date != lastDate) { overNight = true; } //对于夜盘来说,如果到了第二天,而且时间大于6点,则说明夜盘结束了 if (overNight && (time - (int)time) > 0.06) { hasNight = false; } } //只要过了夜都算第二天的 else if (date != lastDate) { indeies.Add(new SplitterResult((int)lastTime, currentIndex)); currentIndex = index; overNight = false; } lastTime = time; } //如果最后一个时间是晚上 int endDate = (int)lastTime; if (IsNight(lastTime)) { endDate += 1; } indeies.Add(new SplitterResult(endDate, currentIndex)); return(indeies); }