예제 #1
0
        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);
        }
예제 #3
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);
                }
            }
        }