Как установить текстовую метку

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Как установить текстовую метку

Сообщение Kalkin » 31 авг 2017, 13:08

В работе с графическими объектами Метатрейдера 4 нет ничего сложного. Особенно сейчас, когда при поставке терминала заодно предоставляются уже готовые классы для упрощения процесса программирования. На примере создания текстовой метки посмотрим, как применить готовые решения с использованием объектно ориентированного программирования (ООП).
Текстовая метка МТ4 привязывается к окну графика и сохраняет свое положение независимо от положения баров. Очень удобно выводить в текстовые метки самые различные значения состояния торгового счета, так как можно настроить размер шрифта, цвет, выбрать удобное расположение и т.п. (в отличие от обычного комментария, который пишется мелким шрифтом, начиная с левого верхнего угла экрана).

В качестве примера, чтобы была хоть какая-то польза, сделаем индикатор максимально допустимого лота с выводом в текстовую метку, используя при этом ООП. В качестве параметров для индикатора введем:
  • Цвет метки
  • Угол привязки текста
  • Смещение метки по горизонтали от угла привязки
  • Смещение метки по вертикали от угла привязки
  • Размер шрифта
Код: выделить все
input color             LabelColor     = clrGold;              // Цвет метки
input ENUM_BASE_CORNER  LabelCorner    = CORNER_LEFT_UPPER;    // Угол привязки текста
input int               Label_X        = 10;                   // Смещение метки по горизонтали от угла привязки
input int               Label_Y        = 10;                   // Смещение метки по вертикали от угла привязки
input int               LabelFontSize  = 16;                   // Размер шрифта

Вот так должно будет выглядеть окно с индикатором:
KI_MaxLot внешний вид.png


Класс для текстовых меток находится в файле ChartObjectsTxtControls.mqh. Чтобы присоединить его к нашей программе, вводим директиву:
Код: выделить все
#include <ChartObjects\\ChartObjectsTxtControls.mqh>

И объявляем экземпляр класса текстовой метки:
Код: выделить все
CChartObjectLabel lblMaxLot;

Как видите, именно класс CChartObjectLabel занимается текстовыми метками, поэтому его и будем использовать. В данном случае нам нет необходимости какого-то особого управления текстовой меткой, поэтому просто используем предоставленный класс по умолчанию. Если же предоставленных классом методов недостаточно, то всегда можно создать потомка класса CChartObjectLabel и добавить необходимую функциональность.
Методы класса CChartObjectLabel позволяют выполнить любые стандартные действия по настройке и управлению экземпляром объекта текстовой метки. Все их перечислять смысла нет, нам пока что нужно:
  • Создать метку на графике
  • Установить значения, указанные в качестве входных параметров индикатора
  • Отобразить максимальный лот
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Как установить текстовую метку

Сообщение Kalkin » 31 авг 2017, 13:33

Настройку текстовой метки можно выполнить один раз при запуске индикатора в функции инициализации. В первую очередь вызываем метод создания текстовой метки на экране, в котором указываем имя создаваемой метки и первоначальное расположение относительно угла привязки:
Код: выделить все
lblMaxLot.Create(0,"МаксЛот",0,Label_X,Label_Y);   // создаем метку с именем "МаксЛот"

Далее устанавливаем цвет, привязку к одному из углов экрана, размер шрифта:
Код: выделить все
      lblMaxLot.Color(LabelColor);                       // устанавливаем цвет
      lblMaxLot.Corner(LabelCorner);                     // устанавливаем угол привязки
      // приводим в соответствие угол привязки объекта с положением точки прявязки в самом объекте
      if (LabelCorner == CORNER_LEFT_UPPER)  lblMaxLot.Anchor(ANCHOR_LEFT_UPPER);
      if (LabelCorner == CORNER_LEFT_LOWER)  lblMaxLot.Anchor(ANCHOR_LEFT_LOWER);
      if (LabelCorner == CORNER_RIGHT_UPPER) lblMaxLot.Anchor(ANCHOR_RIGHT_UPPER);
      if (LabelCorner == CORNER_RIGHT_LOWER) lblMaxLot.Anchor(ANCHOR_RIGHT_LOWER);
      lblMaxLot.FontSize(LabelFontSize);                 // устанавливаем размер шрифта


Все, на этом настройка текстовой метки закончена, в дальнейшем нужно будет только менять выводимое значение самой метки. Для этого просто вызывается метод Description(...), в параметры которого передаем строку для вывода информации.

В секции расчета индикатора выполняем, собственно, расчет значения максимального лота:
Код: выделить все
   // вычисляем максимальный лот как отношение свободной маржи к необходимой для открытия одного лота
   double MarginReq = MarketInfo (Symbol(),MODE_MARGINREQUIRED);
   double MaxLot = 0;
   if (MarginReq!=0)
      MaxLot = AccountFreeMargin()/MarginReq;

Переносим полученное значение в строковую переменную, попутно нормализуя выводимое значение до допустимого значения десятичных знаков:
Код: выделить все
   // нормализуем лот:
   string SMaxLot = "MAX Lot = "+DoubleToString(MaxLot,GetLotDigits());

И, собственно, венец всего происходящего - запись значения в текстовую метку для отображения:
Код: выделить все
   // и заносим значение в текстовую метку
   lblMaxLot.Description(SMaxLot);

Индикатор KI_MaxLot можно скачать с вложения ниже.
Вложения
KI_MaxLot.mq4
(7.18 KB) Скачиваний: 68
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 50

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения