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); } } }