股票K线功能实现
今日目标
1.理解股票T和T-1概念,实现成交量对比功能; 2.理解个股涨跌幅度统计功能; 2.1 分析业务,SQL落地; 2.2 完善不存在数据的区间默认回显功能; 3.理解个股分时线业务,并实现功能; 4.理解个股日K线业务,并实现功能;
第一章 股票成交量对比功能
1、股票成交量对比功能分析
1.1 股票成交量对比功能原型
功能描述:统计A股大盘T日和T-1日成交量对比功能(成交量为沪深两市成交量之和)
1.2 相关表分析
stock_market_index_info表结构相关字段:
1.3 成交量对比功能接口分析
功能描述:统计A股大盘T日和T-1日成交量对比功能(成交量为沪深两市成交量之和)
服务路径:/api/quot/stock/tradeAmt 服务方法:GET 前端请求频率:每分钟 请求参数:无
返回数据格式:
{
"code": 1,
"data": {
"amtList": [{"count": 3926392,"time": "202112310930"},{"count": 3926392,"time": "202112310931"},...],//T日每分钟成交量信息
"yesAmtList":[{"count": 3926392,"time": "202112310930"},...]//T-1日每分钟成交量信息
}
}
注意事项:如果当前日期不在股票交易日,则按照前一个有效股票交易日作为T日查询
R<Map<String,List<Map>>>
2、成交量对比功能SQL分析
-- 思路:通过逻辑获取T日开盘时间和当前时间日期范围,ge: 2022-01-03 09:30:00 到 2022-01-03 14:40:00
-- 那么T-1日日期范围则为:2022-01-02 09:30:00 到 2022-01-02 14:40:00
-- 我们可分别统计T日和T-1日国内A股大盘交易量,然后再讲数据组装即可
-- 1.统计T日交易量数据信息(T-1日SQL结构一致)
select
date_format(smi.cur_time,'%Y%m%d%H%i') as time,
sum(smi.trade_amount) as count
from
stock_market_index_info as smi
where
smi.cur_time between '2022-01-03 09:30:00' and '2022-01-03 14:40:00'
and
smi.market_code in ('sh000001','sz399001')
group by time
order by smi.cur_time asc;
-- SQL语句添加order by 保证查询的数据是按照日期排序
3、成交量对比功能实现
3.1 定义web服务接口方法
/**
* 功能描述:统计国内A股大盘T日和T-1日成交量对比功能(成交量为沪市和深市成交量之和)
* @return
*/
@GetMapping("/stock/tradeAmt")
public R<Map> stockTradeVol4InnerMarket(){
return stockService.stockTradeVol4InnerMarket();
}
3.2 定义服务接口方法与实现
服务接口方法:
/**
* 功能描述:统计国内A股大盘T日和T-1日成交量对比功能(成交量为沪市和深市成交量之和)
* @return
*/
R<Map> stockTradeVol4InnerMarket();
服务接口方法实现:
/**
* 功能描述:统计国内A股大盘T日和T-1日成交量对比功能(成交量为沪市和深市成交量之和)
* map结构示例:
* {
* "volList": [{"count": 3926392,"time": "202112310930"},......],
* "yesVolList":[{"count": 3926392,"time": "202112310930"},......]
* }
* @return
*/
@Override
public R<Map> stockTradeVol4InnerMarket() {
//1.获取T日和T-1日的开始时间和结束时间
//1.1 获取最近股票有效交易时间点--T日时间范围
DateTime lastDateTime = DateTimeUtil.getLastDate4Stock(DateTime.now());
DateTime openDateTime = DateTimeUtil.getOpenDate(lastDateTime);
//转化成java中Date,这样jdbc默认识别
Date startTime4T = openDateTime.toDate();
Date endTime4T=lastDateTime.toDate();
//TODO mock数据
startTime4T=DateTime.parse("2022-01-03 09:30:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).toDate();
endTime4T=DateTime.parse("2022-01-03 14:40:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).toDate();
//1.2 获取T-1日的区间范围
//获取lastDateTime的上一个股票有效交易日
DateTime preLastDateTime = DateTimeUtil.getPreviousTradingDay(lastDateTime);
DateTime preOpenDateTime = DateTimeUtil.getOpenDate(preLastDateTime);
//转化成java中Date,这样jdbc默认识别
Date startTime4PreT = preOpenDateTime.toDate();
Date endTime4PreT=preLastDateTime.toDate();
//TODO mock数据
startTime4PreT=DateTime.parse("2022-01-02 09:30:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).toDate();
endTime4PreT=DateTime.parse("2022-01-02 14:40:00", DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss")).toDate();
//2.获取上证和深证的配置的大盘id
//2.1 获取大盘的id集合
List<String> markedIds = stockInfoConfig.getInner();
//3.分别查询T日和T-1日的交易量数据,得到两个集合
//3.1 查询T日大盘交易统计数据
List<Map> data4T=stockMarketIndexInfoMapper.getStockTradeVol(markedIds,startTime4T,endTime4T);
if (CollectionUtils.isEmpty(data4T)) {
data4T=new ArrayList<>();
}
//3.2 查询T-1日大盘交易统计数据
List<Map> data4PreT=stockMarketIndexInfoMapper.getStockTradeVol(markedIds,startTime4PreT,endTime4PreT);
if (CollectionUtils.isEmpty(data4PreT)) {
data4PreT=new ArrayList<>();
}
//4.组装响应数据
HashMap<String, List> info = new HashMap<>();
info.put("amtList",data4T);
info.put("yesAmtList",data4PreT);
//5.返回数据
return R.ok(info);
}
注意:当前无法获取实时的数据,选择已存在的合适的时间范围查询即可;
3.3 定义mapper接口和xml
定义mapper接口方法:
/**
* 根据时间范围和指定的大盘id统计每分钟的交易量
* @param markedIds 大盘id集合
* @param startTime 交易开始时间
* @param endTime 结束时间
* @return
*/
List<Map> getStockTradeVol(@Param("markedIds") List<String> markedIds,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
XML方法绑定:
<select id="getStockTradeVol" resultType="map">
select
date_format(smi.cur_time,'%Y%m%d%H%i') as time,
sum(smi.trade_amount) as count
from stock_market_index_info as smi
where smi.market_code in
<foreach collection="markedIds" item="marketId" open="(" separator="," close=")">
#{marketId}
</foreach>
and smi.cur_time between #{startTime} and #{endTime}
group by smi.cur_time
order by time asc;
</select>
3.4 web接口测试
-
页面效果如下