Comment le script peut-il parcourir de manière programmatique tous les instruments sélectionnés dans la fenêtre Market Watch ? - page 2

 
KimIV:
VBAG:
J'ai récemment résolu ce problème pour moi-même.
Cela ne fonctionne pas lorsque les DC ajoutent quelque chose de leur cru au nom de la paire. Par exemple, "m", " !", "." ou "_".
Oui, bien sûr, je l'ai fait à des fins de recherche, mais si vous voulez faire quelque chose de radical - faire une souche et rechercher le nombre de combinaisons de tous les caractères ASCII, disons, le nombre maximum raisonnable de caractères dans le nom de l'instrument (8-10). L'exécution d'un tel script prendra probablement quelques heures, mais elle est automatique et garantie.


à Zhunko.
-Je me souviens, bien sûr j'ai eu l'idée de votre code. J'ai travaillé avec votre chargeur pendant quelques jours - c'est amusant ! Merci.
 
KimIV:
VBAG:

J'ai récemment résolu ce problème pour moi-même.
Cela ne fonctionne pas lorsque les DC ajoutent quelque chose de leur cru au nom de la paire. Par exemple, "m", " !", "." ou "_".
Ces FC sont peu nombreux et le nombre de caractères qu'ils utilisent est faible. Il est possible de prévoir.
C'est ce que j'ai fait avec les paires de Moneiraine. C'est là que se trouvent les "mini" et les "pro".
Je pense qu'il y a aussi de la merde dans Lite.
C'est-à-dire que vous pouvez diviser les instruments en groupes par DTs.
Je ne me suis intéressé qu'aux sociétés de courtage suivantes : Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
Ce sont les sociétés de courtage qui proposent le plus grand nombre d'instruments. Et ils étaient nécessaires pour donner des cotations pour le calcul des indices monétaires.
Le script "ZZ_All Quotings 0-0080" est conçu pour eux.
 
// Запись в файл названий и торговых условий всех символов из окна "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;
}
 
C'est un jouet amusant, mais il ne fonctionne pas correctement. Je suis resté bloqué sur le dernier outil. Tenter de l'arrêter a provoqué une erreur MT4.
Laissez-le ouvrir les fenêtres de chaque instrument avec chaque TF.
C'est le genre de procédure qui fait défaut au début :
#property show_inputs
 
Wow ! C'est génial !
Merci ! (Rires)
 
Oh, je vais essayer.
 
Zhunko:
C'est un jouet amusant, mais il ne fonctionne pas correctement. Je suis resté bloqué sur le dernier outil. Tenter de l'arrêter a provoqué une erreur MT4.
Laissez-le ouvrir les fenêtres de chaque instrument avec chaque TF.
Voici la procédure manquante au début :
#property show_inputs


Faites-le.
extern int Pause = 1000; // Техническая пауза в миллисекундах

Si cela a provoqué une erreur, supprimez à nouveau les variables globales suivantes avant de les exécuter (F3) :

"Symbol_Hash"
"Symbol_Handle"
NB : Le scénario n'est qu'une démonstration de l'idée d'une solution possible au problème posé.
 
getch:

NB : Le scénario n'est qu'une démonstration de l'idée d'une solution possible à la tâche à accomplir.

L'expérience de programmation démontre magnifiquement à la fois l'ingéniosité de l'esprit humain et le manque de fonctionnalité de l'outil... hourra et hélas...
 
Shu:

Manque de fonctionnalité de l'outil... hourra et hélas...
Espérons que dans MQL5 nous ne serons pas obligés de faire de telles distorsions.

P.S. D'un autre côté, le processus est important !
 

Il n'y a pas de perversion dans le scénario. C'est un peu non conventionnel, c'est tout.

Idée : Le script ouvre les fenêtres des graphiques de chaque instrument de trading à partir de la fenêtre "Market Watch", s'exécute sur ceux-ci et ferme la fenêtre. Il se régule à l'aide de variables globales créées par lui-même (et supprimées à la fin de l'opération). C'est tout.


Le script fonctionnera dans 99 % des cas, si les conditions suivantes sont remplies :

- L'utilisation de la DLL sera autorisée sans confirmation manuelle ;

- La valeur de la variable Pause sera supérieure à 1000 (pause technique, dépend des performances de l'ordinateur et de la connexion Internet. Plus ces caractéristiques sont bonnes, moins vous pouvez définir la valeur de Pause et réduire respectivement le temps d'exécution du script) ;

- supprimer les variables globales(F3) "Symbol_Hash" et "Symbol_Handle" avant d'exécuter le script (cela peut être le cas si le script a échoué à s'exécuter auparavant).


Une fois le script terminé, le terminal est identique à ce qu'il était avant son lancement. Toutes les données relatives aux symboles se trouvent dans le fichier Symbols.txt.