Изучение стандартной библиотеки MQL5 (Часть 7): Создание интерактивных меток позиций с помощью класса CCanvas
Содержание:
Введение
Добро пожаловать в эту часть серии, посвященной изучению стандартной библиотеки MQL5. Надеюсь, каждая статья была для вас полезной или вдохновляющей. По мере продвижения вы быстро поймете, что программирование на MQL5 — это путь, складывающийся из множества базовых элементов — всегда есть что-то новое, чему можно научиться, что можно усовершенствовать и открыть для себя. В конечном итоге, все эти усилия служат одной цели: предоставить трейдерам эффективные, надежные и хорошо продуманные торговые инструменты.
В этой части мы рассмотрим распространенную проблему юзабилити между окном графика и вкладкой Trade в окне Toolbox MetaTrader 5. Позиции обычно управляются из панели инструментов, где они часто отображаются вместе с другими ордерами и сделками, что затрудняет сосредоточение на конкретной позиции в реальном времени. Для решения этой проблемы мы предлагаем механизм маркировки позиций прямо на графике. Сопоставляя каждую открытую позицию с визуальной меткой, размещенной непосредственно на графике, можно мгновенно соотнести позицию с текущим движением цены и структурой рынка. Это повышает ясность, ускоряет принятие решений и позволяет определить, следует ли закрыть или удерживать позицию в зависимости от текущих рыночных условий.
Эта статья является продолжением предыдущего обсуждения оптимизации советников, созданных с помощью мастера, но с намеренным изменением акцента. Вместо того чтобы углубляться в оптимизацию на этом этапе, мы делаем шаг назад и возвращаемся к более простому подходу, чтобы лучше закрепить материал. Части 4, 5 и 6 заложили основу для работы с мастером и его доступными модулями, предложив практическую отправную точку для создания советников с минимальным количеством кода. Хотя оптимизация, естественно, вызывает множество вопросов — и остается важной темой — она достаточно обширна, чтобы заслуживать отдельного внимания в дальнейшем в этой серии, где мы рассмотрим ее более подробно.
В следующем разделе мы сосредоточимся на понимании ключевой концепции, лежащей в основе сегодняшнего обсуждения, прежде чем перейти к реализации. Этот концептуальный слой является наиболее важной частью статьи, поскольку он описывает, как работает решение и почему оно важно. Пожалуйста, уделите время, чтобы как следует разобраться в этой части, прежде чем переходить к реализации.
Концепция
В MetaTrader 5 управление позициями чаще всего осуществляется через вкладку Trade в окне Toolbox. По мере роста количества открытых позиций и отложенных ордеров такой подход, основанный на списке, может быстро стать громоздким и менее интуитивно понятным. Что еще важнее, важная контекстная информация, такая как структура рынка и поведение цены на момент открытия позиции, остается визуально оторванной от самой позиции.
Хотя MetaTrader 5 уже предоставляет некоторые базовые функции управления позициями на графике, их возможности ограничены. Уровни входа, тип ордера, размер лота и цену ордера можно увидеть непосредственно на графике, как показано на диаграмме ниже.

Рис. 1. Управление позициями по умолчанию на графике
На рис. 1 на графике отображается уровень входа в позицию, а также ее тип и объем, в то время как цена продолжает обновляться в реальном времени по правой оси. Однако отсутствует один важный элемент: четкая, динамическая визуализация прибыли и убытков на уровне позиции. Кроме того, элементы графика по умолчанию предлагают мало гибкости в плане оформления и не предоставляют прямого, интуитивно понятного способа быстрого закрытия позиции непосредственно с графика. Хотя закрытие сделок возможно через контекстное меню, вызываемое щелчком правой кнопки мыши, и вкладку Trade, здесь мы сосредоточимся на максимальном использовании возможностей, которые предоставляет только график.
Эти ограничения указывают на возможность улучшения, которой можно воспользоваться с помощью стандартной библиотеки MQL5. Расширив график пользовательскими интерактивными визуальными элементами, мы можем устранить разрыв между данными о сделках и движением цены. В следующем разделе мы представим концептуальное решение, которое обеспечивает информацию о позиции, отображение прибыли в реальном времени и прямую возможность быстро закрыть позицию прямо с графика. Хотя оно доступно на вкладке Trade, мы сосредоточимся на текущих возможностях графика. Ниже я поделюсь нашим концептуальным решением этой проблемы.

Рис. 2. Концептуальный плавающий пузырь с информацией о позиции
На рис. 2 мы концептуально описываем метод маркировки позиций с использованием графических выносок, чтобы проиллюстрировать, как тикеты ордеров и прибыль или убыток в реальном времени можно представить непосредственно на графике. Вместо того чтобы полагаться исключительно на вкладку Trade, позиции отображаются в виде интерактивных выносок, привязанных к соответствующей цене и времени, что позволяет с первого взгляда оценить структуру рынка и эффективность сделок.
Эта концепция переносит управление позициями из оторванного списка непосредственно в торговый контекст. Визуально связывая каждую позицию с точкой входа, мы получаем мгновенное представление о поведении цены относительно сделки, что делает оценку и принятие решений быстрее и интуитивнее.
Система организована в три основных уровня. Слой логики стратегии определяет, когда и как открываются позиции. Слой визуализации отвечает за отображение информации о позициях на графике с помощью четкой и информативной графики. Наконец, слой взаимодействия обеспечивает прямой пользовательский ввод, позволяя управлять позициями с помощью простых действий мыши.
Вместе эти слои демонстрируют, как торговая логика, визуализация графика и взаимодействие с пользователем могут быть согласованно объединены с помощью стандартной библиотеки MQL5, формируя основу для более продвинутых и интуитивно понятных торговых инструментов в будущих реализациях.
Компоненты стандартной библиотеки, используемые в проекте
В ходе этого обсуждения вы познакомитесь с несколькими ключевыми файлами стандартной библиотеки MQL5 и их ролью в проекте:
- Canvas — для создания пользовательской графики, рисования фигур, текста и интерактивных элементов
- PositionInfo — для чтения данных о позициях в реальном времени, таких как номер тикета, цена при открытии и прибыль
- Trade — для программного выполнения и закрытия сделок
- Trend — для построения и доступа к индикаторам скользящих средних в рамках стратегии
Более подробная информация об использовании и комбинировании каждого из этих модулей будет рассмотрена в разделе реализации, где полный код наглядно демонстрирует эти концепции.
Реализация
В этом разделе мы переходим от концепции к реализации. Цель состоит не в создании замысловатой торговой стратегии, а в демонстрации того, как различные компоненты стандартной библиотеки MQL5 могут быть объединены в целостную интерактивную систему.
На протяжении всего этого пошагового руководства помните, что каждый используемый здесь класс может быть использован повторно и после завершения этого проекта. Интерактивный модуль меток позиций (Interactive Position Labeler) — это просто средство, позволяющее нам изучать эти компоненты практическим, визуальным и интуитивно понятным способом в данном контексте.
В любой программе на MQL5 компилятор первым делом сталкивается с метаданными, а не с функциональностью. Этот раздел заголовка определяет, что представляет собой программа, а не что она делает. Такие свойства, как имя файла, заголовок, авторские права, версия и описание, служат формальной идентификацией. Они используются MetaTrader для отображения информации в Навигаторе, Тестере стратегий и журналах.
//+------------------------------------------------------------------+ //| Part7_InteractivePositionLabeler.mq5| //| Copyright 2025, MQL5 Standard Lib Explorer| //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Clemence Benjamin" #property version "1.00" #property description "Interactive Position Info Bubbles with MA Cross Strategy"
Только после этого блока метаданных мы начинаем собирать базовые элементы программы, включая файлы из стандартной библиотеки. Этот порядок не просто стилистический; он отражает четкую логику построения: сначала мы определяем, что это за программа, а затем решаем, какие возможности ей необходимы. Директивы #include подключают готовые классы, находящиеся в корневом каталоге установки MQL5 — папке MQL5\Include\. Понимание этого корневого каталога крайне важно, поскольку почти все компоненты стандартной библиотеки ответвляются от него в хорошо организованные подпапки, такие как Trade, Canvas, Indicators, Controls и многие другие.
1. Включение стандартной библиотеки:
Начнем со сборки ее инструментов, как показано в приведенном ниже коде. Вместо написания кода для отрисовки пикселей или размещения сделок мы импортируем специализированные классы из стандартной библиотеки.
//--- 1. INCLUDES #include <Canvas\Canvas.mqh> // For drawing custom graphics #include <Trade\PositionInfo.mqh> // For reading trade details #include <Trade\Trade.mqh> // For executing trades #include <Indicators\Trend.mqh> // For Moving Averages
Эти четыре заголовочных файла определяют функциональный охват приложения. Каждый из них представляет собой конкретную область, обрабатываемую стандартной библиотекой:
| Файл библиотеки | Описание |
|---|---|
| Canvas: | Предоставляет класс CCanvas для отрисовки пикселей непосредственно на графике. Это основной визуальный движок проекта, который позволяет создавать пользовательские фигуры, прозрачность, отрисовку текста и интерактивные наложения, выходящие за рамки стандартных объектов графика. |
| PositionInfo: | Предоставляет доступ к классу CPositionInfo, который представляет собой объектную обертку с сохранением состояния для работы с открытыми позициями. Вместо многократного запроса свойств отдельных позиций, система выбирает позицию один раз и работает с ней как с объектом. |
| Trade: | Содержит класс CTrade, высокоуровневый интерфейс для выполнения и управления сделками. Он абстрагирует тикеты ордеров, результаты выполнения и обработку ошибок, позволяя логике стратегии оставаться лаконичной и читаемой. |
| Trend: | Поддерживает классы индикаторов, такие как CiMA. Эти классы объединяют обработку индикаторов в рамках согласованного API (Create → Refresh → Main), что упрощает расширение или замену индикаторов без реструктуризации кода стратегии. |
На этом этапе мы уже видим ключевую идею стандартной библиотеки: каждый класс решает конкретную задачу и легко интегрируется с другими.
2. Входные параметры и глобальные переменные: позволяем библиотеке взять на себя основную работу
Мы определяем перечисление, которое позволяет нам переключаться между несколькими геометриями пузырьков. Абстрагируя формы в перечисление, мы избегаем жестко заданной логики размещения и делаем систему рендеринга расширяемой.
Затем объявляем входные параметры, разделяя конфигурацию стратегии и визуальную конфигурацию. Это разделение гарантирует, что визуальные эксперименты не влияют на торговую логику.
//--- 2. INPUTS enum EnumBubbleShape { SHAPE_ROUNDED_RECT, SHAPE_CIRCLE, SHAPE_TRIANGLE }; input group "Strategy Settings" input int InpFastMA = 10; // Fast MA Period input int InpSlowMA = 20; // Slow MA Period input int InpSL = 300; // Stop Loss (Points) input int InpTP = 600; // Take Profit (Points) input group "Visual Settings" input EnumBubbleShape InpShape = SHAPE_TRIANGLE; // Default to test layout logic //--- 3. GLOBAL OBJECTS CCanvas ExtCanvas; // The drawing canvas CPositionInfo ExtPosition; // Position reader CTrade ExtTrade; // Execution module CiMA ExtFastMA; // Fast Moving Average CiMA ExtSlowMA; // Slow Moving Average
Вместо ручного вычисления скользящих средних мы используем объекты CiMA для буферизации и перерасчета. Эти объекты объявлены глобально, поскольку они представляют собой постоянные системные компоненты:
- CTrade поддерживает контекст выполнения (например, magic number).
- CPositionInfo служит служит перемещаемым курсором по позициям.
- CCanvas представляет собой долговременную поверхность для рисования (ее пересоздание при каждом тике привело бы к снижению производительности).
3. Структура Hitbox: обеспечение взаимодействия
Поскольку canvas не имеет встроенного понятия кнопок, мы реализуем собственную структуру для определения области нажатия (hitbox). Это позволяет нам связывать области на экране с тикетами позиций.
Каждый раз при рисовании кнопки закрытия, мы регистрируем область, по которой можно нажать. Позже мы будем оценивать щелчки мыши по этим границам.
//--- HITBOX STRUCTURE (For Mouse Clicks) struct BubbleHitbox { ulong ticket; int x1, y1, x2, y2; }; BubbleHitbox ExtHitboxes[]; // Dynamic array to store clickable areas
Эта простая структура позволяет нам сопоставлять визуальный прямоугольник (координаты от (x1, y1) до (x2, y2)) с конкретным торговым тикетом. Этот паттерн, разделяющий визуальное представление и логическую область, может быть использован повторно для кнопок, ползунков или любых пользовательских элементов управления, которые вы можете создать в будущем.
4. Инициализация: подготовка компонентов
При запуске советника функция OnInit() выполняет роль стартовой инициализации всей системы. Все, что находится внутри этой функции, выполняется только один раз, и ее задача — обеспечить успешное создание всех необходимых компонентов до начала работы советника. Если на этом этапе не удастся инициализировать какую-либо критически важную подсистему, функция завершится досрочно, и советник никогда не перейдет в рабочий режим.
int OnInit() {
Первая операция инициализирует индикатор быстрой скользящей средней. На этом этапе он еще не вычисляет значения; вместо этого он запрашивает у MetaTrader 5 выделение хэндла индикатора и привязку его к текущему символу и таймфрейму. Индикатор настраивается как простая скользящая средняя, применяемая к ценам закрытия. Если платформа по какой-либо причине не может создать индикатор, инициализация немедленно прерывается, чтобы предотвратить неопределенное поведение стратегии.
if(!ExtFastMA.Create(_Symbol, _Period, InpFastMA, 0, MODE_SMA, PRICE_CLOSE)) return(INIT_FAILED);
Сразу после этого таким же образом создается медленная скользящая средняя. Выполняя этот шаг во время инициализации, мы гарантируем, что оба индикатора существуют и готовы к последующему обновлению во время выполнения программы в реальном времени. Как и в случае с быстрой скользящей средней, сбой на этом этапе останавливает советник до того, как он сможет работать в незавершенном состоянии.
if(!ExtSlowMA.Create(_Symbol, _Period, InpSlowMA, 0, MODE_SMA, PRICE_CLOSE)) return(INIT_FAILED);
После того, как индикаторы стратегии будут установлены, график настраивается для пересылки событий, связанных с мышью, советнику. Это позволяет программе получать подробные данные о взаимодействии с пользователем, такие как движение мыши и щелчки, через обработчик OnChartEvent(). Этот шаг необходим для любого интерактивного интерфейса графика, построенного на canvas, поскольку он позволяет графическим элементам реагировать на ввод пользователя.
ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, true);
Следующий блок создает canvas, на котором будут размещены все визуальные элементы. Выделяется и позиционируется в верхнем левом углу графика графическая метка, ширина и высота которой точно соответствуют пиксельным размерам графика. Это растровое изображение действует как внеэкранная поверхность рендеринга, позволяя нам эффективно рисовать фигуры, текст и компоненты пользовательского интерфейса. Цветовой формат ARGB обеспечивает прозрачность, гарантируя естественное слияние визуальных элементов с фоном графика. Если растровое изображение создать не удаётся, инициализация завершается неудачей, поскольку советник использует этот canvas для интерактивного отображения.
if(!ExtCanvas.CreateBitmapLabel("TradeBubblesCanvas", 0, 0, (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS), (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS), COLOR_FORMAT_ARGB_NORMALIZE)) return(INIT_FAILED);
После успешного создания canvas настраивается шрифт по умолчанию, используемый для отрисовки всего текста. Установив шрифт один раз во время инициализации, с каждым последующим вызовом отрисовки текста автоматически будет использоваться тот же шрифт и размер. Такой подход повышает производительность и обеспечивает визуальную согласованность всех отрисовываемых элементов.
ExtCanvas.FontSet("Calibri", 16);
Наконец, функция сигнализирует об успешной инициализации. На этом этапе все необходимые системы — индикаторы, события графика и поверхность отрисовки — полностью подготовлены. Возврат INIT_SUCCEEDED позволяет MetaTrader перевести советник в активное состояние, где он может начать получать тики и события графика.
return(INIT_SUCCEEDED); }
Обратите внимание на флаг COLOR_FORMAT_ARGB_NORMALIZE при создании canvas. Это критически важно. Он указывает стандартной библиотеке на необходимость поддержки альфа-канала (прозрачности). Без этого наш слой был бы сплошным черным, полностью скрывая график цены.
5. OnTick(): Разделение стратегии и визуализации
Когда поступает новый тик рынка, советник выполняет функцию OnTick(), которая координирует все последующие действия. Эта функция отвечает за проверку условий стратегии и эффективное управление обновлениями визуального контента. В этом процессе советник постоянно отслеживает рыночные условия, проверяет существующие позиции и определяет, следует ли рисовать на графике или совершать сделки.
В начале каждого тика советник обновляет свои индикаторы скользящих средних, чтобы убедиться, что он работает с самыми актуальными рыночными данными. Это мгновенное обновление гарантирует, что любые последующие оценки цены или пересечения основаны на текущих значениях, а не на устаревшей информации.
Далее советник проверяет наличие открытых позиций. Если таковых не обнаружено, советник оценивает, нужно ли открывать новую сделку. Для этого используется вызов PositionsTotal(), который обеспечивает правило одной открытой позиции — предотвращения перекрывающихся сделок и контроля риска.
Советник также проверяет условия выполнения перед тем, как что-либо нарисовать. Если он работает в тестере стратегий без включенного визуального режима, он полностью пропускает отрисовку для экономии ресурсов.
Для обновлений визуальных элементов советник использует внутренний таймер для регулирования частоты кадров. На каждом тике он сравнивает текущее системное время с временной меткой последнего визуального обновления. Новая процедура отрисовки запускается только через заданный интервал времени, поддерживая баланс между плавностью изображения и производительностью — обычно около 30 кадров в секунду.
//+------------------------------------------------------------------+ //| Expert tick function (SPEED OPTIMIZED) | //+------------------------------------------------------------------+ void OnTick() { // --- PRIORITY 1: STRATEGY (Always Run) --- // We never skip this. The EA must react to every price change instantly. ExtFastMA.Refresh(-1); ExtSlowMA.Refresh(-1); if(PositionsTotal() == 0) { CheckStrategy(); } // --- PRIORITY 2: VISUALS (Throttled) --- // Optimization A: If running a backtest WITHOUT visual mode, skip drawing completely. if(MQLInfoInteger(MQL_TESTER) && !MQLInfoInteger(MQL_VISUAL_MODE)) return; // Optimization B: Frame Rate Limiter (Max 30 FPS) static uint last_render_time = 0; uint current_pc_time = GetTickCount(); if(current_pc_time - last_render_time > 30) { DrawBubbles(); last_render_time = current_pc_time; } }
За счет ограничения частоты рендеринга до ~30 кадров в секунду с помощью функции GetTickCount(), мы позволяем торговой логике работать на максимальной скорости, сохраняя при этом низкую загрузку центрального процессора. Этот подход применим к любому дашборду или панели, которые вы создадите.
6. Стратегическая логика: использование классов индикаторов
Сама стратегия проста и предназначена только для генерации позиций для визуализации.
void CheckStrategy() { // Request indicator values through the library API double fast0 = ExtFastMA.Main(0); double fast1 = ExtFastMA.Main(1); double slow0 = ExtSlowMA.Main(0); double slow1 = ExtSlowMA.Main(1); // ... (Symbol Info & Trade Logic) ... // Example: Golden Cross if(fast1 < slow1 && fast0 > slow0) { double sl = ask - (InpSL * point); double tp = ask + (InpTP * point); // Clean execution using CTrade ExtTrade.Buy(0.10, _Symbol, ask, sl, tp, "MA_Cross_Buy"); } // ... (Sell Logic Symmetrical) ... }
Мы используем ExtFastMA.Main(index) для удобного доступа к значениям буфера. Эта абстракция предотвращает распространенные ошибки "массив вне диапазона", связанные с обычными массивами.
7. Слой отрисовки: от рыночных данных к пикселям экрана
Эта функция связывает торговые данные (Time/Price) с визуализацией (X/Y Pixels).
void DrawSingleBubble() { // ... (Get Position Data) ... int x, y; // Convert Market Info to Screen Pixels // This function aligns graphics with candles during scrolling if(!ChartTimePriceToXY(0, 0, time, open_price, x, y)) return; // ... (Color and Shape Logic) ... // Example: Drawing the Text ExtCanvas.TextOut(text_x_final, text_y_final, text, text_color, text_align_final); // Example: Registering the Hitbox for the "X" button int new_idx = ArraySize(ExtHitboxes); ArrayResize(ExtHitboxes, new_idx + 1); ExtHitboxes[new_idx].ticket = ticket; ExtHitboxes[new_idx].x1 = btn_x1_final; // ... (Save coordinates) ... }
Функция ChartTimePriceToXY является ключевой. Она преобразует цену открытия сделки в пиксельные координаты. После преобразования API CCanvas берет на себя рисование фигур, смешивание цветов и отображение текста. Обратите внимание, что мы немедленно сохраняем местоположение кнопки в ExtHitboxes во время ее отрисовки.
8. Слой взаимодействия: создание кликабельных графических элементов
Наконец, мы связываем ввод пользователя с действиями библиотеки.
//+------------------------------------------------------------------+ //| Chart Event Handler (Clicks & Scrolls) | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { // Handle Resizing/Scrolling if(id == CHARTEVENT_CHART_CHANGE) { ExtNeedResize = true; DrawBubbles(); } // Handle Clicks if(id == CHARTEVENT_CLICK) { int mouse_x = (int)lparam; int mouse_y = (int)dparam; for(int i = 0; i < ArraySize(ExtHitboxes); i++) { // Check if click is inside a button's hitbox if(mouse_x >= ExtHitboxes[i].x1 && mouse_x <= ExtHitboxes[i].x2 && mouse_y >= ExtHitboxes[i].y1 && mouse_y <= ExtHitboxes[i].y2) { Print("Interactive Close: Ticket #", ExtHitboxes[i].ticket); // Use Standard Library to close the specific ticket ExtTrade.PositionClose(ExtHitboxes[i].ticket); DrawBubbles(); return; } } } }
Обрабатывая CHARTEVENT_CLICK, мы завершаем цикл:
- Ввод пользователя: обнаружен клик.
- Визуальная логика: проверяем ExtHitboxes, чтобы узнать, была ли нажата кнопка.
- Исполнение сделки: для выполнения команды используется ExtTrade.PositionClose.
Эта модель взаимодействия превращает статический график в динамический торговый инструмент.
Тестирование и результаты
Теперь, когда мы создали систему, пришло время увидеть ее в действии. Откройте тестер стратегий в MetaTrader 5 и выберите файл Part7_InteractivePositionLabeler.ex5. Перед нажатием кнопки Start убедитесь, что визуальный режим с отображением графиков включен.
Поскольку эта функция основана на отрисовке графиков в реальном времени и взаимодействии с мышью, во время тестирования оптимизацию необходимо отключить. Всегда используйте один визуальный запуск в тестере стратегий при проверке интерактивных компонентов, таких как метки и кнопки на основе Canvas.
Когда советник будет выполнять стратегию пересечения скользящих средних, вы увидите, как пользовательские метки мгновенно появляются рядом с каждой новой позицией. Эти метки обновляют свои значения прибыли и цвета в реальном времени по мере движения цен.
Чтобы проверить интерактивность на графике в реальном времени, просто наведите курсор на красную кнопку X на любой метке и нажмите на неё. Соответствующая сделка немедленно закроется, и метка исчезнет с графика.
Изучите скриншоты ниже, чтобы увидеть результаты моего тестирования в действии.

Рис. 3. Тестирование на графике в реальном времени

Рис. 4. Тестирование в визуализации тестера стратегий
Полный, компилируемый исходный код этого проекта прилагается в конце этой статьи. Скачайте его, скомпилируйте и начните изучать возможности стандартной библиотеки MQL5.
Заключение
В этой части серии "Изучение стандартной библиотеки MQL5" мы успешно создали советник Интерактивный модуль меток позиций, объединяющий логику стратегии с динамической визуализацией графика. Мы определили и инициализировали глобальные объекты для индикаторов, canvas и управления сделками, изучили, как получать доступ к открытым позициям как объектам через CPositionInfo, эффективно выполнять торговые операции с помощью CTrade и рассчитывать скользящие средние с помощью CiMA из библиотеки Trend. В то же время мы изучили CCanvas для рисования на уровне пикселей, создавая интерактивные пузырьки, которые отображают информацию о позициях и реагируют на щелчки непосредственно на графике.
В рамках этого проекта мы поделились опытом использования стандартной библиотеки MQL5 для обеспечения согласованного высокоуровневого интерфейса для различных аспектов торговых систем. Мы научились эффективно управлять ресурсами, регулировать скорость отрисовки для поддержания производительности и обрабатывать события графиков, чтобы сделать визуализации интерактивными. Помимо этого советника, вы можете использовать тот же подход для маркировки любой позиции на графике, даже тех, которые открыты вручную или другими советниками, поскольку в этом контексте не использовалось магическое число.
Вы можете протестировать эту функцию на своем счете или в демо-среде, поэкспериментировать с различными формами пузырьков, настройками индикаторов и несколькими символами, а также понаблюдать за реакцией canvas и интерактивной логики.
Ваш опыт и идеи ценны, поэтому поделитесь своими мыслями в разделе комментариев. Эта обратная связь поможет нам в следующей части серии, где мы продолжим более глубокое изучение возможностей стандартной библиотеки MQL5. До следующей части, успешного программирования и интересной работы с графиками!
Вложения
| Название исходного файла | Описание: |
|---|---|
| Part7_InteractivePositionLabeler.mq5 | Полный исходный код советника Интерактивный модуль меток позиций, включающий стратегию MA Cross и интеграцию с CCanvas. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20892
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Возможности Мастера MQL5, которые вам нужно знать (Часть 88): Использование фильтра Блума с пользовательским классом трейлинга
Создание торговых систем с искусственным интеллектом на MQL5 (Часть 9): Создание диспетчера сигналов ИИ
Нейросети в трейдинге: Долговременная память торговых сценариев (Окончание)
Возможности Мастера MQL5, которые вам нужно знать (Часть 87): Управление капиталом с масштабированием по волатильности на основе монотонной очереди в MQL5
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования