23.项目开发之量化交易抓取数据QuantTradeData(二)

news2024/10/5 20:28:16

后端业务:定时更新“A股日线行情”数据

需求说明

为了获取前一天的最新数据,我们需要每天晚上10点定时刷新daily股票列表基础信息,并将最新数据插入或更新到数据库中。
01

如果该内容是在当天交易日信息未更新前查询(15~16点之前),会导致一条信息都查不到, 返回:
{"msg":"","code":0,"data":{"has_more":false,"fields":["ts_code","trade_date","open","high","low","close","pre_close","change","pct_chg","vol","amount"],"items":[]},"request_id":"10449486502d11ee949207ef2f187cbe"}
这时候在测试时,可以暂时拿昨天的交易信息来测试功能。

股票日线信息表(tb_stock_daily_info)

02

03

股票日线信息实体(StockDailyInfo)

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StockDailyInfo {
   private Integer id;
   private String thcode;              //股票代码
   private String tradedate;          //交易日期
   private Float stockopen;          //开盘价
   private Float high;                   //最高价
   private Float low;                    //最低价
   private Float stockclose;          //收盘价
   private Float preclose;             //昨收价
   private Float stockchange;      //涨跌额
   private Float pctchg;               //涨跌幅
   private Float vol;                     //成交量
   private Float amount;              //成交额
}

三层搭建

03

StockDailyInfoMapper:
04

import org.springframework.stereotype.Repository;

@Repository
public interface StockDailyInfoMapper {
}

StockDailyInfoMapper.xml:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.quanttradedata.stock.mapper.StockDailyInfoMapper">

</mapper>

Service



@Service
public class StockService {
   @Autowired
   private StockBasicInfoMapper stockBasicInfoMapper;
   @Autowired
   private TuShareAPI tuShareAPI;
   private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
   @Autowired
   private StockDailyInfoMapper stockDailyInfoMapper;
//其他代码忽略
}

业务实现

StockDailyInfoJob


import com.quanttradedata.stock.service.StockService;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;

@Component
public class StockDailyInfoJob extends QuartzJobBean {
   @Autowired
   private StockService stockService;
   @Override
   protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
       System.out.println("更新当日A股日线行情数据....");
       stockService.saveStockDailyInfoFromNet();
   }
}


QuartzConfig
注意,测试时,将时间频率改为15秒一次

import com.quanttradedata.stock.job.StockBasicInfoJob;
import com.quanttradedata.stock.job.StockDailyInfoJob;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {
   //股票基本信息的 任务详情创建 及 触发器创建
   @Bean
   public JobDetail getStockBasicInfoJob(){
       return JobBuilder.newJob(StockBasicInfoJob.class).storeDurably().build();
   }
   @Bean
   public Trigger getStockBasicInfoJobTrigger(JobDetail getStockBasicInfoJob){
       //1、编写cron表达式,指定触发的时间和周期
       //开发执行: 每个工作日的晚上22点
       CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0 0 22 ? * MON-FRI");
       //测试执行: 每15秒执行一次
//        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/15 * * * * ? ");
       //2、构建触发器,执行任务
       return TriggerBuilder.newTrigger().forJob(getStockBasicInfoJob).withSchedule(cron).build();
   }

   //A股日线行情基本信息的 任务详情创建 及 触发器创建
   @Bean
   public JobDetail getStockDailyInfoJob(){
       return JobBuilder.newJob(StockDailyInfoJob.class).storeDurably().build();
   }
   @Bean
   public Trigger getStockDailyInfoJobTrigger(JobDetail getStockDailyInfoJob){
       //1、编写cron表达式,指定触发的时间和周期
       //开发执行: 每个工作日的晚上22点
       CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0 0 22 ? * MON-FRI");
       //测试执行: 每15秒执行一次
//        CronScheduleBuilder cron = CronScheduleBuilder.cronSchedule("0/15 * * * * ? ");
       //2、构建触发器,执行任务
       return TriggerBuilder.newTrigger().forJob(getStockDailyInfoJob).withSchedule(cron).build();
   }
}

StockService
注意:如果当天并非是工作日的15~16点之后,用指定天数据来进行测试

private SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");

/**
    * 更新当日的A股日线行情数据
    */
   public void saveStockDailyInfoFromNet() {
       //1、编辑传递给TuShare平台的参数
       Map<String, String> param = new HashMap<>();
       param.put("trade_date",sdf2.format(new Date()));        //当天日期
       //因为老师在写代码时,时间没有超过工作日的16:00,当天日线数据还不存在,为了测试的方便,取前面某天的数据来测试
//        param.put("trade_date","20231018");
       //2、向TuShare平台发出请求,获取json数据
       JSONObject jsonObject = tuShareAPI.get(Const.STOCK_DAILY, param, null);
       //3、解析json数据,解析为List集合
       //3.1、获取日线json数据
       JSONArray jsonArray = jsonObject.getJSONObject("data").getJSONArray("items");
       //3.2、创建List集合,遍历日线Json数据,每遍历一行数据,转为一个StockDailyInfo对象,存入List集合
       List<StockDailyInfo> stockDailyInfos = new ArrayList<>();
       for (int i = 0; i < jsonArray.size(); i++) {
           JSONArray array = jsonArray.getJSONArray(i);
           stockDailyInfos.add(
                   new StockDailyInfo(
                           null,
                           array.getString(0),
                           array.getString(1),
                           array.getFloat(2),
                           array.getFloat(3),
                           array.getFloat(4),
                           array.getFloat(5),
                           array.getFloat(6),
                           array.getFloat(7),
                           array.getFloat(8),
                           array.getFloat(9),
                           array.getFloat(10)
                   )
           );
       }
       /*for (StockDailyInfo sdi : stockDailyInfos) {
           System.out.println(sdi);
       }*/
       //4、直接将List集合整体插入数据库
       if(stockDailyInfos.size()>0){
           int rows = 0;
           try {
               rows = stockDailyInfoMapper.insertStockDailyInfos(stockDailyInfos);
           } catch (Exception e) {
               if(e.getCause() instanceof SQLIntegrityConstraintViolationException && e.getMessage().contains("Duplicate entry")){
                   //说明当天数据已经更新过了
                   System.out.println("当天数据已更新,无需重复更新");
               }
           }
           //5、展示结果
           System.out.println("成功向数据库插入了"+rows+"条日线数据");
       }else{
           System.out.println("当天无日线数据 或 当前时间还未更新日线数据");
       }
   }


StockDailyInfoMapper



import com.quanttradedata.stock.javabean.StockDailyInfo;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface StockDailyInfoMapper {
   /**
    * 向数据库插入多条日线信息
    * @param stockDailyInfos
    * @return
    */
   int insertStockDailyInfos(@Param("list") List<StockDailyInfo> stockDailyInfos);
}


StockDailyInfoMapper.xml


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
       PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
       "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.quanttradedata.stock.mapper.StockDailyInfoMapper">
   <insert id="insertStockDailyInfos">
       insert into tb_stock_daily_info (
           thcode,
           tradedate,
           stockopen,
           high,
           low,
           stockclose,
           preclose,
           stockchange,
           pctchg,
           vol,
           amount
       ) values
             <foreach collection="list" item="sdi" separator=",">
                 (
                     #{sdi.thcode},
                     #{sdi.tradedate},
                     #{sdi.stockopen},
                     #{sdi.high},
                     #{sdi.low},
                     #{sdi.stockclose},
                     #{sdi.preclose},
                     #{sdi.stockchange},
                     #{sdi.pctchg},
                     #{sdi.vol},
                     #{sdi.amount}
                 )
             </foreach>
   </insert>
</mapper>


后端业务:定时更新“A股日线行情”数据业务完成!!!
项目开发之量化交易抓取数据QuantTradeData(三):后端业务之分页查询股票列表基础信息—传送门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106408.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谢宝栋教授:左心室辅助装置最新进展【ACC最新科学声明解读】

谢宝栋教授 主任医师 哈尔滨医科大学附属第一医院心脏大血管外科主任 独立完成十余例LVAD手术&#xff0c;具有丰富经验。 心力衰竭&#xff08;HF&#xff09;是一种严重的心脏病&#xff0c;导致心脏无法有效地泵送血液到全身。根据指南指导的药物治疗虽然可以缓解部分HF患…

ubuntu 18.04 开机自启 打开终端执行脚本

一 打开设置开机自启配置程序 alt F2 输入 gnome-session-properties 或 终端输入 gnome-session-properties 二 添加开机自启配置 点右方的add加入 填写名称&#xff0c;可自定义 填写指令&#xff0c;即开机想要执行的指令 gnome-terminal -x bash -c “ls; exec bash” …

JAVA生成ORC格式文件

一、背景 由于需要用到用java生成hdfs文件并上传到指定目录中&#xff0c;在Hive中即可查询到数据&#xff0c;基于此背景&#xff0c;开发此工具类 ORC官方网站&#xff1a;https://orc.apache.org/ 二、支持数据类型 三、工具开发 package com.xx.util;import com.alibab…

安防视频监控平台EasyCVR出现视频流播放卡顿情况,如何优化?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

成都股票开户选择哪家证券公司开户最便宜?炒股开户佣金最低是多少?

成都股票开户选择哪家证券公司开户最便宜&#xff1f;炒股开户佣金最低是多少&#xff1f; 股票开户是指向证券公司注册开立证券账户&#xff0c;以便购买和销售股票。一般而言&#xff0c;股票开户需要提供身份证明、联系方式、银行账户等信息并完成相应的申请手续。开户后&a…

postman请求400错误-日期LocalData

错误日志参考 [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type java.lang.String to required type java.time.LocalDate; neste…

RK3568驱动模块编译进内核

一、创建文件 首先在drivers/char目录下创建hello文件夹&#xff0c;然后在hello文件夹下创建hello.c 文件、Kconfig和Makefile文件。   hello.c 文件内容如下 #include <linux/module.h> #include <linux/kernel.h> static int __init helloworld_init(void) …

Shell 一键替换当前目录下所有文件的指定内容

文件内容&#xff1a; 脚本&#xff1a; #!/bin/bash source_content"127.0.0.1" target_content"helo cloudmusic"# 指定目录 directorypwd# 使用循环遍历目录中的每个文件 for file in "$directory"/* doif [ -f "$file" ]; then# …

B站狂转清华大佬手写笔记:Spring Security+ OAuth2.0分布式认证授权

微服务认证方案 微服务认证方案目前有很多种&#xff0c;每个企业也是大不相同&#xff0c;但是总体分为两类&#xff0c;如下&#xff1a; 网关只负责转发请求&#xff0c;认证鉴权交给每个微服务商控制统一在网关层面认证鉴权&#xff0c;微服务只负责业务 你们公司目前用…

保姆级教程:百度AI简单使用

1.进入AI对话界面 随便提个问题 这里我选择了程序猿小助手 文心一言网站 https://yiyan.baidu.com/welcome 文心一言可以做什么 与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。 参考截图

SSO身份验证如何帮助加强密码安全性

单点登录 &#xff08;SSO&#xff09; 是一种身份验证服务&#xff0c;可帮助用户使用一组凭据快速安全地访问所有应用程序。在员工需要访问多个应用程序才能完成工作的企业环境中&#xff0c;每次需要访问时都必须为每个应用程序输入登录凭据&#xff0c;这是一个主要的烦恼来…

C语言求 sinh(x)=(e^x - e^-x)/2,其中 e^x 用单独函数返回值

完整代码&#xff1a; // 求 sinh(x)(e^x - e^-x)/2&#xff0c;其中 e^x 用单独函数返回值 #include<stdio.h> #include<math.h>int main(){double x,sinh;printf("请输入一个数");scanf("%lf",&x);sinh(exp(x)-exp(-x))/2;printf("…

微信扫码跳转到小程序内部,浏览器扫码跳转到App 内部,如果手机上没有安装App ,跳转到下载页

第一:微信扫普通二维码跳转到小程序 第一步:登录微信公众平台,左侧点击开发管理,点击开发设置,滑到最下边,找到扫普通链接二维码打开小程序,配置对应的二维码链接,注意要拿这个链接去生成二维码,这样微信扫码才能跳转到小程序内部,还有那个校验文件,让后台放到对应的文件夹下,…

Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

创建es索引并学习分析器、过滤器、分词器的作用和配置 一、基础概念Elasticsearch与MySQL的类比1. ES与MySQL的结构类比图2. ES与MySQL的类比示意表格3. 索引中重要概念索引&#xff08;Index&#xff09;文档&#xff08;Document&#xff09;字段&#xff08;Field&#xff0…

值类型引用类型区别

例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Demo2 {internal class Program{static void Main(string[] args){#region 值类型int a 1;int b a;b 2;Console.WriteLine("a&…

【微信小程序调试工具试用】

【微信小程序调试工具试用】 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09;本次工具分享到此结束 什么是爬虫逆向&#xff1f; 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09; 1 如图 下面小程序…

c语言练习92:链表的中间结点

链表的中间结点 链表的结点为空时无法访问其next成员否则会报错 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* middleNode(struct ListNode* head){if(h…

【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程

【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程 文章目录 【深度学习】【三维重建】windows10环境配置tiny-cuda-nn详细教程前言确定版本对应关系源码编译安装tiny-cuda-nn总结 前言 本人windows10下使用【Instant Neural Surface Reconstruction】算法时需要…

PositiveSSL的泛域名SSL证书

PositiveSSL是Sectigo旗下的一个子品牌&#xff0c;致力于为全球用户提供优质、高效的SSL证书服务。PositiveSSL以Sectigo强大的品牌影响力和全球网络为基础&#xff0c;秉承“安全、可靠、高效”的服务理念&#xff0c;为各类网站提供全面的SSL证书解决方案。今天就随SSL盾小编…

苹果官网上架新款Apple Pencil(USB-C)

昨天晚上苹果在其官网发布了新款Apple Pencil手写笔&#xff0c;苹果将该产品命名为 Apple Pencil&#xff08;USB-C&#xff09;&#xff0c;新款Apple Pencil采用了全新的USB-C接口&#xff0c;支持USB-C充电&#xff0c;兼容所有配备USB-C接口的iPad机型&#xff0c;售价为6…