我正在使用php / mysql& amp;写一个基于雅虎的股市交易游戏。它差不多完成了。我努力的最后一部分是计算利润和利润。损失
让我们说这些是交易 起始余额= $ 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股股票。所有人都购买了&以不同的价格出售
答案 0 :(得分: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
该查询应该返回每行销售的股票数量乘以当前的每股平均价格,给出每笔交易的平均保证金,卖出保证金为负数。您可能会发现查询速度很慢。我建议您使用此信息作为起点,并找到适合您应用的最佳方式。
答案 1 :(得分: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;
}
这样,每笔交易都会产生与之相关的盈利/亏损。