記事"Expert Advisor Code で簡単にエラーを検出しリカバリする方法"についてのディスカッション

 

新しい記事 Expert Advisor Code で簡単にエラーを検出しリカバリする方法 はパブリッシュされました:

Expert Advisor の作成では、コードエラーの検出およびリカバリの質問はひじょうに重要なものです。独特なのは、ちょうど良いタイミングで検出されないエラーが、すでに第一の検証段階にあるトレーディングシステムの貴重な考えを台無しにしてしまうことです。賢明な EA 作成者がだれしもそういった問題を一番最初から考慮に入れるのはそのためです。本稿では、このむつかしい問題に役立つ方法をいくつか詳しく説明します。

組み込み関数使用時のエラー

組み込み関数を使用しなければトレーディング EA は何もできないので、そのような関数が返すエラーの分析が楽になるようにします。まず、トレーディング処理に直接連携している関数動作結果を見ます。それ は、そのような関数のエラーを無視すると EA の効果がきわどくなるためです。のちに別の組み込み関数についてもお話しします。

残念ながら、MQL4 オプションを使用することで、可能性あるエラー状況をすべて処理する一般的ライブラリを書くことはできません。個別ケースではエラーを別で処理する必要が あります。ですが、良い点もあります。エラーをすべて処理する必要はないということです。エラーの多くは EA 作成段階で排除されるものです。ただこのためには、よいタイミングでそういったエラーが検出されることです。例として MQL4 における EA の典型的なエラーを考察します。

1)エラー130- ERR_INVALID_STOPS
2) エラー 146 -ERR_TRADE_CONTEXT_BUSY

前者のエラーが発生する際の一つには、市場に近づけすぎて EA が未決注文を出そうとすることです。その存在はなんらかの場合に EA の特性を著しく損なう可能性があります。たとえば、収益性あるポジションを開いている場合、EA が150ポイントごとで利益を減らすとします。次の試行でエラー130 が発生し、価格が前のストップレベルに戻れば、これは正当な利益を奪うこととなります。価格とストップの間に許容できる最小の距離を考慮する関数を EA コードに挿入することで、そのような可能性にもかかわらず、このエラーは一番最初に排除されます。

後者のエラー「トレードコンテキストが混みあっています」は完全に排除することができません。1件のターミナルで複数が動作する際、この状況に出く わします。Expert Advisor の一つがポジションをオープンしようとしているとき、もう一つが同じことをしようとする場合です。結果としてこのエラーはかならず処理される必要がありま す。

よって EA 動作中に組み込み関数がエラーを返しているか、つねに知る必要があります。それは以下の簡単な関数を追加することで行えます。

#include <stderror.mqh>
#include <stdlib.mqh>
 
void logError(string functionName, string msg, int errorCode = -1)
  {
    Print("ERROR: in " + functionName + "()");
    Print("ERROR: " + msg );
    
    int err = GetLastError();
    if(errorCode != -1) 
        err = errorCode;
        
    if(err != ERR_NO_ERROR)
      {
        Print("ERROR: code=" + err + " - " + ErrorDescription( err ));
      }    
  }

作者: Roman Kramar