package com.yami.trading.admin.task.contract; import com.yami.trading.bean.contract.domain.ContractApplyOrder; import com.yami.trading.bean.contract.domain.ContractOrder; import com.yami.trading.bean.data.domain.Realtime; import com.yami.trading.bean.item.domain.Item; import com.yami.trading.common.exception.YamiShopBindException; import com.yami.trading.common.util.MarketOpenChecker; import com.yami.trading.common.util.ThreadUtils; import com.yami.trading.service.contract.ContractApplyOrderService; import com.yami.trading.service.contract.ContractLock; import com.yami.trading.service.contract.ContractOrderService; import com.yami.trading.service.data.DataService; import com.yami.trading.service.item.ItemService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.List; /** * * 委托单进入市场 */ @Slf4j @Component public class ContractApplyOrderHandleJob implements Runnable { @Autowired private ContractOrderService contractOrderService; @Autowired private ContractApplyOrderService contractApplyOrderService; @Autowired @Qualifier("dataService") private DataService dataService; @Autowired private ItemService itemService; public void run() { /* * 系统启动先暂停30秒 */ ThreadUtils.sleep(1000 * 30); while (true) try { List list = this.contractApplyOrderService.findSubmitted(); for (int i = 0; i < list.size(); i++) { ContractApplyOrder order = list.get(i); List realtime_list = this.dataService.realtime(order.getSymbol()); Realtime realtime = null; if (realtime_list.size() > 0) { realtime = realtime_list.get(0); } else { continue; } // 休市不做撮合 Item bySymbol = itemService.findBySymbol(order.getSymbol()); if(bySymbol == null){ continue; } boolean isOpen = MarketOpenChecker.isMarketOpenByItemCloseType(bySymbol.getOpenCloseType()); if(!isOpen){ continue; } if ("limit".equals(order.getOrderPriceType())) { /** * 限价单 */ if ("buy".equals(order.getDirection())) { /** * 买涨 */ if (realtime.getClose().compareTo(order.getPrice())<=0) { this.handle(order, realtime); } } else { /** * 买跌 */ if (realtime.getClose().compareTo(order.getPrice())>=0){ this.handle(order, realtime); } } } else { /** * 非限制,直接进入市 场 */ this.handle(order, realtime); } } } catch (Exception e) { log.error("run fail", e); } finally { ThreadUtils.sleep(1000 * 1); } } public void handle(ContractApplyOrder applyOrder, Realtime realtime) { boolean lock = false; try { if (!ContractLock.add(applyOrder.getOrderNo())) { return; } lock = true; if ("open".equals(applyOrder.getOffset())) { this.contractOrderService.saveOpen(applyOrder, realtime); } else if ("close".equals(applyOrder.getOffset())) { /** * 平仓 */ List list = this.contractOrderService.findSubmitted(applyOrder.getPartyId().toString(), applyOrder.getSymbol(), applyOrder.getDirection()); if (list.size() == 0) { applyOrder.setVolume(BigDecimal.ZERO); applyOrder.setState(ContractApplyOrder.STATE_CREATED); this.contractApplyOrderService.updateById(applyOrder); } for (int i = 0; i < list.size(); i++) { ContractOrder order = list.get(i); boolean lock_order = false; try { if (!ContractLock.add(order.getOrderNo())) { continue; } lock_order = true; applyOrder = this.contractOrderService.saveClose(applyOrder, realtime, order.getOrderNo()); if (ContractApplyOrder.STATE_CREATED.equals(applyOrder.getState())) { break; } } catch (Exception e) { log.error("error:", e); } finally { if (lock_order) { ThreadUtils.sleep(100); ContractLock.remove(order.getOrderNo()); } } } } } catch (Exception e) { log.error("error:", e); } finally { if (lock) { ThreadUtils.sleep(100); ContractLock.remove(applyOrder.getOrderNo()); } } } public void start(){ new Thread(this, "ContractApplyOrderHandleJob").start(); if (log.isInfoEnabled()) log.info("委托单处理线程启动!"); } public void setContractOrderService(ContractOrderService contractOrderService) { this.contractOrderService = contractOrderService; } public void setContractApplyOrderService(ContractApplyOrderService contractApplyOrderService) { this.contractApplyOrderService = contractApplyOrderService; } public void setDataService(DataService dataService) { this.dataService = dataService; } }