public Context(CurrencyDataSource currencyDataSource, PredefinedDataContainer collectionDataContainer, ValuesTable valuesTable, DateTime startTime)
 {
     _predefinedDataContainer = collectionDataContainer;
     _valuesTable = valuesTable;
     _currentTime = startTime;
     _currencyDataSource = currencyDataSource;
 }
        /// <summary>
        /// The method for executing the trading strategy.
        /// The result are the position records that located in the position sets
        /// </summary>
        /// <param name="tradingStrategy">the trading strategy</param>
        /// <param name="startDate">start date of back-testing</param>
        /// <param name="endDate">end date of back-testing</param>
        public void Execute(TradingStrategy tradingStrategy, DateTime startDate, DateTime endDate)
        {
            Currency baseCurrency = _currencyTable[tradingStrategy.Portfolio.HomeCurrency];

            // initialize evaluation context
            var collectionDataContainer = new PredefinedDataContainer();
            collectionDataContainer.Add(new Top3Currencies(_currencyDataSource, baseCurrency)); // predefined data set "Top3Currencies"
            collectionDataContainer.Add(new Bottom3Currencies(_currencyDataSource, baseCurrency)); // predefine data set "Bottom3Currencies"
            _evaluationContext = new Context(_currencyDataSource, collectionDataContainer, new ValuesTable(10), startDate);

            // Add the current date of execution into values table
            _evaluationContext.ValuesTable.Add(TODAY_STR, startDate);

            // Add base currency as a variable
            _evaluationContext.ValuesTable.Add(BASE_CURRENCY_STR, baseCurrency.Name);

            // put all the paramter definitions into the table
            foreach (var param in tradingStrategy.ConstantVariableDefinitions)
            {
                _evaluationContext.ValuesTable.Add(param.Variable.Name, param.Constant.Eval(_evaluationContext));
            }

            // initialize position set
            foreach (var positionDef in tradingStrategy.Portfolio.PositionSets)
            {
                PositionType type = (positionDef.PositionType == FXStrategy.MetaModel.PositionType.Long)?PositionType.Long:PositionType.Short;
                CreatePositionSet(positionDef.Name, baseCurrency, (int)positionDef.Number.Eval(_evaluationContext), type);
            }

            // initialize execute frequency
            tradingStrategy.TradingRules.ForEach(t => t.ExecuteFrequency.Initialize(startDate, endDate,_evaluationContext));

            // add predefined data set into collection data container
            for(DateTime currentDate = startDate; currentDate <= endDate; currentDate = currentDate.AddDays(1))
            {
                // No activities on weekend
                if (DateTimeHelper.IsWeekEnd(currentDate))
                    continue;

                _evaluationContext.ValuesTable[TODAY_STR] = currentDate;
                _evaluationContext.CurrentDate = currentDate;
                foreach (TradingRule rule in tradingStrategy.TradingRules)
                {
                    // evaluate the rule inner statement
                    // only if current date fit to its execution frequency
                    if (rule.ExecuteFrequency.CanExecute(currentDate))
                        EvaluateStatement(rule.InnerStatement);
                }
            }

        }