Erreurs, bugs, questions - page 1620

 
Dmitri Custurov:
Malheureusement, pas toujours. Si vous ne vous connectez pas pendant une longue période, le terminal affiche "Account disable" et vous devez alors vous connecter manuellement. Cela se produit, par exemple, dans une fondation où les serveurs sont généralement éteints la nuit.
Et dans ce cas (avec une longue absence de connexion), si vous exécutez la commande "Fichier" -> "Connexion au compte de trading" dans la fenêtre sera exactement le même compte de trading ?
 
Exactement la même chose. Je n'ai créé qu'un seul compte.
 
Dmitri Custurov:
Bonjour à tous. J'ai posé cette question il y a plusieurs pages, mais je vais réessayer : existe-t-il un moyen de me reconnecter à mon compte lorsque la connexion au serveur MT5 est interrompue ? La recherche sur les forums n'a rien donné.
Si je redémarre le terminal, est-ce qu'il démarre avec les EAs en cours d'exécution (je n'ai pas le terminal installé, je ne peux pas vérifier) ? Si oui, vous pouvez écrire un script shell qui effectuera le redémarrage. Et tirez ce script de votre EA.
 
Dmitri Custurov:
Malheureusement, pas toujours. Si vous ne vous connectez pas pendant une longue période, le terminal affiche "Account disable" 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.
Il s'agit soit d'un bug, soit d'une configuration spécifique du courtier. Veuillez contacter le Service Desk pour ce problème. Cela ne devrait pas arriver.
 
Les développeurs peuvent-ils nous dire ce qu'ils pensent de la possibilité promise, mais non mise en œuvre, de renvoyer une valeur de fonction par référence ? Ne l'ont-ils pas fait ou cela pose-t-il un problème ?
 
Dmitri Custurov:
Malheureusement pas toujours. Si vous ne vous connectez pas pendant une longue période, le terminal émet le message "Account disable" et vous devez alors vous connecter manuellement. Cela se produit, par exemple, dans une fondation où les serveurs sont généralement éteints la nuit.

Voici le script qui fait apparaître le menu "File" - "Connect to trading account" - cliquez sur le bouton "OK" - ainsi le terminal se connectera au dernier compte de trading qui a été authentifié :

Se connecter à un compte de trading

//+------------------------------------------------------------------+
//|                                                    ClickMenu.mq5 |
//|                              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 script_show_inputs
input int number_menu=1;               //меню "Файл"
input int item_menu=14;                //пункт "Подключиться к торговому счёту"

#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 

#define  UINT int
#define  GA_ROOT            0x0002      // Retrieves the root window by walking the chain of parent windows
#define  WM_COMMAND         0x0111
#define  MIIM_STRING        0x00000040
#define  MIIM_SUBMENU       0x00000004
#define  BM_CLICK           0x000000F5

#import "user32.dll"
int  GetLastError();
//+------------------------------------------------------------------+
//| GetAncestor. Retrieves the handle to the ancestor of the         |
//| specified window. Извлекает дескриптор предка заданного окна     |
//+------------------------------------------------------------------+
HWND  GetAncestor(HWND hwnd,UINT gaFlags);
HMENU GetMenu(HWND hWnd);
//int   GetMenuItemCount(HMENU hMenu);
HMENU GetSubMenu(HMENU hMenu,int   nPos);
int   GetMenuItemID(HMENU hMenu,int nPos);
bool  PostMessageW(HWND hWnd,UINT Msg,int wParam,int lParam);
HWND  GetLastActivePopup(HWND hWnd);
HWND  GetDlgItem(HWND hDlg,int nIDDlgItem);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   long  mainChartID=ChartID();                          //возвращает идентификатор текущего графика
   int   hdlmainChartID=ChartWindowsHandle(mainChartID); //получает хэндл графика   
   HWND  hdlRoot=GetAncestor(hdlmainChartID,GA_ROOT);    //получает хендл предка указанного окна
                                                         //Print("hdlRoot = ",IntegerToString(hdlRoot));

   HMENU hmenu=GetMenu(hdlRoot);                         //получает хэндл главного меню терминала
/*int count_hmenu=GetMenuItemCount(hmenu);
   Print("в главном меню ",IntegerToString(count_hmenu)," элементов");*/

   HMENU hsubmenu=GetSubMenu(hmenu,number_menu);         //получает хэндл заданного подменю ("Файл")
/*int count_hsubmenu=GetMenuItemCount(hsubmenu);
   Print("в подменю ",IntegerToString(number_menu)," ",IntegerToString(count_hsubmenu)," элементов");*/
   
   int hpos=GetMenuItemID(hsubmenu,item_menu);           //получает хэндл пункта "Подключиться к торговому счёту"
   PostMessageW(hdlRoot,WM_COMMAND,hpos,0);              //кликаем на пункт "Подключиться к торговому счёту"

   Sleep(2000);
   HWND hlastPopup=GetLastActivePopup(hdlRoot);          //получает хендл последнего PopUp меню
   HWND hOK=GetDlgItem(hlastPopup,0x00000001);           //получает хенд кнопки из диалога
   PostMessageW(hOK,BM_CLICK,0,0);                       //кликаем на кнопку "OK"
  }
//+------------------------------------------------------------------+
//| 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);
  }
//+------------------------------------------------------------------+

Si tout fonctionne, je vais nettoyer le code et le poster dans la KodoBase.

Dossiers :
ClickMenu.mq5  5 kb
 

MQL4. La description de StringToCharArray() dit "Copie symboliquement une chaîne convertie de l'unicode à l'ansi dans un emplacement spécifié d'un tableau de type uchar". J'ai l'impression qu'il y a une erreur dans la description. Avec cette fonction, vous pouvez simplement convertir un caractère en un nombre correspondant au code dépendant de l'encodage des caractères (la fonction a 5 paramètres). C'est-à-dire qu'il n'y a pas de conversion "... de l'unicode à l'ansi..." ici. Corrigez-moi si je me trompe.

Si je dois trouver le code, par exemple, pour le symbole € pour Ansi, alors à la place du 5ème paramètre j'écrirai CP_ACP. Si elle est UTF7, alors CP_UTF7. Si pour Unicode, j'utilise StringToShortArray() (voir script).

#property strict
void OnStart()
  {
   string a = "€"; // euro symbol
   uchar  ArrayAnsi[1], ArrayUTF7[1];
   ushort ArrayUnicode[1];
   
   int Count;
   Count=StringToCharArray(a,ArrayAnsi,0,WHOLE_ARRAY,CP_ACP);
   Print("1) € in Ansi = ",IntegerToString(ArrayAnsi[0]));
   
   Count=StringToCharArray(a,ArrayUTF7,0,WHOLE_ARRAY,CP_UTF7);
   Print("2) € in UTF7 = ",IntegerToString(ArrayUTF7[0]));

   Count=StringToShortArray(a,ArrayUnicode,0,WHOLE_ARRAY);
   Print("3) € in Unicode = ",IntegerToString(ArrayUnicode[0]));
  }


 

Un bug dans le compilateur.

template<typename T>  void  Func (T&)     {  }
template<typename T>  void  Func (T*&)    {  }

template<typename T>  void  InterFunc(T& var)  { Func(var); }   // 'var' - parameter conversion not allowed
  

class A {  };


void F1()  { A a;   InterFunc(a);  }

void F2()  { A* a;  Func(a);  }

En revanche, si vous supprimez la fonction F2, il se compile normalement.

 

Erreur de compilation.

class A {  };


void Func(A* const&)   {   }


void OnStart()
  {    
    A* const a= NULL;
    
    Func(a);  // 'a' - cannot convert from const pointer to nonconst pointer
  }
 

Le comportement du compilateur est ambigu, il ne compile pas comme ça :

class A  {  };

template<typename T> void Func(const T&)   {   }


void OnStart()
  {    
    A* const a= NULL;
    Func(a);   // 'a' - constant variable cannot be passed as reference
  }

Mais si vous déclarez le modèle comme ça, ça compile :

template<typename T> void Func(const T*const&)   {   }
Raison: