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