約定の代金と株数の正負の決めについて

    public class Total
    {
        private int money;
        private int amount;
    }

株の売買に関わるソフトウェアで約定を保持するクラスとして、受渡の代金(money)と株数(amount)の2つをメンバー変数として持ったクラスを作る場合。
たとえば100円で200株の買いが約定した場合は、money の絶対値は 20000 で、amount の絶対値は 200 である。ここまでは良いのだが、さて、売買の別を正負で表現しようとした場合、どっちを正にしてどっちを負にすれば良いのかで迷う。
もう何年も迷っているのだが、一応つぎのようにきっちりと決めることにした。


money は支払金額とする。顧客(unibon)が証券会社に払う(pay する)金額だ。したがって買いの場合は正とする。
amount は株を買った株数とする。すなわち買いの場合は正とする。
たとえば100円で200株の買いが約定した場合は、money = +20000, amount = +200 とする。
たとえば100円で200株の売りが約定した場合は、money = -20000, amount = -200 とする。


ただ、一般に、画面に金額を表示する場合は、(顧客の)「支払金額」よりも、(顧客の)「受取金額」として表示することが多いと思う。画面には (-money) を「受取金額」として表示すれば良いだろう。すなわち表示時に money にマイナスを付けて表示すれば良い。
たとえば100円で200株の買いが約定した場合は、画面には「受取金額 -20000円」と表示する。
たとえば100円で200株の売りが約定した場合は、画面には「受取金額 +20000円」と表示する。


なぜこうするかと言えば、損益の表示の正負と揃えたいからだ。たとえば100円で200株の買いが約定した後、101円で200株の売りが約定した場合、money = 20000 - 20200 = -200, amount = 200 - 200 = 0 となり、株数はトントンであり、「支払金額 -200円」と表示できる。しかしこういう場合に、負の値で表示することはまずない。「受取金額 +200円」と表示するほうが良い。この正負のポリシーだと、これを「利益 +200円」と表示することもできる。


なお、いちいち表示時にマイナスを付けるのが面倒だからと言って、money の正負の定義を逆にして、それと同時に amount の正負の定義も逆にしてしまうと、買いの時に amount = -200 になってしまう。unibon 的には買い株数は正にしたいんだよなあ。だから money と amount の定義はいじらないことにした。
また money の正負の定義だけ逆にして amount の正負の定義を逆にしないと、これはとてもややこしくなってしまう。だからこれもしない。


...ちなみに money と amount の正負を揃えておけば、平均単価を求めるときも、売りであっても買い出あっても、単に (money / amount) とできる。


結論として、上記の決めにしておけば、損益として money を表示する直前にだけマイナスを付けることさえすれば、そのほかの点がすべて簡素になるので良い。