diff --git a/core/src/main/java/ru/trader/analysis/MarketUtils.java b/core/src/main/java/ru/trader/analysis/MarketUtils.java index c4baacd..4f44558 100644 --- a/core/src/main/java/ru/trader/analysis/MarketUtils.java +++ b/core/src/main/java/ru/trader/analysis/MarketUtils.java @@ -14,8 +14,8 @@ public class MarketUtils { List o = new ArrayList<>(orders); LOG.trace("Fill stack orders {}, balance {}", o, balance); o.forEach(or -> or.setMax(balance, cargo)); - LOG.trace("Simple sort"); - o.sort(Comparator.reverseOrder()); + LOG.trace("Sort by profit by tonne"); + o.sort(orderComparatorByTonneProfit.reversed()); LOG.trace("New order of orders {}", o); List stack = new ArrayList<>(); long count = cargo; @@ -30,12 +30,41 @@ public class MarketUtils { LOG.trace("Remain cargo {}, remain balance {}", count, remain); } else { LOG.trace("Low profit, stopped"); - remain = 0; + if (order.getCount() == 0 && order.getSell().getCount() > 0) { + remain = -1; + } else { + remain = 0; + } } if (count <= 0 || remain <= 0) { break; } } + if (remain < 0) { + LOG.trace("Low balance, try fill"); + LOG.trace("Simple sort"); + o.sort(Comparator.reverseOrder()); + LOG.trace("New order of orders {}", o); + stack.clear(); + count = cargo; + remain = balance; + for (Order order : o) { + order = new Order(order.getSell(), order.getBuy(), remain, count); + LOG.trace("Next best order {}", order); + if (order.getProfit() > 0) { + stack.add(order); + remain -= order.getCount() * order.getSell().getPrice(); + count -= order.getCount(); + LOG.trace("Remain cargo {}, remain balance {}", count, remain); + } else { + LOG.trace("Low profit, stopped"); + remain = 0; + } + if (count <= 0 || remain <= 0) { + break; + } + } + } LOG.trace("Stack: {}", stack); return stack; } @@ -80,4 +109,14 @@ public class MarketUtils { public static boolean hasMarket(Vendor vendor) { return vendor.has(SERVICE_TYPE.MARKET) || vendor.has(SERVICE_TYPE.BLACK_MARKET); } + + private final static Comparator orderComparatorByTonneProfit = (o1, o2) -> { + if (o1 == o2) return 0; + if (o1.getProfit() > 0 || o2.getProfit() > 0) { + if (o1.getProfit() <= 0) return -1; + if (o2.getProfit() <= 0) return 1; + return Double.compare(o1.getProfitByTonne(), o2.getProfitByTonne()); + } + return o1.compareTo(o2); + }; }