如何在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分钟运行,那么该数据的寡妇也会改变并获得错误的值。

我的问题是,如何从cosmos获取准确的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", "tickerContainer"), 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, 10, 01, 01) });
            test.Add(new MyObject() { Open = 2933, High = 2933, Low = 2933, Close = 2933, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 01) });
            test.Add(new MyObject() { Open = 2936, High = 2936, Low = 2936, Close = 2936, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 03) });
            test.Add(new MyObject() { Open = 2944, High = 2944, Low = 2944, Close = 2944, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 05) });
            test.Add(new MyObject() { Open = 2944, High = 2944, Low = 2944, Close = 2944, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 08) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 10) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 15) });
            test.Add(new MyObject() { Open = 2932, High = 2932, Low = 2932, Close = 2932, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 25) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 26) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 28) });
            test.Add(new MyObject() { Open = 2932, High = 2932, Low = 2932, Close = 2932, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 30) });
            test.Add(new MyObject() { Open = 2941, High = 2941, Low = 2941, Close = 2941, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 32) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 35) });
            test.Add(new MyObject() { Open = 2941, High = 2941, Low = 2941, Close = 2941, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 40) });
            test.Add(new MyObject() { Open = 2937, High = 2937, Low = 2937, Close = 2937, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 42) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 45) });
            test.Add(new MyObject() { Open = 2937, High = 2937, Low = 2937, Close = 2937, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 48) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 50) });
            test.Add(new MyObject() { Open = 2939, High = 2939, Low = 2939, Close = 2939, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 52) });
            test.Add(new MyObject() { Open = 2937, High = 2937, Low = 2937, Close = 2937, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 54) });
            test.Add(new MyObject() { Open = 2935, High = 2935, Low = 2935, Close = 2935, TimeStamp = new DateTime(2020, 10, 15, 10, 01, 56) });

            test.Add(new MyObject() { Open = 2935, High = 2935, Low = 2935, Close = 2935, TimeStamp = new DateTime(2020, 10, 15, 10, 02, 12) });

将1分钟作为参数传递给GetStartOfPeriodByMins(1)-

这里的记录是时间10:1:56和10:2:12。

现在您可以观察到最后,我们将获得2条记录集到resultSet中

如果在特定时间未运行计时器触发功能,它将仅取最后一条记录的平均值为10:2:12,这是不正确的

那么问题是如何匹配运行时间?

5分钟内也会发生同样的情况。

输出上述样本数据1分钟

在此处输入图片说明

因此,我们需要确保在该时间范围内数据是完整的。

singhh-msft

一种可能的解决方案是利用_ts文档的属性。您可以直接与SQL查询start dateend date前5分跨度。除此之外,您还可以另存start datelast used end dateDB(成本可忽略不计)。查询应如下所示:

SELECT * FROM c where c._ts <= 1601890740 AND c._ts >= 1601890585

另请注意,您将不得不进行POSIX到DateTime的来回转换。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从oracle表中获取最后5分钟的数据

来自分类Dev

如何获取15分钟前的最新条目?

来自分类Dev

如何从SQL数据库表中获取最近5分钟的记录?

来自分类Dev

如何从SQL数据库表中获取最近5分钟的记录?

来自分类Dev

如何每5分钟仅获取一次数据

来自分类Dev

如何从相对版本中获取确切的最新npm版本?

来自分类Dev

如何在setTimeout函数中获取确切的值

来自分类Dev

如何在Android中获取确切的TimeAgo

来自分类Dev

如何在xpath中获取确切的img src

来自分类Dev

PostgreSQL:从5分钟前从表中获取行

来自分类Dev

如何从NSNumberFormatter获取确切的值?

来自分类Dev

如何在C#中使用Open XML从Word文档中查找确切的单词?

来自分类Dev

如何在C#中为面板提供确切的尺寸?

来自分类Dev

使用T-SQL窗口函数从1分钟数据中检索5分钟平均值

来自分类Dev

如何在时间列(LocalDateTime)为00分钟的地方获取数据?

来自分类Dev

如何从Fontfamily中获取确切的字体?

来自分类Dev

如何从数组中获取确切的值-PHP

来自分类Dev

如何从json输出中获取确切的对象

来自分类Dev

如何从不同的类中获取确切的对象?

来自分类常见问题

如何根据连续的即将来临的数据C#形成5分钟的高低开盘价?

来自分类Dev

如何根据连续的即将来临的数据C#形成5分钟的高低开盘价?

来自分类Dev

如何删除数据库中5分钟内取消的订单记录?

来自分类Dev

如何在5分钟到30分钟之间汇总数据,同时保持日期间隔和其他值

来自分类Dev

如何在C#中获取$ IntDir

来自分类Dev

如果前后1分钟或2分钟,如何舍入到最接近的5分钟间隔?

来自分类Dev

如何在JavaScript中获取确切的媒体查询值?

来自分类Dev

如何在mysql查询中获取结果,其中字段包含确切的字符串

来自分类Dev

如何在javascript中获取确切的媒体查询值?

来自分类Dev

如何从SQLException获取确切的“约束名称”

Related 相关文章

  1. 1

    从oracle表中获取最后5分钟的数据

  2. 2

    如何获取15分钟前的最新条目?

  3. 3

    如何从SQL数据库表中获取最近5分钟的记录?

  4. 4

    如何从SQL数据库表中获取最近5分钟的记录?

  5. 5

    如何每5分钟仅获取一次数据

  6. 6

    如何从相对版本中获取确切的最新npm版本?

  7. 7

    如何在setTimeout函数中获取确切的值

  8. 8

    如何在Android中获取确切的TimeAgo

  9. 9

    如何在xpath中获取确切的img src

  10. 10

    PostgreSQL:从5分钟前从表中获取行

  11. 11

    如何从NSNumberFormatter获取确切的值?

  12. 12

    如何在C#中使用Open XML从Word文档中查找确切的单词?

  13. 13

    如何在C#中为面板提供确切的尺寸?

  14. 14

    使用T-SQL窗口函数从1分钟数据中检索5分钟平均值

  15. 15

    如何在时间列(LocalDateTime)为00分钟的地方获取数据?

  16. 16

    如何从Fontfamily中获取确切的字体?

  17. 17

    如何从数组中获取确切的值-PHP

  18. 18

    如何从json输出中获取确切的对象

  19. 19

    如何从不同的类中获取确切的对象?

  20. 20

    如何根据连续的即将来临的数据C#形成5分钟的高低开盘价?

  21. 21

    如何根据连续的即将来临的数据C#形成5分钟的高低开盘价?

  22. 22

    如何删除数据库中5分钟内取消的订单记录?

  23. 23

    如何在5分钟到30分钟之间汇总数据,同时保持日期间隔和其他值

  24. 24

    如何在C#中获取$ IntDir

  25. 25

    如果前后1分钟或2分钟,如何舍入到最接近的5分钟间隔?

  26. 26

    如何在JavaScript中获取确切的媒体查询值?

  27. 27

    如何在mysql查询中获取结果,其中字段包含确切的字符串

  28. 28

    如何在javascript中获取确切的媒体查询值?

  29. 29

    如何从SQLException获取确切的“约束名称”

热门标签

归档