Обсуждение статьи "Разработка интерактивного графического пользовательского интерфейса на MQL5 (Часть 1): Создание панели"

 

Опубликована статья Разработка интерактивного графического пользовательского интерфейса на MQL5 (Часть 1): Создание панели:

В статье рассматриваются основные этапы создания и реализации панели графического пользовательского интерфейса (Graphical User Interface, GUI) с помощью языка MetaQuotes Language 5 (MQL5). Пользовательские панели утилит повышают качество взаимодействия с системой при торговле, упрощая типовые задачи и визуализируя важную торговую информацию. Создавая пользовательские панели, трейдеры могут оптимизировать рабочий процесс и сэкономить время при торговых операциях.

Создадим панель графического интерфейса, где будут наиболее распространенные служебные инструменты, которые могут понадобиться трейдеру, поэтому постараемся описать и охватить всё в этой серии статей. В связи с этим количество необходимых элементов велико, но мы ограничим их группами для удобства понимания. Для разработки графического интерфейса будем использовать 4 элемента, и именно с их помощью создадим его. В панель войдут создание торговых кнопок, четких прямоугольников, обновления в реальном времени, использование эмодзи, шрифтов разного стиля, меток, подвижных элементов панели и эффектов наведения. Для иллюстрации всего этого — пример ниже.

ПРИМЕР ГРАФИЧЕСКОГО ИНТЕРФЕЙСА

Автор: Allan Munene Mutiiria

 
Отличные учебники... Хорошая работа
 
Isaac Amo #:
Отличные учебники... Хорошая работа

@Isaac Amo Я ценю отзывы и признание. Я польщен. Спасибо.

 

Очень мило с вашей стороны поделиться этой статьей. Удачная находка

 
Malcolm Campbell #:

Очень мило с вашей стороны поделиться этой статьей. Удачная находка

Спасибо @Malcolm Campbell за добрый отзыв и рецензию.

 
Какой то байт. На обложке красивый цветной интерфейс, а тут окно из Windows XP) 
Статья полезная, спасибо.
 
Petr Zharuk #:
Немного байтов. На обложке красивый цветной интерфейс, а здесь окно из Windows XP)
Статья полезная, спасибо.
Здравствуйте. Спасибо за ваш добрый отзыв. Очень ценю это. Спасибо и добро пожаловать.
 

Можно ли сделать так, чтобы эта панель свободно двигалась? Можно ли сделать так, чтобы эта панель свободно двигалась?

 
Пока с телефона прочел по диагонали...
С компьютера буду подробнее читать и тоже буду делать интерфейс торговый на основе Вашей статьи. Пока только делал работающие кнопки покупка и продажа. Имею представление как это работает. Буду читать и тоже у себя на компьютере делать графический интерфейс! Давно хотел - очень полезная утилита для оптимизации торговых приказов.
 

Статья мне, как начинающему изучать MQL5, очень понравилась. Спасибо за статью. Но я подумал, что функция deinitialization может быть значительно сокращена, если ObjectDelete выполнять в цикле по всем созданным и сохраненным именам графических объектов. Для этого нужно добавить массив строк, счетчик графических объектов и операторы передачи имен в массив в функции создания и инициализации параметров графических объектов. У меня это сделано так:

#define ADDOBJ ArrayResize(objectsArray, objectCount+1);\
   objectsArray[objectCount] = objName;\
   objectCount++;

string objectsArray[];
int objectCount = 0;
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
// Удаляем созданные графические объекты
   for(int i = 0; i < objectCount; i++)
     {
      if(ObjectFind(0, objectsArray[i]) >= 0)
        {
         ObjectDelete(0, objectsArray[i]);
         //           Print("Объект удален: ", objectsArray[i]);
        }
     }
  }

Ещё я добавил:

input int base_x = 300;  // Left indent
input int base_y = 100;  // Top indent
input bool Include_DropDown = false; // Show DropDown
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   CreatPanel();
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|    Function to create Panel                                      |
//+------------------------------------------------------------------+
void CreatPanel()
  {
   createRecLabel("MAIN_REC",10,30,250,400,clrWhite,1,clrBlack);
   createRecLabel("MAIN_SUB_REC",15,35,240,390,C'245,245,245',1,clrNONE);
   createRecLabel("MAIN_LINE_UP",15,35,240,1,C'245,245,245',1,clrNONE,BORDER_RAISED);
...

   if(Include_DropDown)
     {
      createDropDown();
     }
   ChartRedraw(0);
  }
А в функции создания доработал так:

 

А функции создания графических объектов немного изменил:

//+------------------------------------------------------------------+
//|     Function to create text label                                |
//+------------------------------------------------------------------+
bool createLabel(string objName, int xD, int yD,
                 string txt, color clrTxt = clrBlack, int fontSize = 12,
                 string font = "Arial Rounded MT Bold")
  {
   ResetLastError();

   if(!ObjectCreate(0, objName, OBJ_LABEL, 0, 0, 0))
     {
      Print(__FUNCTION__, ": failed to create the label! Error code = ", _LastError);
      return (false);
     }

   ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, base_x + xD); // Add base_x +
   ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, base_y + yD); // Add base_y +
   ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_LEFT_UPPER); 
   ObjectSetString(0, objName, OBJPROP_TEXT, txt);
   ObjectSetInteger(0, objName, OBJPROP_COLOR, clrTxt);
   ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, fontSize);
   ObjectSetString(0, objName, OBJPROP_FONT, font);
   ObjectSetInteger(0, objName, OBJPROP_BACK, false);
   ObjectSetInteger(0, objName, OBJPROP_STATE, false);
   ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, false);
   ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);

   ADDOBJ 

   return (true);
  }