From 2c2fcc0bab8640889ee0d61a5673c047d5207911 Mon Sep 17 00:00:00 2001 From: xiaoliuhu Date: Mon, 6 May 2024 10:40:33 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix:=E8=B0=83=E8=AF=95=E8=82=A1=E7=A5=A8K?= =?UTF-8?q?=E7=BA=BF=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/lesg/RefinitivConsumer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java index 469aa2c..6f30a41 100644 --- a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java +++ b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java @@ -319,7 +319,7 @@ public class RefinitivConsumer implements ApplicationRunner { HttpResponse response = HttpUtil.createGet(resourceEndpoint) .form("eventTypes","trade,quote") - .form("start",start) + .form("start","2023-05-11T18:30:12.000000000Z") .form("count",countback) .form("interval",interval) .header("Authorization","Bearer " + token) From 5c726fa5fa14fc89554bd01d40efaebe7ee24381 Mon Sep 17 00:00:00 2001 From: vercel Date: Mon, 6 May 2024 15:28:00 +0800 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20retifive=20K=E7=BA=BF=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/RetifiveStockHistoryResponse.java | 17 +++++++++ .../stock/market/lesg/RefinitivConsumer.java | 36 +++++++++++++------ .../market/web/RefinitivApiController.java | 3 +- 3 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 src/main/java/cn/stock/market/dto/RetifiveStockHistoryResponse.java diff --git a/src/main/java/cn/stock/market/dto/RetifiveStockHistoryResponse.java b/src/main/java/cn/stock/market/dto/RetifiveStockHistoryResponse.java new file mode 100644 index 0000000..4d7f002 --- /dev/null +++ b/src/main/java/cn/stock/market/dto/RetifiveStockHistoryResponse.java @@ -0,0 +1,17 @@ +package cn.stock.market.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class RetifiveStockHistoryResponse { + private String s; + private List t; + private List o; + private List h; + private List l; + private List c; + private List v; + +} \ No newline at end of file diff --git a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java index 6f30a41..fab393f 100644 --- a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java +++ b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; import cn.stock.market.domain.basic.entity.RetifiveStock; +import cn.stock.market.dto.RetifiveStockHistoryResponse; import cn.stock.market.dto.RetifiveStockInfo; import cn.stock.market.dto.StockHistoryResponse; import cn.stock.market.utils.DateTimeUtil; @@ -15,6 +16,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.refinitiv.ema.access.*; import com.refinitiv.ema.rdm.EmaRdm; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; @@ -24,12 +26,17 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.TimeUnit; +import static java.time.format.DateTimeFormatter.ISO_OFFSET_DATE_TIME; import static java.util.concurrent.TimeUnit.SECONDS; /** @@ -257,8 +264,9 @@ public class RefinitivConsumer implements ApplicationRunner { } } - public StockHistoryResponse getKLink(String symbol,String resolution){ - StockHistoryResponse result = new StockHistoryResponse(); + @SneakyThrows + public RetifiveStockHistoryResponse getKLink(String symbol, String resolution){ + RetifiveStockHistoryResponse result = new RetifiveStockHistoryResponse(); String token = getToken(); if(StringUtils.isBlank(token)){ throw new SysTipsException("token为空"); @@ -317,9 +325,13 @@ public class RefinitivConsumer implements ApplicationRunner { resourceEndpoint = baseURLHistory + symbol; } + // 创建DateTimeFormatter以匹配所需的格式 + DateTimeFormatter formatterIso = DateTimeFormatter.ISO_INSTANT; + // 格式化Instant + String startStr = start.toInstant().atZone(ZoneId.of("UTC")).format(formatterIso); HttpResponse response = HttpUtil.createGet(resourceEndpoint) .form("eventTypes","trade,quote") - .form("start","2023-05-11T18:30:12.000000000Z") + .form("start",startStr) .form("count",countback) .form("interval",interval) .header("Authorization","Bearer " + token) @@ -334,20 +346,24 @@ public class RefinitivConsumer implements ApplicationRunner { List h = new ArrayList<>(); // 最高价 List l = new ArrayList<>();//最低价 List c = new ArrayList<>();//当前价 - List v = new ArrayList<>();//交易量 + List v = new ArrayList<>();//交易量 for(int i = 0; i < dateArray.size(); i++){ JSONArray date = dateArray.getJSONArray(i); + if(StringUtils.equals("D",resolution) || StringUtils.equals("W",resolution) || StringUtils.equals("M",resolution)){ + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date d = formatter.parse(date.get(0).toString()); + t.add(d.getTime()); + }else { + Instant instant = Instant.parse(date.get(0).toString()); - Instant instant = Instant.parse(date.get(0).toString()); - long timestampMillis = instant.toEpochMilli(); - t.add(timestampMillis); - + long timestampMillis = instant.getEpochSecond(); + t.add(timestampMillis); + } o.add(Double.valueOf(date.get(3).toString())); - h.add(Double.valueOf(date.get(1).toString())); l.add(Double.valueOf(date.get(2).toString())); c.add(Double.valueOf(date.get(4).toString())); - v.add(Long.valueOf(date.get(6).toString())); + v.add(Double.valueOf(date.get(6).toString())); } result.setT(t); result.setO(o); diff --git a/src/main/java/cn/stock/market/web/RefinitivApiController.java b/src/main/java/cn/stock/market/web/RefinitivApiController.java index 91b42fd..337594f 100644 --- a/src/main/java/cn/stock/market/web/RefinitivApiController.java +++ b/src/main/java/cn/stock/market/web/RefinitivApiController.java @@ -3,6 +3,7 @@ package cn.stock.market.web; import cn.hutool.core.util.StrUtil; import cn.stock.market.domain.basic.entity.RetifiveStock; import cn.stock.market.domain.basic.service.RetifiveStockService; +import cn.stock.market.dto.RetifiveStockHistoryResponse; import cn.stock.market.dto.RetifiveStockInfo; import cn.stock.market.lesg.RefinitivConsumer; import cn.stock.market.listener.AppClient; @@ -133,7 +134,7 @@ public class RefinitivApiController { } - @ApiOperation(value = "查询股票K线", httpMethod = "GET", response = RetifiveStockInfo.class) + @ApiOperation(value = "查询股票K线", httpMethod = "GET", response = RetifiveStockHistoryResponse.class) @ApiImplicitParams({ @ApiImplicitParam(name = "symbol",value = "股票对应代码(symbol)",dataType ="String",required = true, paramType = "query"), @ApiImplicitParam(name = "symbol",value = "股票对应代码(symbol)",dataType ="String",required = true, paramType = "query"), From 44ee0e1a60ab879bc4387ed7d5999bc916237548 Mon Sep 17 00:00:00 2001 From: vercel Date: Mon, 6 May 2024 15:43:05 +0800 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20retifive=20K=E7=BA=BF=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/stock/market/lesg/RefinitivConsumer.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java index fab393f..576f9c5 100644 --- a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java +++ b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java @@ -325,9 +325,7 @@ public class RefinitivConsumer implements ApplicationRunner { resourceEndpoint = baseURLHistory + symbol; } - // 创建DateTimeFormatter以匹配所需的格式 DateTimeFormatter formatterIso = DateTimeFormatter.ISO_INSTANT; - // 格式化Instant String startStr = start.toInstant().atZone(ZoneId.of("UTC")).format(formatterIso); HttpResponse response = HttpUtil.createGet(resourceEndpoint) .form("eventTypes","trade,quote") @@ -352,10 +350,9 @@ public class RefinitivConsumer implements ApplicationRunner { if(StringUtils.equals("D",resolution) || StringUtils.equals("W",resolution) || StringUtils.equals("M",resolution)){ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date d = formatter.parse(date.get(0).toString()); - t.add(d.getTime()); + t.add(d.getTime() / 1000); }else { Instant instant = Instant.parse(date.get(0).toString()); - long timestampMillis = instant.getEpochSecond(); t.add(timestampMillis); } From 1789c3ea793738a0b9ce84d382b316e178beb77d Mon Sep 17 00:00:00 2001 From: vercel Date: Mon, 6 May 2024 17:23:49 +0800 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/stock/market/lesg/RefinitivConsumer.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java index 576f9c5..7affdce 100644 --- a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java +++ b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java @@ -285,16 +285,16 @@ public class RefinitivConsumer implements ApplicationRunner { interval = "PT1M"; resourceEndpoint = baseURLToday + symbol; }else - if(StringUtils.equals("3m",resolution)){ + if(StringUtils.equals("5m",resolution)){ start = DateTimeUtil.getDayOfMorning(start,0); countback = 150; - interval = "PT3M"; + interval = "PT5M"; resourceEndpoint = baseURLToday + symbol; }else - if(StringUtils.equals("15m",resolution)){ + if(StringUtils.equals("10m",resolution)){ start = DateTimeUtil.getDayOfMorning(start,0); countback = 50; - interval = "PT15M"; + interval = "PT10M"; resourceEndpoint = baseURLToday + symbol; }else if(StringUtils.equals("30m",resolution)){ @@ -347,6 +347,9 @@ public class RefinitivConsumer implements ApplicationRunner { List v = new ArrayList<>();//交易量 for(int i = 0; i < dateArray.size(); i++){ JSONArray date = dateArray.getJSONArray(i); + if(date.get(1) == null){ + continue; + } if(StringUtils.equals("D",resolution) || StringUtils.equals("W",resolution) || StringUtils.equals("M",resolution)){ SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date d = formatter.parse(date.get(0).toString()); From 1e6b6adbe750cb24eaf3c308e3913eb2ae25cd32 Mon Sep 17 00:00:00 2001 From: vercel Date: Tue, 7 May 2024 09:42:26 +0800 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=E8=8E=B7=E5=8F=96token=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../stock/market/lesg/RefinitivConsumer.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java index 7affdce..18987af 100644 --- a/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java +++ b/src/main/java/cn/stock/market/lesg/RefinitivConsumer.java @@ -403,7 +403,7 @@ public class RefinitivConsumer implements ApplicationRunner { .basicAuth(appKey,"") .execute(); if(response.getStatus() != 200){ - throw new SysTipsException("获取token失败"); + return getNewToken(); } JSONObject data = JSONObject.parseObject(response.body()); data.put("expiry_tm",System.currentTimeMillis() + (Long.valueOf(data.get("expires_in").toString())-10)); @@ -412,6 +412,27 @@ public class RefinitivConsumer implements ApplicationRunner { redisTemplate.expire("token",1, TimeUnit.DAYS); return toekn; } +// HttpResponse response = HttpUtil.createPost(tokenUrl) +// .form("username",tokenUsername) +// .form("password",tokenPassword) +// .form("grant_type","password") +// .form("scope",SCOPE) +// .form("takeExclusiveSignOnControl","true") +// .header("Content-Type", "application/x-www-form-urlencoded") +// .basicAuth(appKey,"") +// .execute(); +// if(response.getStatus() != 200){ +// throw new SysTipsException("获取token失败"); +// } +// JSONObject data = JSONObject.parseObject(response.body()); +// data.put("expiry_tm",System.currentTimeMillis() + (Long.valueOf(data.get("expires_in").toString())-10)); +// String toekn = data.toString(); +// redisTemplate.opsForValue().set("token",toekn); +// redisTemplate.expire("token",1, TimeUnit.DAYS); + return getNewToken(); + } + + public String getNewToken(){ HttpResponse response = HttpUtil.createPost(tokenUrl) .form("username",tokenUsername) .form("password",tokenPassword)