improve stack orders if low supply on station
This commit is contained in:
@@ -14,12 +14,40 @@ public class MarketUtils {
|
||||
List<Order> 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.<Order>reverseOrder());
|
||||
LOG.trace("Sort by profit by tonne");
|
||||
o.sort(orderComparatorByTonneProfit.reversed());
|
||||
LOG.trace("New order of orders {}", o);
|
||||
List<Order> stack = new ArrayList<>();
|
||||
long count = cargo;
|
||||
double 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");
|
||||
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.<Order>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);
|
||||
@@ -36,6 +64,7 @@ public class MarketUtils {
|
||||
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<Order> 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);
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user