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

后端业务:定时更新“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 mapperPUBLIC "-//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 {@Autowiredprivate StockBasicInfoMapper stockBasicInfoMapper;@Autowiredprivate TuShareAPI tuShareAPI;private SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");@Autowiredprivate 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 {@Autowiredprivate StockService stockService;@Overrideprotected 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 {//股票基本信息的 任务详情创建 及 触发器创建@Beanpublic JobDetail getStockBasicInfoJob(){return JobBuilder.newJob(StockBasicInfoJob.class).storeDurably().build();}@Beanpublic 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股日线行情基本信息的 任务详情创建 及 触发器创建@Beanpublic JobDetail getStockDailyInfoJob(){return JobBuilder.newJob(StockDailyInfoJob.class).storeDurably().build();}@Beanpublic 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 mapperPUBLIC "-//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.rhkb.cn/news/163052.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NAT网关在阿里云的应用

NAT网关&#xff08;Network Address Translation Gateway&#xff09;是一种网络地址转换服务&#xff0c;提供NAT代理&#xff08;SNAT和DNAT&#xff09;能力。NAT是用于在本地网络中使用私有地址&#xff0c;在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决I…

kubernetes 多集群管理和联邦集群将是下一波运维浪潮

问题 调研一下国内外K8s平台软件&#xff0c;哪个具有创建标准的K8s集群的功能&#xff1f; 背景 随着云原生技术在越来越多的企业和组织中的大规模落地&#xff0c;如何高效、可靠地管理大规模资源池以应对不断增长的业务挑战成为了当下云原生技术的关键挑战。在过去的很长…

JAVA基础(JAVA SE)学习笔记(四)IDEA安装、使用、设置、断点、乱码汇总

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 正文 JAVA基础&#xff08;JAVA SE&#xff09;学习笔记&#xff08;一&#xff09;JAVA学习路线、行业了解…

数据结构与算法之图: Leetcode 65. 有效数字 (Typescript版)

有效数字 https://leetcode.cn/problems/valid-number/ 描述 有效数字&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 一个 小数 或者 整数&#xff08;可选&#xff09;一个 ‘e’ 或 ‘E’ &#xff0c;后面跟着一个 整数 小数&#xff08;按顺序&#…

FL Studio21最新中文破解进阶高级完整版安装下载教程

目前水果软件最版本是FL Studio21&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;如…

Apache Doris (四十三): Doris数据更新与删除 - Update数据更新

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Update数据更新原理

毫米波雷达2-雷达的工作模式

文章目录 flash mode: 用于烧写functional mode: Power off the board and remove the jumper from only header SOP2 (this puts the board back in functional mode) flash mode: 用于烧写 functional mode: Power off the board and remove the jumper from only header SOP…

逻辑回归揭秘: 从分类原理到机器学习实践

机器学习 第五课 逻辑回归 概述逻辑回归应用领域逻辑回归 vs 线性回归基本定义输出类型函数关系误差计算使用场景数据分布 逻辑回归的数学原理Sigmoid 函数多数几率似然函数逻辑回归损失函数 正则化L1 正则化L2 正则化L1 vs L2 实例 标准化为什么要标准化?如何进行标准化? 梯…

最新Discuz3.5论坛多合一聚合支付接口插件源码/支持支付宝和微信支付功能

最新Discuz3.5论坛多合一聚合支付接口插件源码/支持支付宝和微信支付功能&#xff0c;这个插件直接替换了自带的支付接口功能&#xff0c;增强了支付的扩展性&#xff0c;它挺方便实用的&#xff0c;自带了支持支付宝、微信、QQ 钱包官方支付&#xff0c;以及彩虹易支付、虎皮椒…

微信小程序进阶——Flex弹性布局轮播图会议OA项目(首页)

目录 一、Flex弹性布局 1.1 什么是Flex弹性布局 1.1.1 详解 1.1.2 图解 1.1.3 代码演示效果 1.2 Flex弹性布局的核心概念 1.3 Flex 弹性布局的常见属性 1.4 Flex弹性布局部分属性详解 1.4.1 flex-direction属性 1.4.2 flex-wrap属性 1.4.3 flex-flow属性 1.4.4 ju…

【广州华锐互动】VR建筑安全培训体验为建筑行业人才培养提供有力支持

随着建筑行业的快速发展&#xff0c;建筑施工安全问题日益受到广泛关注。然而&#xff0c;传统的安全培训方式往往缺乏实践性和真实性&#xff0c;难以让员工真正掌握安全操作技能。近年来&#xff0c;虚拟现实(VR)技术的广泛应用为建筑施工安全培训提供了新的机遇。 虚拟现实技…

多维时序 | MATLAB实现SSA-CNN-BiGRU-Attention多变量时间序列预测(SE注意力机制)

多维时序 | MATLAB实现SSA-CNN-BiGRU-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09; 目录 多维时序 | MATLAB实现SSA-CNN-BiGRU-Attention多变量时间序列预测&#xff08;SE注意力机制&#xff09;预测效果基本描述模型描述程序设计参考资料 预测效果 基本…

2023年中国精准护肤发展现状及趋势分析:未来皮肤实现定制化诊断成趋势[图]

精准护肤是深度融合光电科技与精准医学在皮肤上的实践&#xff0c;以皮肤问题为导向通过研究挖掘各类皮肤问题发生发展的生理机制、环境因素&#xff0c;找寻相应的靶点并选择活性成分与光电技术&#xff0c;利用现代医疗技术实现能量/成分靶向传递&#xff0c;并通过不同人群的…

Linux:将mysql数据导入mongodb

mysql和mongodb都要同时开启 进入mysql创建一个数据库为aaa create database aaa; 创建一个tarro表结构为 &#xff08;id int,name varchar(20)&#xff09; create table tarro(id int,name varchar(20)); 插入几个数据&#xff0c;等会把这里的数据导过去 insert in…

C++模拟实现——vector

一、成员变量 成员变量由三个模板指针构成&#xff1a; _start : 指向开头位置 _finish : 指向数据结束的地方 _end_of_storage : 指向空间结束的位置 二、基本指标 实现vector的基本思路和顺序表相同&#xff0c;因此会频繁的需要用到数据大小、容量大小这些指标&#xf…

竞赛选题 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

ChatGPT DALL-E 3的系统提示词大全

每当给出图像的描述时&#xff0c;使用dalle来创建图像&#xff0c;然后用纯文本总结用于生成图像的提示。如果用户没有要求创建特定数量的图像&#xff0c;默认创建四个标题&#xff0c;这些标题应尽可能多样化。发送给Dalle的所有标题都必须遵循以下策略&#xff1a;1.如果描…

KingBase用户与角色及对象访问权限(Kylin)

用户与角色 角色的概念 将一组具有相同权限的用户组织在一起&#xff0c;这一组具有相同权限的用户就称为角色&#xff08;Role&#xff09;角色在生产系统中一般被视为用户组&#xff0c;利用角色对用户进行批量授权 创建用户角色 CREATE USER name WITH [option]授予权限…

python安装、输入输出、注释、中文编码、编码规范等基础语法

一、概述 1、简介 Python的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。1989年的圣诞节期间&#xff0c;Guido开始写Python语言的编译器。Python这个名字&#xff0c;来自Guido所挚爱的电视剧Monty Python’s Flying Circus。他希望这个新的叫做Python的…

C++前缀和算法应用:和至少为 K 的最短子数组的原理、源码及测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个整数数组 nums 和一个整数 k &#xff0c;找出 nums 中和至少为 k 的 最短非空子数组 &#xff0c;并返回该子数组的长度。如果不存在这样的 子数组 &a…