/// <summary>
        /// Builds the report on the position.
        /// </summary>
        /// <param name="reportSpec">Configuration parameters used to format the report.</param>
        /// <param name="position">The position.</param>
        /// <returns>The report.</returns>
        public static Report BuildReport(ReportSpecification reportSpec, Position position)
        {
            var contents =
                Enumerable.Repeat(reportSpec.Headers, 1)
                .Concat(position.Periods.Zip(Helpers.LocalTimes(position.Day),
                                             (period, localTime) => string.Format("{0},{1}", localTime.ToString(reportSpec.LocalTimeFormat), period.Volume))).ToArray();

            return(new Report {
                Day = position.Day, Contents = contents
            });
        }
        /// <summary>
        /// Writes a report to a file.
        /// </summary>
        /// <param name="reportSpec">Configuration parameters used to write the report.</param>
        /// <param name="report">The report.</param>
        public static void WriteReport(ReportSpecification reportSpec, Report report)
        {
            Directory.CreateDirectory(reportSpec.OutputPath);
            var reportFilename    = string.Format(reportSpec.FilenameFormat, report.Day.LocalDateTime.ToString(reportSpec.FilenameDateFormat));
            var reportFilepath    = Path.Combine(reportSpec.OutputPath, reportFilename);
            var temporaryFilename = string.Format("{0}.tmp", reportFilename);
            var temporaryFilepath = Path.Combine(reportSpec.OutputPath, temporaryFilename);

            File.WriteAllLines(temporaryFilepath, report.Contents);
            if (File.Exists(reportFilepath))
            {
                File.Delete(reportFilepath);
            }
            File.Move(temporaryFilepath, reportFilepath);
        }