【问题标题】:Filtering out the data for Extended Trading Hours in C#在 C# 中过滤掉延长交易时间的数据
【发布时间】:2022-01-02 09:43:19
【问题描述】:

我从股票提供商处获取数据,其中包含延长交易时间的数据。 数据是我从 JSON 转换为 List<Aggregate> 的聚合 1 分钟数据点,其中聚合包含高、低、打开、关闭和聚合 1 分钟窗口开始的时间。 我的查询包含多个交易日——可能是数百个,也可能是数千个。而且我对指标的计算必须排除盘后数据。 所以我有一个包含数百个对象的列表:

public class Aggregate
{
    public decimal Close { get; set; }
    public decimal UnixTimestamp { get; set; } // milliseconds
    ...
}

还有跨越数百天的DateTime FromDateDateTime ToDate。 现在,过滤盘后数据的一种可靠方法是将每个项目的UnixTimestamp 与太平洋标准时间上午 9:30 至下午 16:00 的常规交易时间窗口进行比较。这需要将每个UnixTimestamp 转换为DateTime。这是很多比较...直观地说,最好将FromDateToDate 转换为UnixTimestamp 并使用Linq 过滤掉项目。

long unixTimeMsecToDate = new DateTimeOffset(aggrParams.ToDate).ToUnixTimeMilliseconds();
long unixTimeMsecFromDate = new DateTimeOffset(aggrParams.FromDate).ToUnixTimeMilliseconds();

但是,我无法确定确切的代码...循环查看日期?怎么样?

【问题讨论】:

  • 如果您有List<Aggregate,那么您只需使用LINQ Where 方法过滤:listAggregate.Where(a => unixTimeMsecFromDate <= a.UnixTimestamp && a.UnixTimestamp <= unixTimeMsecToDate)。您可以选择在末尾执行ToList() 来记忆过滤。
  • 问题是 Aggregate FromDate 和 ToDate 是 DateTime 格式,我有多个日期,我已经聚合了 1 分钟的数据......所以,unixTimeMsecFromDate 和 unixTimeMsecToDate 需要以某种方式计算每个日期...
  • “聚合 FromDate 和 ToDate”指的是什么?您有一个从日期到日期的范围,您可以将其转换为 Unix 时间戳格式,然后直接使用Where 进行过滤。那是两次转换。你的public class Aggregatepublic decimal UnixTimestamp => 在Aggregate 中没有DateTime

标签: c# linq filtering


【解决方案1】:

我设法摆脱了 Aggregate 对象并将其替换为来自不同库的 Quote 对象,时间表示为 C# Date Time 并以如下直接方式解决问题,有效地过滤掉了非工作时间数据点:

        private void FilterExtendedTradingHours(List<Quote> quoteList, AggrParams aggrParams)
    {
        using (Log.VerboseCall())
        {
            if (aggrParams.Interval == "minute" || aggrParams.Interval == "hour")
            {
                Log.VerboseFormat("Initial {0} count: {1}", aggrParams.Interval, quoteList.Count);

                for(int i = quoteList.Count - 1; i >= 0; i--)
                {
                    if ( quoteList[i].Date.TimeOfDay > new TimeSpan(16,  0,  0) || quoteList[i].Date.TimeOfDay < new TimeSpan(9, 30, 0) )
                    {
                        quoteList.RemoveAt(i);
                    }
                }

                Log.VerboseFormat("Post-filtering {0} count: {1}", aggrParams.Interval, quoteList.Count);
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2022-08-11
    • 2021-12-17
    • 1970-01-01
    • 2020-03-07
    • 2018-04-08
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多