/// <summary> /// 保存数据 /// </summary> /// <param name="dataname"></param> /// <param name="tu"></param> public void Save(String dataname, TimeUnit tu) { if (dataname == null || dataname == "") { return; } //内存中是否已经存在 if (!timeSerials.ContainsKey(tu)) { timeSerials.Add(tu, new ConcurrentDictionary <string, object>()); } ConcurrentDictionary <string, object> d = timeSerials[tu]; if (!d.ContainsKey(dataname)) { return; } IndicatorMeta meta = metas[dataname]; if (meta == null) { throw new Exception("缺少" + dataname + "的元数据"); } ((TimeSeries <ITimeSeriesItem>)d[dataname]).Save(this.GetFullFileName(meta, tu)); }
/// <summary> /// 全文件名 /// </summary> /// <param name="meta"></param> /// <param name="timeunit"></param> /// <returns></returns> private String GetFullFileName(IndicatorMeta meta, TimeUnit timeunit) { if (!datapath.EndsWith("\\")) { datapath += "\\"; } return(datapath + meta.Path + "\\" + getFileName(meta.NameInfo.Name, timeunit)); }
/// <summary> /// /// </summary> /// <param name="name"></param> /// <param name="tu"></param> /// <returns></returns> public ITimeSeries this[String name, TimeUnit tu] { get { IndicatorMeta meta = metas[name]; if (meta == null) { return(null); } return((ITimeSeries)this.GetType().GetMethod("CreateOrLoad").MakeGenericMethod(new Type[] { meta.IndicatorType }).Invoke(this, new Object[] { name, tu })); } set { this.Put(value, name); } }
/// <summary> /// 注册 /// </summary> /// <param name="meta"></param> public void Registe(IndicatorMeta meta) { if (meta == null) { return; } int index = elements.IndexOf(elements.FirstOrDefault(x => x.NameInfo.HasName(meta.NameInfo.Name))); if (index < 0) { elements.Add(meta); } else { elements[index] = meta; } }
/// <summary> /// 记录数据 /// </summary> /// <param name="ts"></param> /// <param name="name"></param> public void Put(ITimeSeries ts, String name) { TimeUnit tu = ts.TimeUnit; if (!this.timeSerials.ContainsKey(tu)) { this.timeSerials.Add(tu, new ConcurrentDictionary <string, object>()); } ConcurrentDictionary <string, object> d = this.timeSerials[tu]; d[name] = ts; IndicatorMeta meta = metas[name]; if (meta == null) { throw new Exception("缺少" + name + "的元数据"); } String filename = this.GetFullFileName(meta, tu); ts.Save(filename); }
/// <summary> /// 注册元信息 /// </summary> /// <param name="meta"></param> public void RegisteMeta(IndicatorMeta meta) { this.metas.Registe(meta); }
/// <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); }