どうも、FXトレーダー兼システムエンジニアのナオトです。
開発の裏側の23回目で、最適化の結果を書いたファイルが268行で切れていた話をしました。
今回は、その同じ仕組みを作り始めた日に踏んだ、別の3つです。
まず、仕組みの形を書いておきます。
MT5のテスターは、テストが終わると、EAの OnTester という関数を呼びます。
ここで TesterStatistics を使うと、損益やプロフィットファクター、取引の回数などを、EAの中から読めます。
私はそれを1行にまとめて、CSVのファイルへ書かせています。MT5が出すレポートを開かなくても、自作の道具でまとめて読めるからです。
1つ目は、書いたファイルが消えたことです。
1回だけのテストで書いたCSVが、次に最適化を回したら無くなっていました。
テスターは、実際の計算を、エージェントと呼ばれる別の働き手に任せています。
1回だけのテストでも、OnTester はエージェントの側で動くので、ファイルはエージェントのフォルダに書かれます。
そして、このフォルダは、次にテスターを回すときに作り直されます。
直し方は単純で、テストが終わった直後に、別の置き場へ写すようにしました。
最適化のときは、置き場がまた違います。
最適化では、たくさんのエージェントが同時に動きます。私が回したときは、16本が自動で立ちました。
そこで、各エージェントからは FrameAdd で成績を送り、ターミナルの本体の側にある OnTesterDeinit で全部を受け取って、まとめて1つのファイルに書く形にしました。
こちらは本体のフォルダに残ります。
1回だけのテストと最適化で、ファイルが出る場所が違う、ということです。
2つ目は、最適化の結果の順番です。
本体で受け取った成績は、設定を振った順には届きません。0番、1番、13番、6番、18番、というように、計算の終わった順に届きます。
ファイルには、設定の番号の列も一緒に書いておいて、読むときにその列で並べ直しています。
3つ目が、いちばん気づきにくかったものです。
連勝と連敗を記録する欄に、5桁の数字が入っていました。
TesterStatistics には、STAT_MAX_CONWINS と STAT_MAX_CONLOSSES という項目があります。名前から、いちばん長く続いた連勝と連敗の回数だと思って使っていました。
実際は、その連勝と連敗で動いた金額でした。
回数のほうは、STAT_MAX_CONPROFIT_TRADES と STAT_MAX_CONLOSS_TRADES という別の項目です。
名前だけで判断して、回数の欄に金額を書いていました。どちらも数字なので、エラーは何も出ません。
もう1つ、置き場について付け足しておきます。
MT5には、複数のターミナルで共有する共通のフォルダもあります。
ただ、MT5をポータブルの形で動かしていても、この共通のフォルダだけは、Windowsのユーザーごとの決まった場所を指していました。
テスターのフォルダとも、ターミナルのフォルダとも別の場所です。このときの検証では、結果を共通のフォルダに置かず、全部ターミナルのフォルダの中に落とす形にしました。
3つとも、プログラムは正しく動いているように見えました。
ファイルは書かれていたし、数字も入っていた。ただ、どこに書かれ、どの順に届き、何の数字なのかが、思っていたのと違っていました。
EAに成績を書かせる仕組みを作ったら、最初の1回は、ファイルの場所と行の順と、1つ1つの数字の意味を、MT5のレポートと突き合わせてみてください。
MT5のテスターで回す形の検証や、結果をまとめる道具づくりのご依頼も受けています。
最後までお読みいただき、ありがとうございました。