Errores, fallos, preguntas - página 2522

 

Pido ayuda sobre WinAPI. Necesito poder hacer estas dos acciones en MT5.

Llame al menú que se muestra y seleccione para guardar el informe.


Llame al menú que se muestra y seleccione cargar un archivo de configuración.


En MT4 este tipo de cosas es muy fácil. En MT5 no lo es.

Es decir, basta con abrir el menú y seleccionar la opción adecuada. Pero no puede hacerlo.


Suena como debería ser.

 

Si graba un registro de mensajes para llamar al menú contextual de la tarea 2, puede obtener el siguiente resultado:


Intenta llamar a este menú de forma programada a través deSendMessage WinApi.

 
Sergey Dzyublik:

Si escribe un registro de mensajes para llamar al menú contextual de la tarea 2, puede obtener el siguiente resultado:

Intenta llamar a este menú de forma programada a través deSendMessage WinApi.

No tiene éxito.

#include <WinAPI\winuser.mqh>

#define  GA_ROOT           0x00000002

#define  GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {}; // Пробовал углубляться по дереву окон - не помогает.
  GET_HANDLE
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}
 
fxsaber:

No funcionó

Probablemente estés usando el mango equivocado.
Los gráficos están implementados dentro del objeto MDIClient, tienes que subir a la ventana raíz de terminal.exe y luego bajar por las ventanas hasta la resaltada "SysListView32" y usar su handle.
Puede haber una manera más fácil, inténtalo...


 
Sergey Dzyublik:

Lo más probable es que estés usando el mango equivocado.
Los gráficos están implementados dentro del objeto MDIClient, tienes que subir a la ventana raíz de terminal.exe y luego bajar por las ventanas hasta la resaltada "SysListView32" y usar su handle.
Puede haber una forma más fácil, pruébala...

Llegó a la manija, no ayudó.

#include <WinAPI\winuser.mqh>

#define  GA_ROOT           0x00000002

#define  GET_HANDLE                                                                       \
  long Handle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT); \
                                                                                         \
  for (int i = 0; i < sizeof(ControlID) / sizeof(int); i++)                              \
    Handle = user32::GetDlgItem(Handle, ControlID[i]);

void OnStart()
{
  static const int ControlID[] = {0xE81E, 0x804E, 0x28EF, 0x28FE};
  GET_HANDLE
  
  Print(Handle); // Распечатал хендл.
  
  user32::SendMessageW(Handle, 0x10C1, 0, 0);
}


Probablemente un mensaje diferente.

 

Una cuestión que me atormenta desde hace tiempo es cómo motivar correctamente el proceso de pensamiento

si (valor[0] > valor[1]

o viceversa

¿primero el cero y luego el siguiente?

 

Hola, ¿pueden decirme por qué mi terminal se comporta así enVMware x64?

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Gudgeon, 2019.07.31 12:16

2019.07.31 08:20:46.595 Terminal MetaTrader 5 x64 build 2085 iniciado (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 Terminal Windows 10 (build 14393) en VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Memoria: 2728 / 4095 Mb, Disco: 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596 Terminal C:\NPROGI\MT-5


Parece que ocurre más a menudo cuando el terminal está cargado con objetos gráficos.

por ejemplo: oficios, eventos del calendario

Indicador tras una avería

Después de algún tiempo el indicador deja de funcionar correctamente:

- Gráfico M1;

- cualquier indicador (en la figura media móvil estándar);

- probado en tres máquinas.

Si cambias el periodo de programación, todo se pone en su sitio.

Para mí esto es crítico ya que uso señales de indicadores gráficos en mi EA.

 
Gudgeon:

Hola, ¿podríais decirme por qué el terminal se comporta así?


Después de algún tiempo el indicador deja de funcionar correctamente:

- Gráfico M1;

- Cualquier indicador (la Media Móvil estándar se muestra en la imagen);

- Lo he comprobado en tres máquinas.

Si cambias el periodo del gráfico, todo se pone en su sitio.

Para mí, es crítico, porque yo uso las señales de los indicadores gráficos en mi Asesor Experto.

Especifica los datos:

copie tres líneas de la pestaña "Log" (seleccione tres líneas -> haga clic con el botón derecho del ratón -> Copiar)


y pégalo en tu mensaje. Deberías conseguir algo como esto:

2019.07.31 11:53:10.681 MetaTrader 5 x64 build 2093 started (MetaQuotes Software Corp.)
2019.07.31 11:53:10.685 Windows 10 (build 18362) x64, IE 11, UAC, Intel Core i3-3120 M  @ 2.50 GHz, Memory: 3188 / 8077 Mb, Disk: 99 / 415 Gb, GMT+2
2019.07.31 11:53:10.685 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075
 

2019.07.31 08:20:46.595 Terminal MetaTrader 5 x64 build 2085 iniciado (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 Terminal Windows 10 (build 14393) en VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Memoria: 2728 / 4095 Mb, Disco: 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596 Terminal C:\NPROGI\MT-5


Parece que ocurre más a menudo cuando el terminal está cargado con objetos gráficos.

por ejemplo: operaciones, eventos del calendario y pequeños plazos
 
fxsaber:

Llegó a la manija, no ayudó.
Probablemente un mensaje diferente.

Lo tengo con WM_CONTEXTMENU.
Se ha modificado ligeramente el código, es más fácil de depurar y se puede reutilizar:

#include <WinAPI\winuser.mqh>

#define  GA_ROOT            0x00000002
#define  WM_CONTEXTMENU     0x007B


#define  PRINT(x) ; Print(#x, ":", string(x))
#define  PRINT64(x) ; printf("%s%s%#.08x", #x, ":", x)


long GetHandle(long handle, int &controls[]){
   long next_handle = handle;                                                                        
   for (int i = 0; i < ArraySize(controls); i++){
      next_handle = user32::GetDlgItem(next_handle, controls[i]);
      PRINT64(next_handle);
   }           
   return next_handle;                
}
  

void OnStart(){
  long RootHandle = user32::GetAncestor(::ChartGetInteger(0, CHART_WINDOW_HANDLE), GA_ROOT);
  PRINT64(RootHandle);  
  
  int controls[] = {0xE81E, 0x804E, 0x28EF, 0x28FE}; 
  long handle = GetHandle(RootHandle, controls);
  PRINT64(handle);
  
  
  //PRINT(user32::SendMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT(user32::PostMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT("Sleep");

  Sleep(10 * 1000);
}