Build 216 bug ? isConnected() возвращает false, но metatrader все еще подключен - страница 2

 
Ладно, да, я понял... ну... посмотрим, вернется ли он обратно ;)
 

Здравствуйте, Стринго,



к сожалению, эта ошибка сохраняется.

При запуске тестового скрипта ниже и переключении с одного счета на другой (в моем тестовом примере я использовал счета от 2 или 3 разных брокеров и переключался с одного на другой), вы можете увидеть, что после нескольких AccountChanges (довольно случайное число) connectionState действительно не меняется обратно на 1, он остается 0, даже если терминал _подключен_.


На ваш взгляд, это может быть не критичной ошибкой. Однако для некоторых людей, разрабатывающих скрипты, которые отображают connectionState, результаты проведенных тестов весьма тревожны.

Поэтому я был бы очень признателен, если бы вы еще раз взглянули на эту проблему.



Вот тестовый сценарий:


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




Искренне ваш,


Daniel.

 
Я также могу подтвердить, что эта ошибка существует в сборке 216. Похоже, что она возникает после некоторого количества последовательностей "соединение не удалось" - вход в систему.
 
Да, этот сценарий известен. Но мы должны воспроизвести среду, чтобы обнаружить проблему. Однако мы не можем воспроизвести
 

Я также должен подтвердить ту же ошибку. В моем советнике я одновременно проверяю, существует ли соединение. Если нет, мой скрипт завершает работу.

Кто-нибудь нашел обходной путь для этого?

 

Скрипт не может определить проблему из-за бесконечного цикла и независимости от входящих тиков.

Проблему может показать только эксперт. Простой эксперт с одной строкой кода - Print(IsConnected());

Поступает тик (значит терминал подключен) - запускается функция start - oops! 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. Если я убираю советника с графика и ставлю заново, то все работает нормально до следующей потери связи.



Это сводит меня с ума. Пожалуйста, сделайте что-нибудь с этим!

Спасибо

 

Liliput - если выше описана схема использования start(), зачем оставаться в ней с бесконечным циклом?

Я спрашиваю потому, что нормальный способ - это войти > хочу ли я работать? нет:вернуться > сделать работу > вернуться

(нормально - это субъективно, конечно ;о)

Я не говорю вам, как проектировать - это ваше дело, просто спрашиваю, как вы рассуждаете, тогда я узнаю больше/вижу разные способы делать вещи!

Что заставило меня спросить?

Я понятия не имею, как Терминал ведет себя, если, например, советник отказывается возвращаться к нему в течение, возможно, многих тиков данных, которые, поскольку советник не возвращается - Терминал просто не делает вызов start()... или - он просто не делает вызов и в конечном итоге из-за многих тиков данных, пролетевших без возможности вызвать start() советника, Терминал уходит в неизведанные глубины и проявляет связанную проблему?

;)

 

Может ли это решить проблему?

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(), зачем оставаться в ней с бесконечным циклом?

Я спрашиваю, потому что нормальный способ - это войти > хочу ли я работать? нет:вернуться > сделать работу > вернуться

(нормально - это субъективно, конечно ;о)

Я не говорю вам, как проектировать - это ваше дело, просто спрашиваю, как вы рассуждаете, тогда я узнаю больше/вижу разные способы делать вещи!

Что заставило меня спросить?

Я понятия не имею, как Терминал ведет себя, если, например, советник отказывается возвращаться к нему в течение, возможно, многих тиков данных, которые, поскольку советник не возвращается - Терминал просто не делает вызов start()... или - он просто не делает вызов и в конечном итоге из-за многих тиков данных, пролетевших без возможности вызвать start() советника, Терминал уходит в неизведанные глубины и проявляет связанную проблему?

;)


ukt, без проблем, я отвечу. Я делаю инфинитный цикл, потому что мне нужно сделать много операций и я не хочу ждать нового тика для их выполнения. Таким образом, я забираю управление из терминала и делаю свою работу, когда мне нужно и когда я хочу. Для получения фактических данных я использую RefreshRates().

Поэтому логично проверить, существует ли соединение с брокером, потому что я отправляю/закрываю/модифицирую ордера и если нет соединения, то нет работы. Вот так просто. Есть и другие проверки для выхода из цикла, которые я использую. например IsStoped() и так далее, но проблема не в моем коде, а в IsConnected().

Причина обращения: