Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
Дисплей с оптимизацией для вывода текста в чарт по типу консоли - библиотека для MetaTrader 5
- Просмотров:
- 1436
- Рейтинг:
- Опубликован:
- 2021.03.10 22:17
- Обновлен:
- 2021.03.15 17:09
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Библиотека содержит два типа дисплеев. Первый, 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 различных режимах.
- Canvas
- Labels
- Labels с оптимизацией вывода текста
- Labels с фоном в виде Canvas
- Labels с фоном, плюс, оптимизация
Использование фона в режиме outType: Labels дает примерно такую же нагрузку, как и использование других дополнительных объектов чарта. То есть, незначительно увеличивает время вывода текста на дисплей.
Простая торговая стратегия по пользовательскому индикатору 'NonLagDot EA'
Sound Alert Entry In OutСоветник-утилита: звук и Push-сообщение при входе и выходе из сделки
Индикатор-утилита: подаёт сигнал, если цена пересекает прямоугольник
Price touched the object Delete AllСоветник-утилита: если цена пересекла линию - удаляем все отложенные ордера по данному символу