public Difference(string metric1, string metric2) : base(0) { _expression1 = MetricEvaluationContext.ParseExpression(metric1); _expression2 = MetricEvaluationContext.ParseExpression(metric2); Values = new double[2]; }
/// <summary> /// Constructor /// </summary> /// <param name="metricName">the metric definition string, such as "MA[40](BAR.CP)"</param> public GenericRuntimeMetric(string metricName) { if (string.IsNullOrWhiteSpace(metricName)) { throw new ArgumentNullException(); } _expression = MetricEvaluationContext.ParseExpression(metricName); }
static void ProcessOneFile(string file, DateTime startDate, DateTime endDate, string outputFileFolder, string[] metrics) { if (string.IsNullOrEmpty(file) || string.IsNullOrEmpty(outputFileFolder)) { throw new ArgumentNullException(); } StockHistoryData data = LoadInputFile(file, startDate, endDate); List <double[]> metricValues = new List <double[]>(); List <string> allFieldNames = new List <string>(); // parse metrics to expression MetricExpression[] metricExpressions = metrics .Select(m => MetricEvaluationContext.ParseExpression(m)) .ToArray(); // build field names for (int i = 0; i < metrics.Length; ++i) { if (metricExpressions[i].FieldNames.Length == 1) { allFieldNames.Add(metrics[i]); } else { allFieldNames.AddRange(metricExpressions[i].FieldNames.Select(s => metrics[i] + "." + s)); } } // calculate metrics foreach (Bar bar in data.Data) { var metricValuesForOneBar = metricExpressions.SelectMany(m => m.MultipleOutputUpdate(bar)).ToArray(); metricValues.Add(metricValuesForOneBar); } string outputFile = Path.Combine(outputFileFolder, data.Name.Code + ".day.metric.csv"); using (StreamWriter outputter = new StreamWriter(outputFile, false, Encoding.UTF8)) { string header = "code,date," + string.Join(",", allFieldNames.Select(m => MetricHelper.ConvertMetricToCsvCompatibleHead(m))); outputter.WriteLine(header); var times = data.Data.Select(d => d.Time).ToArray(); for (int i = 0; i < times.Length; ++i) { string value = string.Join( ",", metricValues[i] .Select(v => string.Format("{0:0.00}", v))); outputter.WriteLine( "{0},{1:yyyy/MM/dd},{2}", data.Name.Code, times[i], value); } } }