Обсуждение статьи "Визуализируем оптимизацию торговой стратегии в MetaTrader 5" - страница 3

 
Rashid Umarov:

@Dennis Kirichenko Вы распаковали самостоятельно  картинки из архива EasyAndFastGUI.zip ? Пришлось все картинки приложить ZIP-файлом, другого варианта на текущий момент просто нет.

Да, я сам распаковал и скопировал. Нужно было сделать по-другому?

У меня вот так сейчас:



 
Dennis Kirichenko:

Да, я сам распаковал и скопировал. Нужно было сделать по-другому?

У меня вот так сейчас:

Всё правильно.

Покажите список графических объектов, созданных экспертом перед вылетом с графика в начале оптимизации (Ctrl + B).

 
Anatoli Kazharski:

Всё правильно.

Покажите список графических объектов, созданных экспертом перед вылетом с графика в начале оптимизации (Ctrl + B).

На всякий случай уточню, что объекты скрыты. Чтобы их вывести в список, жму на кнопку "Все".



 
Dennis Kirichenko:

...

То есть, по каким-то причинам у Вас не создаётся объект для рисования кнопки:

//---

Проверьте наличие отмеченных ниже картинок:

//---

И вот этот вопрос остался без ответа:

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

Обсуждение статьи "Визуализируем оптимизацию торговой стратегии в MetaTrader 5"

Anatoli Kazharski, 2018.02.26 11:10

Теперь уже понятнее. Но вот я не могу ответить на вопрос, почему так получается.

Какая-то проблема вот в этом методе класса CCanvas из стандартной библиотеки:

//+------------------------------------------------------------------+
//| Attach new object with bitmap resource                           |
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- success
         return(true);
        }
     }
//--- failed
   return(false);
  }

//---

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

Вы не вносили изменения в этот класс?


 

Кнопки есть.

СБ никогда не правлю.

В класс CCanvas::Attach() изменения не вносил. Вот он:

//+------------------------------------------------------------------+
//| Attach new object with bitmap resource                           |
//+------------------------------------------------------------------+
bool CCanvas::Attach(const long chart_id,const string objname,ENUM_COLOR_FORMAT clrfmt=COLOR_FORMAT_XRGB_NOALPHA)
  {
   if(OBJ_BITMAP_LABEL==ObjectGetInteger(chart_id,objname,OBJPROP_TYPE))
     {
      string rcname=ObjectGetString(chart_id,objname,OBJPROP_BMPFILE);
      rcname=StringSubstr(rcname,StringFind(rcname,"::"));
      if(ResourceReadImage(rcname,m_pixels,m_width,m_height))
        {
         m_objname=objname;
         m_rcname=rcname;
         m_format=clrfmt;
         m_objtype=OBJ_BITMAP_LABEL;
         //--- success
         return(true);
        }
     }
//--- failed
   return(false);
  }
 
Dennis Kirichenko:

Кнопки есть.

СБ никогда не правлю.

В класс CCanvas::Attach() изменения не вносил. Вот он:

В таком случае ничем помочь не могу. 

KR      0       12:44:52.304    MacdSampleWithFrames (EURUSD,H1)        CElement::CreateCanvas > Не удалось присоединить холст для рисования к графику: 4016

//---

Ошибка 4016 означает:

ERR_RESOURCE_NOT_FOUND

4016

Ресурс с таким именем в EX5 не найден


//---

Если кто-нибудь ещё тестировал примеры из статьи, прошу рассказать о результатах. Воспроизводится ли ещё, у кого-нибудь такая проблема?

 

А не может ли быть причиной то, что у меня корневая папка имеет вид "C:\Program Files\MetaTrader 5\MQL5"  ???

Соответственно ресурсы расположены в C:\Program Files\MetaTrader 5\MQL5\Images. 

Может проблема с доступом к рисункам? Хотя терминал запускается от имени администратора.

 
Dennis Kirichenko:

А не может ли быть причиной то, что у меня корневая папка имеет вид "C:\Program Files\MetaTrader 5\MQL5"  ???

Соответственно ресурсы расположены в C:\Program Files\MetaTrader 5\MQL5\Images. 

Может проблема с доступом к рисункам? Хотя терминал запускается от имени администратора.

Не знаю. Попробуйте исследовать этот момент. 

Ресурсы в коде для формы вот так прописаны:

//+------------------------------------------------------------------+
//| Создаёт кнопки на форме                                          |
//+------------------------------------------------------------------+
#resource "\\Images\\EasyAndFastGUI\\Controls\\close_black.bmp"
#resource "\\Images\\EasyAndFastGUI\\Controls\\close_white.bmp"
#resource "\\Images\\EasyAndFastGUI\\Controls\\full_screen.bmp"
#resource "\\Images\\EasyAndFastGUI\\Controls\\minimize_to_window.bmp"
#resource "\\Images\\EasyAndFastGUI\\Controls\\up_thin_white.bmp"
#resource "\\Images\\EasyAndFastGUI\\Controls\\down_thin_white.bmp"
#resource "\\Images\\EasyAndFastGUI\\Controls\\help.bmp"
//---
bool CWindow::CreateButtons(void)
  {
//--- Если тип программы "скрипт", выйдем
   if(CElementBase::ProgramType()==PROGRAM_SCRIPT)
      return(true);
//--- Счётчик, размер, количество
   int i=0,x_size=20;
   int buttons_total=4;
//--- Путь к файлу
   string icon_file="";
//--- Исключение в области захвата
   m_right_limit=0;
//---
   CButton *button_obj=NULL;
//---
   for(int b=0; b<buttons_total; b++)
     {
      //---
      if(b==0)
        {
         CElementBase::LastId(LastId()-1);
         m_button_close.MainPointer(this);
         if(!m_close_button)
            continue;
         //---
         button_obj=::GetPointer(m_button_close);
         icon_file ="Images\\EasyAndFastGUI\\Controls\\close_white.bmp";
        }
      else if(b==1)
        {
         m_button_fullscreen.MainPointer(this);
         //--- Выйти, если (1) кнопка не включена или (2) это диалоговое окно
         if(!m_fullscreen_button || m_window_type==W_DIALOG)
            continue;
         //---
         button_obj=::GetPointer(m_button_fullscreen);
         icon_file="Images\\EasyAndFastGUI\\Controls\\full_screen.bmp";
        }
      else if(b==2)
        {
         m_button_collapse.MainPointer(this);
         //--- Выйти, если (1) кнопка не включена или (2) это диалоговое окно
         if(!m_collapse_button || m_window_type==W_DIALOG)
            continue;
         //---
         button_obj=::GetPointer(m_button_collapse);
         if(m_is_minimized)
            icon_file="Images\\EasyAndFastGUI\\Controls\\down_thin_white.bmp";
         else
            icon_file="Images\\EasyAndFastGUI\\Controls\\up_thin_white.bmp";
        }
      else if(b==3)
        {
         m_button_tooltip.MainPointer(this);
         //--- Выйти, если (1) кнопка не включена или (2) это диалоговое окно
         if(!m_tooltips_button || m_window_type==W_DIALOG)
            continue;
         //---
         button_obj=::GetPointer(m_button_tooltip);
         icon_file ="Images\\EasyAndFastGUI\\Controls\\help.bmp";
        }
      //--- Свойства
      button_obj.Index(i);
      button_obj.XSize(x_size);
      button_obj.YSize(x_size);
      button_obj.IconXGap(2);
      button_obj.IconYGap(2);
      button_obj.BackColor(m_caption_color);
      button_obj.BackColorHover((b<1)? C'242,27,45' : C'0,150,245');
      button_obj.BackColorPressed((b<1)? C'149,68,116' : C'0,160,255');
      button_obj.BackColorLocked(m_caption_color_locked);
      button_obj.BorderColor(m_caption_color);
      button_obj.BorderColorHover(m_caption_color);
      button_obj.BorderColorLocked(m_caption_color_locked);
      button_obj.BorderColorPressed(m_caption_color);
      button_obj.IconFile(icon_file);
      button_obj.IconFileLocked(icon_file);
      if(b==3)
        {
         button_obj.TwoState(true);
         button_obj.IconFilePressed(icon_file);
         button_obj.IconFilePressedLocked(icon_file);
        }
      button_obj.AnchorRightWindowSide(true);
      //--- Расчёт отступа для следующей кнопки
      m_right_limit+=x_size-((i<3)? 0 : 1);
      i++;
      //--- Создадим элемент
      if(!button_obj.CreateButton("",m_right_limit,0))
         return(false);
      //--- Добавить элемент в массив
      CElement::AddToArray(button_obj);
     }
//---
   return(true);
  }
 

Да, Анатолий, я обнаружил вот что.

В Ваших примерах кода к статье, в загружаемых файлах, файл MacdSampleWithFrames.mq5 по содержанию кода идентичен файлу MovingAverageWithFrames.mq5.

Просьба исправить. Спасибо.

 

Протестировал на другом терминале, где все файлы хранятся в папке %AppData\Roaming\MetaQuotes\Terminal\...

Та же ошибка. Что-то где-то не сошлось...