Торговый бот: MQL5 или Python — выбор схемы и проверка ошибок

MQL5 и Python позволяют автоматизировать заранее определённый процесс, но язык сам не создаёт прибыльное правило. Сначала выберите доступ к счёту, источник данных, частоту решений и способ наблюдать за ошибками. Короткий скрипт не подтверждает правильность исполнения.

Сравнивайте схему работы, а не названия языков

Советник MQL5 выполняется в терминале MT5. Python может работать через официальный пакет MetaTrader5, через отдельный API брокера либо лишь анализировать исторические файлы. Пакет MetaTrader5 связывается с терминалом, а не напрямую со всеми брокерскими серверами. Страница пакета на PyPI показывает колёса Windows x86-64 для текущего выпуска; это ограничение опубликованной сборки пакета, а не всего языка Python.

Четыре разные схемы
СхемаЗависимостиПервая проверка
Советник MQL5Терминал, код, параметры, счётВерсия и ответ сервера
Python + MT5Процесс Python, терминал и связьНужный счёт после подключения
Python + API брокераАвторизация, адаптер, лимитыЕдиницы символа и права
Python для анализа, MQL5 для исполненияСовпадение правил и данныхТе же граничные входы

Справка initialize() допускает автоматический поиск и запуск терминала, а без указания номера счёта может использоваться последний счёт. Задайте путь установки, проверьте номер, сервер, среду demo/live и нужный символ. Успех подключения не говорит, исполнился ли предыдущий приказ.

Советник MQL5: сильная интеграция с условиями

MQL5 предоставляет события терминала, торговые функции и тестер. Тестер работает по выбранным данным и модели, а не воспроизводит всю историю реального исполнения. ONNX-модель можно запускать средствами MQL5, так что обучение модели в Python не всегда означает постоянный процесс Python при исполнении. При переносе сверяйте форму входов, предобработку и смысл выхода модели.

Согласно официальной справке, если событие NewTick уже стоит в очереди или обрабатывается, ещё одно такое событие не добавляется. Следовательно, OnTick() не гарантирует отдельный вызов для каждого поступившего тика. Измеряйте нагрузку и задержку в своей конфигурации; нет универсального обещания миллисекундного отклика или превосходства языка при живом исполнении.

Python не отменяет проверки данных и адаптера

Библиотеки Python помогают исследованию и построению моделей. При подключении брокера всё равно нужны его обозначения символов, размер контракта, единицы количества, торговые часы, правила приказов и права доступа. Храните версии зависимостей и конфигурацию. Оригинальный репозиторий ib_insync помечен архивным с 14 марта 2024 года; это не доказывает, что старый код не работает, но старый учебник не подтверждает текущую поддержку выбранной интеграции.

Не записывайте секреты в публичный код или обычные логи. Для проверки аналитической формулы достаточно данных без права отправлять приказ. Установка библиотеки не заменяет проверку конкретной компании брокера и продукта.

Два разных гибридных процесса

В первом варианте Python создаёт модель и тесты, а проверенное правило исполняет советник MQL5; тогда Python не обязан оставаться включённым, если вся необходимая логика перенесена. Во втором Python непрерывно отправляет запросы через терминал; оба процесса, свежесть данных и состояние счёта нужно наблюдать одновременно. Виртуальный хостинг MetaQuotes переносит среду советника, но не служит универсальным рабочим столом для произвольного внешнего процесса Python.

Документированная функция order_send() отправляет запрос и возвращает структуру результата. Закрытие позиции требует подходящего действия и идентификатора позиции; не следует предполагать универсальную функцию position_close() в официальном пакете. При потерянном ответе сначала сверяйте активные приказы, сделки и позиции, затем принимайте решение о повторе.

Вымышленный случай потерянного ответа. Система запрашивает покупку 0,10 лота. Приказ полностью исполняется, но ответ теряется; слепой повтор тоже исполняется, так что вместо 0,10 возникает 0,20 лота. При явно принятом контракте EUR/USD 100 000 EUR на лот, пункте 0,0001 и счёте USD чувствительность меняется с 1 до 2 USD за пункт. Это условный сценарий с двумя исполнениями, не предположение, что каждый неизвестный запрос исполнен.

Отрицание сравнения может принять пропущенные данные

При x равном NaN выражение not(x меньше или равно 10) истинно, x больше 10 ложно, math.isfinite(x) ложно.

На узком экране прокрутите диаграмму вбок.

Скалярный Python float, x = float('nan'), вымышленный порог 10. Отсутствующее значение блокирует правило в предложенной реализации; для массивов и других типов требуются отдельные проверки.

