From 2e17d2cd714c047196915b37935e82b9d3d0bc80 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Tue, 13 Oct 2020 21:28:39 +0800 Subject: [PATCH] modify --- src/main/java/com/xcong/excoin/trade/CoinTrader.java | 123 ++++++++++++++++++++++++++++++---------- 1 files changed, 92 insertions(+), 31 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..3e249f0 100644 --- a/src/main/java/com/xcong/excoin/trade/CoinTrader.java +++ b/src/main/java/com/xcong/excoin/trade/CoinTrader.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity; import com.xcong.excoin.modules.coin.service.OrderCoinService; import com.xcong.excoin.rabbit.producer.ExchangeProducer; @@ -37,8 +38,7 @@ //是否暂停交易 private boolean tradingHalt = false; private boolean ready = false; - //交易对信息 - //private ExchangeCoinPublishType publishType; + private String clearTime; private SimpleDateFormat dateTimeFormat; @@ -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,13 +136,20 @@ } //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; } // 如果 - 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; @@ -203,7 +210,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) { //当前匹配的订单完成交易,删除该订单 @@ -251,7 +261,6 @@ while (iterator.hasNext()) { OrderCoinsEntity matchOrder = iterator.next(); ExchangeTrade trade = processMatch(focusedOrder, matchOrder); - logger.info(">>>>>" + trade); if (trade != null) { exchangeTrades.add(trade); } @@ -304,7 +313,7 @@ if (trade != null) { exchangeTrades.add(trade); } - //判断匹配单是否完成 + //判断匹配单是否完成 TODO if (matchOrder.getOrderStatus() == OrderCoinsEntity.ORDERSTATUS_DONE) { //当前匹配的订单完成交易,删除该订单 orderIterator.remove(); @@ -364,12 +373,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 +409,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 +424,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,14 +495,10 @@ //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)); } - // 更新最新K线 TODO } } @@ -512,7 +532,7 @@ * @param buyTradePlate sellTradePlate */ public void sendTradePlateMessage(TradePlate buyTradePlate, TradePlate sellTradePlate) { - //防止并发引起数组越界,造成盘口倒挂 TODO + //防止并发引起数组越界,造成盘口倒挂 List<List<BigDecimal>> plate; List<BigDecimal> plateItem; TradePlateModel tradePlateModel = new TradePlateModel(); @@ -520,10 +540,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); @@ -534,10 +554,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); @@ -545,9 +565,50 @@ tradePlateModel.setSell(plate); } - // 盘口发生变化通知TODO - + // 盘口发生变化通知 exchangeProducer.sendPlateMsg(JSON.toJSONString(tradePlateModel)); + } + + /** + * 发送盘口变化消息 + * + * @param + */ + public String sendTradePlateMessage() { + //防止并发引起数组越界,造成盘口倒挂 + 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 (int i = items.size() - 1; i >= 0; i--) { + plateItem = new ArrayList<>(2); + BigDecimal price = items.get(i).getPrice(); + BigDecimal amount = items.get(i).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 (int i = items.size() - 1; i >= 0; i--) { + plateItem = new ArrayList<>(2); + BigDecimal price = items.get(i).getPrice(); + BigDecimal amount = items.get(i).getAmount(); + plateItem.add(price); + plateItem.add(amount); + plate.add(plateItem); + } + tradePlateModel.setSell(plate); + } + + return JSON.toJSONString(tradePlateModel); } /** @@ -557,7 +618,7 @@ * @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