Как в скрипте можно перебрать программно все инструменты, которые выбраны в окне "Обзор Рынка"? - страница 3

 
getch:

Никакого изврата в скрипте нет. Немного нестандартный подход и только.

В самом скрипте, конечно, изврата нет - я не совсем точно выразился. Извращение в способе доступа к списку. Но согласитесь, что доступ к списку инструментов должен быть реализован средствами терминала, а не через окна винды. А скрипт очень полезен, особенно начинающим программерам как я, не имеющим опыта работы под виндой. Еще раз благодарю Вас, в нем много нужных решений, самостоятельное изучение которых заняло бы у меня кучу времени.
 

и зачем было выдумывать стоко извращения... Проще написать внешнюю ДЛЛ, в которой вытягивать из объекта MarketWatch требуемые данные. Через MQL4 это сделать не удастся, т.к. необходима процедура выделения памяти

 
На MQL4 реально (проверенно) вытаскивать эти данные без написания DLL. Но подход выше гораздо универсальнее. Т.к. в функцию WriteSymbol() с легкостью и привычным удобством можно запихать очень много...
 
 
Что-то не работает Ваше видео...
Хотя в принципе и так понятно, как будет работать скрипт. Но это явно ненадёжное решение, и наверняка будет приводить к частым зависаниям терминала. У меня он и без того часто виснет...

getch:
На MQL4 реально (проверенно) вытаскивать эти данные без написания DLL. Но подход выше гораздо универсальнее. Т.к. в функцию WriteSymbol() с легкостью и привычным удобством можно запихать очень много...

Интересно, и как это можно вытаскивать?? Какими командами? Если такое действительно возможно, то буду очень признателен... Хотя что-то сильно сомневаюсь в такой возможности...


Я сам вытаскивал данные из "Обзора рынка", но только на C++.  Для этого сначала создаётся новый процесс (OpenProcess), в нём резервируется память (VirtualAllocEx), там размещается требуемая структура данных, и уже туда сохраняется необходимая инфа из объекта. Ну и затем считываем нужные данные оттуда.  А одними лишь мессагами инфу не вытащить, я пробовал. Там объект типа ListView

 

По неизвестной мне причине форум не может корректно отобразить видео. Поэтому прикрепил его в ZIP-архиве.


С неработоспособностью и ненадежностью данного скрипта встретиться не удалось.

Файлы:
symbols.zip  1630 kb
 

Попроще (только одна глобальная переменная) и понадежнее (без хэш-функции) вариант скрипта:

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

а какой командой можно "сбросить" символ на уже открытый график? т.е. переключить текущий график на нужный мне символ?

 

Вот сделал ZG_All Quotings 1-80924!!!

Спасибо getch за замечательную идею и полёт мысли!!!

Хотелось бы знать имя героя :-)

Этот скрипт последний способ получить котировки от брокера.

Ещё более жёсткий способ это личное посещение своего брокера со спецсредствами для выбивания котировок.

 
С утюгами, что ли?
Причина обращения: