Erreurs, bugs, questions - page 1622

 
Karputov Vladimir:

Voici le script qui appelle le menu "Fichier" - item "Connecter au compte de trading" - cliquez sur le bouton "OK" - ainsi le terminal se connectera au dernier compte de trading qui a été authentifié :

#ifndef  _IsX64
#define  HWND long
#define  HMENU long
#define  HBITMAP long
#define  ULONG_PTR long
#else
#define  HWND int
#define  HMENU int
#define  HBITMAP int
#define  ULONG_PTR int
#endif

_IsX64 ne peut pas être utilisé de cette manière. Il n'est pertinent qu'au moment de l'exécution.

 
Alexey Navoykov:

Avez-vous testé ou optimisé ? Dans ce dernier cas, il y a effectivement des problèmes.

Les exécutions uniques, je n'ai pas inclus l'optimisation.
 
Koldun Zloy:

_IsX64 ne peut pas être utilisé de cette manière. Cela ne compte qu'au moment de l'exécution.

Merci pour le conseil. Je l'ai corrigé et l'ai fait en tant que fichier inclus :

//+------------------------------------------------------------------+
//|                                          LoginToTradeAccount.mqh |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property description "Library for clicks on the MetaTrader 5 menu \"File\" item \"Login to trading account\""
#property description "Библиотека для кликов по меню MetaTrader 5 \"Файл\" пункт \"Подключиться к торговому счёту\""

int number_menu=1;   //menu "File"; меню "Файл"
int item_menu=14;    //item "Login to trading account"; пункт "Подключиться к торговому счёту"

#define  GA_ROOT            0x00000002  // Retrieves the root window by walking the chain of parent windows
#define  WM_COMMAND         0x00000111
#define  BM_CLICK           0x000000F5

#import "user32.dll"
int  GetLastError();
//+------------------------------------------------------------------+
//| GetAncestor. Retrieves the handle to the ancestor of the         |
//| specified window. Возвращает хендл предка заданного окна         |
//+------------------------------------------------------------------+
//--- x64
long  GetAncestor(long hwnd,int gaFlags);
//--- x86
int  GetAncestor(int hwnd,int gaFlags);
//+------------------------------------------------------------------+
//| GetMenu. Retrieves a handle to the menu assigned to the          |
//| specified window. Возвращает хендл меню,                         |
//| назначенного указанному окну.                                    |
//+------------------------------------------------------------------+
//--- x64
long GetMenu(long hWnd);
//--- x86
int GetMenu(int hWnd);
//+------------------------------------------------------------------+
//| GetSubMenu. Retrieves a handle to the drop-down menu or submenu  |
//| activated by the specified menu item. Возвращает хендл           |
//| выпадающего меню или подменю указанного пункта меню.             |
//+------------------------------------------------------------------+
//--- x64
long GetSubMenu(long hMenu,int nPos);
//--- x86
int GetSubMenu(int hMenu,int nPos);
//+------------------------------------------------------------------+
//| GetMenuItemID. Retrieves the menu item identifier of a menu item |
//| located at the specified position in a menu. Возвращает          |
//| идентификатор пункта меню, расположенного в                      |
//| указанной позиции в меню.                                        |
//+------------------------------------------------------------------+
//--- x64
int   GetMenuItemID(long hMenu,int nPos);
//--- x86
int   GetMenuItemID(int hMenu,int nPos);
//+------------------------------------------------------------------+
//| PostMessageW. Places (posts) a message in the message queue      |
//| associated with the thread that created the specified window     |
//| and returns without waiting for the thread to process the        |
//| message. Размещает (публикует) сообщение в очереди сообщений,    |
//| связанной с потоком, который создал указанное окно и             |
//| возвращается, не дожидаясь потока, чтобы обработать сообщение.   |
//+------------------------------------------------------------------+
//--- x64
bool  PostMessageW(long hWnd,int Msg,int wParam,int lParam);
//--- x86
bool  PostMessageW(int hWnd,int Msg,int wParam,int lParam);
//+------------------------------------------------------------------+
//| GetLastActivePopup. Determines which pop-up window owned by the  |
//| specified window was most recently active. Определяет, какое     |
//| всплывающее окно, принадлежащие указанному окну, совсем недавно  |
//| было активным.                                                   |
//+------------------------------------------------------------------+
//--- x64
long  GetLastActivePopup(long hWnd);
//--- x86
int  GetLastActivePopup(int hWnd);
//+------------------------------------------------------------------+
//| GetDlgItem. Retrieves a handle to a control in the specified     |
//| dialog box. Возвращает хэндл элемента управления в               |
//| указанном диалоговом окне.                                       |
//+------------------------------------------------------------------+
//--- x64
long  GetDlgItem(long hDlg,int nIDDlgItem);
//--- x86
int  GetDlgItem(int hDlg,int nIDDlgItem);
#import
//+------------------------------------------------------------------+
//| Click on the item "Login to trading account"                     |
//| Клик на пункте "Подключиться к торговому счёту"                  |
//+------------------------------------------------------------------+
void LoginToTradeAccount()
  {
   long mainChartID=ChartID(); //returns the ID of the current chart; возвращает идентификатор текущего графика
   int hdlmainChartID=ChartWindowsHandle(mainChartID); //returns the Chart window handle (HWND); получает хэндл графика 

   if(_IsX64)
     {
      long hdlRoot=GetAncestor((long)hdlmainChartID,GA_ROOT);
      long hmenu=GetMenu(hdlRoot);
      long hsubmenu=GetSubMenu(hmenu,number_menu);
      int hpos=GetMenuItemID(hsubmenu,item_menu);
      PostMessageW(hdlRoot,WM_COMMAND,hpos,0);
      Sleep(2000);
      long hlastPopup=GetLastActivePopup(hdlRoot);
      long hOK=GetDlgItem(hlastPopup,0x00000001);
      PostMessageW(hOK,BM_CLICK,0,0);
     }
   else
     {
      int hdlRoot=GetAncestor(hdlmainChartID,GA_ROOT);
      int hmenu=GetMenu(hdlRoot);
      int hsubmenu=GetSubMenu(hmenu,number_menu);
      int hpos=GetMenuItemID(hsubmenu,item_menu);
      PostMessageW(hdlRoot,WM_COMMAND,hpos,0);
      Sleep(2000);
      int hlastPopup=GetLastActivePopup(hdlRoot);
      int hOK=GetDlgItem(hlastPopup,0x00000001);
      PostMessageW(hOK,BM_CLICK,0,0);
     }
  }
//+------------------------------------------------------------------+
//| The function gets the handle graphics                            |
//| Функция получает хэндл графика                                   |
//+------------------------------------------------------------------+
int ChartWindowsHandle(long chart_ID)
  {
//--- prepare the variable to get the property value
//--- подготовим переменную для получения значения свойства
   long result=-1;
//--- reset the error value
//--- сбросим значение ошибки
   ResetLastError();
//--- receive the property value
//--- получим значение свойства
   if(!ChartGetInteger(chart_ID,CHART_WINDOW_HANDLE,0,result))
     {
      //--- display the error message in Experts journal
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
//--- return the value of the chart property
//--- вернем значение свойства графика
   return((int)result);
  }
//+------------------------------------------------------------------+
Dossiers :
 
Dmitri Custurov:
Malheureusement, pas toujours. S'il n'y a pas de connexion pendant une longue période, le terminal affiche "Compte désactivé" et vous devez alors vous connecter manuellement. Cela se produit, par exemple, dans un fonds où les serveurs sont généralement éteints la nuit.

Voici la solution : EA vérifie périodiquement l'état de la connexion au serveur commercial(TERMINAL_CONNECTED) et si la valeur renvoyée est "0", il appelle (en utilisant l'API WIn) le menu "File", l'élément "Connect to trade account". Le fichier include dans lequel la fonction de clic de menu est implémentée se trouve ici. Exemple d'une EE :

//+------------------------------------------------------------------+
//|                                           TestAccountDisable.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <LoginToTradeAccount.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(12);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   static bool cleaner=false;
   if(!cleaner)
     {
      long rezult=TerminalInfoInteger(TERMINAL_CONNECTED);
      Comment("TERMINAL_CONNECTED: ",IntegerToString(rezult));
      if(rezult==0)
         LoginToTradeAccount();
     }
   else
      Comment("");
   cleaner=!cleaner;
  }
//+------------------------------------------------------------------+

EA vérifie l'état de la connexion toutes les 12 secondes et efface les commentaires de temps en temps.

 
N'y a-t-il pas vraiment de définition ?
 

Comment connecter un fichier tableau à mon EA ?

D'abord, le script écrit un tableau :

string filename="mas.dat";
int handle=FileOpen(filename,FILE_BIN|FILE_WRITE);
FileWriteArray(handle,hol,0,4608);
FileClose(handle);

Je connecte le fichier dans l'EA :

#include <mas.dat> 

Lors de la compilation, des erreurs :

'??????????????????????????t ????...' - l'identifiant est trop long mas.dat 1 1

'' - symbole inconnu mas.dat 1 3015

 
Aliaksandr Yemialyanau:

Comment connecter un fichier tableau à mon EA ?

D'abord, le script écrit un tableau :

Je connecte le fichier dans l'EA :

Lors de la compilation, des erreurs :

'??????????????????????????t ????...' - l'identifiant est trop long mas.dat 1 1

'' - symbole inconnu mas.dat 1 3015

Il est beaucoup plus rapide de lire l'ensemble du fichier de tableau en mémoire et de travailler ensuite avec lui - ce sera plusieurs fois plus rapide.
 
Karputov Vladimir:

Voici la solution : EA vérifie périodiquement l'état de la connexion au serveur commercial(TERMINAL_CONNECTED) et si la valeur renvoyée est "0", il appelle (en utilisant l'API WIn) le menu "File", l'élément "Connect to trade account". Le fichier include dans lequel la fonction de clic de menu est implémentée se trouve ici. Exemple d'une EE :

Le conseiller vérifie l'état de la connexion toutes les 12 secondes et efface les commentaires de temps en temps.

Merci beaucoup pour la solution fournie. Tout fonctionne.
 
Débogage
#define  i ii

void OnTick()
{
  for (int i = 0; i < 5; i++)
    Print(i); // отладчик по Shift+F9 показывает не ii, а i, выдавая Unknown identifier
}
 
Dmitri Custurov:
Merci beaucoup pour la solution fournie. Tout fonctionne.
Super. Ainsi, la bibliothèque et l'exemple de cas d'utilisation que je poste dans KodoBase.