掉线重新连接代码

楼主  收藏   举报   帖子创建时间:  2019-05-05 10:30 回复:0 关注量:784
  1. //+------------------------------------------------------------------+
  2. //|                                             断线自动重连脚本.mq4 |
  3. //|                                                            "ldj" |
  4. //|                                           "http://www.fxvip.net" |
  5. //+------------------------------------------------------------------+
  6. //scripts//脚本文件
  7. #property copyright "ldj"
  8. #property link      "http://www.fxvip.net"
  9. #property show_inputs
  10. //自动登录准备
  11. //把要登录的账号添加到收藏夹,并保证列在第一位。
  12. extern string 邮件标记字符串="EA";
  13. extern string 所有参数单位为秒="以下参数均折算为妙";
  14. extern int 时差=18000; //本地时间与服务器时间的时间差,本地时间迟于服务器时间其值为负。单位秒。
  15. extern int 允许时差=120;//允许服务器行情报价停滞的时间,建议设置2分钟即120秒。
  16. extern int 检测间隔=20;//单位秒,不应小于20秒。
  17. extern bool 邮件报警=false;
  18. extern bool 声音报警=false;
  19. //0、不自动登录。1、重新扫描服务器。2、重新登录第一个服务器。3、登录收藏夹第一个账号4、登录导航窗第一个账号
  20. extern int 重连方式=1;

  21. int ServerNum=0;

  22. #include <WinUser32.mqh>
  23. #import "user32.dll"
  24.   int GetParent( int hWnd );
  25.   int GetDlgItem( int hDlg, int nIDDlgItem );
  26.   int GetLastActivePopup( int hWnd );
  27.   int GetAncestor(int hWnd,int gaFlags);//GetAncestor(HWND hwnd,UINT gaFlags);
  28. #import

  29. #define VK_HOME 0x24
  30. #define VK_DOWN 0x28
  31. #define VK_ENTER 0x0D

  32. #define PAUSE 1000
  33. int LoginSleep=120; //不小于2分钟,避免频繁发送登录请求
  34. int MailSleep=120;  //不小于2分钟,避免频繁发送邮件
  35. datetime LoginTime,MailTime;

  36. //+------------------------------------------------------------------+
  37. //| script program init function                                     |
  38. //+------------------------------------------------------------------+
  39. void init()
  40. {
  41.       LoginTime=TimeLocal();
  42.       MailTime=TimeLocal();
  43.       if(检测间隔<10)检测间隔=10; //避免频繁检测系统资源消耗过多!
  44.       return;
  45. }
  46. //+------------------------------------------------------------------+
  47. //| script program start function                                    |
  48. //+------------------------------------------------------------------+
  49. void start()
  50. {
  51.         if ( !IsDllsAllowed() )
  52.         {
  53.                 alert( "禁止调用DLL文件" );
  54.                 return;
  55.         }

  56.    string 正文;
  57.    double T;
  58.    int week;
  59.    
  60.    while(IsStopped()==false)//如果没有接到脚本终止命令则一直运行
  61.    {
  62.      正文="服务器时间:"+TimeToStr(TimeCurrent())+"n本地的时间:"+TimeToStr(TimeLocal())+"n"+AccountCompany()+"平台"+"账号为:"+AccountNumber()+"的账户";
  63.      
  64.      T=(TimeLocal()-TimeCurrent())/360.0;
  65.      Comment("服务器时间:",TimeToStr(TimeCurrent(),TIME_SECONDS),
  66.              "n本地的时间:",TimeToStr(TimeLocal(),TIME_SECONDS),
  67.              "n参考时差值:",MathRound(T)*360);
  68.      week=TimeDayOfWeek(TimeLocal()-时差);
  69.      if(week>=1 && week<=5)//服务器时间为 星期一  至  星期五,有星期天或星期六 K线的平台可适当修改。
  70.      {
  71.        if ((TimeLocal()-TimeCurrent()-时差)>允许时差)
  72.        {
  73.          if (LoginTime+LoginSleep<TimeLocal())
  74.          {
  75.            LoginTime=TimeLocal();
  76.            switch(重连方式)
  77.            {
  78.              case 0 : break;
  79.              case 1 : ReConnecter();break;
  80.              case 2 : ReConnecterN(ServerNum);break;
  81.              case 3 : ReLogin(1);break;
  82.              case 4 : ReLogin2();break;
  83.              default : break;
  84.            }
  85.          }
  86.          //正文=AccountCompany()+"平台"+"账号为:"+AccountNumber()+"的账户";
  87.          if (声音报警==true) alert("从服务器上获取行情数据超时");
  88.          if (邮件报警==true && MailTime+MailSleep<TimeLocal())
  89.          {
  90.            SendMail("从服务器上获取行情数据超时",正文+"n从服务器上获取行情数据超时及时处理n"+邮件标记字符串);
  91.            MailTime=TimeLocal();
  92.          }
  93.          Sleep(检测间隔*1000);
  94.        }
  95.      }
  96.      if(IsConnected()==false)
  97.      {
  98.        if (LoginTime+LoginSleep<TimeLocal())
  99.        {
  100.           LoginTime=TimeLocal();
  101.           switch(重连方式)
  102.           {
  103.             case 0 : break;
  104.             case 1 : ReConnecter();break;
  105.             case 2 : ReConnecterN(ServerNum);break;
  106.             case 3 : ReLogin(1);break;
  107.             case 4 : ReLogin2();break;
  108.             default : break;
  109.           }
  110.        }
  111.        //正文=AccountCompany()+"平台"+"账号为:"+AccountNumber()+"的账户";
  112.        if (声音报警==true) alert("服务器断线");
  113.        if (邮件报警==true && MailTime+MailSleep<TimeLocal())
  114.        {
  115.          SendMail("服务器连接中断",正文+"n与服务器连接中断请及时处理n"+邮件标记字符串);
  116.          MailTime=TimeLocal();
  117.        }
  118.        Sleep(检测间隔*1000);
  119.      }
  120.      Sleep(1*1000);
  121.    }
  122.    Comment("");
  123.    return(0);
  124. }
  125. //+------------------------------------------------------------------+
打赏