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/modules/coin/service/impl/OrderCoinServiceImpl.java | 79 +++++++ src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java | 11 + src/main/java/com/xcong/excoin/processor/MarketService.java | 6 src/main/java/com/xcong/excoin/trade/ExchangeTrade.java | 1 src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java | 109 ++++++++-- src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java | 30 +- src/main/resources/application-test.yml | 13 src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml | 7 src/main/java/com/xcong/excoin/rabbit/producer/ExchangeProducer.java | 4 src/main/java/com/xcong/excoin/websocket/CandlestickResult.java | 11 + src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java | 3 src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java | 5 src/main/java/com/xcong/excoin/websocket/CandlestickModel.java | 18 + src/main/java/com/xcong/excoin/websocket/NewCandlestick.java | 9 src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java | 22 ++ src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java | 79 ++++--- src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java | 38 +++ src/main/java/com/xcong/excoin/trade/CoinTrader.java | 91 +++++++- src/main/java/com/xcong/excoin/websocket/SubResultModel.java | 10 + src/main/resources/application.yml | 2 20 files changed, 438 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java b/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java index ca953be..cc06661 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java +++ b/src/main/java/com/xcong/excoin/modules/coin/controller/OrderCoinController.java @@ -5,6 +5,7 @@ import javax.annotation.Resource; import javax.validation.Valid; +import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; @@ -71,7 +72,7 @@ return orderCoinService.submitSalesWalletCoinOrderWithMatch(symbol,type,tradeType,price,amount,submitSalesWalletCoinOrderDto.getEntrustAmount()); }else{ - return orderCoinService.submitSalesWalletCoinOrder(symbol,type,tradeType,price,amount); + return orderCoinService.submitSalesWalletCoinOrder(symbol,type,tradeType,price,amount,submitSalesWalletCoinOrderDto.getEntrustAmount()); } } diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java b/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java index 8bf291c..779e375 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/OrderCoinService.java @@ -16,7 +16,7 @@ Result enterTransactionPageOfWalletCoin(String symbol); Result submitSalesWalletCoinOrder(String symbol, Integer type, Integer tradeType, BigDecimal price, - BigDecimal amount); + BigDecimal amount,BigDecimal entrustAmount); /** * 需要撮合交易的币种提交买卖单 @@ -51,4 +51,7 @@ public void handleOrder(List<ExchangeTrade> trades); + void initOrders(String symbol, Integer type, Integer tradeType, BigDecimal price, + BigDecimal amount,BigDecimal entrustAmount); + } diff --git a/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java b/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java index 07a9886..2ddead0 100644 --- a/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java +++ b/src/main/java/com/xcong/excoin/modules/coin/service/impl/OrderCoinServiceImpl.java @@ -161,13 +161,18 @@ @Override @Transactional - public Result submitSalesWalletCoinOrder(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount) { + public Result submitSalesWalletCoinOrder(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount,BigDecimal entrustAmount) { + + //获取用户ID Long memberId = LoginUserUtils.getAppLoginUser().getId(); BigDecimal nowPriceinBigDecimal = price; //查询当前价 BigDecimal nowPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol + "/USDT"))); - + if(OrderCoinsEntity.ORDERTYPE_BUY.equals(type) && OrderCoinsEntity.TRADETYPE_MARKETPRICE.equals(tradeType)){ + amount = entrustAmount.divide(nowPrice,BigDecimal.ROUND_DOWN); + } + // 处理市价 // 获取交易管理的杠杠倍率,手续费率等信息,由平台进行设置 symbol = symbol.toUpperCase(); MemberWalletCoinEntity walletCoin = memberWalletCoinDao.selectWalletCoinBymIdAndCode(memberId, symbol); @@ -319,7 +324,7 @@ @Override public Result submitSalesWalletCoinOrderWithMatch(String symbol, Integer type, Integer tradeType, BigDecimal price, BigDecimal amount, BigDecimal entrustAmount) { //获取用户ID - Long memberId = 13L; + Long memberId = LoginUserUtils.getAppLoginUser().getId(); BigDecimal nowPriceinBigDecimal = price; //查询当前价 //BigDecimal nowPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol + "/USDT"))); @@ -818,11 +823,16 @@ if(exchangeTrade==null){ continue; } + // 量 BigDecimal amount = exchangeTrade.getAmount(); + // 买单ID Long buyOrderId = exchangeTrade.getBuyOrderId(); + // 成交金额(usdt) BigDecimal buyTurnover = exchangeTrade.getBuyTurnover(); int direction = exchangeTrade.getDirection(); + // 成交价 BigDecimal price = exchangeTrade.getPrice(); + // 卖单 Long sellOrderId = exchangeTrade.getSellOrderId(); // 买卖单都需要处理 // 买单 @@ -918,4 +928,67 @@ } } } + + @Override + public void initOrders(String symbol, Integer type, Integer tradeType, BigDecimal price, + BigDecimal amount,BigDecimal entrustAmount) { + //获取用户ID + Long memberId = 10L; + BigDecimal nowPriceinBigDecimal = price; + //查询当前价 + //BigDecimal nowPrice = new BigDecimal(redisUtils.getString(CoinTypeConvert.convertToKey(symbol + "/USDT"))); + + // 获取交易管理的杠杠倍率,手续费率等信息,由平台进行设置 + symbol = symbol.toUpperCase(); + + // 手续费用(手续费=建仓价X数量X手续费率) + BigDecimal closingPrice = BigDecimal.ZERO ; + + // BigDecimal totalPayPricCoin = nowPrice.multiply(amount).add(closingPrice); + // 首先将单插入到数据库主表(委托表) + // 创建订单 + OrderCoinsEntity order = new OrderCoinsEntity(); + //根据委托类型生成不同数据 + // 如果是限价交易直接插入主表数据 + order.setMemberId(memberId); + order.setOrderNo(generateSimpleSerialno(memberId.toString())); + order.setOrderType(type); + order.setSymbol(symbol); + //order.setMarkPrice(nowPrice); + + // 成交量 先设置为0 + order.setDealCnt(BigDecimal.ZERO); + // 成交价 + //order.setDealPrice(price); + // 成交金额 + order.setDealAmount(BigDecimal.ZERO); + order.setOrderStatus(OrderCoinsEntity.ORDERSTATUS_DODING); + order.setTradeType(tradeType); + // 手续费 + order.setFeeAmount(closingPrice); + if(OrderCoinsEntity.TRADETYPE_FIXEDPRICE.equals(tradeType)){ + // 限价 是需要价格和数量 可以得到成交金额 + // 下单量 + order.setEntrustCnt(amount); + // 下单价格 + order.setEntrustPrice(price); + order.setEntrustAmount(amount.multiply(price)); + }else{ + if(OrderCoinsEntity.ORDERTYPE_BUY.equals(type)){ + // 市价 只有金额 + order.setEntrustAmount(entrustAmount); + }else{ + // 下单量 + order.setEntrustCnt(amount); + // 下单价格 + order.setEntrustPrice(price); + order.setEntrustAmount(amount.multiply(price)); + } + + } + orderCoinsDao.insert(order); + // 加入到撮合 + CoinTrader trader = factory.getTrader(symbol); + trader.trade(order); + } } diff --git a/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java b/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java index ca6dc28..8e1423f 100644 --- a/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java +++ b/src/main/java/com/xcong/excoin/processor/DefaultCoinProcessor.java @@ -62,7 +62,7 @@ calendar.set(Calendar.HOUR_OF_DAY, 0); long firstTimeOfToday = calendar.getTimeInMillis(); String period = "1min"; - logger.info("initializeThumb from {} to {}", firstTimeOfToday, nowTime); + //logger.info("initializeThumb from {} to {}", firstTimeOfToday, nowTime); List<Candlestick> lines = service.findAllKLine(this.symbol, firstTimeOfToday, nowTime, period); coinThumb = new CoinThumb(); synchronized (coinThumb) { @@ -202,7 +202,7 @@ //处理K线 processTrade(currentKLine, exchangeTrade); //处理今日概况信息 - logger.debug("处理今日概况信息"); + //logger.debug("处理今日概况信息"); handleThumb(exchangeTrade); //存储并推送成交信息 handleTradeStorage(exchangeTrade); @@ -212,7 +212,7 @@ } public void processTrade(Candlestick kLine, ExchangeTrade exchangeTrade) { - if (kLine.getClose().compareTo(BigDecimal.ZERO) == 0) { + if (kLine.getClose()==null || kLine.getClose().compareTo(BigDecimal.ZERO)==0) { //第一次设置K线值 kLine.setOpen(exchangeTrade.getPrice()); kLine.setHigh(exchangeTrade.getPrice()); @@ -224,15 +224,19 @@ kLine.setClose(exchangeTrade.getPrice()); } kLine.setCount(kLine.getCount() + 1); - kLine.setVolume(kLine.getVolume().add(exchangeTrade.getAmount())); + if(kLine.getVolume()==null){ + kLine.setVolume(BigDecimal.ZERO); + } + kLine.setAmount(kLine.getVolume().add(exchangeTrade.getAmount())); BigDecimal turnover = exchangeTrade.getPrice().multiply(exchangeTrade.getAmount()); - // kLine.setTurnover(kLine.getTurnover().add(turnover)); + kLine.setVolume(kLine.getVolume().add(turnover)); + //kLine.setTimestamp(System.currentTimeMillis()); } public void handleTradeStorage(ExchangeTrade exchangeTrade) { - for (MarketHandler storage : handlers) { - storage.handleTrade(symbol, exchangeTrade, coinThumb); - } +// for (MarketHandler storage : handlers) { +// storage.handleTrade(symbol, exchangeTrade, coinThumb); +// } } public void handleKLineStorage(Candlestick kLine) { @@ -243,7 +247,7 @@ } public void handleThumb(ExchangeTrade exchangeTrade) { - logger.info("handleThumb symbol = {}", this.symbol); + //logger.info("handleThumb symbol = {}", this.symbol); synchronized (coinThumb) { if (coinThumb.getOpen().compareTo(BigDecimal.ZERO) == 0) { //第一笔交易记为开盘价 @@ -265,7 +269,7 @@ coinThumb.setChg(change.divide(coinThumb.getLow(), 4, BigDecimal.ROUND_UP)); } if ("USDT".equalsIgnoreCase(baseCoin)) { - logger.info("setUsdRate", exchangeTrade.getPrice()); + // logger.info("setUsdRate", exchangeTrade.getPrice()); coinThumb.setUsdRate(exchangeTrade.getPrice()); } else { @@ -304,7 +308,7 @@ calendar.add(field, -range); String fromTime = df.format(calendar.getTime()); long startTick = calendar.getTimeInMillis(); - System.out.println("time range from " + fromTime + " to " + endTime); + //System.out.println("time range from " + fromTime + " to " + endTime); List<ExchangeTrade> exchangeTrades = service.findTradeByTimeRange(this.symbol, startTick, endTick); Candlestick kLine = new Candlestick(); @@ -340,7 +344,7 @@ kLine.setLow(coinThumb.getClose()); kLine.setHigh(coinThumb.getClose()); } - logger.info("generate " + range + rangeUnit + " kline in {},data={}", df.format(new Date(kLine.getTimestamp())), JSON.toJSONString(kLine)); + //logger.info("generate " + range + rangeUnit + " kline in {},data={}", df.format(new Date(kLine.getTimestamp())), JSON.toJSONString(kLine)); service.saveKLine(symbol,period, kLine); // 生成一个对应的新K线 后续的交易会更新这个最新K线数据 Candlestick newKline = new Candlestick(); @@ -352,6 +356,8 @@ newKline.setOpen(kLine.getClose()); newKline.setVolume(BigDecimal.ZERO); newKline.setHigh(kLine.getClose()); + calendar.add(field, 2*range); + newKline.setTimestamp(calendar.getTimeInMillis()); currentKlineMap.put(period,newKline); // 存储昨日K线 diff --git a/src/main/java/com/xcong/excoin/processor/MarketService.java b/src/main/java/com/xcong/excoin/processor/MarketService.java index 11c6c56..d47b2c9 100644 --- a/src/main/java/com/xcong/excoin/processor/MarketService.java +++ b/src/main/java/com/xcong/excoin/processor/MarketService.java @@ -75,20 +75,20 @@ // Query query = new Query(criteria).with(sort); // // return mongoTemplate.find(query,ExchangeTrade.class,"exchange_trade_"+symbol); - return orderCoinDealDao.selectOrderCoinDealByTime(symbol, new Date(timeStart), new Date(timeStart)); + return orderCoinDealDao.selectOrderCoinDealByTime(symbol, new Date(timeStart), new Date(timeEnd)); // return null; } public void saveKLine(String symbol, String period, Candlestick kLine) { // 先获取 - String key = "KINE_" + symbol + "_" + period; + String key = "KINE_" + symbol + "/USDT_" + period; Object data = redisUtils.get(key); List list = new ArrayList(); if (data != null) { list = (List) data; } list.add(kLine); - redisUtils.set("KINE_" + symbol + "_" + period, list); + redisUtils.set(key, list); // mongoTemplate.insert(kLine,"exchange_kline_"+symbol+"_"+kLine.getPeriod()); } diff --git a/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java b/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java index 91a81fd..9d4215c 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/CoinTradeInitJob.java @@ -1,10 +1,12 @@ package com.xcong.excoin.quartz.job; +import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.huobi.client.SubscriptionClient; import com.huobi.client.SubscriptionOptions; import com.huobi.client.model.Candlestick; import com.huobi.client.model.enums.CandlestickInterval; +import com.xcong.excoin.modules.coin.dao.OrderCoinDealDao; import com.xcong.excoin.modules.coin.dao.OrderCoinsDao; import com.xcong.excoin.modules.coin.entity.OrderCoinsEntity; import com.xcong.excoin.modules.coin.service.OrderCoinService; @@ -17,6 +19,7 @@ import com.xcong.excoin.rabbit.producer.ExchangeProducer; import com.xcong.excoin.trade.CoinTrader; import com.xcong.excoin.trade.CoinTraderFactory; +import com.xcong.excoin.trade.ExchangeTrade; import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.RedisUtils; import lombok.extern.slf4j.Slf4j; @@ -30,6 +33,7 @@ import java.text.ParseException; import java.util.ArrayList; import java.util.List; +import java.util.Map; /** * 开启撮合交易 @@ -44,12 +48,14 @@ @Resource private OrderCoinsDao orderCoinsDao; + @Resource + private OrderCoinDealDao orderCoinDealDao; @Resource private CoinTraderFactory factory; @Resource - private OrderCoinService coinService; + private RedisUtils redisUtils; @Resource private MarketService marketService; @@ -98,7 +104,21 @@ processor.initializeThumb(); //processor.initializeUsdRate(); processor.setIsHalt(false); + List<ExchangeTrade> nekk = orderCoinDealDao.selectOrderCoinDealByTime("NEKK", null, null); + processor.process(nekk); + String symbolUsdt = symbol; + if(!symbol.contains("USDT")){ + symbolUsdt = symbol+"/USDT"; + } + String key = "NEW_KINE_{}"; + key = StrUtil.format(key, symbolUsdt); + Object o = redisUtils.get(key); + if(o!=null){ + Map<String, Candlestick> currentKlineMap = (Map<String, Candlestick> )o; + ((DefaultCoinProcessor) processor).setCurrentKlineMap(currentKlineMap); + } processorFactory.addProcessor(symbol, processor); + } } diff --git a/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java b/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java index 946af01..5972de9 100644 --- a/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java +++ b/src/main/java/com/xcong/excoin/quartz/job/KLineGeneratorJob.java @@ -1,10 +1,16 @@ package com.xcong.excoin.quartz.job; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; import com.huobi.client.model.Candlestick; +import com.xcong.excoin.modules.coin.dao.OrderCoinDealDao; +import com.xcong.excoin.modules.coin.entity.OrderCoinsDealEntity; +import com.xcong.excoin.modules.coin.service.OrderCoinService; import com.xcong.excoin.processor.CoinProcessorFactory; import com.xcong.excoin.trade.TradePlateModel; import com.xcong.excoin.utils.RedisUtils; +import com.xcong.excoin.websocket.CandlestickModel; +import com.xcong.excoin.websocket.NewCandlestick; import com.xcong.excoin.websocket.TradePlateSendWebSocket; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -13,9 +19,11 @@ import javax.annotation.Resource; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.ArrayList; import java.util.Calendar; import java.util.List; +import java.util.Random; /** * 生成各时间段的K线信息 @@ -28,45 +36,41 @@ private CoinProcessorFactory processorFactory; @Resource - private TradePlateSendWebSocket plateSendWebSocket; + private OrderCoinService orderCoinService; - @Resource - private RedisUtils redisUtils; - @Scheduled(cron = "0/10 * * * * *") - public void tradePlate(){ - redisUtils.set("NEKK_NEW_PRICE",new BigDecimal(Math.random()*20)); - Candlestick candlestick = new Candlestick(); - candlestick.setOpen(new BigDecimal("10.33")); - candlestick.setHigh(new BigDecimal("15.23")); - candlestick.setVolume(new BigDecimal("12121.34")); - candlestick.setLow(new BigDecimal("8.234")); - candlestick.setAmount(new BigDecimal("1199")); - candlestick.setTimestamp(1599840000); - candlestick.setId(1599840000L); - candlestick.setCount(100002); - candlestick.setClose(new BigDecimal("12.2323")); - //redisUtils.set("NEKK/USDT",candlestick); - // [[10244.21, 0.000855], [10243.7, 0.008777], [10243.59, 0.14], [10243.37, 0.467663]] - TradePlateModel tradePlateModel = new TradePlateModel(); - List<BigDecimal> buy; - List<BigDecimal> sell; - for(int i=0;i<5;i++){ - buy = new ArrayList<>(2); - buy.add(new BigDecimal(Math.random()*i)); - buy.add(new BigDecimal(Math.random()*i)); - tradePlateModel.getBuy().add(buy); - sell = new ArrayList<>(2); - sell.add(new BigDecimal(Math.random()*i*2)); - sell.add(new BigDecimal(Math.random()*i*2)); - tradePlateModel.getSell().add(sell); + + @Scheduled(cron = "0/1 * * * * *") + public void test(){ +// for(int i=1;i<=2;i++){ +// OrderCoinsDealEntity detail = new OrderCoinsDealEntity(); +// detail.setMemberId(13L); +// //detail.setOrderId(111); +// detail.setOrderNo("tete"); +// detail.setOrderType(1); +// detail.setTradeType(1); +// detail.setSymbol("NEKK"); +// detail.setSymbolCnt(new BigDecimal(10)); +// detail.setEntrustPrice(new BigDecimal(10)); +// detail.setDealPrice(new BigDecimal(i*10*Math.random())); +// detail.setDealAmount(new BigDecimal(50)); +// detail.setFeeAmount(new BigDecimal(1)); +// detail.setOrderStatus(OrderCoinsDealEntity.ORDERSTATUS_DONE); +// orderCoinDealDao.insert(detail); +// } + Random random = new Random(); + Integer type = OrderCoinsDealEntity.ORDERTYPE_BUY; + Integer tradeType = OrderCoinsDealEntity.TRADETYPE_FIXEDPRICE; + int i = random.nextInt(100); + if(i==0){ + i=10; } - log.info("准备发送消息"); - plateSendWebSocket.sendMessagePlate("NEKK/USDT",JSON.toJSONString(tradePlateModel),null); - plateSendWebSocket.sendMessageKline("NEKK/USDT","1min","{amount: 114419.67835656216,close: 2.7261,count: 782,high: 2.7299,id: 1599632100,low: 2.723,open: 2.7288,vol: 311958.06091543}",null); - plateSendWebSocket.sendMessageKline("NEKK/USDT","5min","{amount: 514419.67835656216,close: 2.7261,count: 782,high: 2.7299,id: 1599632100,low: 2.723,open: 2.7288,vol: 911958.06091543}",null); - plateSendWebSocket.sendMessageKline("NEKK/USDT","15min","{amount: 514419.67835656216,close: 2.7261,count: 782,high: 2.7299,id: 1599632100,low: 2.723,open: 2.7288,vol: 911958.06091543}",null); + BigDecimal price = new BigDecimal(i); + orderCoinService.initOrders("NEKK",type,tradeType,price,new BigDecimal(2),null); + orderCoinService.initOrders("NEKK",OrderCoinsDealEntity.ORDERTYPE_SELL,tradeType,price,new BigDecimal(2),null); + } + /** * 每分钟定时器,处理分钟K线 @@ -75,7 +79,7 @@ public void handle5minKLine(){ Calendar calendar = Calendar.getInstance(); - log.debug("分钟K线:{}",calendar.getTime()); + //log.debug("分钟K线:{}",calendar.getTime()); //将秒、微秒字段置为0 calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); @@ -84,9 +88,10 @@ int hour = calendar.get(Calendar.HOUR_OF_DAY); processorFactory.getProcessorMap().forEach((symbol,processor)->{ if(!processor.isStopKline()) { - log.debug("生成{}分钟k线:{}",symbol); + //log.debug("生成{}分钟k线:{}",symbol); //生成1分钟K线 processor.autoGenerate(); + processor.generateKLine(1, Calendar.MINUTE, time); //更新24H成交量 processor.update24HVolume(time); if(minute%5 == 0) { diff --git a/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java b/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java index 9c9793a..df5900f 100644 --- a/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java +++ b/src/main/java/com/xcong/excoin/rabbit/consumer/ExchangeConsumer.java @@ -7,9 +7,13 @@ import com.xcong.excoin.modules.coin.service.OrderCoinService; import com.xcong.excoin.modules.exchange.service.HandleKlineService; import com.xcong.excoin.trade.ExchangeTrade; +import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.RedisUtils; +import com.xcong.excoin.websocket.CandlestickModel; +import com.xcong.excoin.websocket.NewCandlestick; import com.xcong.excoin.websocket.TradePlateSendWebSocket; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections.CollectionUtils; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; @@ -45,7 +49,7 @@ */ @RabbitListener(queues = RabbitMqConfig.QUEUE_TRADE_PLATE) public void tradePlate(String content) { - log.info("#盘口信息消费者---->{}#", content); + //log.info("#盘口信息消费者---->{}#", content); tradePlateSendWebSocket.sendMessagePlate("NEKK/USDT",content,null); } @@ -55,7 +59,7 @@ */ @RabbitListener(queues = RabbitMqConfig.QUEUE_HANDLE_TRADE) public void handleTradeExchange(String content) { - log.info("#---->{}#", content); + // log.info("#处理订单---->{}#", content); List<ExchangeTrade> exchangeTrades = JSONObject.parseArray(content, ExchangeTrade.class); // 去掉空的 暂时这样 Iterator<ExchangeTrade> iterator = exchangeTrades.iterator(); @@ -63,6 +67,9 @@ if(iterator.next()==null){ iterator.remove(); } + } + if(CollectionUtils.isEmpty(exchangeTrades)){ + return; } // 处理K线 并更新最新价 handleKlineService.handleExchangeOrderToKline(exchangeTrades); @@ -77,8 +84,33 @@ Object o = redisUtils.get(key); Map<String, Candlestick> currentKlineMap = (Map<String, Candlestick> )o; Set<Map.Entry<String, Candlestick>> entries = currentKlineMap.entrySet(); + + for(Map.Entry<String, Candlestick> map : entries){ - tradePlateSendWebSocket.sendMessageKline(symbolUsdt,map.getKey(),JSONObject.toJSONString(map.getValue()),null); + String ch = "market.{}.kline.{}"; + Candlestick value = map.getValue(); + String key1 = map.getKey(); + String chKey = key1; + if(key1.equals("1hour")){ + chKey = "60min"; + } + // 转换 + NewCandlestick newCandlestick= new NewCandlestick(); + String nekkusdt = CoinTypeConvert.convertReverse(symbolUsdt); + ch = StrUtil.format(ch, nekkusdt,chKey); + newCandlestick.setCh(ch); + CandlestickModel model = new CandlestickModel(); + model.setVol(value.getVolume()); + model.setLow(value.getLow()); + model.setOpen(value.getOpen()); + model.setHigh(value.getHigh()); + model.setCount(value.getCount()); + model.setAmount(value.getAmount()); + model.setId(value.getTimestamp()/1000); + model.setTimestamp(value.getTimestamp()/1000); + model.setClose(value.getClose()); + newCandlestick.setTick(model); + tradePlateSendWebSocket.sendMessageKline(symbolUsdt,key1,JSONObject.toJSONString(newCandlestick),null); } // 处理用户订单 orderCoinService.handleOrder(exchangeTrades); diff --git a/src/main/java/com/xcong/excoin/rabbit/producer/ExchangeProducer.java b/src/main/java/com/xcong/excoin/rabbit/producer/ExchangeProducer.java index 42e67d4..0d08c61 100644 --- a/src/main/java/com/xcong/excoin/rabbit/producer/ExchangeProducer.java +++ b/src/main/java/com/xcong/excoin/rabbit/producer/ExchangeProducer.java @@ -37,9 +37,9 @@ @Override public void confirm(CorrelationData correlationData, boolean ack, String cause) { - log.info("#----->{}#", correlationData); + //log.info("#----->{}#", correlationData); if (ack) { - log.info("success"); + //log.info("success"); } else { log.info("--->{}", cause); } 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; diff --git a/src/main/java/com/xcong/excoin/trade/ExchangeTrade.java b/src/main/java/com/xcong/excoin/trade/ExchangeTrade.java index ea56d87..a73611c 100644 --- a/src/main/java/com/xcong/excoin/trade/ExchangeTrade.java +++ b/src/main/java/com/xcong/excoin/trade/ExchangeTrade.java @@ -5,6 +5,7 @@ import java.io.Serializable; import java.math.BigDecimal; +import java.util.Date; /** * 撮合交易信息 diff --git a/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java b/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java index e9ff270..a32f0f9 100644 --- a/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java +++ b/src/main/java/com/xcong/excoin/utils/CoinTypeConvert.java @@ -29,6 +29,17 @@ } } + public static String convertReverse(String symbol) { + switch (symbol) { + case "BTC/USDT": + return "btcusdt"; + case "NEKK/USDT": + return "nekkusdt"; + default: + return null; + } + } + public static String convertToKey(String symbol) { switch (symbol) { case "BTC/USDT": diff --git a/src/main/java/com/xcong/excoin/websocket/CandlestickModel.java b/src/main/java/com/xcong/excoin/websocket/CandlestickModel.java new file mode 100644 index 0000000..b1229d1 --- /dev/null +++ b/src/main/java/com/xcong/excoin/websocket/CandlestickModel.java @@ -0,0 +1,18 @@ +package com.xcong.excoin.websocket; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class CandlestickModel { + private Long id; + private BigDecimal amount; + private long count; + private BigDecimal open; + private BigDecimal close; + private BigDecimal low; + private BigDecimal high; + private BigDecimal vol; + private long timestamp; +} diff --git a/src/main/java/com/xcong/excoin/websocket/CandlestickResult.java b/src/main/java/com/xcong/excoin/websocket/CandlestickResult.java new file mode 100644 index 0000000..bd7b605 --- /dev/null +++ b/src/main/java/com/xcong/excoin/websocket/CandlestickResult.java @@ -0,0 +1,11 @@ +package com.xcong.excoin.websocket; + +import lombok.Data; + +import java.util.List; + +@Data +public class CandlestickResult { + private String rep; + private List<CandlestickModel> data; +} diff --git a/src/main/java/com/xcong/excoin/websocket/NewCandlestick.java b/src/main/java/com/xcong/excoin/websocket/NewCandlestick.java new file mode 100644 index 0000000..04ba10c --- /dev/null +++ b/src/main/java/com/xcong/excoin/websocket/NewCandlestick.java @@ -0,0 +1,9 @@ +package com.xcong.excoin.websocket; + +import lombok.Data; + +@Data +public class NewCandlestick { + private String ch; + private CandlestickModel tick; +} diff --git a/src/main/java/com/xcong/excoin/websocket/SubResultModel.java b/src/main/java/com/xcong/excoin/websocket/SubResultModel.java new file mode 100644 index 0000000..855a3cc --- /dev/null +++ b/src/main/java/com/xcong/excoin/websocket/SubResultModel.java @@ -0,0 +1,10 @@ +package com.xcong.excoin.websocket; + +import lombok.Data; + +@Data +public class SubResultModel { + private String id; + private String status = "ok"; + private String subbed; +} diff --git a/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java b/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java index bb8bcb3..15d4168 100644 --- a/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java +++ b/src/main/java/com/xcong/excoin/websocket/TradePlateSendWebSocket.java @@ -2,8 +2,11 @@ import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.huobi.client.model.Candlestick; import com.xcong.excoin.common.contants.AppContants; +import com.xcong.excoin.trade.CoinTraderFactory; import com.xcong.excoin.utils.CoinTypeConvert; import com.xcong.excoin.utils.RedisUtils; import com.xcong.excoin.utils.SpringContextHolder; @@ -15,9 +18,8 @@ import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; +import java.io.IOException; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; @@ -53,12 +55,19 @@ @OnClose public void onClose(Session session) { onlineCount.decrementAndGet(); // 在线数减1 -// Collection<Map<String, Session>> values = tradeplateClients.values(); -// if(CollectionUtils.isNotEmpty(values)){ -// for(Map<String,Session> map : values){ -// map.remove(session.getId()); -// } -// } + Collection<Map<String, Session>> values = tradeplateClients.values(); + if(CollectionUtils.isNotEmpty(values)){ + for(Map<String,Session> map : values){ + map.remove(session.getId()); + } + } + + Collection<Map<String, Session>> klineClientsValues = klineClients.values(); + if(CollectionUtils.isNotEmpty(klineClientsValues)){ + for(Map<String,Session> map : klineClientsValues){ + map.remove(session.getId()); + } + } log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get()); } @@ -69,13 +78,13 @@ */ @OnMessage public void onMessage(String message, Session session) { - log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message); + //log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message); // 订阅方法 {sub: 'market.' + symbol + '.depth.' + this._caculateType(),id: symbol //} JSONObject jsonObject = JSON.parseObject(message); // 盘口的判断 if (jsonObject.containsKey("sub") && jsonObject.get("sub").toString().contains("depth")) { - log.info("订阅盘口消息:{}", session.getId()); + //log.info("订阅盘口消息:{}", session.getId()); String sub = jsonObject.get("sub").toString(); String symbol = sub.split("\\.")[1]; symbol = CoinTypeConvert.convert(symbol); @@ -86,11 +95,34 @@ map.put(session.getId(), session); tradeplateClients.put(symbol, map); } + // 发送一次盘口 + CoinTraderFactory factory = SpringContextHolder.getBean(CoinTraderFactory.class); + // 发送订阅消息 + String nekk = factory.getTrader("NEKK").sendTradePlateMessage(); + SubResultModel subResultModel = new SubResultModel(); + subResultModel.setId("nekkusdt"); + subResultModel.setSubbed(sub); + synchronized (session){ + try { + session.getBasicRemote().sendText(JSONObject.toJSONString(subResultModel)); + } catch (IOException e) { + e.printStackTrace(); + } + } + synchronized (session){ + try { + session.getBasicRemote().sendText(nekk); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } // 取消盘口订阅 if (jsonObject.containsKey("unsub") && jsonObject.get("unsub").toString().contains("depth")) { // `market.${symbol}.kline.${strPeriod} - log.info("取消订阅盘口消息:{}", session.getId()); + //log.info("取消订阅盘口消息:{}", session.getId()); String unsub = jsonObject.get("unsub").toString(); String[] split = unsub.split("\\."); String symbol = split[1]; @@ -112,38 +144,48 @@ // 取消订阅 {unsub: xxx(标识)} if (jsonObject.containsKey("sub") && jsonObject.get("sub").toString().contains("kline")) { // 订阅 - log.info("订阅最新K线消息:{}", session.getId()); String sub = jsonObject.get("sub").toString(); + log.info("订阅最新K线消息:{}", sub); String[] split = sub.split("\\."); String symbol = split[1]; symbol = CoinTypeConvert.convert(symbol); String period = split[3]; + if("60min".equals(period)){ + period = "1hour"; + } String key = symbol + "-" + period; + log.info("最新K线key:{}", key); if (klineClients.containsKey(key)) { // 有这个币种K线 Map<String, Session> stringSessionMap = klineClients.get(key); if (!stringSessionMap.containsKey(session.getId())) { stringSessionMap.put(session.getId(), session); + log.info("放入最新K线Map:{}", key); } } else { Map<String, Session> stringSessionMap = new HashMap<>(); stringSessionMap.put(session.getId(), session); klineClients.put(key, stringSessionMap); + log.info("放入最新K线Map:{}", key); } } // 取消订阅 if (jsonObject.containsKey("unsub") && jsonObject.get("unsub").toString().contains("kline")) { // `market.${symbol}.kline.${strPeriod} - log.info("取消订阅最新K消息:{}", session.getId()); + //log.info("取消订阅最新K消息:{}", session.getId()); String unsub = jsonObject.get("unsub").toString(); String[] split = unsub.split("\\."); String strPeriod = split[3]; + if("60min".equals(strPeriod)){ + strPeriod = "1hour"; + } String symbol = split[1]; symbol = CoinTypeConvert.convert(symbol); String key = symbol + "-" + strPeriod; if (klineClients.containsKey(key)) { klineClients.get(key).remove(session.getId()); + //session.getAsyncRemote().sendText(message); } } @@ -155,14 +197,38 @@ String symbol = split[1]; symbol = CoinTypeConvert.convert(symbol); String period = split[3]; + if("60min".equals(period)){ + period = "1hour"; + } //String key = symbol+"-"+period; // String key = "KINE_BCH/USDT_1week"; String key = "KINE_{}_{}"; // 币币k线数据 - key = StrUtil.format(key, symbol, period); + //key = StrUtil.format(key, symbol, period); + key = StrUtil.format(key, "NEKK/USDT", period); RedisUtils bean = SpringContextHolder.getBean(RedisUtils.class); Object o = bean.get(key); - sendMessageHistory(JSON.toJSONString(o), session); + List<CandlestickModel> candlestickModels = new ArrayList<>(); + CandlestickResult result = new CandlestickResult(); + result.setRep(sub); + if(o!=null){ + List<Candlestick> list = (List<Candlestick>)o; + for(Candlestick candlestick : list){ + CandlestickModel model = new CandlestickModel(); + model.setAmount(candlestick.getAmount()); + model.setClose(candlestick.getClose()); + model.setCount(candlestick.getCount()); + model.setHigh(candlestick.getHigh()); + model.setId(candlestick.getTimestamp()/1000); + model.setOpen(candlestick.getOpen()); + model.setLow(candlestick.getLow()); + model.setVol(candlestick.getVolume()); + candlestickModels.add(model); + } + result.setData(candlestickModels); + } + + sendMessageHistory(JSON.toJSONString(result), session); } } @@ -184,7 +250,7 @@ Session toSession = sessionEntry.getValue(); // 排除掉自己 //if (!fromSession.getId().equals(toSession.getId())) { - log.info("服务端给客户端[{}]发送盘口消息{}", toSession.getId(), message); + // log.info("服务端给客户端[{}]发送盘口消息{}", toSession.getId(), message); boolean open = toSession.isOpen(); if (open) { toSession.getAsyncRemote().sendText(message); @@ -197,7 +263,7 @@ } public void sendMessageHistory(String message, Session toSession) { - log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message); + // log.info("服务端给客户端[{}]发送历史K线", toSession.getId()); boolean open = toSession.isOpen(); if (open) { toSession.getAsyncRemote().sendText(message); @@ -205,19 +271,18 @@ } public void sendMessageKline(String symbol, String period, String message, Session fromSession) { + String key = symbol + "-" + period; + //log.info("发送最新K线[{}],数据[{}]",key,message); if (klineClients.containsKey(key)) { Map<String, Session> stringSessionMap = klineClients.get(key); for (Map.Entry<String, Session> sessionEntry : stringSessionMap.entrySet()) { Session toSession = sessionEntry.getValue(); - // 排除掉自己 - //if (!fromSession.getId().equals(toSession.getId())) { - log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message); boolean open = toSession.isOpen(); if (open) { + log.info("服务端给客户端[{}]发送最新K线消息{}", toSession.getId(), message); toSession.getAsyncRemote().sendText(message); } - // } } } } diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml index 45a0feb..a21709a 100644 --- a/src/main/resources/application-test.yml +++ b/src/main/resources/application-test.yml @@ -91,16 +91,17 @@ app: - debug: false + debug: true redis_expire: 3000 kline-update-job: false - newest-price-update-job: true + newest-price-update-job: false #日线 该任务不能与最新价处于同一个服务器 - day-line: true - other-job: true - loop-job: true + trade: false + day-line: false + other-job: false + loop-job: false rabbit-consumer: true - block-job: true + block-job: false aliyun: oss: diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index d8cae7a..a2ed99e 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,7 +5,7 @@ spring: profiles: - active: dev + active: test datasource: url: jdbc:mysql://rm-bp151tw8er79ig9kb5o.mysql.rds.aliyuncs.com:3306/db_biue?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2b8 username: ctcoin_data diff --git a/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml b/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml index 303667f..5277c94 100644 --- a/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml +++ b/src/main/resources/mapper/walletCoinOrder/OrderCoinDealDao.xml @@ -20,12 +20,15 @@ deal_amount buyTurnover, deal_amount sellTurnover, order_type direction, - create_time time + UNIX_TIMESTAMP(create_time) time from coins_order_deal where symbol = #{symbol} and order_type = 1 and order_status = 3 - and create_time between #{startTime} and #{endTime} + <if test="startTime != null and endTime != null"> + and create_time between #{startTime} and #{endTime} + </if> + </select> <select id="selectAllWalletCoinOrderBySymbol" resultType="com.xcong.excoin.modules.coin.entity.OrderCoinsDealEntity"> -- Gitblit v1.9.1