Przeglądaj źródła

add:新增同步交易员列表定时任务v1

tujidelv 2 lat temu
rodzic
commit
a3ce9f3633

+ 8 - 0
src/main/java/top/lvzhiqiang/config/MyCoinJobs.java

@@ -34,4 +34,12 @@ public class MyCoinJobs {
         String pageSize = "100";
         coinService.syncData(startTime, endTime, pageSize);
     }
+
+    /**
+     * 同步交易员列表
+     */
+    @Scheduled(cron = "0 0 5 * * ?", zone = SCHEDULED_ZONE)
+    public void syncData4TraderList() {
+        coinService.syncData4TraderList();
+    }
 }

+ 147 - 0
src/main/java/top/lvzhiqiang/entity/CoinMixTrader.java

@@ -0,0 +1,147 @@
+package top.lvzhiqiang.entity;
+
+import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * coin-合约交易员表
+ *
+ * @author lvzhiqiang
+ * 2023/9/24 10:41
+ */
+@Data
+public class CoinMixTrader implements Serializable {
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     *
+     */
+    private String traderUid;
+
+    /**
+     *
+     */
+    private String traderNickName;
+
+    /**
+     *
+     */
+    private String maxFollowCount;
+
+    /**
+     *
+     */
+    private String followCount;
+
+    /**
+     *
+     */
+    private String totalFollowers;
+
+    /**
+     *
+     */
+    private String profitOrderCount;
+
+    /**
+     *
+     */
+    private String lossOrderCount;
+
+    /**
+     *
+     */
+    private String totalTradeCount;
+
+    /**
+     *
+     */
+    private String dailyProfitRate;
+
+    /**
+     *
+     */
+    private String dailyProfit;
+
+    /**
+     *
+     */
+    private String copyTradeDays;
+
+    /**
+     *
+     */
+    private String roi;
+
+    /**
+     *
+     */
+    private String totalProfit;
+
+    /**
+     *
+     */
+    private String totalFollowersProfit;
+
+    /**
+     *
+     */
+    private String aum;
+
+    /**
+     *
+     */
+    private String maxCallbackRate;
+
+    /**
+     *
+     */
+    private String last3wWinRate;
+
+    /**
+     *
+     */
+    private String averageWinRate;
+
+    /**
+     *
+     */
+    private String traderHeadPic;
+
+    /**
+     *
+     */
+    private String canTrace;
+
+    /**
+     *
+     */
+    private String tradingPairsAvailable;
+
+    /**
+     *
+     */
+    private String profile;
+
+    /**
+     *
+     */
+    private String lastTradeTime;
+
+    /**
+     *
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime modifyTime;
+
+
+    private JSONArray columnList;
+}

+ 19 - 0
src/main/java/top/lvzhiqiang/mapper/CoinMapper.java

@@ -4,6 +4,7 @@ import org.apache.ibatis.annotations.Insert;
 import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Select;
 import top.lvzhiqiang.entity.CoinHistoryOrder;
+import top.lvzhiqiang.entity.CoinMixTrader;
 import top.lvzhiqiang.entity.CoinPubilcParams;
 
 import java.util.List;
@@ -47,4 +48,22 @@ public interface CoinMapper {
     @Select("select * from coin_public_params where 1=1")
     @MapKey("codeKey")
     List<CoinPubilcParams> findPublicParams();
+
+    @Insert({"<script>" +
+            "INSERT INTO coin_mix_trader(traderUid,traderNickName,maxFollowCount,followCount,totalFollowers,profitOrderCount,lossOrderCount," +
+            "totalTradeCount,dailyProfitRate,dailyProfit,copyTradeDays,roi,totalProfit,totalFollowersProfit,aum,maxCallbackRate,last3wWinRate," +
+            "averageWinRate,traderHeadPic,canTrace,tradingPairsAvailable,profile,lastTradeTime,modify_time)" +
+            " VALUES " +
+            "<foreach collection='list' item='mt' index=\"index\" separator=\",\">" +
+            "   (#{mt.traderUid},#{mt.traderNickName},#{mt.maxFollowCount},#{mt.followCount},#{mt.totalFollowers},#{mt.profitOrderCount},#{mt.lossOrderCount}," +
+            "#{mt.totalTradeCount},#{mt.dailyProfitRate},#{mt.dailyProfit},#{mt.copyTradeDays},#{mt.roi},#{mt.totalProfit},#{mt.totalFollowersProfit},#{mt.aum}," +
+            "#{mt.maxCallbackRate},#{mt.last3wWinRate},#{mt.averageWinRate},#{mt.traderHeadPic},#{mt.canTrace},#{mt.tradingPairsAvailable},#{mt.profile},#{mt.lastTradeTime}, now())" +
+            " </foreach>" +
+            " ON DUPLICATE KEY UPDATE traderNickName=values(traderNickName),maxFollowCount=values(maxFollowCount),followCount=values(followCount),totalFollowers=values(totalFollowers)," +
+            "profitOrderCount=values(profitOrderCount),lossOrderCount=values(lossOrderCount),totalTradeCount=values(totalTradeCount),dailyProfitRate=values(dailyProfitRate)," +
+            "dailyProfit=values(dailyProfit),copyTradeDays=values(copyTradeDays),roi=values(roi),totalProfit=values(totalProfit),totalFollowersProfit=values(totalFollowersProfit)," +
+            "aum=values(aum),maxCallbackRate=values(maxCallbackRate),last3wWinRate=values(last3wWinRate),averageWinRate=values(averageWinRate),traderHeadPic=values(traderHeadPic)," +
+            "canTrace=values(canTrace),tradingPairsAvailable=values(tradingPairsAvailable),profile=values(profile),lastTradeTime=values(lastTradeTime),modify_time=now()" +
+            "</script>"})
+    void insertMixTradeList(List<CoinMixTrader> parseMixTradeList);
 }

+ 3 - 0
src/main/java/top/lvzhiqiang/service/CoinService.java

@@ -32,4 +32,7 @@ public interface CoinService {
     String orderDetail(String trackingNo);
 
     String orderDetail2(String orderId, String symbol);
+
+    void syncData4TraderList();
+    void syncData4TraderListSub(JSONArray dataList);
 }

+ 77 - 5
src/main/java/top/lvzhiqiang/service/impl/CoinServiceImpl.java

@@ -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);

+ 9 - 2
src/test/java/Test4.java

@@ -54,12 +54,19 @@ public class Test4 {
         paramMap.put("pageSize", "100");
         paramMap.put("clientOid", "1089293404165083137");*/
 
-        paramMap.put("symbol", "LEVERUSDT_UMCBL");
-        paramMap.put("orderId", "1089364238096883714");
+        /*paramMap.put("symbol", "LEVERUSDT_UMCBL");
+        paramMap.put("orderId", "1089364238096883714");*/
+
+        paramMap.put("sortRule", "composite");
+        paramMap.put("sortFlag", "desc");
+        paramMap.put("languageType", "en-US");
+        paramMap.put("pageNo","80");
+        paramMap.put("pageSize","20");
 
         String signQueryString = paramMap.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
         String url = "/api/mix/v1/trace/report/order/currentList";
         url = "/api/mix/v1/order/detail";
+        url = "/api/mix/v1/trace/traderList";
 
         String s = JSONObject.toJSONString(paramMap);
         //JSONObject response = requestApi4Common(url, null, s, JsoupUtil.HTTP_POST, paramMap);

+ 5 - 0
src/test/java/top/lvzhiqiang/TestCoin.java

@@ -49,4 +49,9 @@ public class TestCoin {
         JSONObject jo = new JSONObject();
         coinService.monitorAlarm("symbol", null);
     }
+
+    @Test
+    public void testSyncData4TraderList() {
+        coinService.syncData4TraderList();
+    }
 }