0

私はphp/mysqlを使用して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;

すべてを1つのクエリで実行できますが、速度が重要な場合は、サブクエリよりも高速になる可能性があります。

編集:1株あたりの平均利益/損失の場合:

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

これにより、ユーザーごとの株式タイプごとに、トランザクションタイプごとに1株あたりの平均価格が返されます。したがって、トランザクション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株あたりの平均価格を掛けたものを返し、取引ごとの平均証拠金を返します。販売証拠金はマイナスになります。ただし、クエリが遅くなる場合があります。この情報を出発点として使用し、アプリケーションに最適な方法を見つけることをお勧めします。

于 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 に答える