Пример #1
0
        public static IMarketData Compose(List <IMarketData> source, MarketDataGrade grade)
        {
            if (source.Count == 0)
            {
                return(null);
            }
            var m = new MarketData();
            var s = source.OrderBy(v => v.Time);

            m.Open  = s.FirstOrDefault().Open;
            m.High  = s.FirstOrDefault().High;
            m.Low   = s.FirstOrDefault().Low;
            m.Close = s.LastOrDefault().Close;
            m.Time  = s.LastOrDefault().Time;
            foreach (var v in s)
            {
                if (m.High < v.High)
                {
                    m.High = v.High;
                }
                if (m.Low > v.Low)
                {
                    m.Low = v.Low;
                }
                m.Shares += v.Shares;
                m.Volume += v.Volume;
            }
            m.InstrumentTicker = source.FirstOrDefault().InstrumentTicker;
            m.Grade            = grade;
            return(m);
        }
Пример #2
0
        ISignal IsLongArrange(IInstrument instrument, DateTime start, DateTime end, MarketDataGrade grade)
        {
            var ml = GetMarketData(instrument, start, end, grade);

            if (ml.Count < 10)
            {
                return(null);
            }
            if (ml.Count < 20)
            {
                return(IsLongArrange(ml, 5, 10));
            }
            if (ml.Count < 30)
            {
                var t1 = IsLongArrange(ml, 5, 10);
                var t2 = IsLongArrange(ml, 10, 20);
                if (t1 != null && t2 != null)
                {
                    if (t1.Value > t2.Value)
                    {
                        return(t1);
                    }
                }
                return(null);
            }
            {
                var t1 = IsLongArrange(ml, 5, 10);
                var t2 = IsLongArrange(ml, 10, 20);
                var t3 = IsLongArrange(ml, 20, 30);
                if (t1 != null && t2 != null && t3 != null)//return max distance
                {
                    if (t1.Value > t2.Value)
                    {
                        if (t1.Value > t3.Value)
                        {
                            return(t1);
                        }
                        else
                        {
                            return(t3);
                        }
                    }
                    else
                    {
                        if (t2.Value > t3.Value)
                        {
                            return(t2);
                        }
                        else
                        {
                            return(t3);
                        }
                    }
                    //var t = new List<TimeValueObject>() { t1, t2, t3 }.OrderBy(v=>v.DoubleValue);
                    //return t.LastOrDefault();
                }
                return(null);
            }
        }
Пример #3
0
        ISignal IsCross(IInstrument instrument, DateTime start, DateTime end, MarketDataGrade grade)
        {
            var ml = GetMarketData(instrument, start, end, grade);

            if (ml.Count > BaseUnit)
            {
                return(IsCross(ml));
            }

            return(null);
        }
Пример #4
0
        public static List <DateTime> FindTimeStep(List <IMarketData> source, MarketDataGrade grade)
        {
            var tl = new List <DateTime>();
            var st = source.Min(v => v.Time);
            var et = source.Max(v => v.Time);

            tl.Add(st - TimeSpan.FromDays(1));
            if (grade == MarketDataGrade.Year)
            {
                for (int i = st.Year; i <= et.Year; i++)
                {
                    tl.Add(new DateTime(i, 1, 1));
                }
            }
            if (grade == MarketDataGrade.HalfYear)
            {
                for (int i = st.Year; i <= et.Year; i++)
                {
                    tl.Add(new DateTime(i, 1, 1));
                    tl.Add(new DateTime(i, 7, 1));
                }
            }
            if (grade == MarketDataGrade.Season)
            {
                for (int i = st.Year; i <= et.Year; i++)
                {
                    tl.Add(new DateTime(i, 1, 1));
                    tl.Add(new DateTime(i, 4, 1));
                    tl.Add(new DateTime(i, 7, 1));
                    tl.Add(new DateTime(i, 10, 1));
                }
            }
            if (grade == MarketDataGrade.Month)
            {
                for (int i = st.Year; i <= et.Year; i++)
                {
                    tl.Add(new DateTime(i, 1, 1));
                    tl.Add(new DateTime(i, 2, 1));
                    tl.Add(new DateTime(i, 3, 1));
                    tl.Add(new DateTime(i, 4, 1));
                    tl.Add(new DateTime(i, 5, 1));
                    tl.Add(new DateTime(i, 6, 1));
                    tl.Add(new DateTime(i, 7, 1));
                    tl.Add(new DateTime(i, 8, 1));
                    tl.Add(new DateTime(i, 9, 1));
                    tl.Add(new DateTime(i, 10, 1));
                    tl.Add(new DateTime(i, 11, 1));
                    tl.Add(new DateTime(i, 12, 1));
                }
            }
            if (grade == MarketDataGrade.HalfMonth)
            {
                var start = CommonLib.CommonProc.GetWeekMonday(st);

                for (var i = start; i <= et + TimeSpan.FromDays(20); i = i + TimeSpan.FromDays(14))
                {
                    tl.Add(new DateTime(i.Value.Year, i.Value.Month, i.Value.Day));
                }
            }
            if (grade == MarketDataGrade.Week)
            {
                var start = CommonLib.CommonProc.GetWeekMonday(st);

                for (var i = start; i <= et + TimeSpan.FromDays(8); i = i + TimeSpan.FromDays(7))
                {
                    tl.Add(new DateTime(i.Value.Year, i.Value.Month, i.Value.Day));
                }
            }
            if (grade == MarketDataGrade.ThreeDays)
            {
                for (var i = st.Date; i <= et + TimeSpan.FromDays(3); i = i + TimeSpan.FromDays(3))
                {
                    tl.Add(new DateTime(i.Year, i.Month, i.Day));
                }
            }
            if (grade == MarketDataGrade.Day)
            {
                for (var i = st.Date; i <= et + TimeSpan.FromDays(1); i = i + TimeSpan.FromDays(1))
                {
                    tl.Add(new DateTime(i.Year, i.Month, i.Day));
                }
            }
            if (grade == MarketDataGrade.HalfDay)
            {
                for (var i = st.Date; i <= et + TimeSpan.FromDays(1); i = i + TimeSpan.FromDays(1))
                {
                    tl.Add(new DateTime(i.Year, i.Month, i.Day));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 12, 0, 0));
                }
            }
            if (grade == MarketDataGrade.Hour)
            {
                for (var i = st.Date; i <= et + TimeSpan.FromDays(1); i = i + TimeSpan.FromDays(1))
                {
                    //tl.Add(new DateTime(i.Year, i.Month, i.Day));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 11, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 15, 0, 0));
                }
            }
            if (grade == MarketDataGrade.HalfHour)
            {
                for (var i = st.Date; i <= et + TimeSpan.FromDays(1); i = i + TimeSpan.FromDays(1))
                {
                    //tl.Add(new DateTime(i.Year, i.Month, i.Day));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 11, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 11, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 13, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 15, 0, 0));
                }
            }
            if (grade == MarketDataGrade.FifteenMinutes)
            {
                for (var i = st.Date; i <= et + TimeSpan.FromDays(1); i = i + TimeSpan.FromDays(1))
                {
                    //tl.Add(new DateTime(i.Year, i.Month, i.Day));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 9, 45, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 15, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 10, 45, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 11, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 11, 15, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 11, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 13, 15, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 13, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 13, 45, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 0, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 15, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 30, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 14, 45, 0));
                    tl.Add(new DateTime(i.Year, i.Month, i.Day, 15, 0, 0));
                }
            }
            return(tl);
        }
Пример #5
0
        public static List <IMarketData> SummaryMarketDataList(List <IMarketData> source, MarketDataGrade grade)
        {
            if (source.Count == 0)
            {
                return(source);
            }
            var fm = source.FirstOrDefault();

            if (grade == fm.Grade)
            {
                return(source);
            }
            if (grade < fm.Grade)
            {
                throw new Exception("Con not summary market data from " + fm.Grade.ToString() + " to " + grade.ToString());
            }
            var tl = FindTimeStep(source, grade);
            var l  = new List <IMarketData>();

            for (int i = 0; i < tl.Count - 1; i++)
            {
                if (source.Any(v => v.Time > tl[i] && v.Time <= tl[i + 1]))
                {
                    var m = Compose(source.Where(v => v.Time > tl[i] && v.Time <= tl[i + 1]).ToList(), grade);
                    l.Add(m);
                }
            }
            return(l);
        }
Пример #6
0
        public static DateTime GetNextTime(DateTime time, MarketDataGrade grade)
        {
            if (grade == MarketDataGrade.Year)
            {
                return(new DateTime(time.Year + 1, 1, 1));
            }
            if (grade == MarketDataGrade.HalfYear)
            {
                if (time.Month < 7)
                {
                    return(new DateTime(time.Year, 7, 1));
                }
                return(new DateTime(time.Year + 1, 1, 1));
            }
            if (grade == MarketDataGrade.Season)
            {
                if (time.Month < 4)
                {
                    return(new DateTime(time.Year, 4, 1));
                }
                if (time.Month < 7)
                {
                    return(new DateTime(time.Year, 7, 1));
                }
                if (time.Month < 10)
                {
                    return(new DateTime(time.Year, 10, 1));
                }
                return(new DateTime(time.Year + 1, 1, 1));
            }
            if (grade == MarketDataGrade.Month)
            {
                if (time.Month < 12)
                {
                    return(new DateTime(time.Year, time.Month + 1, 1));
                }
                return(new DateTime(time.Year + 1, 1, 1));
            }
            if (grade == MarketDataGrade.HalfMonth)
            {
                if (time.Day < 16)
                {
                    return(new DateTime(time.Year, time.Month, 16));
                }
                if (time.Month < 12)
                {
                    return(new DateTime(time.Year, time.Month + 1, 1));
                }
                return(new DateTime(time.Year + 1, 1, 1));
            }
            if (grade == MarketDataGrade.Week)
            {
                if (time.DayOfWeek == DayOfWeek.Monday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(7));
                }
                if (time.DayOfWeek == DayOfWeek.Tuesday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(6));
                }
                if (time.DayOfWeek == DayOfWeek.Wednesday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(5));
                }
                if (time.DayOfWeek == DayOfWeek.Thursday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(4));
                }
                if (time.DayOfWeek == DayOfWeek.Friday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(3));
                }
                if (time.DayOfWeek == DayOfWeek.Saturday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(2));
                }
                if (time.DayOfWeek == DayOfWeek.Sunday)
                {
                    return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(1));
                }
            }
            if (grade == MarketDataGrade.ThreeDays)
            {
                return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(3));
            }
            if (grade == MarketDataGrade.Day)
            {
                return(new DateTime(time.Year, time.Month, time.Day) + TimeSpan.FromDays(1));
            }
            if (grade == MarketDataGrade.HalfDay)
            {
                if (time.Hour < 12)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 12, 0, 0));
                }
                var temp = time + TimeSpan.FromDays(1);
                return(new DateTime(temp.Year, temp.Month, temp.Day));
            }
            if (grade == MarketDataGrade.Hour)
            {
                if (time.Hour <= 10 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 31, 0));
                }
                if (time.Hour < 12)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 12, 0, 0));
                }
                if (time.Hour < 14)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 1, 0));
                }
                var temp = time + TimeSpan.FromDays(1);
                return(new DateTime(temp.Year, temp.Month, temp.Day));
            }
            if (grade == MarketDataGrade.HalfHour)
            {
                if (time.Hour < 10 || (time.Hour == 10 && time.Minute == 0))
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 1, 0));
                }
                if (time.Hour == 10 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 31, 0));
                }
                if (time.Hour < 11 || (time.Hour == 11 && time.Minute == 0))
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 11, 1, 0));
                }
                if (time.Hour == 11 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 11, 31, 0));
                }

                if (time.Hour == 13 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 13, 31, 0));
                }
                if (time.Hour < 14 || (time.Hour == 14 && time.Minute == 0))
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 1, 0));
                }
                if (time.Hour == 14 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 31, 0));
                }
                var temp = time + TimeSpan.FromDays(1);
                return(new DateTime(temp.Year, temp.Month, temp.Day));
            }
            if (grade == MarketDataGrade.FifteenMinutes)
            {
                if (time.Hour == 9 && time.Minute <= 45)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 9, 46, 0));
                }
                if (time.Hour < 10 || (time.Hour == 10 && time.Minute == 0))
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 1, 0));
                }
                if (time.Hour == 10 && time.Minute <= 15)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 16, 0));
                }
                if (time.Hour == 10 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 31, 0));
                }
                if (time.Hour == 10 && time.Minute <= 45)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 10, 46, 0));
                }
                if (time.Hour < 11 || (time.Hour == 11 && time.Minute == 0))
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 11, 1, 0));
                }
                if (time.Hour == 11 && time.Minute <= 15)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 11, 16, 0));
                }
                if (time.Hour == 11 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 11, 31, 0));
                }

                if (time.Hour == 13 && time.Minute <= 15)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 13, 16, 0));
                }
                if (time.Hour == 13 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 13, 31, 0));
                }
                if (time.Hour == 13 && time.Minute <= 45)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 13, 46, 0));
                }
                if (time.Hour < 14 || (time.Hour == 14 && time.Minute == 0))
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 1, 0));
                }
                if (time.Hour == 14 && time.Minute <= 15)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 16, 0));
                }
                if (time.Hour == 14 && time.Minute <= 30)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 31, 0));
                }

                if (time.Hour == 14 && time.Minute <= 45)
                {
                    return(new DateTime(time.Year, time.Month, time.Day, 14, 46, 0));
                }
                var temp = time + TimeSpan.FromDays(1);
                return(new DateTime(temp.Year, temp.Month, temp.Day));
            }
            var minmode = time.Minute % 5;
            var t       = time + TimeSpan.FromMinutes(5) - TimeSpan.FromMinutes(minmode);

            return(new DateTime(t.Year, t.Month, t.Day, t.Hour, t.Minute, 0));
        }
