我试图从Java中的一组简单交易订单中总结百分比。
比方说;订单;由头寸(买入/卖出)、价格和数量组成。如果我有:
时间|位置|数量|价格
DAY1:以10美元购买1
DAY2:12美元卖出1
我已经赚了20%,而且很容易编程。但是举另一个例子,我不够聪明,无法找到正确的方法来获得总百分比:
时间|位置|数量|市场价格
DAY1:以10美元购买1
DAY2:以12$->卖出1;(20%)
DAY3:以10美元购买2;(0%)
第4天:以13$->卖出1;(30%)
DAY5:以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;
}
假设如下:
你有一些类型的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>
、的利润或损失
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
类型,但关键位(累积事务量、计算)是相同的。