Erreurs, bugs, questions - page 2522

 

Si vous enregistrez un Message log pour appeler le menu contextuel de la tâche 2, vous pouvez obtenir le résultat suivant :


Essayez d'appeler ce menu de manière programmatique viaSendMessage WinApi.

 
Sergey Dzyublik:

Si vous écrivez un Message log pour appeler le menu contextuel de la tâche 2, vous pouvez obtenir le résultat suivant :

Essayez d'appeler ce menu de manière programmatique viaSendMessage WinApi.

Ça n'a pas marché.

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

Ça n'a pas marché.

Vous utilisez probablement la mauvaise poignée.
Les graphiques sont implémentés dans l'objet MDIClient, vous devez accéder à la fenêtre racine de terminal.exe, puis descendre dans les fenêtres jusqu'à la fenêtre "SysListView32" en surbrillance et utiliser son handle.
Il y a peut-être un moyen plus simple, essayez-le...


 
Sergey Dzyublik:

Il est probable que vous utilisiez la mauvaise poignée.
Les graphiques sont implémentés dans l'objet MDIClient, vous devez accéder à la fenêtre racine de terminal.exe, puis descendre dans les fenêtres jusqu'à la fenêtre "SysListView32" en surbrillance et utiliser son handle.
Il y a peut-être un moyen plus simple, essayez-le...

Je suis allé à la poignée, ça n'a pas aidé.

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


Probablement un message différent.

 

Une question qui me préoccupe depuis longtemps est de savoir comment motiver correctement le processus de réflexion.

si (valeur[0] > valeur[1]

ou vice versa

le premier zéro, puis le suivant ?

 

Bonjour, pouvez-vous me dire pourquoi mon terminal se comporte ainsi surVMware x64?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading

Bugs, bugs, questions

Gudgeon, 2019.07.31 12:16

2019.07.31 08:20:46.595 Terminal MetaTrader 5 x64 build 2085 démarré (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 Terminal Windows 10 (build 14393) sur VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Mémoire : 2728 / 4095 Mb, Disque : 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596 Terminal C:\PROGI\MT-5


Il semble que cela se produise plus souvent lorsque le terminal est chargé d'objets graphiques.

par exemple : métiers, événements du calendrier

Indicateur après un dysfonctionnement

Après un certain temps, l'indicateur cesse de fonctionner correctement :

- Graphique M1 ;

- n'importe quel indicateur (dans la figure standard Moving Average) ;

- testé sur trois machines.

Si vous changez la période du calendrier, tout se met en place.

Pour moi, c'est essentiel car j'utilise des signaux provenant d'indicateurs graphiques dans mon EA.

 
Gudgeon:

Bonjour, pourriez-vous me dire pourquoi le terminal se comporte de cette façon ?


Après un certain temps, l'indicateur cesse de fonctionner correctement :

- Graphique M1 ;

- N'importe quel indicateur (la moyenne mobile standard est représentée sur l'image) ;

- Je l'ai vérifié sur trois machines.

Si vous changez la période du graphique, tout se met en place.

Pour moi, c'est essentiel, car j'utilise les signaux des indicateurs graphiques dans mon conseiller expert.

Spécifiez les données :

copier trois lignes de l'onglet "Log" (sélectionner trois lignes -> clic droit de la souris -> Copier)


et le coller dans votre message. Il devrait ressembler à ceci :

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 démarré (MetaQuotes Software Corp.)
2019.07.31 08:20:46.596 Terminal Windows 10 (build 14393) sur VMware x64, IE 11, UAC, Intel Core i5-3450 @ 3.10GHz, Mémoire : 2728 / 4095 Mb, Disque : 69 / 99 Gb, GMT+3
2019.07.31 08:20:46.596 Terminal C:\PROGI\MT-5


Cela semble se produire plus souvent lorsque le terminal est chargé d'objets graphiques.

par exemple : les transactions, les événements du calendrier et les petites échéances.
 
fxsaber:

Je suis allé à la poignée, ça n'a pas aidé.
Probablement un message différent.

Je l'ai obtenu avec WM_CONTEXTMENU.
J'ai légèrement modifié le code, il est plus facile à déboguer et peut être réutilisé :

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

Cela a fonctionné avec WM_CONTEXTMENU.
J'ai légèrement modifié le code, il est plus facile à déboguer et peut être réutilisé :

Merci, le menu apparaît !

Vous ne savez pas comment sélectionner un élément du menu. J'ai essayé WM_ENTERIDLE et MN_GETHMENU, sans succès.

La sélection d'un certain élément de menu n'est-elle pas elle-même une commande interne de MT5 ?


ZZY Cette option n'a pas fonctionné.

  const long hwnd = GetMenu(handle);
  PRINT64(hwnd);
  PRINT64(user32::SendMessageW(hwnd, WM_KEYDOWN, VK_DOWN, 0));