Для скалярного float('nan') сравнение x <= 10 ложно, поэтому not(x <= 10) истинно. Но x > 10 тоже ложно. Для конечных чисел эти две формулировки часто выглядят равносильными, а для NaN — нет. Отдельная проверка math.isfinite(x) and x > 10 не пропускает этот вход. Не заменяйте пропуск нулём без отдельного правила и записи такого решения.

Сверяйте границы правила и исполнения

Вымышленная разница входа. Сигнал известен после закрытия свечи по 1,1000; модель A покупает по этой цене, модель B по более позднему Ask 1,1003. Разница составляет три пункта EUR/USD при размере пункта 0,0001. Вклад могут иметь время, движение рынка и сторона котировки; всю разницу нельзя назвать «накладными расходами Python» или спредом. Сопоставляйте отметки сигнала, запрос, объём, исполнение и издержки по отдельности.

Граничный тест Python также показывает, что 0.1 + 0.2 даёт 0.30000000000000004, а не точный объект 0.3. Decimal('0.1') + Decimal('0.2') в этой модели равен Decimal('0.3'); целые единицы дают 1 + 2 = 3. Определите единицу и правило округления до переноса логики. В тест включайте значения ниже порога, ровно на пороге, выше него, пропущенные и бесконечные. Массивы NumPy и MQL5 проверяйте отдельно — эти примеры не исполняют за них код.

Выбирайте по воспроизводимому требованию

Запишите счёт и API, данные, момент решения, необходимые библиотеки, систему размещения и способ контроля. Небольшой прототип может только читать данные и писать сигналы в журнал, без торговых прав. Если важна задержка, измерьте её в конкретной схеме; интервал свечи не доказывает, что задержка всегда безразлична.

Сравните расходы и способность поддерживать конфигурацию. Длина файла, время первого запуска и название языка не устанавливают будущую надёжность или доходность. Если нужное действие проще выполнить вручную на демо, зафиксируйте это как альтернативу до автоматизации.

Порядок следующего теста

  1. Зафиксируйте небольшое правило, единицы, доступность входов и ожидаемую границу.
  2. Укажите полный путь терминала или API, номер и тип счёта, символ и права; аналитический тест оставьте без права отправлять приказ.
  3. Проверьте на демо отказ, неполное исполнение, пропуск данных, перезапуск и потерю ответа.
  4. После неопределённого ответа сверяйте историю, активные приказы и позиции до любого повторения.
  5. Сопоставляйте отдельные сигналы и исполнения до агрегирования прибыли теста.

Проверьте понимание

Что возвращает not(x <= 10) для скалярного Python float NaN?

Ответ и объяснения без JavaScript

Правильный ответ: True, хотя данных нет.

False, поскольку значение отсутствует.

Сравнение x <= 10 ложно; его отрицание становится истинным.

True, хотя данных нет.

Верно. Перед правилом нужна независимая проверка наличия и конечности.

NaN автоматически превращается в 0.

Это выражение не выполняет такой замены.

Вопросы и ответы

Подключается ли официальный пакет MetaTrader5 прямо к любому серверу брокера?

Нет. Он связывается с установленным терминалом MT5; затем нужно проверить счёт и сервер.

Означает ли успешный order_send() исполнение сделки?

Нет. Проверяйте результат запроса и фактические приказы, сделки и позиции; при потерянном ответе не повторяйте вслепую.

Можно ли запустить произвольный Python-скрипт на виртуальном хостинге MetaQuotes?

Справка описывает перенос среды терминала и советников, а не универсальный рабочий стол для внешнего процесса.

Источники и пределы применения

  1. MetaQuotes — Python Integration

    Связь пакета Python с терминалом.

  2. MetaQuotes — initialize()

    Путь терминала, последний счёт и проверка подключения.

  3. MetaQuotes — order_send()

    Структура запроса и результата, идентификатор позиции.

  4. MetaQuotes — OnTick

    Очередь NewTick и отсутствие повторного события во время обработки.

  5. MetaQuotes — ONNX models

    Исполнение модели в MQL5.

  6. MetaQuotes — Virtual Hosting Migration

    Состав среды, переносимой на сервер.

  7. Python — Expressions

    Сравнения float NaN.

  8. Python — math.isfinite

    Проверка конечности числа.

  9. Python — Floating-Point Arithmetic

    Представление 0.1 и пределы точности.

  10. PyPI — MetaTrader5

    Опубликованные файлы Windows x86-64 текущего выпуска.

  11. GitHub — original ib_insync repository

    Архивный статус оригинального репозитория, не оценка всех ответвлений.

Функции MetaQuotes, Python и отдельных API зависят от продукта, счёта, версии и доступных прав. Цены, объёмы и результаты примеров вымышлены; материал не является инвестиционной рекомендацией.