Errori, bug, domande - pagina 2522

 

Sto chiedendo aiuto su WinAPI. Ho bisogno di essere in grado di fare queste due azioni in MT5.

Chiamate il menu mostrato e selezionate per salvare il rapporto.


Chiamate il menu mostrato e selezionate per caricare un file impostato.


In MT4 questo genere di cose è molto facile. In MT5 non lo è.

Cioè devi solo aprire il menu e selezionare un'opzione appropriata. Ma non può farlo.


Sembra che dovrebbe essere così.

 

Se registrate un Message log per chiamare il menu contestuale del compito 2, potete ottenere il seguente risultato:


Provate a chiamare questo menu programmaticamente tramiteSendMessage WinApi.

 
Sergey Dzyublik:

Se scrivete un Message log per chiamare il menu contestuale del compito 2, potete ottenere il seguente risultato:

Provate a chiamare questo menu programmaticamente tramiteSendMessage WinApi.

Non ha avuto successo.

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

Non ha funzionato

Probabilmente stai usando l'impugnatura sbagliata.
I grafici sono implementati all'interno dell'oggetto MDIClient, è necessario salire alla finestra principale di terminal.exe e poi scendere attraverso le finestre fino alla "SysListView32" evidenziata e utilizzare il suo handle.
Potrebbe esserci un modo più semplice, provalo...


 
Sergey Dzyublik:

Molto probabilmente stai usando la maniglia sbagliata.
I grafici sono implementati all'interno dell'oggetto MDIClient, è necessario salire alla finestra principale di terminal.exe e poi scendere attraverso le finestre fino alla "SysListView32" evidenziata e utilizzare il suo handle.
Forse c'è un modo più semplice, provalo...

Arrivato alla maniglia, non ha aiutato.

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


Probabilmente un messaggio diverso.

 

Una domanda che mi ha tormentato a lungo è come motivare correttamente il processo di pensiero

se (valore[0] > valore[1]

o viceversa

prima lo zero e poi il successivo?

 

Ciao, puoi dirmi perché il mio terminale si comporta così suVMware x64?

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

Gudgeon, 2019.07.31 12:16

2019.07.31 08:20:46.595 Terminale MetaTrader 5 x64 build 2085 avviato (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 Terminale Windows 10 (build 14393) su 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 Terminale C:\PROGI\MT-5


Sembra che accada più spesso quando il terminale è caricato con oggetti grafici.

ad esempio: compravendite, eventi del calendario

Indicatore dopo un malfunzionamento

Dopo qualche tempo l'indicatore smette di funzionare correttamente:

- Grafico M1;

- qualsiasi indicatore (nella figura media mobile standard);

- testato su tre macchine.

Se si cambia il periodo di programmazione, tutto va a posto.

Per me questo è fondamentale perché uso i segnali degli indicatori grafici nel mio EA.

 
Gudgeon:

Ciao, potresti dirmi perché il terminale si comporta così?


Dopo qualche tempo l'indicatore smette di funzionare correttamente:

- Grafico M1;

- Qualsiasi indicatore (la media mobile standard è mostrata nell'immagine);

- L'ho controllato su tre macchine.

Se si cambia il periodo del grafico, tutto va a posto.

Per me è fondamentale, perché uso i segnali degli indicatori grafici nel mio Expert Advisor.

Specificare i dati:

copiare tre righe dalla scheda "Log" (selezionare tre righe -> clic destro del mouse -> Copia)


e incollarlo nel tuo messaggio. Dovrebbe apparire così:

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 Terminale MetaTrader 5 x64 build 2085 avviato (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 Terminale Windows 10 (build 14393) su 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 Terminale C:\PROGI\MT-5


Sembra accadere più spesso quando il terminale è caricato con oggetti grafici.

per esempio: compravendite, eventi del calendario e piccoli timeframe
 
fxsaber:

Arrivato alla maniglia, non ha aiutato.
Probabilmente un messaggio diverso.

Ottenuto con WM_CONTEXTMENU.
Il codice è stato leggermente modificato, è più facile da debuggare e può essere riutilizzato:

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