From d174d6963d62b3bd176f9e7ba3cf0d7f75a91b69 Mon Sep 17 00:00:00 2001
From: zainali5120 <512061637@qq.com>
Date: Wed, 16 Sep 2020 16:03:22 +0800
Subject: [PATCH] 撮合交易代码提交

---
 src/main/java/com/xcong/excoin/trade/CoinTrader.java |   91 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 75 insertions(+), 16 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/trade/CoinTrader.java b/src/main/java/com/xcong/excoin/trade/CoinTrader.java
index ca79fe9..fc4a8fc 100644
--- a/src/main/java/com/xcong/excoin/trade/CoinTrader.java
+++ b/src/main/java/com/xcong/excoin/trade/CoinTrader.java
@@ -53,7 +53,7 @@
      * 初始化交易线程
      */
     public void initialize() {
-        logger.info("init CoinTrader for symbol {}", symbol);
+        //logger.info("init CoinTrader for symbol {}", symbol);
         //买单队列价格降序排列
         buyLimitPriceQueue = new TreeMap<>(Comparator.reverseOrder());
         //卖单队列价格升序排列
@@ -107,7 +107,7 @@
         if (exchangeOrder.getTradeType() != OrderCoinsEntity.TRADETYPE_MARKETPRICE) {
             return;
         }
-        logger.info("addMarketPriceOrder,orderId = {}", exchangeOrder.getId());
+        //logger.info("addMarketPriceOrder,orderId = {}", exchangeOrder.getId());
         LinkedList<OrderCoinsEntity> list = exchangeOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY ? buyMarketQueue : sellMarketQueue;
         synchronized (list) {
             list.addLast(exchangeOrder);
@@ -136,7 +136,7 @@
         }
         //logger.info("trade order={}",exchangeOrder);
         if (!symbol.equalsIgnoreCase(exchangeOrder.getSymbol())) {
-            logger.info("unsupported symbol,coin={},base={}", exchangeOrder.getSymbol(), "USDT");
+            //logger.info("unsupported symbol,coin={},base={}", exchangeOrder.getSymbol(), "USDT");
             return;
         }
         // 如果
@@ -203,7 +203,10 @@
                     OrderCoinsEntity matchOrder = orderIterator.next();
                     //处理匹配
                     ExchangeTrade trade = processMatch(focusedOrder, matchOrder);
-                    exchangeTrades.add(trade);
+                    if(trade!=null){
+                        exchangeTrades.add(trade);
+                    }
+
                     //判断匹配单是否完成
                     if (matchOrder.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_DONE) {
                         //当前匹配的订单完成交易,删除该订单
@@ -304,7 +307,7 @@
                     if (trade != null) {
                         exchangeTrades.add(trade);
                     }
-                    //判断匹配单是否完成
+                    //判断匹配单是否完成 TODO
                     if (matchOrder.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_DONE) {
                         //当前匹配的订单完成交易,删除该订单
                         orderIterator.remove();
@@ -364,12 +367,12 @@
      */
     private BigDecimal adjustMarketOrderTurnover(OrderCoinsEntity order, BigDecimal dealPrice) {
         if (order.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY && order.getTradeType() == OrderCoinsEntity.TRADETYPE_MARKETPRICE) {
-//            BigDecimal leftTurnover = order.getAmount().subtract(order.getTurnover());
-//            if(leftTurnover.divide(dealPrice,coinScale,BigDecimal.ROUND_DOWN)
-//                    .compareTo(BigDecimal.ZERO)==0){
-//                order.setTurnover(order.getAmount());
-//                return leftTurnover;
-//            }
+            BigDecimal leftTurnover = order.getEntrustAmount().subtract(order.getDealAmount());
+            if(leftTurnover.divide(dealPrice,coinScale,BigDecimal.ROUND_DOWN)
+                    .compareTo(BigDecimal.ZERO)==0){
+                //order.setDealAmount(order.getEntrustAmount());
+                return leftTurnover;
+            }
         }
         return BigDecimal.ZERO;
     }
@@ -400,7 +403,7 @@
         availAmount = calculateTradedAmount(matchOrder, dealPrice);
         //计算成交量 取少的
         BigDecimal tradedAmount = (availAmount.compareTo(needAmount) >= 0 ? needAmount : availAmount);
-        logger.info("dealPrice={},amount={}", dealPrice, tradedAmount);
+        //logger.info("dealPrice={},amount={}", dealPrice, tradedAmount);
         //如果成交额为0说明剩余额度无法成交,退出
         if (tradedAmount.compareTo(BigDecimal.ZERO) == 0) {
             return null;
@@ -415,6 +418,21 @@
         focusedOrder.setDealCnt(focusedOrder.getDealCnt().add(tradedAmount));
         // 用户单成交金额
         focusedOrder.setDealAmount(focusedOrder.getDealAmount().add(turnover));
+
+        // 判断两个单是否完成
+        if(matchOrder.getEntrustAmount()!=null && matchOrder.getEntrustAmount().compareTo(matchOrder.getDealAmount())<=0){
+            matchOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
+        if(matchOrder.getEntrustCnt()!=null && matchOrder.getEntrustCnt().compareTo(matchOrder.getDealCnt())<=0){
+            matchOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
+
+        if(focusedOrder.getEntrustAmount()!=null && focusedOrder.getEntrustAmount().compareTo(focusedOrder.getDealAmount())<=0){
+            focusedOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
+        if(focusedOrder.getEntrustCnt()!=null && focusedOrder.getEntrustCnt().compareTo(focusedOrder.getDealCnt())<=0){
+            focusedOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
 
         //创建成交记录
         ExchangeTrade exchangeTrade = new ExchangeTrade();
@@ -471,9 +489,6 @@
                     //orderCoinService.handleOrder(subTrades);
                 }
             } else {
-                trades.forEach(e -> {
-                    System.out.println(e);
-                });
                 exchangeProducer.sendHandleTrade(JSON.toJSONString(trades));
                 //orderCoinService.handleOrder(trades);
                 // kafkaTemplate.send("exchange-trade", JSON.toJSONString(trades));
@@ -551,13 +566,57 @@
     }
 
     /**
+     * 发送盘口变化消息
+     *
+     * @param
+     */
+    public String sendTradePlateMessage() {
+        //防止并发引起数组越界,造成盘口倒挂 TODO
+        List<List<BigDecimal>> plate;
+        List<BigDecimal> plateItem;
+        TradePlateModel tradePlateModel = new TradePlateModel();
+        // 转换格式
+        if (buyTradePlate != null && buyTradePlate.getItems() != null) {
+            plate = new ArrayList<>();
+            LinkedList<TradePlateItem> items = buyTradePlate.getItems();
+            for (TradePlateItem item : items) {
+                plateItem = new ArrayList<>(2);
+                BigDecimal price = item.getPrice();
+                BigDecimal amount = item.getAmount();
+                plateItem.add(price);
+                plateItem.add(amount);
+                plate.add(plateItem);
+            }
+            tradePlateModel.setBuy(plate);
+        }
+
+        if (sellTradePlate != null && sellTradePlate.getItems() != null) {
+            plate = new ArrayList<>();
+            LinkedList<TradePlateItem> items = sellTradePlate.getItems();
+            for (TradePlateItem item : items) {
+                plateItem = new ArrayList<>(2);
+                BigDecimal price = item.getPrice();
+                BigDecimal amount = item.getAmount();
+                plateItem.add(price);
+                plateItem.add(amount);
+                plate.add(plateItem);
+            }
+            tradePlateModel.setSell(plate);
+        }
+
+        // 盘口发生变化通知TODO
+        return JSON.toJSONString(tradePlateModel);
+        //exchangeProducer.sendPlateMsg(JSON.toJSONString(tradePlateModel));
+    }
+
+    /**
      * 取消委托订单
      *
      * @param exchangeOrder
      * @return
      */
     public OrderCoinsEntity cancelOrder(OrderCoinsEntity exchangeOrder) {
-        logger.info("cancelOrder,orderId={}", exchangeOrder.getId());
+        //logger.info("cancelOrder,orderId={}", exchangeOrder.getId());
         if (exchangeOrder.getTradeType() == OrderCoinsEntity.TRADETYPE_MARKETPRICE) {
             //处理市价单
             Iterator<OrderCoinsEntity> orderIterator;

--
Gitblit v1.9.1