/// <summary> /// Compiles a script to evaluate the specified expression /// </summary> /// <param name="expression">The expression to get a value from the dataset</param> /// <returns>The delegate used to get the desired value from a dataset</returns> protected Func <StockDataInterface, int, object> getExpressionEvaluator(string expression) { Func <StockDataInterface, int, object> accessor; // Check if the expression is an iterator if (expression.StartsWith("Iterate(")) { var code = expression.Replace("Iterate(", "DataChartIterator.Iterate("); var compiler = CSScript.MonoEvaluator.ReferenceAssemblyOf <StockDataInterface>(); compiler = compiler.ReferenceAssembly(Session.ScriptInstance.Location); this.IterateData = compiler.LoadDelegate <Func <List <StockDataInterface> > >( @"using System.Collections.Generic; using RobinhoodDesktop; using RobinhoodDesktop.Script; List<StockDataInterface> GetIterator(){ return " + code + @";}")(); ((StockDataSet <DataChartIterator>)IterateData[0]).File = Session.SourceFile; ((StockDataSet <DataChartIterator>)IterateData[0]).Start = Session.SinkFile.Start; accessor = DataChartIterator.GetExpressionEvaluator(); } else { StockDataInterface i = (IterateData != null) ? IterateData[0] : DataSets.First().Value.First(); accessor = i.GetExpressionEvaluator(expression, this.Session); } return(accessor); }
/// <summary> /// Callback used to create a stock data instance /// </summary> public StockProcessingState GetProcessingState(StockDataInterface data) { Dictionary <TimeSpan, StockProcessingState> intervals; StockProcessingState state; string symbol; DateTime start; TimeSpan interval; data.GetInfo(out symbol, out start, out interval); if (!ProcessingStates.TryGetValue(symbol, out intervals) || (intervals == null)) { state = new StockProcessingState(); state.DataSet = HistoricalData[symbol]; ProcessingStates[symbol] = new Dictionary <TimeSpan, StockProcessingState>() { { interval, state } }; } else { if (!intervals.TryGetValue(interval, out state) || (state == null)) { state = new StockProcessingState(); state.DataSet = HistoricalData[symbol]; intervals[interval] = state; } else { // Assume incrementing to the next data set state.DataSetIndex++; // Check if processing restarted if (start < state.LastProcessedStartTime) { state = new StockProcessingState(); state.DataSet = HistoricalData[symbol]; intervals[interval] = state; } } } state.LastProcessedStartTime = start; // Ensure the data set index is correct (should never evaluate to true) if (data != HistoricalData[symbol][state.DataSetIndex]) { throw new Exception("Data set index mismatch"); } return(state); }
/// <summary> /// Callback used to create a stock data instance /// </summary> public StockProcessingState GetProcessingState(StockDataInterface data) { Dictionary <TimeSpan, StockProcessingState> intervals; StockProcessingState state; string symbol; DateTime start; TimeSpan interval; data.GetInfo(out symbol, out start, out interval); if (!ProcessingStates.TryGetValue(symbol, out intervals) || (intervals == null)) { state = new StockProcessingState(); state.DataSet = HistoricalData[symbol]; ProcessingStates[symbol] = new Dictionary <TimeSpan, StockProcessingState>() { { interval, state } }; } else { if (!intervals.TryGetValue(interval, out state) || (state == null)) { state = new StockProcessingState(); state.DataSet = HistoricalData[symbol]; intervals[interval] = state; } else { // Assume incrementing to the next data set for (; state.DataSetIndex < state.DataSet.Count(); state.DataSetIndex++) { if (state.DataSet[state.DataSetIndex] == data) { break; } } // Check if processing restarted if (start < state.LastProcessedStartTime) { state = new StockProcessingState(); state.DataSet = HistoricalData[symbol]; intervals[interval] = state; } } } state.LastProcessedStartTime = start; return(state); }