Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Установил MetaTrader 5? Узнай о нем подробно!
Vladimir Karputov
Модератор
45818
Vladimir Karputov 2014.09.27 22:23 
В эту тему были перенесены комментарии, не относящиеся к "Ошибки, баги, вопросы".
Sergey Dzyublik
4817
Sergey Dzyublik 2014.09.27 19:44  

Подскажите функцию для переключения видимости чарта по ChartID или хендлу, а то не могу найти.

Если такой нет, буду рад API-шной функции. 


Я открываю новый график с помощью ChartOpen и при открытии автоматически переключает видимость на этот новый чарт,  а мне надо оставаться на старом. 

Sergey Dzyublik
4817
Sergey Dzyublik 2014.09.27 20:12  

С 3-го захода нашел )) если это оно

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

 В общем в 4-ке 710 ни хрена не работает (влияет только на какой чарт переключится видимость после удаления чартов созданных с помощью ChartOpen)

Andrey Voytenko
23093
Andrey Voytenko 2014.09.27 20:26  
ALXIMIKS:

Подскажите функцию для переключения видимости чарта по ChartID или хендлу, а то не могу найти.

Если такой нет, буду рад API-шной функции.

Вот тебе API. Работает на обоих терминалах.

#import "user32.dll"
int GetAncestor(int hwnd,uint gaFlags);
int BringWindowToTop(int hWnd);
#import
//+------------------------------------------------------------------+
//|   OnStart                                                        |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- сделать активным первый график
   int hwnd=(int)ChartGetInteger(ChartFirst(),CHART_WINDOW_HANDLE);
   hwnd=GetAncestor(hwnd,1);
   BringWindowToTop(hwnd);
  }
//+------------------------------------------------------------------+
Vladimir Karputov
Модератор
45818
Vladimir Karputov 2014.09.27 20:29  
ALXIMIKS:

Подскажите функцию для переключения видимости чарта по ChartID или хендлу, а то не могу найти.

Если такой нет, буду рад API-шной функции. 


Я открываю новый график с помощью ChartOpen и при открытии автоматически переключает видимость на этот новый чарт,  а мне надо оставаться на старом. 

Всё прекрасно работает. Код - только mql. Никакого API.

P.S. Скрипт есть в моём профиле, только скрипту нужно сменить расширение с *.mql5  на *.mql4.

Andrey Voytenko
23093
Andrey Voytenko 2014.09.27 20:47  
ALXIMIKS:

 В общем в 4-ке 710 ни хрена не работает (влияет только на какой чарт переключится видимость после удаления чартов созданных с помощью ChartOpen)

В МТ4 не работает без:

ChartRedraw(chart_ID);

А в МТ5 обновление делать не обязательно. И так работает. В общем это баг, но не критичный.
Sergey Dzyublik
4817
Sergey Dzyublik 2014.09.27 20:57  
avoitenko:
В МТ4 не работает без:

ChartRedraw(chart_ID);

А в МТ5 обновление делать не обязательно. И так работает. В общем это баг, но не критичный.

Спасибо огромное за API функции,

надо, наверное, на них по немного переходить - будет в разы надежнее чем тут городят от билда к билду

 

касаемо  ChartRedraw не помогло:

//#import "user32.dll"
//int GetAncestor(int hwnd,uint gaFlags);
//int BringWindowToTop(int hWnd);
//#import

int OnInit()
{
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   EventKillTimer();
}

void OnTimer()
{
   //int hwnd=(int)ChartGetInteger(ChartID(),CHART_WINDOW_HANDLE);
   //hwnd=GetAncestor(hwnd,1);
   //BringWindowToTop(hwnd);
   ChartRedraw();
   ChartBringToTop(); 
   ChartRedraw();
}

bool ChartBringToTop(const long chart_ID=0)
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- покажем график поверх всех других
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты"
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   ChartRedraw();
   return(true);
  }

ни чего не делает на деле код.

Andrey Voytenko
23093
Andrey Voytenko 2014.09.27 21:03  
ALXIMIKS:

ни чего не делает на деле код.

Вы забыли указать ID графика, который нужно обновить. Обновляем не текущий, а тот, который назначили топовым.

ChartRedraw(chart_ID);
Artyom Trishkin
Модератор
75740
Artyom Trishkin 2014.09.27 21:07  
И вот так всегда. Сначала охаят метаквотов - багов мол понаделали, ненадёжно всё, а потом, когда всё выясняется, извинений в их адрес - ноль. Жаль...
Anatoli Kazharski
56910
Anatoli Kazharski 2014.09.27 22:02  
artmedia70:
И вот так всегда. Сначала охаят метаквотов - багов мол понаделали, ненадёжно всё, а потом, когда всё выясняется, извинений в их адрес - ноль. Жаль...
Плохим танцорам мешают не только яйца. ))
Sergey Dzyublik
4817
Sergey Dzyublik 2014.09.27 22:09  
artmedia70:
И вот так всегда. Сначала охаят метаквотов - багов мол понаделали, ненадёжно всё, а потом, когда всё выясняется, извинений в их адрес - ноль. Жаль...

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

Мне надо чтобы график переключался на тот на котором запущен эксперт с переодичностью 5 сек.

Все идеально работает с API, а вот как это сделать стандартными функциями  расскажите, Артем - если тесты показали следующее:

//#import "user32.dll"
//int GetAncestor(int hwnd,uint gaFlags);
//int BringWindowToTop(int hWnd);
//#import

long char_id;
int OnInit()
{
   char_id = ChartID();
   EventSetTimer(5);
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   EventKillTimer();
}

void OnTick()
{
}

void OnTimer()
{
   //int hwnd=(int)ChartGetInteger(ChartID(),CHART_WINDOW_HANDLE);
   //hwnd=GetAncestor(hwnd,1);
   //BringWindowToTop(hwnd);
 
   long id = ChartFirst();
   while(id > 0)
   {
      Print ("ID = " + string(id));
      ChartRedraw(char_id);
      id = ChartNext(id);
   }
   ChartRedraw();
   ChartRedraw(0);
   ChartRedraw(ChartID());
   
   //ChartBringToTop(char_id);      // Не работает если нет  ChartRedraw(chart_ID); в ChartBringToTop
   ChartBringToTop(char_id);      // Не работает если есть  ChartRedraw(chart_ID); в ChartBringToTop
   //ChartBringToTop(ChartFirst()); // Не работает если нет  ChartRedraw(chart_ID); в ChartBringToTop
   
   //ChartBringToTop(ChartFirst());   // Ура работает если есть  ChartRedraw(chart_ID); в ChartBringToTop
                                    // Как круто - только не то что мне надо, мне надо переключиться на char_id
   
   ChartRedraw();
   ChartRedraw(0);
   ChartRedraw(ChartID());   
   id = ChartFirst();
   while(id > 0)
   {
      Print ("ID = " + string(id));
      ChartRedraw(char_id);
      id = ChartNext(id);
   }
    ChartRedraw(0);
    Print (ChartID());
}

bool ChartBringToTop(const long chart_ID=0)
  {
   ResetLastError();
   if(!ChartSetInteger(chart_ID,CHART_BRING_TO_TOP,0,true))
     {
      Print(__FUNCTION__+", Error Code = ",GetLastError());
      return(false);
     }
   ChartRedraw(chart_ID);           // работает если только не текущий график и если есть в этом месте ChartRedraw
    
   //long id = ChartFirst();
   //while(id > 0)
   //{
   //   Print ("ID = " + string(id));
   //   ChartRedraw(char_id);
   //   id = ChartNext(id);
   //}
   return(true);
  }

 

 

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