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

 
Slava:

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

この機能では、1パスが数フレームある場合、計算されたパスの結果をリアルタイムで作業することはできません。

 
ここには純粋に方法論的な欠陥があるように思われる

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

EAにおける結果の自動置換を用いたストラテジータイムテーブルのテスト

スラバ さん 2013.04.10 15:04

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);
        }
     }
//---
  }
ループ内のFrameNextの前に、ループの各パスでArrayFreeを呼び出すとよいでしょう。
 
Slava:

1.はい、重複する可能性があります。

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

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

先ほどフレームの損失と言いましたが、1回のパスで多くのフレームが通過し、エージェントに問題が発生した場合、つまり接続が切れた場合、この状況に対して何か対処されるのでしょうか。

 
fxsaber:

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

はい。

optファイルを読み込むコードの公開と引き換えに

 
fxsaber:

この機能では、1パスあたり複数のフレームがある場合、カウントされたパスの結果をリアルタイムで作業することはできません。

はい。

そのため、最適化が終わった後に「ノンコア」タイプのフレームを読み込む必要があるのです。

 
Aleksey Vyazmikin:

先ほどフレームロスの話をしましたが、1回のパスで多くのフレームが送信され、エージェントに問題があった場合、つまり通信が途絶えた場合、この状況に対して何か対処されるのでしょうか?

何ができるのか?

いずれにしても、最適化の結果は、そのフレームよりも早く、そして速く出ていくことになります。エージェントが停止した場合(コンピュータがシャットダウンした、サービスが停止した)、確かに何もできません。

フレームが送信されるまでは、結果を送信しないようにする、ということをやってみる。しかし、いつ直るかはわかりません。

 
fxsaber:
これは純粋に方法論的な欠陥と思われる
ループ内のFrameNextの前に、ループパスごとにArrayFreeを呼び出すとよいでしょう。

不要なメモリの再割り当てを避けることができます。

この場合、99%の確率でアレイバッファは一度だけ確保されます

 
Slava:

何ができるのか?

最適化の 結果は、とにかくそのフレームよりも早く、速く出発することになります。エージェントが停止した場合(コンピュータがシャットダウンした、サービスが停止した)、できることはまったく何もありません。

フレームが送信されるまでは、結果を送信しない、ということを試してみてはどうでしょうか。しかし、いつ修正するかは不明です。

フレーム送信前に、予想されるフレーム数を言って、予想より少なくてエージェントが使えない場合は、他のエージェントにパスを渡して、すでに受信したフレームを上書きするようにするとか?

または、各フレームの本文に、その番号の総数とそのシーケンス番号を書き、同じように、すべてが来なかった場合は、再最適化する。
 
Slava:

はい。

optファイルを読み込むコードの公開と引き換えに

録画がさらに気になりますね。フォーマットが分かれば、読書はする。

 
Aleksey Vyazmikin:

送信を開始する前に予想されるフレーム数を把握し、予想より少ないフレームが到着してエージェントが利用できない場合は、他のエージェントにパスを渡し、すでに受信したフレームを上書きすることは可能でしょうか。

または各フレームの本文にこの量で合計数とそのシーケンス番号を書き込み、同じように、すべてが来なかった場合は、再最適化する。

すべてのパスがフレームを返さない場合はどうするのですか?

上記でテスターでのエラーキャッチの例を挙げました。ある結果がベンチマークと一致しない場合のみ、フレームを送信した