Подскажите функцию для переключения видимости чарта по ChartID - страница 5

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Ошибки, баги, вопросы

ALXIMIKS, 2014.09.30 00:40

спасибо за желание помочь, но у меня ситуация не штатная:

1. Експерт может открыть новые чарты - когда будет это событие - я не в курсе

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

3. Когда же эксперт создаст новое окно (чарт)- мене перекидывает на наго

4. Мне не надо новое окно, я хочу быть там где я был

5. Вот для этого и вопрос - КАК УЗНАТЬ ТЕКУЩИЙ куда я смотрю в данный момент ChartID или хендл ???

 

 (п.с. касаемо приведенной вами функции - без ChartRedraw() именно внутри этой функции в МТ4 710(выше не проверял) работать ни чего не будет.)


 

ALXIMIKS, 2014.09.30 00:40

спасибо за желание помочь, но у меня ситуация не штатная:

1. Експерт может открыть новые чарты - когда будет это событие - я не в курсе

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

3. Когда же эксперт создаст новое окно (чарт)- мене перекидывает на наго

4. Мне не надо новое окно, я хочу быть там где я был

5. Вот для этого и вопрос - КАК УЗНАТЬ ТЕКУЩИЙ куда я смотрю в данный момент ChartID или хендл ???

 

 (п.с. касаемо приведенной вами функции - без ChartRedraw() именно внутри этой функции в МТ4 710(выше не проверял) работать ни чего не будет.)

так сказал же вроде, смотреть свойство графика
CHART_BRING_TO_TOP

у каждого по очереди

и у кого это свойство равно true тот график и нужен, все остальные лесом

как нашли график с свойством равным true так запоминаем его ChartId, он же хендл.

и работаем по ID с графиком.

кроме как постоянно проверять какое окно сверху и сравнивать с последним состоянием, решения не вижу.

 
barabashkakvn:

предупреждать надо куда переносятся посты.
 

вот ещё вариант, т.е. создать график и поставить ему отображение не по верх всех окон:

//+------------------------------------------------------------------+
//| Функция включает/выключает режим отображения ценового графика на |
//| переднем плане.                                                  |
//+------------------------------------------------------------------+
bool ChartForegroundSet(const bool value,const long chart_ID=0)
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- установим значение свойства
   if(!ChartSetInteger(chart_ID,CHART_FOREGROUND,0,value))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
 

CHART_FOREGROUND – свойство отображения ценового графика на переднем плане.
//+------------------------------------------------------------------+
//| Функция определяет, отображается ли ценовой график на переднем   |
//| плане.                                                           |
//+------------------------------------------------------------------+
bool ChartForegroundGet(bool &result,const long chart_ID=0)
  {
//--- подготовим переменную для получения значения свойства
   long value;
//--- сбросим значение ошибки
   ResetLastError();
//--- получим значение свойства
   if(!ChartGetInteger(chart_ID,CHART_FOREGROUND,0,value))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
//--- запомним в переменную значение свойства графика
   result=value;
//--- успешное выполнение
   return(true);
  }

 
 

barabashkakvn: 

Зачем переносить тему из Ошибки, баги, вопросы?  

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

 

 

sanyooooook:
так сказал же вроде, смотреть свойство графика

у каждого по очереди

и у кого это свойство равно true тот график и нужен, все остальные лесом

как нашли график с свойством равным true так запоминаем его ChartId, он же хендл.

и работаем по ID с графиком.

кроме как постоянно проверять какое окно сверху и сравнивать с последним состоянием, решения не вижу.

Да, спасибо, сразу не подумал, так как мне казалось, что данное свойство только для Set метода а не Get.

вот проверил: 

   long next_chart = ChartFirst();
   while (ChartGetInteger(next_chart, CHART_BRING_TO_TOP, 0) == false)
      if ((next_chart = ChartNext(current_chart)) == -1)
         break;
// method----------2
   ResetLastError();
   long next_chart = ChartFirst();
   long value = 0;
   if (ChartGetInteger(next_chart, CHART_BRING_TO_TOP, 0, value) == false)
       Alert(GetLastError());  

 ни так, ни сяк не работает  - ошибка 4211 - График не найден

 

Касаемо  CHART_FOREGROUND - ни чего не дало

(если не ошибаюсь это свойство выводит на передний план цену, если она заслоенна каким-то объектом) 

 

Мои подозрения что нету штатных методов что бы узнать какой чарт активный в данный момент все более подтверждаются

 
ALXIMIKS:

Касаемо  CHART_FOREGROUND - ни чего не дало

(если не ошибаюсь это свойство выводит на передний план цену, если она заслоенна каким-то объектом) 

 


ах да это чарт поверх всего что на нём есть
 
похоже что узнать какой график в фокусе стандартными методами нельзя, но можно через WinApi
 

В справке написано, что свойство CHART_BRING_TO_TOP имеет тип w/o, что означает, что данное свойство предназначено только для записи и не может быть получено.

Но помню, когда-то давно, обещали дать возможность и для чтения тоже. Забыли наверное. )) 

Попробую сделать из того, что есть. Если получится, покажу пример.

 
sanyooooook:
похоже что узнать какой график в фокусе стандартными методами нельзя, но можно через WinApi

кажется вот:

 int      GetFocus(int hWnd);
 // Опpеделяет самое последнее активное всплытие. Возвpащаемое значение: идентификатоp всплывающего окна; WndOwner.

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

 

Связался с гуру (Zh)

гуру натолкнул на хорошую мысль, там объяснил, там рассказал и в целом очень помог.

В результате старания и просто логики мне удалось написать последовательность функций для получения родительского хендла текущего активного окна чарта.

Пусть не вводит в заблуждение простота (хотя да, сейчас уже все кажется простым):

 int hchart = int(ChartGetInteger(chart_id, CHART_WINDOW_HANDLE));
 int hhchart = GetAncestor(hchart, 1);
 int hhhchart = GetAncestor(hhchart, 1);
 int hwnd = GetTopWindow(hhhchart); 
Причина обращения: