//---------- API #region public DataSourceAlgorithm(Dictionary<DataSourceValue, string> info) /// <summary> /// Create and initialize new data source for algorithm quotes. /// </summary> /// <param name="info">info dictionary</param> public DataSourceAlgorithm(Dictionary <DataSourceParam, string> info) : base(info) { if (!Info.ContainsKey(DataSourceParam.symbolAlgo)) { throw new Exception(string.Format("{0}: {1} missing mandatory symbolAlgo key", GetType().Name, info[DataSourceParam.nickName])); } var items = info[DataSourceParam.symbolAlgo].Split(",").ToList(); var algoName = items[0]; var algoParam = items.Count > 1 ? items[1] : null; _algo = (Algorithm)AlgorithmLoader.InstantiateAlgorithm(algoName); if (_algo == null) { throw new Exception(string.Format("DataSourceAlgorithm: failed to instantiate algorithm {0}", info[DataSourceParam.nickName2])); } _algo.SubclassedParam = algoParam; Info[DataSourceParam.name] = _algo.Name; // by default, we run the data source through the cache, // if it was instantiated from an info dictionary // Info[DataSourceParam.allowSync] = "true"; }
//---------- API #region public DataSourceAlgorithm(Dictionary<DataSourceValue, string> info) /// <summary> /// Create and initialize new data source for algorithm quotes. /// </summary> /// <param name="info">info dictionary</param> public DataSourceAlgorithm(Dictionary <DataSourceParam, string> info) : base(info) { _algoName = Info[DataSourceParam.dataFeed] .Split(':') .Last(); var algo = (SubclassableAlgorithm)AlgorithmLoader.InstantiateAlgorithm(_algoName); if (algo == null) { throw new Exception(string.Format("DataSourceAlgorithm: failed to instantiate algorithm {0}", _algoName)); } Info[DataSourceParam.name] = algo.Name; }
/// <summary> /// Load data into memory. /// </summary> /// <param name="startTime">start of load range</param> /// <param name="endTime">end of load range</param> override public void LoadData(DateTime startTime, DateTime endTime) { var cacheKey = new CacheId(null, "", 0, _algoName.GetHashCode(), startTime.GetHashCode(), endTime.GetHashCode()); List <Bar> retrievalFunction() { try { DateTime t1 = DateTime.Now; Output.WriteLine(string.Format("DataSourceAlgorithm: generating data for {0}...", Info[DataSourceParam.nickName])); var algo = (SubclassableAlgorithm)AlgorithmLoader.InstantiateAlgorithm(_algoName); algo.SubclassedStartTime = startTime; algo.SubclassedEndTime = endTime; algo.ParentDataSource = this; algo.SubclassedData = new List <Bar>();; algo.Run(); DateTime t2 = DateTime.Now; Output.WriteLine(string.Format("DataSourceAlgorithm: finished after {0:F1} seconds", (t2 - t1).TotalSeconds)); return(algo.SubclassedData); } catch { throw new Exception("DataSourceAlgorithm: failed to run sub-classed algorithm " + _algoName); } } List <Bar> data = Cache <List <Bar> > .GetData(cacheKey, retrievalFunction); if (data.Count == 0) { throw new Exception(string.Format("DataSourceNorgate: no data for {0}", Info[DataSourceParam.nickName])); } Data = data; }