Пересканирование сервера

Скрипт делал для себя, были различные предположения на этом форуме ответа данной задачи но у всех чего то не хватало, решил все объединить в один скрипт, дабы учитывал по максимуму возможности МКЛ.
Скрипт сканирует сервера при обрыва связи, либо неточности №6, если не оказывает помощь делает перелогинирование счета. Скрипт установится машинально на график советником — "Запуск скрипта советником". 1) Скрипт "Пересканирование" положить в папку expert->scripts скомпилировать, вывешивать на график его не обязательно это сделает советник.
2) Советник "Запуск скрипта советником" положить в папку expert после этого скомпилировать, вешаете советник на график евро/американского доллара советник установит скрипт на график, на вторых знаках графика советник не устанавливает скрипт.
3) WinUser32.mqh закиньте в папку expert->include, она у вас имеется стандартная но лучше положить эту от Zhunko в противном случае может не сработать скрипт.
Возможно перетащить код с советника в собственный советник будет устанавливать с вашего советника, в советнике возможно поменять знак на любой что вы используете знак. Работа выставления скрипта советником по знаку сделана для не допущения дублирования скрипта с различных графиков.
Принципиально важно! В сервисе->настройки->советники терминала МТ4 — необходимо убрать галку, "отключить советники при смене счета"
Советник //+——————————————————————+ //| Запуск скрипта советником.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); } //+——————————————————————+ Скрипт
//+——————————————————————+ //| Пересканирование.mq4 | //| Скрипт | //| Martingeil© 2011, 01 июля | //| fx.09@mail.ru | //+——————————————————————+ #property copyright "Martingeil© 2011, 01 июля" #property link "fx.09@mail.ru" // Скрипт сканирует сервера при обрыва связи, либо неточности №6, если не оказывает помощь делает перелогинирование счета. // Скрипт установится машинально на график советником — "Запуск скрипта советником". // В сервисе->настройки->советники терминала МТ4 — необходимо убрать галку, "отключить советники при смене счета"
#include // Стандартная библиотека #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(20000); }//while(!IsStopped()) Comment("&не;); return; }//void start()
// Пересканируем серверы ———————————————— int ReScanServers(){
int hwindow=GetAncestor(WindowHandle(Symbol(),Period()),2); // приобретаем хендл главного окна Comment("Пересканированиеn+++ ПереСканируем Серверы +++"); // выведем на чарт сообщение if(hwindow!=0) { // нашли основное окно // отправляем сообщение "пересканировать серверы" return(PostMessageA(направляться,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 Запуск скрипта советником.mq4 WinUser32.mqh