Как в скрипте можно перебрать программно все инструменты, которые выбраны в окне "Обзор Рынка"? - страница 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 за замечательную идею и полёт мысли!!!

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

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

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

 
С утюгами, что ли?