Ruleの4つの抽象的な子クラスEntry,Exit,Stop,Filterの内容確認まで終わった。
デザイン的には、納得いかないとこもあるので、
オブジェクトモデリング、オレならこうするね。を書いてみたい。
綺麗と思えない理由はもうツラツラ書いてきたから、ここではしない。
自分なら純粋にどう考えるか、以下のようにする。
データを取得するところまでは、特に異論はない。
StockSerialData
既存のStockと同じもの。ただ名前は変えたい。
個別銘柄の日足の時系列データ。
銘柄コードを持ち、日付ごとの四本足と出来高を配列で持つ。
Logic
トレードのロジック、
Entry,Exitをそれぞれ配列で持ち、
それらに従いPositionを(複数)生成し配列で持ち、Positionを管理する。
Position
仕掛けと同時に生成され、仕掛けと手仕舞いの日付と価格、損益を保持。
売り/買いの区別も返す。
Indicator
既存と同様、StockSerialDataを参照し、配列で計算結果を持つ。
子クラスとして移動平均など実装。
Entry
仕掛けるべきかの判断だけTrue/Falseで返す。
子クラスでIndocatorの小クラスを持つなどで、判断する。
最初にStockSerialDataを参照し判断のための準備をする。
Logicでは所有する全てのEntryとFilterがTrueの判断の時仕掛ける。
※一度に建玉を複数持てない場合は建玉の有無を最初にチェックする。
複数持てる場合はEntryが既に処理されたシグナルを再度挙げない。(実装難しいが。)
Filter
仕掛けて良い条件を満たすときTrueを返す。
子クラスでIndocatorの小クラスを持つなどで、判断する。
最初にStockSerialDataを参照し判断のための準備をする。
Exit
Entryと同様の構造。
ただしPositionも参照して、手仕舞うべきかTrue/Falseで返す。
既存のStopはExitの一種として扱う。
Logicでは所有するどれか一つのExitがTrueなら、そのPositionを手仕舞う。
Tickなど
既存同様、補助的なオブジェクトはそのまま。
Logicをnewして、Entry,Filter,Exitの子クラスを複数セットする。
(セットするところは本気でやれば、XMLの外部ファイル設定で出来る。)
既存の仕組みでデータから銘柄指定してStockSerialDataを生成。
LogicにStockSerialDataを参照させ、日付の最初から最後までシミュレーションする。
このとき、
セットされたEntry,Exitの子クラスを日々呼び出し、判断する。
仕掛け(Posisionの生成)、手仕舞いを条件が揃えば行う。
結果として、生成されたPositionが保持され、
手仕舞ったものは損益の結果となる(一部建玉のままのものも残る可能性あり)。
これを集計すればシミュレーションの結果となる。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。