MQL4/MQL5共通EAライブラリを使って月毎の損益を算出する

MT5のストラテジーテスターでは、月毎の損益がグラフで表示されて便利なのですが、その損益のデータそのものをEAのプログラム中で参照することができません。

ところでMT5では、OnTester()という関数を定義しておくと、バックテスト終了時にその関数を実行してバックテストの各種データを取得したり、適当に計算させたりした結果を「OnTester結果」として表示してくれます。(最適化の評価基準として使う場合、MT4でも利用できます。)

これを使って月毎の損益を算出できないか、というのが今回の記事の目的です。

そのために作ったわけではないのですが、拙作のMQL4/MQL5共通EAライブラリに次のような関数があります。

//過去の総損益(金額)の取得
double MyOrderTotalProfit(datetime from_date, datetime to_date, int pos_id=0)
from_dateからto_dateまでの期間で、ポジション番号pos_idの取引の総損益を取得します。

これを使うと、割と簡単に月毎の損益が算出できたのでご紹介します。

まず、以下のように、共通EAライブラリを使った、とあるEAがあるとします。

これに以下のコードを追加します。

追加したコードを簡単に説明します。

まず、OnInit()でEA開始時刻をStartTimeに取得しておきます。

MonthlyProfit()関数では、EA開始時から何番目の月かを入力して、その月の損益を出力します。ここでは、最後に前述のMyOrderTotalProfit()を使うために、損益を求める期間をfrom_dateとto_dateに求めます。年と月を求めるためにちょっとした計算式がありますが、要はその月の1日から次の月の1日までを期間として設定しています。

あとは、OnTester()関数中に月毎の損益を保存する配列profit[]を用意して、iを0から月数分変えて配列に代入します。profit[]をPrintさせているのは確認のためです。ここでは、profit[]を合計したものをreturnで返していますが、お好みに合わせて加工して使ってください。

なおEAでは、テスト期間が終わったときのオープンポジションは強制決済されますが、上記のコードを使った月毎の損益には反映されません。合計した損益がEAの出力する総損益と異なることがあるので、注意してください。

(追記)上のコード、そのままMT4でも動きます。バックテストのレポートにはOnTesterの結果は表示されませんが、OnTester()でPrintさせた月毎損益は操作履歴に表示されます。



コメントは受け付けていません