English Русский Español Deutsch 日本語 Português
preview
使用MQL5和Python集成经纪商API与智能交易系统

使用MQL5和Python集成经纪商API与智能交易系统

MetaTrader 5示例 |
833 6
Clemence Benjamin
Clemence Benjamin

引言

今天,我们将探讨如何通过 API 集成,在我们的 MetaTrader 5 智能交易与外部经纪商之间建立一个无缝连接。主要目标是解决交易账户资金不足的问题,通过在账户余额低于设定阈值时实现自动入金,来有效应对关键的资金管理挑战,从而提升交易操作的效率和安全性。

通常,我们会遵循一个常规流程:登录经纪商账户门户来执行各种交易和操作。虽然这是传统的方法,但存在一个名为 API(应用程序编程接口)的强大功能,它让我们能够做更多的事情,并优化我们的方法。对你们中的一些人来说,这可能是一个熟悉的术语。然而,对于其他人,我将会把它分解成易于理解的几个部分,以确保我们所有人都在同一认知水平上:

  1. 什么是 API?
  2. API 的用途
  3. 如何访问 API
  4. API 文档

让我们详细探讨这些内容:

1. 什么是 API?

API(应用程序编程接口)能够实现与软件系统的外部交互。在此背景下,它为我们提供了直接在服务器上对经纪商账户执行操作的能力——而无需手动登录。

有趣的是,API早在 20 世纪 40 年代就已出现,但在 70 年代开始获得关注,并在 2000 年后得到了广泛应用。

2. API 的用途

API 促进了软件应用程序和系统之间的通信。以下是一些常见的应用领域:

  • 网站服务器
  • 移动应用程序

API 允许从各种来源无缝访问数据,例如:

  • 社交媒体平台
  • 云存储
  • 支付网关
  • 气象站
  • 股票与金融市场

API

API 作为外部计算机与云服务器之间的桥梁。


3. 如何访问 API

要使用 API,您通常需要:

  • 从提供商处获取一个 API 密钥。
  • 研究 API 文档以正确地集成它。
  • 在您的请求中包含 API 密钥作为参数,以进行身份验证和授权。
API 密钥对于识别您的应用程序或用户至关重要,同时也能确保安全访问。

    4. API 文档

    每个 API 都附带自己的用户指南和规范。这些文档详细说明了如何有效地与该 API 进行交互。例如,Telegram的API文档与经纪商的API(如经纪商Deriv的API)文档就有显著不同。

    通过理解和利用 API,我们可以简化我们的操作、实现流程自动化,并提高管理券商账户的效率。让我们更深入地探讨每个方面,并探索其实际的实现方法。

    以下是我们讨论中的主要章节列表:


    本文概览

    在本文中,我们将探讨如何将 MQL5 与券商的 API 结合使用,以促进资金管理方面的无缝操作。我们的目标是揭示 MQL5 智能交易系统所蕴含的巨大潜力。由于 MQL5 本身无法直接与 Web 服务器交互,我们将利用外部语言库,例如 Python 或 Node.js,具体选择取决于经纪商API的能力。在本次讨论中,我们将以 Deriv.com 作为我们选定的经纪商。

    此方法的优势

    • 自动化资金划转:EA将把交易盈利从交易账户自动划转到一个安全账户。
    • 交易账户入金:如果账户净值低于预定阈值,它将为交易账户补充余额。
    • 持续运行:通过将EA托管在虚拟服务器上,该系统可以 7x24 小时运行,并拥有几乎无限的资金管理能力。

    挑战与考量

    • 资金耗尽的风险:如果EA在没有持续盈利的情况下继续入金,储备资金可能会被耗尽。
    • 对稳健资金管理的需求:必须实施一个精密的资金管理系统,以便在触及特定的亏损或净值阈值时停止操作。

    在接下来的章节中,我们将深入探讨经纪商Deriv的API 特性,开发 Python 代码以实现与 API 的无缝交互,并将此解决方案与一个专为高效、可靠的资金管理而设计的 MQL5 智能交易系统集成。所有内容都将通过简单明了的、循序渐进的步骤进行呈现,以便于理解和实施。

    智能交易与券商 API 之间的基本双向流程

    MQL5 与券商之间的双向流程


    Deriv API

    Deriv.com是一家广受欢迎的经纪商,它支持 MetaTrader 5 并提供 API 接入以实现自动化操作。详细信息可以在Deriv API文档中找到。首先,请按照其网站上概述的步骤来注册并获取 API 访问权限。

    出于教学目的,您需要在Deriv API仪表板中创建一个应用程序。在此过程中,请选择一个模拟账户,并生成一个具有适当访问级别的 API 令牌。对于本演示,我建议选择“Trade API”(交易 API)访问级别,因为它允许执行为您的模拟账户资金入金等操作。除非您确信能够安全地管理,否则请避免选择“Admin Access”(管理员访问)级别,因为该级别授予您账户的完全控制权。请务必将您的 API 令牌保密并妥善保管,以防止未经授权的访问。

    一旦 API 令牌创建完成,接下来的步骤就涉及设置一个 Python WebSocket 客户端,并将其与 MQL5 集成,以开发一个能够管理账户操作的程序。

    关键操作

    我们希望通过程序实现的主要功能是:

    • 将资金从您的 Deriv 账户存入您的 Deriv MetaTrader 5 账户。
    • 与 Deriv API 进行交互,以实现无缝的资金管理。

    Deriv API 文档在“MT5 APIs”部分提供了执行这些操作的详细说明。在此过程中,您将获得两个关键值:

    • App ID(应用程序 ID):用于在 Deriv 平台上识别您的应用程序。
    • API Token(API 令牌):授予执行指定操作的权限。

    有了这些值,我们就可以继续开发 Python WebSocket 客户端,并将其与 MQL5 集成,以实现我们的资金管理系统。

    您与您的 API 安全

    安全是一个至关重要的话题,不容忽视。正如您保护手机免受未经授权的访问一样,保护您的 API 密钥不被他人获取也同样重要。API 令牌是您账户的网关,如果它落入网络犯罪分子手中,可能会使您容易受到恶意活动的攻击。他们可能会利用您的账户,在您不知情的情况下进行未经授权的操作。

    就 Deriv 而言,该平台提供了 API 令牌访问级别,允许您选择授予令牌的权限。强烈建议您使用模拟访问功能,除非绝对必要,否则不要选择“Admin Access”(管理员访问)。“Admin Access”级别授予您账户的完全控制权,如果落入不法分子手中,会带来巨大风险。

    此建议不仅限于 Deriv,它适用于任何服务的 API 令牌。始终将 API 密钥视为密码——保持私密,安全存储,并且绝不与任何您不信任的人分享。通过这样做,您可以最大限度地降低未经授权访问的风险,并确保您的账户受到保护。


    用于 Web Socket API 通信的 Python 库

    首先,我们的电脑上必须安装好Python才能继续进行这个项目。接下来,我们需要安装 Python 的 WebSocket 库,以实现与券商 API 的网络通信。Deriv API使用WebSocket进行高速通信,因此我们必须相应地设置好我们的电脑。以下是在 Windows 上使用命令提示符安装该 Python 库的命令。

    pip install websocket-client

     要安装该库,请在 Windows 上打开命令提示符并输入上述命令。安装完成后,你就可以开始运行和测试了。然而,在继续之前,我们将用接下来的几个步骤来开发那个用于处理 MetaTrader 5 和经纪商 API(以 Deriv 的 API为例)之间通信的 Python 脚本。


    用于桥接 MetaTrader 5 与券商 API 通信的 Python 脚本

    我已经概述了开发 Python 脚本的步骤。在我们继续创建资金管理器 EA 之前,让我们先深入构建这个程序。打开你的代码编辑器(推荐使用 Notepad++)并创建一个新文件。跟着我们一起开发这个脚本,我们将其命名为 deriv_api_handler.py。请务必记下你脚本的保存位置,因为在后续的 EA 代码中会用到它。

    1. 初始设置与配置

     首先,我们要导入必要的库,配置连接设置,并设置好与 MQL5 进行通信的文件路径。我们从导入核心库开始。我们知道,json库对于解析和生成 JSON 数据至关重要,因为这是通过WebSocket发送消息和处理命令时将要使用的数据格式。选择websocket库来处理与 Deriv API 的WebSocket连接,而time库则帮助程序在必要时在脚本中引入暂停。最后,os库允许程序与文件系统进行交互,例如检查命令文件。

    import json
    import websocket
    import time
    import os
    
    # Configuration
    API_URL = "wss://ws.binaryws.com/websockets/v3?app_id= Your app ID"   #Replace with your App ID created in Deriv API dashboard
    API_TOKEN = "Your API token"   #Replace with your actual token
    
    # File paths (Replace YourComputerName with the actual name of your computer)
    MQL5_TO_PYTHON = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/mql5_to_python.txt"
    PYTHON_TO_MQL5 = "C:/Users/YourComputerName/AppData/Roaming/MetaQuotes/Terminal/Common/Files/python_to_mql5.txt"
    
    • 接下来,我们定义我们的 API URL 和令牌,因为它们是授权我们的WebSocket连接到 Deriv 服务器所必需的密钥。这个 URL 指向 WebSocket的接入点,而 API 令牌则是我们向服务器证明身份的凭证。
    • 最后,我们指定用于与 MQL5 交互的文件路径。这些文件将作为我们的 Python 脚本和 MQL5 之间的桥梁,允许它们交换指令和响应。我们必须谨慎地选择那些确保 MQL5 和 Python 系统都能访问到的路径。

    2. WebSocket 连接

    在我们脚本的这部分代码中,我们将建立一个到 Deriv WebSocket API 的安全连接,并授权该脚本以发起请求。

    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连接。首先,我们尝试使用之前设置的 URL 连接到 API。我们通过ws.connect(API_URL) 发起连接,然后发送包含我们 API 令牌的授权消息。这对于向 Deriv 服务器验证我们脚本的身份是必需的。
    • 紧接着,脚本会监听来自服务器的响应。服务器将返回一个 JSON 对象,用以确认连接是否成功。如果响应中包含错误信息,脚本就知道是令牌无效或出现了其他问题。这种错误处理机制对于确保脚本能够优雅地失败至关重要。
    • 我们决定使用 try-except 代码块,以确保在连接或消息交换过程中出现问题时,脚本不会崩溃。这是一种安全措施,它使程序能够灵活地调试和处理问题,而不会中断整个流程。

    3. 命令处理

    在此阶段,程序会解释接收到的命令,并根据命令类型采取相应的操作。一旦成功连接并完成身份验证,脚本将处理来自 MQL5 的、以 JSON 字符串形式发送的命令,因此它将准备好解析和处理这些命令。
    • process_command 函数中,脚本首先尝试将命令解析为一个 Python 字典。这让它能够轻松访问命令的不同字段(如入金金额)。然后,它会检查解析后的 JSON 中的特定键(例如 “mt5_deposit”),该键会告诉脚本 MQL5 要求执行的是哪种操作。
    • 如果命令请求的是入金(“mt5_deposit”),则会调用一个单独的函数 mt5_deposit 来处理它。这种模块化的方法使脚本具有灵活性和可维护性,因为我们在未来可以轻松地添加其他命令类型。

    • 如果命令未知或格式不正确,它会返回一条错误消息,这有助于 MQL5 系统理解问题出在哪里。

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

    4. 入金操作

    本节将根据 MQL5 的请求执行入金操作,将所需数据发送到 Deriv API。我们创建了一个专门的函数(mt5_deposit)来执行入金。这使我们的代码结构清晰,并将处理入金的逻辑隔离开来,使其更易于维护或扩展。
    • 在此函数内部,会构建一个 JSON 消息,用于通知 Deriv 执行入金。此消息包含所有必要的详细信息,例如金额、来源账户和目标 MT5 账户。以正确的格式发送正确的数据,对于确保交易能够被成功处理至关重要。
    • 发送入金请求后,它会等待服务器的响应。一旦收到响应,就会将其解析为 JSON 并返回。这让 MQL5 系统能够知道操作是成功还是失败。
    • 代码中还处理了异常情况,以防在通信或入金操作过程中出现问题,确保能够捕获错误并将其报告回 MQL5。
    def mt5_deposit(amount, from_binary, to_mt5):
        """Performs a deposit operation to the MT5 account."""
        try:
            ws.send(json.dumps({
                "mt5_deposit": 1,
                "amount": amount,
                "from_binary": from_binary,
                "to_mt5": to_mt5
            }))
            response = ws.recv()
            return json.loads(response)
        except Exception as e:
            return {"error": f"Error during deposit operation: {e}"}
    

    5. 从MQL5中读取命令

    这是代码中的一个部分,用于检查来自 MQL5 的指令,如果存在指令就进行处理,并确保同一条指令不会被重复处理。为了从 MQL5 读取指令,它会检查文件mql5_to_python.txt是否存在。MQL5 就是在这个文件中写入需要处理的指令。如果该文件存在,脚本就会读取其内容。通过去除不必要的空白字符并检查 BOM(字节顺序标记),来确保无论格式是否存在不一致,数据都能被正确处理。
    • 一旦指令被读取,它就会被打印出来用于调试,以便验证内容是否按预期被成功检索。读取指令后,脚本会删除该文件,从而确保同一条指令将来不会被再次处理。
    • 如果文件不存在,它就返回 None,这表示没有指令需要处理。这有助于在没有可用指令时,避免进行不必要的检查。
    def read_command():
        """Reads a command from the MQL5 file and deletes the file after reading."""
        print(f"Checking for command file at: {MQL5_TO_PYTHON}")
        if os.path.exists(MQL5_TO_PYTHON):
            print(f"Command file found: {MQL5_TO_PYTHON}")
            with open(MQL5_TO_PYTHON, "r", encoding="utf-8") as file:
                command = file.read().strip()
            print(f"Raw Command read: {repr(command)}")
            
            # Strip potential BOM and whitespace
            if command.startswith("\ufeff"):
                command = command[1:]
            
            print(f"Processed Command: {repr(command)}")
            os.remove(MQL5_TO_PYTHON)  # Remove file after reading
            return command
        print(f"Command file not found at: {MQL5_TO_PYTHON}")
        return None
    


    6. 向 MQL5 写入响应

    这部分负责将响应发送回 MQL5,以便 MQL5 能根据我们的结果采取进一步的操作。在处理完一条指令并得到响应后,该响应会被发送回 MQL5。这是通过将响应写入到 python_to_mql5.txt 文件来完成的,MQL5 可以从该文件中读取响应。
    • 为确保响应格式正确,Python 字典会使用json.dumps()函数转换成一个 JSON 字符串。将这个 JSON 字符串写入文件,可以确保 MQL5 系统能够正确地解析该响应。
    • 这一步至关重要,因为它完成了 Python 和 MQL5 之间的通信闭环,使得 MQL5 能够知晓操作是成功还是失败,并采取相应的措施。
    def write_response(response):
        """Writes a response to the MQL5 file."""
        with open(PYTHON_TO_MQL5, "w", encoding="utf-8") as file:
            file.write(json.dumps(response))
    


    7. 主循环

    我们创建一个持续循环来读取和处理来自 MQL5 的指令,确保系统能够实时运行。主循环是脚本的“心脏”,所有功能都在这里汇集。在成功连接并授权 Deriv API 之后,脚本会进入一个循环,在其中持续检查是否有新的指令。系统会调用 read_command 函数来检查是否有新的指令需要处理。
    • 如果找到了指令,脚本就会处理它,并将结果写回 MQL5。如果指令文件不存在或发生错误,系统会通过打印错误信息并退出循环来优雅地处理。
    • 这个循环对于维持一个响应灵敏的系统至关重要。我们确保了脚本不会无休止地运行,或者在崩溃时不提供任何有用的反馈。通过实现 try-except 代码块,我们保护了循环免受意外错误的影响,并确保脚本不会崩溃,而是能够干净地退出。
    if __name__ == "__main__":
        if not connect_to_deriv():
            print("Failed to authorize. Exiting.")
            exit(1)
    
        print("Connected and authorized. Waiting for commands...")
        while True:
            try:
                command = read_command()
                if command:
                    print(f"Processing command: {command}")
                    response = process_command(command)
                    print(f"Response: {response}")
                    write_response(response)
                    print("Response written. Exiting loop.")
                    break  # Exit the loop after processing one command
                else:
                    print("No command file found. Exiting.")
                    break  # Exit the loop if the command file is not found
            except Exception as e:
                print(f"Error in main loop: {e}")
                break  # Exit the loop on unexpected error
    


    资金管理EA

    在此阶段,我们将继续探讨资金管理智能交易的开发过程。我们将设计这个 EA 来监控账户余额,并在余额低于指定阈值时提议进行入金操作。入金操作将通过我们之前开发的 Python 脚本来触发。虽然这个 EA 并不具备一个成熟交易智能交易的全部功能,但我们将重点介绍集成券商 API 交互的特定代码段。本次讨论旨在展示将券商 API 与任何 EA 集成的潜力。

    开发计划概览:

    该 EA 的关键组件之一是 ShellExecuteW 函数的实现,该函数将用于从 EA 代码内部启动 deriv_api_handler.py 脚本。该 EA 将监控当前账户余额,如果检测到余额低于定义的阈值,它将发出指令以发起一笔入金。

    通常,这类操作会在OnTimer()函数中处理,以便在长时间内进行周期性检查和自动化。然而,出于测试和即时反馈的目的,我选择将这些操作放在OnInit()函数中。这种方法可以确保在 EA 启动后立即对 API 进行测试。从长远来看,OnTimer()函数将更适合用于持续监控账户余额,并在需要时请求入金。 

    1. 基本信息与库导入

    本部分为智能交易设置元数据,并导入一个系统库以执行外部命令。来自shell32.dll库的ShellExecuteW函数用于运行像 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. 用于自定义的输入参数

    在此部分,可自定义的输入参数允许用户在不修改核心代码的情况下,将 EA 调整以满足其特定需求。这些参数包括:余额阈值、入金金额、资金转账的账户 ID,以及 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函数是 EA 的入口点。它首先使用AccountInfoDouble(ACCOUNT_BALANCE)获取当前账户的余额。如果余额低于指定的阈值,EA 将继续执行入金操作。

    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. 将入金命令写入文件

    EA 创建一个文件,用于与 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 脚本

    EA 使用 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 脚本后,EA 会检查是否存在一个响应文件。如果该文件存在,EA 会读取它以确认入金是否成功。响应文件必须包含一条成功消息,EA 才能据此进行后续操作。

    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. 完成初始化

    如果账户余额高于阈值,EA 将跳过入金流程。初始化成功结束,EA 随后进入其运行阶段。

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


    8. 反初始化 

    OnDeinit函数会在EA被移除或取消初始化时记录日志。 

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


    演示测试与结果

    我们在此处将讨论两项测试:

    1. 在命令提示符中测试 Python 脚本(deriv_api_handler.py)
    2. 测试资金管理EA

    让我们详细介绍:

    1. 测试 Python 脚本(deriv_api_handler.py)

    我使用一款名为 Notepad++ 的免费工具编写 Python 脚本。以下是一段动画演示,展示如何从该编辑器中直接启动命令提示符。这种方法很关键,因为它能确保命令提示符定位到包含该脚本的文件夹,便于直接从脚本所在位置执行脚本。

    从 Notepad++ 中启动命令提示符(cmd)

    从 Notepad++ 中启动命令提示符(cmd)

    命令提示符窗口打开后,你可以输入命令来执行脚本。目的是验证是否成功授权并能访问 Deriv API。

    在命令提示符中输入以下命令并按回车键:

    python deriv_api_handler.py

    使用默认 API 凭据的响应:

    对于缺少有效凭据的默认脚本,你会收到如下所示的响应。务必提供你的有效凭据(API 令牌和应用 ID),以建立正确的授权并确保功能正常运行。

    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. 退出。

    使用正确凭据的响应:

    在下面的结果片段中,我们使用了正确的凭据,成功建立了连接并完成了授权。然后,程序会检查公共文件夹中的mql5_to_python.txt文件,如下图所示。该文本文件包含了脚本需要处理并通过 WebSocket 连接转发的命令信息。API 返回了一个响应,在本示例中,我使用了随机的账户详情来保护我的真实凭据。您需要使用您自己的正确信息才能获得成功的结果。

    我们的目标已成功达成,因为我们收到了响应,并且生成了一个包含 API 响应的python_to_mql5.txt文件,该文件随后会将信息传回 MetaTrader 5。
    已连接并已授权。正在等待命令…
    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. 退出循环。


    2. 测试资金管理EA

    为了测试我们的EA,我们在 MetaTrader 5 中启动了它。如前所述,我们将其设计为在初始化期间尝试执行一次入金操作。由于我们使用的是一个本金为 10,000 的模拟账户,我将余额阈值设置为 100,000,以便在当前余额低于该值时触发入金尝试。下面是一张动态截图,展示了 EA 的启动过程,以及允许对这些数值进行自定义的输入设置。

    启动资金管理 EA

    启动资金管理 EA

    在 MetaTrader 5 的“工具箱”窗口的“智能交易”选项卡中,您可以查看由 EA 执行的所有操作的日志。下面您将看到所显示的日志结果。

    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"}
    

    上述结果展示了资金管理 EA、Python 脚本和 Deriv API 之间一次成功的交互。私下里,我已经使用这套设置成功执行了充值操作。然而,在本示例中,我们遇到了权限被拒绝”(Permission Denied)的错误,这是因为使用了随机的凭据,以保护我个人的 API 身份验证信息。

    结论

    我们已成功地将 MQL5 和 Python 集成,通过券商的 API 与其外部服务器进行交互。该解决方案解决了自动化交易过程中资金耗尽的挑战,尤其适用于托管在 VPS 上的账户。当账户余额低于设定阈值时,EA 会自动为账户充值。虽然我们的重点是 Deriv API,但类似的集成也可以与其他券商的 API 实现,其中许多 API 都提供高级功能和不同级别的访问权限。出于演示目的,我们使用一个空账户测试了该 EA,并通过 API 响应验证了其功能。您可以扩展此系统,以加入出金功能和其他高级特性。

    Deriv API 的应用程序很简单,主要用于管理与 EA 通信所需的 API 令牌。您可以进一步探索该 API,以解锁更多可能性。附件中是用于测试和扩展的 Python 脚本和资金管理 EA 文件。请随时在下面的评论区分享您的想法或提出问题,欢迎大家踊跃讨论。

    本文由MetaQuotes Ltd译自英文
    原文地址: https://www.mql5.com/en/articles/16012

    附加的文件 |
    最近评论 | 前往讨论 (6)
    Fernando Carreiro
    Fernando Carreiro | 17 1月 2025 在 13:54
    @Stanislav Korotky #: 目前,MT5 允许直接从导航器在常规图表上运行 Python 脚本。

    的确,您可以通过导航器 从终端启动 Python 脚本,但它们并非"在图表上 "运行。它们在外部运行,可以使用Python API,但不会以任何方式与MetaTrader 5 终端的图表或任何其他可视组件直接交互。

    Clemence Benjamin
    Clemence Benjamin | 19 1月 2025 在 14:21
    Fernando Carreiro #:

    您确实可以通过导航器 从终端启动 Python 脚本,但它们 不是 "在图表上 "运行。它们在外部运行,可以使用Python API,但不会以任何方式与MetaTrader 5 终端的图表或任何其他可视组件直接交互。

    我同意您的观点,尊敬的先生。

    Fernando Carreiro
    Fernando Carreiro | 19 1月 2025 在 14:34
    @Clemence Benjamin #: 我同意您的观点,尊敬的先生。

    但是,您为什么需要 "Python "接口来处理经纪商的 API 呢?

    如果经纪商不提供 MetaTrader 5,那么您可以使用 MQL5 直接与经纪商的 API 通信。根本不需要 Python 接口。

    MQL5 甚至有网络套接字,可以轻松实现网络套接字。您也可以轻松实现调用 REST API。如果需要,还可以使用 DLL 调用。

    更不用说 MQL5 比 Python 快得多。 从本质上讲,访问 API 无需使用 Python。

    Clemence Benjamin
    Clemence Benjamin | 19 1月 2025 在 19:58
    @Fernando Carreiro #:

    但是,为什么需要 "Python "接口来处理经纪人的 API 呢?

    如果经纪商不提供 MetaTrader 5,您可以使用 MQL5 直接与经纪商的 API 通信。根本不需要 Python 接口。

    MQL5 甚至有网络套接字,可以轻松实现网络套接字。您也可以轻松实现调用 REST API。如果需要,还可以使用 DLL 调用。

    更不用说 MQL5 比 Python 快得多。 从本质上讲,访问 API 无需使用 Python。

    是的,先生。我很欣赏您所强调的直接有效的方法--谢谢您!

    虽然我不一定会强调 Python 是一种迫切需要,但我相信这一切都归结于探索这些语言如何在主题上进行合作。

    在某些时候,整合的需求可能会自然而然地出现

    Herman Makmur
    Herman Makmur | 6 8月 2025 在 07:06

    大家好、

    我需要通过 MQL5 与 websocket connection.... 在 DERIV 上进行上涨/下跌交易。

    我发现https://www.mql5.com/zh/articles/10275 可以检索历史点数,但不能进行 CALL/PUT(下单)。

    有人能帮我吗?


    谢谢并致以问候、


    赫尔曼

    价格行为分析工具包开发(第八部分):指标看板 价格行为分析工具包开发(第八部分):指标看板
    作为价格行为分析领域最强大的工具之一,指标看板(Metrics Board)旨在通过一键操作简化市场分析流程,实时提供关键市场指标数据。每个功能按钮均对应特定的功能,无论是分析高/低趋势、交易量还是其他关键指标。该工具能在您最需要的时候提供精准、实时的数据。让我们通过本文更深入地了解它的功能。
    交易中的神经网络:多智代自适应模型(终篇) 交易中的神经网络:多智代自适应模型(终篇)
    在上一篇文章中,我们讲述了多智代自适应框架 MASA,它结合了强化学习方法和自适应策略,在动荡的市场条件下提供了盈利能力、及风险之间的和谐平衡。我们已在该框架内构建了单个智代的功能。在本文中,我们继续我们已开始的工作,令其得出合乎逻辑的结论。
    开发回放系统(第 75 部分):新 Chart Trade(二) 开发回放系统(第 75 部分):新 Chart Trade(二)
    在本文中,我们将讨论 C_ChartFloatingRAD 类。这就是 Chart Trade 发挥作用的原因。然而,解释并未就此结束,我们将在下一篇文章中完成它,因为这篇文章的内容相当广泛,需要深入理解。此处提供的内容仅用于教育目的。在任何情况下,除了学习和掌握所提出的概念外,都不应出于任何目的使用此应用程序。
    掌握 MQL5:从入门到精通(第六部分):开发 EA 交易的基础知识 掌握 MQL5:从入门到精通(第六部分):开发 EA 交易的基础知识
    本文继续针对初学者的系列文章。在这里我们将讨论开发 EA 交易的基本原则。我们将创建两个 EA:第一个 EA 不使用指标进行交易,使用挂单,第二个 EA 将基于标准 MA 指标,以当前价格开仓。在这里,我假设你不再是一个完全的初学者,并且对前几篇文章中的材料有相对较好的掌握。