|
|
@@ -15,9 +15,11 @@ import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.StopWatch;
|
|
|
import top.lvzhiqiang.config.InitRunner;
|
|
|
import top.lvzhiqiang.config.WorkWeixinProperties;
|
|
|
import top.lvzhiqiang.entity.CoinHistoryOrder;
|
|
|
+import top.lvzhiqiang.entity.CoinMixTrader;
|
|
|
import top.lvzhiqiang.mapper.CoinMapper;
|
|
|
import top.lvzhiqiang.service.CoinService;
|
|
|
import top.lvzhiqiang.util.*;
|
|
|
@@ -122,6 +124,75 @@ public class CoinServiceImpl implements CoinService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ public void syncData4TraderList() {
|
|
|
+ StopWatch stopWatch = new StopWatch();
|
|
|
+ stopWatch.start();
|
|
|
+
|
|
|
+ // 获取交易员列表
|
|
|
+ Map<String, String> paramMap = new LinkedHashMap<>();
|
|
|
+ paramMap.put("sortRule", "composite");
|
|
|
+ paramMap.put("sortFlag", "desc");
|
|
|
+ paramMap.put("languageType", "en-US");
|
|
|
+ paramMap.put("pageSize", "20");
|
|
|
+
|
|
|
+ int i = 0;
|
|
|
+ String url = "/api/mix/v1/trace/traderList";
|
|
|
+ JSONObject response;
|
|
|
+ int totalNum = 0;
|
|
|
+ for (; ; ) {
|
|
|
+ paramMap.put("pageNo", String.valueOf(++i));
|
|
|
+ String signQueryString = paramMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
|
|
|
+ response = requestApi4Common(url, signQueryString, null, JsoupUtil.HTTP_GET, paramMap);
|
|
|
+ JSONArray dataList = response.getJSONArray("data");
|
|
|
+ if (dataList.size() == 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ syncData4TraderListSub(dataList);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("syncData4TraderListSub error,paramMap={}", paramMap, e);
|
|
|
+ }
|
|
|
+
|
|
|
+ totalNum += dataList.size();
|
|
|
+ }
|
|
|
+
|
|
|
+ log.warn("syncData4TraderList 结束:time={},totalNum={}", stopWatch.getTotalTimeSeconds(), totalNum);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
|
|
|
+ public void syncData4TraderListSub(JSONArray dataList) {
|
|
|
+ coinMapper.insertMixTradeList(parseMixTradeList(dataList));
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<CoinMixTrader> parseMixTradeList(JSONArray dataList) {
|
|
|
+ List<CoinMixTrader> mixTraderList = JSONArray.parseArray(dataList.toJSONString(), CoinMixTrader.class);
|
|
|
+ mixTraderList.stream().forEach(e -> {
|
|
|
+ Map<String, String> columnMap = e.getColumnList().stream().filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toMap(
|
|
|
+ object -> {
|
|
|
+ JSONObject item = (JSONObject) object;
|
|
|
+ return item.getString("describe");
|
|
|
+ },
|
|
|
+ object -> {
|
|
|
+ JSONObject item = (JSONObject) object;
|
|
|
+ return item.getString("value");
|
|
|
+ }
|
|
|
+ ));
|
|
|
+ e.setRoi(columnMap.get("ROI"));
|
|
|
+ e.setTotalProfit(columnMap.get("Total PnL"));
|
|
|
+ e.setTotalFollowersProfit(columnMap.get("Total followers PnL"));
|
|
|
+ e.setAum(columnMap.get("AUM"));
|
|
|
+ e.setMaxCallbackRate(columnMap.get("Max drawdown"));
|
|
|
+ e.setLast3wWinRate(columnMap.get("Last 3W win rate"));
|
|
|
+ e.setAverageWinRate(StringUtils.isNotEmpty(e.getAverageWinRate()) ? new BigDecimal(e.getAverageWinRate()).setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00");
|
|
|
+ });
|
|
|
+
|
|
|
+ return mixTraderList;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public String orderDetail(String trackingNo) {
|
|
|
Map<String, String> paramMap = new LinkedHashMap<>();
|
|
|
paramMap.put("traderId", "b1b5467f8bb73f53ac97");
|
|
|
@@ -258,12 +329,13 @@ public class CoinServiceImpl implements CoinService {
|
|
|
String content = "<div class=\"highlight\">交易对:" + order.getString("symbol") + "</div>" +
|
|
|
"<div>交易方向:" + InitRunner.publicParamsMap.get("side").getString(order.getString("side")) + "</div>" +
|
|
|
"<div>杠杆倍数:" + order.getString("leverage") + "</div>" +
|
|
|
- "<div>成交均价:" + order.getString("openPrice") + "</div>" +
|
|
|
+ "<div>成交均价:" + order.getString("priceAvg") + "</div>" +
|
|
|
+ "<div>委托价格:" + order.getString("price") + "</div>" +
|
|
|
"<div>订单状态:" + InitRunner.publicParamsMap.get("state").getString(order.getString("state")) + "</div>" +
|
|
|
"<div>订单类型:" + InitRunner.publicParamsMap.get("orderType").getString(order.getString("orderType")) + "</div>" +
|
|
|
"<div class=\"gray\">订单时间:" + DateUtils.longToString(order.getLong("cTime")) + "</div>";
|
|
|
JSONObject params = new JSONObject();
|
|
|
- params.put("title", order.getString("side").contains("open") ? "开仓" : "平仓" + "监控报警");
|
|
|
+ params.put("title", (order.getString("side").contains("open") ? "合约开单" : "合约平单") + "监控报警");
|
|
|
params.put("logUrl", "https://jav.lvzhiqiang.top/coin/orderDetail2/" + orderId + "/" + symbol);
|
|
|
params.put("btnTxt", "订单详情");
|
|
|
SpringUtils.getBean(CoinServiceImpl.class).monitorAlarm4APP_TEXT_CARD(content, params);
|
|
|
@@ -363,12 +435,12 @@ public class CoinServiceImpl implements CoinService {
|
|
|
"<div>持仓方向:" + InitRunner.publicParamsMap.get("holdSide").getString(order.getString("holdSide")) + "</div>" +
|
|
|
"<div>杠杆倍数:" + order.getString("leverage") + "</div>" +
|
|
|
"<div>开仓均价:" + order.getString("openPrice") + "</div>" +
|
|
|
- "<div>开仓时间:" + DateUtils.longToString(order.getLong("openTime")) + "</div>" +
|
|
|
"<div>止盈价:" + order.getString("takeProfitPrice") + "</div>" +
|
|
|
"<div>止损价:" + order.getString("stopLossPrice") + "</div>" +
|
|
|
- "<div class=\"gray\">交易员:" + "hale" + "</div>";
|
|
|
+ "<div >交易员:" + "hale" + "</div>" +
|
|
|
+ "<div class=\"gray\">开仓时间:" + DateUtils.longToString(order.getLong("openTime")) + "</div>";
|
|
|
JSONObject params = new JSONObject();
|
|
|
- params.put("title", "跟单员监控报警");
|
|
|
+ params.put("title", "交易员开单监控报警");
|
|
|
params.put("logUrl", "https://jav.lvzhiqiang.top/coin/orderDetail/" + order.getString("trackingNo"));
|
|
|
params.put("btnTxt", "跟单详情");
|
|
|
SpringUtils.getBean(CoinServiceImpl.class).monitorAlarm4APP_TEXT_CARD(content, params);
|