И снова о глюках IsConnected() - страница 2

 
Andrei01:
То есть Вы утверждаете что даже если функция старт будет занята торговлей она все равно сработает по каждому новому тику?

Не нужно перекручивать смысл моего поста.
 
Andrei01:
То есть Вы утверждаете что даже если функция старт будет занята торговлей она все равно сработает по каждому новому тику?

Ты как всегда ничего не понял )

ir0407:

31.08 я наконец-то лично столкнулся с ситуацией, когда функция IsConnected() нарушила работу моего советника.

Вообще-то в некоторых ДЦ прямым текстом просят не использовать эту функцию в советниках, ибо глючная. Есть еще IsTradeAllowed.
 
TheXpert:

Ты как всегда ничего не понял )

Если можно без хамства и переходов на личности и по сути, если есть что сказать.
 
TheXpert:

Вообще-то в некоторых ДЦ прямым текстом просят не использовать эту функцию в советниках, ибо глючная. Есть еще IsTradeAllowed.

Ну IsTradeAllowed как бы к наличию или проверке связи с сервером никаким боком не относится. У нее несколько другие задачи. Она просто проверяет два определенных флага в терминале. Читаем справку по MQL:

bool IsTradeAllowed( )
Возвращается TRUE, если эксперту разрешено торговать и поток для выполнения торговых операций свободен, иначе возвращает FALSE.
Про проверку факта наличия соединения с сервером, как видим, ничего не говорится.

 

У меня подобная проблема периодически возникает только в одном ДЦ - Броко. Причём не имеет значения, зациклен советник или нет. Незацикленный просто перестаёт реагировать на тики (функция старт не вызывается). И решается проблема тоже только перезагрузкой терминала. Больше ничего не помогает.

 
Meat:

У меня подобная проблема периодически возникает только в одном ДЦ - Броко. Причём не имеет значения, зациклен советник или нет. Незацикленный просто перестаёт реагировать на тики (функция старт не вызывается). И решается проблема тоже только перезагрузкой терминала. Больше ничего не помогает.

Попробуйте вот этот вариант, там в скрипте учтена ошибка номер 6 если IsConnected()==true, делает пересканировнаие если не помогает делает перелогин счета.

Скрипт устанавливает советник можете перекинуть в свою сову код его, ваша сова будет автоматом выставлять скрипт на график.

Скрипт

//+------------------------------------------------------------------+
//|                                        Пересканирование.mq4      |
//|                                        Скрипт                    |
//|                                        Martingeil© 2011, 01 июля |
//|                                                    fx.09@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Martingeil© 2011, 01 июля"
#property link      "fx.09@mail.ru"
// Скрипт сканирует сервера в случае обрыва связи, или ошибки №6, если не помогает делает перелогинирование счета.
// Скрипт установится автоматически на график советником - "Запуск скрипта советником".
// В сервисе->настройки->советники терминала МТ4 - нужно убрать галку, "отключить советники при смене счета" 

#include <WinUser32.mqh> // Стандартная библиотека
#define  RESCANSERVERS_COMMAND_CODE   37400
#define  OPENLOGINWINDOW_COMMAND_CODE 35429
#define  PAUSE 1000
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start() {
bool flag=true;
//------------------------------------
while(!IsStopped()){       
        Comment("Пересканирование");
if(!flag) 
   {    Print("Есть контакт. Время сервера: ",TimeToStr(TimeCurrent()));
        Comment("Пересканирование\nЕсть контакт.\nВремя сервера: ",TimeToStr(TimeCurrent()));
        flag=true;
   } //if(!flag)
// если соединения нет, или если есть ошибка "6", а IsConnected()==true
while(!IsConnected()&&!IsStopped()||GetLastError()==6)   
{      
   if(flag) 
   { Print("Нет соединения с сервером. Время сервера: ",TimeToStr(TimeCurrent()),"  Ошибка:",GetLastError());
     Comment("Пересканирование\nНет соединения с сервером.\nВремя сервера: ",
     TimeToStr(TimeCurrent()),"\nОшибка:",GetLastError());
     flag=false;
   } //if(flag)      
   ReScanServers();                       // пересканируем серверы
   Sleep(10000);                          // подождем коннекта   
   if(!IsConnected()||GetLastError()==6// если соединения нет, или ошибка №6
   { ReLoginAccount();                    // перелогин счета
     Sleep(10000);                        // подождем коннекта
   }//if(!IsConnected())
}//while (!IsConnected()&&!IsStopped())
   Sleep(30000);
   }//while(!IsStopped())
   Comment("");
   return;
}//void start()

//  Пересканируем серверы ------------------------------------------------                            
int ReScanServers(){

    int hwindow=GetAncestor(WindowHandle(Symbol(),Period()),2);    // получаем хендл главного окна
    Comment("Пересканирование\n+++ ПереСканируем Серверы +++");    // выведем на чарт сообщение
    if(hwindow!=0) {                                               // нашли главное окно
    // посылаем сообщение "пересканировать серверы" 
    return(PostMessageA(hwindow,WM_COMMAND,RESCANSERVERS_COMMAND_CODE,0)); 
    }
    return(-1);
}

//  Перелогинемся --------------------------------------------------------  
int ReLoginAccount()
{
int hwnd=GetAncestor(WindowHandle(Symbol(),Period()),2);           // получаем хендл главного окна
    Comment("Пересканирование\n+++ ПереЛогин +++ ");               // выведем на чарт сообщение
    PostMessageA(hwnd,WM_COMMAND,OPENLOGINWINDOW_COMMAND_CODE,0);  // открыли окно ввода Логина и Пароля.
    Sleep(PAUSE);                                                  // делаем паузу, ждем
    hwnd=GetLastActivePopup(hwnd);                                 // нашли хэндл окна ввода Логина и Пароля
    hwnd=GetDlgItem(hwnd,0x1);                                     // нашли хэндл кнопки ЛОГИН
    Sleep(PAUSE);
    SendMessageA(hwnd,BM_CLICK,0,0);                               // нажали кнопку ЛОГИН 
    return(0);
}
//------------------------------------------------------------------------

Советник

//+------------------------------------------------------------------+
//|                                    Запуск скрипта советником.mq4 |
//|                                        Советник                  |
//|                                        Martingeil© 2011, 01 июля |
//|                                                    fx.09@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Martingeil© 2011, 01 июля"
#property link      "fx.09@mail.ru"
//Советник нужен для установки скрипта на график, в случае перезагрузки
//терминала, скрипт удаляется в отличии от советника, при первом поступлении
//тика, скрипт установится автоматически этим советником.
//сделан для работы с программой перезагрузки терминала при залипании котировок.
//работает на графике евры
int init(){ return(0);}

#import "user32.dll"
int RegisterWindowMessageA(string lpstring);
int PostMessageA( int hWnd, int Msg, int wParam, string lParam );
#import

int start(){
  if(Symbol()=="EURUSD"){//график евры
  int hwnd = WindowHandle(Symbol(), Period());
  int MT4InternalMsg = RegisterWindowMessageA("MetaTrader4_Internal_Message");  
  //название скрипта который надо повешать на график
  PostMessageA(hwnd, MT4InternalMsg, 16, "Пересканирование");} 
return(0);
}
//+------------------------------------------------------------------+

библиотека WinUser32 закинуть в папку experts->include

Файлы:
winuser32.zip  23 kb
 
Martingeil:

Попробуйте вот этот вариант, там в скрипте учтена ошибка номер 6 если IsConnected()==true, делает пересканировнаие если не помогает делает перелогин счета.

Я же говорю, ничего из этого не помогает. Проблема устраняется только перезапуском терминала. Поэтому при торговле в данном ДЦ просто делаю все советники зацикленными, а IsConnected() не использую.
 
Meat:
Я же говорю, ничего из этого не помогает. Проблема устраняется только перезапуском терминала. Поэтому при торговле в данном ДЦ просто делаю все советники зацикленными, а IsConnected() не использую.
Можно програмно перегружать терминал делов то. Я бы лучше эту курицу бройлерную давно поменял бы на что то более приличное. Судя по выбору вашему не лучший вариант. Имхо
 
Martingeil:
Можно програмно перегружать терминал делов то. Я бы лучше эту курицу бройлерную давно поменял бы на что то более приличное. Судя по выбору вашему не лучший вариант. Имхо

Ну они дают очень много возможностей, которых нет в других ДЦ, поэтому не стоит быть столь категоричным. Да и речь не об этом. Просто я уже неоднократно слышал от некоторых людей об аналогичных проблемах именно в этом ДЦ. Причём проблема не постоянная, а начинается спонтанно, спустя какое-то время после запуска терминала (от нескольких часов, до нескольких дней). Возможно это связано с какими-то особенностями их сервера... В общем не понятно.

Перезагружать терминал в автоматическом режиме - это конечно экстрим :) Столько гемора. Во-первых, это нужно делать из отдельного приложения. Во-вторых, нужно контролировать полную выгрузку приложения из памяти прежде чем запускать его заново. В третьих, терминал может зависнуть при запуске (у меня такое частенько бывает, т.к. открыто много окон с советниками и индикаторами). В общем гораздо проще и надёжней просто циклить советники.

 
Похоже от разработчиков не будет "ни ответа ни привета". А жаль... За столько лет существования терминала я думаю можно было не один раз разобраться с этим глюком. Тем более, что потуги в этом направлении уже были.
Причина обращения: