深入 MtApi 的 RPC 协议:一条 JSON 命令如何在 C 与 MQL 之间往返
深入 MtApi 的 RPC 协议一条 JSON 命令如何在 C# 与 MQL 之间往返【免费下载链接】mtapiMetaTrader API (terminal bridge)项目地址: https://gitcode.com/gh_mirrors/mt/mtapiMtApi是一个 MetaTrader 终端桥接框架terminal bridge它的核心是一条轻量RPC 协议你的 C# 代码把方法调用序列化成JSON经 WebSocket 送达 MetaTrader 终端里运行的 MQL 专家顾问EAMQL 端执行真实交易函数后再用 JSON 把结果原路送回。本文带你完整拆解这条 JSON 命令的往返之旅——从 C# 序列化、分号分隔的消息信封、WebSocket 传输到 MQL 端的 JSON 解析与响应配对。⚡ 一句话总结信封用分号分隔的轻量文本载荷才是 JSON。理解了这一点MtApi 整个协议就通了。一、先看全局C# 到 MQL 的四层桥梁MtApi 并不是直接连接 MT 服务器而是在终端外挂了一个桥分层如下层项目语言/产物职责① 用户层MtApi5C# (.dll)业务 APIBuy/Sell/CopyRates…② 通信层MtClientC# (.dll)WebSocket RPC 客户端③ 服务层MtServiceC (.dll)服务端转发消息④ 桥接层MT5ConnectorC (.dll)导出 C 风格接口给 MQL 调用⑤ 终端层mtapi/MtApi5.mq5MQL5 EA真正执行 MQL 函数消息流向是双向的命令C# → MQL走请求-响应模式事件行情、新 K 线等MQL → C#走推送模式。本文聚焦前者。二、拆解 RPC 协议分号分隔的消息信封2.1 消息类型只有 7 种协议最外层是一个整数消息类型C# 与 C 两端枚举完全一致这是跨语言协议正确性的关键// C# 端定义MtClient/MtMessage.cs#L3-L12 internal enum MessageType { Command 0, Response 1, Event 2, ExpertList 3, ExpertAdded 4, ExpertRemoved 5, ServiceRequest 6 }C 服务端在 mtapi/MtService/MtMessage.h 中有镜像定义分隔符统一为分号MtMessage.h。2.2 线格式wire format长什么样所有消息序列化后都是一行纯文本消息类型;消息体消息体内部再用;分隔字段。以一条Command类型 0为例0;{专家句柄};{命令ID};{命令类型};{JSON载荷}即 mtapi/MtClient/MtMessage.cs 中MtCommand.GetMessageBody()拼出的ExpertHandle;CommandId;CommandType;Payload。而Response类型 1只有三个字段1;{专家句柄};{命令ID};{JSON载荷}MtMessage.cs。一个真实感示例C# 端调用Buy()买 EURUSD线上飞过的字节大致是0;0;42;25;{Volume:0.1,Price:0,Sl:0,Tp:0,Symbol:EURUSD}0→ Command 消息0→ 专家顾问句柄ExpertHandle42→ 自增命令 ID用于配对响应25→ 命令类型Buy 在 mtapi/MtApi5/MtProtocol/Mt5CommandType.cs 中的编号尾部 → 真正的JSON 命令载荷三、一条 JSON 命令的完整往返之旅3.1 出发C# 端序列化 JSON以 mtapi/MtApi5/MtApi5Client.cs 的Buy()为例它把参数塞进字典交给私有方法SendCommandTDictionarystring, object cmdParams new() { { Volume, volume }, { Price, price }, { Sl, sl }, { Tp, tp } }; if (symbol ! null) cmdParams[Symbol] symbol; var response SendCommandFuncResultMqlTradeResult(ExecutorHandle, Mt5CommandType.Buy, cmdParams);SendCommandT的三步MtApi5Client.csJsonConvert.SerializeObject(payload)—— 参数字典 → JSON 字符串交给 mtapi/MtClient/MtRpcClient.cs 的SendCommand()取一个自增commandId登记一个CommandTask再阻塞等待响应默认10 秒超时MtRpcClient的独立发送线程DoWrite()把消息Serialize()后按 ASCII 字节写入 WebSocketMtRpcClient.cs。3.2 中途C 服务端只做搬运工MtServiceC收到文本后按;切开识别出Command用 mtapi/MtService/MtMessage.h 的MtCommand::Parse还原字段再经 mtapi/MT5Connector/MT5Connector.cpp 导出的 C 风格接口转给 MQL 端getCommandType(expertHandle, res, err)—— MQL 端来取命令类型getPayload(expertHandle, res, err)—— MQL 端来取JSON 载荷注意方向是 MQL 在拉取不是 C 在推。3.3 落地MQL 端的轮询与 JSON 解析mtapi/mq5/MtApi5.mq5 中EA 用OnTimer()高频轮询executeCommand()调getCommandType()取命令类型取不到就返回 0 休眠用_executors.TryGetValue(commandType, wrapper)在类型 → 执行器映射表中找到对应函数wrapper.Execute()内部先解析 JSON。EA 内置了一个完整的 JSON 解析器 mtapi/mq5/json.mqh配合一组宏MtApi5.mq5让取值极其简洁string Execute_SymbolInfoDouble() { GET_JSON_PAYLOAD(jo); // 解析出 JSON 载荷 GET_STRING_JSON_VALUE(jo, Symbol, symbol); // 取字符串字段 GET_INT_JSON_VALUE(jo, PropId, prop_id); // 取整型字段 // ...调用 MQL 函数并返回 }GET_*宏会自动检查必填字段缺失时直接返回错误 JSON——参数校验发生在执行之前。3.4 回程JSON 响应 commandId 配对执行器把结果包装成统一信封C# 端对应 mtapi/MtApi5/MtProtocol/Response.cs{ErrorCode:0, ErrorMessage:null, Value: { RetVal:true, Result:{...} }}MQL 调sendResponse(ExpertHandle, response)MtApi5.mq5把 JSON 塞进1;句柄;命令ID;JSON信封原路返回。C# 的接收线程DoReceive()拆包、按commandId查表CommandTask.SetResponse()唤醒那个阻塞在SendCommand里的调用线程——命令 ID 就是请求-响应的回执号这让同一连接上的命令可以任意交错、乱序返回MtRpcClient.cs。最后SendCommandT反序列化ResponseTErrorCode ! 0就抛ExecutionException否则把Value还给你的Buy()。 往返闭环。四、反向通道事件如何从 MQL 推到 C#除了请求-响应协议还有一条推送通道MQL 端用sendEventMT5Connector.cpp发出类型2Event的消息格式为2;{专家句柄};{事件类型};{JSON载荷}。C# 端在 mtapi/MtClient/MtRpcClient.cs 中将其分发为MtEventReceived事件最终变成你在 C# 里订阅的QuoteUpdate、NewBar等回调。也就是说行情推送和 JSON 命令走的是同一条 WebSocket、同一套信封协议。五、这套协议设计的三个聪明之处信封轻、载荷结构化外壳只有几个整数 分号跨 C# / C / MQL 三端解析成本极低复杂数据全部交给 JSON两端都有成熟解析器Newtonsoft json.mqh。枚举双端镜像MessageType、Mt5CommandType在 mtapi/MtApi5/MtProtocol/Mt5CommandType.cs 与 MQL 端严格对应新增 API 只需同步加枚举值 新执行器。命令 ID 配对 超时兜底commandId解耦了发送与接收线程10 秒WaitResponse让终端卡死变成一次可捕获的异常而不是永久挂起。六、源码导航快速上手这套协议想看什么去哪里消息信封与序列化C#mtapi/MtClient/MtMessage.csWebSocket 收发线程mtapi/MtClient/MtRpcClient.cs消息信封与解析Cmtapi/MtService/MtMessage.hMQL↔C 导出接口mtapi/MT5Connector/MT5Connector.cppMQL 端命令轮询执行mtapi/mq5/MtApi5.mq5MQL 端 JSON 取值宏mtapi/mq5/MtApi5.mq5C# 端 JSON 发送核心mtapi/MtApi5/MtApi5Client.cs统一响应结构mtapi/MtApi5/MtProtocol/Response.cs如果你想动手验证可以从 mtapi/Examples/Python/Python_to_MT5/main.py 或 MATLAB 示例 mtapi/Examples/MatLab/AdvancedExample/run.m 入手它们都建立在同一套 RPC 协议之上。读懂上面这条 JSON 命令的来路与归途你就掌握了 MtApi 协议的全部骨架。【免费下载链接】mtapiMetaTrader API (terminal bridge)项目地址: https://gitcode.com/gh_mirrors/mt/mtapi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

基于RNN与可微分渲染的智能矢量草图生成框架解析

基于RNN与可微分渲染的智能矢量草图生成框架解析

1. 项目概述:从像素到矢量的智能草图生成在数字艺术和设计领域,将脑海中的创意快速、精准地转化为干净的矢量线稿,一直是一个核心且富有挑战性的环节。无论是工业设计的概念草图、动画制作的角色线稿,还是建筑设计的平面图&#x…

2026/8/26 12:30:08 阅读更多 →
Maka Agent Ask User Question功能详解:AI如何与你就关键决策确认

Maka Agent Ask User Question功能详解:AI如何与你就关键决策确认

Maka Agent Ask User Question功能详解:AI如何与你就关键决策确认 【免费下载链接】maka Apache Maka (Incubating) is a local-first AI agent workspace. Model messages, tool calls, tool results, permission decisions, and termination events are recorded …

2026/8/26 11:58:10 阅读更多 →
SpreadCheetah 高级功能大全:图片、批注、合并单元格与数据验证

SpreadCheetah 高级功能大全:图片、批注、合并单元格与数据验证

SpreadCheetah 高级功能大全:图片、批注、合并单元格与数据验证 【免费下载链接】spreadcheetah SpreadCheetah is a high-performance .NET library for generating spreadsheet (Microsoft Excel XLSX) files. 项目地址: https://gitcode.com/gh_mirrors/sp/spr…

2026/8/26 11:59:03 阅读更多 →

最新新闻

基于单片机的太阳能杀虫系统

基于单片机的太阳能杀虫系统

资源下载地址:https://download.csdn.net/download/sheziqiong/85881842 资源下载地址:https://download.csdn.net/download/sheziqiong/85881842 【摘 要】随着蔬菜水果种植业的发展,一些新的害虫也迅速出现,严重影响蔬菜水果的…

2026/8/26 13:35:05 阅读更多 →
python读取PDF、word文件及jieba分词,词云分析(Jupyter)

python读取PDF、word文件及jieba分词,词云分析(Jupyter)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/8/26 13:35:05 阅读更多 →
云Agent选型与落地指南:从托管到自托管的全流程实践

云Agent选型与落地指南:从托管到自托管的全流程实践

这次我们看一个来自 Hacker News 的话题:“Ask HN: What cloud agents do you use?”,也就是“你平时实际在用的云 Agent 有哪些”。话题看起来很闲聊,背后其实是一类工具的真实选型问题:大家都把 AI 智能体放到远程沙箱里&#…

2026/8/26 13:35:05 阅读更多 →
Monorepo工程化:减少Diff、构建优化与协作框架实践

Monorepo工程化:减少Diff、构建优化与协作框架实践

做后端开发这些年,我见过太多团队在同一个泥坑里反复挣扎:微服务拆了一地,仓库建了几十个,每次跨服务改需求都要提好几个 PR,等 Review 等到下班;换个分支切来切去,合并冲突能磨掉半天。于是很多…

2026/8/26 13:35:05 阅读更多 →
从零开发Canvas三角形游戏:用原生JavaScript实现完整游戏循环与碰撞检测

从零开发Canvas三角形游戏:用原生JavaScript实现完整游戏循环与碰撞检测

这次我们来看一个非常典型的游戏开发入门项目:The Triangle Game, from Zero。项目名字很直白,意思就是从零开始,把最高潮的部分都砍掉,不依赖任何游戏引擎,只用一个 HTML 文件,用 Canvas 和原生 JavaScrip…

2026/8/26 13:35:04 阅读更多 →
AI建站工具落地页生成:从设计Token到Schema的底层逻辑

AI建站工具落地页生成:从设计Token到Schema的底层逻辑

打开任何一个AI建站工具的官网,输入一句“帮我做一个面向健身私教的落地页”,几秒钟后你确实会拿到一个像模像样的页面。但真正做过项目的人都知道,这种感觉往往只持续到点击“导出代码”那一刻:样式不对、文案重复、结构改不动、…

2026/8/26 13:34:02 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →