Изучение Стандартной библиотеки MQL5 (Часть 4): Создание библиотеки пользовательских сигналов
Содержание
Введение
Разработка сложных советников возможна с помощью мастера MQL5 даже при ограниченном опыте программирования. Библиотека сигналов по умолчанию содержит множество готовых сигналов, которые можно оптимизировать для достижения высокой торговой эффективности. В этой подробной статье мы создадим пользовательские сигналы, чтобы превратить торговые идеи в полностью функциональные советники, совместимые с фреймворком мастера MQL5. В этой статье описывается наш путь от первоначальной концепции до окончательной реализации, освещаются проблемы, решения и ценные выводы, полученные в ходе процесса.
Преимущество мастера MQL5
Мастер MQL5 заметно упрощает разработку алгоритмических торговых систем, предлагая ряд ключевых преимуществ:
1. Возможности быстрого прототипирования
- Ускоренная разработка: создавайте полноценные советники за считанные минуты, а не недели.
- Стандартизированная архитектура: обеспечьте согласованность и удобство сопровождения кода
- Модульная архитектура: легко заменяйте и комбинируйте торговые компоненты
- Встроенное управление рисками: интегрируйте профессиональное управление капиталом с самого начала.
2. Предварительно оптимизированные компоненты
Мастер предоставляет доступ к тщательно протестированным модулям, включая:
- множество систем генерации сигналов
- различные механизмы трейлинг-стопа,
- разнообразные стратегии управления капиталом,
- комплексные протоколы управления рисками.
Размышляя над этой темой, я решил составить таблицу, показывающую, как два разных типа разработчиков могут извлечь выгоду из использования мастера MQL5. Смотрите таблицу ниже.
| Преимущества мастера MQL5 и библиотеки сигналов для разных типов разработчиков | ||
|---|---|---|
| # | Разработчик с нулевыми знаниями программирования | Разработчик с хорошими навыками программирования |
| 1 | Мгновенное создание советников Создавайте полноценные советники за считанные минуты без написания кода благодаря интуитивно понятному интерфейсу "наведи и щелкни". | Быстрое создание прототипов Быстро тестируйте торговые идеи, создавая полный фреймворк советника, а затем настраивайте и расширяйте его с помощью расширенного программирования |
| 2 | Готовая библиотека сигналов Получите доступ к десяткам профессионально написанных технических индикаторов и торговых стратегий, не разбираясь в деталях реализации | Расширяемая архитектура Используйте хорошо продуманные базовые классы и интерфейсы для создания пользовательских сигналов, сохраняя при этом совместимость с фреймворком мастера |
| 3 | Встроенное управление рисками Автоматически интегрируйте профессиональное управление капиталом, трейлинг-стопы и определение размера позиции без навыков программирования | Генерация кода и стандарты Генерируйте шаблонный код в соответствии с лучшими практиками MQL5, сокращая время разработки и обеспечивая качество кода |
| 4 | Визуальный конструктор стратегий Объединяйте несколько сигналов простым перетаскиванием и сразу же увидите влияние параметров на эффективность стратегии | Модульная система компонентов Создавайте многоразовые модули сигналов, которые можно легко совместно использовать, тестировать и комбинировать в различных конфигурациях стратегий |
| 5 | Безошибочная реализация Избегайте распространенных ошибок программирования благодаря предварительно протестированным и проверенным торговым компонентам и автоматической обработке ошибок | Расширенная система отладки Используйте встроенные возможности отладки и стандартизированное логирование для быстрого выявления и устранения проблем. |
| 6 | Учебная платформа Изучайте сгенерированный код, чтобы понять надлежащую структуру советника и постепенно осваивать концепции программирования MQL5 | Инфраструктура тестирования Получите доступ к комплексным инструментам бэктестирования и оптимизации с минимальным временем настройки для проверки стратегии |
| 7 | Оптимизация параметров Легко оптимизируйте торговые стратегии через визуальный интерфейс, не разбираясь в сложных алгоритмах оптимизации | Сравнительный анализ эффективности Сравнивайте пользовательские сигналы со встроенной библиотекой, используя стандартизированные протоколы тестирования и метрики |
| 8 | Проверка стратегий Быстро тестируйте различные комбинации сигналов и настроек фильтров, чтобы найти прибыльные конфигурации посредством систематического исследования | Пользовательские точки интеграции Расширьте функциональность мастера, подключившись к событиям инициализации, обработки тиков и исполнения сделок |
Разработка концепции пользовательских сигналов
Список сигналов по умолчанию в основном формируется из стандартных индикаторов терминала. В сегодняшнем проекте мы хотим пойти дальше. Большинство трейдеров уже знакомы с названиями свечей и паттернами, поэтому им будет проще понять концепции, которые мы собираемся использовать. Наша задача — создать класс сигналов на основе свечных паттернов с целью определения конкретных свечных формаций цены и генерации соответствующих торговых сигналов. После создания этого класса мы интегрируем его в советник с помощью мастера MQL5, а затем изучим сгенерированный код и его поведение в тестере стратегий. Успешные торговые системы часто комбинируют несколько подтверждающих факторов, а не полагаются на один индикатор, и этот подход приближает нас к этому идеалу.

Список доступных модулей сигналов
Реализация
Создание пользовательских сигналов для мастера MQL5
Наш путь реализации следовал логической последовательности, но мы столкнулись с критическим препятствием с самого начала. Когда я создал свой первый класс пользовательских сигналов, он успешно скомпилировался, но не появился в списке доступных сигналов для выбора в мастере MQL5. Для этого потребовались специальные настройки, чтобы сделать сигнал видимым и доступным для выбора наряду с предустановленными вариантами.
Структура класса
При создании пользовательских торговых сигналов для мастера MQL5 мы начинаем с определения фундаментальной структуры классов, которая составляет основу нашей системы распознавания свечных паттернов. Этот класс наследует от мощного базового класса CExpertSignal, который предоставляет всю необходимую функциональность для интеграции с фреймворком мастера MQL5. Проще говоря, мы строим решение на уже проверенной основе — мы получаем все сложные возможности обработки сигналов, концентрируя наши усилия на уникальной логике свечных паттернов, которая делает нашу торговую стратегию особенной.
//+------------------------------------------------------------------+ //| MyCandlePatternSignal.mqh | //| Custom Signal based on Candlestick Patterns | //+------------------------------------------------------------------+ #include <Expert\ExpertSignal.mqh> //+------------------------------------------------------------------+ //| Class CMyCandlePatternSignal | //+------------------------------------------------------------------+ class CMyCandlePatternSignal : public CExpertSignal {
Обратите внимание, как мы включаем ExpertSignal.mqh — это абсолютно необходимо, поскольку он предоставляет базовую функциональность класса, которую ожидает мастер MQL5. Без этого включаемого файла наш класс не скомпилируется должным образом, не говоря уже о работе во фреймворке мастера.
Разработка торговых параметров: переменные-члены класса
Каждая успешная торговая система нуждается в настраиваемых параметрах, и наш класс свечных сигналов не является исключением. Мы объявляем два типа переменных-членов класса: весовые коэффициенты паттернов, определяющие, насколько сильно каждая формация свечей влияет на наши торговые решения, и параметры распознавания, которые уточняют, как мы идентифицируем эти паттерны в рыночных данных. Такое разделение позволяет трейдерам независимо регулировать как чувствительность распознавания паттернов, так и степень уверенности в каждом сигнале.
protected: //--- Pattern weights int m_pattern_doji; // Doji pattern weight int m_pattern_engulfing; // Engulfing pattern weight int m_pattern_hammer; // Hammer/Hanging man weight int m_pattern_morning_star;// Morning/Evening star weight //--- Detection parameters double m_doji_threshold; // Doji body threshold double m_engulfing_ratio; // Engulfing size ratio
Модификатор доступа protected гарантирует доступность этих переменных внутри нашей иерархии классов, но скрывает их от внешнего кода, поддерживая принципы объектно-ориентированного проектирования и сохраняя инкапсуляцию торговой логики.
Создание панели управления: методы публичного интерфейса
Чтобы сделать наш сигнал настраиваемым в мастере MQL5, нам необходимо предоставить публичные методы, позволяющие трейдерам настраивать наши параметры. Эти методы-установщики действуют как панель управления для нашего торгового сигнала — каждый из них соответствует входному параметру, который появится в настройках советника при генерации мастером. Прелесть такого подхода заключается в том, что мы создаем удобный для пользователя интерфейс без дополнительного программирования графического интерфейса!
public: //--- Constructor CMyCandlePatternSignal(void); //--- Methods for setting parameters void PatternDoji(int value) { m_pattern_doji=value; } void PatternEngulfing(int value) { m_pattern_engulfing=value; } void PatternHammer(int value) { m_pattern_hammer=value; } void PatternMorningStar(int value) { m_pattern_morning_star=value; } void DojiThreshold(double value) { m_doji_threshold=value; } void EngulfingRatio(double value) { m_engulfing_ratio=value; }
Эти встроенные методы-установщики эффективны и просты в использовании — они напрямую присваивают значения нашим переменным-членам класса. Когда мастер MQL5 генерирует советник на основе нашего сигнала, он автоматически создает входные параметры, которые вызывают эти методы.
Определение мозга нашей системы: основная функциональность
В защищенной секции объявления нашего класса мы определяем основную функциональность нашего торгового сигнала. Здесь мы объявляем методы распознавания паттернов, которые идентифицируют конкретные свечные формации, и важные методы генерации сигналов, которые мастер MQL5 вызывает для принятия торговых решений. Именно здесь находится наша уникальная торговая логика — методы, которые преобразуют необработанные данные о цене в торговые сигналы, пригодные для принятия решений.
protected: //--- Candlestick pattern detection methods bool IsDoji(int idx); bool IsBullishEngulfing(int idx); bool IsBearishEngulfing(int idx); bool IsHammer(int idx); bool IsShootingStar(int idx); bool IsMorningStar(int idx); bool IsEveningStar(int idx); //--- Main signal generation methods virtual int LongCondition(void); virtual int ShortCondition(void); };
Ключевое слово virtual перед LongCondition() и ShortCondition() указывает на то, что мы переопределяем методы базового класса CExpertSignal. Это методы, которые вызывает фреймворк мастера MQL5 для определения момента открытия длинных и коротких позиций.
Настройка значений по умолчанию: конструктор
Каждому классу необходима надлежащая инициализация, и в нашем конструкторе мы устанавливаем разумные значения по умолчанию для всех наших торговых параметров. Этот список инициализации гарантирует, что наш сигнал запускается с разумными настройками, которые доказали свою эффективность для торговли по свечным паттернам. Назначение параметра m_used_series особенно важно — оно указывает фреймворку, к каким ценовым данным нам нужен доступ для наших вычислений.
//+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CMyCandlePatternSignal::CMyCandlePatternSignal(void) : m_pattern_doji(60), m_pattern_engulfing(80), m_pattern_hammer(70), m_pattern_morning_star(90), m_doji_threshold(0.1), m_engulfing_ratio(1.5) { m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE; }
Назначение параметра m_used_series абсолютно необходимо — без него наш сигнал не будет иметь доступа к данным о ценах открытия, максимума, минимума и закрытия, необходимым для анализа свечей. Это распространенное упущение, которое может привести к путанице и ошибкам, когда сигнал пытается получить доступ к ценовым данным, которые не были инициализированы.
Реализация распознавания паттернов: обнаружение доджи
Паттерн доджи представляет собой рыночную неопределенность, возникающую, когда цены открытия и закрытия практически равны. Наш метод распознавания вычисляет размер тела свечи относительно ее общего диапазона, используя настраиваемый порог для определения того, что представляет собой "маленькое" тело. Этот математический подход обеспечивает согласованное распознавание паттернов на разных инструментах и в разных рыночных условиях.
//+------------------------------------------------------------------+ //| Check if candle is Doji | //+------------------------------------------------------------------+ bool CMyCandlePatternSignal::IsDoji(int idx) { double open = m_open.GetData(idx); double close = m_close.GetData(idx); double high = m_high.GetData(idx); double low = m_low.GetData(idx); double body_size = MathAbs(close - open); double range = high - low; // Doji: very small body relative to range if(range > 0 && body_size <= range * m_doji_threshold) return true; return false; }
Обратите внимание, как мы используем m_doji_threshold, чтобы сделать распознавание адаптивным. Значение 0,1 означает, что тело свечи должно составлять 10% или менее от общего диапазона свечей. Этот параметр позволяет трейдерам регулировать чувствительность в зависимости от волатильности рынка — более низкие значения для более точного определения доджи, более высокие значения для более частых сигналов.
Определение рыночных разворотов: паттерны поглощения
Поглощающие паттерны — это мощные разворотные сигналы, возникающие, когда свеча полностью "поглощает" тело предыдущей свечи. Наша реализация тщательно проверяет несколько условий: направление обеих свечей, взаимосвязь поглощения и разницу в размерах с использованием нашего настраиваемого коэффициента. Эта многоуровневая проверка гарантирует, что мы идентифицируем только высококачественные паттерны поглощения.
//+------------------------------------------------------------------+ //| Check for Bullish Engulfing pattern | //+------------------------------------------------------------------+ bool CMyCandlePatternSignal::IsBullishEngulfing(int idx) { double prev_open = m_open.GetData(idx+1); double prev_close = m_close.GetData(idx+1); double curr_open = m_open.GetData(idx); double curr_close = m_close.GetData(idx); // Previous candle must be bearish if(prev_close >= prev_open) return false; // Current candle must be bullish if(curr_close <= curr_open) return false; // Current body must engulf previous body if(curr_open < prev_close && curr_close > prev_open) { double prev_body = MathAbs(prev_close - prev_open); double curr_body = MathAbs(curr_close - curr_open); // Current body should be significantly larger if(curr_body >= prev_body * m_engulfing_ratio) return true; } return false; }
Паттерн поглощения представляет собой резкий сдвиг в настроениях рынка. Предыдущая свеча показывала, что одна сторона контролирует ситуацию, но поглощающая свеча демонстрирует, что противоположная сторона доминирует. Наш параметр m_engulfing_ratio гарантирует, что новый импульс достаточно силен, чтобы быть значимым.
Точное определение разворотных точек: “Молот” и “Падающая звезда”
Паттерны Молот и Падающая звезда отлично подходят для точного определения потенциальных точек разворота. Эти модели имеют небольшие тела с длинными тенями, что указывает на неприятие рынком более высоких или более низких цен. В нашей реализации используются точные соотношения для различения подлинных разворотных паттернов от обычных свечей с длинными тенями.
//+------------------------------------------------------------------+ //| Check for Hammer pattern (bullish reversal) | //+------------------------------------------------------------------+ bool CMyCandlePatternSignal::IsHammer(int idx) { double open = m_open.GetData(idx); double close = m_close.GetData(idx); double high = m_high.GetData(idx); double low = m_low.GetData(idx); double body_size = MathAbs(close - open); double lower_shadow = MathMin(open, close) - low; double upper_shadow = high - MathMax(open, close); double range = high - low; if(range <= 0) return false; // Hammer: small body, long lower shadow, little to no upper shadow bool is_small_body = body_size <= range * 0.3; bool is_long_lower_shadow = lower_shadow >= body_size * 2.0; bool is_small_upper_shadow = upper_shadow <= body_size * 0.5; return (is_small_body && is_long_lower_shadow && is_small_upper_shadow); }
Паттерн Молот рассказывает историю о том, как продавцы сбивали цены в течение периода, но покупатели компенсировали большую часть потерь к закрытию. Это создает длинную нижнюю тень, которая указывает на потенциальный бычий разворот. Наша проверка по трем условиям гарантирует, что мы идентифицируем только высоковероятные формации Молот.
Принятие торговых решений: генерация сигналов
Методы LongCondition() и ShortCondition() — это то, где все объединяется: это модули принятия решений, которые мастер MQL5 вызывает для генерации реальных торговых сигналов. Используя систему взвешенного голосования, каждый паттерн вносит свой уровень достоверности в итоговое решение; при этом для исполнения сделки общая сумма должна превысить установленный мастером порог.
//+------------------------------------------------------------------+ //| "Long" condition (BUY signals) | //+------------------------------------------------------------------+ int CMyCandlePatternSignal::LongCondition(void) { int result=0; int idx=StartIndex(); //--- Pattern 0: Bullish Engulfing if(IsBullishEngulfing(idx)) { if(IS_PATTERN_USAGE(0)) result += m_pattern_engulfing; } //--- Pattern 1: Hammer if(IsHammer(idx)) { if(IS_PATTERN_USAGE(1)) result += m_pattern_hammer; } //--- Pattern 2: Doji at support (potential reversal) if(IsDoji(idx)) { // You could add additional logic here to check if at support if(IS_PATTERN_USAGE(2)) result += m_pattern_doji; } return(result); }
Макрос IS_PATTERN_USAGE() невероятно мощный — он позволяет трейдерам включать или отключать отдельные паттерны без изменения кода. Это означает, что наш сигнал может адаптироваться к различным рыночным условиям, фокусируясь на наиболее актуальных паттернах для текущей ситуации.
Почему наш сигнал оставался скрытым
Несмотря на наличие полностью функционального и хорошо структурированного класса распознавания свечных паттернов, вы могли столкнуться с неприятной реальностью: он не отображается в списке выбора сигналов мастера MQL5. Это происходит потому, что мастер не сканирует автоматически классы, наследующие от CExpertSignal — он специально ищет классы со специальным заголовком идентификации.
Мастер MQL5 использует систему метаданных для идентификации доступных сигналов. Без соответствующего заголовка описания мастера наш класс как номер, которого нет в справочнике: формально существует, но его невозможно найти обычным способом. Мастеру необходимы четкие инструкции о том, как отображать наш сигнал, какие параметры следует предоставлять и как интегрировать его в процесс генерации советника.
В следующем разделе мы преобразуем наш невидимый сигнал в полностью интегрированный компонент мастера, добавив важный заголовок метаданных, который делает его обнаруживаемым и настраиваемым в среде разработки MQL5. Это небольшое дополнение позволит устранить разрыв между нашей сложной логикой распознавания паттернов и удобным интерфейсом мастера, который делает разработку MQL5 доступной для трейдеров любого уровня опыта.
Обеспечение совместимости с мастером: секретный ингредиент для интеграции сигналов в MQL5
Заголовок описания мастера
Представьте, что вы создали сложный торговый сигнал, но это как роскошный автомобиль без ключей — функционально идеальный, но непригодный для использования. Заголовок описания мастера — это тот набор ключей, который открывает доступ к совместимости с мастером MQL5. Этот специальный блок комментариев служит связующим звеном между вашим пользовательским кодом и интерфейсом мастера, предоставляя все необходимые метаданные для корректного отображения, настройки и интеграции сигнала.
// wizard description start //+--------------------------------------------------------------------------------------------------------------+ //| Description of the class | //| Title=Signals of candlestick patterns | //| Type=SignalAdvanced | //| Name=Candlestick Patterns | //| ShortName=Candle | //| Class=CMyCandlePatternSignal | //| Page=signal_candle_pattern | //| Parameter=PatternDoji,int,60,Weight for Doji pattern | //| Parameter=PatternEngulfing,int,80,Weight for Engulfing pattern | //| Parameter=PatternHammer,int,70,Weight for Hammer pattern | //| Parameter=PatternMorningStar,int,90,Weight for Morning Star pattern | //| Parameter=DojiThreshold,double,0.1,Doji body threshold (relative to range) | //| Parameter=EngulfingRatio,double,1.5,Engulfing ratio (current body must be at least this times previous body) | //+--------------------------------------------------------------------------------------------------------------+ // wizard description end
Это не просто комментарий — это структурированный формат данных, который мастер MQL5 активно сканирует при заполнении своей библиотеки сигналов. Без этого точного формата ваш сигнал останется невидимым, независимо от того, насколько хорошо он написан.
Понимание директив мастера
Каждая директива в описании мастера служит определенной цели, действуя как поля на идентификационной карте, которую мастер использует для понимания и классификации вашего сигнала. Заголовок — это то, что пользователи видят в списке выбора, Type классифицирует ваш сигнал для надлежащей обработки, а name и shortName становятся частью структуры кода сгенерированного советника.
//| Title=Signals of candlestick patterns | //| Type=SignalAdvanced | //| Name=Candlestick Patterns | //| ShortName=Candle | //| Class=CMyCandlePatternSignal |
Директива Type=SignalAdvanced имеет решающее значение — она сообщает мастеру, что это сложный сигнал, использующий систему взвешенного голосования. Никогда не меняйте её, если только вы не создаёте торговый модуль другого типа.
Магия параметров: трансформация программного кода в удобные для пользователя параметры настройки
Самое важное преимущество совместимости с мастером заключается в том, как он преобразует методы-установщики вашего класса в удобные для пользователя входные параметры. Каждая директива параметра соответствует одному из ваших публичных методов-установщиков, автоматически создавая соответствующие поля ввода в панели настроек советника.
//| Parameter=PatternDoji,int,60,Weight for Doji pattern | //| Parameter=PatternEngulfing,int,80,Weight for Engulfing pattern | //| Parameter=PatternHammer,int,70,Weight for Hammer pattern |
Разбор синтаксиса параметров:
- Имя: должно точно совпадать с именем метода-установщика, указанного в классе (без префикса "Pattern")
- Тип: тип данных (int, double, string и т. д.)
- Значение по умолчанию: начальное значение, которое отображается в мастере.
- Описание: текст справки, который помогает пользователям в использовании параметров
- Структура файлов и соглашения об именовании: организационная основа
Надлежащая организация файлов — это последний элемент головоломки совместимости. Мастер MQL5 ожидает, что файлы сигналов будут соответствовать определённым соглашениям об именовании и находиться точно в нужном каталоге. Такой структурированный подход обеспечивает согласованность во всей экосистеме MQL5.
//+------------------------------------------------------------------+ //| SignalCandlePattern.mqh | //| Copyright 2025, Clemence Benjamin | //+------------------------------------------------------------------+ #include <Expert\ExpertSignal.mqh>
Существенные требования:
- Размещение: Должен находиться по адресу: MQL5/Include/Expert/Signal/
- Именование файлов: должно соответствовать паттерну Signal[YourSignalName].mqh.
- Именование классов: должно соответствовать директиве класса в описании мастера.
- Оператор Include: для базовой функциональности необходимо включить ExpertSignal.mqh.
Полная интеграция: как все это работает вместе
Если вы корректно реализовали совместимость с мастером, преобразование будет впечатляющим. Ваш сигнал становится полноправным участником экосистемы мастера MQL5, отображаясь рядом со всеми встроенными сигналами с тем же уровнем интеграции и удобства использования.
Что получает пользователь:
- Обнаружение: ваш сигнал отображается в алфавитном списке сигналов.
- Конфигурация: все параметры отображаются с полезными описаниями и значениями по умолчанию
- Интеграция: мастер автоматически генерирует соответствующий код инициализации.
- Комбинация: Ваш сигнал можно комбинировать с другими сигналами
Критические факторы успеха для совместимости с мастером
1. Точное форматирование директив
Описание мастера должно использовать точное форматирование без отклонений. Маркеры // начала и // конца описания мастера являются обязательными и каждая директива должна располагаться на отдельной строке с надлежащим синтаксисом.
2. Согласованность параметров и методов
Каждая директива параметра должна иметь соответствующий публичный метод-установщик в вашем классе. Мастер генерирует код, который вызывает эти методы, поэтому любое несоответствие приведет к ошибкам компиляции в сгенерированном советнике.
3. Точность расположения файла
Ваш файл сигнала должен находиться в точном корректном каталоге. Мастер сканирует только MQL5/Include/Expert/Signal/ на наличие совместимых сигналов, поэтому даже небольшое отклонение в расположении файла сделает ваш сигнал невидимым.
4. Требование перезапуска MetaEditor
После создания или изменения файла сигнала необходимо перезапустить MetaEditor, чтобы мастер обнаружил изменения. Мастер сканирует доступные сигналы во время запуска, поэтому новые сигналы не появятся до следующего запуска.
Проверка совместимости с мастером
После реализации заголовка описания мастера проверьте его корректность, выполнив следующие шаги:
- Перезапустите MetaEditor, чтобы обновить кэш сигналов
- Запустите мастер MQL5 и создайте новый советник
- Нажмите "Add" в разделе Signals.
- Найдите свой сигнал в алфавитном списке
- Выберите свой сигнал и убедитесь, что все параметры отображаются корректно
Преобразование завершено
Благодаря надлежащей реализации совместимости с мастером ваш пользовательский сигнал свечных паттернов преобразуется из скрытого для мастера класса в полностью интегрированный торговый компонент. Теперь пользователи могут находить ваш сигнал, настраивать его параметры через интуитивно понятный интерфейс и комбинировать его с другими сигналами для создания сложных торговых систем — и все это без единой строки кода.
Этот уровень совместимости представляет собой мост между сложным программированием и доступной разработкой торговых стратегий, воплощая философию MQL5, которая делает продвинутую автоматизацию торговли доступной для всех, независимо от их уровня программирования.
После обеспечения совместимости пришло время сгенерировать наш советник. В следующих нескольких шагах мы рассмотрим этот процесс и изучим код, созданный мастером.
- Запустите мастер MQL5 (Создайте новый документ, Ctrl + N в MetaEditor 5)
- Задайте свойства советника
- Добавьте и настройте сигнал на основе свечных паттернов
- Выберите модуль трейлинг-стопа
- Настройте управление капиталом

Запуск мастера
Как устроен советник, сгенерированный мастером
Мастер MQL5 только что преобразовал наш пользовательский свечной сигнал в полноценный, функциональный советник. Сгенерированный код представляет собой сложную торговую систему, которая обрабатывает все сложные аспекты автоматической торговли, оставляя стратегические решения нашей логике сигнала. Давайте разберем эту профессиональную архитектуру и поймем, как каждый компонент способствует созданию надежной торговой системы.
//+------------------------------------------------------------------+ //| Expert Candlestick Wizard.mq5 | //| Copyright 2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com" #property version "1.00"
Эти объявления свойств определяют идентичность советника и обеспечивают контроль версий. Несмотря на кажущуюся простоту, они имеют решающее значение для профессионального распространения и отслеживания различных версий вашей торговой системы.
Фреймворк советника: архитектура профессионального уровня
Мастер генерирует код, который использует развитый фреймворк советников MQL5, обеспечивающий стандартизированную архитектуру для всех торговых операций. Этот фреймворк обрабатывает сложные аспекты управления ордерами, обработки событий и обработки ошибок, чтобы мы могли сосредоточиться на своей торговой стратегии.
//+------------------------------------------------------------------+ //| Include | //+------------------------------------------------------------------+ #include <Expert\Expert.mqh> //--- available signals #include <Expert\Signal\SignalCandlePattern.mqh> //--- available trailing #include <Expert\Trailing\TrailingParabolicSAR.mqh> //--- available money management #include <Expert\Money\MoneySizeOptimized.mqh>
Мастер использует компонентно-ориентированную архитектуру, где сигналы, управление капиталом и трейлинг-стопы являются отдельными модулями. Это обеспечивает невероятную гибкость — вы можете легко заменить любой компонент, не затрагивая другие.
Интерфейс конфигурации: удобные параметры ввода
Раздел входных параметров преобразует наши технические торговые концепции в доступные настройки, которые любой трейдер может понять и настроить. Именно здесь особенно заметны преимущества мастера — он автоматически создает полноценный интерфейс конфигурации на основе параметров нашего класса сигналов.
//+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ //--- inputs for expert input string Expert_Title ="Candlestick Wizard"; // Document name ulong Expert_MagicNumber =964602383; // bool Expert_EveryTick =false; // //--- inputs for main signal input int Signal_ThresholdOpen =10; // Signal threshold value to open [0...100] input int Signal_ThresholdClose =10; // Signal threshold value to close [0...100] input double Signal_PriceLevel =0.0; // Price level to execute a deal input double Signal_StopLevel =50.0; // Stop Loss level (in points) input double Signal_TakeLevel =50.0; // Take Profit level (in points) input int Signal_Expiration =4; // Expiration of pending orders (in bars)
Обратите внимание, как мастер устанавливает разумные значения по умолчанию. Пороговое значение в 10 означает, что для открытия сделки наши свечные паттерны должны сгенерировать не менее 10 "голосов". Эти значения по умолчанию обеспечивают безопасную начальную точку для тестирования.
Конфигурация для конкретного сигнала: наши пользовательские параметры
Здесь отображаются наши пользовательские параметры свечных сигналов, автоматически сгенерированные из заголовка описания мастера, который мы создали ранее. Каждый параметр напрямую соответствует методам-установщикам в нашем классе сигналов.
input int Signal_Candle_PatternDoji =60; // Candlestick Patterns(60,80,...) Weight for Doji pattern input int Signal_Candle_PatternEngulfing =80; // Candlestick Patterns(60,80,...) Weight for Engulfing pattern input int Signal_Candle_PatternHammer =70; // Candlestick Patterns(60,80,...) Weight for Hammer pattern input int Signal_Candle_PatternMorningStar =90; // Candlestick Patterns(60,80,...) Weight for Morning Star pattern input double Signal_Candle_DojiThreshold =0.1; // Candlestick Patterns(60,80,...) Doji body threshold (relative to range) input double Signal_Candle_EngulfingRatio =1.5; // Candlestick Patterns(60,80,...) Engulfing ratio (current body must be at least this times previ input double Signal_Candle_Weight =1.0; // Candlestick Patterns(60,80,...) Weight [0...1.0]
Веса отражают относительную силу каждого паттерна — поглощающие паттерны (80) считаются более сильными сигналами, чем молоты (70), а утренние звезды (90) — наиболее значимыми. Эта система взвешивания позволяет осуществлять сложную приоритезацию сигналов.
Интеграция управления рисками: профессиональные торговые компоненты
Мастер не ограничивается только генерацией сигналов — он интегрирует комплексное управление рисками с помощью трейлинг-стопов и модулей управления капиталом. Это превращает наш простой сигнал в полноценную торговую систему.
//--- inputs for trailing input double Trailing_ParabolicSAR_Step =0.02; // Speed increment input double Trailing_ParabolicSAR_Maximum =0.2; // Maximum rate //--- inputs for money input double Money_SizeOptimized_DecreaseFactor=3.0; // Decrease factor input double Money_SizeOptimized_Percent =10.0; // Percent
Трейлинг-стоп Parabolic SAR будет автоматически защищать прибыль, перемещая стоп-лоссы по мере того, как сделка движется в нашу пользу. Система управления капиталом гарантирует, что мы никогда не рискуем более чем одним процентом от нашего счета на одной сделке.
Основной объект советника
В основе каждого созданного с помощью мастера советника лежит объект CExpert — сложный торговый движок, который координирует все компоненты и обрабатывает сложную логику исполнения сделок, мониторинга и управления.
//+------------------------------------------------------------------+ //| Global expert object | //+------------------------------------------------------------------+ CExpert ExtExpert;
Этот единый объект управляет всем торговым процессом, от получения рыночных данных через наш сигнал до исполнения сделок, управления открытыми позициями с помощью трейлинг-стопов и надлежащего управления капиталом.
Мастерство инициализации: создание торговой системы
Функция OnInit() — это то, где наша торговая система оживает. Эта тщательно скоординированная последовательность гарантирует, что все компоненты должным образом инициализированы, настроены и проверены до начала любой торговли.
//+------------------------------------------------------------------+ //| Initialization function of the expert | //+------------------------------------------------------------------+ int OnInit() { //--- Initializing expert if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) { //--- failed printf(__FUNCTION__+": error initializing expert"); ExtExpert.Deinit(); return(INIT_FAILED); }
Обратите внимание на всестороннюю проверку ошибок на каждом шаге. Если какой-либо компонент не инициализируется, советник корректно завершает работу и сообщает о конкретной ошибке. Это предотвращает торговлю с неполными или неправильно настроенными системами.
Создание и настройка сигналов: воплощение нашей стратегии в жизнь
В этом разделе создается и настраивается наш пользовательский свечной паттерн, а также входные параметры преобразуются в торговую стратегию в реальном времени. Мастер автоматически генерирует именно тот код, который необходим для создания экземпляра и настройки нашего класса сигналов.
//--- Creating signal CExpertSignal *signal=new CExpertSignal; if(signal==NULL) { //--- failed printf(__FUNCTION__+": error creating signal"); ExtExpert.Deinit(); return(INIT_FAILED); } //--- ExtExpert.InitSignal(signal); signal.ThresholdOpen(Signal_ThresholdOpen); signal.ThresholdClose(Signal_ThresholdClose); signal.PriceLevel(Signal_PriceLevel); signal.StopLevel(Signal_StopLevel); signal.TakeLevel(Signal_TakeLevel); signal.Expiration(Signal_Expiration);
Базовый объект CExpertSignal предоставляет инфраструктуру голосования, которую будет использовать наш пользовательский сигнал. Уровни threshold, stop и take определяют, как сигналы преобразуются в фактические торговые решения.
Интеграция пользовательских сигналов: наши свечные паттерны выходят на первый план
Здесь наш пользовательский сигнал на основе свечных паттернов интегрируется в торговую систему. Мастер создает экземпляр нашего конкретного класса сигналов и настраивает его со всеми определенными нами параметрами.
//--- Creating filter CMyCandlePatternSignal CMyCandlePatternSignal *filter0=new CMyCandlePatternSignal; if(filter0==NULL) { //--- failed printf(__FUNCTION__+": error creating filter0"); ExtExpert.Deinit(); return(INIT_FAILED); } signal.AddFilter(filter0); //--- Set filter parameters filter0.PatternDoji(Signal_Candle_PatternDoji); filter0.PatternEngulfing(Signal_Candle_PatternEngulfing); filter0.PatternHammer(Signal_Candle_PatternHammer); filter0.PatternMorningStar(Signal_Candle_PatternMorningStar); filter0.DojiThreshold(Signal_Candle_DojiThreshold); filter0.EngulfingRatio(Signal_Candle_EngulfingRatio); filter0.Weight(Signal_Candle_Weight);
Соглашение об именовании "filter0" раскрывает мощную функцию — мастер может комбинировать несколько сигналов. Мы можем добавить filter1, filter2 и т. д., каждый с различными торговыми стратегиями, которые работают вместе.
Полная интеграция системы: компоненты управления рисками
Инициализация продолжается добавлением профессиональных трейлинг-стопов и управления капиталом, создавая полную, готовую к использованию торговую систему, которая управляет как сигналами входа, так и контролем рисков.
//--- Creation of trailing object CTrailingPSAR *trailing=new CTrailingPSAR; if(trailing==NULL) { //--- failed printf(__FUNCTION__+": error creating trailing"); ExtExpert.Deinit(); return(INIT_FAILED); } //--- Add trailing to expert (will be deleted automatically)) if(!ExtExpert.InitTrailing(trailing)) { //--- failed printf(__FUNCTION__+": error initializing trailing"); ExtExpert.Deinit(); return(INIT_FAILED); } //--- Set trailing parameters trailing.Step(Trailing_ParabolicSAR_Step); trailing.Maximum(Trailing_ParabolicSAR_Maximum);
Трейлинг-стоп Parabolic SAR будет динамически корректировать стоп-лоссы в зависимости от движения цены, фиксируя прибыль, предоставляя при этом возможность для развития сделок.
Управление капиталом: профессиональный размер позиции
Ни одна профессиональная торговая система не может считаться полной без надлежащего управления капиталом. Мастер включает в себя сложные модули расчета размера позиции, которые адаптируются к размеру счета и рыночным условиям.
//--- Creation of money object CMoneySizeOptimized *money=new CMoneySizeOptimized; if(money==NULL) { //--- failed printf(__FUNCTION__+": error creating money"); ExtExpert.Deinit(); return(INIT_FAILED); } //--- Add money to expert (will be deleted automatically)) if(!ExtExpert.InitMoney(money)) { //--- failed printf(__FUNCTION__+": error initializing money"); ExtExpert.Deinit(); return(INIT_FAILED); } //--- Set money parameters money.DecreaseFactor(Money_SizeOptimized_DecreaseFactor); money.Percent(Money_SizeOptimized_Percent);
Оптимизированная система управления капиталом рассчитывает размеры позиций на основе эквити счета, обеспечивая постоянный уровень риска независимо от размера счета.
Проверка системы и инициализация индикаторов
Перед началом торгов советник проводит всестороннюю проверку и подготавливает все необходимые технические индикаторы. Это гарантирует полную готовность системы к реальным рыночным условиям.
//--- Check all trading objects parameters if(!ExtExpert.ValidationSettings()) { //--- failed ExtExpert.Deinit(); return(INIT_FAILED); } //--- Tuning of all necessary indicators if(!ExtExpert.InitIndicators()) { //--- failed printf(__FUNCTION__+": error initializing indicators"); ExtExpert.Deinit(); return(INIT_FAILED); } //--- ok return(INIT_SUCCEEDED); }
Процесс проверки подтверждает надлежащую настройку и совместимость всех компонентов. Инициализация индикаторов гарантирует готовность всех инструментов технического анализа к обработке данных в реальном времени.
Архитектура, управляемая событиями: эффективная обработка рыночных событий
Мастер создает архитектуру, управляемую событиями, которая эффективно обрабатывает рыночные события без излишнего использования ресурсов ЦП. Это обеспечивает оптимальную эффективность даже в периоды высокой волатильности.
//+------------------------------------------------------------------+ //| Deinitialization function of the expert | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ExtExpert.Deinit(); } //+------------------------------------------------------------------+ //| "Tick" event handler function | //+------------------------------------------------------------------+ void OnTick() { ExtExpert.OnTick(); } //+------------------------------------------------------------------+ //| "Trade" event handler function | //+------------------------------------------------------------------+ void OnTrade() { ExtExpert.OnTrade(); } //+------------------------------------------------------------------+ //| "Timer" event handler function | //+------------------------------------------------------------------+ void OnTimer() { ExtExpert.OnTimer(); } //+------------------------------------------------------------------+
Делегируя всю обработку событий фреймворку CExpert, советник обеспечивает эффективность и надежность профессионального уровня. Фреймворк обрабатывает тиковые события, торговые события и события таймера с оптимизированной эффективностью.
Оценка сгенерированного советника: сильные стороны и возможности для улучшения
Что отлично:
- Профессиональная архитектура с надлежащей обработкой ошибок
- Комплексная интеграция управления рисками
- Модульная архитектура, позволяющая легко заменять компоненты
- Управляемая событиями эффективность
- Проверка и инициализация, готовые к практическому использованию
Области для усовершенствования:
- Ограниченные возможности отладки и логирования
- Базовые сообщения об ошибках без контекста
- Отсутствие отслеживания эффективности или статистики
- Отсутствие подтверждения и проверки сделок
- Отсутствие адаптации к рыночным условиям
Тестирование
После успешного создания нашего советника с помощью мастера MQL5 следующим важным этапом стала проверка его эффективности и торгового поведения в тестере стратегий. Этот этап тестирования послужил окончательным подтверждением концепции, продемонстрировав, что наш пользовательский свечной паттерн может успешно выявлять торговые возможности и исполнять ордера в смоделированных рыночных условиях.
Достигнутые цели тестирования:
- Исполнение ордеров: подтверждено, что советник корректно открывает позиции BUY и SELL
- Точность сигнала: подтверждено, что свечные паттерны приводят к принятию соответствующих торговых решений
- Управление рисками: наблюдается динамическая корректировка трейлинг-стопов для защиты прибыли
- Стабильность системы: подтверждено, что советник работает без ошибок в различных рыночных условиях
Анимированная демонстрация наглядно показывает работу нашего советника — открытие сделок на основе распознавания свечных паттернов, в то время как трейлинг-стопы Parabolic SAR активно управляют рисками, постепенно фиксируя прибыль по мере того, как сделки движутся в нашу пользу.

Тестирование сгенерированного советника
Заключение
Наш путь разработки от простой концепции свечных паттернов до полностью функционального советника показывает, как мастер MQL5 изменил разработку алгоритмической торговли. Освоив совместимость с мастером и понимая сгенерированную архитектуру, мы открываем возможность создавать сложные торговые системы с гораздо большей эффективностью.
Профессиональная алгоритмическая торговля теперь доступна разработчикам практически любого уровня квалификации. Мастер MQL5 сокращает разрыв между торговой экспертизой и навыками программирования, позволяя трейдерам сосредоточиться на логике стратегии, в то время как фреймворк берет на себя большинство деталей реализации на низком уровне.
В результате проведенных исследований был создан работающий советник и четкий план действий для постоянного совершенствования и профессионального роста в области алгоритмической торговли. Созданную нами основу можно бесконечно расширять — от базового распознавания паттернов до адаптивных многостратегических систем, способных справляться со сложными рыночными условиями. Теперь следующим шагом является оптимизация стратегии и ее настроек для достижения большей прибыльности. Можно интегрировать дополнительные фильтры для отбора сигналов и выбора только самых качественных сделок.
Мы все ценим прибыльность, но в большинстве случаев при разработке советников полезнее сначала сосредоточиться на корректности: убедиться, что советник исполняет ордера точно в соответствии с правилами. Далее прибыльность становится этапом оптимизации, как только логика становится стабильной и надежной.
Путь от концепции к коду завершен, но путь к мастерству в торговле продолжается — с более мощными инструментами и глубоким пониманием того, как создавать все более сложные и прибыльные торговые системы. Ниже приведена таблица исходных файлов; сами файлы прикреплены в конце статьи, чтобы вы могли их скачать и поэкспериментировать. До следующей публикации — оставайтесь на связи. Делитесь своими мыслями или задавайте вопросы в разделе комментариев.
Вложения
| Исходный файл | Описание: |
|---|---|
| SignalCandlePattern.mqh | Пользовательский класс сигнала Содержит полную реализацию нашей системы распознавания свечных паттернов. В этом файле определен класс CMyCandlePatternSignal, наследующий от CExpertSignal, включая методы распознавания паттернов для свечных формаций Доджи, Поглощение, Молот, Падающая звезда и других. Содержит заголовок описания, совместимый с мастером, для бесшовной интеграции с мастером MQL5. |
| Expert Candlestick Wizard.mq5 | Сгенерированный советник Полный торговый робот, автоматически сгенерированный мастером MQL5 с использованием нашего пользовательского класса сигналов. Включает интегрированное управление рисками с трейлинг-стопами Parabolic SAR, оптимизированное управление капиталом и профессиональную обработку ошибок. Готов к компиляции и развертыванию на платформе MetaTrader 5. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/20266
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Автоматизация торговых стратегий в MQL5 (Часть 45): Инверсный разрыв справедливой стоимости (IFVG)
ARD-регрессия на MQL5: автоматический отбор признаков и случайные признаки Фурье
От начального до среднего уровня: Очереди, списки и деревья (V)
Автоматизация торговых стратегий в MQL5 (Часть 44): Обнаружение смены характера рынка (CHoCH) по пробоям свинговых экстремумов
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования