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