| | |
| | | log.info("[Gate] 空单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize); |
| | | |
| | | |
| | | accumulatedShortLossCount++; |
| | | checkShortStopLongProfit(accumulatedShortLossCount, shortGridElement.getId() + 2); |
| | | |
| | | } |
| | |
| | | // placeExcessTakeProfit(posSize, true); |
| | | log.info("[Gate] 多单成交 gridId:{}, 当前持仓:{}张", filledQty, posSize); |
| | | |
| | | accumulatedLongLossCount++; |
| | | checkLongStopShortProfit(accumulatedLongLossCount, longGridElement.getId() -2); |
| | | |
| | | } |
| | |
| | | } |
| | | |
| | | lastLongStopLossGridId = gridId; |
| | | |
| | | accumulatedLongLossCount++; |
| | | log.info("[Gate] 多仓止损触发 gridId:{}, 止损次数:{}{}, 开始追单", |
| | | gridId, accumulatedLongLossCount, sameGrid ? "(同网格)" : ""); |
| | | int newEntryGridId = gridId + 1; |
| | |
| | | */ |
| | | private void checkLongStopShortProfit(int times, int gridId) { |
| | | int[] r = ruleOf(times); |
| | | int maxPos = config.getMaxPositionSize(); |
| | | int maxPos = Integer.parseInt(config.getBaseQuantity()); |
| | | if (maxPos <= 0) { |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | // ---------- 己方(多仓)盈止(≥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); |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | |
| | |
| | | */ |
| | | private void checkShortStopLongProfit(int times, int gridId) { |
| | | int[] r = ruleOf(times); |
| | | int maxPos = config.getMaxPositionSize(); |
| | | int maxPos = Integer.parseInt(config.getBaseQuantity()); |
| | | if (maxPos <= 0) { |
| | | return; |
| | | } |
| | |
| | | } |
| | | |
| | | // ---------- 己方(空仓)盈止(≥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); |
| | | // } |
| | | // } |
| | | |
| | | } |
| | | |
| | |
| | | return; |
| | | } |
| | | lastShortStopLossGridId = gridId; |
| | | accumulatedShortLossCount++; |
| | | log.info("[Gate] 空仓止损触发 gridId:{}, 止损次数:{}{}, 开始追单", |
| | | gridId, accumulatedShortLossCount, sameGrid ? "(同网格)" : ""); |
| | | int newEntryGridId = gridId - 1; |