設計の例として、サンプルプログラムの設計をとりあげます。
要求仕様
- 売り買いを繰り返すドテン売買を行う
- 同時に複数の注文は行わない。ポジションは1つに制限する
- 売り買いの判定につかう値は設定で変更できる
- RSIの上限と下限を設定し、上限を超えたら売り、下限を下回ったら買いを繰り返す
- 発注枚数は固定とし、設定で変更できる
- 発注時にストップ、リミットを指定できる。値幅は設定で変更できる(指定しないも設定可能とする)
状態遷移モデル
取引をするには、注文を出して約定するまでの待ち状態が発生します。このすき間をうまく処理しないと、2重に注文してしまいます。よくフラグといって、今は注文の処理待ちとか、決済待ちとか変数を作って対応しますが、フラグが増えるとif文が複雑になり、管理が難しくなります。このような状態を管理するのに使われるのが状態遷移モデルです。状態とイベントに分けることで各状態での処理を単純化できます。
状態抽出
要求仕様を満たすために取引の状態を以下のように抽出します。
- ポジションなし
- 買いポジションあり
- 売りポジションあり
- 買い注文中
- 売り注文中
- 決済注文中
イベント抽出
状態が変わるきっかけ(トリガー)となるイベントを抽出します。
- 売りシグナル
- 買いシグナル
- 注文約定
状態遷移図
各状態でのイベント処理と状態の変更を図と表にまとめると以下のようになります。遷移図も遷移表も同じことを表しています。ここでは正常系のみの遷移を抽出しています。実際には約定しなかった場合や手動でポジションを決済してしまった場合などの異常系も考慮しなければなりません。
状態遷移表
各状態のイベント処理と次の状態を表にしています。”-“は何もしないで同じ状態を維持することを表しています。
ポジションなし | 買いポジションあり | 売りポジションあり | 買い注文中 | 売り注文中 | 決済注文中 | |
---|---|---|---|---|---|---|
売シグナル | 売注文→売り注文中 | 決済→決済注文中 | – | – | – | – |
買シグナル | 買注文→買い注文中 | – | 決済→決済注文中 | – | – | – |
注文約定 | – | – | – | →買いポジションあり | →売りポジションあり | →ポジションなし |