| | |
| | | */ |
| | | public void onKline(BigDecimal closePrice) { |
| | | |
| | | log.info("当前价:{}", closePrice); |
| | | // log.info("当前价:{}", closePrice); |
| | | |
| | | lastKlinePrice = closePrice; |
| | | |
| | |
| | | // times {满仓%, 阈值%} |
| | | put(1, new int[]{0, 0}); |
| | | put(2, new int[]{0, 0}); |
| | | put(3, new int[]{30, 0}); |
| | | put(3, new int[]{10, 0}); |
| | | put(4, new int[]{0, 0}); |
| | | put(5, new int[]{0, 0}); |
| | | put(6, new int[]{40, 40}); |
| | | put(6, new int[]{20, 40}); |
| | | put(7, new int[]{0, 0}); |
| | | put(8, new int[]{0, 0}); |
| | | put(9, new int[]{50, 50}); |
| | | put(9, new int[]{30, 50}); |
| | | put(10, new int[]{0, 0}); |
| | | put(11, new int[]{0, 0}); |
| | | put(12, new int[]{55, 60}); |
| | | put(12, new int[]{40, 60}); |
| | | put(13, new int[]{0, 0}); |
| | | put(14, new int[]{0, 0}); |
| | | put(15, new int[]{60, 60}); |
| | | put(15, new int[]{50, 60}); |
| | | put(16, new int[]{0, 0}); |
| | | put(17, new int[]{0, 0}); |
| | | put(18, new int[]{65, 65}); |
| | | put(18, new int[]{55, 65}); |
| | | put(19, new int[]{0, 0}); |
| | | put(20, new int[]{0, 0}); |
| | | put(21, new int[]{70, 70}); |
| | | put(21, new int[]{60, 70}); |
| | | put(22, new int[]{0, 0}); |
| | | put(23, new int[]{0, 0}); |
| | | put(24, new int[]{75, 75}); |
| | | put(24, new int[]{65, 75}); |
| | | put(25, new int[]{0, 0}); |
| | | put(26, new int[]{0, 0}); |
| | | put(27, new int[]{80, 80}); |
| | | put(27, new int[]{70, 80}); |
| | | put(28, new int[]{0, 0}); |
| | | put(29, new int[]{0, 0}); |
| | | put(30, new int[]{85, 85}); |
| | | put(30, new int[]{75, 85}); |
| | | put(31, new int[]{0, 0}); |
| | | put(32, new int[]{0, 0}); |
| | | } |
| | |
| | | } |
| | | |
| | | // ---------- 己方(多仓)盈止(≥6次) ---------- |
| | | if (times >= 6 && thresholdPct > 0) { |
| | | int selfPos = Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue()); |
| | | int excess = selfPos - thresholdPosNum; |
| | | if (excess > 0) { |
| | | int perOrderQty = maxPos * DEFAULT_STOP_LOSS_PERCENT / 100; |
| | | if (perOrderQty <= 0) { |
| | | perOrderQty = 1; |
| | | } |
| | | int totalOrders = excess / perOrderQty; |
| | | if (totalOrders <= 0) { |
| | | totalOrders = 1; |
| | | } |
| | | int entryGridId = 0; // 多仓建仓格 |
| | | for (int i = 0; i < totalOrders; i++) { |
| | | int tpGridId = entryGridId + 2 * (i + 1); // 朝盈利方向(向上)间隔2格 |
| | | GridElement tpElem = GridElement.findById(tpGridId); |
| | | if (tpElem == null) { |
| | | break; |
| | | } |
| | | placeTakeProfitAtGrid(tpElem, true, perOrderQty, times); |
| | | } |
| | | log.info("[Gate] 止损{}→己方多仓止盈, excess:{}, 挂{}单, 每单{}张", |
| | | times, excess, totalOrders, perOrderQty); |
| | | } |
| | | } |
| | | // if (times >= 6 && thresholdPct > 0) { |
| | | // int selfPos = Math.max(queryPositionSize(Position.ModeEnum.DUAL_LONG), longPositionSize.intValue()); |
| | | // int excess = selfPos - thresholdPosNum; |
| | | // if (excess > 0) { |
| | | // int perOrderQty = maxPos * DEFAULT_STOP_LOSS_PERCENT / 100; |
| | | // if (perOrderQty <= 0) { |
| | | // perOrderQty = 1; |
| | | // } |
| | | // int totalOrders = excess / perOrderQty; |
| | | // if (totalOrders <= 0) { |
| | | // totalOrders = 1; |
| | | // } |
| | | // int entryGridId = 0; // 多仓建仓格 |
| | | // for (int i = 0; i < totalOrders; i++) { |
| | | // int tpGridId = entryGridId + 2 * (i + 1); // 朝盈利方向(向上)间隔2格 |
| | | // GridElement tpElem = GridElement.findById(tpGridId); |
| | | // if (tpElem == null) { |
| | | // break; |
| | | // } |
| | | // placeTakeProfitAtGrid(tpElem, true, perOrderQty, times); |
| | | // } |
| | | // log.info("[Gate] 止损{}→己方多仓止盈, excess:{}, 挂{}单, 每单{}张", |
| | | // times, excess, totalOrders, perOrderQty); |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | // ---------- 己方(空仓)盈止(≥6次) ---------- |
| | | if (times >= 6 && thresholdPct > 0) { |
| | | int selfPos = Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue()); |
| | | int excess = selfPos - thresholdPosNum; |
| | | if (excess > 0) { |
| | | int perOrderQty = maxPos * DEFAULT_STOP_LOSS_PERCENT / 100; |
| | | if (perOrderQty <= 0) { |
| | | perOrderQty = 1; |
| | | } |
| | | int totalOrders = excess / perOrderQty; |
| | | if (totalOrders <= 0) { |
| | | totalOrders = 1; |
| | | } |
| | | int entryGridId = 0; // 空仓建仓格 |
| | | for (int i = 0; i < totalOrders; i++) { |
| | | int tpGridId = entryGridId - 2 * (i + 1); // 朝盈利方向(向下)间隔2格 |
| | | GridElement tpElem = GridElement.findById(tpGridId); |
| | | if (tpElem == null) { |
| | | break; |
| | | } |
| | | placeTakeProfitAtGrid(tpElem, false, perOrderQty, times); |
| | | } |
| | | log.info("[Gate] 止损{}→己方空仓止盈, excess:{}, 挂{}单, 每单{}张", |
| | | times, excess, totalOrders, perOrderQty); |
| | | } |
| | | } |
| | | // if (times >= 6 && thresholdPct > 0) { |
| | | // int selfPos = Math.max(queryPositionSize(Position.ModeEnum.DUAL_SHORT), shortPositionSize.intValue()); |
| | | // int excess = selfPos - thresholdPosNum; |
| | | // if (excess > 0) { |
| | | // int perOrderQty = maxPos * DEFAULT_STOP_LOSS_PERCENT / 100; |
| | | // if (perOrderQty <= 0) { |
| | | // perOrderQty = 1; |
| | | // } |
| | | // int totalOrders = excess / perOrderQty; |
| | | // if (totalOrders <= 0) { |
| | | // totalOrders = 1; |
| | | // } |
| | | // int entryGridId = 0; // 空仓建仓格 |
| | | // for (int i = 0; i < totalOrders; i++) { |
| | | // int tpGridId = entryGridId - 2 * (i + 1); // 朝盈利方向(向下)间隔2格 |
| | | // GridElement tpElem = GridElement.findById(tpGridId); |
| | | // if (tpElem == null) { |
| | | // break; |
| | | // } |
| | | // placeTakeProfitAtGrid(tpElem, false, perOrderQty, times); |
| | | // } |
| | | // log.info("[Gate] 止损{}→己方空仓止盈, excess:{}, 挂{}单, 每单{}张", |
| | | // times, excess, totalOrders, perOrderQty); |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | |