English Русский Español Deutsch 日本語 Português
preview
开发具有 RestAPI 集成的 MQL5 强化学习代理(第 2 部分):用于与井字游戏 RestAPI 进行 HTTP 交互的 MQL5 函数

开发具有 RestAPI 集成的 MQL5 强化学习代理(第 2 部分):用于与井字游戏 RestAPI 进行 HTTP 交互的 MQL5 函数

MetaTrader 5示例 | 15 七月 2024, 11:35
147 0
Jonathan Pereira
Jonathan Pereira

概述

在上一篇文章中,我们谈到了 API 和 RestAPI,重点介绍了这些关键技术如何促进不同系统之间的通信和数据交换。我们从 Roy Fielding 原则的角度分析了 RestAPI 的演变,以及它们如何更高效、更灵活地取代了 SOAP 等旧协议。我们还强调了 RestAPI 简单性、可扩展性和多功能性的重要性,以及它们在开发先进互联系统中的作用。

在这篇新文章中,我们将扩展这些概念,并将其应用到一个实际例子中。我们将重点放在 MQL5 中开发一套函数,用于处理 HTTP 调用,并与 RestAPI 功能集成,以实现与外部环境的有效交互。为此,我们将以在 Python 中创建井字游戏(tic-tac-toe)为例进行说明。

我们将从开发 MQL5 中的函数开始。这些函数是与外部环境(在本例中是与用 Python 开发的井字游戏)建立有效通信所必需的。它们可以发送 HTTP 请求和接收响应,是 MQL5 和游戏 API 之间的通信桥梁。

同时,我们还将了解使用 FastAPI 进行 API 开发的情况,选择 FastAPI 是因为它具有高性能、易于开发和对异步 API 的强大支持等特点。FastAPI 还能与现代 API 开发工具很好地集成,从而轻松创建高效、可扩展的端点,我们的 MQL5 功能集可利用这些端点与井字游戏进行交互。

在学习了基本 MQL5 函数后,我们将创建一个测试脚本,它设计用于与 Python API 进行交互。该脚本将是展示我们的 MQL5 函数在井字游戏中实际应用性的最重要元素。

这个例子不仅能说明上述概念的实际应用,还能让我们深入了解如何将这些技术结合起来,创造出创新的解决方案。

在本文中,我们将探讨 MQL5 中函数的技术开发和 FastAPI 中的 API,以及它们在构建互连系统中的作用。

本文分为四个主要部分:

  1. 概述和背景介绍。我们将简要回顾上一篇文章中讨论的 API 和 RestAPI 概念,并强调这些技术在系统互联方面的发展和重要性。

  2. 在 MQL5 中开发 HTTP 调用函数。在此,我们将重点开发 MQL5 中的特定函数,这些函数旨在建立和管理 HTTP 通信,这是 MQL5 与外部环境集成的基本步骤。

  3. 使用 FastAPI 为井字游戏创建和集成 API。在本节中,我们将了解如何使用 FastAPI 开发可靠的 API。该 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("Invalid game. Try again.")
    
    

每个部分都有助于全面了解如何将 RestAPI 和 MQL5 结合使用,以开发相互关联的解决方案。



上图说明了 MQL5 脚本与井字游戏之间的交互顺序,外部应用程序接口充当了中间角色。我们将从 MQL5 脚本启动游戏的请求开始,该请求由外部 API 处理。这反过来又会调用 Python 实现的井字游戏。移动是通过 HTTP 请求发送和接收的,由外部 API 管理输入和输出逻辑。使用 FastAPI 是提高这一过程效率的关键,可确保异步和高性能的交互。这一流程直观地展示了我们在不同系统间进行整合的方法的实用性和有效性。


1.概述和背景介绍

继续我们的系列文章,今天的文章将回到 API 和 RestAPI 的讨论,重点关注它们的演变及其对数字系统互联日益增长的重要性。应用程序接口(API)已成为数字化时代的基础,在整合不同程序、确保交流与和谐运行方面发挥着至关重要的作用。RestAPI 的架构以简单性和可扩展性为核心,它的出现代表了一个重大飞跃,它克服了 SOAP 等旧协议的局限性,为系统间的互操作性提供了更有效的选择。第一篇文章主要是加深对这些接口的理解,介绍它们的功能、多样性和基本架构,并探讨了实际应用的例子。我们将在今后的文章中进行更复杂的讨论并开发更具体的应用。





RestAPI 出现在世纪之交,由于与基于 XML 的 SOAP 等协议相比,其简化的方法迅速流行起来,而 SOAP 以复杂和需要大量数据进行基本操作而闻名。作为一种更加灵活多变的选择,RestAPI 已经在包括金融在内的各个领域建立了自己的地位。它们在几乎所有编程语言中的易用性和实现性使其对需要高效通信的现代系统特别有吸引力。

RestAPI的广泛接受在很大程度上是由于它们对各种数据格式(如JSON和XML)的适应性和支持,这促进了不同系统和平台之间的互操作性。此外,RestAPI 的一个重要方面是安全性:令牌验证和密码学等强大机制可确保敏感信息在数据交换过程中受到保护。这种级别的安全性和灵活性至关重要,特别是在处理金融交易和个人数据等关键信息的应用程序中。


2 - 在 MQL5 中开发 HTTP 调用函数

在本文中,我们将开始详细研究如何在 MQL5 中开发函数,以便进行 HTTP 调用和操作 JSON 数据。这些函数在 MQL5 程序与外部环境的集成中发挥着重要作用,使您能够有效地与 web 服务交互并以 JSON 格式操作信息。

此外,在处理 HTTP 调用时,理解 HTTP 状态代码的含义非常重要。这些代码由 web 服务器返回,以显示请求的结果。例如,状态代码 "200 OK "表示请求成功,而状态代码 "404 Not Found "则表示在服务器上找不到所请求的资源。了解这些代码对于开发与 web 服务交互的应用程序至关重要,因为它们提供了有关 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:GET 请求将要发送到的 URL。
  • query_param:可添加到 URL 的可选查询参数。
  • out:输出变量,用于存储对请求的响应。
  • headers:可提供的 HTTP 头信息。
  • timeout:以毫秒为单位指定的请求超时时间。

SendGetRequest 函数是 GET 请求处理过程的关键,从请求构建到 HTTP 错误处理都是如此。值得注意的是,虽然该函数中包含错误处理功能,但目前的形式还比较简单。我想今后可能会有所改进。

响应成功后(响应代码在 200 和 204 之间),函数会将数据解码为 UTF-8 格式,并保存在 "out "变量中。该功能对于确保在项目中正确处理和有效使用所收集的数据十分必要。


SendPostRequest 函数 - 执行 POST 请求

现在我们来看看 SendPostRequest 函数,该函数用于向外部网络服务传递数据,其 payload 通常为 JSON 格式。该函数用于通过 API 创建或更新资源。

int SendPostRequest(const string url, const string payload, string &out, string headers = "", const int timeout = 5000)
  • url:POST 请求将要发送到的 URL。
  • payload:与请求一起发送的实体数据,通常为 JSON 格式。
  • out:输出变量,用于存储对请求的响应。
  • headers:可提供的 HTTP 头信息。
  • timeout:以毫秒为单位指定的请求超时时间。

SendPostRequest 函数简化了创建 POST 请求、添加 header 和处理 HTTP 错误的过程,但需要注意的是,当前的错误处理可能还不完善,将来可能会改进,就像 SendGetRequest 函数一样。如果响应成功(响应代码 200 至 204),数据将解码为 UTF-8,并存储在 "out "变量中。


Request 函数 - 集中式方法

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:以毫秒为单位指定的请求超时时间。

请求函数就像一个抽象层,让你在 GET 和 POST 之间轻松做出选择,而不必担心实现细节。这不仅简化了代码,还提高了可读性,使 HTTP 调用的开发更高效、更易用。


      


本解释的目的是帮助读者学习如何有效地使用 HTTP 调用。有了这些知识,您就能将自己的 MQL5 项目与各种 web 服务集成起来,利用 HTTP 调用的功能发送和接收数据,并高效地处理 JSON 格式的数据。我们将继续探索这些资源,逐步指导您掌握 MQL5 编程技能,成为通过 HTTP 与 web 服务交互的专家。

除了掌握 MQL5 中的 HTTP 调用外,了解 JSON(JavaScript Object Notation,JavaScript 对象表示法)格式也很重要。JSON 是一种高效而广泛的结构化数据方式,通常用于系统间的信息交换。以下是为何学习使用 JSON 重要的几个原因:

1.标准 Web 格式:JSON 是许多 web 应用程序接口的首选格式,是集成外部应用程序和服务的基础。通过了解 JSON,您可以轻松地从web 服务中发送和接收数据,这种结构已被广泛使用和理解。

2.易于阅读和书写:JSON 以其可读性著称。它使用简单、人类可读的语法,使开发人员更容易理解和调试数据,这在处理 API 响应和调试请求时尤为重要。

3.灵活性和嵌套:JSON 允许嵌套对象和数组,非常适合表示复杂的分层数据。在处理详细的结构化信息时,这一点非常重要。

4.兼容不同语言:JSON 与多种编程语言兼容,因此是一种通用选择。无论使用哪种语言,了解 JSON 都能让数据处理变得更容易。



HTTP 调用中 JSON 的相关性

现在我们已经了解了 JSON 的重要性,我们就需要看看它是如何与 HTTP 调用相结合的。对于传入请求(发送数据)和传出响应(接收数据),JSON 都发挥着重要作用。

向 web 服务发送数据时,您通常需要将数据格式化为 JSON 并将其包含在请求中。这样,服务就能正确理解和处理这些数据。另一方面,在接收 web 服务的响应时,数据通常以 JSON 格式返回。因此,了解如何从 JSON 中解析和提取信息变得至关重要。

为了进一步简化在 MQL5 中处理 JSON 的工作,我决定使用 JAson 库,它是用本地 MQL5 编写的。这样就无需使用外部 DLL。该库非常容易使用,而且效果显著。现在,让我们仔细看看为什么 JAson 库是我们在 MQL5 项目中处理 JSON 的绝佳选择:

  1. 易于使用:JAson 库的主要优点之一是易于使用。它旨在简化 JSON 的使用,使新手程序员也能读写和操作 JSON 对象。直观的语法和周到的功能可让您在处理 JSON 时省时省力。

  2. 方便抽象:JAson 为 JSON 提供了一个方便的抽象,这意味着我们不必手动处理解析和序列化细节。相反,我们可以使用库提供的方法和函数来执行常见任务,如访问 JSON 对象的属性、向 JSON 数组添加元素以及创建复杂的 JSON 结构。

  3. 提高代码可读性:在我们的 MQL5 代码中直接处理 JSON 可能会很复杂,并导致代码混乱。不过,通过使用 JAson 库,我们可以获得更易读、更有条理的代码。简化了与 JSON 相关的操作,使我们的代码更易于理解和维护。

  4. 开发效率:效率是项目开发的关键点。JAson 库可以让我们专注于业务逻辑而不是详细的 JSON 处理,从而帮助我们加快开发过程。这意味着我们可以更快地提供功能,减少错误。


3.使用 FastAPI 中为井字游戏创建和集成 API

让我们从学习 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("Invalid game. Try again.")

make_move 方法负责在游戏中移动棋子。它接收玩家打算移动的行和列坐标。在走棋之前,它会检查棋盘上的单元格('')是否为空。如果是空格,则进行移动,并将棋子符号("X "或 "O")放入该格。玩家的轮次随之改变。如果单元格不是空的,则会显示 "Invalid move"(无效移动)信息。

上面的代码代表了 MQL5 和 Python 之间的集成过程。在 Python 中开发井字游戏是重要的一步,因为它将成为我们进行交互的环境。

通过研究这段代码的方方面面,您可以看到 Python 能让我们轻松高效地创建一个可玩的游戏。然而,当我们将该代码与 MQL5 相连接时,它的真正潜力就会显现出来,这将使这两种不同的技术协同工作。

现在,我们已经为井字游戏打下了坚实的基础,我们已经准备好迈出下一步:使用 FastAPI 开发 Python API。该 API 将成为 MQL5 和井字游戏之间的纽带,允许 MQL5 执行查询并接收响应,从而玩游戏。在开发过程中,我们将看到这种集成的方方面面。

现在您已经熟悉了TicTacToe 类及其工作方式,让我们仔细看看上面的 FastAPI API 代码。该 API 将用于 MQL5 与我们之前用 Python 开发的井字游戏之间的交互。让我们来了解一下这段代码的各个部分:

# Import of Libraries
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from tic_tac_toe import TicTacToe

# Instantiate FastAPI
app = FastAPI()

# Running game storage
games = {}

首先,让我们导入两个所需的库:FastAPI 和 Pydantic。FastAPI 是一个用 Python 快速开发 web 接口的框架。Pydantic 用于定义数据模型,以描述 API 所需的数据结构。

# Defining data models
class GameBoard(BaseModel):
    board: list
    player_turn: str

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

接下来,我们将使用 Pydantic 定义两个数据模型。GameBoard 表示游戏棋盘的当前状态,包含一个用于存储棋盘单元的 "board" 列表和一个表示游戏进程的字符串 player_turn。PlayerMove 表示玩家要执行的移动,包括移动的行和列坐标。

# Definition of API Endpoints

# Endpoint to start a new game
@app.get("/start-game/")
def start_game():
    game_id = len(games) + 1
    game = TicTacToe()
    games[game_id] = game
    return {"game_id": game_id}

# Endpoint to make a play in the game
@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 the print_board method to print the current game do
    game.print_board()

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

API 有两个主要端点。首先,/start-game/ 允许您开始新的井字游戏。它创建一个TicTacToe 类实例来表示一个游戏,并将其与游戏字典中的唯一 ID 关联。游戏 ID 将作为响应返回。

第二个端点 /play/{game_id}/ 允许玩家在现有游戏中移动。作为参数,它接收玩家的游戏 ID 和游戏数据。API 会检查 games 字典中是否存在指定 ID 的游戏。如果不存在,则返回错误 404。然后,它会尝试在棋局中走一步棋,并更新棋盘的状态。游戏棋盘的当前状态将作为响应返回。

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

我们通过使用 Uvicorn 执行 API 来完成代码。这使其他应用程序可以访问 API。 

自动生成的 API 文档


FastAPI 是一个现代化的快速框架,用于在 Python 3.6+ 中创建应用程序接口,它基于 Python 类型提示标准。它的简单性在于它能够提供快速、高效和可靠的编码,并侧重于以下功能:

  1. 速度与性能:FastAPI 是 Python 最快的框架之一,使用 Starlette 进行路由选择,使用 Uvicorn 执行 ASGI 服务器。因此,它非常适合需要高性能的应用程序。

  2. 自动生成文档:使用 FastAPI,API 文档会自动生成,并随着代码的变化而更新。通过使用 Python 的类型提示以及 Swagger UI 和 ReDoc 等集成文档系统,这一切都成为可能。

  3. 数据验证和序列化:利用 Pydantic,FastAPI 可提供强大的数据验证系统。请求和响应会自动进行验证和序列化,从而减少了所需的代码量,避免了许多常见的缺陷。

  4. 易于使用:FastAPI 的设计简单易用、直观易学。这使得开发人员更容易创建和维护高效的 API,与其他框架相比,学习曲线没有那么陡峭。

  5. 支持异步操作:FastAPI 内置异步操作支持,适用于需要处理并发请求的应用程序,如实时服务。

  6. 安全和认证:该框架还提供了实现 API 安全性的工具,包括支持带有 JWT 标记的 OAuth2 和其他身份验证方法。

使用 FastAPI 创建 API 清楚地表明了它的高效性和简易性。该框架实现了各种技术(如 MQL5 和 Python)之间的无缝集成,使您能够快速开发高性能的 web 应用程序。使用 FastAPI,开发人员可以将更多精力放在业务逻辑上,而较少关注应用程序接口实施的技术细节,从而加快开发过程并确保最终产品的质量。


4.实际实施和测试

分析中的 MQL5 测试脚本是在井字游戏中将这种编程语言与 FastAPI 内置的外部 API 集成的一个实际例子。该过程分为几个阶段,每个阶段负责与 API 进行某些交互:

脚本首先建立 FastAPI API 地址:

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

此行定义了我们将用于向 FastAPI 服务器发送请求的基本 API URL。此设置对于确保脚本能够与 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 是脚本的主要函数。通过向 API 发送 GET 请求,我们将开始一个新游戏。startGameRes 变量存储该请求的结果,它表示请求是否成功。

处理回复并开始游戏

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

收到 API 的响应后,脚本会从中提取游戏 ID。该 ID 对后续游戏非常重要,因为它可以识别当前游戏会话。

采取行动

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

然后,脚本执行一系列动作,每个动作都由一个 JSON 对象表示,该对象包含游戏棋盘上动作的坐标。这些动作是通过 POST 请求发送到 API 的。随后的每一步棋都要重复这一过程。



游戏分析

  • 开始:游戏开始后,我们会得到一个游戏 ID。
  • 移动:玩家之间交替进行三次移动。
  • 反馈:每次游戏结束后,脚本都会处理 API 响应,检查更新后的游戏状态。

看法:

  • 有效集成:该脚本演示了 MQL5 和 FastAPI API 之间的有效集成,展示了如何使用 MQL5 与外部应用程序进行交互。
  • 灵活的模式:此示例可作为其他类型应用程序的灵活模型,展示 MQL5 与外部 API 集成的能力。
  • 实际应用性:该脚本是将 MQL5 编程与使用 FastAPI 的 Python API 的灵活性相结合的一个实用范例,为不同系统之间的互动开辟了新的创新之路。

本 MQL5 测试脚本不仅阐述了系统集成的理论概念,还提供了实际应用,突出了现代系统编程的相互关联性和适应性。


结论

这篇文章告诉我们,在编程的世界里,旅程中总是充满发现。在这一阶段,我们探讨了开发用于处理 HTTP 调用的 MQL5 函数,乍一看,这在技术上似乎有点复杂,但实际上却为我们带来了无限可能。

提到 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)
利用 Python 和 MQL5 构建您的第一个玻璃盒模型 利用 Python 和 MQL5 构建您的第一个玻璃盒模型
如果我们想从机器学习这些先进技术中获得任何价值,那么很难解释和理解为什么我们的模型偏离我们的期望至关重要。如果对模型内部工作原理的没有全面了解,我们可能无法发现破坏模型性能的错误,我们可能会在无法预测的参照特征上浪费时间,从长远来看,我们有可能没有充分利用这些模型的功能。幸运的是,有一个复杂且维护良好的多合一解决方案,令我们能够准确地看到我们的模型在引擎盖下正在做什么。
开发回放系统(第 37 部分):铺平道路 (一) 开发回放系统(第 37 部分):铺平道路 (一)
在这篇文章中,我们终于要开始做我们早就想做的事情了。之前,由于缺乏 "坚实的基础",我没有信心公开介绍这部分内容。现在我有了这样做的基础。我建议您尽可能集中精力理解本文的内容。我指的不仅仅是阅读,我想强调的是,如果你不理解这篇文章,你可能就是完全放弃了理解以后文章内容的希望。
Python、ONNX 和 MetaTrader 5:利用 RobustScaler 和 PolynomialFeatures 数据预处理创建 RandomForest 模型 Python、ONNX 和 MetaTrader 5:利用 RobustScaler 和 PolynomialFeatures 数据预处理创建 RandomForest 模型
在本文中,我们将用 Python 创建一个随机森林(random forest)模型,训练该模型,并将其保存为带有数据预处理功能的 ONNX 管道。之后,我们将在 MetaTrader 5 终端中使用该模型。
群体优化算法:差分进化(DE) 群体优化算法:差分进化(DE)
在本文中,我们将讨论在前面讨论过的所有算法中最有争议的算法 - 差分进化算法(Differential Evolution,DE)。