Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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);
        }