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

 
KimIV:
VBAG:
Недавно решал для себя эту задачу.
Не работает там, где ДЦ к наименованию пары добавляют что-нибудь своё. Например, "m", "!", "." или "_".
Да конечно, это я в исследовательских целях делал, но если приспичит можно поступить радикально - упереться и перебрать число сочетаний всех символов ASCII скажем по максимально разумному количеству символов в названии инструмента(8-10). Такой скрипт будет работать наверное несколько часов, но зато автоматически и гарантировано.


to Zhunko
-Вспомнил, конечно из Вашего кода идею утянул. С Вашим загрузчиком занимался несколько дней - забавная штука! Спасибо.
 
KimIV:
VBAG:

Недавно решал для себя эту задачу.
Не работает там, где ДЦ к наименованию пары добавляют что-нибудь своё. Например, "m", "!", "." или "_".
Таких ДЦ немного и количество используемых ими символов невелико. Можно предусмотреть.
Я так поступил с парами Монейрейна. Там где "мини" и "профи".
В Лайте кажется тоже какая-то хрень приписывается.
Т.е. можно разделить инструменты на группы по ДЦ.
Меня интересовали только следующие ДЦ: Alpari, ForexBest, MoneyRain, NorthFinance, NWBroker.
Это ДЦ с максимальным количеством инструментов. И нужны были для подачи котировок для расчёта индексов валют.
Вот для них скрипт "ZZ_All Quotings 0-0080" и предназначен.
 
// Запись в файл названий и торговых условий всех символов из окна "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;
}
 
Забавная игрушка, но как надо не работает. У меня зациклилась на последнеим инструменте. При попытке остановить возникла ошибка МТ4.
Пусть открывает окна каждого инструмента с каждым ТФ.
Вот такой процедуры в начале не хватает:
#property show_inputs
 
Ух-ты! Здорово!
Спасибо!
 
о, сейчас попробую.
 
Zhunko:
Забавная игрушка, но как надо не работает. У меня зациклилась на последнеим инструменте. При попытке остановить возникла ошибка МТ4.
Пусть открывает окна каждого инструмента с каждым ТФ.
Вот такой процедуры в начале не хватает:
#property show_inputs


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

Если вызвало ошибку, перед запуском повторно удалите следующие глобальные переменные (F3):

"Symbol_Hash"
"Symbol_Handle"
NB: Скрипт - только демонстрация идеи возможного решения поставленной задачи.
 
getch:

NB: Скрипт - только демонстрация идеи возможного решения поставленной задачи.

опыт программирования великолепно демонстрирует как находчивость человеческого ума, так и недостаток функциональности инструмента.. ура и увы..
 
Shu:

недостаток функциональности инструмента.. ура и увы..
Будем надеяться, что в MQL5 нас не заставят так извращаться.

P.S. А с другой стороны - процесс важен!
 

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

Идея: скрипт открывает попеременно окна графиков каждого торгового инструмента из окна "Market Watch", запускает на них сам себя и закрывает окно. Регулирует себя через им же созданные (и удаленные в конце работы) глобальные переменные. Все.


Скрипт будет работать в 99% случаев, если будут соблюдены следующие условия:

- Будет разрешено использование DLL без ручного подтверждения;

- значение переменной Pause будет задано больше 1000 (техническая пауза, зависит от производительности компьютера и интернет соединения. Чем лучше данные характеристики, тем меньше можно задавать значение Pause и соответственно уменьшать время работы скрипта);

- перед запуском скрипта удалить глобальные переменные(F3) "Symbol_Hash" и "Symbol_Handle" (могут быть в случае неудачного запуска скрипта перед этим).


После окончания скрипта терминал выглядит также, как перед запуском. Все данные по символам находятся в файле Symbols.txt.

Причина обращения: