如何解决如何在C#中从cosmos db获取确切的最新5分钟数据
我有一个连续运行的webjob,并从web socket api读取数据。
下面是每1秒钟自动运行并将滴答数据添加到cosmos db中的代码。
private static void OnTick(Tick TickData)
{
var latestTickData = new MyObject()
{
InstrumentID = TickData.InstrumentToken,Close = TickData.LastPrice,High = TickData.LastPrice,Low = TickData.LastPrice,Open = TickData.LastPrice,TimeStamp = TickData.Timestamp.HasValue ? TickData.Timestamp.Value : DateTime.Now
};
// add data into cosmos
Task.Run(() =>
{
Program.documentClient.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri("tickerDatabase","tickerContainer"),latestTickData);
}).Wait();
}
现在,我想读取最近的5分钟数据,并采用开高低位收盘价。
对于最近的5分钟数据,我目前每5分钟运行一次计时器作业,该作业从波斯菊读取数据并计算开盘高低开盘,但是这里是时间。
如果计时器作业延迟1分钟运行,那么该数据的寡妇也会更改并获得错误的值。
我的问题是,如何从宇宙中获取准确的5分钟最新数据?
当前计时器作业代码-
myobject.cs
public class MyObject
{
public uint InstrumentID { get; set; }
public decimal Close { get; set; }
public decimal High { get; set; }
public decimal Low { get; set; }
public decimal Open { get; set; }
public DateTime TimeStamp { get; set; }
public uint Volume { get; set; }
public DateTime GetStartOfPeriodByMins(int numMinutes)
{
int oldMinutes = TimeStamp.Minute;
int newMinutes = (oldMinutes / numMinutes) * numMinutes;
DateTime startOfPeriod = new DateTime(TimeStamp.Year,TimeStamp.Month,TimeStamp.Day,TimeStamp.Hour,newMinutes,0);
return startOfPeriod;
}
}
myfunction.cs
public static void ExecuteProcess([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer)
{
var option = new FeedOptions { EnableCrossPartitionQuery = true };
var queryable = Program.documentClient.CreateDocumentQuery<MyObject>
(UriFactory.CreateDocumentCollectionUri("tickerDatabase",option).ToList();
var resultSet = queryable.GroupBy(i => i.GetStartOfPeriodByMins(5))
.Select(gr =>
new
{
StartOfPeriod = gr.Key,Low = gr.Min(item => item.Low),High = gr.Max(item => item.High),Open = gr.OrderBy(item => item.TimeStamp).First().Open,Close = gr.OrderBy(item => item.TimeStamp).Last().Close
});
var my5min = resultSet.LastOrDefault();
Console.WriteLine("time " + my5min.StartOfPeriod + " open " + my5min.Open + " high " + my5min.High + " low " + my5min.Low + " close " + my5min.Close);
让我用1分钟的数据来解释问题(尽管我原本需要5分钟)。
下面是示例记录-
List<MyObject> test = new List<MyObject>();
test.Add(new MyObject() { Open = 2939,High = 2939,Low = 2939,Close = 2939,TimeStamp = new DateTime(2020,10,15,01,01) });
test.Add(new MyObject() { Open = 2933,High = 2933,Low = 2933,Close = 2933,01) });
test.Add(new MyObject() { Open = 2936,High = 2936,Low = 2936,Close = 2936,03) });
test.Add(new MyObject() { Open = 2944,High = 2944,Low = 2944,Close = 2944,05) });
test.Add(new MyObject() { Open = 2944,08) });
test.Add(new MyObject() { Open = 2939,10) });
test.Add(new MyObject() { Open = 2939,15) });
test.Add(new MyObject() { Open = 2932,High = 2932,Low = 2932,Close = 2932,25) });
test.Add(new MyObject() { Open = 2939,26) });
test.Add(new MyObject() { Open = 2939,28) });
test.Add(new MyObject() { Open = 2932,30) });
test.Add(new MyObject() { Open = 2941,High = 2941,Low = 2941,Close = 2941,32) });
test.Add(new MyObject() { Open = 2939,35) });
test.Add(new MyObject() { Open = 2941,40) });
test.Add(new MyObject() { Open = 2937,High = 2937,Low = 2937,Close = 2937,42) });
test.Add(new MyObject() { Open = 2939,45) });
test.Add(new MyObject() { Open = 2937,48) });
test.Add(new MyObject() { Open = 2939,50) });
test.Add(new MyObject() { Open = 2939,52) });
test.Add(new MyObject() { Open = 2937,54) });
test.Add(new MyObject() { Open = 2935,High = 2935,Low = 2935,Close = 2935,56) });
test.Add(new MyObject() { Open = 2935,02,12) });
将1分钟作为参数传递给GetStartOfPeriodByMins(1)-
这里记录的是时间10:1:56和10:2:12。
现在您可以观察到最后,我们将在resultSet中获得2个记录集
如果在特定时间未运行计时器触发功能,它将仅获取最后记录的平均值10:2:12,这是不正确的
那么问题是如何匹配运行时间?
同样的事情也会在5分钟后发生。
上述样本数据输出1分钟
因此,我们需要确保在该时间范围内数据是完整的。
解决方法
一种可行的解决方案是利用文档的_ts
属性。您可以直接使用start date
和end date
进行5分钟的SQL查询。除此之外,您可以将start date
另存为last used end date
到数据库中(费用可以忽略不计)。查询应如下所示:
SELECT * FROM c where c._ts <= 1601890740 AND c._ts >= 1601890585
还请注意,您将不得不进行POSIX到DateTime的来回转换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。