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

 
KimIV:
VBAG:
Ich habe dieses Problem vor kurzem für mich gelöst.
Das funktioniert nicht, wenn die DCs dem Namen des Paares etwas Eigenes hinzufügen. Zum Beispiel "m", "!", "." oder "_".
Ja, natürlich, ich habe es in der Forschung Zwecke, aber wenn Sie etwas Radikales tun wollen - zu stumpfen und suchen Sie die Anzahl der Kombinationen aller Zeichen ASCII, sagen wir, die maximale angemessene Anzahl von Zeichen in den Namen des Instruments (8-10). Die Ausführung eines solchen Skripts wird wahrscheinlich einige Stunden dauern, aber sie erfolgt automatisch und garantiert.


an Zhunko.
-Ich erinnere mich, natürlich habe ich die Idee von Ihrem Code. Ich habe ein paar Tage lang mit Ihrem Lader gearbeitet - das macht Spaß! Danke.
 
KimIV:
VBAG:

Ich habe dieses Problem vor kurzem für mich gelöst.
Das funktioniert nicht, wenn die DCs dem Namen des Paares etwas Eigenes hinzufügen. Zum Beispiel "m", "!", "." oder "_".
Es gibt nur wenige solcher FZ und die Zahl der von ihnen verwendeten Zeichen ist gering. Es ist möglich, dies vorherzusehen.
Das habe ich mit den Moneiraine-Paaren gemacht. Das ist der Ort, an dem "mini" und "pro" stehen.
Ich glaube, in Lite ist auch ein bisschen Scheiße drin.
D.h. Sie können die Instrumente nach DTs in Gruppen einteilen.
Ich habe mich nur für die folgenden Brokerfirmen interessiert: Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
Dies sind Maklerunternehmen mit der größten Anzahl von Instrumenten. Und sie waren notwendig, um Kurse für die Berechnung von Währungsindizes zu stellen.
Das Skript "ZZ_All Quotings 0-0080" ist für sie gedacht.
 
// Запись в файл названий и торговых условий всех символов из окна "Market Watch"
// Во время работы скрипта желательно не производить никаких действий в терминале
// NB: Используемая Хэш-функция не является корректной для данной задачи 
 
#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 VAR_HASH "Symbol_Hash"
#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;
}
 
// Хэш-функция перевода строки в целое число
// NB: данная функция не совершенна (приводит к коллизиям)
int Hash( string Str )
{
  int HashRes = 0;
  int i; 
  
  i = StringLen(Str) - 1;
  
  while (i >= 0)
  {  
    HashRes += StringGetChar(Str, i);
    i--;
  }
 
  HashRes %= 101;
  
  return(HashRes);
}
 
// Запускает выбранный в окне "Navigator" скрипт (индикатор или советник) 
void RunScript()
{
  PostMessageA(Parent(), WM_COMMAND, 33042, 0); // исполнить скрипт на текущем графике
  
  return;
}
 
// Записывает характеристика текущего торгового символа в файл
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, i = 1;
  
  if (GlobalVariableCheck(VAR_HASH))  // Запустили не первый раз...
  {
    GlobalVariableSet(VAR_HANDLE, WindowHandle(Symbol(), Period()));
 
    if (GlobalVariableGet(VAR_HASH) != Hash(Symbol())) // проверка достижения конца списка символов окна "Market Watch"
    {  
      GlobalVariableSet(VAR_HASH, Hash(Symbol()));
      WriteSymbol();
    }
    else
      GlobalVariableDel(VAR_HASH);
  }
  else  // запустили первый раз
  {
    GlobalVariableSet(VAR_HASH, -1);
    
    handle = FileOpen(FileName, FILE_WRITE); // обнулили файл с данными
    FileClose(handle);
 
    while(!IsStopped())
    {
      OpenChart(i); // открыли график очередного символа из окна "Market Watch"
      Sleep(Pause);
      
      RunScript(); // запустили на только что открытом графике текущий скрипт
      Sleep(Pause);
      
      CloseChart(GlobalVariableGet(VAR_HANDLE)); // закрыли окно графика
      Sleep(Pause);
      
      if (!GlobalVariableCheck(VAR_HASH)) // Достигнут ли конец списка символов окна "Market Watch"?
        break;
        
      i++;
    }
    
    GlobalVariableDel(VAR_HANDLE);
    i--;
    
    // записали в файл количество символов в окне "Market Watch"
    handle = FileOpen(FileName, FILE_READ|FILE_WRITE);
    FileSeek(handle, 0, SEEK_END);
 
    FileWrite(handle, "AMOUNT OF SYMBOLS = " + i);
    FileClose(handle);
  }
  
 
  return;
}
 
