C#/.NET量化交易【3】搭建定时任务,自动获取历史股票数据和当前数据

2024-08-13 19:25:20 浏览数 (1)

在之前项目的基础上,引用quartz包,一个是定时任务使用,一个是任务的监控使用。

创建一个基础通信段quartz配置实体类,主要用于和前端监控通信。

创建一个定时任务,用于自动定时获取实时股价

再创建一个定时获取历史股票数据的任务

新增一个Hosted服务,用于程序启动自动后台运行,以此来启动定时任务计划

在program里面,新增对定时任务服务的添加注册

启动程序,可以看到定时任务监控信息。我们配置的cron表达式,也可以自动被识别啥时候执行,显示两个任务分别下一次是2024/6/26 09:29:30和2024/6/26 09:01:30

此处咱们模拟定时任务执行,手动执行一下。

对应的获取到当前实时的所有A股价格。获取以后就可以定时实时执行你的策略来提供量化操作。

接着继续手动执行另一个定时任务,获取股票历史数据

断点进去可以看到获取到了股票的历史数据,此处我只选择300532这一个的最近一个月历史数据进行获取,最近一个月内有21个交易日,所以获取了21个数据。获取数据以后,你可以根据历史数据的走势、计算其他数值或者指标,结合当前价格进行一系列其他的操作。

定时任务部分核心代码:

代码语言:javascript复制
  public class QuartzJobInitHostService : IHostedService, IDisposable
  {
      private readonly ISchedulerFactory _schedulerFactory;
      public QuartzJobInitHostService(ISchedulerFactory schedulerFactory)
      {
          _schedulerFactory = schedulerFactory;
      }
      public Task StartAsync(CancellationToken stoppingToken)
      {

          var properties = new NameValueCollection();
          properties["quartz.scheduler.instanceName"] = "定时任务监控";

          // 设置线程池
          properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz";
          properties["quartz.threadPool.threadCount"] = QuartzCongifurationInfo.ThreadPool;
          properties["quartz.threadPool.threadPriority"] = QuartzCongifurationInfo.Priority;

          // 远程输出配置
          properties["quartz.scheduler.exporter.type"] = "Quartz.Simpl.RemotingSchedulerExporter, Quartz";
          properties["quartz.scheduler.exporter.port"] = QuartzCongifurationInfo.Ip;
          properties["quartz.scheduler.exporter.bindName"] = QuartzCongifurationInfo.BindName;
          properties["quartz.scheduler.exporter.channelType"] = QuartzCongifurationInfo.ChannelType;

          var scheFactory = _schedulerFactory as StdSchedulerFactory;
          scheFactory.Initialize(properties);

          JobSchedulerInfo.JobsScheduler = scheFactory.GetScheduler().Result;
          int count = 2; // 任务数量

          IJobDetail[] jobs = new IJobDetail[count];
          ITrigger[] triggers = new ITrigger[count];
          for(int i = 0; i < count ; i  )
          {
              if (i == 0)
              {
                  // 定时任务1
                  jobs[i] = JobBuilder.Create<GetCurrentPriceJob>()
                   .WithIdentity($"Job_GetCurrentPrice", $"获取实时股票价格")
                   .Build();
                  triggers[i] = TriggerBuilder.Create()
                  .WithIdentity($"Job_GetCurrentPrice", $"获取实时股票价格~")
                  .StartNow()
                  .WithCronSchedule("30 29,59 9,10,11,13,14,15 ? * * ")
                  .Build();

              }
              else if (i == 1)
              {
                  // 定时任务2
                  jobs[i] = JobBuilder.Create<GetHistoryPriceJob>()
                   .WithIdentity($"Job_GetHistoryPriceJob", $"获取历史股票数据")
                   .Build();
                  triggers[i] = TriggerBuilder.Create()
                  .WithIdentity($"Job_GetHistoryPriceJob", $"获取历史股票数据~")
                  .StartNow()
                  .WithCronSchedule("30 1 9 ? * * ")
                  .Build();

              }

              JobSchedulerInfo.JobsScheduler.ScheduleJob(jobs[i], triggers[i]);

          }

          JobSchedulerInfo.JobsScheduler.Start();

          return Task.CompletedTask;
      }


      public Task StopAsync(CancellationToken stoppingToken)
      {

          return Task.CompletedTask;
      }

      public void Dispose()
      {

      }
  }

以上就是全部内容,欢迎观看。如果需要量化源码,可以在我公众号【Dotnet Dancer】后台回复 【量化开源】进行获取开源项目地址。

0 人点赞