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

 
ALXIMIKS:

Я делал заказ, нашел баг с CHARTEVENT_OBJECT_DRAG  (объект который тащили - типа не существует, его свойства нельзя изменить из обработчика событий)

спросил есть ли этот баг в новом билде  - ответили что повторить не смогли.

я заказчику и пишу - чуть-чуть потерпеть надо, всё будет красиво в новом билде.

а оказалось не очень(( 

Попробуй вот этот код. Объект (любой, где можно изменить цвет) создай вручную:

//+------------------------------------------------------------------+
//|                                                         TEST.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//---
color array_color[5]={clrRed,clrAliceBlue,clrAqua,clrRoyalBlue,clrCrimson};
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| OnTick                                                           |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
  }
//+------------------------------------------------------------------+
//| Пользовательские события                                         |
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   if(id==CHARTEVENT_OBJECT_DRAG)
     {
      Print("object name: ",sparam);
      ObjectSetInteger(0,sparam,OBJPROP_COLOR,array_color[rand()%5]);
     }
  }
//+------------------------------------------------------------------+
 
ALXIMIKS:

Я делал заказ, нашел баг с CHARTEVENT_OBJECT_DRAG  (объект который тащили - типа не существует, его свойства нельзя изменить из обработчика событий)

спросил есть ли этот баг в новом билде  - ответили что повторить не смогли.

я заказчику и пишу - чуть-чуть потерпеть надо, всё будет красиво в новом билде.

а оказалось не очень(( 

В общем, проверил на 711 билде в MT4 и на 986 билде в MT5. Работает и там и там. Ты пишешь, что у тебя и в предыдущих билдах не работало и сейчас, в последнем, не работает. 

А у заказчика тоже, как я понял, не работает

Вот видео из MT4:


 
tol64:

Вот видео из MT4:

А чем видео записывали? Себе хочу такое в лукоморье.
 
barabashkakvn:
А чем видео записывали? Себе хочу такое в лукоморье.
FastStone Capture. А в формат *.FLV для загрузки на форум конвертирую в Any DVD Converter Professional.
 

в 711 не работает, вот видео (не очень красивое но суть в том что не работает и .)

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

 

 

Сейчас вот еще одна проблема обнаружилась:

#property strict
#property indicator_separate_window

int wind_numb = 0;
int OnInit()
  {
   wind_numb = WindowNumber();
   return(INIT_SUCCEEDED);
  }
  
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Print ("wind = " + string(wind_numb) + "    Heigth = " + string(ChartHeightInPixelsGet(0, wind_numb)));
   return(rates_total);
  }
  
//+------------------------------------------------------------------+  
  int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
   long result=-1;
   ResetLastError();
   if(!ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window,result))
     {
      Print(__FUNCTION__+", Error Code = ",GetLastError());
     }
   return((int)result);
  }
//+------------------------------------------------------------------+

int WindowNumber( long chartID = 0, string short_name = "" )
{
   int window = -1;
   if (( ENUM_PROGRAM_TYPE ) MQLInfoInteger( MQL_PROGRAM_TYPE ) == PROGRAM_INDICATOR )
      window = ChartWindowFind();
   else
   {
      window = ChartWindowFind( 0, short_name );
      if ( window == -1 )
         Print( __FUNCTION__ + "(): Error = ", GetLastError() );
   }
   return( window );
}

 функция ChartHeightInPixelsGet должна вернуть высоту графика иникатора.

По чему то возвращает 0 (но без ошибок GetLastError()) при первом использовании для индикатора в подокне.

Далее при переключении тф  все работает нормально и возвращает нужное значение.

 
ALXIMIKS:

в 711 не работает, вот видео (не очень красивое но суть в том что не работает и .)

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

Да, на видео видна проблема.

Скачал терминал от MMCIS и убедился, что у меня и в нём работает нормально. )))

Может попробуй переустановить терминал? Мало ли. 

 
ALXIMIKS:

Сейчас вот еще одна проблема обнаружилась:

... 

функция ChartHeightInPixelsGet должна вернуть высоту графика иникатора.

