Ejemplo n.º 1
0
        /// <summary>
        /// 创建时序数据
        /// </summary>
        /// <param name="name"></param>
        /// <param name="timeunit"></param>
        /// <param name="forced">true表示如果数据已经有,会删除重建</param>
        /// <returns></returns>
        public ITimeSeries Create(String name, TimeUnit timeunit, bool forced = true)
        {
            //内存中是否已经存在
            if (!timeSerials.ContainsKey(timeunit))
            {
                timeSerials.Add(timeunit, new ConcurrentDictionary <string, object>());
            }
            ConcurrentDictionary <string, object> d = timeSerials[timeunit];

            if (d.ContainsKey(name) && ((IList)d[name]).Count > 0 && !forced)
            {
                return((ITimeSeries)d[name]);
            }
            //查找元信息
            if (name == null || name == "")
            {
                return(null);
            }
            IndicatorMeta meta = metas[name];

            if (meta == null)
            {
                throw new Exception("缺少" + name + "的元数据");
            }

            //文件中是否存在,存在则读取
            ITimeSeries result       = null;
            String      fullFilename = GetFullFileName(meta, timeunit);

            if (File.Exists(fullFilename) && !forced)
            {
                result = (ITimeSeries)meta.IndicatorType.GetConstructor(new Type[] { typeof(String), typeof(TimeUnit) }).Invoke(new Object[] { code, timeunit });
                result.Load(fullFilename);
                d[name] = result;
                return(result);
            }


            //文件中不存在,尝试用小周期创建大周期
            TimeUnit baseTU = timeunit >= TimeUnit.day ? TimeUnit.day : TimeUnit.minute;

            if (baseTU != timeunit)
            {
                ITimeSeries baseTS = Create(name, baseTU, false);//取得小周期
                if (baseTS != null)
                {
                    result = baseTS.Zoomout(timeunit);
                    if (result != null)
                    {
                        d[name] = result;
                        result.Save(this.GetFullFileName(meta, timeunit));
                        return(result);
                    }
                }
            }

            //尝试使用产生器产生
            if (meta.Geneartor == null)
            {
                return(null);
            }

            Properties props = new Properties();

            props.Put("TimeSerialsDataSet", this);
            props.Put("timeunit", timeunit);
            props.Put("name", name);
            props.Put("code", code);
            result = (ITimeSeries)meta.Geneartor(props);
            if (result != null)
            {
                this.Put(result, name);
            }
            return(result);
        }