Как в скрипте активировать окно с нужным символом?

 

Как в скрипте активировать окно с нужным символом?

Открыто у меня куча графиков и бывает открыто много позиций по разным инструментам, и что бы посмотреть как на графиках открытые позы, приходится долго их искать, все вкладки не влезают в окно, приходится список вкладок перематывать туда сюда, что очень неудобно.  Если мышкой перемещать из окошка со списком открытых позиций  позу в окно, тогда сбиваются все уровни линии и т.п., решил я советником выводить (т.к. использую самописанный рискменеджер в виде советника)  название инструментов в углу по которым есть открытые позиции, а при клике на них активировалось бы соответствующая вкладка, вот тут то я и запнулся, перечитал форум, куча примеров, но ничего не работает, WindowHandle() выдает хэндл графика, только если он активный иначе 0, другие функции выдают вообще разные значения GetActiveWindow()  GetForegroundWindow().  ChartID() вообще какую то хрень выдает.

пробовал все эти значение скармливать функциям ниже, ни чего не получается 

SendMessageA(hWnd,WM_ACTIVATE,WM_ACTIVATE,WM_ACTIVATE) 

SetActiveWindow(hWnd);

SetForegroundWindow(hWnd);

SetFocus(hWnd); 

уже голова трещит

 
ps-n:

Как в скрипте активировать окно с нужным символом?

Открыто у меня куча графиков и бывает открыто много позиций по разным инструментам, и что бы посмотреть как на графиках открытые позы, приходится долго их искать, все вкладки не влезают в окно, приходится список вкладок перематывать туда сюда, что очень неудобно.  Если мышкой перемещать из окошка со списком открытых позиций  позу в окно, тогда сбиваются все уровни линии и т.п., решил я советником выводить (т.к. использую самописанный рискменеджер в виде советника)  название инструментов в углу по которым есть открытые позиции, а при клике на них активировалось бы соответствующая вкладка, вот тут то я и запнулся, перечитал форум, куча примеров, но ничего не работает, WindowHandle() выдает хэндл графика, только если он активный иначе 0, другие функции выдают вообще разные значения GetActiveWindow()  GetForegroundWindow().  ChartID() вообще какую то хрень выдает.

пробовал все эти значение скармливать функциям ниже, ни чего не получается 

SendMessageA(hWnd,WM_ACTIVATE,WM_ACTIVATE,WM_ACTIVATE) 

SetActiveWindow(hWnd);

SetForegroundWindow(hWnd);

SetFocus(hWnd); 

уже голова трещит

Посмотрите справку по chartnext:

Для Вашего случае почти готовый алгоритм:

//--- переменные для идентификаторов графиков
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
   while(i<limit)// у нас наверняка не больше 100 открытых графиков
     {
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
      if(currChart<0) break;          // достигли конца списка графиков
      Print(i,ChartSymbol(currChart)," ID =",currChart);
      prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
      i++;// не забудем увеличить счетчик
     }
Документация по MQL5: Операции с графиками / ChartNext
Документация по MQL5: Операции с графиками / ChartNext
  • www.mql5.com
Операции с графиками / ChartNext - Документация по MQL5
 
barabashkakvn:

Посмотрите справку по chartnext:

Для Вашего случае почти готовый алгоритм:

Проблема в том, как активировать нужный мне график, что бы вкладка, т.е. как программно выбрать нужную вкладку, не открывая график в новой вкладке, а про функцию ChartNext() я знаю.
 
ps-n:
Проблема в том, как активировать нужный мне график, что бы вкладка, т.е. как программно выбрать нужную вкладку, не открывая график в новой вкладке, а про функцию ChartNext() я знаю.
Поподробней пожалуйста, каким образом в скрипт, который должен активировать график, будет передаваться название нужного инструмента?
 
barabashkakvn:
Поподробней пожалуйста, каким образом в скрипт, который должен активировать график, будет передаваться название нужного инструмента?

Проблема же не в этом, а в том, как сделать активным окно с графиком, зная название инструмента.

Отвечаю на ваш вопрос, советник будет брать список валютных пар из списка  открытых ордеров и выводить их прям на графике, где-нибудь в углу, затем при клике по названию инструмента, в обработчике событий уже нужно будет активировать программно нужное окно с графиком, вот тут я и застрял.

 
ps-n:

Проблема же не в этом, а в том, как сделать активным окно с графиком, зная название инструмента.

Отвечаю на ваш вопрос, советник будет брать список валютных пар из списка  открытых ордеров и выводить их прям на графике, где-нибудь в углу, затем при клике по названию инструмента, в обработчике событий уже нужно будет активировать программно нужное окно с графиком, вот тут я и застрял.

