| | |
| | | accFillSz, avgPx,state, fillFee,posSide |
| | | ); |
| | | |
| | | String clOrdIdStr = TradeOrderWs.getAccountMap(accountName).get("clOrdId"); |
| | | |
| | | Map<String, String> accountMap = getAccountMap(accountName); |
| | | String stateStr = TradeOrderWs.getAccountMap(accountName).get("state"); |
| | | boolean longSell = CoinEnums.POSSIDE_LONG.getCode().equals(posSide) && CoinEnums.SIDE_SELL.getCode().equals(side); |
| | | boolean shortBuy = CoinEnums.POSSIDE_SHORT.getCode().equals(posSide) && CoinEnums.SIDE_BUY.getCode().equals(side); |
| | | if ( |
| | | CoinEnums.ORDER_FILLED.getCode().equals(state) |
| | | && (longSell || shortBuy) |
| | | ){ |
| | | WsMapBuild.saveStringToMap(accountMap, "orderPrice",avgPx); |
| | | } |
| | | |
| | | String clOrdIdStr = TradeOrderWs.getAccountMap(accountName).get("clOrdId"); |
| | | if ( |
| | | StrUtil.isNotBlank(clOrdIdStr) |
| | | && clOrdId.equals(clOrdIdStr) |
| | | && StrUtil.isNotBlank(stateStr) |
| | | && state.equals(stateStr) |
| | | ){ |
| | | Map<String, String> accountMap = getAccountMap(accountName); |
| | | //记录成交均价 |
| | | if (accountMap.get("orderPrice") == null){ |
| | | log.info("成交均价: {}", avgPx); |
| | |
| | | WsMapBuild.saveStringToMap(accountWsMap, CoinEnums.READY_STATE.name(), CoinEnums.READY_STATE_NO.getCode()); |
| | | |
| | | log.info("{}: 订单详情已完成: {}, 自定义编号: {}", accountName, CoinEnums.HE_YUE.getCode(), clOrdId); |
| | | |
| | | |
| | | |
| | | TradeRequestParam tradeRequestParam = new TradeRequestParam(); |
| | | tradeRequestParam.setAccountName(accountName); |
| | |
| | | tradeRequestParam.setTdMode(CoinEnums.CROSS.getCode()); |
| | | tradeRequestParam.setPosSide(posSide); |
| | | tradeRequestParam.setOrdType(CoinEnums.ORDTYPE_LIMIT.getCode()); |
| | | // 获取平均持仓价格 |
| | | BigDecimal avgPxOld = positionsMap.get("avgPx"); |
| | | //根据持仓方向,判断是否需要设置限价止盈 |
| | | if (CoinEnums.POSSIDE_LONG.getCode().equals(posSide) && zhiYingPx.compareTo(avgPxOld) > 0){ |
| | | tradeRequestParam.setTradeType(OrderParamEnums.TRADE_NO.getValue()); |
| | | }else if (CoinEnums.POSSIDE_SHORT.getCode().equals(posSide) && zhiYingPx.compareTo(avgPxOld) < 0){ |
| | | tradeRequestParam.setTradeType(OrderParamEnums.TRADE_NO.getValue()); |
| | | }else{ |
| | | tradeRequestParam.setTradeType(OrderParamEnums.TRADE_YES.getValue()); |
| | | } |
| | | tradeRequestParam.setTradeType(OrderParamEnums.TRADE_YES.getValue()); |
| | | tradeRequestParam.setSide(CoinEnums.POSSIDE_LONG.getCode().equals(posSide) ? CoinEnums.SIDE_SELL.getCode() : CoinEnums.SIDE_BUY.getCode()); |
| | | tradeRequestParam.setClOrdId(WsParamBuild.getOrderNum(side)); |
| | |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | System.out.println( |
| | | getZhiYingPx( |
| | | "eth", |
| | | CoinEnums.POSSIDE_LONG.getCode(), |
| | | "0.0001", |
| | | new BigDecimal("0.1"), |
| | | new BigDecimal("0.05"), |
| | | new BigDecimal("1"), |
| | | new BigDecimal("2950"), |
| | | new BigDecimal("100")) |
| | | ); |
| | | } |
| | | /** |
| | | * 计算预期收益 |
| | | */ |
| | |
| | | BigDecimal contractMultiplier, BigDecimal avgPx, BigDecimal leverage |
| | | ) { |
| | | BigDecimal initMargin = getInitMargin(coinValue, coinNum, contractMultiplier, avgPx, leverage); |
| | | String pingCangImr = InstrumentsWs.getAccountMap(accountName).get(CoinEnums.PING_CANG_SHOUYI.name()); |
| | | String pingCangImr = StrUtil.isEmpty(InstrumentsWs.getAccountMap(accountName).get(CoinEnums.PING_CANG_SHOUYI.name())) ? "0.2" : InstrumentsWs.getAccountMap(accountName).get(CoinEnums.PING_CANG_SHOUYI.name()); |
| | | BigDecimal expectProfit = (initMargin).multiply(new BigDecimal(pingCangImr)).add(new BigDecimal(fillFee).abs()).setScale(4, RoundingMode.DOWN); |
| | | log.info("{}: 订单详情-预期收益: {}", accountName, expectProfit); |
| | | return getMarkPrice(expectProfit,posSide, coinValue, coinNum, contractMultiplier, avgPx, leverage); |
| | |
| | | */ |
| | | public static BigDecimal getInitMargin(BigDecimal coinValue, BigDecimal coinNum, BigDecimal contractMultiplier, BigDecimal avgPx, BigDecimal leverage) { |
| | | BigDecimal initMargin = coinValue.multiply(coinNum).multiply(contractMultiplier).multiply(avgPx).divide(leverage, 4, RoundingMode.DOWN); |
| | | log.info("{}: 订单详情-初始保证金: {}", initMargin); |
| | | log.info("订单详情-初始保证金: {}", initMargin); |
| | | return initMargin; |
| | | } |
| | | /** |