├── README.md ├── doc └── images │ ├── qqGroup.png │ ├── xtick.png │ └── xticklogo.png ├── pom.xml └── src └── main └── java └── org └── xtick ├── XTickStockApiClient.java ├── XTickWebSocketClient.java ├── bean ├── CommonPacket.java ├── Minute.java ├── MinutePacket.java ├── Tick.java ├── TickPacket.java ├── TickSubcribeInfo.java └── finance │ ├── XTickFinanceBalance.java │ ├── XTickFinanceCapital.java │ ├── XTickFinanceCashFlow.java │ ├── XTickFinanceHoldernum.java │ ├── XTickFinanceIncome.java │ ├── XTickFinancePershareIndex.java │ ├── XTickFinanceTop10flowholder.java │ └── XTickFinanceTop10holder.java ├── constant ├── MethodType.java └── XTickConst.java ├── http ├── HttpClientRest.java ├── Retry.java └── Supplier.java └── util ├── JsonUtil.java └── XTickUtil.java /README.md: -------------------------------------------------------------------------------- 1 | # XTick 2 | 3 |

4 | 5 | 实时行情报价数据接口 6 | 7 |

8 | 9 |

10 | XTick提供实时行情报价数据接入解决方案。 11 |

12 | 13 | ## 项目介绍 14 | 15 | XTick行情API提供了全面、准确、稳定的行情数据,帮助开发者和研究者构建创新的交易和分析工具,满足金融行业的需求,进行深入的市场分析和模型验证。 16 |
您的支持,是我们继续维护好XTick项目的动力。
17 |

18 | 19 | 实时行情报价数据接口 20 | 21 |

