Fehler, Irrtümer, Fragen - Seite 2522

 

Ich bitte um Hilfe zu WinAPI. Ich muss in der Lage sein, diese beiden Aktionen im MT5 durchzuführen.

Rufen Sie das angezeigte Menü auf und wählen Sie, um den Bericht zu speichern.


Rufen Sie das angezeigte Menü auf und wählen Sie, um eine eingestellte Datei zu laden.


In MT4 ist so etwas sehr einfach. Im MT5 ist das nicht der Fall.

D.h. Sie müssen nur das Menü öffnen und eine entsprechende Option auswählen. Aber das kann sie nicht.


Klingt wie es sein sollte.

 

Wenn Sie ein Nachrichtenprotokoll aufzeichnen, um das Kontextmenü für Aufgabe 2 aufzurufen, können Sie folgendes Ergebnis erhalten:


Versuchen Sie, dieses Menü programmatisch überSendMessage WinApi aufzurufen.

 
Sergey Dzyublik:

Wenn Sie ein Meldungsprotokoll schreiben, um das Kontextmenü für Aufgabe 2 aufzurufen, erhalten Sie das folgende Ergebnis:

Versuchen Sie, dieses Menü programmatisch überSendMessage WinApi aufzurufen.

Nicht erfolgreich.

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

Es hat nicht geklappt

Sie benutzen wahrscheinlich den falschen Griff.
Die Diagramme sind im MDIClient-Objekt implementiert. Sie müssen zum Stammfenster von terminal.exe gehen und dann durch die Fenster zum markierten "SysListView32" gehen und dessen Handle verwenden.
Vielleicht gibt es einen einfacheren Weg, versuchen Sie es...


 
Sergey Dzyublik:

Wahrscheinlich verwenden Sie den falschen Griff.
Die Diagramme sind im MDIClient-Objekt implementiert. Sie müssen zum Stammfenster von terminal.exe gehen und dann durch die Fenster zum markierten "SysListView32" gehen und dessen Handle verwenden.
Vielleicht gibt es einen einfacheren Weg, probieren Sie es aus...

Der Handgriff hat nicht geholfen.

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


Wahrscheinlich eine andere Botschaft.

 

Eine Frage, die mich schon lange beschäftigt, ist, wie man den Denkprozess richtig motivieren kann

wenn (Wert[0] > Wert[1]

oder andersherum

erst die Null und dann die nächste?

 

Hallo, können Sie mir sagen, warum mein Terminal verhält sich wie diese aufVMware x64?

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Gudgeon, 2019.07.31 12:16

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


Es scheint häufiger zu passieren, wenn das Terminal mit Diagrammobjekten geladen ist.

z.B.: Berufe, Kalenderereignisse

Anzeiger nach einer Störung

Nach einiger Zeit funktioniert der Indikator nicht mehr richtig:

- M1-Diagramm;

- ein beliebiger Indikator (in der Abbildung Standard Gleitender Durchschnitt);

- auf drei Rechnern getestet.

Wenn Sie den Zeitplan ändern, passt sich alles an.

Für mich ist dies entscheidend, da ich in meinem EA Signale von Chart-Indikatoren verwende.

 
Gudgeon:

Hallo, könnten Sie mir bitte sagen, warum sich das Terminal so verhält?


Nach einiger Zeit funktioniert der Indikator nicht mehr richtig:

- M1-Diagramm;

- Ein beliebiger Indikator (der gleitende Standarddurchschnitt ist in der Abbildung dargestellt);

- Ich habe es auf drei Rechnern überprüft.

Wenn Sie die Periode des Diagramms ändern, passt alles zusammen.

Für mich ist das entscheidend, denn ich verwende Signale von den Chart-Indikatoren in meinem Expert Advisor.

Geben Sie die Daten an:

drei Zeilen aus der Registerkarte "Log" kopieren (drei Zeilen markieren -> rechte Maustaste -> Kopieren)


und fügen Sie es in Ihre Nachricht ein. Sie sollte folgendermaßen aussehen:

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


Es scheint häufiger zu passieren, wenn das Terminal mit grafischen Objekten geladen ist.

zum Beispiel: Geschäfte, Kalenderereignisse und kleine Zeitrahmen
 
fxsaber:

Der Handgriff hat nicht geholfen.
Wahrscheinlich eine andere Botschaft.

Ich habe es mit WM_CONTEXTMENU.
Ich habe den Code leicht verändert, so dass er leichter zu debuggen ist und wiederverwendet werden kann:

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