XЧтобы активировать окно нужно знать его хендл. Чтобы узнать хендл окна - нужно узнать название окна. Отсюда вопрос: формат передачи названия окна в скрипт (это "EURUSD" или это ChartID графика?)
 
barabashkakvn:
XЧтобы активировать окно нужно знать его хендл. Чтобы узнать хендл окна - нужно узнать название окна. Отсюда вопрос: формат передачи названия окна в скрипт (это "EURUSD" или это ChartID графика?)
в цикле пробежаться по всем хэндлам окон, как в том примере выше и если ChartSymbol(хэндл) == 'нужный нам символ' то активируем это окно
 
ps-n:

Проблема же не в этом, а в том, как сделать активным окно с графиком, зная название инструмента.

Отвечаю на ваш вопрос, советник будет брать список валютных пар из списка  открытых ордеров и выводить их прям на графике, где-нибудь в углу, затем при клике по названию инструмента, в обработчике событий уже нужно будет активировать программно нужное окно с графиком, вот тут я и застрял.

В общем скрипт почти готов. Вопрос как скрипт получит название графика. 
 
barabashkakvn:
В общем скрипт почти готов. Вопрос как скрипт получит название графика. 
Покажите код, каким образом активируется окно, а как скрипт получит название графика, я придумаю
 

А вот и код скрипта активации окон, в цикле, по очереди:

//+------------------------------------------------------------------+
//|                                          WindowactivationMT5.mq5 |
//|                              Copyright © 2014, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2014, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#define  HWND              long
#define  BOOL              bool    
#import "user32.dll"
//+------------------------------------------------------------------+
//| GetParent.Retrieves a handle to the specified                    |
//| window's parent or owner.                                        |
//+------------------------------------------------------------------+
HWND GetParent(HWND hWnd);
//+------------------------------------------------------------------+
//| ShowWindow.                                                      |
//| 1 - Activates and displays a window.                             |
//| 2 - Activates the window and displays it as a minimized window.  |
//| 3 - Activates the window and displays it as a maximized window.  |
//+------------------------------------------------------------------+
BOOL ShowWindow(
                HWND hWnd,
                int nCmdShow
                );
#import
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
// 
// variables for chart ID
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
// У нас наверняка не больше 100 открытых графиков
// We have certainly not more than 100 open charts
   while(i<limit)// 
     {
      // На основании предыдущего получим новый график
      // Get the new chart ID by using the previous chart ID
      currChart=ChartNext(prevChart);
      if(currChart<0) break;  // достигли конца списка графиков // Have reached the end of the chart list
      Print(i," ",ChartSymbol(currChart)," ID =",currChart);
      long  currWindowsHandle=ChartWindowsHandle(currChart);
      long  hdlcurrWindowsHandle=GetParent(currWindowsHandle);
      ShowWindow(hdlcurrWindowsHandle,3);
      Sleep(1000);
      // Запомним идентификатор текущего графика для ChartNext()
      // Let's save the current chart ID for the ChartNext()
      prevChart=currChart;
      // Не забудем увеличить счетчик
      // Do not forget to increase the counter
      i++;
     }
  }
//+------------------------------------------------------------------+
//| Функция получает хэндл графика. Chart window handle (HWND)       |
//+------------------------------------------------------------------+
long ChartWindowsHandle(long chart_ID)
  {
// Подготовим переменную для получения значения свойства
// Prepare the variable to get the property value
   long result=-1;
// Сбросим значение ошибки
// Reset the error value
   ResetLastError();
// Получим значение свойства
// Receive the property value
   if(!ChartGetInteger(chart_ID,CHART_WINDOW_HANDLE,0,result))
     {
      // Выведем сообщение об ошибке в журнал "Эксперты"
      // Display the error message in Experts journal
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
// Вернем значение свойства графика
// Return the value of the chart property
   return(result);
  }
//+------------------------------------------------------------------+
 
barabashkakvn:

А вот и код скрипта активации окон, в цикле, по очереди:

Спасибо огромное, заработало! 

Столько мучений из-за трех строчек

      long  currWindowsHandle=ChartGetInteger(ChartFirst(),CHART_WINDOW_HANDLE,0);

      long  hdlcurrWindowsHandle=GetParent(currWindowsHandle);

      ShowWindow(hdlcurrWindowsHandle,3);   

 Почему то я считал что ChartFirst() ChartNext() ChartID() как раз и должны возвращать это хендл, как и WindowHandle(), а они возвращают какой-то идентификатор

Осталось только понять что делает GetParent() это типа еще какое-то окно выше(родительское?)  тогда на что указывает currWindowsHandle? Сори в вин api и в иерархие виндовых окон не силен.

Скрипт почему то не заработал, я так понял он должен был переключать окна с задержкой, но я выдернул из него что мне нужно.

Еще раз спасибо, сам бы не допер.  

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