|  |  | 
 |  |  |  | 
 |  |  | import com.alibaba.fastjson.JSONObject; | 
 |  |  | import com.xcong.excoin.rabbit.producer.OrderProducer; | 
 |  |  | import lombok.extern.slf4j.Slf4j; | 
 |  |  | import org.apache.commons.collections.CollectionUtils; | 
 |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
 |  |  | import org.springframework.stereotype.Component; | 
 |  |  | 
 |  |  | import java.util.Map; | 
 |  |  | import java.util.concurrent.PriorityBlockingQueue; | 
 |  |  |  | 
 |  |  | @Slf4j | 
 |  |  | @Component | 
 |  |  | public class WebsocketPriceService { | 
 |  |  |  | 
 |  |  | 
 |  |  |      * @param symbol | 
 |  |  |      * @param price | 
 |  |  |      */ | 
 |  |  |     public  void comparePriceAsc(String symbol, String price) { | 
 |  |  |     public void comparePriceAsc(String symbol, String price) { | 
 |  |  |         // 比较价格 正序的 最小元素在头部 开多止盈 开空止损等 | 
 |  |  |         PriorityBlockingQueue<AscBigDecimal> queue = PricePriorityQueue.getQueueAsc(symbol); | 
 |  |  |         // 最小的 | 
 |  |  | 
 |  |  |         List<AscBigDecimal> list = new ArrayList<AscBigDecimal>(); | 
 |  |  |         // 找到所有比当前价格大的 是需要操作的 | 
 |  |  |         if (b != null && b.compareTo(now) <= 0) { | 
 |  |  |             log.info("--->{}", b.getValue()); | 
 |  |  |             // 可以操作 | 
 |  |  |             System.out.println("当前价格:" + price + "---正序---" + "队列价格:" + b.getValue().toPlainString()+" time:"+new Date()); | 
 |  |  |             System.out.println("当前价格:" + price + "---正序---" + "队列价格:" + b.getValue().toPlainString() + " time:" + new Date()); | 
 |  |  |             log.info("--->>>>{}", queue.peek().getValue()); | 
 |  |  |             while (queue.peek() != null && queue.peek().compareTo(now) <= 0) { | 
 |  |  |                 // 可以发送消息操作 | 
 |  |  |                 list.add(queue.remove()); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         if(CollectionUtils.isNotEmpty(list)){ | 
 |  |  |             dealAscPriceOrderAndSenMq(list,symbol); | 
 |  |  |         if (CollectionUtils.isNotEmpty(list)) { | 
 |  |  |             dealAscPriceOrderAndSenMq(list, symbol); | 
 |  |  |         } | 
 |  |  |           | 
 |  |  |  | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public  void comparePriceDesc(String symbol, String price) { | 
 |  |  |     public void comparePriceDesc(String symbol, String price) { | 
 |  |  |         // 比较价格 倒叙的 开多止损  开空止盈 | 
 |  |  |         PriorityBlockingQueue<DescBigDecimal> queue = PricePriorityQueue.getQueueDesc(symbol); | 
 |  |  |         // 最大价格 | 
 |  |  | 
 |  |  |         // 找到比当前价格还大的就是需要操作的 开多止损 | 
 |  |  |         // 即最大的币当前价大 那么需要开多止损 | 
 |  |  |         if (b != null && b.compareTo(now) <= 0) { | 
 |  |  |             log.info("--->{}", b.getValue()); | 
 |  |  |             // 可以操作 | 
 |  |  |             System.out.println("当前价格:" + price + "---倒序操作---" + "队列:" + b.getValue().toPlainString()+" time:"+new Date()); | 
 |  |  |             System.out.println("当前价格:" + price + "---倒序操作---" + "队列:" + b.getValue().toPlainString() + " time:" + new Date()); | 
 |  |  |  | 
 |  |  |             log.info("--->>>>{}", queue.peek().getValue()); | 
 |  |  |             while (queue.peek() != null && queue.peek().compareTo(now) <= 0) { | 
 |  |  |                 // 可以发送消息操作 | 
 |  |  |                 list.add(queue.remove()); | 
 |  |  |                 log.info("#{}#", JSONObject.toJSONString(list)); | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |         if(CollectionUtils.isNotEmpty(list)){ | 
 |  |  |             dealDescPriceOrderAndSenMq(list,symbol); | 
 |  |  |         if (CollectionUtils.isNotEmpty(list)) { | 
 |  |  |             dealDescPriceOrderAndSenMq(list, symbol); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |     } | 
 |  |  | 
 |  |  |             List<OrderModel> orderModelList = new ArrayList<OrderModel>(); | 
 |  |  |             // 3 正序 | 
 |  |  |             Map<String, List<OrderModel>> orderMap = PricePriorityQueue.getOrderMap(symbol, 3); | 
 |  |  |             log.info("--->{}", JSONObject.toJSONString(orderMap)); | 
 |  |  |             // 根据价格查询到对应的订单 | 
 |  |  |             for (AscBigDecimal asc : list) { | 
 |  |  |                 String key = asc.getValue().toPlainString(); | 
 |  |  |                 if(orderMap.containsKey(key)){ | 
 |  |  |                 log.info("------>>>>>{}", key); | 
 |  |  |                 assert orderMap != null; | 
 |  |  |                 log.info("======={}", orderMap.containsKey(key)); | 
 |  |  |                 if (orderMap.containsKey(key)) { | 
 |  |  |                     orderModelList.addAll(orderMap.get(key)); | 
 |  |  |                     orderMap.remove(key); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if(CollectionUtils.isEmpty(orderModelList)){ | 
 |  |  |             log.info("{}", orderModelList); | 
 |  |  |             if (CollectionUtils.isEmpty(orderModelList)) { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |             System.out.println("本次执行的列表ASC"); | 
 |  |  | 
 |  |  |             // 3:开空  7:爆仓平空 | 
 |  |  |             // 9:止盈平多 12:止损平空 | 
 |  |  |             for (OrderModel model : orderModelList) { | 
 |  |  |                 List<OrderModel> kkzsList = null; | 
 |  |  |                 List<OrderModel> kdzyList = null; | 
 |  |  |                 List<OrderModel> bcList = null; | 
 |  |  |                 List<OrderModel> wtkkList = null; | 
 |  |  |                 // 止损平空 | 
 |  |  |                 List<OrderModel> kkzsList = new ArrayList<OrderModel>(); | 
 |  |  |                 // 止盈平多 | 
 |  |  |                 List<OrderModel> kdzyList = new ArrayList<OrderModel>(); | 
 |  |  |                 // 爆仓平空 | 
 |  |  |                 List<OrderModel> bcList = new ArrayList<OrderModel>(); | 
 |  |  |                 // 开空 | 
 |  |  |                 List<OrderModel> wtkkList = new ArrayList<OrderModel>(); | 
 |  |  |                 switch (model.getType()) { | 
 |  |  |                     case 3: | 
 |  |  |                         if (wtkkList == null) { | 
 |  |  |                             wtkkList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         wtkkList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     case 7: | 
 |  |  |                         if (bcList == null) { | 
 |  |  |                             bcList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         bcList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     case 9: | 
 |  |  |                         if (kdzyList == null) { | 
 |  |  |                             kdzyList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         kdzyList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     case 12: | 
 |  |  |                         if (kkzsList == null) { | 
 |  |  |                             kkzsList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         kkzsList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     default: | 
 |  |  |                         log.info("#price-service unknow type#"); | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 发送消息 | 
 |  |  |                 if(CollectionUtils.isNotEmpty(kkzsList)){ | 
 |  |  |                     String kkzs= JSONObject.toJSONString(kkzsList); | 
 |  |  |                 if (CollectionUtils.isNotEmpty(kkzsList)) { | 
 |  |  |                     String kkzs = JSONObject.toJSONString(kkzsList); | 
 |  |  |                     orderProducer.sendLessLoss(kkzs); | 
 |  |  |                 } | 
 |  |  |                 if(CollectionUtils.isNotEmpty(kdzyList)){ | 
 |  |  |                     String kdzy  = JSONObject.toJSONString(kdzyList); | 
 |  |  |                 if (CollectionUtils.isNotEmpty(kdzyList)) { | 
 |  |  |                     String kdzy = JSONObject.toJSONString(kdzyList); | 
 |  |  |                     orderProducer.sendMorePro(kdzy); | 
 |  |  |                 } | 
 |  |  |                 if(CollectionUtils.isNotEmpty(bcList)){ | 
 |  |  |                 if (CollectionUtils.isNotEmpty(bcList)) { | 
 |  |  |                     orderProducer.sendCoinout(JSONObject.toJSONString(bcList)); | 
 |  |  |                 } | 
 |  |  |                 if(CollectionUtils.isNotEmpty(wtkkList)){ | 
 |  |  |                 if (CollectionUtils.isNotEmpty(wtkkList)) { | 
 |  |  |                     orderProducer.sendLimit(JSONObject.toJSONString(wtkkList)); | 
 |  |  |  | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  | 
 |  |  |             // 根据不同类型发送不同消息  1 倒序 2  正序 | 
 |  |  |             List<OrderModel> orderModelList = new ArrayList<OrderModel>(); | 
 |  |  |             Map<String, List<OrderModel>> orderMap = PricePriorityQueue.getOrderMap(symbol, 2); | 
 |  |  |             log.info("--->{}", JSONObject.toJSONString(orderMap)); | 
 |  |  |             // 根据价格查询到对应的订单 | 
 |  |  |             for (DescBigDecimal desc : list) { | 
 |  |  |                 String key = desc.getValue().toPlainString(); | 
 |  |  |                 if(orderMap.containsKey(key)){ | 
 |  |  |                 log.info("------>>>>>{}", key); | 
 |  |  |                 assert orderMap != null; | 
 |  |  |                 log.info("======={}", orderMap.containsKey(key)); | 
 |  |  |                 if (orderMap.containsKey(key)) { | 
 |  |  |                     orderModelList.addAll(orderMap.get(key)); | 
 |  |  |                     orderMap.remove(key); | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |             } | 
 |  |  |  | 
 |  |  |             if(CollectionUtils.isEmpty(orderModelList)){ | 
 |  |  |             log.info("{}", orderModelList); | 
 |  |  |             if (CollectionUtils.isEmpty(orderModelList)) { | 
 |  |  |                 return; | 
 |  |  |             } | 
 |  |  |             System.out.println("本次执行的列表Desc"); | 
 |  |  | 
 |  |  |             // 2:开多6:爆仓平多 | 
 |  |  |             // 10:止盈平空11:止损平多 | 
 |  |  |             for (OrderModel model : orderModelList) { | 
 |  |  |                 List<OrderModel> kkzyList = null; | 
 |  |  |                 List<OrderModel> kdzsList = null; | 
 |  |  |                 List<OrderModel> bcList = null; | 
 |  |  |                 List<OrderModel> wtkdList = null; | 
 |  |  |                 // 开空止盈 | 
 |  |  |                 List<OrderModel> kkzyList = new ArrayList<OrderModel>(); | 
 |  |  |                 // 开多止损 | 
 |  |  |                 List<OrderModel> kdzsList = new ArrayList<OrderModel>(); | 
 |  |  |                 // 爆仓 | 
 |  |  |                 List<OrderModel> bcList = new ArrayList<OrderModel>(); | 
 |  |  |                 // 开多委托 | 
 |  |  |                 List<OrderModel> wtkdList = new ArrayList<OrderModel>(); | 
 |  |  |                 switch (model.getType()) { | 
 |  |  |                     case 2: | 
 |  |  |                         if (wtkdList == null) { | 
 |  |  |                             wtkdList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         wtkdList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     case 6: | 
 |  |  |                         if (bcList == null) { | 
 |  |  |                             bcList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         bcList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     case 10: | 
 |  |  |                         if (kkzyList == null) { | 
 |  |  |                             kkzyList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         kkzyList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     case 11: | 
 |  |  |                         if (kdzsList == null) { | 
 |  |  |                             kdzsList = new ArrayList<OrderModel>(); | 
 |  |  |                         } | 
 |  |  |                         kdzsList.add(model); | 
 |  |  |                         break; | 
 |  |  |                     default: | 
 |  |  |                         break; | 
 |  |  |                 } | 
 |  |  |  | 
 |  |  |                 // 发送消息 | 
 |  |  |                 if(CollectionUtils.isNotEmpty(kkzyList)){ | 
 |  |  |                     String kkzy= JSONObject.toJSONString(kkzyList); | 
 |  |  |                 if (CollectionUtils.isNotEmpty(kkzyList)) { | 
 |  |  |                     String kkzy = JSONObject.toJSONString(kkzyList); | 
 |  |  |                     orderProducer.sendLessPro(kkzy); | 
 |  |  |                 } | 
 |  |  |                 if(CollectionUtils.isNotEmpty(kdzsList)){ | 
 |  |  |                     String kdzs  = JSONObject.toJSONString(kdzsList); | 
 |  |  |                 if (CollectionUtils.isNotEmpty(kdzsList)) { | 
 |  |  |                     String kdzs = JSONObject.toJSONString(kdzsList); | 
 |  |  |                     orderProducer.sendMoreLoss(kdzs); | 
 |  |  |                 } | 
 |  |  |                 if(CollectionUtils.isNotEmpty(bcList)){ | 
 |  |  |                 if (CollectionUtils.isNotEmpty(bcList)) { | 
 |  |  |                     orderProducer.sendCoinout(JSONObject.toJSONString(bcList)); | 
 |  |  |                 } | 
 |  |  |                 if(CollectionUtils.isNotEmpty(wtkdList)){ | 
 |  |  |                 if (CollectionUtils.isNotEmpty(wtkdList)) { | 
 |  |  |                     orderProducer.sendLimit(JSONObject.toJSONString(wtkdList)); | 
 |  |  |  | 
 |  |  |                 } |