Build 216のバグ? isConnected()はfalseを返すが、metatraderは接続されたままである。 - ページ 2

 
OK、ええ、私はそれを得た...まあ...それが戻ってくるかどうか見てみましょう;)
 

Stringoさん、こんにちは。



残念ながら、このバグはまだ残っています。

下のテストスクリプトを実行して、あるアカウントから別のアカウントに切り替えたとき(私のテストケースでは、2つか3つのブローカーのアカウントを使用して、別のアカウントに切り替えました)、いくつかのアカウント変更(かなりランダムな数)の後、connectionStateが本当に1に戻らず、ターミナルが接続されているにもかかわらず0のままだということがわかると思います。


あなたの目には、これは致命的なバグに見えないかもしれません。しかし、connectionStateを表示するスクリプトを開発している人たちにとっては、このテスト結果はかなり憂慮すべきものなのです。

というわけで、この問題をもう一度見ていただけると幸いです。



テストスクリプトはこちらです。


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
   while(!IsStopped())
   {
      Print("test"+IsConnected());
      Sleep(500);
   }
}




よろしくお願いします。


ダニエル

 
このバグがビルド216に存在することも確認できました。接続に失敗」-「ログイン」を何度か繰り返すと発生するようです。
 
はい、このスクリプトは既知です。しかし、問題を発見するためには、環境を再現する必要があります。しかし、再現できない
 

私も同じバグを確認しなければなりません。私のEAでは、接続が存在するかどうかを同時にチェック します。もしそうでなければ、私のスクリプトは終了します。

この回避策を発見された方はいらっしゃいますか?

 

無限ループと受信ティックからの独立のため、スクリプトは問題を判断することができません。

問題はエキスパートだけが表示されます。一行だけの簡単なエキスパート - Print(IsConnected());

ティック受信(端末が接続されていることを意味する) - スタート関数実行 - おっと!IsConnected()は0を返す(つまりfalse)

 

ありがとうございます

はい、使っています。

int start()
{
 while(true)
 {
  if(IsConnected())
   {
    ....... i do my work 
   {
   else 
   {return(-1);} // so if connection was lost i break the infiny loop
 }
}

問題は、接続が戻ったときに、IsConnected() が古い値である false を保持し、true に変更しないことです。しかし、私は価格が移動し、端末が100%接続されているのを見ています。これは無限ループが壊れ、接続が回復した後の最初のティックで何も起こらなかったので、スタートが実行されたため、バグです。しかし、なぜかIs Connected()はまだfalseを返します。EAをチャートから削除し、再びEAを置くと、次に接続が切れるまですべて正常に動作します。



これは私を狂わせます。どうにかしてください。

ありがとうございます。

 

Liliput - 上記がstart()の使用概要であるなら、なぜinfinitループでその中に留まるのでしょうか?

私は、通常の方法は、入力する > 私は仕事をしたいですか?

(もちろん、普通というのは主観的なものです;o)

ということで、この質問をさせていただきました。

なぜこのような質問をしたのでしょうか?

私は、例えばEAが、EAが返さないので、Termialがstart()の呼び出しを行わない、おそらく多くの データticksのためにそれを返すことを拒否した場合、Terminalがどのように動作するか全くわからない... または - それは呼び出しを行わず、結局EAのstart()を呼ぶことができなかったことで、多くの データticksが流れて、ターミナルは未知の深さに行き、接続している問題を明示するか?

;)

 

これで解決できるのか...?

string FILE[1];
int MOVE[1];
 
void init() { FILE[0]=Symbol(); }
 
int start()
  {
//---- check connection
   if ( !Connection() ) return(0);
//---- 
   return(0);
  }
 
bool Connection()
  {
   int d;
   bool connect;
   RefreshRates();
   for ( d=0; d<ArraySize(FILE); d++)
    {
     if ( MOVE[d] != MarketInfo(FILE[d],5) )
      {
       MOVE[d] = MarketInfo(FILE[d],5);
       /* if ( !connect ) */
       connect=1;
      }
    }
   return(connect);
  }
 
ukt:

Liliput - 上記がstart()の使用概要であるなら、なぜinfinitループでその中に留まるのでしょうか?

私は、通常の方法は、入力する > 私は仕事をしたいですか?

(もちろん、普通というのは主観的なものです;o)

ということで、この質問をさせていただきました。

なぜこのような質問をしたのでしょうか?

私は、例えばEAが、EAが返さないので、Termialがstart()の呼び出しを行わない、おそらく多くの データticksのためにそれを返すことを拒否した場合、Terminalがどのように動作するか全くわからない... または - それは呼び出しを行わず、結局EAのstart()を呼ぶことができなかったことで、多くの データticksが流れて、ターミナルは未知の深さに行き、接続している問題を明示するか?

;)


uktさん、大丈夫です、お答えします。私が無限ループを行うのは、多くの処理を行う必要があり、それらを行うために新しいtickを待つ必要がないからです。そのため、この方法でターミナルからコントロールし、必要なときに必要な作業を行うようにしています。実際のデータを取得するにはRefreshRates()を使っています。

そのため、ブローカーとの接続があるかどうかをチェックするのは論理的なことで、注文を送信/クローズ/変更し、接続がなければ動作しません。