1
zj
2024-08-02 a7bd76dfd00efc7b03999c4559cf8554e34c19cb
1
10 files modified
192 ■■■■■ changed files
src/main/java/project/admin/AdminFuturesOrderController.java 28 ●●●●● patch | view | raw | blame | history
src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java 13 ●●●● patch | view | raw | blame | history
src/main/java/project/data/internal/DataDBServiceImpl.java 8 ●●●● patch | view | raw | blame | history
src/main/java/project/data/job/GetDataJob.java 85 ●●●● patch | view | raw | blame | history
src/main/java/project/data/job/RealtimeWebsocketServer.java 8 ●●●● patch | view | raw | blame | history
src/main/java/project/futures/FuturesOrder.java 12 ●●●●● patch | view | raw | blame | history
src/main/java/project/futures/FuturesOrderService.java 1 ●●●● patch | view | raw | blame | history
src/main/java/project/futures/internal/AdminFuturesOrderServiceImpl.java 2 ●●● patch | view | raw | blame | history
src/main/java/project/futures/internal/FuturesOrderServiceImpl.java 4 ●●●● patch | view | raw | blame | history
src/main/java/project/project/web/admin/AdminContractOrderController.java 31 ●●●● patch | view | raw | blame | history
src/main/java/project/admin/AdminFuturesOrderController.java
@@ -7,6 +7,7 @@
import javax.servlet.http.HttpServletRequest;
import kernel.web.ApplicationUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -141,6 +142,33 @@
        return modelAndView;
    }
    @RequestMapping(action + "saveRemark.action")
    public ModelAndView saveRemark(HttpServletRequest request) {
        String orderNo = request.getParameter("orderNo");
        String remark = request.getParameter("remark");
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("futures_order_list");
        try {
            FuturesOrder byOrderNo = futuresOrderService.findByOrderNo(orderNo);
            if(null != byOrderNo){
                byOrderNo.setRemark(remark);
            }
            ApplicationUtil.executeUpdate(byOrderNo);
            futuresOrderService.updateCache(byOrderNo.getOrder_no(), byOrderNo);
            redisHandler.remove(FuturesRedisKeys.FUTURES_SUBMITTED_ORDERNO + byOrderNo.getOrder_no());
        } catch (BusinessException e) {
            modelAndView.addObject("error", e.getMessage());
            return modelAndView;
        } catch (Throwable t) {
            logger.error(" error ", t);
            modelAndView.addObject("error", "[ERROR] " + t.getMessage());
            return modelAndView;
        }
        return modelAndView;
    }
    /**
     * 获取 交割合约单 列表
     * <p>
src/main/java/project/contract/job/ContractOrderCalculationServiceImpl.java
@@ -89,7 +89,12 @@
     * @param currentPrice 当前点位
     */
    public void settle(ContractOrder order, String profit_loss, double currentPrice) {
//        (保证金*杠杆)= 仓位总价
//        (仓位总价/开仓价格)= 数量
//        (当前价格-开仓价格)* 数量 = 盈亏
//        (盈亏/保证金)*100 = 盈亏率
        logger.info("---------进入盈亏计算----------------");
        logger.info("---------order_close_line_type----------------"+order_close_line_type);
        double mul = Arith.mul(order.getDeposit_open(), order.getLever_rate());//仓位
        double div = Arith.div(mul, order.getTrade_avg_price());//持有币的数量
        double amount = Arith.mul(div, Arith.sub(currentPrice, order.getTrade_avg_price()));
@@ -210,15 +215,19 @@
            }
        } else {
            logger.info("---------进入单个持仓----------------");
            logger.info("---------order.getProfit()----------------"+order.getProfit());
            logger.info("---------order.getDeposit()----------------"+order.getDeposit());
            logger.info("---------order_close_line----------------"+order_close_line);
            if (order.getProfit() < 0 && (Arith.div(order.getDeposit(), Math.abs(order.getProfit())) <= Arith
                    .div(order_close_line, 100))) {
                logger.info("---------进入强平了----------------");
                /**
                 * 低于系统默认平仓线,进行强平
                 */
                this.contractOrderService.saveClose(order.getPartyId().toString(), order.getOrder_no());
                return;
            }
        }
    }
src/main/java/project/data/internal/DataDBServiceImpl.java
@@ -53,10 +53,10 @@
                entity.setLow(low);
            }
            
            Double h24Before = DataCache.getRealtime24HBeforeOpen().get(entity.getSymbol());
            if (h24Before != null) {
                entity.setOpen(h24Before);
            }