Пример #7
0
        public virtual List <IMarketData> GetDataList(List <IInstrument> instrumentList, DateTime startTime, DateTime endTime, MarketDataGrade grade)
        {
            var ml = new List <IMarketData>();

            try
            {
                instrumentList.ForEach(v =>
                {
                    ml.AddRange(GetDataList(v, startTime, endTime, grade));
                });
            }
            catch (Exception ex)
            {
                LogSupport.Error(ex);
            }
            return(ml);
        }
Пример #8
0
        public virtual IMarketData GetFirstData(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade grade)
        {
            var ml = GetDataList(instrument, startTime, endTime, grade);

            if (ml.Count == 0)
            {
                return(null);
            }
            return(ml.OrderBy(v => v.Time).FirstOrDefault());
        }
Пример #9
0
        public void PrepareCache(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade grade)
        {
            var cl = Cache.FirstOrDefault(v => v.Ticker == instrument.Ticker && v.StartTime <= startTime && v.EndTime >= endTime);

            if (cl != null)
            {
                return;
            }
            else
            {
                if (Cache.Count >= CacheSize)
                {
                    Cache.RemoveAt(0);
                }
                var start = startTime;
                var end   = endTime;
                if (CacheStartTime != null)
                {
                    start = CacheStartTime.Value;
                }
                if (CacheEndTime != null)
                {
                    end = CacheEndTime.Value;
                }
                var l = GetSourceDataList(instrument, start, end);

                Cache.Add(new MarketDataCacke()
                {
                    DataList = l, StartTime = start, EndTime = end, Ticker = instrument.Ticker
                });
            }
        }
Пример #10
0
        public List <IMarketData> GetDataList(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade grade)
        {
            var cl = Cache.FirstOrDefault(v => v.Ticker == instrument.Ticker && v.StartTime <= startTime && v.EndTime >= endTime);

            if (cl != null)
            {
                return(MarketData.SummaryMarketDataList(cl.DataList.Where(v => v.Time > startTime && v.Time <= endTime).ToList(), grade));
            }
            else
            {
                if (Cache.Count >= CacheSize)
                {
                    Cache.RemoveAt(0);
                }
                var start = startTime;
                var end   = endTime;
                if (CacheStartTime != null)
                {
                    start = CacheStartTime.Value;
                }
                if (CacheEndTime != null)
                {
                    end = CacheEndTime.Value;
                }
                var l = GetSourceDataList(instrument, start, end);

                Cache.Add(new MarketDataCacke()
                {
                    DataList = l, StartTime = start, EndTime = end, Ticker = instrument.Ticker
                });
                return(MarketData.SummaryMarketDataList(l.Where(v => v.Time > startTime && v.Time <= endTime).ToList(), grade));
            }
        }
Пример #11
0
 public List <IMarketData> GetMarketData(IInstrument instrument, DateTime start, DateTime end, MarketDataGrade grade)
 {
     if (AnalyseDataSource != null)
     {
         return(AnalyseDataSource.GetDataList(instrument, start, end, grade));
     }
     return(null);
 }
Пример #12
0
        public override IMarketData GetFirstData(IInstrument instrument, DateTime startTime, DateTime endTime, MarketDataGrade grade)
        {
            if (instrument == null || string.IsNullOrEmpty(instrument.Ticker))
            {
                return(null);
            }
            if (grade == MarketDataGrade.FiveMinutes)
            {
                try
                {
                    string sqlconnection = "Data Source=LYNX-NOTEBOOK\\SQLEXPRESS;Initial Catalog=MarketData;Integrated Security=True";
                    var    connection    = new SqlConnection(sqlconnection);
                    var    cs            = ConfigurationManager.ConnectionStrings["MarketDataConnectionString"].ConnectionString;
                    var    sql           = "select top 1 * from Table_TradePrice where Time >'" + startTime.ToString() + "' and Time<='" + endTime.ToString() + "' and Ticker='" + instrument.Ticker + "' order by Time";
                    connection.Open();
                    var t = connection.Query(sql);
                    connection.Close();
                    var v = t.FirstOrDefault();
                    if (v != null)
                    {
                        var md = new MarketData();
                        md.Time             = v.Time;
                        md.InstrumentTicker = instrument.Ticker;

                        md.Low    = v.Low;
                        md.Open   = v.Open;
                        md.High   = v.High;
                        md.Close  = v.Close;
                        md.Volume = v.Volume;
                        md.Shares = v.Shares;
                        md.Grade  = MarketDataGrade.FiveMinutes;
                        return(md);
                    }
                    return(null);
                }
                catch (Exception e)
                {
                    LogSupport.Error(e);
                    throw e;
                }
            }
            return(base.GetFirstData(instrument, startTime, endTime, grade));
        }