22 | 23 | ## API接口文档 24 | API接口分为订阅数据、历史数据两大块。
25 | 除了订阅接口是Websocket API,其余接口为Http API接口且均支持GET和POST方法,下面以GET请求示例。
26 | 27 | 2.1 订阅数据接口 28 | 在GitHub上,已实现Java版本和Python版本的订阅代码,请先下载代码直接调用。
29 | 订阅数据按照证券交易所订阅推送,包括上交所、深交所、北交所、港交所(只支持部分股票)。
30 | 数据为实时推送,发数据非常快,客户端接受到数据后,最好做异步处理,将接受数据和数据处理分开,避免接受数据阻塞。
31 | 1. 订阅方法:
32 | 订阅数据:订阅为Websocket API,请在Github上下载开源项目,参考XTickWebSocketClient.java中已实现的订阅功能。
33 | 入参1:authCodes 枚举取值如下: 34 | - tick.SZ - 订阅深交所A股的tick数据。 35 | - tick.SH - 订阅上交所A股的tick数据。 36 | - tick.BJ - 订阅北交所A股的tick数据。 37 | - tick.HK - 订阅港交所港股的tick数据。 38 | - time.SZ - 订阅深交所A股的k线数据,包括time、1m。 39 | - time.SH - 订阅上交所A股的k线数据,包括time、1m。 40 | - time.BJ - 订阅北交所A股的k线数据,包括time、1m。 41 | - time.HK - 订阅港交所港股的k线数据,包括time、1m。
42 | 入参2:token 登录XTick网站,注册获取
43 | 44 | 取消订阅:http://api.xtick.top/doc/unsubscribe?token=043fbdcba7f3f3ab332ffff123456789
45 | 入参:token 登录XTick网站,注册获取 46 | 47 | 2.2 行情数据接口 48 | 1. 请求方法: 49 | 请求地址:http://api.xtick.top/doc/market?type=1&code=000001&period=tick&fq=none&startDate=2025-03-25&endDate=2025-03-25&token=043fbdcba7f3f3ab332ffff123456789 50 | 备注:行情数据支持交易日内盘内实时更新。 51 | 入参1:type 股票类别 52 | 沪深京A股type=1,港股type=3,沪深ETF type=20; 53 | 入参2:code 股票代码 54 | 比如平安银行为000001 55 | 入参3:period 用于表示要获取的周期,枚举取值如下: 56 | - tick - 分笔数据 57 | - 1m - 1分钟线 58 | - 5m - 5分钟线 59 | - 15m - 15分钟线 60 | - 30m - 30分钟线 61 | - 1h - 1小时线 62 | - 1d - 日线 63 | - 1w - 周线 64 | - 1mon - 月线 65 | - 1q - 季度线 66 | - 1hy - 半年线 67 | - 1y - 年线 68 | 参数4:fq 除权方式,用于K线数据复权计算,对tick等其他周期数据无效,枚举取值如下: 69 | - none 不复权 70 | - front 前复权 71 | - back 后复权 72 | - front_ratio 等比前复权 73 | - back_ratio 等比后复权 74 | 参数5:时间范围,用于指定数据请求范围,表示的范围是[startDate , endDate]区间(包含前后边界)。 75 | 特别说明:period为tick类型,则单次请求时间跨度最大为一天,即startDate和endDate日期需设置为同一天。 76 | period为分钟类型(包括1m、5m、15m、30m、1h),则单次请求时间跨度最大为一月,即endDate - startDate不超过30天。 77 | - startDate - 起始时间,日期格式:2025-03-25 78 | - endDate- 结束时间,日期格式:2025-03-25 79 | 入参6:token 登录XTick网站,注册获取 80 | 81 | 2.3 财务数据接口 82 | 1. 请求方法: 83 | 请求地址:http://api.xtick.top/doc/financial?type=1&code=000001&report=Pershareindex&startDate=2020-03-25&endDate=2025-03-25&token=043fbdcba7f3f3ab332ffff123456789 84 | 入参1:type 股票类别 85 | 沪深京A股type=1,港股type=3; 86 | 入参2:code 股票代码 87 | 比如平安银行为000001 88 | 入参3:report 用于表示要获取的财务报表,枚举取值如下: 89 | - Balance - 资产负债表 90 | - Income - 利润表 91 | - CashFlow - 现金流量表 92 | - Capital - 股本表 93 | - Holdernum - 股东数 94 | - Top10holder - 十大股东 95 | - Top10flowholder - 十大流通股东 96 | - Pershareindex - 每股指标 97 | 参数4:时间范围,用于指定数据请求范围,表示的范围是[startDate , endDate]区间(包含前后边界)。 98 | - startDate - 起始时间,日期格式:2025-03-25 99 | - endDate- 结束时间,日期格式:2025-03-25 100 | 入参5:token 登录XTick网站,注册获取 101 | 102 | ## 项目地址 103 | 104 | 目前项目托管在 Gitee 和 Github 平台上中,欢迎大家 Star 和 Fork 支持~
105 | 106 | ### Java SDK : 107 | 108 | Gitee地址:https://github.com/xticktop/xtick
109 | Github地址:https://github.com/xticktop/xtick
110 | 111 | ## 关注&交流 112 | 113 | 为了方便小伙伴们沟通交流,创建了QQ群 (加群备注:XTick) 114 | ,目前项目还存在很多不足之处,欢迎各位大佬进群进行交流,为了防止广告进入,希望加群的时候能添加备注,谢谢~
115 | 如遇问题联系作者,邮箱:xticktop@163.com
116 | [网站说明文档](https://ccn9lag3l54q.feishu.cn/wiki/ABenwEvDOiShYrkaLAJcFY5gnZf)
117 | 118 | | QQ群【推荐】 | 119 | |------------------------------------------------------------------------------------------| 120 | | | 121 | 122 | 123 | 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /doc/images/qqGroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xticktop/DemoXtickJava/96c14a8bf968e501cac1c75a93ad4a0311659973/doc/images/qqGroup.png -------------------------------------------------------------------------------- /doc/images/xtick.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xticktop/DemoXtickJava/96c14a8bf968e501cac1c75a93ad4a0311659973/doc/images/xtick.png -------------------------------------------------------------------------------- /doc/images/xticklogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xticktop/DemoXtickJava/96c14a8bf968e501cac1c75a93ad4a0311659973/doc/images/xticklogo.png -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.example 8 | DemoXtickJava 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 8 13 | 8 14 | UTF-8 15 | 16 | 17 | 18 | org.projectlombok 19 | lombok 20 | 1.18.32 21 | 22 | 23 | com.google.code.gson 24 | gson 25 | 2.8.6 26 | 27 | 28 | com.google.guava 29 | guava 30 | 32.1.0-jre 31 | 32 | 33 | 34 | org.springframework.boot 35 | spring-boot-starter-websocket 36 | 3.2.12 37 | 38 | 39 | org.apache.httpcomponents 40 | httpclient 41 | 4.5.13 42 | 43 | 44 | org.apache.commons 45 | commons-lang3 46 | 3.12.0 47 | 48 | 49 | com.google.guava 50 | guava 51 | 33.3.1-jre 52 | 53 | 54 | com.squareup.okhttp3 55 | okhttp 56 | 4.12.0 57 | compile 58 | 59 | 60 | commons-io 61 | commons-io 62 | 2.11.0 63 | compile 64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/XTickStockApiClient.java: -------------------------------------------------------------------------------- 1 | package org.xtick; 2 | 3 | import com.google.common.collect.ImmutableMap; 4 | import org.xtick.bean.Minute; 5 | import org.xtick.bean.Tick; 6 | import org.xtick.bean.finance.*; 7 | import org.xtick.constant.MethodType; 8 | import org.xtick.constant.XTickConst; 9 | import org.xtick.http.HttpClientRest; 10 | import org.xtick.util.JsonUtil; 11 | 12 | import java.io.IOException; 13 | import java.time.LocalDate; 14 | import java.util.List; 15 | import java.util.Map; 16 | 17 | /** 18 | * 行情实时数据、财务报表数据获取API接口。 19 | * 官网:http://www.xtick.top/ 20 | */ 21 | public class XTickStockApiClient { 22 | /** 23 | * 获取财务数据 24 | */ 25 | public String getFinancialData(int type, String code, String report, String startDate, String endDate, String token, MethodType method) throws IOException { 26 | String url = "http://api.xtick.top/doc/financial"; 27 | Map para = ImmutableMap.builder().put("type", type).put("zip", true).put("code", code).put("report", report).put("startDate", startDate).put("endDate", endDate).put("token", token).build(); 28 | return method.equals(MethodType.GET) ? HttpClientRest.getIntance().get(url, para) : HttpClientRest.getIntance().post(url, para); 29 | } 30 | 31 | /** 32 | * 获取市场行情数据数据 33 | */ 34 | public String getMarketData(int type, String code, String period, String fq, String startDate, String endDate, String token, MethodType method) throws IOException { 35 | String url = "http://api.xtick.top/doc/market"; 36 | Map para = ImmutableMap.builder().put("type", type).put("zip", true).put("code", code).put("period", period).put("fq", fq).put("startDate", startDate).put("endDate", endDate).put("token", token).build(); 37 | return method.equals(MethodType.GET) ? HttpClientRest.getIntance().get(url, para) : HttpClientRest.getIntance().post(url, para); 38 | } 39 | 40 | public void DemoForFinancialData() throws IOException { 41 | int type = 1;//沪深京A股Type=1,港股Type=3,ETF Type=20 42 | String code = "000001"; 43 | String startDate = "2020-04-25"; 44 | String endDate = LocalDate.now().toString(); 45 | //获取财务指标数据 46 | String report = "Pershareindex"; 47 | String result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 48 | List financePershareIndexDatas = JsonUtil.jsonToList(result, XTickFinancePershareIndex.class); 49 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financePershareIndexDatas.size())); 50 | 51 | report = "Balance"; 52 | result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 53 | List financeBalanceDatas = JsonUtil.jsonToList(result, XTickFinanceBalance.class); 54 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financeBalanceDatas.size())); 55 | 56 | report = "CashFlow"; 57 | result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 58 | List financeCashFlowDatas = JsonUtil.jsonToList(result, XTickFinanceCashFlow.class); 59 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financeCashFlowDatas.size())); 60 | 61 | report = "Capital"; 62 | result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 63 | List financeCapitalDatas = JsonUtil.jsonToList(result, XTickFinanceCapital.class); 64 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financeCapitalDatas.size())); 65 | 66 | report = "Holdernum"; 67 | result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 68 | List financeHoldernumDatas = JsonUtil.jsonToList(result, XTickFinanceHoldernum.class); 69 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financeHoldernumDatas.size())); 70 | 71 | report = "Top10holder"; 72 | result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 73 | List financeTop10holderDatas = JsonUtil.jsonToList(result, XTickFinanceTop10holder.class); 74 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financeTop10holderDatas.size())); 75 | 76 | report = "Top10flowholder"; 77 | result = getFinancialData(type, code, report, startDate, endDate, XTickConst.token, MethodType.GET); 78 | List financeTop10flowholderDatas = JsonUtil.jsonToList(result, XTickFinanceTop10flowholder.class); 79 | System.out.println(String.format("code=%s,report=%s,date=%s,financial data size=%s", code, report, startDate, financeTop10flowholderDatas.size())); 80 | } 81 | 82 | public void DemoForMarketData() throws IOException { 83 | int type = 1;//沪深京A股Type=1,港股Type=3 84 | String code = "000001"; 85 | String startDate = "2025-04-25"; 86 | String endDate = LocalDate.now().toString(); 87 | String result = getMarketData(type, code, "tick", "", startDate, startDate, XTickConst.token, MethodType.GET); 88 | List ticks = JsonUtil.jsonToList(result, Tick.class);//获取tick数据 89 | System.out.println(String.format("code=%s,period=tick,date=%s,history data size=%s", code, startDate, ticks.size())); 90 | for (String period : XTickConst.historyKlinePeriods) {//获取K线数据 91 | for (String fq : XTickConst.dividends) { 92 | result = getMarketData(type, code, period, fq, startDate, endDate, XTickConst.token, MethodType.GET); 93 | List klines = JsonUtil.jsonToList(result, Minute.class); 94 | System.out.println(String.format("code=%s,period=%s,fq=%s,startDate=%s,endDate=%s,history data size=%s", code, period, fq, startDate, endDate, klines.size())); 95 | } 96 | } 97 | } 98 | 99 | public static void main(String[] args) throws IOException { 100 | XTickStockApiClient client = new XTickStockApiClient(); 101 | String result = client.getMarketData(1, "000001", "1m", "none", LocalDate.now().minusMonths(1).toString(), LocalDate.now().toString(), XTickConst.token, MethodType.GET); 102 | List datas = JsonUtil.jsonToList(result, Minute.class);//获取1分钟数据 103 | System.out.println(datas); 104 | //client.DemoForFinancialData();//获取财务数据代码示例 105 | //client.DemoForMarketData();//获取历史数据代码示例 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/XTickWebSocketClient.java: -------------------------------------------------------------------------------- 1 | package org.xtick; 2 | 3 | 4 | import com.google.common.collect.ImmutableList; 5 | import com.google.common.util.concurrent.ThreadFactoryBuilder; 6 | import jakarta.websocket.*; 7 | import org.apache.catalina.util.StringUtil; 8 | import org.apache.commons.lang3.StringUtils; 9 | import org.xtick.bean.MinutePacket; 10 | import org.xtick.bean.TickPacket; 11 | import org.xtick.bean.TickSubcribeInfo; 12 | import org.xtick.constant.XTickConst; 13 | import org.xtick.util.JsonUtil; 14 | import org.xtick.util.XTickUtil; 15 | 16 | import java.io.ByteArrayInputStream; 17 | import java.io.UnsupportedEncodingException; 18 | import java.net.URI; 19 | import java.net.URLEncoder; 20 | import java.nio.charset.StandardCharsets; 21 | import java.time.LocalDateTime; 22 | import java.time.format.DateTimeFormatter; 23 | import java.util.List; 24 | import java.util.Objects; 25 | import java.util.concurrent.LinkedBlockingDeque; 26 | import java.util.concurrent.LinkedBlockingQueue; 27 | import java.util.concurrent.ThreadPoolExecutor; 28 | import java.util.concurrent.TimeUnit; 29 | import java.util.function.Consumer; 30 | 31 | /** 32 | * WebSocket客户端,用于连接XTick的WebSocket服务。 33 | * 官网:http://www.xtick.top/ 34 | */ 35 | @ClientEndpoint 36 | public class XTickWebSocketClient { 37 | private URI endpointURI; 38 | private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); 39 | private LinkedBlockingQueue queue = new LinkedBlockingQueue<>(100000); 40 | private ThreadPoolExecutor taskThreadPool = new ThreadPoolExecutor(3, 3, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(1000), new ThreadFactoryBuilder().setNameFormat("xtick-task-%d").build()); 41 | 42 | private Consumer dataConsumer = result -> { 43 | Object packet; 44 | if (StringUtils.isNotBlank(result)) { 45 | if (result.contains("1m")) { 46 | packet = JsonUtil.jsonToObj(result, MinutePacket.class); 47 | } else { 48 | packet = JsonUtil.jsonToObj(result, TickPacket.class); 49 | } 50 | if (Objects.nonNull(packet)) {//数据包加入队列中,后续业务模块调用处理 51 | queue.offer(packet); 52 | } 53 | } 54 | }; 55 | 56 | private XTickWebSocketClient(URI endpointURI) { 57 | try { 58 | this.endpointURI = endpointURI; 59 | connectToServer(endpointURI, null); 60 | } catch (Exception e) { 61 | System.err.println("Failed to connect to WebSocket server" + e.getMessage()); 62 | } 63 | } 64 | 65 | private void connectToServer(URI endpointURI, CloseReason reason) { 66 | if (Objects.isNull(reason) || !reason.getCloseCode().equals(CloseReason.CloseCodes.NORMAL_CLOSURE)) { 67 | try { 68 | WebSocketContainer container = ContainerProvider.getWebSocketContainer(); 69 | container.setDefaultMaxBinaryMessageBufferSize(1 * 1024 * 1024); 70 | container.setDefaultMaxTextMessageBufferSize(1 * 1024 * 1024); 71 | container.setDefaultMaxSessionIdleTimeout(1 * 60 * 60 * 1000L); 72 | container.connectToServer(this, endpointURI); 73 | XTickUtil.sleepSeconds(1); 74 | } catch (Exception e) { 75 | System.err.println("Failed to connect to WebSocket server" + e.getMessage()); 76 | XTickUtil.sleepSeconds(10); 77 | connectToServer(endpointURI, reason); 78 | } 79 | } 80 | } 81 | 82 | @OnOpen 83 | public void onOpen(Session session) { 84 | System.out.println("Connected to WebSocket server"); 85 | } 86 | 87 | @OnClose 88 | public void onClose(Session session, CloseReason reason) { 89 | System.out.println("Disconnected from WebSocket server. Reason: " + reason.toString()); 90 | connectToServer(endpointURI, reason); 91 | } 92 | 93 | @OnMessage 94 | public void onMessage(String data) { 95 | System.out.println("Received message: " + data); 96 | } 97 | 98 | @OnMessage 99 | public void onMessage(byte[] data) { 100 | XTickUtil.processData(new ByteArrayInputStream(data), dataConsumer); 101 | } 102 | 103 | @OnError 104 | public void onError(Session session, Throwable throwable) { 105 | System.err.println("WebSocket连接发生错误.error=" + throwable.getMessage()); 106 | } 107 | 108 | 109 | public void exec() { 110 | taskThreadPool.execute(() -> { 111 | while (true) { 112 | try { 113 | Object data = queue.take(); 114 | if (data instanceof TickPacket) { //处理业务逻辑.... 115 | TickPacket packet = (TickPacket) data; 116 | System.out.println(String.format("%s,received tick data.[authCode=%s,period=%s,size=%s]", LocalDateTime.now().format(formatter), packet.getAuthCode(), packet.getPeriod(), packet.getData().size())); 117 | } else { 118 | MinutePacket packet = (MinutePacket) data; 119 | System.out.println(String.format("%s,received minute data.[authCode=%s,period=%s,size=%s]", LocalDateTime.now().format(formatter), packet.getAuthCode(), packet.getPeriod(), packet.getData().size())); 120 | } 121 | } catch (Exception e) { 122 | System.err.println("Failed to process data." + e.getMessage()); 123 | } 124 | } 125 | }); 126 | } 127 | 128 | public static void main(String[] args) throws UnsupportedEncodingException { 129 | //List authCodes = ImmutableList.of("time.SZ", "time.SH", "time.BJ", "time.HK", "tick.SZ", "tick.SH", "tick.BJ", "tick.HK"); 130 | List authCodes = ImmutableList.of("time.SZ","tick.BJ");//新用户,可以订阅北交所的tick行情数据 131 | String user = URLEncoder.encode(JsonUtil.toJson(TickSubcribeInfo.builder().token(XTickConst.token).authCodes(authCodes).build()), StandardCharsets.UTF_8.toString()); 132 | XTickWebSocketClient wsClient = new XTickWebSocketClient(URI.create(String.format("ws://ws.xtick.top/ws/%s", user))); 133 | wsClient.exec(); 134 | } 135 | } -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/CommonPacket.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Map; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class CommonPacket { 16 | private String authCode; 17 | private int seqNo; 18 | private Map data; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/Minute.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import com.fasterxml.jackson.annotation.JsonProperty; 5 | import lombok.Data; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.xtick.constant.XTickConst; 8 | 9 | import java.time.Instant; 10 | import java.time.LocalDateTime; 11 | import java.time.ZoneId; 12 | 13 | @Data 14 | @Slf4j 15 | public class Minute { 16 | private long time; //时间戳 17 | @JsonIgnore 18 | private String date; //时间戳对应日期 19 | private float open; //开盘价 20 | private float high; //最高价 21 | private float low; //最低价 22 | private float close; //收盘价 23 | private double amount; //成交总额 24 | private float volume; //成交总量(手) 25 | 26 | @JsonProperty("time") 27 | public void setTime(long time) { 28 | this.time = time; 29 | Instant instant = Instant.ofEpochMilli(time); 30 | LocalDateTime localDateTime = LocalDateTime.ofInstant(instant, ZoneId.of("GMT+8")); 31 | this.date = localDateTime.format(XTickConst.formatter); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/MinutePacket.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Map; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class MinutePacket { 16 | private String period; 17 | private String authCode; 18 | private int seqNo; 19 | private Map data; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/Tick.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | 6 | @Data 7 | @Slf4j 8 | public class Tick { 9 | private long time; //时间戳 10 | private float lastPrice; //最新价 11 | private float open; //开盘价 12 | private float high; //最高价 13 | private float low; //最低价 14 | private float lastClose; //前收盘价 15 | private long amount; //成交总额 16 | private long volume; //成交总量(手) 17 | private float[] askPrice; //委卖价 18 | private float[] bidPrice; //委买价 19 | private long[] askVol; //委卖量 20 | private long[] bidVol; //委买量 21 | 22 | @Override 23 | public String toString() { 24 | StringBuilder sb = new StringBuilder(); 25 | sb.append(time).append(",") 26 | .append(lastPrice).append(",") 27 | .append(open).append(",") 28 | .append(high).append(",") 29 | .append(low).append(",") 30 | .append(lastClose).append(",") 31 | .append(amount).append(",") 32 | .append(volume).append(",") 33 | .append(askPrice[0]).append(",") 34 | .append(askPrice[1]).append(",") 35 | .append(askPrice[2]).append(",") 36 | .append(askPrice[3]).append(",") 37 | .append(askPrice[4]).append(",") 38 | .append(bidPrice[0]).append(",") 39 | .append(bidPrice[1]).append(",") 40 | .append(bidPrice[2]).append(",") 41 | .append(bidPrice[3]).append(",") 42 | .append(bidPrice[4]).append(",") 43 | .append(askVol[0]).append(",") 44 | .append(askVol[1]).append(",") 45 | .append(askVol[2]).append(",") 46 | .append(askVol[3]).append(",") 47 | .append(askVol[4]).append(",") 48 | .append(bidVol[0]).append(",") 49 | .append(bidVol[1]).append(",") 50 | .append(bidVol[2]).append(",") 51 | .append(bidVol[3]).append(",") 52 | .append(bidVol[4]); 53 | return sb.toString(); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/TickPacket.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean; 2 | 3 | 4 | import lombok.AllArgsConstructor; 5 | import lombok.Builder; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | import java.util.Map; 10 | 11 | @Data 12 | @Builder 13 | @AllArgsConstructor 14 | @NoArgsConstructor 15 | public class TickPacket{ 16 | private String period; 17 | private String authCode; 18 | private int seqNo; 19 | private Map data; 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/TickSubcribeInfo.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | @Data 11 | @Builder 12 | @AllArgsConstructor 13 | @NoArgsConstructor 14 | public class TickSubcribeInfo { 15 | private String token; 16 | private List authCodes;//订阅类别 period.market tick.SH 17 | } -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceBalance.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | 4 | import lombok.Data; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.apache.commons.lang3.StringUtils; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Slf4j 12 | public class XTickFinanceBalance implements Serializable { 13 | private int type; 14 | private String code = StringUtils.EMPTY; 15 | private String m_timetag; //截止日期 16 | private String m_anntime; //披露日期 17 | private Float internal_shoule_recv; //内部应收款 18 | private Float fixed_capital_clearance; //固定资产清理 19 | private Float should_pay_money; //应付分保账款 20 | private Float settlement_payment; //结算备付金 21 | private Float receivable_premium; //应收保费 22 | private Float accounts_receivable_reinsurance; //应收分保账款 23 | private Float reinsurance_contract_reserve; //应收分保合同准备金 24 | private Float dividends_payable; //应收股利 25 | private Float tax_rebate_for_export; //应收出口退税 26 | private Float subsidies_receivable; //应收补贴款 27 | private Float deposit_receivable; //应收保证金 28 | private Float apportioned_cost; //待摊费用 29 | private Float profit_and_current_assets_with_deal; //待处理流动资产损益 30 | private Float current_assets_one_year; //一年内到期的非流动资产 31 | private Float long_term_receivables; //长期应收款 32 | private Float other_long_term_investments; //其他长期投资 33 | private Float original_value_of_fixed_assets; //固定资产原值 34 | private Float net_value_of_fixed_assets; //固定资产净值 35 | private Float depreciation_reserves_of_fixed_assets; //固定资产减值准备 36 | private Float productive_biological_assets; //生产性生物资产 37 | private Float public_welfare_biological_assets; //公益性生物资产 38 | private Float oil_and_gas_assets; //油气资产 39 | private Float development_expenditure; //开发支出 40 | private Float right_of_split_share_distribution; //股权分置流通权 41 | private Float other_non_mobile_assets; //其他非流动资产 42 | private Float handling_fee_and_commission; //应付手续费及佣金 43 | private Float other_payables; //其他应交款 44 | private Float margin_payable; //应付保证金 45 | private Float internal_accounts_payable; //内部应付款 46 | private Float advance_cost; //预提费用 47 | private Float insurance_contract_reserve; //保险合同准备金 48 | private Float broker_buying_and_selling_securities; //代理买卖证券款 49 | private Float acting_underwriting_securities; //代理承销证券款 50 | private Float international_ticket_settlement; //国际票证结算 51 | private Float domestic_ticket_settlement; //国内票证结算 52 | private Float deferred_income; //递延收益 53 | private Float short_term_bonds_payable; //应付短期债券 54 | private Float long_term_deferred_income; //长期递延收益 55 | private Float undetermined_investment_losses; //未确定的投资损失 56 | private Float quasi_distribution_of_cash_dividends; //拟分配现金股利 57 | private Float provisions_not; //预计负债 58 | private Float cust_bank_dep; //吸收存款及同业存放 59 | private Float provisions; //预计流动负债 60 | private Float less_tsy_stk; //减:库存股 61 | private Float cash_equivalents; //货币资金 62 | private Float loans_to_oth_banks; //拆出资金 63 | private Float tradable_fin_assets; //交易性金融资产 64 | private Float derivative_fin_assets; //衍生金融资产 65 | private Float bill_receivable; //应收票据 66 | private Float account_receivable; //应收账款 67 | private Float advance_payment; //预付款项 68 | private Float int_rcv; //应收利息 69 | private Float other_receivable; //其他应收款 70 | private Float red_monetary_cap_for_sale; //买入返售金融资产 71 | private Float agency_bus_assets; //以公允价值计量且其变动计入当期损益的金融资产 72 | private Float inventories; //存货 73 | private Float other_current_assets; //其他流动资产 74 | private Float total_current_assets; //流动资产合计 75 | private Float loans_and_adv_granted; //发放贷款及垫款 76 | private Float fin_assets_avail_for_sale; //可供出售金融资产 77 | private Float held_to_mty_invest; //持有至到期投资 78 | private Float long_term_eqy_invest; //长期股权投资 79 | private Float invest_real_estate; //投资性房地产 80 | private Float accumulated_depreciation; //累计折旧 81 | private Float fix_assets; //固定资产 82 | private Float constru_in_process; //在建工程 83 | private Float construction_materials; //工程物资 84 | private Float long_term_liabilities; //长期负债 85 | private Float intang_assets; //无形资产 86 | private Float goodwill; //商誉 87 | private Float long_deferred_expense; //长期待摊费用 88 | private Float deferred_tax_assets; //递延所得税资产 89 | private Float total_non_current_assets; //非流动资产合计 90 | private Float tot_assets; //资产总计 91 | private Float shortterm_loan; //短期借款 92 | private Float borrow_central_bank; //向中央银行借款 93 | private Float loans_oth_banks; //拆入资金 94 | private Float tradable_fin_liab; //交易性金融负债 95 | private Float derivative_fin_liab; //衍生金融负债 96 | private Float notes_payable; //应付票据 97 | private Float accounts_payable; //应付账款 98 | private Float advance_peceipts; //预收账款 99 | private Float fund_sales_fin_assets_rp; //卖出回购金融资产款 100 | private Float empl_ben_payable; //应付职工薪酬 101 | private Float taxes_surcharges_payable; //应交税费 102 | private Float int_payable; //应付利息 103 | private Float dividend_payable; //应付股利 104 | private Float other_payable; //其他应付款 105 | private Float non_current_liability_in_one_year; //一年内到期的非流动负债 106 | private Float other_current_liability; //其他流动负债 107 | private Float total_current_liability; //流动负债合计 108 | private Float long_term_loans; //长期借款 109 | private Float bonds_payable; //应付债券 110 | private Float longterm_account_payable; //长期应付款 111 | private Float grants_received; //专项应付款 112 | private Float deferred_tax_liab; //递延所得税负债 113 | private Float other_non_current_liabilities; //其他非流动负债 114 | private Float non_current_liabilities; //非流动负债合计 115 | private Float tot_liab; //负债合计 116 | private Float cap_stk; //实收资本(或股本) 117 | private Float cap_rsrv; //资本公积 118 | private Float specific_reserves; //专项储备 119 | private Float surplus_rsrv; //盈余公积 120 | private Float prov_nom_risks; //一般风险准备 121 | private Float undistributed_profit; //未分配利润 122 | private Float cnvd_diff_foreign_curr_stat; //外币报表折算差额 123 | private Float tot_shrhldr_eqy_excl_min_int; //归属于母公司股东权益合计 124 | private Float minority_int; //少数股东权益 125 | private Float total_equity; //所有者权益合计 126 | private Float tot_liab_shrhldr_eqy; //负债和股东权益总计 127 | } 128 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceCapital.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.commons.lang3.StringUtils; 6 | import java.io.Serializable; 7 | 8 | @Data 9 | @Slf4j 10 | public class XTickFinanceCapital implements Serializable { 11 | private int type; 12 | private String code = StringUtils.EMPTY; 13 | private String m_timetag;//报告截止日 14 | private String m_anntime;//公告日 15 | private Float total_capital; //总股本 16 | private Float circulating_capital;//已上市流通A股 17 | private Float restrict_circulating_capital;//限售流通股份 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceCashFlow.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @Slf4j 11 | public class XTickFinanceCashFlow implements Serializable { 12 | private int type; 13 | private String code = StringUtils.EMPTY; 14 | private String m_timetag; //截止日期 15 | private String m_anntime; //披露日期 16 | private Float cash_received_ori_ins_contract_pre; //收到原保险合同保费取得的现金 17 | private Float net_cash_received_rei_ope; //收到再保险业务现金净额 18 | private Float net_increase_insured_funds; //保户储金及投资款净增加额 19 | private Float Net; //处置交易性金融资产净增加额 increase_in_disposal 20 | private Float cash_for_interest; //收取利息、手续费及佣金的现金 21 | private Float net_increase_in_repurchase_funds; //回购业务资金净增加额 22 | private Float cash_for_payment_original_insurance; //支付原保险合同赔付款项的现金 23 | private Float cash_payment_policy_dividends; //支付保单红利的现金 24 | private Float disposal_other_business_units; //处置子公司及其他收到的现金 25 | private Float cash_received_from_pledges; //减少质押和定期存款所收到的现金 26 | private Float cash_paid_for_investments; //投资所支付的现金 27 | private Float net_increase_in_pledged_loans; //质押贷款净增加额 28 | private Float cash_paid_by_subsidiaries; //取得子公司及其他营业单位支付的现金净额 29 | private Float increase_in_cash_paid; //增加质押和定期存款所支付的现金 30 | private Float cass_received_sub_abs; //其中子公司吸收现金 31 | private Float cass_received_sub_investments; //其中:子公司支付给少数股东的股利、利润 32 | private Float minority_shareholder_profit_loss; //少数股东损益 33 | private Float unrecognized_investment_losses; //未确认的投资损失 34 | private Float ncrease_deferred_income; //递延收益增加(减:减少) 35 | private Float projected_liability; //预计负债 36 | private Float increase_operational_payables; //经营性应付项目的增加 37 | private Float reduction_outstanding_amounts_less; //已完工尚未结算款的减少(减:增加) 38 | private Float reduction_outstanding_amounts_more; //已结算尚未完工款的增加(减:减少) 39 | private Float goods_sale_and_service_render_cash; //销售商品、提供劳务收到的现金 40 | private Float net_incr_dep_cob; //客户存款和同业存放款项净增加额 41 | private Float net_incr_loans_central_bank; //向中央银行借款净增加额(万元 42 | private Float net_incr_fund_borr_ofi; //拆入资金净增加额 43 | private Float tax_levy_refund; //收到的税费与返还 44 | private Float cash_paid_invest; //投资支付的现金 45 | private Float other_cash_recp_ral_oper_act; //收到的其他与经营活动有关的现金 46 | private Float stot_cash_inflows_oper_act; //经营活动现金流入小计 47 | private Float goods_and_services_cash_paid; //购买商品、接受劳务支付的现金 48 | private Float net_incr_clients_loan_adv; //客户贷款及垫款净增加额 49 | private Float net_incr_dep_cbob; //存放中央银行和同业款项净增加额 50 | private Float handling_chrg_paid; //支付利息、手续费及佣金的现金 51 | private Float cash_pay_beh_empl; //支付给职工以及为职工支付的现金 52 | private Float pay_all_typ_tax; //支付的各项税费 53 | private Float other_cash_pay_ral_oper_act; //支付其他与经营活动有关的现金 54 | private Float stot_cash_outflows_oper_act; //经营活动现金流出小计 55 | private Float net_cash_flows_oper_act; //经营活动产生的现金流量净额 56 | private Float cash_recp_disp_withdrwl_invest; //收回投资所收到的现金 57 | private Float cash_recp_return_invest; //取得投资收益所收到的现金 58 | private Float net_cash_recp_disp_fiolta; //处置固定资产、无形资产和其他长期投资收到的现金 59 | private Float other_cash_recp_ral_inv_act; //收到的其他与投资活动有关的现金 60 | private Float stot_cash_inflows_inv_act; //投资活动现金流入小计 61 | private Float cash_pay_acq_const_fiolta; //购建固定资产、无形资产和其他长期投资支付的现金 62 | private Float stot_cash_outflows_inv_act; //投资活动现金流出小计 63 | private Float net_cash_flows_inv_act; //投资活动产生的现金流量净额 64 | private Float cash_recp_cap_contrib; //吸收投资收到的现金 65 | private Float cash_recp_borrow; //取得借款收到的现金 66 | private Float proc_issue_bonds; //发行债券收到的现金 67 | private Float other_cash_recp_ral_fnc_act; //收到其他与筹资活动有关的现金 68 | private Float stot_cash_inflows_fnc_act; //筹资活动现金流入小计 69 | private Float cash_prepay_amt_borr; //偿还债务支付现金 70 | private Float cash_pay_dist_dpcp_int_exp; //分配股利、利润或偿付利息支付的现金 71 | private Float other_cash_pay_ral_fnc_act; //支付其他与筹资的现金 72 | private Float stot_cash_outflows_fnc_act; //筹资活动现金流出小计 73 | private Float net_cash_flows_fnc_act; //筹资活动产生的现金流量净额 74 | private Float eff_fx_flu_cash; //汇率变动对现金的影响 75 | private Float net_incr_cash_cash_equ; //现金及现金等价物净增加额 76 | private Float cash_cash_equ_beg_period; //期初现金及现金等价物余额 77 | private Float cash_cash_equ_end_period; //期末现金及现金等价物余额 78 | private Float net_profit; //净利润 79 | private Float plus_prov_depr_assets; //资产减值准备 80 | private Float depr_fa_coga_dpba; //固定资产折旧、油气资产折耗、生产性物资折旧 81 | private Float amort_intang_assets; //无形资产摊销 82 | private Float amort_lt_deferred_exp; //长期待摊费用摊销 83 | private Float decr_deferred_exp; //待摊费用的减少 84 | private Float incr_acc_exp; //预提费用的增加 85 | private Float loss_disp_fiolta; //处置固定资产、无形资产和其他长期资产的损失 86 | private Float loss_scr_fa; //固定资产报废损失 87 | private Float loss_fv_chg; //公允价值变动损失 88 | private Float fin_exp; //财务费用 89 | private Float invest_loss; //投资损失 90 | private Float decr_deferred_inc_tax_assets; //递延所得税资产减少 91 | private Float incr_deferred_inc_tax_liab; //递延所得税负债增加 92 | private Float decr_inventories; //存货的减少 93 | private Float decr_oper_payable; //经营性应收项目的减少 94 | private Float others; //其他 95 | private Float im_net_cash_flows_oper_act; //经营活动产生现金流量净额 96 | private Float conv_debt_into_cap; //债务转为资本 97 | private Float conv_corp_bonds_due_within_1y; //一年内到期的可转换公司债券 98 | private Float fa_fnc_leases; //融资租入固定资产 99 | private Float end_bal_cash; //现金的期末余额 100 | private Float less_beg_bal_cash; //现金的期初余额 101 | private Float plus_end_bal_cash_equ; //现金等价物的期末余额 102 | private Float less_beg_bal_cash_equ; //现金等价物的期初余额 103 | private Float im_net_incr_cash_cash_equ; //现金及现金等价物的净增加额 104 | 105 | } 106 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceHoldernum.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.commons.lang3.StringUtils; 6 | import java.io.Serializable; 7 | 8 | @Data 9 | @Slf4j 10 | public class XTickFinanceHoldernum implements Serializable { 11 | 12 | private int type; 13 | private String code = StringUtils.EMPTY; 14 | private String endDate;//截止日期 15 | private String declareDate;//公告日期 16 | private Float shareholder;//股东总数 17 | private Float shareholderA;//A股东户数 18 | private Float shareholderB;//B股东户数 19 | private Float shareholderH;//H股东户数 20 | private Float shareholderFloat;//已流通股东户数 21 | private Float shareholderOther;//未流通股东户数 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceIncome.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @Slf4j 11 | public class XTickFinanceIncome implements Serializable { 12 | private int type; 13 | private String code = StringUtils.EMPTY; 14 | private String m_timetag; //截止日期 15 | private String m_anntime; //披露日期 16 | private Float revenue_inc; //营业收入 17 | private Float earned_premium; //已赚保费 18 | private Float real_estate_sales_income; //房地产销售收入 19 | private Float total_operating_cost; //营业总成本 20 | private Float real_estate_sales_cost; //房地产销售成本 21 | private Float research_expenses; //研发费用 22 | private Float surrender_value; //退保金 23 | private Float net_payments; //赔付支出净额 24 | private Float net_withdrawal_ins_con_res; //提取保险合同准备金净额 25 | private Float policy_dividend_expenses; //保单红利支出 26 | private Float reinsurance_cost; //分保费用 27 | private Float change_income_fair_value; //公允价值变动收益 28 | private Float futures_loss; //期货损益 29 | private Float trust_income; //托管收益 30 | private Float subsidize_revenue; //补贴收入 31 | private Float other_business_profits; //其他业务利润 32 | private Float net_profit_excl_merged_int_inc; //被合并方在合并前实现净利润 33 | private Float int_inc; //利息收入 34 | private Float handling_chrg_comm_inc; //手续费及佣金收入 35 | private Float less_handling_chrg_comm_exp; //手续费及佣金支出 36 | private Float other_bus_cost; //其他业务成本 37 | private Float plus_net_gain_fx_trans; //汇兑收益 38 | private Float il_net_loss_disp_noncur_asset; //非流动资产处置收益 39 | private Float inc_tax; //所得税费用 40 | private Float unconfirmed_invest_loss; //未确认投资损失 41 | private Float net_profit_excl_min_int_inc; //归属于母公司所有者的净利润 42 | private Float less_int_exp; //利息支出 43 | private Float other_bus_inc; //其他业务收入 44 | private Float revenue; //营业总收入 45 | private Float total_expense; //营业成本 46 | private Float less_taxes_surcharges_ops; //营业税金及附加 47 | private Float sale_expense; //销售费用 48 | private Float less_gerl_admin_exp; //管理费用 49 | private Float financial_expense; //财务费用 50 | private Float less_impair_loss_assets; //资产减值损失 51 | private Float plus_net_invest_inc; //投资收益 52 | private Float incl_inc_invest_assoc_jv_entp; //联营企业和合营企业的投资收益 53 | private Float oper_profit; //营业利润 54 | private Float plus_non_oper_rev; //营业外收入 55 | private Float less_non_oper_exp; //营业外支出 56 | private Float tot_profit; //利润总额 57 | private Float net_profit_incl_min_int_inc; //净利润 58 | private Float net_profit_incl_min_int_inc_after; //净利润(扣除非经常性损益后) 59 | private Float minority_int_inc; //少数股东损益 60 | private Float s_fa_eps_basic; //基本每股收益 61 | private Float s_fa_eps_diluted; //稀释每股收益 62 | private Float total_income; //综合收益总额 63 | private Float total_income_minority; //归属于少数股东的综合收益总额 64 | private Float other_compreh_inc; //其他收益 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinancePershareIndex.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import lombok.Data; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.apache.commons.lang3.StringUtils; 6 | 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @Slf4j 11 | public class XTickFinancePershareIndex implements Serializable { 12 | private int type; 13 | private String code = StringUtils.EMPTY; 14 | private String m_timetag; //报告截止日 15 | private String m_anntime; //公告日 16 | private Float s_fa_ocfps; //每股经营活动现金流量 17 | private Float s_fa_bps; //每股净资产 18 | private Float s_fa_eps_basic; //基本每股收益 19 | private Float s_fa_eps_diluted; //稀释每股收益 20 | private Float s_fa_undistributedps; //每股未分配利润 21 | private Float s_fa_surpluscapitalps; //每股资本公积金 22 | private Float adjusted_earnings_per_share; //扣非每股收益 23 | private Float du_return_on_equity; //净资产收益率 24 | private Float sales_gross_profit; //销售毛利率 25 | private Float inc_revenue_rate; //主营收入同比增长 26 | private Float du_profit_rate; //净利润同比增长 27 | private Float inc_net_profit_rate; //归属于母公司所有者的净利润同比增长 28 | private Float adjusted_net_profit_rate; //扣非净利润同比增长 29 | private Float inc_total_revenue_annual; //营业总收入滚动环比增长 30 | private Float inc_net_profit_to_shareholders_annual; //归属净利润滚动环比增长 31 | private Float adjusted_profit_to_profit_annual; //扣非净利润滚动环比增长 32 | private Float equity_roe; //加权净资产收益率 33 | private Float net_roe; //摊薄净资产收益率 34 | private Float total_roe; //摊薄总资产收益率 35 | private Float gross_profit; //毛利率 36 | private Float net_profit; //净利率 37 | private Float actual_tax_rate; //实际税率 38 | private Float pre_pay_operate_income; //预收款 / 营业收入 39 | private Float sales_cash_flow; //销售现金流 / 营业收入 40 | private Float gear_ratio; //资产负债比率 41 | private Float inventory_turnover; //存货周转率 42 | 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceTop10flowholder.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import lombok.Data; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.apache.commons.lang3.StringUtils; 7 | import java.io.Serializable; 8 | 9 | @Data 10 | @Slf4j 11 | public class XTickFinanceTop10flowholder implements Serializable { 12 | private int type; 13 | private String code = StringUtils.EMPTY; 14 | private String endDate;//截止日期 15 | private String declareDate;//公告日期 16 | private String name;//股东名称 17 | private Float quantity;//持股数量 18 | private String reason;//变动原因 19 | private Float ratio;//持股比例 20 | private String nature;//股份性质 21 | @JsonProperty("rank") 22 | private int rankId;//持股排名 23 | 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/bean/finance/XTickFinanceTop10holder.java: -------------------------------------------------------------------------------- 1 | package org.xtick.bean.finance; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import lombok.Data; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.apache.commons.lang3.StringUtils; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Slf4j 12 | public class XTickFinanceTop10holder implements Serializable { 13 | private int type; 14 | private String code = StringUtils.EMPTY; 15 | private String endDate;//截止日期 16 | private String declareDate;//公告日期 17 | private String name;//股东名称 18 | private Float quantity;//持股数量 19 | private String reason;//变动原因 20 | private Float ratio;//持股比例 21 | private String nature;//股份性质 22 | @JsonProperty("rank") 23 | private int rankId;//持股排名 24 | 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/constant/MethodType.java: -------------------------------------------------------------------------------- 1 | package org.xtick.constant; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.ToString; 5 | 6 | /** 7 | * @author Administrator 8 | */ 9 | 10 | @AllArgsConstructor 11 | @ToString 12 | public enum MethodType { 13 | GET, 14 | POST 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/constant/XTickConst.java: -------------------------------------------------------------------------------- 1 | package org.xtick.constant; 2 | 3 | 4 | import com.google.common.collect.ImmutableSet; 5 | 6 | import java.time.format.DateTimeFormatter; 7 | import java.util.Set; 8 | 9 | public interface XTickConst { 10 | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 11 | String token = "";//登录XTick官网,获取token 12 | 13 | Set reports = ImmutableSet.builder()//财务报表 14 | .add("'Balance'") 15 | .add("Income") 16 | .add("CashFlow") 17 | .add("Capital") 18 | .add("Holdernum") 19 | .add("Top10holder") 20 | .add("Top10flowholder") 21 | .add("Pershareindex") 22 | .build(); 23 | 24 | Set dividends = ImmutableSet.builder() 25 | .add("none") 26 | .add("front") 27 | .add("back") 28 | .add("front_ratio") 29 | .add("back_ratio") 30 | .build(); 31 | 32 | Set markets = ImmutableSet.builder() 33 | .add("SZ") 34 | .add("SH") 35 | .add("HK") 36 | .add("BJ") 37 | .build(); 38 | 39 | Set timeKlinePeriods = ImmutableSet.builder() 40 | .add("1m") 41 | .add("5m") 42 | .add("15m") 43 | .add("30m") 44 | .add("1h") 45 | .add("2h") 46 | .add("1d") 47 | .build(); 48 | 49 | Set historyKlinePeriods = ImmutableSet.builder() 50 | .add("1m") 51 | .add("5m") 52 | .add("15m") 53 | .add("30m") 54 | .add("1h") 55 | .add("2h") 56 | .add("1d") 57 | .add("1w") 58 | .add("1mon") 59 | .add("1q") 60 | .add("1hy") 61 | .add("1y") 62 | .build(); 63 | 64 | Set allPeriods = ImmutableSet.builder() 65 | .add("tick") 66 | .add("time") 67 | .add("1m") 68 | .add("5m") 69 | .add("15m") 70 | .add("30m") 71 | .add("1h") 72 | .add("2h") 73 | .add("1d") 74 | .add("1w") 75 | .add("1mon") 76 | .add("1q") 77 | .add("1hy") 78 | .add("1y") 79 | .build(); 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/http/HttpClientRest.java: -------------------------------------------------------------------------------- 1 | package org.xtick.http; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.apache.http.Header; 6 | import org.apache.http.client.config.RequestConfig; 7 | import org.apache.http.client.entity.UrlEncodedFormEntity; 8 | import org.apache.http.client.methods.CloseableHttpResponse; 9 | import org.apache.http.client.methods.HttpGet; 10 | import org.apache.http.client.methods.HttpPost; 11 | import org.apache.http.impl.client.CloseableHttpClient; 12 | import org.apache.http.impl.client.HttpClientBuilder; 13 | import org.apache.http.message.BasicNameValuePair; 14 | import org.apache.http.util.EntityUtils; 15 | import org.xtick.util.XTickUtil; 16 | 17 | import java.io.IOException; 18 | import java.io.InputStream; 19 | import java.util.Map; 20 | import java.util.stream.Collectors; 21 | 22 | /** 23 | * @author Administrator 24 | */ 25 | 26 | @Getter 27 | @Setter 28 | public class HttpClientRest { 29 | public final static HttpClientRest intance = new HttpClientRest(); 30 | private CloseableHttpClient httpClient = HttpClientBuilder.create().build(); 31 | 32 | private HttpClientRest() { 33 | } 34 | 35 | public void reInit() { 36 | httpClient = HttpClientBuilder.create().build(); 37 | } 38 | 39 | public static HttpClientRest getIntance() { 40 | return HttpClientRest.intance; 41 | } 42 | 43 | public String get(String url, Header[] headers) throws IOException { 44 | RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(12000).setConnectionRequestTimeout(12000).setSocketTimeout(12000).setExpectContinueEnabled(false).setCircularRedirectsAllowed(true).build(); 45 | return get(url, headers, requestConfig); 46 | } 47 | 48 | public String get(String url, Header[] headers, RequestConfig requestConfig) throws IOException { 49 | HttpGet httpGet = new HttpGet(url); 50 | httpGet.setHeaders(headers); 51 | httpGet.setConfig(requestConfig); 52 | httpGet.setConfig(RequestConfig.custom().setConnectTimeout(12000).setConnectionRequestTimeout(12000).setSocketTimeout(12000).setExpectContinueEnabled(false).setCircularRedirectsAllowed(true).build()); 53 | try (CloseableHttpResponse response = httpClient.execute(httpGet)) { 54 | return EntityUtils.toString(response.getEntity()); 55 | } 56 | } 57 | 58 | public String get(String url, Map para) throws IOException { 59 | RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(12000).setConnectionRequestTimeout(12000).setSocketTimeout(12000).setExpectContinueEnabled(false).setCircularRedirectsAllowed(true).build(); 60 | return get(url, para, requestConfig); 61 | } 62 | 63 | public String get(String url, Map para, RequestConfig requestConfig) throws IOException { 64 | HttpGet httpGet = new HttpGet(String.format("%s?%s", url, para.entrySet().stream().map(entry -> String.format("%s=%s", entry.getKey(), entry.getValue())).collect(Collectors.joining("&")))); 65 | httpGet.setConfig(requestConfig); 66 | try (CloseableHttpResponse response = httpClient.execute(httpGet)) { 67 | if (Boolean.parseBoolean(para.get("zip").toString())) { 68 | return XTickUtil.processData(response.getEntity().getContent()); 69 | } 70 | return EntityUtils.toString(response.getEntity()); 71 | } 72 | } 73 | 74 | 75 | public String post(String url, Map para) throws IOException { 76 | RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(12000).setConnectionRequestTimeout(12000).setSocketTimeout(12000).setExpectContinueEnabled(false).setCircularRedirectsAllowed(true).build(); 77 | return post(url, para, requestConfig); 78 | } 79 | 80 | public String post(String url, Map para, RequestConfig requestConfig) throws IOException { 81 | HttpPost httpPost = new HttpPost(url); 82 | httpPost.setConfig(requestConfig); 83 | httpPost.setEntity(new UrlEncodedFormEntity(para.entrySet().stream().map(entry -> new BasicNameValuePair(entry.getKey(), String.valueOf(entry.getValue()))).collect(Collectors.toList()))); 84 | try (CloseableHttpResponse response = httpClient.execute(httpPost)) { 85 | if (Boolean.parseBoolean(para.get("zip").toString())) { 86 | return XTickUtil.processData(response.getEntity().getContent()); 87 | } 88 | return EntityUtils.toString(response.getEntity()); 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/http/Retry.java: -------------------------------------------------------------------------------- 1 | package org.xtick.http; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.xtick.util.XTickUtil; 6 | 7 | import java.util.ArrayList; 8 | import java.util.List; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | public class Retry { 12 | public static List exec(Supplier> execBody) { 13 | return exec(execBody, 1000, 10); 14 | } 15 | 16 | private static final Logger log = LoggerFactory.getLogger(Retry.class); 17 | 18 | public static List exec(Supplier> execBody, int retryTimes, int intervalTimes) { 19 | boolean isLoop = true; 20 | int count = 0; 21 | while (isLoop && count++ < retryTimes) { 22 | try { 23 | List result = execBody.get(); 24 | isLoop = result == null; 25 | if (isLoop == false) { 26 | return result; 27 | } 28 | log.info("第{}次重试获取数据。", count); 29 | XTickUtil.sleepSeconds(intervalTimes); 30 | } catch (Exception e) { 31 | log.error("第{}次重试获取数据失败。", count, e); 32 | XTickUtil.sleepSeconds(intervalTimes); 33 | } 34 | } 35 | return new ArrayList<>(); 36 | } 37 | 38 | public static boolean execBoolean(Supplier execBody, int retryTimes, int intervalTimes) { 39 | boolean isLoop = true; 40 | int count = 0; 41 | while (isLoop && count++ < retryTimes) { 42 | try { 43 | boolean isSuccess = execBody.get(); 44 | if (isSuccess) { 45 | return true; 46 | } 47 | log.info("第{}次重试获取数据。", count); 48 | TimeUnit.SECONDS.sleep(intervalTimes); 49 | } catch (Exception e) { 50 | log.error("第{}次重试获取数据失败。", count, e); 51 | XTickUtil.sleepSeconds(intervalTimes); 52 | } 53 | } 54 | return false; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/http/Supplier.java: -------------------------------------------------------------------------------- 1 | package org.xtick.http; 2 | 3 | import java.io.IOException; 4 | 5 | @FunctionalInterface 6 | public interface Supplier { 7 | 8 | T get() throws IOException; 9 | } -------------------------------------------------------------------------------- /src/main/java/org/xtick/util/JsonUtil.java: -------------------------------------------------------------------------------- 1 | package org.xtick.util; 2 | 3 | import com.fasterxml.jackson.core.JsonProcessingException; 4 | import com.fasterxml.jackson.core.StreamReadConstraints; 5 | import com.fasterxml.jackson.databind.DeserializationFeature; 6 | import com.fasterxml.jackson.databind.JsonNode; 7 | import com.fasterxml.jackson.databind.ObjectMapper; 8 | import com.fasterxml.jackson.databind.SerializationFeature; 9 | import lombok.extern.slf4j.Slf4j; 10 | 11 | import java.io.IOException; 12 | import java.util.List; 13 | import java.util.Objects; 14 | 15 | @Slf4j 16 | public class JsonUtil { 17 | private final static ObjectMapper mapper; 18 | 19 | static { 20 | mapper = new ObjectMapper();// 忽略json中在对象不存在对应属性 21 | mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 忽略空bean转json错误 22 | mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 23 | mapper.getFactory().setStreamReadConstraints(StreamReadConstraints.builder().maxStringLength(40000000).build()); 24 | } 25 | 26 | public static JsonNode toJsonObj(String content) throws JsonProcessingException { 27 | return mapper.readTree(content); 28 | } 29 | 30 | public static String toJson(Object obj) { 31 | if (Objects.isNull(obj)) { 32 | return ""; 33 | } 34 | if (obj instanceof String) { 35 | return (String) obj; 36 | } 37 | try { 38 | return mapper.writeValueAsString(obj); 39 | } catch (IOException e) { 40 | log.error("obj to json error.", e); 41 | } 42 | return null; 43 | } 44 | 45 | 46 | public static String toJsonWithStrFormat(Object obj) { 47 | if (obj == null) { 48 | return null; 49 | } 50 | if (obj instanceof String) { 51 | return (String) obj; 52 | } 53 | try { 54 | return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj); 55 | } catch (IOException e) { 56 | log.error("obj to json error.", e); 57 | } 58 | return null; 59 | } 60 | 61 | 62 | public static T jsonToObj(String content, Class clazz) { 63 | try { 64 | return mapper.readValue(content, clazz); 65 | } catch (Exception e) { 66 | log.error("Failed to Json to Object.content={}", content,e); 67 | } 68 | return null; 69 | } 70 | 71 | 72 | public static List jsonToList(String content, Class clazz) { 73 | try { 74 | return mapper.readValue(content, mapper.getTypeFactory().constructCollectionType(List.class, clazz)); 75 | } catch (Exception e) { 76 | log.error("Failed to Json to Object", e); 77 | } 78 | return null; 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /src/main/java/org/xtick/util/XTickUtil.java: -------------------------------------------------------------------------------- 1 | package org.xtick.util; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.apache.catalina.util.StringUtil; 5 | import org.apache.commons.lang3.StringUtils; 6 | import org.apache.http.util.EntityUtils; 7 | 8 | import java.io.*; 9 | import java.util.Objects; 10 | import java.util.concurrent.TimeUnit; 11 | import java.util.function.Consumer; 12 | import java.util.zip.ZipEntry; 13 | import java.util.zip.ZipInputStream; 14 | 15 | @Slf4j 16 | public class XTickUtil { 17 | public static void sleepSeconds(long seconds) { 18 | try { 19 | TimeUnit.SECONDS.sleep(seconds); 20 | } catch (Exception e) { 21 | log.info("Failed to sleep ", e); 22 | } 23 | } 24 | 25 | public static String processData(InputStream inputStream) { 26 | try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { 27 | ZipEntry entry; 28 | while ((entry = zipInputStream.getNextEntry()) != null) { 29 | if (entry.getName().endsWith(".json")) { 30 | byte[] buffer = new byte[1024]; 31 | int len; 32 | StringBuilder sb = new StringBuilder(); 33 | while ((len = zipInputStream.read(buffer)) > 0) { 34 | sb.append(new String(buffer, 0, len)); 35 | } 36 | return sb.toString(); 37 | } 38 | } 39 | return convertInputStreamToString(inputStream); 40 | } catch (Exception e) { 41 | System.err.println(String.format("解析数据失败。" + e.getMessage())); 42 | } 43 | return ""; 44 | } 45 | 46 | public static String convertInputStreamToString(InputStream inputStream) throws IOException { 47 | StringBuilder result = new StringBuilder(); 48 | try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { 49 | String line; 50 | while ((line = reader.readLine()) != null) { 51 | result.append(line); 52 | } 53 | } 54 | return result.toString(); 55 | } 56 | 57 | public static void processData(InputStream inputStream, Consumer consumer) { 58 | try (ZipInputStream zipInputStream = new ZipInputStream(inputStream)) { 59 | ZipEntry entry; 60 | while ((entry = zipInputStream.getNextEntry()) != null) { 61 | if (entry.getName().endsWith(".json")) { 62 | byte[] buffer = new byte[1024]; 63 | int len; 64 | StringBuilder sb = new StringBuilder(); 65 | while ((len = zipInputStream.read(buffer)) > 0) { 66 | sb.append(new String(buffer, 0, len)); 67 | } 68 | consumer.accept(sb.toString()); 69 | return; 70 | } 71 | } 72 | consumer.accept(convertInputStreamToString(inputStream)); 73 | } catch (Exception e) { 74 | System.err.println(String.format("解析数据失败。" + e.getMessage())); 75 | } 76 | } 77 | } 78 | --------------------------------------------------------------------------------