在 C# 中过滤掉延长交易时间的数据
Posted
技术标签:
【中文标题】在 C# 中过滤掉延长交易时间的数据【英文标题】:Filtering out the data for Extended Trading Hours in 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 FromDate
和DateTime ToDate
。
现在,过滤盘后数据的一种可靠方法是将每个项目的UnixTimestamp
与太平洋标准时间上午 9:30 至下午 16:00 的常规交易时间窗口进行比较。这需要将每个UnixTimestamp
转换为DateTime
。这是很多比较...直观地说,最好将FromDate
和ToDate
转换为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 Aggregate
说public decimal UnixTimestamp
=> 在Aggregate
中没有DateTime
。
【参考方案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);
【讨论】:
以上是关于在 C# 中过滤掉延长交易时间的数据的主要内容,如果未能解决你的问题,请参考以下文章