Exemple #1
0
        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);
                }
            }
        }