如何在C#中从cosmos db获取确切的最新5分钟数据

如何解决如何在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分钟

enter image description here

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

解决方法

一种可行的解决方案是利用文档的_ts属性。您可以直接使用start dateend 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 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res