Wie kann das Skript programmatisch alle Instrumente durchgehen, die im Fenster Market Watch ausgewählt sind? - Seite 3

 
getch:

Es gibt keine Perversion im Drehbuch. Es ist ein bisschen unkonventionell, das ist alles.

Natürlich gibt es keine Perversion im Drehbuch selbst - ich habe es nicht ganz richtig ausgedrückt. Die Perversion liegt in der Art des Zugriffs auf die Liste. Sie sollten jedoch zustimmen, dass der Zugriff auf die Liste der Werkzeuge über das Terminal und nicht über Fenster erfolgen sollte. Und das Skript ist sehr nützlich, vor allem für Programmieranfänger wie mich, die keine Erfahrung im Umgang mit Windows haben. Nochmals vielen Dank, es enthält eine Menge nützlicher Lösungen, für die ich allein viel Zeit gebraucht hätte, um sie zu lernen.
 

Warum musstest du so eine Perversion erfinden... Es ist einfacher, eine externe DLL zu schreiben, in der die benötigten Daten aus dem MarketWatch-Objekt gezogen werden. Mit MQL4 ist dies nicht möglich, da die Speicherzuweisung erforderlich ist.

 
In MQL4 ist es realistisch (getestet), diese Daten zu ziehen, ohne eine DLL zu schreiben. Der obige Ansatz ist jedoch viel universeller. Weil man einfach und bequem eine Menge Daten in die Funktion WriteSymbol() packen kann...
 
 
Ihr Video funktioniert nicht...
Obwohl im Prinzip schon klar ist, wie das Drehbuch funktionieren wird. Aber das ist eindeutig eine unzuverlässige Lösung, die wahrscheinlich zu häufigen Abstürzen des Terminals führen wird. Es hängt auch so schon oft genug...

getch:
In MQL4 können Sie (versucht) diese Daten zu erhalten, ohne eine DLL zu schreiben. Der obige Ansatz ist jedoch viel universeller. Sie können einfach und bequem eine Menge Daten in die Funktion WriteSymbol() schieben...

Ich frage mich: Wie kann das herausgezogen werden? Mit welchen Befehlen? Wenn so etwas wirklich möglich ist, wäre es sehr willkommen... Obwohl ich ernsthaft bezweifle, dass das möglich ist...


Ich habe selbst Daten von Market Watch abgerufen, allerdings nur in C++. Dazu legen Sie zunächst einen neuen Prozess an (OpenProcess), reservieren in ihm Speicher (VirtualAllocEx), platzieren dort die gewünschte Datenstruktur und speichern dort die notwendigen Informationen aus dem Objekt. Und dann lesen wir die notwendigen Daten von dort ab. Aber man kann die Informationen nicht nur über eine Nachricht erhalten, ich habe es versucht. Das Objekt ist vom Typ ListView.

 

Aus mir unbekannten Gründen kann das Forum das Video nicht korrekt anzeigen. Deshalb habe ich es als ZIP-Archiv angehängt.


Ich habe keine Unzuverlässigkeit oder Funktionsunfähigkeit dieses Skripts feststellen können.

Dateien:
symbols.zip  1630 kb
 

Einfachere (nur eine globale Variable) und zuverlässigere (keine Hash-Funktion) Version des Skripts:

// Запись в файл названий и торговых условий всех символов из окна "Market Watch"
// Во время работы скрипта желательно не производить никаких действий в терминале

#include <WinUser32.mqh>

extern string FileName = "Symbols.txt";  // Имя файла для записи информации по символам
extern int Pause = 200; // Техническая пауза в миллисекундах

#import "user32.dll"
  int GetParent( int hWnd );
  int GetDlgItem( int hDlg, int nIDDlgItem );
#import

#define VK_HOME 0x24
#define VK_DOWN 0x28

#define LVM_GETITEMCOUNT 0x1004

// Названия используемых глобальных переменных
#define VAR_HANDLE "Symbol_Handle"

// Возвращает хэндл основного окна терминала
int Parent()
{
  int hwnd = WindowHandle(Symbol(), Period());
  int hwnd_parent = 0;

  while (!IsStopped())
  {
    hwnd = GetParent(hwnd);
     
    if (hwnd == 0)
      break;
       
    hwnd_parent = hwnd;
  }
   
  return(hwnd_parent);
}

// Открывает окно графика символа, расположенного в строке номер Num окна "Market Watch"
void OpenChart( int Num )
{
  int hwnd = Parent();
   
  if (hwnd != 0)  // нашли главное окно
  {
    hwnd = GetDlgItem(hwnd, 0xE81C); // нашли "Market Watch"
    hwnd = GetDlgItem(hwnd, 0x50);
    hwnd = GetDlgItem(hwnd, 0x8A71);
   
    PostMessageA(hwnd, WM_KEYDOWN, VK_HOME,0); // верхняя строчка окна "Market Watch"
     
    while (Num > 1)  
    {
      PostMessageA(hwnd, WM_KEYDOWN,VK_DOWN, 0); // сместились на нужную строчку
      Num--;
    }
  }

  PostMessageA(Parent(), WM_COMMAND, 33160, 0); // открыли график

  return;
}

// Закрывает окно графика
void CloseChart( int hwnd )
{
  PostMessageA(GetParent(hwnd), WM_CLOSE, 0, 0);
  
  return;
}

// Запускает выбранный в окне "Navigator" скрипт (индикатор или советник) 
void RunScript()
{
  PostMessageA(Parent(), WM_COMMAND, 33042, 0); // исполнить скрипт на текущем графике
  
  return;
}

// Возвращает количество символов в окне "Market Watch"
int SymbolCount()
{
  int hwnd = Parent();
  int Count = 0;    

  if (hwnd != 0)  // нашли главное окно
  {
    hwnd = GetDlgItem(hwnd, 0xE81C); // Нашли список символов
    hwnd = GetDlgItem(hwnd, 0x50);
    hwnd = GetDlgItem(hwnd, 0x8A71);
   
    Count = SendMessageA(hwnd, LVM_GETITEMCOUNT, 0, 0); // получили количество элементов списка
  }
   
  return(Count);
}

// Записывает характеристика текущего торгового символа в файл
void WriteSymbol()
{
  int handle;
  string Str;
  
  
  Str = "\n" + Symbol() + ":";
  Str = Str + "\n  Spread = " + DoubleToStr(MarketInfo(Symbol(), MODE_SPREAD), 0);
  Str = Str + "\n  StopLevel = " + DoubleToStr(MarketInfo(Symbol(), MODE_STOPLEVEL), 0);
  Str = Str + "\n  Digits = " + DoubleToStr(MarketInfo(Symbol(), MODE_DIGITS), 0);
  Str = Str + "\n  Price(Example) = " + DoubleToStr(Bid, Digits);

  handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
  FileSeek(handle, 0, SEEK_END);

  FileWrite(handle, Str);
  FileClose(handle);
  return;
}

void start()
{
  int handle, Count, i = 1;
  
  if (GlobalVariableCheck(VAR_HANDLE))  // Запустили не первый раз...
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));
    WriteSymbol();
  }
  else  // запустили первый раз
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));

    handle = FileOpen(FileName, FILE_WRITE); // обнулили файл с данными
    FileClose(handle);
    
    Count = SymbolCount();

    while(!IsStopped())
    {
      if (i > Count)
        break;
      
      OpenChart(i); // открыли график очередного символа из окна "Market Watch"
      Sleep(Pause);
      
      RunScript(); // запустили на только что открытом графике текущий скрипт
      Sleep(Pause);
      
      CloseChart(GlobalVariableGet(VAR_HANDLE)); // закрыли окно графика
      Sleep(Pause);

      i++;
    } 
    
    GlobalVariableDel(VAR_HANDLE);
    
    // записали в файл количество символов в окне "Market Watch"
    handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
    FileSeek(handle, 0, SEEK_END);

    FileWrite(handle, "\nAMOUNT OF SYMBOLS = " + Count);
    FileClose(handle);
  }
  
  return;
}
 
getch:

// Открывает окно графика символа, расположенного в строке номер Num окна "Market Watch"
void OpenChart( int Num )

Welchen Befehl kann ich verwenden, um ein Symbol auf ein bereits geöffnetes Diagramm"zurückzusetzen", d. h. das aktuelle Diagramm auf das gewünschte Symbol umzustellen?

 

Hier machte ZG_All Quotings 1-80924!!!

Danke getch für die tolle Idee und den Gedankenflug!!!

Ich würde gerne den Namen des Helden wissen :-)

Dieses Skript ist der letzte Weg, um Angebote von einem Makler zu erhalten.

Ein noch schwierigerer Weg ist der persönliche Besuch bei Ihrem Makler mit speziellen Werkzeugen, um Angebote einzuholen.

 
Mit Bügeleisen, ja?