CSVファイルへ検証結果を出力するところにようやく入る。
まずはTradeクラス、いちトレードの結果をCSVファイルに出力するところ。
前回説明のファイルにロック掛かってないか例外処理でチェックした後、
トレードの結果を出力している。
ここでちょっとしたテクニックを使ってる。
各CSV用にハッシュを用意している。
引用しちゃおう。
def items_for_a_stock
{ :trade_type => “取引種別”,
:entry_date => “入日付”,
:entry_price => “入値”,
:volume => “数量”,
:first_stop => “初期ストップ”,
:exit_date => “出日付”,
:exit_price => “出値”,
:profit => “損益(円)”,
:r_multiple => “R倍数”,
:percentage_result => “%損益”,
:length => “期間”}
end
キーの方はシンボル、値はCSVファイルのヘッダー。
最初にこのハッシュの値を順次呼び出し、ヘッダー完成。
データは、
trade.send(key)で、ハッシュのキーのシンボルを順次渡すことで、
一行完成。配列をCSVライブラリの機能でファイル出力。
tradeの配列を順次処理することで、
シミュレーションで発生した全トレードをCSVファイルに纏めて出力する。
ところで、sendの利用のところはちょっとしたテクニック。
例えば、trade.send(:trade_type)とかなるけど、
sendというリフレクション的な呼び出しはこれまでも使ってきた。
それを踏まえて、Tradeクラスを眺めると、
メソッドないしプロパティ(読み書き可能アクセッサ)として、
定義されてる名前と上記のハッシュのキーが一致してることが分かる。
今後検証で取得するデータ項目が増えた場合も、
上記のハッシュと、それ対応するメソッドないしプロパティを追加するだけで事足りる。
この辺はなかなかオサレである。
ましかし、
CSV出力用にヘッダー情報の提示と、データを配列で返すところは、
Tradeクラス側で定義する方が自然だと思う。
そうすれば、Tradeクラスだけの修正で済むし、
Recoderクラスはオブジェクトを順次処理して、出力するだけで、
データを一行で返すところは、当のオブジェクト側の仕事にしとく方が、
オブジェクト志向っぽい気がする。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。