From f5e6133809c553cfd9fb28ee61019927c547c374 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 08 Dec 2021 15:58:33 +0800
Subject: [PATCH] 20211208  fish

---
 src/main/java/com/xcong/excoin/trade/CoinTrader.java |  105 +++++++++++++++++++++++++++-------------------------
 1 files changed, 54 insertions(+), 51 deletions(-)

diff --git a/src/main/java/com/xcong/excoin/trade/CoinTrader.java b/src/main/java/com/xcong/excoin/trade/CoinTrader.java
index fc4a8fc..20300e2 100644
--- a/src/main/java/com/xcong/excoin/trade/CoinTrader.java
+++ b/src/main/java/com/xcong/excoin/trade/CoinTrader.java
@@ -3,9 +3,7 @@
 import com.alibaba.fastjson.JSON;
 
 import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity;
-import com.xcong.excoin.modules.coin.service.OrderCoinService;
 import com.xcong.excoin.rabbit.producer.ExchangeProducer;
-import org.apache.commons.collections.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,8 +35,7 @@
     //是否暂停交易
     private boolean tradingHalt = false;
     private boolean ready = false;
-    //交易对信息
-    //private ExchangeCoinPublishType publishType;
+
     private String clearTime;
 
     private SimpleDateFormat dateTimeFormat;
@@ -140,9 +137,16 @@
             return;
         }
         // 如果
-        if (exchangeOrder.getEntrustAmount().compareTo(BigDecimal.ZERO) <= 0 || exchangeOrder.getEntrustAmount().subtract(exchangeOrder.getDealAmount()).compareTo(BigDecimal.ZERO) <= 0) {
-            return;
+        if(OrderCoinsEntity.ORDERTYPE_BUY==exchangeOrder.getOrderType()){
+            if (exchangeOrder.getEntrustAmount().compareTo(BigDecimal.ZERO) <= 0 || exchangeOrder.getEntrustAmount().subtract(exchangeOrder.getDealAmount()).compareTo(BigDecimal.ZERO) <= 0) {
+                return;
+            }
+        }else{
+            if (exchangeOrder.getEntrustCnt().compareTo(BigDecimal.ZERO) <= 0 || exchangeOrder.getEntrustCnt().subtract(exchangeOrder.getDealCnt()).compareTo(BigDecimal.ZERO) <= 0) {
+                return;
+            }
         }
+
 
         TreeMap<BigDecimal, MergeOrder> limitPriceOrderList;
         LinkedList<OrderCoinsEntity> marketPriceOrderList;
@@ -254,7 +258,6 @@
             while (iterator.hasNext()) {
                 OrderCoinsEntity matchOrder = iterator.next();
                 ExchangeTrade trade = processMatch(focusedOrder, matchOrder);
-                logger.info(">>>>>" + trade);
                 if (trade != null) {
                     exchangeTrades.add(trade);
                 }
@@ -307,7 +310,7 @@
                     if (trade != null) {
                         exchangeTrades.add(trade);
                     }
-                    //判断匹配单是否完成 TODO
+                    //判断匹配单是否完成
                     if (matchOrder.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_DONE) {
                         //当前匹配的订单完成交易,删除该订单
                         orderIterator.remove();
@@ -327,8 +330,11 @@
             }
         }
         //如果还没有交易完,订单压入列表中,市价买单按成交量算
-        if (focusedOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_SELL && focusedOrder.getDealCnt().compareTo(focusedOrder.getEntrustCnt()) < 0
-                || focusedOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY && focusedOrder.getDealAmount().compareTo(focusedOrder.getEntrustAmount()) < 0) {
+        if ((focusedOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_SELL && focusedOrder.getDealCnt().compareTo(focusedOrder.getEntrustCnt()) < 0)
+                || (focusedOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY && focusedOrder.getDealAmount().compareTo(focusedOrder.getEntrustAmount()) < 0)) {
+            logger.info("市价单未交易完成:#{}"+JSON.toJSONString(focusedOrder));
+            // 打印此时的限价买单
+            logger.info("此时的买单:#{}"+JSON.toJSONString(lpList));
             addMarketPriceOrder(focusedOrder);
         }
         //每个订单的匹配批量推送
@@ -349,7 +355,7 @@
      */
     private BigDecimal calculateTradedAmount(OrderCoinsEntity order, BigDecimal dealPrice) {
         if (order.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY && order.getTradeType() == OrderCoinsEntity.TRADETYPE_MARKETPRICE) {
-            //剩余成交量 TODO ?
+            //剩余成交量
             // 委托量-成交量=剩余量
             BigDecimal leftTurnover = order.getEntrustAmount().subtract(order.getDealAmount());
             return leftTurnover.divide(dealPrice, coinScale, BigDecimal.ROUND_DOWN);
@@ -370,7 +376,7 @@
             BigDecimal leftTurnover = order.getEntrustAmount().subtract(order.getDealAmount());
             if(leftTurnover.divide(dealPrice,coinScale,BigDecimal.ROUND_DOWN)
                     .compareTo(BigDecimal.ZERO)==0){
-                //order.setDealAmount(order.getEntrustAmount());
+                order.setDealAmount(order.getEntrustAmount());
                 return leftTurnover;
             }
         }
@@ -419,20 +425,6 @@
         // 用户单成交金额
         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();
@@ -448,10 +440,25 @@
         //校正市价单剩余成交额
         if (OrderCoinsEntity.TRADETYPE_MARKETPRICE == focusedOrder.getTradeType() && focusedOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY) {
             BigDecimal adjustTurnover = adjustMarketOrderTurnover(focusedOrder, dealPrice);
-            exchangeTrade.setBuyTurnover(turnover.add(adjustTurnover));
-        } else if (OrderCoinsEntity.TRADETYPE_MARKETPRICE == matchOrder.getTradeType() && matchOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY) {
+            //exchangeTrade.setBuyTurnover(turnover.add(adjustTurnover));
+        }
+        if (OrderCoinsEntity.TRADETYPE_MARKETPRICE == matchOrder.getTradeType() && matchOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY) {
             BigDecimal adjustTurnover = adjustMarketOrderTurnover(matchOrder, dealPrice);
-            exchangeTrade.setBuyTurnover(turnover.add(adjustTurnover));
+            //exchangeTrade.setBuyTurnover(turnover.add(adjustTurnover));
+        }
+        // 判断两个单是否完成
+        if(matchOrder.getEntrustAmount()!=null &&matchOrder.getEntrustAmount().compareTo(BigDecimal.ZERO)>0 && matchOrder.getEntrustAmount().compareTo(matchOrder.getDealAmount())<=0){
+            matchOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
+        if(matchOrder.getEntrustCnt()!=null &&matchOrder.getEntrustCnt().compareTo(BigDecimal.ZERO)>0 && matchOrder.getEntrustCnt().compareTo(matchOrder.getDealCnt())<=0){
+            matchOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
+
+        if(focusedOrder.getEntrustAmount()!=null &&  focusedOrder.getEntrustAmount().compareTo(BigDecimal.ZERO)>0 && focusedOrder.getEntrustAmount().compareTo(focusedOrder.getDealAmount())<=0){
+            focusedOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
+        }
+        if(focusedOrder.getEntrustCnt()!=null &&focusedOrder.getEntrustCnt().compareTo(BigDecimal.ZERO)>0 && focusedOrder.getEntrustCnt().compareTo(focusedOrder.getDealCnt())<=0){
+            focusedOrder.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DONE);
         }
 
         if (focusedOrder.getOrderType() == OrderCoinsEntity.ORDERTYPE_BUY) {
@@ -493,7 +500,6 @@
                 //orderCoinService.handleOrder(trades);
                 // kafkaTemplate.send("exchange-trade", JSON.toJSONString(trades));
             }
-            // 更新最新K线 TODO
 
         }
     }
@@ -512,11 +518,11 @@
                 for (int index = 0; index < size; index += maxSize) {
                     int length = (size - index) > maxSize ? maxSize : size - index;
                     List<OrderCoinsEntity> subOrders = orders.subList(index, index + length);
-                    // TODO 通知订单完成
-                    //kafkaTemplate.send("exchange-order-completed", JSON.toJSONString(subOrders));
+                    //  通知订单完成
+                    exchangeProducer.sendCompleteMsg(JSON.toJSONString(subOrders));
                 }
             } else {
-                // kafkaTemplate.send("exchange-order-completed", JSON.toJSONString(orders));
+                exchangeProducer.sendCompleteMsg(JSON.toJSONString(orders));
             }
         }
     }
