Errores, fallos, preguntas - página 1620

 
Por desgracia, no siempre. Si no te conectas durante mucho tiempo, el terminal emite el mensaje "Cuenta desactivada" y entonces tienes que conectarte manualmente. Esto ocurre, por ejemplo, en una fundación donde los servidores suelen estar apagados por la noche.
 
Dmitri Custurov:
Por desgracia, no siempre. Si no te conectas durante mucho tiempo, el terminal emite el mensaje "Cuenta desactivada" y entonces tienes que conectarte manualmente. Esto ocurre, por ejemplo, en una fundación donde los servidores suelen estar apagados por la noche.
Y en este caso (con una larga falta de conexión), si se ejecuta el comando "Archivo" -> "Conectar a la cuenta de comercio" en la ventana será exactamente la misma cuenta de comercio?
 
Exactamente lo mismo. Sólo he creado una cuenta.
 
Dmitri Custurov:
Hola a todos. Hice esta pregunta hace varias páginas, pero lo intentaré de nuevo. ¿Hay alguna forma de volver a entrar en mi cuenta cuando se interrumpe la conexión con el servidor de MT5? La búsqueda en los foros no dio nada.
Si reinicio el terminal, ¿se inicia con los EAs en ejecución (no tengo el terminal instalado, no puedo comprobarlo)? Si es así, puedes escribir un script de shell que haga el reinicio. Y saca este script de tu EA.
 
Dmitri Custurov:
Por desgracia, no siempre. Si no te conectas durante mucho tiempo, el terminal emite el mensaje "Cuenta desactivada" y entonces tienes que conectarte manualmente. Esto ocurre, por ejemplo, en un fondo donde los servidores suelen estar apagados por la noche.
Esto es un error o una configuración específica del corredor. Por favor, póngase en contacto con el Servicio de Atención al Cliente con este problema. No debería ocurrir.
 
¿Pueden los desarrolladores comentar la capacidad prometida, pero no implementada, de devolver el valor de una función por referencia? ¿No han llegado a hacerlo, o hay alguna dificultad con ello?
 
Dmitri Custurov:
Por desgracia, no siempre. Si no te conectas durante mucho tiempo, el terminal emite el mensaje "Cuenta desactivada" y entonces tienes que conectarte manualmente. Esto ocurre, por ejemplo, en una fundación donde los servidores suelen estar apagados por la noche.

Aquí está el script que hace aparecer el menú "Archivo" - "Conectar a la cuenta de comercio" - haga clic en el botón "Aceptar" - por lo que el terminal se conectará a la última cuenta de comercio que fue autenticado:

Conectarse a una cuenta comercial

//+------------------------------------------------------------------+
//|                                                    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 todo funciona, limpiaré el código y lo publicaré en KodoBase.

Archivos adjuntos:
ClickMenu.mq5  5 kb
 

MQL4. La descripción de StringToCharArray() dice "Copia simbólicamente una cadena convertida de unicode a ansi en una ubicación especificada de un array de tipo uchar". Tengo la impresión de que hay un error en la descripción. Con esta función, puede convertir simplemente un carácter en un número correspondiente al código según la codificación de los caracteres (la función tiene 5 parámetros). Es decir, aquí no hay conversión "... de unicode a ansi...". Corrígeme si me equivoco.

Si necesito encontrar un código, por ejemplo, para el símbolo € para Ansi, entonces en lugar del 5º parámetro escribiré CP_ACP. Si como UTF7, entonces CP_UTF7. Si es para Unicode, uso StringToShortArray() (ver 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 error en el compilador.

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);  }

Sin embargo, si se elimina la función F2, se compila normalmente.

 

Error del compilador.

class A {  };


void Func(A* const&)   {   }


void OnStart()
  {    
    A* const a= NULL;
    
    Func(a);  // 'a' - cannot convert from const pointer to nonconst pointer
  }
Razón de la queja: