0

我正在使用 php/mysql 在 yahoo 上编写一个基于 yahoo 的股票市场交易游戏,它几乎完成了。我正在努力的最后一部分是计算盈亏

假设将这些作为交易起始余额 = $5000

> order_id stock_id  transaction qty_shares cost  user_id
> 1        1234      B           100        1000  1
> 2        1234      B           50         450   1
> 3        1234      S           80         640   1
> 4        1234      S           30         300   1

我在想出一个算法或一个 mysql 查询来计算损益时迷失了方向

在阅读下面发布的 2 条回复后添加附加说明:请注意,在此场景中购买了 150 股,仅售出了 110 股,并且全部以不同的价格购买和出售

4

2 回答 2

2
SELECT SUM(qty_shares*cost) AS out, user_id, stock_id, order_id
FROM table
WHERE transaction = 'B'
GROUP BY user_id, stock_id, order_id

然后:

SELECT SUM(qty_shares*cost) AS in, user_id, stock_id
FROM table
WHERE transaction = 'S'
GROUP BY user_id, stock_id, order_id

PHP:

$Margin = ($query2->in - $query1->out);
$Balance += $Margin;

这一切都可以在单个查询上完成,但如果速度更重要,那么这可能比子查询更快。

编辑:对于每股平均损益:

SELECT AVG(qty_shares/cost) AS price_per_share, transaction, user_id, stock_id
FROM table
GROUP BY transaction,user_id,stock_id

这应该返回每个交易类型、每个用户的每个股票类型的平均每股价格。所以交易 S 行是平均售价,交易 B 行是平均买入价。它们之间的差异是平均损益。

SELECT 
SUM(
qty_shares *
    (
      SELECT AVG(A.qty_shares/A.cost) AS price_per_share
      FROM table AS A
      WHERE A.transaction = table.transaction
      AND   A.user_id = table.user_id
      AND   A.stock_id = table.stock_id
    )
), user_id, stock_id, order_id
FROM table
WHERE transaction = 'B'
GROUP BY user_id, stock_id, order_id

该查询应返回每行卖出的股票数量乘以当前每股平均价格,得出每笔交易的平均保证金,卖出保证金为负数。您可能会发现查询速度很慢。我建议使用此信息作为起点,并为您的应用程序找到最佳方式。

于 2012-07-10T12:12:24.000 回答
0

好吧,您只需遍历每一行并计算余额。

显然,此代码将完全取决于您现有的代码以及您如何从数据库中获取行(?),但如果您只想获得一个整体数字,您可以做这样的事情(基于cost共享):

$start_balance = 5000;
$balance = $start_balance;
foreach ($transactions as $transaction) {
    switch($transaction->transaction) {
        case 'B':
            $balance -= $transaction->qty_shares * $transaction->cost;
            break;
        case 'S':
            $balance += $transaction->qty_shares * $transaction->cost;
            break;
   }
}

$profitloss = $balance - $startbalance;

如果$profitloss为负数,则他们根据 内的交易而蒙受损失$transactions

当然,您也可以扩展它以显示基于执行的每笔交易的损益平衡。像这样的东西:

$start_balance = 5000;
$balance = $start_balance;
foreach ($transactions as $transaction) {
    $start_balance = $balance;
    switch($transaction->transaction) {
        case 'B':
            $balance -= $transaction->qty_shares * $transaction->cost;
            break;
        case 'S':
            $balance += $transaction->qty_shares * $transaction->cost;
            break;
   }
   $transaction->profitloss = $balance - $startbalance;
}

这样,每笔交易都会产生与之相关的损益。

于 2012-07-10T12:06:53.693 回答