我尝试用Java中的一套简单交易订单来总结百分比。
假设“订单”由头寸(买/卖),价格和数量组成。 如果我有:
时间|位置|数量|价格
第1天:以10美元买入1
第二天:以12美元卖出1
我已经制作了20%,并且很容易编程。 但是......换个例子,我不够聪明,无法找到获得总百分比的正确方法:
时间|位置|数量|市场价格
第1天:以10美元买入1
第二天:以12 $卖出1 - > (20%)
第3天:以10美元买入2 - > (0%)
第四天:以13美元卖出1 - > (30%)
第五天:以14美元卖出1 - > (40%)
总共有90%。
第一个问题,这些百分比可以总结吗? (它在数学上是否正确?)
其次,你将如何在java中做到这一点?
以下是一个示例方法,仅适用于第一个示例:
public static double getTotalPercent(List<MarketOrder> orders) {
double percent = 0;
MarketOrder previousOrder = orders.get(0);
for (int i = 1; i < orders.size(); i++) {
MarketOrder order = orders.get(i);
percent += getPercent(previousOrder, order);
previousOrder = order;
}
return percent;
}
答案 0 :(得分:0)
假设如下:
你有一些类似MarketOrder
的类型,
class MarketOrder {
public static enum OrderType {
BUY,
SELL,
}
private final MarketOrder.OrderType type;
private final int amount;
private final int money;
public MarketOrder(MarketOrder.OrderType type, int amount, int money) {
if (amount < 1 || money < 1) {
throw new IllegalArgumentException();
}
this.type = type;
this.amount = amount;
this.money = money;
}
}
并且您有一些Collection<MarketOrder>
代表您想要计算利润的交易,然后在MarketOrder
上声明一个计算Collection<MarketOrder>
的利润或亏损的静态方法,< / p>
public static double calculateProfit(Collection<MarketOrder> orders) {
if (orders == null) {
throw new NullPointerException("orders is null");
}
int buyTotal = 0, sellTotal = 0, buyMoney = 0, sellMoney = 0;
for (MarketOrder order : orders) {
if (order.type == MarketOrder.OrderType.BUY) { // accumulate the units bought and money
buyTotal += order.amount;
buyMoney += order.money * order.amount;
} else {
sellTotal += order.amount;
sellMoney += order.money * order.amount;
}
}
if (buyTotal != sellTotal) {
throw new IllegalArgumentException("buyTotal != sellTotal");
}
return ((double)sellMoney/(double)buyMoney) - 1;
}
显然,您需要确定的确切代码取决于您的MarketOrder
类型,但关键位(累积事务量,进行数学运算)是相同的。