English Deutsch 日本語
preview
Связь торговых роботов MetaTrader 5 с внешними брокерами через API и Python

Связь торговых роботов MetaTrader 5 с внешними брокерами через API и Python

MetaTrader 5Примеры |
242 5
Clemence Benjamin
Clemence Benjamin

Введение

Сегодня мы рассмотрим, как установить бесперебойную связь между нашими советниками MetaTrader 5 и внешними брокерами с помощью интеграции API. Основная цель состоит в том, чтобы решить проблему нехватки средств на торговых счетах, включив автоматическое пополнение счета, когда баланс падает ниже установленного порога.  Такой подход эффективно решает важнейшие вопросы управления средствами, повышая как эффективность, так и безопасность торговых операций.

Как правило, мы следуем обычной процедуре входа на портал нашей учетной записи брокера для совершения различных транзакций. Хотя это традиционный подход, существует мощная функция, называемая API (интерфейс программирования приложений), позволяющая делать гораздо больше и оптимизировать наш подход. Для некоторых из вас это может быть знакомым термином. Однако для остальных я разбью его на простые для понимания разделы, чтобы все были на одной странице:

  1. Что такое API?
  2. Использование API
  3. Доступ к API
  4. Документация API

Давайте рассмотрим их более подробно:

1. Что такое API?

API (интерфейс программирования приложений) обеспечивает внешнее взаимодействие с программной системой. В этом контексте он дает нам возможность выполнять операции с нашими брокерскими счетами непосредственно на сервере — без необходимости входа в систему вручную.

Интересно, что API-интерфейсы существуют с 1940-х годов, но получили широкое распространение в 1970-х годах, а также добились всеобщего принятия после 2000 года.

2. Использование API

API-интерфейсы облегчают взаимодействие между программными приложениями и системами. Вот некоторые из распространенных областей применения:

  • Серверы веб-сайтов
  • Мобильные приложения

API-интерфейсы обеспечивают беспрепятственный доступ к данным из различных источников, таких как:

  • Платформы социальных сетей
  • Облачное хранилище
  • Платежные шлюзы
  • Метеостанции
  • Биржи и финансовые рынки

API

API как мост между внешними компьютерами и облачными серверами.


3. Доступ к API

Для использования API, как правило, необходимо следующее:

  • Получить API-ключ от провайдера.
  • Изучать документацию по API, чтобы корректно его интегрировать.
  • Включить ключ API в качестве параметра в свои запросы на аутентификацию и авторизацию.
Ключ API имеет решающее значение для идентификации вашего приложения или пользователя при обеспечении безопасного доступа.

    4. Документация API

    Каждый API поставляется со своим собственным руководством пользователя и спецификациями. В них подробно описано, как эффективно взаимодействовать с API. Например, документация для API Telegram существенно отличается от документации для API брокера, такой как API брокера от Deriv.

    Понимая и используя API-интерфейсы, можно оптимизировать наши операции, автоматизировать процессы и повысить эффективность управления нашими брокерскими счетами. Давайте углубимся в каждый аспект и рассмотрим его практическую реализацию.

    Вот список основных разделов нашего обсуждения:


    Краткий обзор этого обсуждения

    В настоящей статье мы рассмотрим использование MQL5 с API брокера для облегчения бесперебойных операций по управлению фондами. Наша цель - раскрыть огромный потенциал, предлагаемый советниками на MQL5. Поскольку сам по себе MQL5 не может напрямую взаимодействовать с веб-серверами, мы будем использовать внешние языковые библиотеки, такие как Python или Node.js, в зависимости от возможностей API брокера. В этом обсуждении мы сосредоточимся на Deriv.com в качестве выбранного нами брокера.

    Преимущества этого подхода

    • Автоматизированные переводы средств: Советник автоматизирует перевод торговой прибыли с торгового счета на защищенный счет.
    • Пополнение торгового счета: Пополнит баланс торгового счета, если средства на счете упадут ниже заранее установленного порога.
    • Непрерывные операции: Благодаря размещению советника на виртуальном сервере система может работать в режиме 24/7 с практически неограниченными возможностями управления средствами.

    Проблемы и особенности

    • Риск истощения средств: Зарезервированные средства могут быть исчерпаны, если советник продолжит пополнять баланс без получения постоянной прибыли.
    • Потребность в надежном управлении средствами: Должна быть внедрена сложная система управления средствами, позволяющая останавливать операции в случае нарушения определенных пороговых значений потерь или собственного капитала.

    В следующих разделах мы рассмотрим возможности API Deriv broker, разработаем код на Python для обеспечения бесперебойного взаимодействия с API и интегрируем это решение с советником на MQL5, предназначенным для эффективного и надежного управления средствами. Все это представлено в виде простых пошаговых инструкций для удобства понимания и реализации.

    Basic Bi-directional Flow EA to Broker API

    Двунаправленный обмен данными между MQL5 и брокером


    Deriv API

    Deriv.com это популярный брокерский сервис, который поддерживает MetaTrader 5 и предлагает доступ к API для автоматизированных операций. Подробную информацию можно найти в документации Deriv API. Для начала выполните действия, описанные на их веб-сайте, чтобы зарегистрироваться для доступа к API.

    В образовательных целях вам нужно будет создать приложение на панели управления Deriv API. Во время этого процесса выберите демо-счет и сгенерируйте токен API с соответствующим уровнем доступа. Для этой презентации я рекомендую выбрать уровень доступа Trade API, поскольку он позволяет выполнять такие операции, как пополнение вашего демо-счета. Избегайте выбора уровня доступа администратора, если не уверены, что сможете безопасно управлять им, поскольку этот уровень предоставляет полный контроль над вашей учетной записью. Для предотвращения несанкционированного доступа необходимо хранить свой токен API в тайне и в безопасности.

    После создания токена API следующие шаги включают настройку клиента WebSocket на Python и интеграцию его с MQL5 для разработки программы, способной управлять операциями с учетной записью.

    Ключевые операции

    Основными функциями, которых мы стремимся достичь с помощью нашей программы, являются:

    • Внесение средств со своего счета Deriv на свой счет Deriv MetaTrader 5.
    • Взаимодействие с API Deriv для обеспечения бесперебойного управления фондами.

    Документация Deriv API содержит подробные инструкции по выполнению этих операций в разделе MT5 API. В рамках этого процесса вы получите два критических значения:

    • App ID: Идентифицирует ваше приложение на платформе Deriv.
    • Токен API: Предоставляет доступ для выполнения указанных действий.

    Исходя из этих значений, мы можем приступить к разработке клиента WebSocket на Python и интегрировать его с MQL5 для реализации нашей системы управления средствами.

    Вы и безопасность вашего API

    Безопасность - это важнейшая тема, которую нельзя упускать из виду. Точно так же, как вы защищаете свой телефон от несанкционированного доступа, не менее важно защитить ваши API-ключи от посторонних лиц. Токен API действует как шлюз для доступа к вашей учетной записи, и если он попадет в руки киберпреступников, вы можете стать уязвимыми для вредоносных действий. Они могут использовать вашу учетную запись и совершать несанкционированные действия без вашего ведома.

    В контексте Deriv платформа предоставляет уровни доступа к токену API, позволяющие вам выбирать разрешения, предоставляемые токену. Настоятельно рекомендуется использовать функции демонстрационного доступа и не выбирать доступ администратора без крайней необходимости. Уровень доступа администратора предоставляет полный контроль над вашей учетной записью, что создает значительный риск, если она попадет не в те руки.

    Этот совет не ограничивается Deriv; он применим к токенам API из любого сервиса. Относиться к ключам API необходимо как к паролям — сохранять их в тайне, хранить надежно и никогда не делиться ими с теми, кому вы не доверяете. Поступая таким образом, вы сводите к минимуму риск несанкционированного доступа и гарантируете, что ваша учетная запись остается защищенной.


    Библиотека Python для взаимодействия с API веб-сокетов

    Прежде всего, чтобы продолжить работу над этим проектом, нам нужно установить Python на компьютер. Далее нужно установить библиотеку WebSocket на Python, чтобы обеспечить веб-взаимодействие с API брокера. Deriv API использует WebSocket для высокоскоростной связи, поэтому важно соответствующим образом настроить наши компьютеры. Ниже приведена команда для установки библиотеки Python в Windows с помощью командной строки.

    pip install websocket-client

     Для установки библиотеки откройте командную строку в Windows и введите приведенную выше команду. Как только установка будет завершена, вы будете готовы приступить к запуску и тестированию. Однако, прежде чем продолжить, мы выполним следующие несколько шагов по разработке скрипта на Python, который будет обрабатывать взаимодействие между MetaTrader 5 и API брокера (API Deriv в качестве примера).


    Скрипт на Python для установления коммуникации между MetaTrader 5 и API брокера

    Я описал шаги по разработке скрипта на Python. Прежде чем приступить к созданию нашего советника по управлению средствами, углубимся в разработку этой программы. Откройте свой редактор кода (предпочтительнее Notepad++) и создайте новый файл. Следите за разработкой сценария, который мы назовем deriv_api_handler.py. Обязательно укажите расположение вашего скрипта, так как он понадобится позже в коде советника.

    1. Первоначальная установка и конфигурация

     Во-первых, мы хотим выполнить необходимый импорт, настроить параметры подключения и указать пути к файлам, по которым будет осуществляться обмен данными с MQL5. Начнем с импорта необходимых библиотек. Мы знаем, что библиотека json имеет решающее значение для синтаксического анализа и генерации данных JSON, которые являются форматом, используемым для отправки сообщений через WebSocket и обработки команд. Библиотека websocket выбрана для обработки подключения WebSocket к API Deriv, а time помогает программе вводить паузы в скрипт, когда это необходимо. Наконец, os позволяет взаимодействовать с файловой системой, например, проверять наличие командных файлов.

    import json
    import websocket
    import time
    import os
    
    # Configuration
    API_URL = "wss://ws.binaryws.com/websockets/v3?app_id= Your app ID"   #Replace with your App ID created in Deriv API dashboard
    API_TOKEN = "Your API token"   #Replace with your actual token
    
    # File paths (Replace YourComputerName with the actual name of your computer)
    MQL5_TO_PYTHON = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt"
    PYTHON_TO_MQL5 = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/python_to_mql5.txt"
    
    • Далее мы определяем URL-адрес нашего API и токен, поскольку это ключи, необходимые для авторизации нашего соединения WebSocket с сервером Deriv. Этот URL-адрес указывает на конечную точку WebSocket, а токен API - это то, что подтверждает нашу идентичность с сервером.
    • Наконец, мы указываем пути к файлам для взаимодействия с MQL5. Эти файлы будут служить связующим звеном между нашим скриптом на Python и MQL5, позволяя обмениваться командами и ответами. Мы должны быть осторожны при выборе путей, которые, как мы знаем, доступны для обеих систем (MQL5 и Python).

    2. Соединение WebSocket

    В этом разделе кода нашего скрипта мы устанавливаем безопасное соединение с API Deriv WebSocket и разрешаем скрипту выполнять запросы.

    def connect_to_deriv():
        """Connects to Deriv's WebSocket API."""
        try:
            ws.connect(API_URL)
            ws.send(json.dumps({"authorize": API_TOKEN}))
            response = json.loads(ws.recv())
            print(f"Authorization Response: {response}")
            if response.get("error"):
                print("Authorization failed:", response["error"]["message"])
                return False
            return True
        except Exception as e:
            print(f"Error during authorization: {e}")
            return False
    • Мы определяем функцию для управления соединением WebSocket. Сначала мы пытаемся подключиться к API, используя URL-адрес, который мы настроили ранее. Мы инициируем соединение с ws.connect(API_URL), а затем отправляем авторизационное сообщение, содержащее наш токен API. Это необходимо для аутентификации нашего скрипта на сервере Deriv.
    • Сразу же скрипт прослушивает ответ от сервера. Сервер вернет объект JSON, который подтверждает, было ли соединение успешным. Если он содержит ошибку, это означает, что токен был недействительным или возникла другая проблема. Такая обработка ошибок необходима для обеспечения корректного завершения работы скрипта.
    • Наше решение использовать блоки try-except гарантирует, что мы не завершим работу скрипта, если что-то пойдет не так с подключением или обменом сообщениями. Это мера безопасности, обеспечивающая программе гибкость при отладке и устранении неполадок без нарушения всего процесса.

    3. Обработка команд

    На этом этапе программа интерпретирует полученные команды и предпринимает соответствующие действия в зависимости от типа команды. После успешного подключения и аутентификации скрипт обработает команды из MQL5, отправленные в виде строки JSON, поэтому он будет готов к их анализу и обработке.
    • В функции process_command скрипт сначала пытается преобразовать команду в словарь Python. Это позволяет ему легко получать доступ к различным полям команды (например, к сумме депозита). Затем он проверяет наличие определенных ключей в проанализированном JSON (например, "mt5_deposit"), которые сообщают, какое действие запрашивает MQL5 для выполнения.
    • Если команда запрашивает депозит ("mt5_deposit"), для его обработки вызывается отдельная функция mt5_deposit. Такой модульный подход делает скрипт гибким и удобным в обслуживании, поскольку в будущем мы сможем легко добавлять другие типы команд.

    • Если команда неизвестна или неправильно отформатирована, она возвращает сообщение об ошибке, которое помогает системе MQL5 понять, что пошло не так.

    def process_command(command):
        """Processes a command from MQL5."""
        try:
            command_data = json.loads(command)  # Parse the JSON command
            if "mt5_deposit" in command_data:
                return mt5_deposit(
                    command_data["amount"],
                    command_data["from_binary"],
                    command_data["to_mt5"]
                )
            else:
                return {"error": "Unknown command"}
        except json.JSONDecodeError:
            return {"error": "Invalid command format"}
        except Exception as e:
            return {"error": f"Unexpected error: {e}"}
    

    4. Депозитная операция

    Этот раздел выполняет операцию внесения депозита в соответствии с запросом MQL5, отправляя необходимые данные в Deriv API. Мы создали специальную функцию (mt5_deposit) для внесения депозита. Это упорядочивает наш код и изолирует логику обработки депозитов, упрощая его обслуживание или расширение.
    • Внутри этой функции создается сообщение в формате JSON, которое сообщает Deriv о необходимости внесения депозита. Это сообщение содержит все необходимые данные, такие как сумма, исходный счет и целевой счет MT5. Отправка правильных данных в корректном формате имеет решающее значение для успешной обработки транзакции.
    • После отправки запроса на депозит ожидается ответ от сервера. Сразу после получения ответа он преобразуется в формат JSON и возвращается. Это позволяет системе MQL5 узнать, была ли операция выполнена успешно или неудачно.
    • Исключения обрабатываются в случае, если что-то пойдет не так с обменом данными или операцией внесения депозита, гарантируя, что ошибки будут зафиксированы и переданы обратно в MQL5.
    def mt5_deposit(amount, from_binary, to_mt5):
        """Performs a deposit operation to the MT5 account."""
        try:
            ws.send(json.dumps({
                "mt5_deposit": 1,
                "amount": amount,
                "from_binary": from_binary,
                "to_mt5": to_mt5
            }))
            response = ws.recv()
            return json.loads(response)
        except Exception as e:
            return {"error": f"Error during deposit operation: {e}"}
    

    5. Чтение команд из MQL5

    Это раздел кода, в котором команда из MQL5 проверяется и обрабатывается, если она доступна, и убедитесь, что одна и та же команда не обрабатывается повторно. Чтобы прочитать команды из MQL5, программа проверяет, существует ли файл mql5_to_python.txt. Именно здесь MQL5 записывает команды, которые необходимо обработать. Если файл существует, она считывает его содержимое. Удаляя ненужные пробелы и проверяя наличие BOM (маркеров последовательности байтов, Byte Order Mark), гарантирутся правильная обработка данных, независимо от несоответствий в форматировании.
    • Как только команда считана, она выводится на печать в целях отладки, чтобы можно было проверить, что содержимое было получено должным образом. После прочтения команды она удаляет файл, гарантируя, что та же команда не будет обработана повторно в будущем.
    • Если файл не существует, она возвращает None, сигнализируя о том, что команда для обработки отсутствует. Это помогает предотвратить ненужные проверки при отсутствии команды.
    def read_command():
        """Reads a command from the MQL5 file and deletes the file after reading."""
        print(f"Checking for command file at: {MQL5_TO_PYTHON}")
        if os.path.exists(MQL5_TO_PYTHON):
            print(f"Command file found: {MQL5_TO_PYTHON}")
            with open(MQL5_TO_PYTHON, "r", encoding="utf-8") as file:
                command = file.read().strip()
            print(f"Raw Command read: {repr(command)}")
            
            # Strip potential BOM and whitespace
            if command.startswith("\ufeff"):
                command = command[1:]
            
            print(f"Processed Command: {repr(command)}")
            os.remove(MQL5_TO_PYTHON)  # Remove file after reading
            return command
        print(f"Command file not found at: {MQL5_TO_PYTHON}")
        return None
    


    6. Написание ответов на MQL5

    Эта часть отправляет ответ обратно в MQL5, чтобы он мог предпринять дальнейшие действия на основе нашего результата.  После обработки команды и получения ответа он отправляется обратно в MQL5. Это делается путем записи ответа в файл python_to_mql5.txt, где MQL5 может его прочитать.
    • Чтобы убедиться, что ответ правильно отформатирован, словарь Python преобразуется в строку JSON с помощью функции json.dumps(). Запись этой строки JSON в файл гарантирует, что система MQL5 сможет корректно интерпретировать ответ.
    • Этот шаг важен, поскольку он завершает цикл обмена данными между Python и MQL5, позволяя MQL5 узнать, была ли операция выполнена успешно или неудачно, и предпринять соответствующие действия.
    def write_response(response):
        """Writes a response to the MQL5 file."""
        with open(PYTHON_TO_MQL5, "w", encoding="utf-8") as file:
            file.write(json.dumps(response))
    


    7. Главный цикл

    Мы создаем непрерывный цикл для чтения и обработки команд из MQL5, обеспечивая работу системы в режиме реального времени. Главный цикл - это сердце скрипта, где все сводится воедино. После успешного подключения и авторизации с помощью Deriv API он переходит в цикл, в котором постоянно проверяет наличие новых команд. Функция read_command вызывается для проверки того, есть ли новая команда для обработки.
    • Если команда найдена, она обрабатывается, и результат записывается обратно в MQL5. Если командный файл не существует или возникает ошибка, она корректно обрабатывается путем вывода сообщения об ошибке и выхода из цикла.
    • Этот цикл имеет решающее значение для поддержания работоспособности системы. Мы позаботились о том, чтобы скрипт не запускался бесконечно и не выходил из строя без предоставления полезной обратной связи. Реализуя блоки try-except, мы защищаем цикл от непредвиденных ошибок и гарантируем, что он не приведет к сбою сценария, а завершится без сбоев
    if __name__ == "__main__":
        if not connect_to_deriv():
            print("Failed to authorize. Exiting.")
            exit(1)
    
        print("Connected and authorized. Waiting for commands...")
        while True:
            try:
                command = read_command()
                if command:
                    print(f"Processing command: {command}")
                    response = process_command(command)
                    print(f"Response: {response}")
                    write_response(response)
                    print("Response written. Exiting loop.")
                    break  # Exit the loop after processing one command
                else:
                    print("No command file found. Exiting.")
                    break  # Exit the loop if the command file is not found
            except Exception as e:
                print(f"Error in main loop: {e}")
                break  # Exit the loop on unexpected error
    


    Советник по управлению средствами

    На данном этапе мы продолжим изучение процесса разработки советника управляющего средствами. Мы разработаем этот советник таким образом, чтобы он отслеживал баланс счета и предлагал пополнить его, если баланс упадет ниже указанного порога. Операция пополнения счета будет запущена с помощью скрипта на Python, который мы разработали ранее. Хотя этот советник не обладает всеми функциональными возможностями полноценного торгового советника, мы сосредоточимся на конкретном сегменте кода, интегрирующего взаимодействие с API брокера. Цель обсуждения - продемонстрировать потенциал интеграции API брокера с любым советником.

    Обзор плана разработки:

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

    Как правило, такие операции выполняются с помощью функции OnTimer(), что позволяет проводить периодические проверки и автоматизацию в течение длительного периода времени. Однако в целях тестирования и немедленной обратной связи я решил поместить эти операции в функцию OnInit(). Такой подход гарантирует, что API будет протестирован сразу после запуска советника. В долгосрочной перспективе функция OnTimer() будет лучше подходить для постоянного мониторинга баланса счета и запроса пополнения по мере необходимости. 

    1. Импорт метаинформации и библиотек

    В этом разделе настраиваются метаданные для советника (EA) и импортируется системная библиотека для выполнения внешних команд. Функция ShellExecuteW из библиотеки shell32.dll используется для запуска внешних приложений, таких как Python-скрипты, обеспечивая взаимодействие с внешними системами или API.

    //+------------------------------------------------------------------+
    //|                                             Fund Manager EA.mq5  |
    //|                                Copyright 2024, Clemence Benjamin |
    //|             https://www.mql5.com/en/users/billionaire2024/seller |
    //+------------------------------------------------------------------+
    #property copyright "Copyright 2024, Clemence Benjamin"
    #property link      "https://www.mql5.com/en/users/billionaire2024/seller"
    #property version   "1.01"
    #property description "Deposit and Withdraw funds between broker and trading account within the EA"
    
    #import "shell32.dll"
    int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
    #import
    


    2. Входные параметры для настройки

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

    input double balance_threshold = 100000.0;  // Threshold balance for top-up
    input double top_up_amount = 100000.0;      // Amount to top-up if balance is below threshold
    input string from_binary = "CR0000000";     // Binary account ID to withdraw funds from. Replace zero with real one
    input string to_mt5 = "MTRReplace";     // MT5 account ID to deposit funds into. Replace with your MT5 acc from Deriv Broker
    input string python_script_path = "C:\\Users\\YourComputerName\\PathTo\\deriv_api_handler.py"; // Python script path
    input string python_exe = "python";         // Python executable command (ensure Python is in PATH)
    


    3. Инициализация: Проверка баланса и депозит

    Функция OnInit является точкой входа советника. Сначала она извлекает текущий баланс счета с помощью AccountInfoDouble(ACCOUNT_BALANCE). Если баланс ниже указанного порогового значения, советник приступает к инициированию депозита.

    int OnInit()
      {
       double current_balance = AccountInfoDouble(ACCOUNT_BALANCE);
       Print("Current Account Balance: ", current_balance);
    
       if(current_balance < balance_threshold)
         {
          Print("Balance is below the threshold. Attempting a deposit...");
    


    4. Запись команды депонирования в файл

    Советник создает файл для взаимодействия со скриптом на Python. Файл содержит строку в формате JSON, указывающую команду депонирования, включая сумму, источник и данные целевого счета. Этот файл действует как интерфейс между MQL5 и системой Python.

    string command_file = "mql5_to_python.txt";
    string command_path = TerminalInfoString(TERMINAL_COMMONDATA_PATH) + "\\Files\\" + command_file;
    int handle = FileOpen(command_file, FILE_WRITE | FILE_COMMON | FILE_TXT | FILE_ANSI);
    
    string deposit_command = StringFormat("{\"mt5_deposit\": 1, \"amount\": %.2f, \"from_binary\": \"%s\", \"req_id\": 1, \"to_mt5\": \"%s\"}", top_up_amount, from_binary, to_mt5);
    FileWrite(handle, deposit_command);
    FileClose(handle);
    Print("Deposit command written to file: ", command_path);
    


    5. Запуск Python-скрипта

    Используя функцию ShellExecuteW, советник запускает Python-скрипт, указанный во входных параметрах. Скрипт обрабатывает запрос на пополнение счета и взаимодействует с внешними системами.

    int result = ShellExecuteW(0, "open", python_exe, python_script_path, NULL, 1);
    if(result <= 32)
      {
       Print("Failed to launch Python script. Error code: ", result);
       return(INIT_FAILED);
      }
    else
      {
       Print("Python script launched successfully.");
      }
    


    6. Проверка ответа Python

    После запуска Python-скрипта советник проверяет наличие ответного файла. Если файл существует, советник считывает его, чтобы подтвердить, был ли депозит успешным. Ответный файл должен содержать сообщение об успешном завершении, чтобы советник мог действовать соответствующим образом.

    string response_file = "python_to_mql5.txt";
    if(FileIsExist(response_file, FILE_COMMON))
      {
       handle = FileOpen(response_file, FILE_READ | FILE_COMMON | FILE_TXT | FILE_ANSI);
       string response = FileReadString(handle);
       FileClose(handle);
       Print("Response from Python: ", response);
    
       if(StringFind(response, "\"status\":\"success\"") >= 0)
         {
          Print("Deposit was successful.");
         }
       else
         {
          Print("Deposit failed. Response: ", response);
         }
      }
    else
      {
       Print("Response file not found. Ensure the Python script is running and processing the command.");
      }
    


    7. Завершение инициализации

    Если баланс превышает пороговое значение, советник пропускает процесс внесения депозита. Инициализация завершается успешно и советник вступает в фазу своей работы.

    else
      {
       Print("Balance is above the threshold. No deposit attempt needed.");
      }
    
    return(INIT_SUCCEEDED);
    


    8. Деинициализация 

    Функция OnDeinit регистрирует, когда советник удален или деинициализирован. 

    void OnDeinit(const int reason)
      {
       Print("Expert deinitialized.");
      }
    
    


    Демо тестирование и результаты

    Здесь мы обсудим два теста;

    1. Тестирование скрипта на Python (deriv_api_handler.py) в командной строке
    2. Тестирование в советнике по управлению средствами

    Рассмотрим подробно:

    1. Тестирование Python-скрипта (deriv_api_handler.py)

    Я работал над своим Python-скриптом, используя бесплатный инструмент под названием Notepad++. Ниже приведен анимационный ролик, демонстрирующий, как запустить командную строку непосредственно из редактора. Такой подход важен, поскольку он гарантирует, что командная строка будет направлена в папку, содержащую скрипт, что делает удобным выполнение скрипта непосредственно из его расположения.

    Launching cmd from Notepad++

    Запуск cmd из Notepad++

    Как только откроется окно командной строки, вы можете ввести команду для выполнения скрипта. Цель состоит в том, чтобы проверить успешную авторизацию и доступ к API Deriv.

    Введем следующую команду в командной строке и нажмем Enter:

    python deriv_api_handler.py

    Ответ с учетными данными API по умолчанию:

    При использовании скрипта по умолчанию, в котором отсутствуют действительные учетные данные, вы получите показанный ниже ответ. Важно убедиться, что вы предоставили свои рабочие учетные данные (токен API и идентификатор приложения), чтобы обеспечить надлежащую авторизацию и функциональность

    Error during authorization: Handshake status 401 Unauthorized -+-+- {'date': 'Thu, 15 Jan 2025 08:43:53 GMT', 'content-type': 
    'application/json;charset=UTF-8', 'content-length': '24', 'connection': 'keep-alive', 'content-language': 'en', 'upgrade': 
    'websocket', 'sec-websocket-accept': 'yfwlFELh2d3KczdgV3OT8Nolp0Q=', 'cf-cache-status': 'DYNAMIC', 'server': 'cloudflare', 'cf-ray': 
    '902cd20129b638df-HRE', 'alt-svc': 'h3=":443"; ma=86400'} -+-+- b'{"error":"InvalidAppID"}'
    Failed to authorize. Exiting.

    Ответ с корректными учетными данными:

    В приведенном ниже фрагменте результатов с использованием корректных учетных данных, мы успешно устанавливаем соединение и авторизацию. Затем программа проверяет файл mql5_to_python.txt в общей файловой папке, как показано ниже. Этот текстовый файл содержит командную информацию, которую скрипт обрабатывает и пересылает через WebSocket-соединение. API отправляет ответ обратно. В этом примере для защиты моих учетных данных используются случайные данные учетной записи. Для достижения положительных результатов, вам нужно будет использовать корректные данные.

    Наша цель успешно достигнута, так как мы получили ответ, а файл python_to_mql5.txt был сгенерирован с ответом API, который затем передается обратно в MetaTrader 5.
    Connected and authorized. Waiting for commands...
    Checking for command file at: C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt
    Command file found: C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt
    Raw Command read: '{"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}'
    Processed Command: '{"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}'
    Processing command: {"mt5_deposit": 1, "amount": 100000.00, "from_binary": "CR4000128", "req_id": 1, "to_mt5": "MTR130002534"}
    Response: {'echo_req': {'amount': 100000, 'from_binary': 'CR4000128', 'mt5_deposit': 1, 'to_mt5': 'MTR130002534'}, 'error': {'code': 'PermissionDenied', 
    'message': 'Permission denied, requires payments scope(s).'}, 'msg_type': 'mt5_deposit'}
    Response written. Exiting loop.


    2. Тестирование в советнике по управлению средствами

    Чтобы протестировать наш советник (EA), мы запустили его в MetaTrader 5. Как упоминалось ранее, мы разработали его для попытки внесения депозита во время инициализации. Поскольку мы работаем с демо-счетом, баланс которого составляет 10 000, я установил пороговое значение баланса на 100 000, чтобы инициировать попытку пополнения счета, если текущий баланс ниже этого значения. Ниже приведен анимационный скриншот, демонстрирующий запуск, а также параметры ввода, позволяющие настраивать эти значения.

    Launching the Fund Manager EA

    Запуск советника по управлению средствами

    На вкладке "Experts" окна "Панель инструментов" в MetaTrader 5 вы можете просмотреть лог всех операций, выполняемых советником. Ниже показаны отображаемые в логе результаты.

    2025.01.14 11:49:56.012 Fund Manager EA1 (EURUSD,M1)    Current Account Balance: 10000.22
    2025.01.14 11:49:56.012 Fund Manager EA1 (EURUSD,M1)    Balance is below the threshold. Attempting a deposit...
    2025.01.14 11:49:56.013 Fund Manager EA1 (EURUSD,M1)    Deposit command written to file: C:\Users\BTA24\AppData\Roaming\MetaQuotes\Terminal\Common\Files\mql5_to_python.txt
    2025.01.14 11:49:56.097 Fund Manager EA1 (EURUSD,M1)    Python script launched successfully.
    2025.01.14 11:50:01.132 Fund Manager EA1 (EURUSD,M1)    Response file path: C:\Users\BTA24\AppData\Roaming\MetaQuotes\Terminal\Common\Files\python_to_mql5.txt
    2025.01.14 11:50:01.133 Fund Manager EA1 (EURUSD,M1)    Response from Python: {"echo_req": {"amount": 100000, "from_binary": "CR4000128", "mt5_deposit": 1,
     "to_mt5": "MTR130002534"}, "error": {"code": "PermissionDenied", "message": "Permission denied, requires payments scope(s)."}, "msg_type": "mt5_deposit"}
    2025.01.14 11:50:01.133 Fund Manager EA1 (EURUSD,M1)    Deposit failed. Response: {"echo_req": {"amount": 100000, "from_binary": "CR4000128", "mt5_deposit": 1, 
    "to_mt5": "MTR130002534"}, "error": {"code": "PermissionDenied", "message": "Permission denied, requires payments scope(s)."}, "msg_type": "mt5_deposit"}
    

    Приведенный выше результат демонстрирует успешное взаимодействие между советником управления средствами, Python-скриптом и API Deriv. В частном порядке я успешно выполнял операции по пополнению счета, используя эту настройку. Однако в этом примере мы столкнулись с ошибкой "В разрешении отказано» ("Permission Denied"), поскольку для защиты моих личных учетных данных API использовались случайные учетные данные.

    Заключение

    Мы успешно интегрировали MQL5 и Python для взаимодействия с внешним брокерским сервером через его API. Это решение справляется с проблемой нехватки средств во время автоматической торговли, в частности, для счетов, размещенных на VPS. Советник автоматически пополняет счет, когда его баланс падает ниже установленного порогового значения. Хотя мы сосредоточились на Deriv API, аналогичная интеграция может быть достигнута и с другими брокерскими API, многие из которых предлагают расширенные функции и различные уровни доступа. В демонстрационных целях мы протестировали советник с пустым аккаунтом и проверили его функциональность с помощью ответов API. Вы можете расширить эту систему, включив в нее возможности вывода средств и другие расширенные функции.

    Приложение Deriv API является простым и в первую очередь облегчает управление токенами API, необходимыми для взаимодействия с советником. Для открытия дополнительных возможностей вы можете продолжить изучение API. Прилагаю файлы Python-скрипта на советника Fund Manager для тестирования и расширения. Делитесь своими мыслями или задавайте вопросы в разделе комментариев ниже, чтобы поддержать дискуссию.

    Перевод с английского произведен MetaQuotes Ltd.
    Оригинальная статья: https://www.mql5.com/en/articles/16012

    Прикрепленные файлы |
    Последние комментарии | Перейти к обсуждению на форуме трейдеров (5)
    Stanislav Korotky
    Stanislav Korotky | 17 янв. 2025 в 13:23

    Вы написали:

    The ShellExecuteW function from the shell32.dll library is used to run external applications like a Python script

    Я что-то упустил? AFAIK, MT5 позволяет запускать Python скрипты прямо из Navigator, прямо на обычных графиках.

    Fernando Carreiro
    Fernando Carreiro | 17 янв. 2025 в 13:54
    @Stanislav Korotky #: AFAIK, MT5 позволяет запускать Python-скрипты прямо из Навигатора, прямо на обычных графиках.

    Это правда, что вы можете запустить Python-скрипт из терминала через Навигатор, но это неправда, что они работают "на графике". Они запускаются извне и могут использовать Python API, но они не будут напрямую взаимодействовать с графиком или любым другим визуальным компонентом терминала MetaTrader 5.

    Clemence Benjamin
    Clemence Benjamin | 19 янв. 2025 в 14:21
    Fernando Carreiro #:

    Действительно, вы можете запустить Python-скрипт из терминала через Навигатор, но это неправда, что они работают "на графике". Они запускаются извне и могут использовать Python API, но они не будут напрямую взаимодействовать с графиком или любым другим визуальным компонентом терминала MetaTrader 5.

    Я согласен с вами, уважаемый сэр.

    Fernando Carreiro
    Fernando Carreiro | 19 янв. 2025 в 14:34
    @Clemence Benjamin #: Я согласен с вами, уважаемый сэр.

    Однако зачем вам нужен интерфейс "Python" для работы с API брокера?

    В случае, если брокер не предлагает MetaTrader 5, то вы можете использовать MQL5 для прямого взаимодействия с API брокера. Интерфейс Python не нужен вообще.

    В MQL5 есть даже сетевые сокеты, а также можно легко реализовать веб-сокеты. Вы также можете легко реализовать вызов REST API. А при необходимости можно использовать и вызовы DLL.

    Не говоря уже о том, что MQL5 намного быстрее Python. По сути, нет необходимости использовать Python для доступа к API.

    Clemence Benjamin
    Clemence Benjamin | 19 янв. 2025 в 19:58
    @Fernando Carreiro #:

    Однако зачем вам нужен интерфейс "Python" для работы с API брокера?

    Если брокер не предлагает MetaTrader 5, то вы можете использовать MQL5 для прямого взаимодействия с API брокера. Интерфейс Python не нужен вообще.

    В MQL5 есть даже сетевые сокеты, а также можно легко реализовать веб-сокеты. Вы также можете легко реализовать вызов REST API. А при необходимости можно использовать и вызовы DLL.

    Не говоря уже о том, что MQL5 намного быстрее Python. По сути, нет необходимости использовать Python для доступа к API.

    Да, сэр. Я ценю то, что вы выделяете простые и эффективные подходы - спасибо вам за это!

    Хотя я бы не стал выделять Python как насущную необходимость, я считаю, что все сводится к изучению того, как эти языки могут сотрудничать в данной области.

    В какой-то момент потребность в интеграции может возникнуть сама собой

    Нейросети в трейдинге: Вероятностное прогнозирование временных рядов (Энкодер) Нейросети в трейдинге: Вероятностное прогнозирование временных рядов (Энкодер)
    Предлагаем познакомиться с новым подходом, который объединяет классические методы и современные нейросети для анализа временных рядов. В статье подробно раскрыта архитектура и принципы работы модели K²VAE.
    Алгоритм биржевого рынка — Exchange Market Algorithm (EMA) Алгоритм биржевого рынка — Exchange Market Algorithm (EMA)
    Статья посвящена подробному анализу алгоритма Exchange Market Algorithm (EMA), который вдохновлен поведением трейдеров на фондовом рынке. Алгоритм моделирует процесс торговли акциями, где участники рынка с разным уровнем успеха применяют различные стратегии для максимизации прибыли.
    Исследуем регрессионные модели для причинно-следственного вывода и трейдинга Исследуем регрессионные модели для причинно-следственного вывода и трейдинга
    В данной статье проведено исследование на тему возможности применения регрессионных моделей в алгоритмической торговле. Регрессионные модели, в отличие от бинарной классификации, дают возможность создавать более гибкие торговые стратегии за счет количественной оценки прогнозируемых ценовых изменений.
    Создание торговой панели администратора на MQL5 (Часть VI): Панель управления торговлей (II) Создание торговой панели администратора на MQL5 (Часть VI): Панель управления торговлей (II)
    В этой статье мы улучшим панель управления торговлей нашей многофункциональной панели администратора. Мы представим мощную вспомогательную функцию, которая упрощает код, улучшая его читаемость, удобство обслуживания и эффективность. Мы также продемонстрируем, как легко интегрировать дополнительные кнопки и улучшить интерфейс для решения более широкого спектра торговых задач. Независимо от того, управляете ли вы позициями, корректируете ордера или упрощаете взаимодействие с пользователем, это руководство поможет вам разработать надежную и удобную панель управления торговлей.