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

时间:2014-08-26 21:48:16

标签: java percentage trading

我尝试用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;
}

1 个答案:

答案 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类型,但关键位(累积事务量,进行数学运算)是相同的。