
От новичка до эксперта: Создание анимированного советника для новостей в MQL5 (III) — Анализ индикаторов
Содержание:
Введение
Сегодня, мы вводим новую полосу «Анализ индикаторов» - основанную на правилах функцию на графике, разработанную для дополнения уже исследованных нами в предыдущих статьях (I и II) инструментах. Если вы еще не заметили, основная цель понятна: оптимизация интерфейса терминала MetaTrader 5 для компактного и эффективного доступа к основным торговым ресурсам — непосредственно на графике.
Большинство осцилляторов традиционно отображаются в отдельных подокнах под основным графиком, что фрагментирует рабочее пространство и занимает ценное пространство в пикселях. Чем больше индикаторов вы используете, тем больше сжимается ваш график, что ограничивает возможность четко видеть движение цены.Для решения этого вопроса мы упростим решение этих задач, внедрив полосу «Анализ индикаторов» на графике с использованием класса CCanvas. Это позволяет нам извлекать и обрабатывать значения индикаторов через MQL5 API и отображать значимые сигналы, не загромождая интерфейс. Я подготовил наглядный пример, иллюстрирующий как несколько подокон индикатора уменьшают размер основного представления графика.
На этом изображении показано, как окна индикатора влияют на график.
В следующем разделе мы расскажем о концепции, лежащей в основе этого подхода, прежде чем перейти к его реализации.
Концепция
Наш план состоит в том, чтобы по умолчанию ввести единую полосу прокрутки, отображающую информацию о четырех ключевых осцилляторах — индикаторах, предоставляющих трейдерам важные сигналы для принятия решений. Такая компактная конструкция уменьшает беспорядок на диаграммах и обеспечивает более чистый и сфокусированный вид. Однако пользователи, предпочитающие более подробную информацию, могут при желании разделить аналитическую информацию на отдельные полосы, каждая из которых посвящена определенному индикатору.
Глубокое понимание этих индикаторов необходимо для того, чтобы понять, как они поддерживают надежные торговые стратегии. После завершения этой настройки у вас будут заголовки новостей, экономический календарь и аналитические данные по индикаторам в режиме реального времени - все это будет объединено в одном интеллектуальном интерфейсе прямо на графике MetaTrader 5.
В ожидании будущих обновлений я также рассматриваю возможность добавления полосы информации аналитиков (Analyst Insights Lane) — выделенного пространства, в котором можно было бы размещать отредактированные аналитические материалы из публикаций профессиональных аналитиков. Благодаря доступу к их API-интерфейсам, эта функция может выводить комментарии экспертов и стратегические перспективы непосредственно на график, создавая мощное, готовое к принятию решения изображение для трейдеров.
Теперь, как для новичков, так и в назидание опытным трейдерам, давайте рассмотрим, как каждый из четырех осцилляторов, которые мы будем интегрировать, широко используется в торговле и как их объединенная информация может значительно улучшить процесс принятия решений в режиме реального времени.
Понимание RSI, CCI, Stochastic и MACD в торговле:
Индекс относительной силы (RSI)
RSI, разработанный Дж. Уэллсом Уайлдером (J. Welles Wilder) в 1978 году, представляет собой импульсный осциллятор, который измеряет скорость и изменение ценовых движений. В основном он используется для определения состояний перекупленности и перепроданности, а также потенциальных разворотов тренда. RSI особенно эффективен на рынках с ограниченным диапазоном, где цены колеблются между уровнями поддержки и сопротивления.
Расчет:
RSI обычно рассчитывается за 14-дневный период, хотя трейдеры могут настроить его для более коротких или длительных таймфреймов. Его формула:
Где RSI (индекс относительной силы) - это отношение среднего прироста к среднему убытку за указанный период. Средняя прибыль и убыток рассчитываются на основе изменений цен за отчетный период.
Ключевые уровни и трактовка:
Индекс RSI колеблется от 0 до 100, средняя точка находится на отметке 50.
- Значения выше 70 считаются перекупленными, что указывает на то, что актив может быть переоценен и может произойти коррекция вниз.
- Значения ниже 30 считаются перепроданными, что указывает на то, что актив может быть недооценен и может произойти отскок вверх.
- Значения выше 50 обычно указывают на бычий импульс, в то время как значения ниже 50 указывают на медвежий импульс.
Индекс относительной силы (RSI)
Торговые стратегии, основанные на RSI:
- Сигналы о перекупленности/перепроданности: Трейдеры часто ожидают пересечения RSI выше 30 в качестве потенциального сигнала к покупке, указывающего на то, что актив выходит из зоны перепроданности. И наоборот, преодоление уровня ниже 70 может сигнализировать о продаже, указывая на состояние перекупленности.
- Расхождение: RSI может сигнализировать о потенциальных разворотах через дивергенцию. Например, медвежья дивергенция возникает, когда цена достигает нового максимума, а RSI достигает более низкого максимума, что говорит об ослаблении импульса. Бычья дивергенция возникает, когда цена достигает нового минимума, а RSI достигает более высокого минимума.
- Подтверждение тренда: При восходящем тренде RSI, как правило, должен оставаться выше 50, в то время как при нисходящем тренде он должен оставаться ниже 50, помогая трейдерам определить направление тренда.
- Провальные колебания: Уайлдер определил "провальные колебания" как явные признаки разворота рынка, такие как RSI, который не смог подняться выше 70 после достижения 76, а затем упал ниже 72, сигнализируя о потенциальном развороте.
Пример применения:
Если RSI пересекает отметку выше 30 после того, как находится в зоне перепроданности (ниже 30), это может сигнализировать о возможности покупки, особенно если это сопровождается другими бычьими индикаторами, такими как пересечение скользящей средней. И наоборот, если RSI опустится ниже 70 после перекупленности, это может сигнализировать о возможности продажи.
Индекс товарного канала (CCI))
CCI - это осциллятор импульсов, первоначально разработанный для определения циклических колебаний цен на сырьевые товары, но в настоящее время используемый в различных классах активов, включая акции и валюты. Он измеряет текущий уровень цен относительно среднего уровня цен за определенный период, помогая трейдерам определить условия перекупленности/перепроданности и силу тренда. Он был представлен Дональдом Ламбертом (Donald Lambert) в 1980 году.
Расчет:
CCI обычно рассчитывается за 20-периодный таймфрейм, хотя его можно скорректировать. Его формула:
Где:
Типичная цена = (Максимум + минимум + Цена закрытия) / 3SMA = Простая скользящая средняя типичной цены за указанный период
Среднее отклонение = Среднее абсолютных отклонений типичной цены от SMA
Коэффициент 0,015 используется для масштабирования результатов для удобства чтения.
Ключевые уровни и трактовка:
- CCI колеблется около нуля, без верхней или нижней границы.
- Значения выше +100 указывают на состояние перекупленности, что указывает на потенциальные возможности продажи.
- Значения ниже -100 указывают на перепроданность, что указывает на потенциальные возможности для покупки.
- При сильных трендах CCI может превышать +200 или -200, что указывает на экстремальный импульс.
Индекс товарного канала (CCI)
Стоит отметить, что когда индекс товарного канала (CCI) опускается ниже -100 или выше +100, это не обязательно сигнализирует о немедленной возможности для входа в сделку. Часто перед исполнением ордера необходимо получить подтверждение от других индикаторов или анализ ценового движения. Например, в приведенном выше примере, даже после того, как индекс CCI опустился ниже -100, прежде, чем изменить направление, цена продолжала снижаться еще на несколько пипсов.
Такое поведение присуще не только CCI; аналогичные закономерности наблюдаются и у других осцилляторов, таких как Стохастический осциллятор, особенно вблизи их предопределенных пороговых уровней. Хотя эти перекрестные сигналы могут быть ценными, если полагаться на них по отдельности, это может привести к преждевременным вводам. Более надежный подход предполагает комбинирование сигналов осциллятора с дополнительным техническим подтверждением для усиления процесса принятия решений.
Торговые стратегии, основанные на CCI:
- Сигналы о перекупленности/перепроданности: Значение CCI выше +100 может сигнализировать о потенциальной продаже, в то время как значение ниже -100 может сигнализировать о покупке. Для подтверждения сигнала трейдеры часто ждут, пока CCI снова опустится ниже +100 или выше -100.
- Сила тренда: Устойчивое движение выше +100 указывает на сильный восходящий тренд, в то время как ниже -100 указывает на сильный нисходящий тренд. Это может помочь трейдерам дольше оставаться в тренде.
- Расхождение: Подобно RSI, CCI может сигнализировать о потенциальных разворотах через дивергенцию, например, когда цена достигает новых максимумов, в то время как CCI достигает более низких максимумов, указывая на ослабление импульса.
- Пересечения: Некоторые трейдеры используют пересечения нулевой линии CCI в качестве сигналов тренда, при этом восходящие пересечения указывают на бычий импульс, а нисходящие - на медвежий.
Пример применения:
Если CCI превысит отметку +100, это может сигнализировать о сильном восходящем тренде, но трейдерам следует ожидать разворота, если CCI начнет снижаться и снова опустится ниже +100. Аналогичным образом, CCI ниже -100 может сигнализировать о возможности покупки, если он начнет расти и превысит -100.
Стохастический осциллятор - это основанный на импульсе индикатор, предназначенный для выявления потенциальных поворотных моментов в поведении рынка путем сравнения цены закрытия ценной бумаги с ее недавним торговым диапазоном. Часто устанавливается на 14-периодный интервал, что особенно эффективно при выявлении перекупленности и перепроданности. Сфокусированный на скорости изменения цен, он предназначен для сигнализирования о развороте тренда до того, как тот произойдет.
Этот мощный инструмент был представлен Джорджем Лейном (George Lane) в 1950-х годах, и его принципы по-прежнему служат руководством для трейдеров, ищущих ранние признаки изменения динамики рынка.
Расчет:
Стохастический осциллятор состоит из двух линий: %K (быстрая линия) и %D (медленная линия). Линия %K рассчитывается следующим образом:
где:
Close = текущая цена закрытияLowest Low = Самый низкий уровень за указанный период
Highest High = Самый высокий максимум за указанный период
Линия %D представляет собой скользящую среднюю линии %K, обычно это простая скользящая средняя за 3 периода, предназначенная для сглаживания колебаний.
Ключевые уровни и трактовка:
- Стохастический осциллятор колеблется в диапазоне от 0 до 100.
- Значения выше 80 считаются перекупленными, что указывает на потенциальные возможности продажи.
- Значения ниже 20 указывают на перепроданность, что указывает на потенциальные возможности для покупки.
- Линия %D действует как сигнальная линия, а пересечения %K и % D подают торговые сигналы.
Стохастический осциллятор
Торговые стратегии, основанные на Stochastic:
- Сигналы о перекупленности/перепроданности: Трейдеры ожидают, что %K превысит 20 как потенциальный сигнал к покупке, указывающий на то, что актив выходит из зоны перепроданности. И наоборот, преодоление уровня ниже 80 может сигнализировать о продаже, указывая на состояние перекупленности.
- Пересечения: Бычий сигнал возникает, когда % K пересекает уровень выше % D, особенно в зоне перепроданности (ниже 20). Медвежий сигнал возникает, когда % K пересекает ниже % D, особенно в зоне перекупленности (выше 80).
- Расхождение: Стохастик может сигнализировать о потенциальных разворотах через дивергенцию, такую как бычья дивергенция, когда цена достигает более низких минимумов, но % K достигает более высоких минимумов, что указывает на ослабление нисходящего импульса.
- Подтверждение тренда: При восходящем тренде стохастик, как правило, должен оставаться выше 50, в то время как при нисходящем тренде он должен оставаться ниже 50, помогая трейдерам определить направление тренда.
Пример применения:
Если % K пересекает уровень выше % D, в то время как обе они находятся ниже 20, это может сигнализировать о сильной покупке, особенно если сопровождается другими бычьими сигналами, такими как пробой выше уровня сопротивления. И наоборот, если % K окажется ниже % D, но при этом выше 80, это может сигнализировать о продаже, указывая на потенциальный разворот из-за перекупленности.
Схождение/расхождение скользящих средних (MACD)
MACD - это широко используемый индикатор импульса, следующий за трендом, который сравнивает краткосрочные и долгосрочные ценовые тренды путем анализа разницы между двумя EMA. Он помогает выявлять изменения в динамике рынка, направлении тренда и потенциальных точках входа или выхода, что делает его ценным компонентом многих технических торговых систем.
MACD разработал Джеральд Аппель (Gerald Appel) в конце 1970-х годов. Он остается одним из самых надежных инструментов трейдеров для определения силы тренда и возможных разворотов.
Расчет:
MACD рассчитывается путем вычитания 26-периодной EMA из 12-периодной EMA:
Затем в качестве "сигнальной линии" строится 9-периодная EMA линии MACD. Разница между линией MACD и сигнальной линией часто отображается в виде гистограммы, которая визуально отражает силу импульса.
Ключевые уровни и трактовка:
- MACD колеблется около нуля, без верхней или нижней границ.
- Положительное значение MACD указывает на бычий импульс, в то время как отрицательное значение указывает на медвежий импульс.
- Пересечение линии MACD и Сигнальной линии подает торговые сигналы: бычий - когда MACD пересекает Сигнальную линию выше, медвежий - когда ниже.
- Пересечения нулевой линии также имеют значение: пересечение выше нуля указывает на потенциальный восходящий тренд, в то время как пересечение ниже указывает на потенциальный нисходящий тренд.
Схождение/расхождение скользящих средних (MACD)
Торговые стратегии, основанные на MACD:
- Пересечения: Трейдеры покупают, когда линия MACD пересекается выше Сигнальной линии, указывая на бычий импульс, и продают, когда она пересекается ниже, указывая на медвежий импульс.
- Пересечения нулевой линии: Пересечение MACD выше нуля указывает на потенциальный восходящий тренд, в то время как пересечение ниже указывает на нисходящий тренд, что полезно для подтверждения тренда.
- Анализ гистограммы: Высота гистограммы отражает силу импульса. Расширяющаяся гистограмма указывает на увеличение импульса, в то время как сужающаяся гистограмма указывает на замедление импульса, потенциально сигнализируя о развороте.
- Расхождение: MACD может сигнализировать о потенциальных разворотах через дивергенцию, например, бычью дивергенцию, когда цена достигает более низких минимумов, но MACD достигает более высоких минимумов, указывая на ослабление нисходящего импульса.
Пример применения:
Если линия MACD пересекает Сигнальную линию и гистограмма расширяется, это может сигнализировать о покупке, особенно если сопровождается пробоем выше ключевого уровня сопротивления. И наоборот, если линия MACD пересекается ниже Сигнальной линии, а гистограмма сужается, это может сигнализировать о продаже, указывая на потенциальный разворот.
Индикатор | Назначение | Ключевые уровни | Основные сигналы | Лучшее применение |
---|---|---|---|---|
RSI | Измеряет динамику и определяет условия перекупленности/перепроданности | >70 (перекупленность), <30 (перепроданность), 50 (средняя точка) | Пересечение выше 30 (покупка), пересечение ниже 70 (продажа), дивергенции, провальные колебания | Рынки с ограниченным диапазоном |
CCI | Определяет циклические повороты и силу тренда | >+100 (перекупленность), <-100 (перепроданность), нулевая линия | Пересечение выше +100 (продажа), пересечение ниже -100 (покупка), дивергенции, пересечения нулевых линий | Трендовые рынки |
Стохастик | Измеряет динамику и выявляет потенциальные развороты | >80 (перекупленность), <20 (перепроданность) | Пересечения %K/%D (покупка, когда %K пересекается выше %D ниже 20, продажа, когда ниже %D выше 80), расхождения | Боковое движение и трендовые рынки |
MACD | Индикатор отслеживания тренда и импульса | Нулевая линия, пересечения сигнальной линии | Пересечение линии MACD выше сигнальной линии (покупка), ниже сигнальной линии (продажа), пересечение нулевой линии, изменение гистограммы | Трендовые рынки |
Реализация
Значения встроенного индикатора для символа и таймфрейма, отображаемые на активном графике, могут быть получены с помощью трехэтапной последовательности “хэндл → буфер → освобождение”. Сначала создается хэндл индикатора путем вызова соответствующей функции MQL5, такой как iRSI или iMACD, без явных параметров символа и таймфрейма, чтобы использовать контекст графика. Затем для этого хэндла вызывается CopyBuffer, чтобы извлечь последние значения из одного или нескольких выходных буферов индикатора. Наконец, вызывается IndicatorRelease для освобождения хэндла и связанных с ним ресурсов. Объединение этих шагов во вспомогательную процедуру обеспечивает эффективное получение RSI, MACD, Stochastic, CCI или любого другого стандартного индикатора по запросу без создания дополнительных окон графика.
Следующие шаги описывают процесс интеграции функции «Анализ индикаторов» (Indicator Insights) в советник «Заголовки новостей», предоставляя практическую демонстрацию того, как работать со встроенными индикаторами с использованием MQL5.
Интеграция функции «Аналитиз индикаторов» в советник
1. Объявление пользовательских входных данных
Отображая InpSeparateLanes и InpInsightSpeed наряду с другими входными данными, вы позволяете трейдеру выбирать, следует ли отображать единую полосу прокрутки комбинированных индикаторов.
input bool InpSeparateLanes = false; // combined vs separate insights input int InpInsightSpeed = 3; // scroll speed for insight text
2. Глобальные переменные и хэндлы Canvas
Заранее объявляем как о комбинированных, так и об индивидуальных элементах canvas. Их смещения прокрутки управляют анимацией. На MQL5 хэндлы canvas должны сохраняться глобально, чтобы они сохранялись при обратных вызовах таймера. Упорядочивая эти хэндлы рядом с другими переменными состояния (такими как ширина графика и временные метки перезагрузки), мы сохраняем все состояния перекрестных отметок в одном месте.
//--- Globals --------------------------------------------- CCanvas combinedCanvas; // holds all four insights in one lane CCanvas rsiCanvas, stochCanvas, macdCanvas, cciCanvas; // separate lanes int offCombined, offRSI, offStoch, offMACD, offCCI;
3. Вспомогательные функции в вычислении индикаторов
Каждая вспомогательная функция работает по схеме “хэндл → буфер → освобождение”, гарантируя, что мы создаем хэндл каждого индикатора только один раз за тик, считываем последнее значение, а затем немедленно освобождаем ресурсы системы. Централизация форматирования здесь обеспечивает чистоту и производительность основного цикла рисования. Объединение четырех сигналов в одну строку для режима combined‐lane еще больше упрощает логику рендеринга.
//+------------------------------------------------------------------+ //| Compute indicator insights | //+------------------------------------------------------------------+ string ComputeRSIInsight() { int h=iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE); if(h==INVALID_HANDLE) return "["+Symbol()+"] RSI err"; double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h); double v=b[0]; string s=DoubleToString(v,1); string m=v<30?"Oversold("+s+")":v>70?"Overbought("+s+")":"Neutral("+s+")"; return "["+Symbol()+"] RSI:"+m; } string ComputeStochInsight() { int h=iStochastic(NULL,PERIOD_CURRENT,14,3,3,MODE_SMA,STO_LOWHIGH); if(h==INVALID_HANDLE) return "["+Symbol()+"] Stoch err"; double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h); double v=b[0]; string s=DoubleToString(v,1); string m=v<20?"Oversold("+s+")":v>80?"Overbought("+s+")":"Neutral("+s+")"; return "["+Symbol()+"] Stoch:"+m; } string ComputeMACDInsight() { int h=iMACD(NULL,PERIOD_CURRENT,12,26,9,PRICE_CLOSE); if(h==INVALID_HANDLE) return "["+Symbol()+"] MACD err"; double m[],g[]; CopyBuffer(h,0,1,1,m); CopyBuffer(h,1,1,1,g); IndicatorRelease(h); double d=m[0]-g[0]; string s=DoubleToString(d,2); string m2=d>0?"Bull("+s+")":d<0?"Bear("+s+")":"Neu(0)"; return "["+Symbol()+"] MACD:"+m2; } string ComputeCCIInsight() { int h=iCCI(NULL,PERIOD_CURRENT,14,PRICE_TYPICAL); if(h==INVALID_HANDLE) return "["+Symbol()+"] CCI err"; double b[]; CopyBuffer(h,0,1,1,b); IndicatorRelease(h); double v=b[0]; string s=DoubleToString(v,1); string m=v<-100?"Oversold("+s+")":v>100?"Overbought("+s+")":"Neutral("+s+")"; return "["+Symbol()+"] CCI:"+m; } string ComputeAllInsights() { return ComputeRSIInsight() + " | " + ComputeStochInsight() + " | " + ComputeMACDInsight() + " | " + ComputeCCIInsight(); }
4. Создание холста в OnInit
В OnInit мы подключаем наши новые полосы. В режиме separate‐lane мы инициализируем четыре полотна; в режиме combined‐lane - только одно, со статичной меткой “Indicator Insights:”. Запуск первоначального Update гарантирует, что еще до первого тика таймера трейдеры увидят контекст — важную деталь удобства использования при загрузке крупных советников.
int OnInit() { // … existing canvases for events & news … if(InpSeparateLanes) { rsiCanvas.CreateBitmapLabel("RsiC",0,0,canvW,lineH); stochCanvas.CreateBitmapLabel("StoC",0,0,canvW,lineH); macdCanvas.CreateBitmapLabel("MacC",0,0,canvW,lineH); cciCanvas.CreateBitmapLabel("CciC",0,0,canvW,lineH); // set transparency… } else { combinedCanvas.CreateBitmapLabel("AllC",0,0,canvW,lineH); combinedCanvas.TransparentLevelSet(120); // static label at x=5: “Indicator Insights:” combinedCanvas.FontSizeSet(-120); combinedCanvas.TextOut(5, (lineH-combinedCanvas.TextHeight("Indicator Insights:"))/2, "Indicator Insights:", XRGB(200,200,255), ALIGN_LEFT); combinedCanvas.Update(true); } // … remainder of OnInit … }
5. Логика прокрутки в OnTimer
Это и есть сердцебиение советника: каждый тик таймера перемещает холсты, перезагружает данные, обрабатывает любые изменения размера графика, а затем запускает цикл вычислений и отрисовки для каждой полосы — будь то события, новости или индикаторы. Группируя все вызовы обновления в конце, мы сводим к минимуму мерцание и сохраняем идеальную синхронизацию прокрутки между слоями. Вспомогательная функция для создания оболочки для смещений сохраняет код «DRY» («НЕ ПОВТОРЯЙСЯ»).
//+------------------------------------------------------------------+ //| OnTimer: redraw | //+------------------------------------------------------------------+ void OnTimer() { // reposition canvases SetCanvas("EvC",InpPositionTop,InpTopOffset); SetCanvas("NwC",InpPositionTop,InpTopOffset+3*lineH); if(InpSeparateLanes) { SetCanvas("RsiC",InpPositionTop,InpTopOffset+4*lineH); SetCanvas("StoC",InpPositionTop,InpTopOffset+5*lineH); SetCanvas("MacC",InpPositionTop,InpTopOffset+6*lineH); SetCanvas("CciC",InpPositionTop,InpTopOffset+7*lineH); } else { SetCanvas("AllC",InpPositionTop,InpTopOffset+4*lineH); } // refresh data ReloadEvents(); FetchAlphaVantageNews(); // resize if needed int wNew=(int)ChartGetInteger(0,CHART_WIDTH_IN_PIXELS); if(wNew!=canvW) { canvW=wNew; ObjectSetInteger(0,"EvC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"NwC",OBJPROP_WIDTH,canvW); if(InpSeparateLanes) { ObjectSetInteger(0,"RsiC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"StoC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"MacC",OBJPROP_WIDTH,canvW); ObjectSetInteger(0,"CciC",OBJPROP_WIDTH,canvW); } else { ObjectSetInteger(0,"AllC",OBJPROP_WIDTH,canvW); } } // draw events DrawAll(); // draw news newsCanvas.Erase(ARGB(170,0,0,0)); string nt = totalNews>0?newsHeadlines[0]:placeholder; newsCanvas.TextOut(offNews,(lineH-newsCanvas.TextHeight(nt))/2, nt,XRGB(255,255,255),ALIGN_LEFT); offNews-=InpNewsSpeed; if(offNews+newsCanvas.TextWidth(nt)<-20) offNews=canvW; // draw insights if(InpSeparateLanes) { string t; t=ComputeRSIInsight(); rsiCanvas.Erase(ARGB(120,0,0,0)); rsiCanvas.TextOut(offRSI,(lineH-rsiCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offRSI-=InpInsightSpeed; if(offRSI+rsiCanvas.TextWidth(t)<-20) offRSI=canvW; t=ComputeStochInsight(); stochCanvas.Erase(ARGB(120,0,0,0)); stochCanvas.TextOut(offStoch,(lineH-stochCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offStoch-=InpInsightSpeed; if(offStoch+stochCanvas.TextWidth(t)<-20) offStoch=canvW; t=ComputeMACDInsight(); macdCanvas.Erase(ARGB(120,0,0,0)); macdCanvas.TextOut(offMACD,(lineH-macdCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offMACD-=InpInsightSpeed; if(offMACD+macdCanvas.TextWidth(t)<-20) offMACD=canvW; t=ComputeCCIInsight(); cciCanvas.Erase(ARGB(120,0,0,0)); cciCanvas.TextOut(offCCI,(lineH-cciCanvas.TextHeight(t))/2, t,XRGB(180,220,255),ALIGN_LEFT); offCCI-=InpInsightSpeed; if(offCCI+cciCanvas.TextWidth(t)<-20) offCCI=canvW; } else { combinedCanvas.Erase(ARGB(120,0,0,0)); string txt=ComputeAllInsights(); combinedCanvas.TextOut(offCombined,(lineH-combinedCanvas.TextHeight(txt))/2, txt,XRGB(180,220,255),ALIGN_LEFT); offCombined-=InpInsightSpeed; if(offCombined+combinedCanvas.TextWidth(txt)<100) offCombined=canvW; } // batch update eventsCanvas.Update(true); newsCanvas. Update(true); if(InpSeparateLanes) { rsiCanvas. Update(true); stochCanvas.Update(true); macdCanvas. Update(true); cciCanvas. Update(true); } else { combinedCanvas.Update(true); } }
6. Очистка в OnDeinit
Правильное удаление предотвращает появление потерянных растровых изображений и зависших таймеров. Каждой CreateBitmapLabel в OnInit соответствует Destroy плюс ObjectDelete в OnDeinit, и таймер отключается, чтобы исключить любые случайные обратные вызовы. Явное удаление любых динамических объектов (например, экземпляров событий) завершает этап надежной очистки.
//+------------------------------------------------------------------+ //| OnDeinit: cleanup | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); eventsCanvas.Destroy(); ObjectDelete(0,"EvC"); newsCanvas.Destroy(); ObjectDelete(0,"NwC"); if(InpSeparateLanes) { rsiCanvas.Destroy(); ObjectDelete(0,"RsiC"); stochCanvas.Destroy();ObjectDelete(0,"StoC"); macdCanvas.Destroy(); ObjectDelete(0,"MacC"); cciCanvas.Destroy(); ObjectDelete(0,"CciC"); } else { combinedCanvas.Destroy();ObjectDelete(0,"AllC"); } for(int i=0;i<ArraySize(highArr);i++) delete highArr[i]; for(int i=0;i<ArraySize(medArr);i++) delete medArr[i]; for(int i=0;i <ArraySize(lowArr);i++) delete lowArr[i]; ArrayResize(newsHeadlines,0); }
Благодаря соответствующей интеграции новых компонентов с существующим кодом из предыдущей статьи, у нас теперь есть обновленная версия нашей программы, которая позволяет анализировать индикаторы в режиме реального времени. В следующем разделе мы представим результаты тестирования этих недавно добавленных функций, а затем кратко изложим основные выводы из процесса разработки.
Тестирование
В MetaTrader 5 вы можете протестировать советник, перетащив его на график из раздела "Советники" на панели "Навигатор". Начиная с версии 1.04, советник «Заголовки новостей» теперь включает в себя интегрированный анализ индикаторов. На рисунке ниже показано, как переключаться между режимом просмотра с одной полосой по умолчанию и режимом просмотра с отдельными полосами, с помощью входных настроек советника. Обратите внимание, что API-ключ намеренно оставлен пустым по соображениям безопасности и перед использованием его следует ввести вручную.
Тестирование новых функций
Как только будет добавлен API-ключ Alpha Vantage, заголовки новостей будут отображаться вместе с нашими новыми интегрированными аналитическими данными, показанными ниже.
Советник «Заголовки новостей» с функцией «Анализ индикаторов»
Я протестировал советник с помощью тестера стратегий, и, хотя полосы на холсте отображались, они не содержали данных. Вероятно, это связано с тем, что доступ к необходимой информации, такой как новости и значения индикаторов, должен осуществляться в режиме реального времени, что не полностью поддерживается тестировщиком.
Заключение
Объединив все воедино, мы успешно воплотили нашу идею в жизнь. Мы продемонстрировали возможность создания интегрированного графического инструмента, предоставляющего необходимую торговую информацию - события экономического календаря, заголовки финансовых новостей и анализ индикаторов на основе правил — в компактном, визуально доступном интерфейсе.
Включение аналитической информации индикаторов особенно ценно для трейдеров, поскольку оно обеспечивает мгновенную информацию о рыночных условиях, помогая пользователям принимать обоснованные решения, не переключаясь между несколькими окнами индикаторов или графиками. Это повышает эффективность и экономит ценное пространство на экране.
С точки зрения разработки, мы углубили наше понимание того, как извлекать данные из встроенных индикаторов MetaTrader 5 и манипулировать ими с помощью API MQL5. Используя гибкость класса CCanvas, мы смогли представить эти данные в визуально понятном и упрощенном формате, что повысило удобство работы с ними для пользователей. Этот проект продемонстрировал возможности пользовательской настройки программного интерфейса на MQL5, а также заложил основу для будущих улучшений, таких как аналитическая информация или интеграция пользовательских индикаторов, которые могут еще больше повысить полезность инструмента.
Ниже я подготовил сводную таблицу, в которой представлены основные уроки, извлеченные из данного обсуждения. Полный исходный код приложен в конце статьи. Приглашаем вас присоединиться к разговору, поделившись своими мыслями и отзывами в комментариях — мы высоко ценим ваш вклад!
Основные уроки
Урок | Описание |
---|---|
Разделение интересов | Использование отдельных холстов для событий, новостей и анализа индикаторов повышает модульность кода и обеспечивает гибкость компоновки и стиля. |
Использование класса CCanvas | Обеспечивает плавный рендеринг пользовательского текста и графических образов на диаграмме, что позволяет использовать уникальные улучшения интерфейса, выходящие за рамки стандартных объектов MetaTrader 5. |
Логика анимации прокрутки | Управление переменными смещения помогает создавать плавные текстовые элементы с горизонтальной прокруткой, что идеально подходит для динамических отображений, таких как новостные ленты и сводки индикаторов. |
Принцип «НЕ ПОВТОРЯЙСЯ» | Создание вспомогательных функций, таких как SetCanvas, позволяет сохранить код чистым, пригодным для повторного использования и более простым в обслуживании, избегая повторений. |
Интеграция API | Использование WebRequest для получения внешних данных показывает, как MetaTrader 5 можно расширить за счет сторонних сервисов, таких как поставщики финансовых новостей. |
Ограничения на доступ к данным в режиме реального времени | Оперативные данные, такие как экономические события и новости рынка, часто требуют доступа в режиме реального времени, что может не работать в среде тестировщика стратегий. |
Использование встроенных индикаторов | Доступ к буферам стандартных индикаторов, таких как RSI, MACD и CCI, и их интерпретация позволяют автоматически генерировать аналитические данные непосредственно в коде. |
Компактный дизайн пользовательского интерфейса | Объединение нескольких потоков данных в одну полосу с возможностью прокрутки помогает уменьшить объем диаграмм, в то же время предоставляя всю необходимую информацию в одном месте. |
Динамическое позиционирование холста | Изменение положения объектов canvas в соответствии с предпочтениями пользователя и размерами диаграммы обеспечивает интерактивный и адаптивный макет. |
Контроль версий и отслеживание функций | Сохранение четких номеров версий помогает отслеживать изменения, документировать ход выполнения и эффективно доводить обновления до сведения пользователей и разработчиков. |
Содержимое вложения
Файл | Версия | Описание |
---|---|---|
News Headline EA.mq5 | 1.04 | Советник, отображающий события экономического календаря и заголовки новостей рынка в режиме реального времени непосредственно на графике с помощью встроенных API - MQL5 Canvas и Alpha Vantage, кроме того, техническую информацию с индикаторов. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18528
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.




- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования