つい先日、とあるお客様から次のような質問をいただきました。
トレード用とバックテスト用の2種類のEAを提供していたただけるとのことで、それはそれでお得感があるのですが、実際2つも必要なのかなあという気もします。なぜ使い分ける必要があるのでしょうか。教えてください。 |
ごもっともなご質問だと思います。
まず、次の画像を見てください。
おなじみの、メタトレーダーの新規発注画面です。
赤いボタンをクリックするとショートポジションを、青いボタンをクリックするとロングポジションを発注できます。
うまく約定すると、「ボカン」という音がしてポジションが成立します。
しかし、何らかの理由でうまく約定せずに、「ビューン」という音がして、エラー表示が出てしまうことが時々ありますよね。
その理由は様々で、たとえば、発注が証券会社のサーバーに届く前にレートが変わってしまったり(スリッページ)、一時的にサーバーが通信トラブルを起こして受注できなかったり、ひどいときにはサーバーがダウンしてこのようなエラーが出ることもあります。
このようなエラーは、手動で発注するときだけでなく、実は、EAを使った自動売買でも頻繁に発生するのです。
スリッページが指定した許容範囲を超えてしまった場合には、むしろ約定しない方がよい場合もありますが、いわゆる通信エラーの場合には放っておくわけにはいきません。
そこで、当サイトでは、このような通信エラーが発生して約定に失敗したときに備えて、特殊なプログラムをEAの中に組み込んでいます(通信エラー対策)。
すなわち、通信エラーが出たら、0.1秒の間隔をおいて、再注文を出します。直ちに再注文を出さないのは、その方が注文が通りやすいからです。そして、この再注文は、きちんと約定するまで10秒間繰り返します。しかし、10秒間繰り返しても注文が通らない場合には、致命的なサーバーダウンが発生しているものと考えて、再注文をやめて、次のティック変動にEAを委ねます。これを「高速リトライ処理」と呼ぶこともあります。
このような通信エラー対策は、新規発注だけでなく、決済注文や取消注文などのプログラム中にも組み込みます。
ところで、メタトレーダーユーザーの多くの方がご存知のように、EAは、自動でトレードをしてくれるだけでなく、ストラテジーテスターを使ったバックテストでも使用します。
この点、上述の通信エラー対策は、トレードの時には不可欠なものですが、バックテストのときにはまったく必要がありません。なぜならば、バックテストにおいては通信エラーが無いものとしてテストされるからです。
ここで問題になるのは、上述の通信エラー対策を組み込んだままのEAをバックテストで使用するとどうなるのか、ということです。
次の画像をご覧ください。
企業秘密のため一部見えなくしてありますが、これは、上述の通信エラー対策を組み込んだ新規発注用のプログラムです。非常に長くて複雑ですよね。
これに対して、次の画像をご覧ください。
通信エラー対策を取り外した、単純な新規発注プログラムで、非常に短くて簡単です。
両者の違いは、そのままメタトレーダーがプログラムを読み込む時間の長さに影響します。
つまり、通信エラー対策を組み込んだままのEAでバックテストをすると、それを取り外したEAでバックテストをしたときの何倍も時間がかかってしまうということです。
もちろん、1回のバックテストだけなら、1秒がせいぜい5秒くらいになるだけの話ですが、外部パラメーターの最適化機能を実行するとなると、これは深刻な違いになってきます。1時間で済む作業が半日~1日がかりになってしまうこともあります。これは自動売買トレーダーにとってはあまりにも無駄な時間です。
なので、当サイトでは、
①トレード用EAには、通信エラー対策を組み込んで、安全で確実な約定を狙うのに対して、
②バックテスト用EAでは、通信エラー対策を取り外して最適化の時間をできるだけ短縮させる
という方針を採用しているわけです(同様の理由から、バックテスト用EAからは、アラート機能やメール送信機能等も通常は取り外します)。
もちろん、IsTesting()関数やOnTester()関数を使って、1つのEAの中にトレード用プログラムとバックテスト用プログラムを分けて記述する方法もありますが、それこそ長大で複雑なプログラムになってしまい、プログラムミスの原因となります。それならば、はじめから2種類のEAに分けた方が合理的です。
以上のことはすべて、お客様にできるだけのことをしてあげたい、という当方の経営方針なのです。
コメントをお書きください