【问题标题】:Calculate total percent from a suite of trading orders计算一组交易订单的总百分比
【发布时间】:2023-03-15 11:05:01
【问题描述】:

我尝试从 Java 中的一组简单交易订单中总结百分比。

假设“订单”由仓位(买入/卖出)、价格和数量组成。 如果我有:

时间 |职位 |数量 |价格

第 1 天:10 美元买 1 件

第 2 天:以 12 美元卖出 1 个

我已经赚了 20%,而且很容易编程。 但是......再举一个例子,我不够聪明,无法找到获得总百分比的正确方法:

时间 |职位 |数量 |市场价格

第 1 天:10 美元买 1 件

第 2 天:以 12 美元卖出 1 -> (20%)

第 3 天:以 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;
}

【问题讨论】:

  • 我不关注,你能“卖你没有的东西”吗?好像你买了1次,卖了3次。另外,这里的 2 有什么影响?你花了 10 美元买了它,却没有从这项投资中看到任何回报,难道不应该以某种方式考虑吗?
  • 您要计算交易的收益/损失百分比吗?例如,在您的第二个示例中,总共以 30 美元的价格购买了 n 个单位,以 39 美元的价格出售了 n 个单位,因此收益为 30% -
  • 把销售收入加起来。将购买的总金额加起来。根据这两个计算百分比增益,就像您在更简单的示例中所做的那样。正如@jdphenix 指出的那样,在这个例子中是 30%,而不是 90%。
  • “我不够聪明”-是的,你是,不要侮辱自己:)
  • @amit:是的,我可以卖掉我没有的东西。 2是数量。我编辑帖子

标签: java percentage trading


【解决方案1】:

假设如下:

你有一些类型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&lt;MarketOrder&gt; 代表你想要计算利润的交易,然后在 MarketOrder 上声明一个静态方法来计算 Collection&lt;MarketOrder&gt; 的利润或损失,

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

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2020-10-08
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多