エラー、バグ、質問 - ページ 2437

 
Alexey Navoykov:

フレームが存在しない状態でOnTesterPassが呼ばれるのですか? それならこれは明らかなエラーです。 このイベントはフレームを受け取ることを意味し、パスの終わりを意味するものではありません。

すべてのフレームは、OnTesterDeinit イベントが呼ばれる前に OnTesterPass に到着している必要があります。これは正常な健全な論理です。また、強制的にテストが中断されるというのであれば話は別ですが。

OnTesterPassは、少なくとも1つのフレームが到着したときに呼び出される。フレーム入りの場合もあります。したがって、OnTesterPassは、1フレームずつではなく、ループでフレームを受け入れる必要があります。しかし、「前回以降-一度も」であれば、OnTesterPassは呼ばれない。

最適化は、最後の結果が来た時点で停止する。特に、1フレームに大量のデータを渡す場合や、1回のパスで複数のフレームを一度に渡す場合は、フレームの到着が遅くなることがあります。そのため、最適化終了後に起動するOnTesterDeinitで、残りのフレームの受信を手配する必要があります - ループ内でも。

これは正常な健全な論理である。

OnTesterPassだけでなく、OnTesterDeinitでもきっちりフレームを受信している例を繰り返し挙げています。そして、さまざまなタイプの複雑なフレームを受信します。

 
Slava:

一回のパスで複数のフレームを 一度に渡す場合。

一度試したが、うまくいかなかった。FrameAddは 1つだけ動作しました。

 
Slava:

最適化は、最後の結果が到着した時点で停止します。特に、1フレームに大量のデータを転送する場合や、1回のパスで複数のフレームを一度に転送する場合、フレームの到着が遅くなることがあります。そのため、最適化終了時に起動するOnTesterDeinitで残りのフレームの受信を手配する必要があります(ループ内も)。

フレームが後から到着する可能性が ある場合、OnTesterDeinitでも一気に到着する保証はない? 待機ループを作らなければならないということですが、どのくらい待てばいいのでしょうか?

先ほど、OnTesterPassは、前回のOnTesterPassの終了後に到着したフレームに対してのみ呼び出されますが、OnTesterPassの実行中、特にFrameNextの 最後の呼び出し 以降、関数が完了する前に新しいフレームが到着すると、イベントを生成する新しいフレームが到着するまで、このフレームはハングします、という状況だと考えました。このため、これらの休止フレームを受信するためにOnTesterDeinitが必要である。

 
Alexey Navoykov:

フレームが後から到着できる のであれば、OnTesterDeinitですぐに利用できる保証はないのでは? つまり、待機サイクルを行う必要があるのでは? また、どのくらい待つ必要があるのでしょうか?

先ほど、OnTesterPassは、前回のOnTesterPassの終了後に到着したフレームに対してのみ呼ばれるが、OnTesterPassの進行中に新しいフレームが到着した場合、特にFrameNextの最後の呼び出し以降、関数の完了前に、このフレームは、イベントを生成する新しいフレームが到着するまでハングする、という状況だと思ったのですが、いかがでしょうか?そのため、OnTesterDeinitはこれらの休止中のフレームをピックアップするために必要です。

FrameNextは、mqdファイルを読み込むだけで、何もしない。

FrameFirstは FileSeekです。
 
fxsaber:

一度試してみたが、うまくいかなかった。FrameAddは1つだけ動作しました。

ここで一例を示しました。
 

ありがとうございます。


PS FrameFirstはここでは冗長です。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

Expert Advisorに結果を自動代入し、タイムスケジュールでストラテジーをテストする。

スラバ さん 2013.04.10 15:04

以下はその一例です。OnTesterでは、Expert Advisorは、取引の履歴と 作業していた履歴の2つのフレームを送信します。

OnTesterDeinitでは、第1種と第2種のすべてのフレームを受信して処理します。

void OnTesterDeinit()
  {
   string        name;
   ulong         pass;
   long          id;
   double        value;
   int           handle,i;
   BalanceInTime balance[];
   MqlRates      rates[];
//---
   FrameFirst();
   FrameFilter("",1);
   while(FrameNext(pass,name,id,value,balance))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(balance); i++)
            FileWrite(handle,balance[i].date,EnumToString(balance[i].entry),DoubleToString(balance[i].price,5),DoubleToString(balance[i].balance,2));
         FileClose(handle);
        }
     }
//---
   FrameFirst();
   FrameFilter("",2);
   while(FrameNext(pass,name,id,value,rates))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(rates); i++)
            FileWrite(handle,rates[i].time,DoubleToString(rates[i].open,5),DoubleToString(rates[i].high,5),DoubleToString(rates[i].low,5),DoubleToString(rates[i].close,5),string(rates[i].tick_volume));
         FileClose(handle);
        }
     }
//---
  }
 
fxsaber:


PS FrameFirstはここでは余計なお世話です。

いいえ、余計なことではなく、純粋に方法論的なことです。デフォルトのない完全なコードブロック

このコードは、より複雑なコードから切り取られたものです。4種類のフレームが送信されました。同時にOnTesterPassも読みました。以下は、「リファイン」したコードです。

 
Slava:

いいえ、冗長ではありません - 純粋に方法論です。デフォルトのない完全なコードブロック

このコードは、より複雑なコードから切り取られたものです。4種類のフレームが送信されました。同時にOnTesterPassも読みました。ここでは、「リファイン」したコードを紹介します。

FrameFirstについては、FrameFilterの 前に呼び出すと必ず余計なものが出てきます。

複数のフレームでデータを転送することはお勧めしません。

 
fxsaber:

FrameFirstについては、FrameFilterの前に呼び出すと必ず冗長になります。

複数のフレームを経由してデータを渡すことはお勧めしません。

1.はい、余計なお世話になることもあります。

2. OnTesterPassで1種類のフレームを読み込み、OnTesterDeinitで終了させる。他のフレームは OnTesterDeinit で読み込む。

このように数種類のフレームを送受信できるようになったことで、テスターでは再現が困難だったいくつかのエラーを修正することができました。そして、ある基準値との差がある場合のみ、フレームを送信していた。

 
Slava:

オプトフォーマットを開くか?