Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Code Base. Увеличивай свой рейтинг!
Sergey Pekshev
611
Sergey Pekshev 2014.03.18 19:02 

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

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

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

SendMessageA(hWnd,WM_ACTIVATE,WM_ACTIVATE,WM_ACTIVATE) 

SetActiveWindow(hWnd);

SetForegroundWindow(hWnd);

SetFocus(hWnd); 

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

Vladimir Karputov
Модератор
38130
Vladimir Karputov 2014.03.18 19:41  
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
Sergey Pekshev
611
Sergey Pekshev 2014.03.18 19:50  
barabashkakvn:

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

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

Проблема в том, как активировать нужный мне график, что бы вкладка, т.е. как программно выбрать нужную вкладку, не открывая график в новой вкладке, а про функцию ChartNext() я знаю.
Vladimir Karputov
Модератор
38130
Vladimir Karputov 2014.03.18 20:18  
ps-n:
Проблема в том, как активировать нужный мне график, что бы вкладка, т.е. как программно выбрать нужную вкладку, не открывая график в новой вкладке, а про функцию ChartNext() я знаю.
Поподробней пожалуйста, каким образом в скрипт, который должен активировать график, будет передаваться название нужного инструмента?
Sergey Pekshev
611
Sergey Pekshev 2014.03.18 20:30  
barabashkakvn:
Поподробней пожалуйста, каким образом в скрипт, который должен активировать график, будет передаваться название нужного инструмента?

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

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

Vladimir Karputov
Модератор
38130
Vladimir Karputov 2014.03.18 20:42  
ps-n:

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

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

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

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

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

В общем скрипт почти готов. Вопрос как скрипт получит название графика. 
Sergey Pekshev
611
Sergey Pekshev 2014.03.18 21:41  
barabashkakvn:
В общем скрипт почти готов. Вопрос как скрипт получит название графика. 
Покажите код, каким образом активируется окно, а как скрипт получит название графика, я придумаю
Vladimir Karputov
Модератор
38130
Vladimir Karputov 2014.03.18 22:23  

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

//+------------------------------------------------------------------+
//|                                          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);
  }
//+------------------------------------------------------------------+
Sergey Pekshev
611
Sergey Pekshev 2014.03.18 23:03  
barabashkakvn:

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

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

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

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

      long  hdlcurrWindowsHandle=GetParent(currWindowsHandle);

      ShowWindow(hdlcurrWindowsHandle,3);   

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

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

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

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

/ /123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий