
Связь торговых роботов MetaTrader 5 с внешними брокерами через API и Python
Введение
Сегодня мы рассмотрим, как установить бесперебойную связь между нашими советниками MetaTrader 5 и внешними брокерами с помощью интеграции API. Основная цель состоит в том, чтобы решить проблему нехватки средств на торговых счетах, включив автоматическое пополнение счета, когда баланс падает ниже установленного порога. Такой подход эффективно решает важнейшие вопросы управления средствами, повышая как эффективность, так и безопасность торговых операций.
Как правило, мы следуем обычной процедуре входа на портал нашей учетной записи брокера для совершения различных транзакций. Хотя это традиционный подход, существует мощная функция, называемая API (интерфейс программирования приложений), позволяющая делать гораздо больше и оптимизировать наш подход. Для некоторых из вас это может быть знакомым термином. Однако для остальных я разбью его на простые для понимания разделы, чтобы все были на одной странице:
- Что такое API?
- Использование API
- Доступ к API
- Документация API
Давайте рассмотрим их более подробно:
1. Что такое API?
API (интерфейс программирования приложений) обеспечивает внешнее взаимодействие с программной системой. В этом контексте он дает нам возможность выполнять операции с нашими брокерскими счетами непосредственно на сервере — без необходимости входа в систему вручную.
Интересно, что API-интерфейсы существуют с 1940-х годов, но получили широкое распространение в 1970-х годах, а также добились всеобщего принятия после 2000 года.
2. Использование API
API-интерфейсы облегчают взаимодействие между программными приложениями и системами. Вот некоторые из распространенных областей применения:
- Серверы веб-сайтов
- Мобильные приложения
API-интерфейсы обеспечивают беспрепятственный доступ к данным из различных источников, таких как:
- Платформы социальных сетей
- Облачное хранилище
- Платежные шлюзы
- Метеостанции
- Биржи и финансовые рынки
API как мост между внешними компьютерами и облачными серверами.
3. Доступ к API
Для использования API, как правило, необходимо следующее:
- Получить API-ключ от провайдера.
- Изучать документацию по API, чтобы корректно его интегрировать.
- Включить ключ API в качестве параметра в свои запросы на аутентификацию и авторизацию.
4. Документация API
Каждый API поставляется со своим собственным руководством пользователя и спецификациями. В них подробно описано, как эффективно взаимодействовать с API. Например, документация для API Telegram существенно отличается от документации для API брокера, такой как API брокера от Deriv.
Понимая и используя API-интерфейсы, можно оптимизировать наши операции, автоматизировать процессы и повысить эффективность управления нашими брокерскими счетами. Давайте углубимся в каждый аспект и рассмотрим его практическую реализацию.
Вот список основных разделов нашего обсуждения:
- Краткий обзор этого обсуждения
- Deriv API
- Библиотека Python для взаимодействия с API веб-сокетов
- Скрипт на Python для установления связи между MetaTrader 5 и брокерским API
- Советник управляющего фондами
- Демо тестирование и результаты
- Заключение
Краткий обзор этого обсуждения
В настоящей статье мы рассмотрим использование MQL5 с API брокера для облегчения бесперебойных операций по управлению фондами. Наша цель - раскрыть огромный потенциал, предлагаемый советниками на MQL5. Поскольку сам по себе MQL5 не может напрямую взаимодействовать с веб-серверами, мы будем использовать внешние языковые библиотеки, такие как Python или Node.js, в зависимости от возможностей API брокера. В этом обсуждении мы сосредоточимся на Deriv.com в качестве выбранного нами брокера.
Преимущества этого подхода
- Автоматизированные переводы средств: Советник автоматизирует перевод торговой прибыли с торгового счета на защищенный счет.
- Пополнение торгового счета: Пополнит баланс торгового счета, если средства на счете упадут ниже заранее установленного порога.
- Непрерывные операции: Благодаря размещению советника на виртуальном сервере система может работать в режиме 24/7 с практически неограниченными возможностями управления средствами.
Проблемы и особенности
- Риск истощения средств: Зарезервированные средства могут быть исчерпаны, если советник продолжит пополнять баланс без получения постоянной прибыли.
- Потребность в надежном управлении средствами: Должна быть внедрена сложная система управления средствами, позволяющая останавливать операции в случае нарушения определенных пороговых значений потерь или собственного капитала.
В следующих разделах мы рассмотрим возможности API Deriv broker, разработаем код на Python для обеспечения бесперебойного взаимодействия с API и интегрируем это решение с советником на MQL5, предназначенным для эффективного и надежного управления средствами. Все это представлено в виде простых пошаговых инструкций для удобства понимания и реализации.
Двунаправленный обмен данными между 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 брокера
1. Первоначальная установка и конфигурация
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. Обработка команд
- В функции 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. Депозитная операция
- Внутри этой функции создается сообщение в формате 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
- Как только команда считана, она выводится на печать в целях отладки, чтобы можно было проверить, что содержимое было получено должным образом. После прочтения команды она удаляет файл, гарантируя, что та же команда не будет обработана повторно в будущем.
- Если файл не существует, она возвращает 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
- Чтобы убедиться, что ответ правильно отформатирован, словарь 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. Если командный файл не существует или возникает ошибка, она корректно обрабатывается путем вывода сообщения об ошибке и выхода из цикла.
- Этот цикл имеет решающее значение для поддержания работоспособности системы. Мы позаботились о том, чтобы скрипт не запускался бесконечно и не выходил из строя без предоставления полезной обратной связи. Реализуя блоки 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."); }
Демо тестирование и результаты
Здесь мы обсудим два теста;
- Тестирование скрипта на Python (deriv_api_handler.py) в командной строке
- Тестирование в советнике по управлению средствами
Рассмотрим подробно:
1. Тестирование Python-скрипта (deriv_api_handler.py)
Я работал над своим Python-скриптом, используя бесплатный инструмент под названием 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.
Ответ с корректными учетными данными:
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, чтобы инициировать попытку пополнения счета, если текущий баланс ниже этого значения. Ниже приведен анимационный скриншот, демонстрирующий запуск, а также параметры ввода, позволяющие настраивать эти значения.
Запуск советника по управлению средствами
На вкладке "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





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вы написали:
The ShellExecuteW function from the shell32.dll library is used to run external applications like a Python script
Я что-то упустил? AFAIK, MT5 позволяет запускать Python скрипты прямо из Navigator, прямо на обычных графиках.
Это правда, что вы можете запустить Python-скрипт из терминала через Навигатор, но это неправда, что они работают "на графике". Они запускаются извне и могут использовать Python API, но они не будут напрямую взаимодействовать с графиком или любым другим визуальным компонентом терминала MetaTrader 5.
Действительно, вы можете запустить Python-скрипт из терминала через Навигатор, но это неправда, что они работают "на графике". Они запускаются извне и могут использовать Python API, но они не будут напрямую взаимодействовать с графиком или любым другим визуальным компонентом терминала MetaTrader 5.
Я согласен с вами, уважаемый сэр.
Однако зачем вам нужен интерфейс "Python" для работы с API брокера?
В случае, если брокер не предлагает MetaTrader 5, то вы можете использовать MQL5 для прямого взаимодействия с API брокера. Интерфейс Python не нужен вообще.
В MQL5 есть даже сетевые сокеты, а также можно легко реализовать веб-сокеты. Вы также можете легко реализовать вызов REST API. А при необходимости можно использовать и вызовы DLL.
Не говоря уже о том, что MQL5 намного быстрее Python. По сути, нет необходимости использовать Python для доступа к API.
Однако зачем вам нужен интерфейс "Python" для работы с API брокера?
Если брокер не предлагает MetaTrader 5, то вы можете использовать MQL5 для прямого взаимодействия с API брокера. Интерфейс Python не нужен вообще.
В MQL5 есть даже сетевые сокеты, а также можно легко реализовать веб-сокеты. Вы также можете легко реализовать вызов REST API. А при необходимости можно использовать и вызовы DLL.
Не говоря уже о том, что MQL5 намного быстрее Python. По сути, нет необходимости использовать Python для доступа к API.
Да, сэр. Я ценю то, что вы выделяете простые и эффективные подходы - спасибо вам за это!
Хотя я бы не стал выделять Python как насущную необходимость, я считаю, что все сводится к изучению того, как эти языки могут сотрудничать в данной области.
В какой-то момент потребность в интеграции может возникнуть сама собой