@@ -527,7 +533,7 @@
      * @param buyTradePlate sellTradePlate
      */
     public void sendTradePlateMessage(TradePlate buyTradePlate, TradePlate sellTradePlate) {
-        //防止并发引起数组越界,造成盘口倒挂 TODO
+        //防止并发引起数组越界,造成盘口倒挂
         List<List<BigDecimal>> plate;
         List<BigDecimal> plateItem;
         TradePlateModel tradePlateModel = new TradePlateModel();
@@ -535,10 +541,10 @@
         if (buyTradePlate != null && buyTradePlate.getItems() != null) {
             plate = new ArrayList<>();
             LinkedList<TradePlateItem> items = buyTradePlate.getItems();
-            for (TradePlateItem item : items) {
+            for (int i = items.size() - 1; i >= 0; i--) {
                 plateItem = new ArrayList<>(2);
-                BigDecimal price = item.getPrice();
-                BigDecimal amount = item.getAmount();
+                BigDecimal price = items.get(i).getPrice();
+                BigDecimal amount = items.get(i).getAmount();
                 plateItem.add(price);
                 plateItem.add(amount);
                 plate.add(plateItem);
@@ -549,10 +555,10 @@
         if (sellTradePlate != null && sellTradePlate.getItems() != null) {
             plate = new ArrayList<>();
             LinkedList<TradePlateItem> items = sellTradePlate.getItems();
-            for (TradePlateItem item : items) {
+            for (int i = items.size() - 1; i >= 0; i--) {
                 plateItem = new ArrayList<>(2);
-                BigDecimal price = item.getPrice();
-                BigDecimal amount = item.getAmount();
+                BigDecimal price = items.get(i).getPrice();
+                BigDecimal amount = items.get(i).getAmount();
                 plateItem.add(price);
                 plateItem.add(amount);
                 plate.add(plateItem);
@@ -560,8 +566,7 @@
             tradePlateModel.setSell(plate);
         }
 
-        // 盘口发生变化通知TODO
-
+        // 盘口发生变化通知
         exchangeProducer.sendPlateMsg(JSON.toJSONString(tradePlateModel));
     }
 
@@ -571,7 +576,7 @@
      * @param
      */
     public String sendTradePlateMessage() {
-        //防止并发引起数组越界,造成盘口倒挂 TODO
+        //防止并发引起数组越界,造成盘口倒挂
         List<List<BigDecimal>> plate;
         List<BigDecimal> plateItem;
         TradePlateModel tradePlateModel = new TradePlateModel();
@@ -579,10 +584,10 @@
         if (buyTradePlate != null && buyTradePlate.getItems() != null) {
             plate = new ArrayList<>();
             LinkedList<TradePlateItem> items = buyTradePlate.getItems();
-            for (TradePlateItem item : items) {
+            for (int i = items.size() - 1; i >= 0; i--) {
                 plateItem = new ArrayList<>(2);
-                BigDecimal price = item.getPrice();
-                BigDecimal amount = item.getAmount();
+                BigDecimal price = items.get(i).getPrice();
+                BigDecimal amount = items.get(i).getAmount();
                 plateItem.add(price);
                 plateItem.add(amount);
                 plate.add(plateItem);
@@ -593,10 +598,10 @@
         if (sellTradePlate != null && sellTradePlate.getItems() != null) {
             plate = new ArrayList<>();
             LinkedList<TradePlateItem> items = sellTradePlate.getItems();
-            for (TradePlateItem item : items) {
+            for (int i = items.size() - 1; i >= 0; i--) {
                 plateItem = new ArrayList<>(2);
-                BigDecimal price = item.getPrice();
-                BigDecimal amount = item.getAmount();
+                BigDecimal price = items.get(i).getPrice();
+                BigDecimal amount = items.get(i).getAmount();
                 plateItem.add(price);
                 plateItem.add(amount);
                 plate.add(plateItem);
@@ -604,9 +609,7 @@
             tradePlateModel.setSell(plate);
         }
 
-        // 盘口发生变化通知TODO
         return JSON.toJSONString(tradePlateModel);
-        //exchangeProducer.sendPlateMsg(JSON.toJSONString(tradePlateModel));
     }
 
     /**

--
Gitblit v1.9.1