English Español Português
preview
Как разработать агент обучения с подкреплением на MQL5 с интеграцией RestAPI (Часть 2): Функции MQL5 для HTTP-взаимодействия с REST API игры "крестики-нолики"

Как разработать агент обучения с подкреплением на MQL5 с интеграцией RestAPI (Часть 2): Функции MQL5 для HTTP-взаимодействия с REST API игры "крестики-нолики"

MetaTrader 5Примеры | 26 апреля 2024, 17:37
428 4
Jonathan Pereira
Jonathan Pereira

Введение

В предыдущей статье мы рассказали об API и RestAPI, подчеркнув, как эти важнейшие технологии облегчают взаимодействие и обмен данными между различными системами. Мы проанализировали эволюцию RestAPI с позиции принципов Роя Филдинга и то, как они заменили старые протоколы, такие как SOAP, более эффективными и гибкими альтернативами. Мы еще подчеркнули важность простоты, масштабируемости и универсальности RestAPI, а также их роль в развитии передовых взаимосвязанных систем.

В этой новой статье мы расширим эти понятия и применим их на практическом примере. Основное внимание уделим разработке набора функций на MQL5 для работы с HTTP-вызовами, интеграции с возможностями RestAPI для эффективного взаимодействия с внешней средой. В качестве практического примера мы рассмотрим разработку "крестики-нолики" на Python.

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

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

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

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

К концу данной статьи мы рассмотрим как техническое развитие функций в MQL5 и API в FastAPI, так и их роль в построении взаимосвязанных систем.

Эта статья состоит из четырех основных разделов:

  1. Введение и контекстуализация: Мы кратко рассмотрим концепции API и RestAPI, о которых шла речь в предыдущей статье, и подчеркнем эволюцию и важность этих технологий для объединения систем.

  2. Разработка функций на MQL5 для HTTP-вызовов: Здесь мы сосредоточимся на разработке конкретных функций в MQL5; эти функции предназначены для установления и управления взаимодействием по протоколу HTTP, что является фундаментальным шагом в интеграции MQL5 с внешними средами.

  3. Создание и интеграция API в FastAPI для игры "крестики-нолики": В этом разделе мы рассмотрим разработку надежного API с помощью FastAPI. API послужит основой для нашего практического примера - "крестики-нолики" на Python - и будет интегрирован с функциями, разработанными на MQL5.

  4. Практическая реализация и тестирование: В заключительной части мы реализуем тестовый скрипт на MQL5 для взаимодействия с API "крестики-нолики". На этом этапе мы продемонстрируем практическую интеграцию обсуждаемых инструментов и концепций, показывая, как

        def make_move(self, row, col):
            if self.board[row][col] == ' ':
                if self.player_turn:
                    self.board[row][col] = 'X'
                else:
                    self.board[row][col] = 'O'
                self.player_turn = not self.player_turn
            else:
                print("Jogada inválida. Tente novamente.")
    

    функции MQL5 можно применять в реальном контексте.

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



На диаграмме выше показана последовательность взаимодействий между MQL5-скриптом и "крестики-нолики", при этом внешний API выступает в качестве посредника. Мы начнем с запроса на запуск игры от MQL5-скрипта, который обрабатывается внешним API. Это, в свою очередь, будет вызывать "крестики-нолики", реализованные в Python. Ходы отправляются и принимаются с помощью HTTP-запросов, а внешний API управляет логикой ввода и вывода. Использование FastAPI имеет ключевое значение для эффективности этого процесса, обеспечивая асинхронное и высокопроизводительное взаимодействие. Данный поток позволяет наглядно представить практичность и эффективность нашего подхода к интеграции между различными системами.


1. Введение и контекстуализация

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





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

Широкое распространение RestAPI во многом объясняется их адаптивностью и поддержкой различных форматов данных (таких как JSON и XML), что облегчает взаимодействие между различными системами и платформами. Кроме того, важным аспектом RestAPI является безопасность: надежные механизмы, такие как аутентификация с помощью токенов и криптографии, обеспечивают защиту конфиденциальной информации во время обмена данными. Такой уровень безопасности и гибкости просто необходим, особенно в приложениях, которые работают с критически важной информацией, такой как финансовые операции и персональные данные.


2. Разработка функций на MQL5 для HTTP-вызовов

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

Кроме того, при работе с HTTP-вызовами очень важно понимать значение кодов состояния HTTP. Эти коды возвращаются веб-серверами, чтобы указать результат запроса. Например, код состояния "200 OK" означает, что запрос был выполнен успешно, в то время как код "404 Not Found" говорит о том, что запрашиваемый ресурс не найден на сервере. Знакомство с этими кодами необходимо для разработки приложений, взаимодействующих с веб-сервисами, так как они предоставляют важную информацию о статусе HTTP-запроса.

Для получения полной и подробной информации о кодах состояния HTTP можно обратиться к полной документации, доступной по ссылке. Это позволит вам еще лучше понять данные коды и уверенно использовать их в своих проектах.


Функция SendGetRequest - Выполнение GET-запросов

Мы начнем наше исследование с функции SendGetRequest, которая является центральной частью данного процесса. Эта функция была тщательно разработана для выполнения HTTP запросов типа GET. Она принимает ряд важных параметров, которые обеспечивают высокую степень гибкости и контроля над приложением.

int SendGetRequest(const string url, const string query_param, string &out, string headers = "", const int timeout = 5000)
  • url — URL, на который будет отправлен GET-запрос
  • query_param — необязательные параметры запроса, которые могут быть добавлены к URL
  • out — выходная переменная, сохраняющая ответ на запрос
  • headers — дополнительные HTTP-заголовки, которые можно предоставить
  • timeout — определяет тайм-аут запроса в миллисекундах

Функция SendGetRequest играет важнейшую роль в процессе обработки GET-запросов, от построения запроса до обработки HTTP-ошибок. Важно отметить, что хотя обработка ошибок в функции присутствует, но в текущем виде она является относительно базовой и может быть усовершенствована в будущем.

После успешного ответа (код ответа между 200 и 204) функция декодирует данные в UTF-8 и сохраняет их в переменной "out". Данная функциональность необходима для обеспечения правильной обработки собранных данных и их эффективного использования в ваших проектах.


Функция SendPostRequest - Выполнение POST-запросов

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

int SendPostRequest(const string url, const string payload, string &out, string headers = "", const int timeout = 5000)
  • url — URL, на который будет отправлен POST-запрос
  • payload — данные полезной нагрузки, которые отправляются вместе с запросом, часто в формате JSON
  • out — выходная переменная, сохраняющая ответ на запрос
  • headers — дополнительные HTTP-заголовки, которые можно предоставить
  • timeout — определяет тайм-аут запроса в миллисекундах

Функция SendPostRequest упрощает процесс создания POST-запроса, добавления заголовков и обработки ошибок HTTP, хотя важно отметить, что текущая обработка ошибок довольно поверхностна и может усовершенствоваться в будущем, как и функция SendGetRequest. При успешном ответе (код ответа от 200 до 204) данные декодируются в UTF-8 и сохраняются в переменной "out".


Функция запроса - Централизованный подход

Функция Request выступает как централизованная точка входа для GET- и POST-запросов, обеспечивая удобный и гибкий подход.

int Request(string method,
            string &out,
            const string url,
            const string payload = "",
            const string query_param = "",
            string headers = "",
            const int timeout = 5000)
  • method — определяет метод HTTP, который будет использоваться: "GET" или "POST"
  • url — URL, на который будет отправлен запрос
  • payload — данные, которые отправляются в POST-запросе (необязательно)
  • query_param — необязательные параметры запроса для GET-запросов
  • out — выходная переменная, сохраняющая ответ на запрос
  • headers — дополнительные HTTP-заголовки, которые можно предоставить
  • timeout — определяет тайм-аут запроса в миллисекундах

Функция Request выступает как уровень абстракции, упрощая выбор между GET и POST, без необходимости беспокоиться о деталях реализации. Это не только упрощает код, но и улучшает читабельность, делая разработку для HTTP-вызовов более эффективной и доступной.


      


Наш путь через разработку данных функций является основополагающим для того, чтобы читатель научился эффективно работать с HTTP-вызовами. Это откроет вам путь к интеграции собственных MQL5-проектов с широким спектром веб-сервисов, позволяя отправлять и получать данные, используя возможности HTTP-вызовов и эффективной работы с данными в формате JSON. Мы продолжим изучать данные ресурсы, шаг за шагом направляя вас, чтобы вы могли отточить свои навыки программирования на MQL5 и стать экспертом в области взаимодействия с веб-сервисами по HTTP.

Помимо освоения HTTP-вызовов в MQL5, важно понимать формат JSON (JavaScript Object Notation). JSON - это эффективный и широко распространенный способ структурирования данных, часто используемый для обмена информацией между системами. Вот несколько причин, по которым очень важно научиться работать с JSON:

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

2. Навыки чтения и письма: JSON известен своей читабельностью. В нем используется простой, понятный человеку синтаксис, что облегчает разработчикам понимание и отладку данных: это особенно важно при работе с ответами API и отладочными запросами.

3. Гибкость и вложенность: JSON допускает вложенность объектов и массивов, что идеально подходит для представления сложных и иерархических данных. Это очень крайне важно при работе с подробной и структурированной информацией.

4. Совместимость с различными языками: JSON совместим с широким спектром языков программирования, что делает его универсальным выбором: независимо от используемого языка, понимание JSON упрощает работу с данными.



Актуальность JSON в HTTP-вызовах

Теперь, когда мы поняли важность JSON, надо подчеркнуть, как он интегрируется с HTTP-вызовами. Как для входящих запросов (отправка данных), так и для исходящих ответов (получение данных), JSON играет фундаментальную роль.

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

Чтобы еще больше упростить работу с JSON в MQL5, мы решили использовать библиотеку Библиотека JAson, которая написана на нативном MQL5, что избавляет от необходимости использовать внешние DLL. Важно отметить, что данный стратегический выбор был сделан с учетом удивительной простоты использования библиотеки и ее доказанной эффективности. Теперь давайте подробно рассмотрим, почему библиотека JAson является отличным выбором для работы с JSON в наших MQL5-проектах:

  1. Простота использования. Одно из главных преимуществ библиотеки JAson - ее простота использования. Она была разработана для упрощения работы с JSON, делая операции чтения, записи и манипулирования объектами JSON доступными даже для начинающих программистов. Интуитивно понятный синтаксис и продуманные функциональные возможности позволят нам сэкономить время и силы при работе с JSON.

  2. Удобная абстракция. Библиотека JAson предоставляет удобную абстракцию для JSON, и это означает, что нам не нужно вручную разбираться с деталями анализа и сериализации. Вместо этого мы можем использовать методы и функции, предоставляемые библиотекой, для выполнения общих задач, таких как доступ к свойствам объектов JSON, добавление элементов в массивы JSON и создание сложных структур JSON.

  3. Улучшенная читабельности кода. Прямая работа с JSON в нашем MQL5-коде может быть сложной и в результате привести к запутанному коду. Однако, используя библиотеку JAson, мы получаем преимущество в виде более читабельного и организованного кода. Операции, связанные с JSON, упрощены, что сделает наш код более понятным и удобным для поддержки.

  4. Эффективность разработки. Эффективность - ключевой момент при разработке проекта. Библиотека JAson помогает ускорить процесс разработки, позволяя нам сосредоточиться на бизнес-логике, а не на детальной обработке JSON. Это означает, что мы сможем реализовать функциональные возможности быстрее и с меньшим количеством ошибок.


3 - Создание и интеграция API в FastAPI для игры в "крестики-нолики"

Давайте начнем наш практический пример с изучения кода "крестики-нолики" на Python. Это фундаментальный шаг в развитии взаимодействия между MQL5 и Python, поскольку "крестики-нолики" будет служить средой, с которой будет взаимодействовать MQL5.

Класс TicTacToe:
import random

class TicTacToe:

Здесь мы импортируем модуль random и создаем класс под названием TicTacToe. Класс - это программная структура, которая организует связанные функции и переменные. В данном случае класс TicTacToe представляет игру "Крестики-нолики".


Инициализируем игровое поле:
    def __init__(self):
        self.board = [[' ' for _ in range(3)] for _ in range(3)]
        self.player_turn = True

В этом фрагменте мы определим метод __init__, который является специальным методом, вызываемым при создании экземпляра класса. Он инициализирует состояние игры.

  • self.board - это двумерный список (3x3), представляющий игровое поле. Изначально все ячейки пусты (представлены пустыми полями).
  • self.player_turn - это булева переменная, которая отслеживает, чья очередь в игре. Изначально очередь первого игрока (True).


Метод print_board:
    def print_board(self):
        for row in self.board:
            print("|".join(row))
            print("-" * 5)

Метод print_board отвечает за вывод текущего состояния игрового поля на экран. Он прокручивает строки игрового поля и печатает элементы, разделенные вертикальными полосами ('|') и горизонтальными линиями ('-----'), чтобы создать визуальное представление игрового поля.


Метод check_winner:

    def check_winner(self):
        for i in range(3):
            if self.board[i][0] == self.board[i][1] == self.board[i][2] != ' ':
                return self.board[i][0]
            if self.board[0][i] == self.board[1][i] == self.board[2][i] != ' ':
                return self.board[0][i]
        if self.board[0][0] == self.board[1][1] == self.board[2][2] != ' ':
            return self.board[0][0]
        if self.board[0][2] == self.board[1][1] == self.board[2][0] != ' ':
            return self.board[0][2]
        return None

Метод check_winner проверяет, есть ли в игре победитель. Проверяет все строки, столбцы и диагонали на наличие трех последовательных символов одного игрока ("X" или "O"). Если игрок выигрывает, возвращается символ данного игрока (например, "X", если выигрывает игрок "X"). Если победитель не найден, метод вернет None.


Метод make_move:

    def make_move(self, row, col):
        if self.board[row][col] == ' ':
            if self.player_turn:
                self.board[row][col] = 'X'
            else:
                self.board[row][col] = 'O'
            self.player_turn = not self.player_turn
        else:
            print("Jogada inválida. Tente novamente.")

Метод make_move отвечает за выполнение хода в игре. Он получает координаты строки и столбца, куда игрок намерен сделать ход. Прежде чем выполнить ход, проверяется, пуста ли клетка на игровом поле (' '). Если она пуста, выполняется ход, и символ игрока ("X" или "O") помещается в ячейку. Затем очередь игрока меняется. Если ячейка не пуста, выводится сообщение "Недопустимый ход".

Приведенный выше код представляет собой важный момент в процессе интеграции MQL5 и Python. Разработка "крестики-нолики" на Python - важный шаг, так как она будет служить средой, в которой произойдут наше взаимодействие.

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

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

Теперь, когда вы знакомы с классом TicTacToe и тем, как он работает с "крестиками-ноликами", давайте рассмотрим подробнее приведенный выше код FastAPI API. Этот API будет играть важнейший роль во взаимодействии между MQL5 и разработанной нами ранее игрой "крестики-нолики" на Python. Давайте разберемся с каждой частью данного кода:

# Importação de Bibliotecas
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from tic_tac_toe import TicTacToe

# Criação da Instância FastAPI
app = FastAPI()

# Armazenamento de Jogos em Execução
games = {}

Начнем с импорта двух необходимых библиотек: FastAPI и Pydantic. FastAPI - это фрейм для быстрой разработки веб-интерфейсов на Python, а Pydantic используется для определения моделей данных, которые описывают структуру данных, ожидаемых от API.

# Definição de Modelos de Dados
class GameBoard(BaseModel):
    board: list
    player_turn: str

class PlayerMove(BaseModel):
    row: int
    col: int

Далее мы определим две модели данных с помощью Pydantic. GameBoard представляет текущее состояние игрового поля и содержит список под названием board для хранения ячеек поля и строку player_turn для указания хода игры. PlayerMove представляет собой ход, который хочет выполнить игрок, и включает в себя координаты строки и столбца хода.

# Definição de Endpoints da API

# Endpoint para iniciar um novo jogo
@app.get("/start-game/")
def start_game():
    game_id = len(games) + 1
    game = TicTacToe()
    games[game_id] = game
    return {"game_id": game_id}

# Endpoint para fazer uma jogada no jogo
@app.post("/play/{game_id}/")
def play(game_id: int, move: PlayerMove):
    game = games.get(game_id)
    if not game:
        raise HTTPException(status_code=404, detail="Game not found")

    try:
        game.make_move(move.row, move.col)
    except ValueError as e:
        raise HTTPException(status_code=400, detail=str(e))

    # Use o método print_board para imprimir o estado atual do jogo
    game.print_board()

    return {
        "board": game.board,
        "player_turn": game.player_turn,
    }

API имеет две основные конечные точки. Первая, /start-game/, позволяет начать новую игру в "крестики-нолики". Она создает экземпляр класса TicTacToe для представления игры и связывает его с уникальным ID в словаре games. ID игры возвращается в качестве ответа.

Вторая конечная точка, /play/{game_id}/, позволяет игрокам выполнять ходы в существующую игру. В качестве параметра он получает ID игры и игровые данные игрока. API проверяет, существует ли игра с указанным ID в словаре игр. Если он не существует, то возвращается ошибка 404. Затем пробует сделать ход в игре и обновить состояние игрового поля. В качестве ответа возвращается текущее состояние игрового поля.

# Execução da API
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Мы завершим код, выполняя API с помощью Uvicorn. Это позволяет обращаться к API другим приложениям. 

Документация по API, создаваемая автоматически


FastAPI - это современный и быстрый фрейм для создания API на Python 3.6+, основанный на стандартах из Python type hints. Его простота заключается в способности обеспечить быстрое, эффективное и надежное написание кода с упором на следующие возможности:

  1. Скорость и производительность. FastAPI - один из самых быстрых фреймов для Python, благодаря использованию Starlette для маршрутизации и Uvicorn для выполнения ASGI-сервера. Это делает его идеальным для приложений, требующих высокой производительности.

  2. Автоматическая генерация документации. С помощью FastAPI документация по API генерируется автоматически и также обновляется по мере изменения кода. Это стало возможным благодаря использованию type hints от Python и интегрированных систем документации, таких как Swagger UI и ReDoc.

  3. Валидация данных и сериализация. Используя Pydantic, FastAPI предлагает надежную систему проверки данных. Запросы и ответы автоматически проверяются и сериализуются: что сокращает объем требуемого кода и позволяет избежать многих распространенных ошибок.

  4. Простота использования. FastAPI разработан для упрощения использования и интуитивного обучения. Благодаря этому разработчикам проще создавать и поддерживать эффективные API, обеспечивая не такую крутую кривую обучения по сравнению с другими фреймами.

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

  6. Безопасность и аутентификация. Фрейм также предоставляет инструменты для реализации безопасности API, включая поддержку OAuth2 с токенами JWT и других способов аутентификации.

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


4 - Практическая реализация и тестирование

Анализируемый тестовый скрипт на MQL5 - это практический пример интеграции данного языка программирования с внешним API, построенным в FastAPI, примененный в контексте "крестики-нолики". Процесс разделен на несколько этапов, каждый из которых выполняет определенную роль во взаимодействии с API:

Скрипт начинается с установки API-адреса FastAPI:

input string apiUrl = "http://localhost:8000";

В этой строке задается базовый URL API, который будем использовать для отправки запросов на сервер FastAPI. Данная настройка необходима для того, чтобы скрипт правильно взаимодействовал с API.

Функция для печати ответов API

void PrintResponse(string response) {
    Print("Resposta da API: ", response);
}

Данная вспомогательная функция предназначена для вывода ответов, полученных от API, в журнал MQL5. Она предоставляет полезную информацию о результатах рассмотрения каждого отправленного запроса.

Инициализация и первое применение

void OnStart() {
    string response;
    int startGameRes = Request("GET", response, apiUrl + "/start-game/");
    // ...
}

OnStart - это основная функция скрипта. Отправив GET-запрос к API, мы начнем новую игру. В переменной startGameRes хранится результат этого запроса, который показывает, был ли он успешным.

Обработка ответа и начало игры

string gameIdStr = StringSubstr(response, StringFind(response, ":") + 1);
uint gameId = StringToInteger(gameIdStr);

Получив ответ от API, скрипт извлекает из него ID игры. Этот идентификатор очень важен для последующих игр, поскольку он идентифицирует текущую игровую сессию.

Осуществление ходов

string jsonMove1 = "{\"row\": 0, \"col\": 0}";
// ...
int playRes1 = Request("POST", response, apiUrl + "/play/" + IntegerToString(gameId) + "/", jsonMove1);

Затем скрипт выполняет серию ходов, каждый из которых представлен JSON-объектом, который содержит координаты хода на игровом поле. Эти ходы отправляются в API с помощью POST-запросов. Процесс повторяется для каждого последующего хода.



Анализ игрового процесса

  • Старт: Игра начинается, и мы получаем игровой ID.
  • Ходы: Делаются три хода, которые чередуются между игроками.
  • Обратная связь: После каждой игры скрипт обрабатывает ответ API, чтобы проверить обновленное состояние игры.

Восприятия:

  • Эффективная интеграция. Скрипт демонстрирует эффективную интеграцию между MQL5 и FastAPI API, показывая, как MQL5 можно использовать для взаимодействия с внешним приложением.
  • Гибкая модель. Данный пример служит гибкой моделью для других типов приложений, демонстрируя способность MQL5 интегрироваться с внешними API.
  • Практическая применимость. Этот скрипт - практический пример соединения MQL5-программирования и гибкости Python API с помощью FastAPI, открывающий путь к новым инновациям во взаимодействии между различными системами.

Этот тестовый скрипт на MQL5 не только иллюстрирует теоретические концепции системной интеграции, но и обеспечивает практическое применение, подчеркивая взаимосвязанность и адаптивность в программировании современных систем.


Заключение

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

Размышляя о MQL5, мы обычно ассоциируем его непосредственно с трейдингом, но кто бы мог подумать, что его можно использовать для чего-то совершенно иного, например, для управления игрой "крестики-нолики", сделанной на Python? Это показывает, что язык программирования может найти применение далеко за пределами наших привычных представлений.

А если говорить о Python, то создание игры "крестики-нолики" было интересным способом увидеть программирование в действии. Это практический пример, который помогает лучше понять, как могут быть связаны разные языки и технологии.

Выбор FastAPI для создания API был стратегическим. Быстрый, эффективный и простой в использовании FastAPI оказался отличным инструментом для построения моста между нашей игрой и MQL5. Интересно наблюдать, как API, который может показаться просто техническим посредником, на самом деле играет ключевую роль в объединении различных миров программирования.

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

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



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

Прикрепленные файлы |
Parte_02.zip (35.95 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (4)
Stanislav Korotky
Stanislav Korotky | 27 апр. 2024 в 12:56
Между частью 1 и частью 2 явно пропустили еще одну целую статью, связывающую RestAPI с питоном и FastAPI. Это ж сайт для трейдеров все-таки.
Jonathan Pereira
Jonathan Pereira | 27 апр. 2024 в 14:44
Stanislav Korotky #:
Между первой и второй частями вы, очевидно, пропустили еще одну полную статью, связывающую RestAPI с python и FastAPI. В конце концов, это сайт для трейдеров.
Если бы у вас была хоть капля способностей, вы бы поняли, что между первой и второй частью у вас уже достаточно информации для адаптации к вашей торговой среде. Используйте свою голову и пользуйтесь сайтами вроде https://brapi.dev/docs, чтобы обогатить свой анализ и реализацию в MetaTrader. Перестаньте ждать, что все будет разжевано для вас. В конце концов, это сайт для трейдеров, а не для любителей.
Stanislav Korotky
Stanislav Korotky | 28 апр. 2024 в 16:06
Jonathan Pereira #:
Если бы у вас была хоть капля способностей, вы бы поняли, что между первой и второй частью у вас уже достаточно информации для адаптации к вашей торговой среде. Используйте свою голову и пользуйтесь сайтами вроде https://brapi.dev/docs, чтобы обогатить свой анализ и реализацию в MetaTrader. Перестаньте ждать, что все будет разжевано для вас. В конце концов, это сайт для трейдеров, а не для любителей.

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

Denis Kirichenko
Denis Kirichenko | 28 апр. 2024 в 18:12
Jonathan Pereira #:
Если бы у вас была хоть капля способностей, вы бы поняли, что между первой и второй частью у вас уже достаточно информации для адаптации к вашей торговой среде. Используйте свою голову и пользуйтесь сайтами вроде https://brapi.dev/docs, чтобы обогатить свой анализ и реализацию в MetaTrader. Перестаньте ждать, что все будет разжевано для вас. В конце концов, это сайт для трейдеров, а не для любителей.
Имхо, как-то неконструктивно сеньор Перейра жжёт, в стиле "сам дурак"... Видимо сеньор Перейра не  видел учебник Станислава, что так категоричен...
Разработка системы репликации (Часть 38): Прокладываем путь (II) Разработка системы репликации (Часть 38): Прокладываем путь (II)
Многие люди, которые считают себя программистами на MQL5, не обладают базовыми знаниями, которые мы изложим в этой статье. Многие считают MQL5 ограниченным инструментом, однако всё дело в недостатке знаний. Так что если вы чего-то не знаете, не стыдитесь этого. Лучше пусть вам будет стыдно за то, что вы не спросили. Простое принуждение MetaTrader 5 к запрету дублирования индикатора никоим образом не обеспечивает двустороннюю связь между индикатором и советником. Мы еще очень далеки от этого, но тот факт, что индикатор не дублируется на графике, дает нам некоторое утешение.
Нейросети — это просто (Часть 87): Сегментация временных рядов Нейросети — это просто (Часть 87): Сегментация временных рядов
Прогнозирование играет важную роль в анализе временных рядов. В новой статье мы поговорим о преимуществах сегментации временных рядов.
Разметка данных в анализе временных рядов (Часть 5):Применение и тестирование советника с помощью Socket Разметка данных в анализе временных рядов (Часть 5):Применение и тестирование советника с помощью Socket
В этой серии статей представлены несколько методов разметки временных рядов, которые могут создавать данные, соответствующие большинству моделей искусственного интеллекта (ИИ). Целевая разметка данных может сделать обученную модель ИИ более соответствующей пользовательским целям и задачам, повысить точность модели и даже помочь модели совершить качественный скачок!
Реализация расширенного теста Дики-Фуллера в MQL5 Реализация расширенного теста Дики-Фуллера в MQL5
В статье показаны реализация расширенного теста Дики-Фуллера и его применение для проведения коинтеграционных тестов с использованием метода Энгла-Грейнджера.