Erros, bugs, perguntas - página 2522

 

Estou a pedir ajuda no WinAPI. Necessidade de poder realizar estas duas acções em MT5.

Chamar o menu apresentado e seleccionar para guardar o relatório.


Chamar o menu apresentado e seleccionar para carregar um ficheiro definido.


No MT4 este tipo de coisas é muito fácil. Em MT5 não é.

Isto é, só precisa de abrir o menu e seleccionar uma opção apropriada. Mas não pode fazer isso.


Parece que deveria ser.

 

Se gravar um registo de mensagens para chamar o menu de contexto para a tarefa 2, pode obter o seguinte resultado:


Tente chamar este menu programático através doSendMessage WinApi.

 
Sergey Dzyublik:

Se escrever um registo de mensagens para chamar o menu de contexto para a tarefa 2, pode obter o seguinte resultado:

Tente chamar este menu programático através doSendMessage WinApi.

Não teve sucesso.

#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:

Não funcionou

Provavelmente está a usar o cabo errado.
Os gráficos são implementados dentro do objecto MDIClient, é necessário subir à janela do terminal.exe raiz e depois descer através das janelas para o "SysListView32" destacado e usar o seu manípulo.
Pode haver uma maneira mais fácil, experimente...


 
Sergey Dzyublik:

Muito provavelmente está a usar o cabo errado.
Os gráficos são implementados dentro do objecto MDIClient, é necessário subir à janela do terminal.exe raiz e depois descer através das janelas para o "SysListView32" destacado e usar o seu manípulo.
Pode haver uma maneira mais fácil, experimente...

Chegou ao cabo, não ajudou.

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


Provavelmente, uma Mensagem diferente.

 

Uma questão que há muito me atormenta é como motivar correctamente o processo de pensamento

se (valor[0] > valor[1]

ou vice versa

primeiro o zero e depois o seguinte?

 

Olá, pode dizer-me porque é que o meu terminal se comporta assim noVMware x64?

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Insectos, insectos, perguntas

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) sobre VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Memória: 2728 / 4095 Mb, Disco: 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596 Terminal C:\PROGI\MT-5


Parece que acontece mais frequentemente quando o terminal é carregado com objectos gráficos.

e.g.: comércios, eventos de calendário

Indicador após um mau funcionamento

Passado algum tempo, o indicador deixa de funcionar correctamente:

- Gráfico M1;

- qualquer indicador (na figura padrão Média Móvel);

- testado em três máquinas.

Se alterar o período de programação, tudo se encaixa no seu lugar.

Para mim, isto é crítico, pois utilizo sinais de indicadores gráficos na minha EA.

 
Gudgeon:

Olá, pode dizer-me por favor porque é que o terminal se comporta desta maneira?


Passado algum tempo, o indicador deixa de funcionar correctamente:

- Gráfico M1;

- Qualquer indicador (a média móvel padrão é mostrada na imagem);

- Verifiquei-o em três máquinas.

Se se alterar o período do gráfico, tudo se encaixa.

Para mim, é crítico, porque utilizo sinais dos indicadores do gráfico no meu Expert Advisor.

Especificar os dados:

copiar três linhas do separador "Log" (seleccionar três linhas -> clique com o botão direito do rato -> Copiar)


e cole-o na sua mensagem. Deve ter este aspecto:

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) sobre VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Memória: 2728 / 4095 Mb, Disco: 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596 Terminal C:\PROGI\MT-5


Parece acontecer com mais frequência quando o terminal é carregado com objectos gráficos.

por exemplo: comércios, eventos de calendário e pequenos períodos de tempo
 
fxsaber:

Chegou ao cabo, não ajudou.
Provavelmente, uma Mensagem diferente.

Consegui-o com WM_CONTEXTMENU.
Ligeiramente afinado o código, é mais fácil de depurar e pode ser reutilizado:

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