计算一组交易订单的总百分比



我试图从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类型,但关键位(累积事务量、计算)是相同的。

最新更新