Скрипты: ReConnecter - скрипт для периодического перелогина.

 

ReConnecter - скрипт для периодического перелогина.:

Скрипт призван решить проблему "замирающих графиков" - когда при наличии связи с торговым сервером перестают обновляться графики котировок.

Author: Andrey Khatimlianskii

 
please english
 

Штука полезная. Только я бы ее спользовал с оговоркой: если счет серьезный - таких проблем не должно быть. Если они все же возникают - их надо решить принципиально. Но, если вариантов решения нет ( ни прова, ни линию, ни ДЦ не сменить) - изящный паллиатив. И отличный пример (для меня, во всяком случае) использования надстроек над MQL.

Автору, как всегда, благодарность и респект.

 
Babay:

Автору, как всегда, благодарность и респект.

В свою очередь, поблагодарю Getch-а за функции работы с окнами терминала.
 

Хмм, никогда не возникало таких проблем, впрочем это неважно, штука потенциально полезная.

Не нравится одна вещь -- релогин когда проблем нету.

Можно ведь отслеживать текущую цену по любой валюте. И делать релогин только тогда, когда цена не изменялась в течение допустим минуты.

ИМХО, такой вариант должен быть лучше.

 
TheXpert:

Не нравится одна вещь -- релогин когда проблем нету.
Можно ведь отслеживать текущую цену по любой валюте. И делать релогин только тогда, когда цена не изменялась в течение допустим минуты.
ИМХО, такой вариант должен быть лучше.

Да, так будет правильнее. Добавлю в качестве опции.
Вообще, задумывалось что релогин будет ~ 1 раз в час.

 
 

Нужно чуть исправить функциию start()  и ReLogin будет происходить: только при условии отсутствия связи с сервером более чем “Pause_sec” секунд (отсутствия новой информации о котировках)

void start()
{
    if ( !IsDllsAllowed() )
    {
        Alert( "DLLs not allowed!" );
        return;
    }
   datetime LastCheck;
    while ( !IsStopped() )
    {
       if(LastCheck==TimeCurrent())
         {
           Login(1);
           while ( !IsStopped() )
            {
               if ( OrdersHistoryTotal() > 0 ) break;
               Sleep(1000);
            }
            Print( "Успешное подключение к счету #", AccountNumber() ); //, "! Следующее будет через ", Pause_sec/60, " минут..." );
          }
        LastCheck = TimeCurrent();
        Sleep(Pause_sec*1000);
    }
    return;
}

 


PS: Pause_sec более 3минут делать не смысла, если у вас в терминале есть все Major пары
extern int Pause_sec = 180;

 
ктонибудь знает как научить его работать со счетами не в списке Избранное, а в основном окне навигатора?
 
kav:
ктонибудь знает как научить его работать со счетами не в списке Избранное, а в основном окне навигатора?

Попробуйте вместо вызова Login(1) делать Login2():

// Подключается к первому сверху счету окна Навигатор
void Login2()
{
  int hwnd = WindowHandle(Symbol(), Period());
  int hwnd_parent = 0;
  while (!IsStopped())
  {
     hwnd = GetParent(hwnd);
     if (hwnd == 0) break;
     hwnd_parent = hwnd;
  }
  if (hwnd_parent != 0)  // нашли главное окно
  {
    PostMessageA(hwnd_parent, WM_COMMAND, 35429, 0); // Вызвали логин
    Sleep(PAUSE);                             // выждали
    hwnd = GetLastActivePopup(hwnd_parent);   // нашли форму логина
    PostMessageA(hwnd, WM_KEYDOWN, VK_ENTER, 0); // залогинились
  }
  return;
}
Причина обращения: