English Русский Español Deutsch 日本語
preview
Desenvolvendo um agente de Aprendizado por Reforço em MQL5.com Integração RestAPI(Parte 2): Funções MQL5 para Interação HTTP com API REST do Jogo da Velha

Desenvolvendo um agente de Aprendizado por Reforço em MQL5.com Integração RestAPI(Parte 2): Funções MQL5 para Interação HTTP com API REST do Jogo da Velha

MetaTrader 5Exemplos | 28 novembro 2023, 13:58
391 4
Jonathan Pereira
Jonathan Pereira

Introdução

No artigo anterior, abordamos APIs e RestAPIs, destacando como essas tecnologias cruciais facilitam a interconexão e o compartilhamento de dados entre sistemas distintos. Analisamos a evolução das RestAPIs desde os princípios de Roy Fielding e como elas substituíram protocolos mais antigos, como o SOAP, por alternativas mais eficientes e flexíveis. A importância da simplicidade, escalabilidade e versatilidade das RestAPIs foi enfatizada, ressaltando seu papel no desenvolvimento de sistemas interconectados e avançados.

Neste novo artigo, vamos expandir esses conceitos, aplicando-os a um exemplo prático. O foco será o desenvolvimento de um conjunto de funções em MQL5 para trabalhar com chamadas HTTP, integrando com as capacidades das RestAPIs para uma interação eficiente com um ambiente externo. Para isso, usaremos o desenvolvimento de um jogo da velha em Python como exemplo prático.

Iniciaremos com o desenvolvimento de funções em MQL5. Estas funções são essenciais para estabelecer uma comunicação eficaz com o ambiente externo, neste caso, o jogo da velha desenvolvido em Python. Permitirão enviar requisições HTTP e receber respostas, atuando como pontes de comunicação entre o MQL5 e a API do jogo.

Paralelamente, exploraremos o desenvolvimento de uma API usando FastAPI, uma escolha motivada por suas características notáveis como alta performance, simplicidade no desenvolvimento e forte suporte para APIs assíncronas. O FastAPI também se destaca na integração com modernas ferramentas de desenvolvimento de APIs, facilitando a criação de endpoints eficientes e escaláveis que nosso conjunto de funções em MQL5 poderá utilizar para interagir com o jogo da velha.

Após estabelecer as funções fundamentais em MQL5, iremos elaborar um script de teste projetado para interagir com a API Python. Este script será um elemento crucial para demonstrar a aplicabilidade prática de nossas funções MQL5 no contexto do jogo da velha.

Este exemplo servirá não apenas para ilustrar a aplicação prática dos conceitos discutidos anteriormente, mas também para oferecer insights valiosos sobre como estas tecnologias podem ser utilizadas em conjunto para criar soluções inovadoras.

Ao final deste artigo, teremos explorado tanto o desenvolvimento técnico das funções em MQL5 e da API em FastAPI quanto o seu papel na construção de sistemas interconectados.

Esse artigo está dividido em quatro partes principais:

  1. Introdução e Contextualização : Revisitaremos brevemente os conceitos de APIs e RestAPIs discutidos no artigo anterior, destacando a evolução e a importância dessas tecnologias para a interconexão de sistemas.

  2. Desenvolvimento de Funções em MQL5 para Chamadas HTTP: Aqui, focaremos no desenvolvimento de funções específicas em MQL5. Estas funções serão projetadas para estabelecer e gerenciar a comunicação via HTTP, um passo fundamental para integrar o MQL5 com ambientes externos.

  3. Criação e Integração de uma API em FastAPI para o Jogo da Velha: Esta seção abordará o desenvolvimento de uma API robusta usando FastAPI. A API servirá como base para o nosso exemplo prático - um jogo da velha em Python - e será integrada com as funções desenvolvidas em MQL5.

  4. Aplicação Prática e Testes: Na parte final, implementaremos um script de teste em MQL5 para interagir com a API do jogo da velha. Esta fase demonstrará a integração prática das ferramentas e conceitos discutidos, ilustrando como

        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.")
    

    as funções MQL5 podem ser aplicadas em um contexto real.

Cada uma dessas partes contribuirá para o entendimento completo de como as RestAPIs e MQL5 podem ser utilizadas juntas para desenvolver soluções interconectadas.



O diagrama acima ilustra a sequência de interações entre o script MQL5 e o jogo da velha, com a API externa atuando como intermediária. Iniciamos com uma solicitação de início de jogo pelo script MQL5, que é processada pela API externa. Esta, por sua vez, invoca o jogo da velha implementado em Python. As jogadas são enviadas e recebidas por meio de requisições HTTP, com a API externa gerenciando a lógica de entrada e saída. O uso do FastAPI é crucial para a eficiência desse processo, permitindo uma comunicação assíncrona e de alta performance. Este fluxo nos permite visualizar a praticidade e a eficiência da nossa abordagem para a integração entre sistemas distintos.


1 - Introdução e Contextualização

Prosseguindo em nossa série, este artigo revisita e expande a discussão sobre APIs e RestAPIs, enfatizando sua evolução e crescente importância na interligação de sistemas digitais. As APIs, fundamentais na era da digitalização, desempenham um papel essencial na integração de softwares distintos, garantindo comunicação e funcionamento harmonioso. O surgimento das RestAPIs, notáveis por sua arquitetura fundamentada na simplicidade e escalabilidade, representou um salto significativo, superando as limitações dos protocolos antigos como o SOAP e oferecendo uma opção mais eficiente para a interação entre sistemas. Este artigo se dedica a aprofundar o conhecimento sobre essas interfaces, ressaltando sua funcionalidade, variedade e a arquitetura subjacente, e se propõe a explorar exemplos práticos de aplicação. Estamos pavimentando o caminho para futuras discussões mais complexas e aplicações mais específicas nos próximos artigos.





As RestAPIs, introduzidas na virada do milênio, rapidamente ganharam destaque por sua abordagem simplificada em comparação com protocolos como o SOAP, baseado em XML e conhecido por sua complexidade e demanda por grandes volumes de dados para transações básicas. Emergindo como uma alternativa mais enxuta e versátil, as RestAPIs se estabeleceram em diversos setores, incluindo o financeiro. Sua facilidade de uso e implementação em quase todas as linguagens de programação as torna particularmente atraentes para sistemas modernos que necessitam de uma comunicação eficaz e eficiente.

A aceitação generalizada das RestAPIs se deve, em grande parte, à sua natureza adaptável e ao suporte a diversos formatos de dados, como JSON e XML, facilitando a interoperabilidade entre diferentes sistemas e plataformas. Além disso, a segurança é um aspecto primordial nas RestAPIs, com mecanismos robustos como autenticação por token e criptografia, garantindo a proteção de dados sensíveis durante a comunicação. Este nível de segurança e flexibilidade é indispensável, especialmente em aplicações que lidam com informações críticas, como transações financeiras e dados pessoais.


2 - Desenvolvimento de Funções em MQL5 para Chamadas HTTP

Neste artigo, iniciaremos uma exploração detalhada do desenvolvimento de funções em MQL5 que possibilitam a realização de chamadas HTTP e a manipulação de dados JSON. Essas funções desempenham um papel crucial na integração de programas MQL5 com ambientes externos, permitindo uma comunicação eficaz com serviços da web e a manipulação de informações no formato JSON.

Além disso, é de extrema importância compreender o significado dos códigos de status HTTP ao lidar com chamadas HTTP. Esses códigos são retornados pelos servidores web para indicar o resultado de uma solicitação. Por exemplo, um código de status "200 OK" sinaliza que a solicitação foi bem-sucedida, enquanto um código "404 Not Found" indica que o recurso solicitado não foi encontrado no servidor. Ter familiaridade com esses códigos é fundamental para o desenvolvimento de aplicativos que interagem com serviços da web, uma vez que eles fornecem informações cruciais sobre o estado de uma solicitação HTTP.

Para uma referência completa e detalhada dos códigos de status HTTP, você pode consultar a documentação completa disponível neste link. Isso permitirá que você aprofunde ainda mais seu entendimento desses códigos e os utilize com confiança em seus projetos.


Função SendGetRequest - Realizando Solicitações GET

Iniciaremos nossa exploração pela função SendGetRequest, uma peça central do processo. Esta função foi cuidadosamente projetada para realizar solicitações HTTP do tipo GET. Ela aceita uma série de parâmetros essenciais que oferecem um alto grau de flexibilidade e controle sobre a solicitação.

int SendGetRequest(const string url, const string query_param, string &out, string headers = "", const int timeout = 5000)
  • url : A URL para a qual a solicitação GET será enviada.
  • query_param : Parâmetros de consulta opcionais que podem ser anexados à URL.
  • out : Uma variável de saída que armazenará a resposta da solicitação.
  • headers : Cabeçalhos HTTP opcionais que você pode fornecer.
  • timeout : Define o tempo limite da solicitação em milissegundos.

A função SendGetRequest desempenha um papel crucial no processo de lidar com solicitações GET, abrangendo desde a construção da solicitação até o tratamento de erros HTTP. É importante destacar que, embora o tratamento de erros esteja presente na função atualmente, ele é relativamente básico em sua forma atual e está sujeito a melhorias no futuro.

Quando a resposta é bem-sucedida (indicada por um código de resposta entre 200 e 204), a função realiza a decodificação dos dados para UTF-8 e os armazena na variável "out". Esta funcionalidade é essencial para garantir que os dados obtidos sejam manipulados de forma adequada e possam ser utilizados em seus projetos de forma eficaz.


Função SendPostRequest - Realizando Solicitações POST

Agora, passemos para a função SendPostRequest, que desempenha um papel fundamental ao transmitir dados para serviços web externos, onde os payloads frequentemente estão no formato JSON. Essa função é essencial ao criar ou atualizar recursos por meio de APIs.

int SendPostRequest(const string url, const string payload, string &out, string headers = "", const int timeout = 5000)
  • url : A URL para a qual a solicitação POST será enviada.
  • payload : Os dados de carga útil que serão enviados com a solicitação, frequentemente em formato JSON.
  • out : Uma variável de saída que armazenará a resposta da solicitação.
  • headers : Cabeçalhos HTTP opcionais que você pode fornecer.
  • timeout : Define o tempo limite da solicitação em milissegundos.

A função SendPostRequest simplifica o processo de construção da solicitação POST, anexação de cabeçalhos e tratamento de erros HTTP, embora seja importante notar que a tratativa de erro atual é bastante superficial e está sujeita a melhorias futuras, semelhante ao que ocorre com a função SendGetRequest. Quando a resposta é bem-sucedida (código de resposta entre 200 e 204), os dados são decodificados para UTF-8 e armazenados na variável "out".


Função Request - Uma Abordagem Centralizada

A função Request age como um ponto de entrada centralizado para realizar solicitações tanto GET quanto POST, proporcionando uma abordagem conveniente e flexível.

int Request(string method,
            string &out,
            const string url,
            const string payload = "",
            const string query_param = "",
            string headers = "",
            const int timeout = 5000)
  • method : Define o método HTTP a ser utilizado, "GET" ou "POST".
  • url : A URL para a qual a solicitação será enviada.
  • payload : Os dados de carga útil a serem enviados em uma solicitação POST (opcional).
  • query_param : Parâmetros de consulta opcionais para solicitações GET.
  • out : Uma variável de saída que armazenará a resposta da solicitação.
  • headers : Cabeçalhos HTTP opcionais que você pode fornecer.
  • timeout : Define o tempo limite da solicitação em milissegundos.

A função Request atua como uma camada de abstração, simplificando a escolha entre GET e POST, sem a necessidade de se preocupar com detalhes de implementação. Isso não apenas simplifica o código, mas também melhora a legibilidade, tornando o desenvolvimento para chamadas HTTP mais eficiente e acessível.


      


Nossa jornada pelo desenvolvimento dessas funções é fundamental para capacitá-lo a aprender como trabalhar com chamadas HTTP de forma eficaz. Isso abrirá as portas para integrar seus projetos em MQL5 com uma ampla gama de serviços da web, capacitando você a enviar e receber dados, aproveitando a potência das chamadas HTTP e o manuseio eficiente de dados JSON. Vamos continuar explorando esses recursos, guiando-o passo a passo para que você possa aprimorar suas habilidades de programação em MQL5 e se tornar um especialista na interação com serviços da web através de HTTP.

Além de dominar as chamadas HTTP em MQL5, é essencial compreender o formato JSON (JavaScript Object Notation). JSON é uma forma eficaz e amplamente adotada de estruturar dados, frequentemente utilizada para a troca de informações entre sistemas. Aqui estão alguns motivos pelos quais é crucial aprender a trabalhar com JSON:

1. Formato Padrão da Web: JSON é o formato de escolha para muitas APIs da web, o que o torna um elemento fundamental para a integração de aplicativos e serviços externos. Ao entender JSON, você pode facilmente enviar e receber dados de serviços da web em uma estrutura que é amplamente aceita e compreendida.

2. Facilidade de Leitura e Escrita: JSON é conhecido por sua legibilidade. Ele usa uma sintaxe simples e humanamente legível, tornando mais fácil para os desenvolvedores entenderem e depurarem os dados. Isso é especialmente importante ao lidar com respostas de APIs e ao depurar solicitações.

3. Flexibilidade e Aninhamento: JSON permite a aninhamento de objetos e arrays, o que é ideal para representar dados complexos e hierárquicos. Isso é fundamental quando você lida com informações detalhadas e estruturadas.

4. Compatibilidade com Diversas Linguagens: JSON é compatível com uma ampla variedade de linguagens de programação, o que o torna uma escolha versátil. Independentemente de qual linguagem você esteja usando, a compreensão de JSON facilita a manipulação de dados.



A Relevância de JSON nas Chamadas HTTP

Agora que entendemos a importância do JSON, é fundamental ressaltar como ele se integra às chamadas HTTP realizadas. Tanto para solicitações de entrada (envio de dados) quanto para respostas de saída (recebimento de dados), o JSON desempenha um papel central.

Ao enviar dados para um serviço web, muitas vezes você precisará formatá-los como JSON e incluí-los na solicitação. Isso permite que o serviço entenda e processe esses dados de maneira apropriada. Por outro lado, ao receber respostas de serviços web, é comum que os dados sejam retornados no formato JSON. Portanto, saber como analisar e extrair informações de JSON se torna crucial.

Para simplificar ainda mais a manipulação de JSON em MQL5, optei por utilizar a biblioteca JAson, que é escrita em MQL5 nativo, eliminando a necessidade de usar DLLs externas. É importante destacar que essa escolha estratégica foi feita levando em consideração a notável simplicidade de uso e a eficácia comprovada da biblioteca. Agora, vamos explorar detalhadamente por que a biblioteca JAson é uma excelente opção para lidar com JSON em seus projetos de MQL5:

  1. Facilidade de Uso: Uma das principais vantagens da biblioteca JAson é a sua facilidade de uso. Ela foi projetada para simplificar a manipulação de JSON, tornando as operações de leitura, escrita e manipulação de objetos JSON acessíveis até mesmo para programadores iniciantes. Com uma sintaxe intuitiva e funcionalidades bem pensadas, você economizará tempo e esforço ao trabalhar com JSON.

  2. Abstração Conveniente: A biblioteca JAson oferece uma abstração conveniente para JSON. Isso significa que você não precisa lidar com os detalhes de análise e serialização manualmente. Em vez disso, pode usar métodos e funções fornecidos pela biblioteca para realizar tarefas comuns, como acessar propriedades de objetos JSON, adicionar elementos a arrays JSON e criar estruturas JSON complexas.

  3. Melhoria na Legibilidade do Código: Trabalhar diretamente com JSON em seu código MQL5 pode ser complicado e resultar em código confuso. No entanto, ao adotar a biblioteca JAson, você ganha a vantagem de um código mais legível e organizado. As operações relacionadas a JSON são simplificadas, o que torna seu código mais fácil de compreender e manter.

  4. Eficiência no Desenvolvimento: A eficiência é fundamental durante o desenvolvimento de projetos. A biblioteca JAson ajuda a acelerar o processo de desenvolvimento, permitindo que você se concentre na lógica de negócios em vez de se preocupar com a manipulação detalhada de JSON. Isso significa que você pode implementar funcionalidades mais rapidamente e com menos erros.


3 - Criação e Integração de uma API em FastAPI para o Jogo da Velha

Vamos começar nosso exemplo prático explorando o código de um jogo da velha em Python. Este é um passo fundamental no desenvolvimento da interação entre MQL5 e Python, pois o jogo da velha servirá como o ambiente com o qual o MQL5 irá interagir.

A Classe TicTacToe:
import random

class TicTacToe:

Aqui, importamos o módulo random e criamos uma classe chamada TicTacToe. Uma classe é uma estrutura de programação que organiza funções e variáveis relacionadas. Neste caso, a classe TicTacToerepresenta o jogo da velha.


Inicialização do Tabuleiro:
    def __init__(self):
        self.board = [[' ' for _ in range(3)] for _ in range(3)]
        self.player_turn = True

Neste trecho, estamos definindo o método __init__, que é um método especial que é chamado quando uma instância da classe é criada. Ele inicializa o estado do jogo.

  • self.boardé uma lista bidimensional (3x3) que representa o tabuleiro do jogo. Inicialmente, todas as células estão vazias (representadas por espaços em branco).
  • self.player_turné uma variável booleana que rastreia de quem é a vez de jogar. Inicialmente, é a vez do primeiro jogador (True).


Método print_board:
    def print_board(self):
        for row in self.board:
            print("|".join(row))
            print("-" * 5)

Este método print_board é responsável por imprimir o estado atual do tabuleiro na tela. Ele percorre as linhas do tabuleiro e imprime os elementos separados por barras verticais ('|') e linhas horizontais ('-----') para criar a representação visual do tabuleiro.


Método 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

O método check_winner verifica se há um vencedor no jogo. Ele verifica todas as linhas, colunas e diagonais para ver se há três símbolos consecutivos do mesmo jogador ('X' ou 'O'). Se um jogador ganhar, o símbolo desse jogador é retornado (por exemplo, 'X' se o jogador 'X' vencer). Se não houver vencedor, o método retorna None .


Método 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.")

O método make_move é responsável por fazer uma jogada no jogo. Ele recebe as coordenadas da linha e coluna onde o jogador deseja fazer a jogada. Antes de fazer a jogada, verifica se a célula no tabuleiro está vazia (' '). Se estiver vazia, a jogada é feita, e o símbolo do jogador ('X' ou 'O') é colocado na célula. Em seguida, a vez do jogador é alternada. Se a célula não estiver vazia, uma mensagem de "Jogada inválida" é impressa.

O código acima representa um ponto crucial no nosso processo de integração entre MQL5 e Python. Desenvolver o jogo da velha em Python é uma etapa fundamental, uma vez que ele servirá como o ambiente no qual nossa interação ocorrerá.

Ao analisar cada aspecto desse código, podemos apreciar a simplicidade e eficácia com que o Python nos permite criar um jogo funcional. No entanto, o verdadeiro potencial desse código será revelado quando o conectarmos ao MQL5, permitindo que essas duas tecnologias distintas trabalhem em conjunto de forma sinérgica.

Agora que estabelecemos uma base sólida com o jogo da velha, estamos prontos para dar o próximo passo empolgante: o desenvolvimento de uma API em Python usando o FastAPI. Essa API será o elo de comunicação entre o MQL5 e o jogo da velha, possibilitando que o MQL5 faça solicitações e receba respostas para jogar o jogo. Vamos iniciar esse processo de desenvolvimento e explorar como a integração entre sistemas pode ser alcançada com eficiência e eficácia.

Agora que você já está familiarizado com a classe TicTacToe e como ela gerencia o jogo da velha, vamos analisar em detalhes o código da API FastAPI que está apresentado acima. Esta API desempenhará um papel fundamental na interação entre o MQL5 e o jogo da velha Python que desenvolvemos anteriormente. Vamos entender cada parte desse código:

# 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 = {}

Começamos importando duas bibliotecas essenciais: FastAPI e Pydantic. O FastAPI é uma estrutura para desenvolvimento rápido de APIs web em Python, enquanto o Pydantic é usado para definir modelos de dados que descrevem a estrutura dos dados esperados pela API.

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

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

A seguir, definimos dois modelos de dados utilizando Pydantic. O GameBoard representa o estado atual do tabuleiro do jogo e contém uma lista chamada board para armazenar as células do tabuleiro e uma string player_turn para indicar de quem é a vez de jogar. O PlayerMove representa uma jogada que um jogador deseja fazer e inclui as coordenadas row (linha) e col (coluna) da jogada.

# 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,
    }

A API possui dois endpoints principais. O primeiro endpoint, /start-game/, permite iniciar um novo jogo da velha. Ele cria uma instância da classe TicTacToepara representar o jogo e a associa a um ID único no dicionário games . O ID do jogo é retornado como resposta.

O segundo endpoint, /play/{game_id}/, permite que os jogadores façam suas jogadas em um jogo existente. Ele recebe um ID de jogo como parâmetro e os dados da jogada do jogador. A API verifica se o jogo com o ID fornecido existe no dicionário games. Se não existir, retorna um erro 404. Em seguida, ela tenta fazer a jogada no jogo e atualiza o estado do tabuleiro. O estado atual do tabuleiro é retornado como resposta.

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

Finalizamos o código executando a API utilizando o Uvicorn. Isso permite que a API seja acessada por outras aplicações. 

Documentação da API, gerada automaticamente


FastAPI é uma estrutura moderna e rápida para construir APIs com Python 3.6+ que é baseada em padrões Python type hints. Sua simplicidade está em sua capacidade de permitir uma codificação rápida, eficiente e robusta, com destaque para as seguintes características:

  1. Rapidez e Desempenho: FastAPI é um dos frameworks mais rápidos para Python, graças ao seu uso do Starlette para roteamento e Uvicorn para execução de servidor ASGI. Isso o torna ideal para aplicações que exigem alto desempenho.

  2. Geração Automática de Documentação: Com FastAPI, a documentação da sua API é gerada automaticamente e é atualizada com as mudanças do código. Isso é possível graças ao uso dos type hints do Python e aos sistemas de documentação integrados como Swagger UI e ReDoc.

  3. Validação de Dados e Serialização: Utilizando Pydantic, o FastAPI oferece um sistema robusto para validação de dados. As requisições e respostas são automaticamente validadas e serializadas, reduzindo a quantidade de código necessário e evitando muitos erros comuns.

  4. Facilidade de Uso: O FastAPI é projetado para ser fácil de usar, com um aprendizado intuitivo. Isso torna mais simples para os desenvolvedores criar e manter APIs eficientes, com uma curva de aprendizado menos íngreme em comparação com outras frameworks.

  5. Suporte a Operações Assíncronas: Com suporte nativo para operações assíncronas, FastAPI é adequado para aplicações que precisam lidar com solicitações simultâneas, como serviços em tempo real.

  6. Segurança e Autenticação: O framework também fornece ferramentas para implementar segurança na API, incluindo suporte para OAuth2 com JWT tokens e outras estratégias de autenticação.

A utilização do FastAPI na criação de uma API demonstra claramente sua eficácia e simplicidade. Este framework proporciona uma integração perfeita entre diferentes tecnologias, como MQL5 e Python, e permite o desenvolvimento rápido de aplicações web de alto desempenho. Ao empregar o FastAPI, desenvolvedores podem focar mais na lógica de negócios e menos nos detalhes técnicos da implementação de uma API, acelerando o processo de desenvolvimento e garantindo a qualidade do produto final.


4 - Aplicação Prática e Testes

O script de teste MQL5 em análise é um exemplo prático de como integrar esta linguagem de programação com uma API externa construída em FastAPI, aplicada no contexto de um jogo da velha. O processo é dividido em várias etapas, cada uma cumprindo uma função específica na interação com a API:

O script começa estabelecendo o endereço da API FastAPI:

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

Esta linha define a URL base da API, que será usada para enviar solicitações ao servidor FastAPI. Esta configuração é essencial para garantir que o script se comunique com a API corretamente.

Função para Imprimir Respostas da API

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

Esta função auxiliar é projetada para imprimir as respostas recebidas da API no log do MQL5. Ela fornece um feedback útil sobre o resultado de cada solicitação enviada.

Inicialização e Primeira Solicitação

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

OnStarté a função principal do script. Ela inicia um novo jogo enviando uma solicitação GET para a API. A variável startGameRes armazena o resultado desta solicitação, indicando se foi bem-sucedida.

Processamento da Resposta e Início do Jogo

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

Após receber a resposta da API, o script extrai o ID do jogo da resposta. Este ID é crucial para as jogadas subsequentes, pois identifica a sessão do jogo atual.

Realização das Jogadas

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

O script então faz uma série de jogadas, cada uma representada por um objeto JSON contendo as coordenadas da jogada no tabuleiro. Estas jogadas são enviadas para a API usando solicitações POST. O processo é repetido para cada jogada subsequente.



Análise do Fluxo de Jogo

  • Início: O jogo é iniciado, e o ID do jogo é obtido.
  • Jogadas: Três jogadas são realizadas, alternando entre os jogadores.
  • Feedback: Após cada jogada, o script processa a resposta da API para verificar o estado atualizado do jogo.

Percepções:

  • Integração Eficiente: O script demonstra uma integração eficaz entre MQL5 e uma API FastAPI, ilustrando como o MQL5 pode ser usado para interagir com uma aplicação externa.
  • Modelo Flexível: O exemplo serve como um modelo flexível para outros tipos de aplicações, evidenciando a capacidade do MQL5 de se integrar com APIs externas.
  • Aplicabilidade Prática: Este script é um exemplo prático da união entre a programação MQL5 e a flexibilidade das APIs em Python usando FastAPI, abrindo caminho para novas inovações em interações entre diferentes sistemas.

Este script de teste MQL5 não apenas ilustra os conceitos teóricos de integração de sistemas, mas também oferece uma aplicação prática, ressaltando a interconectividade e adaptabilidade na programação de sistemas modernos.


Conclusão

Chegando ao final deste artigo, dá para perceber que a jornada pelo mundo da programação é sempre cheia de descobertas. Nessa etapa, mergulhamos no desenvolvimento de funções MQL5 para lidar com chamadas HTTP, algo que, à primeira vista, pode parecer um pouco técnico, mas que na verdade abre um universo de possibilidades.

Pensando no MQL5, normalmente associamos ele diretamente com trading, mas quem diria que ele poderia ser usado para algo completamente diferente, como controlar um jogo da velha feito em Python? Isso mostra como uma linguagem de programação pode ter usos que vão muito além do que normalmente esperamos.

E falando em Python, criar um jogo da velha foi uma maneira interessante de ver a programação em ação. Foi um exemplo prático que nos ajudou a entender melhor como diferentes linguagens e tecnologias podem se conectar.

A escolha do FastAPI para criar a API foi estratégica. Rápido, eficiente e fácil de usar, o FastAPI provou ser uma ótima ferramenta para construir a ponte entre o nosso jogo e o MQL5. O interessante é ver como a API, algo que pode parecer apenas um intermediário técnico, na verdade, tem um papel crucial em unir diferentes mundos da programação.

Por fim, o script de teste em MQL5. Esse foi o momento de testar tudo na prática, de ver a teoria se tornando realidade. Foi aqui que realmente percebemos o potencial da integração dessas tecnologias. Mostrou que, com um pouco de criatividade e conhecimento técnico, podemos criar coisas incríveis.

Então, o que aprendemos com tudo isso? Que a programação é um campo vasto, com muitas surpresas e oportunidades. Que MQL5, Python são apenas algumas das ferramentas que temos à disposição e que, quando usadas juntas, podem criar soluções inesperadas e inovadoras. E, talvez o mais importante, que sempre há algo novo para aprender e explorar no mundo da tecnologia.



Arquivos anexados |
Parte_02.zip (35.95 KB)
Últimos Comentários | Ir para discussão (4)
Stanislav Korotky
Stanislav Korotky | 27 abr 2024 em 12:56
Entre a parte 1 e a parte 2, você obviamente perdeu outro artigo completo que vinculava RestAPI com python e FastAPI. Afinal, este é um site para traders.
Jonathan Pereira
Jonathan Pereira | 27 abr 2024 em 14:44
Stanislav Korotky #:
Entre a parte 1 e a parte 2, você obviamente perdeu outro artigo completo que vinculava RestAPI com python e FastAPI. Afinal, este é um site para traders.
Se você tivesse um mínimo de capacidade, entenderia que entre a parte 1 e a parte 2, já tem informação suficiente para adaptar ao ambiente de trade. Use a cabeça e aproveite sites como https://brapi.dev/docs para enriquecer sua análise e implementação no MetaTrader. Pare de esperar que mastiguem tudo para você. Afinal, isto é um site para traders, não para AMADORES.
Stanislav Korotky
Stanislav Korotky | 28 abr 2024 em 16:06
Jonathan Pereira #:
Se você tivesse alguma habilidade, teria percebido que entre a primeira e a segunda parte você já tem informações suficientes para se adaptar ao seu ambiente de negociação. Use sua cabeça e use sites como https://brapi.dev/docs para enriquecer sua análise e implementação no MetaTrader. Pare de esperar que tudo seja mastigado para você. Afinal de contas, este é um site para traders, não para amadores.

Se você moderasse sua arrogância em favor de uma apresentação mais metódica do material e não mandasse para a Internet as informações que você perdeu nos artigos (que, com essa abordagem, você não pode escrever nada, mas manda todo mundo para o Google de uma vez), seria muito mais fácil para os leitores. E insultá-los não o honra como autor ou moderador.

Denis Kirichenko
Denis Kirichenko | 28 abr 2024 em 18:12
Jonathan Pereira #:
Se você tivesse alguma habilidade, teria percebido que entre a primeira e a segunda parte você já tem informações suficientes para se adaptar ao seu ambiente de negociação. Use sua cabeça e use sites como https://brapi.dev/docs para enriquecer sua análise e implementação no MetaTrader. Pare de esperar que tudo seja mastigado para você. Afinal de contas, este é um site para traders, não para amadores.
Na minha opinião, o Sr. Pereira está se queimando de forma não construtiva, no estilo "você é um tolo" .... Aparentemente, o Sr. Pereira não viu o livro-texto de Stanislav, por isso ele é tão categórico....
Força bruta para encontrar padrões (Parte V): uma nova perspectiva Força bruta para encontrar padrões (Parte V): uma nova perspectiva
Neste artigo, vou apresentar uma abordagem completamente diferente para o algorítmico de negociação, que levei um tempo considerável para desenvolver. Claro, tudo isso está relacionado ao meu programa de força bruta, que passou por várias mudanças, permitindo que ele resolva várias tarefas simultaneamente. No entanto, este artigo é mais geral e extremamente simples, sendo adequado até mesmo para aqueles que não têm conhecimento prévio ou apenas passaram por isso.
Desenvolvendo um sistema de Replay (Parte 37): Pavimentando o Terreno (I) Desenvolvendo um sistema de Replay (Parte 37): Pavimentando o Terreno (I)
Neste artigo iremos começar a fazer algo, que eu gostaria de ter feito a muito mais tempo. No entanto, por falta de "terreno firme", não me sentia seguro para apresentar de forma publica. Mas agora já tenho as bases para poder fazer o que iremos começar a fazer, a partir de agora. É bom que foque ao máximo em compreender o conteúdo deste artigo. E não estou dizendo isto, apenas para que você o leia apenas por ler. Quero e preciso enfatizar que se você não entender este artigo especifico. Poderá abandonar completamente qualquer esperança em compreender o conteúdo dos próximos.
Redes neurais de maneira fácil (Parte 50): Soft Actor-Critic (otimização do modelo) Redes neurais de maneira fácil (Parte 50): Soft Actor-Critic (otimização do modelo)
No artigo anterior, implementamos o algoritmo Soft Actor-Critic, mas não conseguimos treinar um modelo lucrativo. Neste artigo, vamos realizar a otimização do modelo previamente criado para obter os resultados desejados a nível de seu funcionamento.
Transformada Discreta de Hartley Transformada Discreta de Hartley
Neste artigo, vamos nos familiarizar com um dos métodos de análise espectral e processamento de sinais - a transformada discreta de Hartley. Com ela, é possível filtrar sinais, analisar seus espectros e muito mais. As capacidades da DHT não são menores do que as da transformada discreta de Fourier. No entanto, ao contrário dela, a DHT utiliza apenas números reais, o que a torna mais conveniente para implementação na prática, e os resultados de sua aplicação mais visíveis.