По чему то возвращает 0 (но без ошибок GetLastError()) при первом использовании для индикатора в подокне.

Далее при переключении тф  все работает нормально и возвращает нужное значение.

Тоже в MT4

Да, есть такая проблема. Но можно решить. Проявляется только при первом вызове, а далее, если вызвать ещё раз, например из таймера, то всё нормально.

Если же нужно обязательно получить высоту подокна при первом же запросе, то нужно принудительно в OnInit() указать высоту подокна индикатора.

//--- 

P.S. Но при таком подходе не получается потом изменять высоту подокна вручную. В таком случае нужно разблокировать это "недоразумение". Это делается так. При первом заходе в функцию OnCalculate() нужно указать, например, нулевую высоту для подокна. Подокно останется таким же по высоте, но его уже можно будет изменять вручную.

Вот пример (только для MT4):

//+------------------------------------------------------------------+
//|                                                        #Test.mq4 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_plots   0
//---
int wind_numb =0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Создание таймера
   EventSetMillisecondTimer(2000);
//---
   IndicatorSetString(INDICATOR_SHORTNAME,"Test");
   IndicatorSetInteger(INDICATOR_HEIGHT,200);
//---
   wind_numb=WindowNumber();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Удалить таймер
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int      rates_total,
                const int      prev_calculated,
                const datetime &time[],
                const double   &open[],
                const double   &high[],
                const double   &low[],
                const double   &close[],
                const long     &tick_volume[],
                const long     &volume[],
                const int      &spread[])
  {
   if(prev_calculated==0)
     {
      IndicatorSetInteger(INDICATOR_HEIGHT,0);
      Print(__FUNCTION__," > prev_calculated: ",prev_calculated,"; wind ="+string(wind_numb)+"; Heigth ="+string(ChartHeightInPixelsGet(0,wind_numb)));
     }
   else
      Print(__FUNCTION__," > prev_calculated: ",prev_calculated,"; wind ="+string(wind_numb)+"; Heigth ="+string(ChartHeightInPixelsGet(0,wind_numb)));
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   Print(__FUNCTION__," > wind ="+string(wind_numb)+"; Heigth ="+string(ChartHeightInPixelsGet(0,wind_numb)));
  }
//+------------------------------------------------------------------+
//| ChartHeightInPixelsGet                                           |
//+------------------------------------------------------------------+
int ChartHeightInPixelsGet(const long chart_ID=0,const int sub_window=0)
  {
   int result=(int)ChartGetInteger(chart_ID,CHART_HEIGHT_IN_PIXELS,sub_window);
//---
   return((int)result);
  }
//+------------------------------------------------------------------+
//| WindowNumber                                                     |
//+------------------------------------------------------------------+
int WindowNumber()
  {
   int window=-1;
   window=ChartWindowFind();
   if(window==-1)
      Print(__FUNCTION__+"(): Error = ",GetLastError());
//---
   return(window);
  }
//+------------------------------------------------------------------+

//---

Но это всё костыль конечно. Нужно исправлять. ))

 

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

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

ALXIMIKS, 2014.09.29 22:28

Вернулся к написанию кода советника, который открывает 2 новых чарта

при открытии нового чарта происходит изменения видимого чарта (просто говоря - кидает на тот чарт, что только что открылся) 

я же хочу вернуться туда, где я был.


Как узнать ChartID или хендл  активного в данный момент чарта, а не там где сидит советник??? (ChartID() не подходит)

Что-то пробовал наугадать с API (GetForegroundWindow, GetWindow, GetTopWindow, GetActiveWindow, GetAncestor) но все безуспешно

 

Второй вариант  решения проблемы в целом - создания чарта с  API  но без BringWindowToTop, но тоже глухой лес....

Помогите кто в теме. Спасибо. 


 

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

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

sanyooooook, 2014.09.30 00:08

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

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

CHART_BRING_TO_TOP – показывает график поверх всех других.
//+------------------------------------------------------------------+
//| Отправка терминалу команды на показ графика поверх всех других.  |
//+------------------------------------------------------------------+
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);
     }
//--- успешное выполнение
   return(true);
  }