MT4自动断线重连脚本自动断线重连脚本自动断线重连脚本自动断线重连脚本,完整注释。

自动断线重连脚本,通过发送系统消息模拟操作的方式。

点击下载程序与源码 文件大小:3.21 KB

MQL4/ MQL4/Scripts/ MQL4/Scripts/disconnect.mq4 必须读我.txt 策汇在线.url

MQL4/Scripts/disconnect.mq4代码片段:

//+------------------------------------------------------------------+ //| 断线自动重连脚本.mq4 | //+------------------------------------------------------------------+ #property copyright "" #property link "" #property show_inputs extern string 所有参数单位为秒="以下参数均折算为妙"; extern int 时差=18000; // 本地时间与服务器时间的时间差,本地时间迟于服务器时间其值为负。单位秒。 extern int 允许时差=120; // 允许服务器行情报价停滞的时间,建议设置2分钟即120秒。 extern int 检测间隔=10; // 单位秒 extern bool 邮件报警=false; extern bool 声音报警=false; // 1、重新扫描服务器。2、重新登录第一个服务器。3、登录收藏夹第一个账号4、登录导航窗第一个账号 extern int 重连方式=1; int ServerNum=0; #include <WinUser32.mqh> #import "user32.dll" int GetParent( int hWnd ); int GetDlgItem( int hDlg, int nIDDlgItem ); int GetLastActivePopup( int hWnd ); int GetAncestor(int hWnd,int gaFlags);//GetAncestor(HWND hwnd,UINT gaFlags); #import #define VK_HOME 0x24 #define VK_DOWN 0x28 #define VK_ENTER 0x0D #define PAUSE 1000 int loginSleep=60; datetime timetmp; //+------------------------------------------------------------------+ //| script program init function | //+------------------------------------------------------------------+ void init() { timetmp=TimeLocal(); ReLogin(1); ReConnecter(); //ReLogin2() return; } //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ void start() { if ( !IsDllsAllowed() ) { Alert( "禁止调用DLL文件" ); return; } string 正文; double T; int week; while(IsStopped()==false)//如果没有接到脚本终止命令则一直运行 { T=(TimeLocal()-TimeCurrent())/360.0; Comment("服务器时间:",TimeToStr(TimeCurrent(),TIME_SECONDS), "\n本地的时间:",TimeToStr(TimeLocal(),TIME_SECONDS), "\n参考时差值:",MathRound(T)*360); week=TimeDayOfWeek(TimeLocal()-时差); if(week>=1 && week<=5)//服务器时间为 星期一 至 星期五,有星期天或星期六 K线的平台可适当修改。 { if ((TimeLocal()-TimeCurrent()-时差)>允许时差) { if (timetmp+loginSleep<TimeLocal()) { timetmp=TimeLocal(); switch(重连方式) { case 1 : ReConnecter();break; case 2 : ReConnecterN(ServerNum);break; case 3 : ReLogin(1);break; case 4 : ReLogin2();break; default : ReConnecter(); } } 正文=AccountCompany()+"平台"+"账号为:"+AccountNumber()+"的账户"; if (声音报警==true) Alert("从服务器上获取行情数据超时"); if (邮件报警==true) SendMail("从服务器上获取行情数据超时",正文+"从服务器上获取行情数据超时及时处理"); Sleep(检测间隔*1000); } } if(IsConnected()==false) { if (timetmp+loginSleep<TimeLocal()) { timetmp=TimeLocal(); switch(重连方式) { case 1 : ReConnecter();break; case 2 : ReConnecterN(ServerNum);break; case 3 : ReLogin(1);break; case 4 : ReLogin2();break; default : ReConnecter(); } } 正文=AccountCompany()+"平台"+"账号为:"+AccountNumber()+"的账户"; if (声音报警==true) Alert("服务器断线"); if (邮件报警==true) SendMail("服务器连接中断",正文+"与服务器连接中断请及时处理"); Sleep(检测间隔*1000); } Sleep(1*1000); } return(0); } //+------------------------------------------------------------------+ //| script program ReLogin function | //+------------------------------------------------------------------+ //在位于窗口的行数数我的最爱标签导航帐户连接 void ReLogin( int Num ) { int hwnd = WindowHandle(Symbol(), Period()); //当前图表的句柄 (Handle) int hwnd_parent = 0; while (!IsStopped())//如果没有接到脚本终止命令则一直运行 { hwnd = GetParent(hwnd);//当前图表的父窗口句柄(Handle) if (hwnd == 0) break; //句柄等于0退出while循环 hwnd_parent = hwnd; } if (hwnd_parent != 0) //获得收藏夹句柄 { hwnd = GetDlgItem(hwnd_parent, 0xE81C); //59420 查找导航窗口句柄 hwnd = GetDlgItem(hwnd, 0x52); //82 选择导航窗口 * hwnd = GetDlgItem(hwnd, 0x8A70); //35440 获得收藏夹窗口句柄 PostMessageA(hwnd, WM_KEYDOWN, VK_HOME,0); //选择导航收藏夹第一个账号,上线最喜爱的收藏夹窗口导航 while (Num > 1) { PostMessageA(hwnd, WM_KEYDOWN,VK_DOWN, 0); //转移到所需行 Num--; } PostMessageA(hwnd, WM_KEYDOWN, VK_ENTER, 0); //输出enter 打开登录窗口 Sleep(PAUSE); // 等待1秒 hwnd = GetLastActivePopup(hwnd_parent); //选择登录窗口 //GetLastActivePopup**该函数确定指定窗口中的哪一个弹出式窗口是最近活动的窗口。 PostMessageA(hwnd, WM_KEYDOWN, VK_ENTER, 0); //输出enter 确认登录 } return; } //+------------------------------------------------------------------+ //| script program Login2 function | //+------------------------------------------------------------------+ void ReLogin2() { //导航窗口中第一个账号登录; 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; } //+------------------------------------------------------------------+ //| script program ReConnecter function | //+------------------------------------------------------------------+ void ReConnecter() { int hwnd = WindowHandle(Symbol(), Period()); //当前图表的句柄 (Handle) int hwnd_parent = 0; while (!IsStopped())//如果没有接到脚本终止命令则一直运行 获得mt4进程句柄 { hwnd = GetParent(hwnd);//当前图表的父窗口句柄(Handle) if (hwnd == 0) break; //句柄等于0退出while循环 hwnd_parent = hwnd; } //int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2); if (hwnd_parent != 0) { SendMessageA (hwnd_parent, WM_COMMAND, 37400, 0);//发送扫描服务器命令; } return; } //+------------------------------------------------------------------+ //| script program ReConnecter function | //+------------------------------------------------------------------+ void ReConnecterN(int S_Num) { int hwnd = WindowHandle(Symbol(), Period()); //当前图表的句柄 (Handle) int hwnd_parent = 0; while (!IsStopped())//如果没有接到脚本终止命令则一直运行 获得mt4进程句柄 { hwnd = GetParent(hwnd);//当前图表的父窗口句柄(Handle) if (hwnd == 0) break; //句柄等于0退出while循环 hwnd_parent = hwnd; } //int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2); if (hwnd_parent != 0) { int Sdig=33900+S_Num; Sdig=SendMessageA (hwnd_parent, WM_COMMAND, Sdig, 0);//发送扫描服务器命令; Print("Sdig=",Sdig); } return; } //+------------------------------------------------------------------+