Смотри, как бесплатно скачать роботов
Ищи нас в Twitter!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Библиотеки

Дисплей с оптимизацией для вывода текста в чарт по типу консоли - библиотека для MetaTrader 5

Просмотров:
1332
Рейтинг:
(15)
Опубликован:
2021.03.10 22:17
Обновлен:
2021.03.15 17:09
\MQL5\Experts\canvas-vs-labels\demo\cyberdev\ \MQL5\Experts\canvas-vs-labels\demo\ \MQL5\Experts\canvas-vs-labels\measurement\cyberdev\ \MQL5\Experts\canvas-vs-labels\measurement\
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Библиотека содержит два типа дисплеев. Первый, LabelsDisplay, на основе CChartObjectLabel. Второй, CanvasDisplay, на основе CCanvas. Дисплеи оптимизированы по частоте отрисовки. Помимо основного эксперта, демонстрирующего работу дисплеев Demo.mq5, есть еще два варианта, CanvasVsLabelsTester.mq5, для выполнения замеров исключительно в тестере, на тиках. И универсальный CanvasVsLabels.mq5, который производит замеры, как в тестере, так и на графике. Данные замеры можно сравнивать между собой. Более подробно о сравнении скорости работы дисплеев можно узнать по ссылке Canvas vs Labels.

Замеры скорости отрисовки в чарте

Способ вывода в чарт

//+------------------------------------------------------------------+
//|                                             ChartDisplayDemo.mq5 |
//|                                       Copyright 2021, © Cyberdev |
//|                    https://www.mql5.com/en/users/cyberdev/seller |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, © Cyberdev"
#property link      "https://www.mql5.com/en/users/cyberdev/seller"
#property version   "1.00"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#include "cyberdev\ChartDisplay.mqh"

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
enum OutType { 
  otCanvas, // Canvas
  otLabels  // Labels
};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input OutType outType = otLabels; // outType - тип дисплея
input int nLines = 50; // nLines - количество строк на дисплее
input bool optimizeUpdate = false; // optimizeUpdate - оптимизация для Labels
input int bWidth = 406; // bWidth - ширина дисплея
input int lY_Dist = 14; // lY_Dist - расстояние между строками
input bool back = false; // back - фон для Labels

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
Strings * display;
CChart Chart;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
  Chart.Attach(ChartID());
  Chart.ShowGrid(false);
  Chart.ColorBackground(C'194,231,197');
  Chart.ColorBarUp(clrDodgerBlue);
  Chart.ColorBarDown(clrBlueViolet);
  Chart.ColorCandleBull(clrDodgerBlue);
  Chart.ColorCandleBear(clrBlueViolet);
  Chart.ColorForeground(clrBlack);
  switch (outType) {
  case otCanvas:
    display = new CanvasDisplay();
    break;
  case otLabels:
    display = new LabelsDisplay();
    break;
  default:
    return INIT_FAILED;
  }
  if ((outType == otLabels && back &&
       !dynamic_cast<LabelsDisplay *>(display).createExt(nLines, 10, 10, bWidth, lY_Dist)) || 
       !display.create(nLines, 10, 15, bWidth, lY_Dist))
    return INIT_FAILED;
  return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
  if (CheckPointer(display) == POINTER_DYNAMIC)
    delete display;
  Chart.Detach();
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#define concatenate(_rate)                                                         \
 ("Open: " + DoubleToString(rates[_rate].open, digits) +                           \
  "; High: " + DoubleToString(rates[_rate].high, digits) +                         \
  "; Low: " + DoubleToString(rates[_rate].low, digits) +                           \
  "; Close: " + DoubleToString(rates[_rate].close, digits) + ".")   
  

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
  MqlRates rates[];
  int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);
  static datetime time = 0;
  datetime cTime;
  static bool firstRun = true;
  bool triggered = false;
  if (CopyRates(NULL, PERIOD_CURRENT, 0, 2, rates) != 2)
    return;
  display.setText(concatenate(1));
  cTime = rates[0].time;
  if (cTime != time) {
    if (!firstRun) {
      display.push();
      display.setText(concatenate(0));
    }
    time = cTime;
    firstRun = false;
    triggered = true; 
  }
  if(outType == otLabels && optimizeUpdate) {
    if (triggered)
      display.update();
    else
      dynamic_cast<LabelsDisplay *>(display).updateOne();
  }
  else
    display.update();
}
//+------------------------------------------------------------------+

    Для обновления верхней строки нужно вызвать метод setText используемого класса. Для смещения текста на строку ниже предназначен метод  push используемого класса. И чтобы вывести добавленный/обновленный текст на дисплей используйте метод update любого из классов. Помимо данного метода у класса  LabelsDisplay есть дополнительный метод updateOne, который способен ускорить работу дисплея более чем в 2 раза. Вызывается он только когда нужно обновить верхнюю строку. Если же был вызван метод push, то после него обязательно нужно вызвать метод update, вместо updateOne.

    Входные параметры

    • outType - тип дисплея
    • nLines - количество строк на дисплее
    • optimizeUpdate - оптимизация для Labels
    • bWidth - ширина дисплея
    • lY_Dist - расстояние между строками
    • back - фон для Labels

    С помощью outType можно выбрать тип дисплея из значений Canvas или Labels. С помощью изменения nLines выставляется количество строк которые будут сохраняться после прокрутки методом push. Параметр  optimizeUpdate включает экономное обновление только одной строки, если метод push не был вызван и следовательно остальные строки обновлять не нужно (об этом рассказано выше). С помощью  bWidth можно настроить ширину дисплея (актуально для Canvas и Labels с использованием фона). С помощью параметра lY_Dist можно добиться желаемого размера шрифта. Размер шрифта берется от lY_Dist из которого вычитается часть, задаваемая коэффициентом fDec, что позволяет изменять настоящую высоту строки, а не размер шрифта без учета расстояния между строками. Параметр back включает фон в режиме Labels.

    Таким образом, можно выводить информацию в чарт в 5 различных режимах.

    1. Canvas
    2. Labels
    3. Labels с оптимизацией вывода текста
    4. Labels с фоном в виде Canvas
    5. Labels с фоном, плюс, оптимизация

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



    NonLagDot EA Simple NonLagDot EA Simple

    Простая торговая стратегия по пользовательскому индикатору 'NonLagDot EA'

    Sound Alert Entry In Out Sound Alert Entry In Out

    Советник-утилита: звук и Push-сообщение при входе и выходе из сделки

    Price touched the rectangle Alert Price touched the rectangle Alert

    Индикатор-утилита: подаёт сигнал, если цена пересекает прямоугольник

    Price touched the object Delete All Price touched the object Delete All

    Советник-утилита: если цена пересекла линию - удаляем все отложенные ордера по данному символу