Es ist ein lustiges Spielzeug, aber es funktioniert nicht richtig. Ich bin beim letzten Werkzeug hängen geblieben. Der Versuch, ihn zu stoppen, führte zu einem MT4-Fehler.
Lassen Sie die Fenster der einzelnen Instrumente mit jeder TF öffnen.
Das ist die Art von Verfahren, die am Anfang noch fehlt:
#property show_inputs
 
Wow! Das ist großartig!
Danke! (Lacht)
 
Oh, ich werde es ausprobieren.
 
Zhunko:
Es ist ein lustiges Spielzeug, aber es funktioniert nicht richtig. Ich bin beim letzten Werkzeug hängen geblieben. Der Versuch, ihn zu stoppen, führte zu einem MT4-Fehler.
Lassen Sie die Fenster der einzelnen Instrumente mit jeder TF öffnen.
Das ist das Verfahren, das am Anfang fehlt:
#property show_inputs


Machen Sie es
extern int Pause = 1000; // Техническая пауза в миллисекундах

Wenn dies einen Fehler verursacht hat, löschen Sie die folgenden globalen Variablen vor der Ausführung erneut (F3):

"Symbol_Hash"
"Symbol_Handle"
NB: Das Skript ist nur eine Demonstration der Idee einer möglichen Lösung für das vorliegende Problem.
 
getch:

NB: Das Skript ist nur eine Demonstration der Idee einer möglichen Lösung für die gestellte Aufgabe.

Die Programmiererfahrung demonstriert auf wunderbare Weise sowohl den Einfallsreichtum des menschlichen Geistes als auch die mangelnde Funktionalität des Tools... hurra und leider...
 
Shu:

Fehlende Funktionalität des Tools... hurra und leider...
Hoffen wir, dass wir in MQL5 nicht gezwungen sein werden, solche Verzerrungen vorzunehmen.

P.S. Andererseits: Der Prozess ist wichtig!
 

Es gibt keine Perversion im Drehbuch. Es ist ein etwas unkonventioneller Ansatz, das ist alles.

Idee: Das Skript öffnet die Chart-Fenster der einzelnen Handelsinstrumente aus dem "Market Watch"-Fenster, führt sie selbst aus und schließt das Fenster. Es regelt sich selbst mit Hilfe von globalen Variablen, die es selbst erstellt (und am Ende des Betriebs wieder löscht). Das ist alles.


Das Skript wird in 99 % der Fälle funktionieren, wenn die folgenden Bedingungen erfüllt sind:

- Die DLL kann ohne manuelle Bestätigung verwendet werden;

- Der Wert der Variable Pause wird größer als 1000 gesetzt (technische Pause, hängt von der Leistung des Computers und der Internetverbindung ab. Je besser diese Eigenschaften sind, desto weniger können Sie den Pausenwert einstellen bzw. die Laufzeit des Skripts reduzieren);

- löschen Sie die globalen Variablen(F3) "Symbol_Hash" und "Symbol_Handle", bevor Sie das Skript ausführen (dies kann der Fall sein, wenn das Skript zuvor nicht ausgeführt werden konnte).


Nach Beendigung des Skripts sieht das Terminal wieder so aus wie vor dem Start des Skripts. Alle Symboldaten befinden sich in der Datei Symbols.txt.