Автоматическая смена аккаунта для доступа к MT4/MT5 - страница 2

 
Ihor Herasko:

Я не понимаю, какая разница, где именно настраивать: в указанном меню или в меню той программы, которая это будет делать? Ведь все равно требуется действие от человека. В чем тогда автоматизация?


Боюсь, что я не смогу Вам объяснить, если после столь подробного мной описания Вам не удается понять сути проблемы.... но я попробую.

Итак, у нас есть необходимость контролировать непредвиденный разрыв соединения с интернетом - для этих целей звук удачное решение. Однако у нас есть потребность перебрать 50 счетов и получить информацию о текущем финансовом состоянии, делать это надо примерно раз в час, что б отреагировать в случае необходимости. И вот при запуске скрипта по горячей клавише мы слушаем 100 звуковых сигналов, которые утомляют и не несут смысловой для нас нагрузки. Поэтому и есть потребность, что б скрипт отключал звук перед перебором аккаунтов и включал его после окончания. Цель - не лазить каждый раз в меню и не включать/отключать звук.

 
Aleksey Vyazmikin:

Попробуйте программно переименовать disconnect.wav из папки Sounds, а потом переименовать его обратно.

 
Andrey Khatimlianskii:

Попробуйте программно переименовать disconnect.wav из папки Sounds, а потом переименовать его обратно.


Идея интересная. Но вот реализовать её как?

 

Вероятно нужно задействовать стандартные виндовые длл, как в примере здесь.

 
Да, с помощью WinAPI. Или создать жесткую ссылку на этот файл в папке MQL\Files\ и работать с ней обычными MQL-функциями.
 
Aleksey Vyazmikin:

Боюсь, что я не смогу Вам объяснить, если после столь подробного мной описания Вам не удается понять сути проблемы.... но я попробую.

Итак, у нас есть необходимость контролировать непредвиденный разрыв соединения с интернетом - для этих целей звук удачное решение. Однако у нас есть потребность перебрать 50 счетов и получить информацию о текущем финансовом состоянии, делать это надо примерно раз в час, что б отреагировать в случае необходимости. И вот при запуске скрипта по горячей клавише мы слушаем 100 звуковых сигналов, которые утомляют и не несут смысловой для нас нагрузки. Поэтому и есть потребность, что б скрипт отключал звук перед перебором аккаунтов и включал его после окончания. Цель - не лазить каждый раз в меню и не включать/отключать звук.



Реализовать  отключение звука,   в момент перебора аккаунтов,  можно по Api. После перебора вновь включать.  
 
Yuriy Zaytsev:


Реализовать  отключение звука,   в момент перебора аккаунтов,  можно по Api. После перебора вновь включать.  

Конечно это так - я так и хочу, но только не знаю, как это делать.

 
Aleksey Vyazmikin:

Конечно это так - я так и хочу, но только не знаю, как это делать.

Andrey Khatimlianskii:
создать жесткую ссылку на этот файл в папке MQL\Files\ и работать с ней обычными MQL-функциями.
 

Про звук - просто отключил сигналы при разрыве и установлении связи руками - пока так.

Немного улучшил скрипт:

1. Добавил критерий, при котором просадка требует внимания к себе. Теперь визуально видно, на какой счет нужно обратить внимание, кроме того, добавил звуковой сигнал.

2. Скрипт теперь зациклен, в настройках можно настроить, через сколько минут после окончания проверки счетов его снова запускать.

//+------------------------------------------------------------------+
//|                                            mql4-auth-example.mq4 |
//|                                     Copyright 2015, Sergey Lukin |
//|                                     #property script_show_inputs |                            +
//+------------------------------------------------------------------+
#property strict
#property script_show_inputs
#include <mql4-auth.mqh>


input int ReScanTime=5;
input int ProcAlert=75;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- удаление всех созданных объектов 
   bool DelAllObjects=true;
   if(DelAllObjects==true)
     {
      int obj_total=ObjectsTotal();
      PrintFormat("Всего%d объектов",obj_total);
      for(int i=obj_total-1;i>=0;i--)
        {
         string name=ObjectName(i);
         PrintFormat("Объект%d:%s",i,name);
         ObjectDelete(name);
        }
     }

   int arrName[2]=//Заполняем массив логинами
     {
      1000,
      1001,
     };
   string arrPass[2]=//Заполняем массив паролями
     {
      "mIq5",
      "mIq5",
     };
   datetime nextCheckTime=0;
   while(true)
     {
      if(TimeLocal()>nextCheckTime)
        {
            int Razriv=0;
            int Raznica=20;
            for(int i=0; i<36; i++)//i равно числу аккаунтов
              {
               //Print("arrName=",arrName[i],"arrPass=",arrPass[i]);
               if(auth((string)arrName[i],arrPass[i],"RoboForex-FixCent"))
                 {
               //   Print("1 Hooray, I found the login dialog, inserted credentials, now wait until MT4 connects :)");
                  if(Razriv==0) Sleep(30000);
                  Sleep(15000);
                  Razriv=Razriv+Raznica;
                  info(Razriv);
                 }
               else
                 {
               //   Print("1 Sorry, I could not even find the Login dialog... Is your MT4 older than v880 or something?");
                 }
              }
             nextCheckTime = TimeLocal() + 60*ReScanTime; 
             Print(TimeToString(nextCheckTime,TIME_DATE|TIME_MINUTES|TIME_SECONDS));
        }
        else Sleep(0);
     }
  }
//+------------------------------------------------------------------+
//|Функция запроса вывода информации на экран                        |
//+------------------------------------------------------------------+
int info(int x)
  {
   double Balance=AccountInfoDouble(ACCOUNT_BALANCE);
   double Eguity=AccountInfoDouble(ACCOUNT_EQUITY);
   long    Name=AccountInfoInteger(ACCOUNT_LOGIN);
   double Proc=0.0;
   double lotAll=GetAmountLotFromOpenPos("",-1,-1);
   if(Balance>0 && Eguity>0) Proc=Eguity/Balance*100;
   else Proc=100.0;
   if(Proc<ProcAlert)
     {
      Label((string)x,//Название
            0,      //Окно
            30,     //X
            x,      //Y
            "N:"+(string)Name+" Balance="+DoubleToString(Balance,2)+" Eguity="+DoubleToString(Eguity,2)+" %="+DoubleToString(Proc,2)+" lot="+DoubleToString(lotAll,2),
            10,//Размер шрифта
            clrDeepPink,//Цвет шрифта
            CORNER_LEFT_UPPER,//Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                
            ANCHOR_LEFT_UPPER
            );
      PlaySound("\\Files\\Sound\\NecromancerNoGold1.wav");
     }
   else
     {
      Label((string)x,//Название
            0,      //Окно
            30,     //X
            x,      //Y
            "N:"+(string)Name+" Balance="+DoubleToString(Balance,2)+" Eguity="+DoubleToString(Eguity,2)+" %="+DoubleToString(Proc,2)+" lot="+DoubleToString(lotAll,2),
            10,//Размер шрифта
            Yellow,//Цвет шрифта
            CORNER_LEFT_UPPER,//Выбор угла: 3 - нижний правый, 1 - верхний правый. 2 - нижний левый, 4 - верхний левый                
            ANCHOR_LEFT_UPPER
            );
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|Функция вывода информации на экран                                |
//+------------------------------------------------------------------+
void Label(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner,int anchor)
  {
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
   ObjectSetInteger(0,_name,OBJPROP_ANCHOR,anchor);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает сумму лотов открытых позиций                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="",int op=-1,int mn=-1) 
  {
   double l=0;
   int    i,k=OrdersTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if(OrderSymbol()==sy || sy=="") 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 || OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     l+=OrderLots();
                    }
                 }
              }
           }
        }
     }
   return(l);
  }
//+------------------------------------------------------------------+
Файлы:
 
Программно выключить звук без всяких API можно программно, меняю имя звука:  zvuk="aaa.wav"; - будет звук  zvuk="bbb.wav"; звук отсутствует, так как в этом файле тишина