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

 
getch:

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

Bien sûr, il n'y a pas de perversion dans le scénario lui-même - je ne l'ai pas dit exactement comme il faut. La perversion réside dans la manière d'accéder à la liste. Mais vous devez convenir que l'accès à la liste des outils doit se faire par le biais du terminal, et non par les fenêtres. Et le script est très utile, surtout pour les débutants comme moi qui n'ont aucune expérience du travail avec Windows. Merci encore, il contient beaucoup de solutions utiles, qui m'auraient pris beaucoup de temps à apprendre par moi-même.
 

Pourquoi a-t-il fallu que tu inventes une telle perversion... Il est plus facile d'écrire une DLL externe, dans laquelle les données requises sont tirées de l'objet MarketWatch. Vous ne pouvez pas le faire avec MQL4, car la procédure d'allocation de mémoire est nécessaire.

 
Dans MQL4, il est réaliste (testé) de tirer ces données sans écrire une DLL. Mais l'approche ci-dessus est beaucoup plus universelle. Parce que la fonction WriteSymbol() peut facilement et commodément contenir beaucoup de données...
 
 
Votre vidéo ne fonctionne pas...
Même si, en principe, le fonctionnement du scénario est déjà clair. Mais il s'agit clairement d'une solution peu fiable, qui entraînera probablement des blocages fréquents du terminal. Il se bloque assez souvent comme ça...

getch:
Dans MQL4 vous pouvez (essayé) d'obtenir ces données sans écrire une DLL. Mais l'approche ci-dessus est beaucoup plus universelle. Vous pouvez facilement et commodément mettre beaucoup de données dans la fonction WriteSymbol()...

Je me demande, comment on peut retirer ça ? Avec quelles commandes ? Si une telle chose est vraiment possible, ce serait grandement apprécié... Bien que je doute sérieusement que ce soit possible...


J'ai moi-même tiré des données de Market Watch, mais seulement en C++. Pour ce faire, il faut d'abord créer un nouveau processus (OpenProcess), lui réserver de la mémoire (VirtualAllocEx), y placer la structure de données requise et y enregistrer les informations nécessaires de l'objet. Et ensuite nous lisons les données nécessaires à partir de là. Mais vous ne pouvez pas obtenir l'information par la messagerie seulement, je l'ai essayé. L'objet est de type ListView.

 

Pour des raisons qui me sont inconnues, le forum n'est pas en mesure d'afficher correctement la vidéo. C'est pourquoi je l'ai joint sous forme d'archive ZIP.


Je n'ai pas rencontré de manque de fiabilité ou d'inopérabilité de ce script.

Dossiers :
symbols.zip  1630 kb
 

Version plus simple (une seule variable globale) et plus fiable (pas de fonction de hachage) du script :

// Запись в файл названий и торговых условий всех символов из окна "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 )

quelle commande puis-je utiliser pour "réinitialiser" un symbole sur un graphique déjà ouvert? c'est-à-dire faire passer le graphique actuel au symbole que je veux ?

 

Ici a fait ZG_All Quotings 1-80924!!!

Merci getch pour cette grande idée et cet élan de pensée !!!

J'aimerais bien connaître le nom du héros :-)

Ce script est le dernier moyen d'obtenir des devis auprès d'un courtier.

Un moyen encore plus difficile est de rendre visite à votre courtier en personne avec des outils spéciaux pour établir des devis.

 
Avec des fers, c'est ça ?