//            Double h24Before = DataCache.getRealtime24HBeforeOpen().get(entity.getSymbol());
//            if (h24Before != null) {
//                entity.setOpen(h24Before);
//            }
            
            /**
             * 时间有变化,才保存
src/main/java/project/data/job/GetDataJob.java
@@ -132,47 +132,50 @@
                }
                
                // 缓存中最新一条Realtime数据
                Realtime realtimeLast = DataCache.getRealtime(symbol);
                if (null != realtimeLast) {
                    // 临时处理:正常10秒超过25%也不合理,丢弃
                    double rate = Math.abs(Arith.sub(realtime.getClose(), realtimeLast.getClose()));
                    if (null == realtimeLast || Arith.div(rate, realtimeLast.getClose()) < 0.25D) {
                        Double high = DataCache.getRealtimeHigh().get(symbol);
                        Double low = DataCache.getRealtimeLow().get(symbol);
                        if (high == null || realtime.getClose() > high) {
                            DataCache.getRealtimeHigh().put(symbol, realtime.getClose());
                        }
                        if ((low == null || realtime.getClose() < low) && realtime.getClose() > 0) {
                            DataCache.getRealtimeLow().put(symbol, realtime.getClose());
                        }
                        this.dataDBService.saveAsyn(realtime);
                    } else {
                        Double high = DataCache.getRealtimeHigh().get(symbol);
                        Double low = DataCache.getRealtimeLow().get(symbol);
                        if (high == null || realtime.getClose() > high) {
                            DataCache.getRealtimeHigh().put(symbol, realtime.getClose());
                        }
                        if ((low == null || realtime.getClose() < low) && realtime.getClose() > 0) {
                            DataCache.getRealtimeLow().put(symbol, realtime.getClose());
                        }
                        this.dataDBService.saveAsyn(realtime);
                        logger.error("当前价格{},超过25%也不合理,丢弃Realtime,不入库", realtime.getClose());
                    }
                } else {
                    Double high = DataCache.getRealtimeHigh().get(symbol);
                    Double low = DataCache.getRealtimeLow().get(symbol);
                    if (high == null || realtime.getClose() > high) {
                        DataCache.getRealtimeHigh().put(symbol, realtime.getClose());
                    }
                    if ((low == null || realtime.getClose() < low) && realtime.getClose() > 0) {
                        DataCache.getRealtimeLow().put(symbol, realtime.getClose());
                    }
                    this.dataDBService.saveAsyn(realtime);
                }
                DataCache.getRealtimeHigh().put(symbol, realtime.getHigh());
                DataCache.getRealtimeLow().put(symbol, realtime.getLow());
                this.dataDBService.saveAsyn(realtime);
//                Realtime realtimeLast = DataCache.getRealtime(symbol);
//                if (null != realtimeLast) {
//                    // 临时处理:正常10秒超过25%也不合理,丢弃
//                    double rate = Math.abs(Arith.sub(realtime.getClose(), realtimeLast.getClose()));
//                    if (null == realtimeLast || Arith.div(rate, realtimeLast.getClose()) < 0.25D) {
//                        Double high = DataCache.getRealtimeHigh().get(symbol);
//                        Double low = DataCache.getRealtimeLow().get(symbol);
//
//                        if (high == null || realtime.getClose() > high) {
//                            DataCache.getRealtimeHigh().put(symbol, realtime.getClose());
//                        }
//                        if ((low == null || realtime.getClose() < low) && realtime.getClose() > 0) {
//                            DataCache.getRealtimeLow().put(symbol, realtime.getClose());
//                        }
//
//                        this.dataDBService.saveAsyn(realtime);
//                    } else {
//                        Double high = DataCache.getRealtimeHigh().get(symbol);
//                        Double low = DataCache.getRealtimeLow().get(symbol);
//
//                        if (high == null || realtime.getClose() > high) {
//                            DataCache.getRealtimeHigh().put(symbol, realtime.getClose());
//                        }
//                        if ((low == null || realtime.getClose() < low) && realtime.getClose() > 0) {
//                            DataCache.getRealtimeLow().put(symbol, realtime.getClose());
//                        }
//
//                        this.dataDBService.saveAsyn(realtime);
//                        logger.error("当前价格{},超过25%也不合理,丢弃Realtime,不入库", realtime.getClose());
//                    }
//                } else {
//                    Double high = DataCache.getRealtimeHigh().get(symbol);
//                    Double low = DataCache.getRealtimeLow().get(symbol);
//                    if (high == null || realtime.getClose() > high) {
//                        DataCache.getRealtimeHigh().put(symbol, realtime.getClose());
//                    }
//                    if ((low == null || realtime.getClose() < low) && realtime.getClose() > 0) {
//                        DataCache.getRealtimeLow().put(symbol, realtime.getClose());
//                    }
//                    this.dataDBService.saveAsyn(realtime);
//                }
            } catch (Exception e) {                
src/main/java/project/data/job/RealtimeWebsocketServer.java
@@ -130,10 +130,10 @@
                    realtime.setLow(low);
                }
                Double h24Before = DataCache.getRealtime24HBeforeOpen().get(symbol);
                if (h24Before != null) {
                    realtime.setOpen(h24Before);
                }
//                Double h24Before = DataCache.getRealtime24HBeforeOpen().get(symbol);
//                if (h24Before != null) {
//                    realtime.setOpen(h24Before);
//                }
                DataCache.putRealtime(symbol, realtime);
                // System.out.println(JSONObject.toJSONString(realtime));
src/main/java/project/futures/FuturesOrder.java
@@ -120,6 +120,18 @@
    @Column(name="PROFIT_LOSS")
    private String profit_loss;
    //备注
    @Column(name="REMARK")
    private String remark;
    public Serializable getRemark() {
        return remark;
    }
    public void setRemark(String remark) {
        this.remark = remark;
    }
    public Serializable getPartyId() {
        return partyId;
    }
src/main/java/project/futures/FuturesOrderService.java
@@ -85,4 +85,5 @@
     */
    public void saveCloseAllByPartyId(String partyId);
    void updateCache(String orderNo, FuturesOrder byOrderNo);
}
src/main/java/project/futures/internal/AdminFuturesOrderServiceImpl.java
@@ -23,7 +23,7 @@
            String username,String orderNo,String symbol,String direction,Double volume) {
        StringBuffer queryString = new StringBuffer("SELECT party.USERCODE usercode,party.ROLENAME rolename,orders.UUID id,orders.SYMBOL symbol,"
                + "orders.ORDER_NO order_no,orders.TRADE_AVG_PRICE trade_avg_price,orders.DIRECTION direction,orders.PROFIT_LOSS profit_loss,"
                + "orders.UNIT_AMOUNT unit_amount,orders.STATE state,FORMAT(orders.FEE,1) fee," + "orders.PROFIT profit,"
                + "orders.UNIT_AMOUNT unit_amount,orders.STATE state,orders.REMARK remark,FORMAT(orders.FEE,1) fee," + "orders.PROFIT profit,"
                + "FORMAT(orders.VOLUME,1) volume,item.NAME itemname,orders.TIMENUM timenum,orders.TIMEUNIT timeunit,"
                + "orders.CLOSE_AVG_PRICE close_avg_price,DATE_FORMAT(orders.CREATE_TIME,'%Y-%m-%d %H:%i:%s') create_time,DATE_FORMAT(orders.SETTLEMENT_TIME,'%Y-%m-%d %H:%i:%s')  settlement_time,");
//        queryString.append(" wallet.MONEY money,  ");
src/main/java/project/futures/internal/FuturesOrderServiceImpl.java
@@ -950,6 +950,10 @@
        }
    }
    public void updateCache(String orderNo, FuturesOrder byOrderNo){
        cache.put(byOrderNo.getOrder_no(), byOrderNo);
    }
    public void setWalletService(WalletService walletService) {
        this.walletService = walletService;
    }
src/main/java/project/project/web/admin/AdminContractOrderController.java
@@ -9,6 +9,7 @@
import java.util.List;
import java.util.Map;
import javax.persistence.Column;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.ObjectUtils;
@@ -119,10 +120,17 @@
                double quantity = positionValue / currentPrice;
                // 得到强平价格
                double liquidationPrice = currentPrice + (110 / quantity);
                DecimalFormat df = new DecimalFormat("#.#####");
                String formattedPrice = df.format(liquidationPrice);
                map.put("qiangPing",formattedPrice);
                if(null != map.get("direction")){
                    double liquidationPrice;
                    if(map.get("direction").equals("sell")){
                        liquidationPrice = currentPrice + (100 / quantity);
                    }else{
                        liquidationPrice = currentPrice - (100 / quantity);
                    }
                    DecimalFormat df = new DecimalFormat("#.#####");
                    String formattedPrice = df.format(liquidationPrice);
                    map.put("qiangPing",formattedPrice);
                }
            }
            List<Item> items = this.itemService.cacheGetAll();
@@ -223,10 +231,17 @@
                double quantity = positionValue / currentPrice;
                // 得到强平价格
                double liquidationPrice = currentPrice + (110 / quantity);
                DecimalFormat df = new DecimalFormat("#.#####");
                String formattedPrice = df.format(liquidationPrice);
                map.put("qiangPing",formattedPrice);
                if(null != map.get("direction")){
                    double liquidationPrice;
                    if(map.get("direction").equals("sell")){
                        liquidationPrice = currentPrice + (100 / quantity);
                    }else{
                        liquidationPrice = currentPrice - (100 / quantity);
                    }
                    DecimalFormat df = new DecimalFormat("#.#####");
                    String formattedPrice = df.format(liquidationPrice);
                    map.put("qiangPing",formattedPrice);
                }
            }
        } catch (BusinessException e) {