云端部署方案落地
This commit is contained in:
+15
-1
@@ -2,7 +2,7 @@ using MtApi5;
|
||||
using System.Reflection;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
builder.WebHost.UseUrls("http://localhost:8080");
|
||||
builder.WebHost.UseUrls("http://0.0.0.0:8080");
|
||||
builder.Services.AddSingleton<MtApi5Client>(sp =>
|
||||
{
|
||||
var client = new MtApi5Client();
|
||||
@@ -30,6 +30,20 @@ builder.Services.AddSingleton<MtApi5Client>(sp =>
|
||||
builder.Services.AddHostedService<MtConnectionService>();
|
||||
var app = builder.Build();
|
||||
|
||||
// API Key 认证
|
||||
const string API_KEY = "UiHMqtaYLZzwBdcuS4RFmEGhgDO8N2eI";
|
||||
app.Use(async (context, next) =>
|
||||
{
|
||||
var key = context.Request.Headers["X-API-Key"].FirstOrDefault();
|
||||
if (key != API_KEY)
|
||||
{
|
||||
context.Response.StatusCode = 401;
|
||||
await context.Response.WriteAsync("Unauthorized");
|
||||
return;
|
||||
}
|
||||
await next();
|
||||
});
|
||||
|
||||
app.MapGet("/health", (MtApi5Client mt) =>
|
||||
{
|
||||
var connected = mt.ConnectionState == Mt5ConnectionState.Connected;
|
||||
|
||||
+431
-300
@@ -1,15 +1,17 @@
|
||||
# Mt5Bridge — MT5 HTTP API 网关
|
||||
|
||||
通过 HTTP REST 接口操控 MetaTrader 5,零依赖、可独立部署。
|
||||
通过 HTTP REST API 操控 MetaTrader 5,可部署在 Windows 云服务器上 7×24 运行。
|
||||
|
||||
---
|
||||
|
||||
## 架构
|
||||
|
||||
```
|
||||
任何语言的项目 (Rust / Python / Node / Go / ...)
|
||||
任意语言 (Python / Rust / Node / Go / ...)
|
||||
│
|
||||
▼ HTTP REST API (localhost:8080)
|
||||
▼ HTTP REST API (带 API Key 认证)
|
||||
│
|
||||
Mt5Bridge (C# + MtApi5)
|
||||
Mt5Bridge (C# + MtApi5) ← 通过端口映射暴露到公网
|
||||
│
|
||||
▼ localhost:8228
|
||||
MtApi5 EA (MT5 图表上运行)
|
||||
@@ -18,43 +20,179 @@
|
||||
MetaTrader 5 客户端
|
||||
```
|
||||
|
||||
## 快速开始
|
||||
---
|
||||
|
||||
### 前置条件
|
||||
## 前置条件
|
||||
|
||||
| 依赖 | 说明 |
|
||||
| ------------------- | ------------------------------------------------------- |
|
||||
| .NET 8 SDK | 编译运行 |
|
||||
| MetaTrader 5 客户端 | 已登录任意账户 |
|
||||
| MtApi5 EA | 挂载在 MT5 任意图表上,默认监听端口 8228 |
|
||||
| MtApi5 已安装 | `C:\Program Files\MtApi5\`(本项目 `libs/` 下已有 DLL) |
|
||||
| 依赖 | 说明 |
|
||||
|------|------|
|
||||
| .NET 8 SDK | 本地编译(只需编译一次) |
|
||||
| .NET 8 ASP.NET Core Runtime | 部署目标主机上安装 |
|
||||
| MetaTrader 5 客户端 | 已登录任意账户 |
|
||||
| MtApi5 EA | 挂载在 MT5 任意图表上,默认监听端口 8228 |
|
||||
| MtApi5 安装包 | 安装后生成 `MT5Connector.dll` 等依赖 |
|
||||
|
||||
### 启动
|
||||
---
|
||||
|
||||
```bash
|
||||
## 一、本地编译
|
||||
|
||||
```powershell
|
||||
cd Mt5Bridge
|
||||
dotnet run
|
||||
dotnet build -c Debug
|
||||
```
|
||||
|
||||
看到以下输出即启动成功:
|
||||
编译产物在 `bin\Debug\net8.0\`,包含以下文件:
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `Mt5Bridge.exe` | 可执行入口 |
|
||||
| `Mt5Bridge.dll` | 编译后的主程序 |
|
||||
| `Mt5Bridge.runtimeconfig.json` | .NET 运行时配置 |
|
||||
| `Mt5Bridge.deps.json` | 依赖描述 |
|
||||
| `MtApi5.dll` | C# 端 MT5 通信库 |
|
||||
| `MtClient.dll` | MT5 客户端通信库 |
|
||||
| `Newtonsoft.Json.dll` | JSON 序列化 |
|
||||
|
||||
---
|
||||
|
||||
## 二、部署到目标主机
|
||||
|
||||
### 1. 安装 .NET 8 Runtime
|
||||
|
||||
下载 .NET 8 ASP.NET Core Runtime(Windows x64):https://dotnet.microsoft.com/en-us/download/dotnet/8.0
|
||||
|
||||
如果是下载 SDK 压缩包,解压后将内容复制到 `C:\Program Files\dotnet\`:
|
||||
|
||||
```powershell
|
||||
Copy-Item -Path "解压目录\*" -Destination "C:\Program Files\dotnet\" -Recurse -Force
|
||||
```
|
||||
|
||||
验证安装:
|
||||
|
||||
```powershell
|
||||
dotnet --list-runtimes
|
||||
```
|
||||
|
||||
应看到 `Microsoft.NETCore.App 8.0.x` 和 `Microsoft.AspNetCore.App 8.0.x`。
|
||||
|
||||
### 2. 部署文件
|
||||
|
||||
将 `bin\Debug\net8.0\` 整个文件夹复制到目标主机,例如 `C:\Mt5Bridge\`。
|
||||
|
||||
### 3. 安装 MtApi5
|
||||
|
||||
在目标主机上运行 MtApi5 安装包(MSI),这会安装 `MT5Connector.dll` 等系统级依赖。
|
||||
|
||||
### 4. 挂载 EA
|
||||
|
||||
将 `MtApi5.ex5` 复制到 MT5 的 `MQL5\Experts\` 目录,在 MT5 任意图表上挂载运行。
|
||||
|
||||
### 5. 启动验证
|
||||
|
||||
```powershell
|
||||
cd C:\Mt5Bridge
|
||||
dotnet Mt5Bridge.dll
|
||||
```
|
||||
|
||||
看到以下输出即成功:
|
||||
|
||||
```
|
||||
info: MtConnectionService[0]
|
||||
Connecting to MT5 via MtApi5 on port 8228...
|
||||
info: MtConnectionService[0]
|
||||
MT5 Connection: Connected
|
||||
info: MtConnectionService[0]
|
||||
MT5 Bridge ready on http://localhost:8080
|
||||
CommandTimeout set to 120000ms
|
||||
Connecting to MT5 via MtApi5 on port 8228...
|
||||
MT5 Connection: Connected
|
||||
MT5 Bridge ready on http://localhost:8080
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、配置 API Key
|
||||
|
||||
编辑 [Program.cs](Program.cs),修改第 34 行的 API Key:
|
||||
|
||||
```csharp
|
||||
const string API_KEY = "你的随机密码";
|
||||
```
|
||||
|
||||
生成随机密码:
|
||||
|
||||
```powershell
|
||||
-join ((48..57) + (65..90) + (97..122) | Get-Random -Count 32 | %{[char]$_})
|
||||
```
|
||||
|
||||
修改后重新编译,将新的 `Mt5Bridge.dll` 覆盖到目标主机。
|
||||
|
||||
---
|
||||
|
||||
## 四、端口映射(公网访问)
|
||||
|
||||
### 云服务商端口映射
|
||||
|
||||
在云服务商控制台配置端口映射,例如:
|
||||
|
||||
| 字段 | 值 |
|
||||
|------|-----|
|
||||
| 类型 | TCP |
|
||||
| 公网端口 | 13485 |
|
||||
| 内网端口 | 8080 |
|
||||
| 说明 | Mt5Bridge |
|
||||
|
||||
### Windows 防火墙
|
||||
|
||||
如果云服务商不自动放通,手动添加防火墙规则:
|
||||
|
||||
```powershell
|
||||
New-NetFirewallRule -Name "Mt5Bridge" -DisplayName "Mt5Bridge 8080" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 五、注册为后台服务(开机自启)
|
||||
|
||||
使用 Windows 任务计划程序,让 Bridge 开机自动启动、崩溃自动重启。
|
||||
|
||||
### 安装
|
||||
|
||||
```powershell
|
||||
$action = New-ScheduledTaskAction -Execute "C:\Program Files\dotnet\dotnet.exe" -Argument "Mt5Bridge.dll" -WorkingDirectory "C:\Mt5Bridge"
|
||||
$trigger = New-ScheduledTaskTrigger -AtStartup
|
||||
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1)
|
||||
Register-ScheduledTask -TaskName "Mt5Bridge" -Action $action -Trigger $trigger -Settings $settings
|
||||
Start-ScheduledTask -TaskName "Mt5Bridge"
|
||||
```
|
||||
|
||||
### 管理命令
|
||||
|
||||
```powershell
|
||||
# 查看状态
|
||||
Get-ScheduledTask -TaskName "Mt5Bridge" | Get-ScheduledTaskInfo
|
||||
|
||||
# 停止
|
||||
Stop-ScheduledTask -TaskName "Mt5Bridge"
|
||||
|
||||
# 重启
|
||||
Start-ScheduledTask -TaskName "Mt5Bridge"
|
||||
|
||||
# 删除
|
||||
Unregister-ScheduledTask -TaskName "Mt5Bridge" -Confirm:$false
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、API 接口
|
||||
|
||||
所有接口均需在 Header 中携带 API Key:
|
||||
|
||||
```
|
||||
X-API-Key: 你的密码
|
||||
```
|
||||
|
||||
### 健康检查
|
||||
|
||||
```bash
|
||||
curl http://localhost:8080/health
|
||||
```
|
||||
GET /health
|
||||
```
|
||||
|
||||
响应示例:
|
||||
|
||||
**响应示例:**
|
||||
```json
|
||||
{
|
||||
"status": "healthy",
|
||||
@@ -64,350 +202,343 @@ curl http://localhost:8080/health
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
### 账户信息
|
||||
|
||||
## API 接口
|
||||
|
||||
### 账户
|
||||
|
||||
#### `GET /health`
|
||||
|
||||
健康检查,返回 MT5 连接状态。
|
||||
|
||||
#### `GET /account`
|
||||
|
||||
获取当前账户信息。
|
||||
```
|
||||
GET /account
|
||||
```
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ------------- | ------ | ---------------- |
|
||||
| login | number | 账户号 |
|
||||
| leverage | number | 杠杆 |
|
||||
| balance | number | 余额 |
|
||||
| equity | number | 净值 |
|
||||
| profit | number | 浮动盈亏 |
|
||||
| margin | number | 已用保证金 |
|
||||
| margin_free | number | 可用保证金 |
|
||||
| margin_level | number | 保证金比例 |
|
||||
| currency | string | 账户币种 |
|
||||
| server | string | 服务器名 |
|
||||
| name | string | 账户名称 |
|
||||
| company | string | 经纪商 |
|
||||
| trade_allowed | bool | 是否允许交易 |
|
||||
| trade_expert | bool | 是否允许 EA 交易 |
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| login | number | 账户号 |
|
||||
| leverage | number | 杠杆 |
|
||||
| balance | number | 余额 |
|
||||
| equity | number | 净值 |
|
||||
| profit | number | 浮动盈亏 |
|
||||
| margin | number | 已用保证金 |
|
||||
| margin_free | number | 可用保证金 |
|
||||
| margin_level | number | 保证金比例 |
|
||||
| currency | string | 账户币种 |
|
||||
| server | string | 服务器名 |
|
||||
| name | string | 账户名称 |
|
||||
| company | string | 经纪商 |
|
||||
| trade_allowed | bool | 是否允许交易 |
|
||||
| trade_expert | bool | 是否允许 EA 交易 |
|
||||
|
||||
---
|
||||
### 品种信息
|
||||
|
||||
### 品种
|
||||
```
|
||||
GET /symbols/{symbol}
|
||||
```
|
||||
|
||||
#### `GET /symbols/{symbol}`
|
||||
|
||||
获取品种详细信息。
|
||||
|
||||
**示例:** `GET /symbols/XAUUSDc`
|
||||
**示例:** `/symbols/XAUUSDc`
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ------------------- | ------ | ------------ |
|
||||
| name | string | 品种名 |
|
||||
| description | string | 描述 |
|
||||
| digits | int | 小数位数 |
|
||||
| point | double | 点值 |
|
||||
| spread | int | 点差 |
|
||||
| spread_float | bool | 是否浮动点差 |
|
||||
| bid | double | 卖价 |
|
||||
| ask | double | 买价 |
|
||||
| volume_min | double | 最小手数 |
|
||||
| volume_max | double | 最大手数 |
|
||||
| volume_step | double | 手数步长 |
|
||||
| trade_contract_size | double | 合约大小 |
|
||||
| currency_base | string | 基础货币 |
|
||||
| currency_profit | string | 盈亏货币 |
|
||||
| category | string | 品种路径 |
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| name | string | 品种名称 |
|
||||
| description | string | 描述 |
|
||||
| digits | number | 小数位数 |
|
||||
| point | number | 点值 |
|
||||
| bid | number | 卖价 |
|
||||
| ask | number | 买价 |
|
||||
| spread | number | 点差 |
|
||||
| spread_float | bool | 是否浮动点差 |
|
||||
| volume_min | number | 最小手数 |
|
||||
| volume_max | number | 最大手数 |
|
||||
| volume_step | number | 手数步长 |
|
||||
| trade_contract_size | number | 合约大小 |
|
||||
| currency_base | string | 基础货币 |
|
||||
| currency_profit | string | 利润货币 |
|
||||
| category | string | 分类路径 |
|
||||
|
||||
#### `GET /symbols/{symbol}/tick`
|
||||
### 实时 Tick
|
||||
|
||||
获取品种最新报价。
|
||||
```
|
||||
GET /symbols/{symbol}/tick
|
||||
```
|
||||
|
||||
**示例:** `/symbols/XAUUSDc/tick`
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ----------- | ------ | ------------------- |
|
||||
| time | string | 报价时间 (ISO 8601) |
|
||||
| bid | double | 卖价 |
|
||||
| ask | double | 买价 |
|
||||
| last | double | 最新成交价 |
|
||||
| volume | double | 成交量 |
|
||||
| volume_real | double | 真实成交量 |
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| time | string | 时间 |
|
||||
| bid | number | 卖价 |
|
||||
| ask | number | 买价 |
|
||||
| last | number | 最新成交价 |
|
||||
| volume | number | 成交量 |
|
||||
| time_msc | string | 毫秒级时间 |
|
||||
| volume_real | number | 真实成交量 |
|
||||
|
||||
---
|
||||
### 历史 K 线
|
||||
|
||||
### 行情数据
|
||||
```
|
||||
GET /rates/from-pos?symbol={symbol}&timeframe={timeframe}&start_pos={start}&count={count}
|
||||
```
|
||||
|
||||
#### `GET /rates/from-pos`
|
||||
**参数说明:**
|
||||
|
||||
从指定位置获取历史 K 线。
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| symbol | 品种名称 |
|
||||
| timeframe | 周期:`TIMEFRAME_M1` / `M5` / `M15` / `M30` / `H1` / `H4` / `D1` |
|
||||
| start_pos | 起始位置(0=最新) |
|
||||
| count | 获取数量 |
|
||||
|
||||
**参数:**
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
| --------- | ------ | ----------------------- |
|
||||
| symbol | string | 品种名 |
|
||||
| timeframe | string | 周期,如 `TIMEFRAME_M5` |
|
||||
| start_pos | int | 起始位置(0 为最新) |
|
||||
| count | int | 获取数量 |
|
||||
|
||||
**支持的周期:**
|
||||
|
||||
| 值 | 含义 |
|
||||
| --------------- | ------- |
|
||||
| `TIMEFRAME_M1` | 1 分钟 |
|
||||
| `TIMEFRAME_M5` | 5 分钟 |
|
||||
| `TIMEFRAME_M15` | 15 分钟 |
|
||||
| `TIMEFRAME_M30` | 30 分钟 |
|
||||
| `TIMEFRAME_H1` | 1 小时 |
|
||||
| `TIMEFRAME_H4` | 4 小时 |
|
||||
| `TIMEFRAME_D1` | 日线 |
|
||||
|
||||
**响应:** 每根 K 线包含 `time`, `open`, `high`, `low`, `close`, `tick_volume`, `spread`, `real_volume`。
|
||||
|
||||
> 单次请求最大 50000 根,内部自动分批(每批 1000 根)。
|
||||
|
||||
---
|
||||
|
||||
### 持仓
|
||||
|
||||
#### `GET /positions`
|
||||
|
||||
获取当前所有持仓。
|
||||
**示例:** `/rates/from-pos?symbol=XAUUSDc&timeframe=TIMEFRAME_H1&start_pos=0&count=100`
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ------------- | ------ | ------------- |
|
||||
| ticket | number | 持仓号 |
|
||||
| symbol | string | 品种 |
|
||||
| type | int | 0=Buy, 1=Sell |
|
||||
| volume | double | 手数 |
|
||||
| price_open | double | 开仓价 |
|
||||
| sl | double | 止损 |
|
||||
| tp | double | 止盈 |
|
||||
| price_current | double | 当前价 |
|
||||
| swap | double | 库存费 |
|
||||
| profit | double | 浮动盈亏 |
|
||||
| comment | string | 注释 |
|
||||
| magic | number | Magic Number |
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| time | string | 开盘时间 |
|
||||
| open | number | 开盘价 |
|
||||
| high | number | 最高价 |
|
||||
| low | number | 最低价 |
|
||||
| close | number | 收盘价 |
|
||||
| tick_volume | number | Tick 成交量 |
|
||||
| spread | number | 点差 |
|
||||
| real_volume | number | 真实成交量 |
|
||||
|
||||
---
|
||||
### 当前持仓
|
||||
|
||||
```
|
||||
GET /positions
|
||||
```
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| ticket | number | 持仓编号 |
|
||||
| symbol | string | 品种 |
|
||||
| type | number | 类型(0=买, 1=卖) |
|
||||
| volume | number | 手数 |
|
||||
| price_open | number | 开仓价 |
|
||||
| sl | number | 止损价 |
|
||||
| tp | number | 止盈价 |
|
||||
| price_current | number | 当前价 |
|
||||
| swap | number | 隔夜息 |
|
||||
| profit | number | 盈亏 |
|
||||
| comment | string | 注释 |
|
||||
| magic | number | Magic Number |
|
||||
|
||||
### 挂单
|
||||
|
||||
#### `GET /orders?symbol={symbol}`
|
||||
```
|
||||
GET /orders?symbol={symbol}
|
||||
```
|
||||
|
||||
获取挂单列表。可选参数 `symbol` 过滤品种。
|
||||
symbol 为可选参数,不传则返回所有挂单。
|
||||
|
||||
**响应字段:**
|
||||
### 订单预检
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| -------------- | ------ | ------------ |
|
||||
| ticket | number | 订单号 |
|
||||
| symbol | string | 品种 |
|
||||
| type | int | 订单类型 |
|
||||
| volume_initial | double | 原始手数 |
|
||||
| price_open | double | 挂单价 |
|
||||
| sl | double | 止损 |
|
||||
| tp | double | 止盈 |
|
||||
| magic | number | Magic Number |
|
||||
| comment | string | 注释 |
|
||||
|
||||
---
|
||||
|
||||
### 交易
|
||||
|
||||
#### `POST /order/check`
|
||||
|
||||
校验订单参数(不实际下单),检查保证金是否足够。
|
||||
```
|
||||
POST /order/check
|
||||
```
|
||||
|
||||
**请求体:**
|
||||
|
||||
```json
|
||||
{
|
||||
"action": 1,
|
||||
"symbol": "XAUUSDc",
|
||||
"volume": 0.01,
|
||||
"order_type": 0,
|
||||
"price": 4170.50,
|
||||
"sl": 4168.00,
|
||||
"tp": 4175.00,
|
||||
"magic": 12345,
|
||||
"comment": "test"
|
||||
"price": 4180.0,
|
||||
"sl": 4170.0,
|
||||
"tp": 4190.0,
|
||||
"magic": 123456,
|
||||
"comment": "test",
|
||||
"deviation": 10
|
||||
}
|
||||
```
|
||||
|
||||
**action 取值:**
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| action | number | 交易操作类型 |
|
||||
| symbol | string | 品种 |
|
||||
| volume | number | 手数 |
|
||||
| order_type | number | 订单类型 |
|
||||
| price | number | 价格 |
|
||||
| sl | number | 止损 |
|
||||
| tp | number | 止盈 |
|
||||
| magic | number | Magic Number |
|
||||
| comment | string | 注释 |
|
||||
| deviation | number | 偏差 |
|
||||
|
||||
| 值 | 含义 |
|
||||
| ---- | -------- |
|
||||
| 1 | 市价单 |
|
||||
| 6 | 限价挂单 |
|
||||
### 下单
|
||||
|
||||
**order_type 取值:**
|
||||
|
||||
| 值 | 含义 |
|
||||
| ---- | ---------- |
|
||||
| 0 | Buy |
|
||||
| 1 | Sell |
|
||||
| 2 | Buy Limit |
|
||||
| 3 | Sell Limit |
|
||||
| 4 | Buy Stop |
|
||||
| 5 | Sell Stop |
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ----------- | ------ | ------------------ |
|
||||
| retcode | uint | 返回码,0 表示成功 |
|
||||
| balance | double | 模拟下单后余额 |
|
||||
| equity | double | 净值 |
|
||||
| margin | double | 所需保证金 |
|
||||
| margin_free | double | 可用保证金 |
|
||||
| comment | string | 错误描述 |
|
||||
|
||||
#### `POST /order/send`
|
||||
|
||||
实际下单/改单/平仓。
|
||||
|
||||
**请求体(嵌套结构):**
|
||||
```
|
||||
POST /order/send
|
||||
```
|
||||
|
||||
**请求体:**
|
||||
```json
|
||||
{
|
||||
"request": {
|
||||
"action": 6,
|
||||
"action": 1,
|
||||
"symbol": "XAUUSDc",
|
||||
"volume": 0.01,
|
||||
"order_type": 2,
|
||||
"price": 4165.00,
|
||||
"sl": 4160.00,
|
||||
"tp": 4175.00,
|
||||
"magic": 12345,
|
||||
"comment": "my_bot",
|
||||
"order": 0,
|
||||
"position": 0,
|
||||
"order_type": 0,
|
||||
"price": 4180.0,
|
||||
"sl": 4170.0,
|
||||
"tp": 4190.0,
|
||||
"magic": 123456,
|
||||
"comment": "test",
|
||||
"deviation": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**字段说明:**
|
||||
### 历史成交
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ---------- | ------ | -------------------------- |
|
||||
| action | uint | 参考上表 |
|
||||
| symbol | string | 品种 |
|
||||
| volume | double | 手数 |
|
||||
| order_type | uint | 订单类型 |
|
||||
| price | double | 价格(市价单可不填) |
|
||||
| sl | double | 止损价 |
|
||||
| tp | double | 止盈价 |
|
||||
| magic | ulong | 自定义标识 |
|
||||
| comment | string | 注释 |
|
||||
| order | ulong | 要修改的订单号(改单时用) |
|
||||
| position | ulong | 要平仓的持仓号(平仓时用) |
|
||||
| deviation | ulong | 最大滑点 |
|
||||
```
|
||||
GET /history/deals?date_from={from}&date_to={to}&symbol={symbol}
|
||||
```
|
||||
|
||||
**修改订单:** 设置 `order` 为目标订单号,只需传要修改的字段。
|
||||
|
||||
**平仓:** 设置 `position` 为持仓号,`action=1`,`order_type` 与持仓方向相反。
|
||||
|
||||
**响应字段:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ------- | ------ | ------------------------ |
|
||||
| retcode | uint | 返回码,`10009` 表示成功 |
|
||||
| order | ulong | 成交/挂单号 |
|
||||
| comment | string | 服务器返回信息 |
|
||||
**示例:** `/history/deals?date_from=2026-07-01&date_to=2026-07-03&symbol=XAUUSDc`
|
||||
|
||||
---
|
||||
|
||||
### 历史记录
|
||||
## 七、调用示例
|
||||
|
||||
#### `GET /history/deals`
|
||||
### PowerShell
|
||||
|
||||
查询历史成交记录。
|
||||
```powershell
|
||||
# 健康检查
|
||||
Invoke-RestMethod -Uri "http://IP:端口/health" -Headers @{"X-API-Key"="你的密码"}
|
||||
|
||||
**参数:**
|
||||
# 账户信息
|
||||
Invoke-RestMethod -Uri "http://IP:端口/account" -Headers @{"X-API-Key"="你的密码"}
|
||||
|
||||
| 参数 | 类型 | 说明 |
|
||||
| --------- | ------ | --------------------- |
|
||||
| date_from | string | 起始日期 `yyyy-MM-dd` |
|
||||
| date_to | string | 结束日期 `yyyy-MM-dd` |
|
||||
| symbol | string | 可选,过滤品种 |
|
||||
# 实时行情
|
||||
Invoke-RestMethod -Uri "http://IP:端口/symbols/XAUUSDc/tick" -Headers @{"X-API-Key"="你的密码"}
|
||||
|
||||
**响应字段:**
|
||||
# 获取 100 根 H1 K 线
|
||||
Invoke-RestMethod -Uri "http://IP:端口/rates/from-pos?symbol=XAUUSDc&timeframe=TIMEFRAME_H1&start_pos=0&count=100" -Headers @{"X-API-Key"="你的密码"}
|
||||
```
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
| ---------- | ------ | ------------ |
|
||||
| ticket | number | 成交号 |
|
||||
| time | string | 成交时间 |
|
||||
| entry | int | 0=In, 1=Out |
|
||||
| magic | number | Magic Number |
|
||||
| volume | double | 手数 |
|
||||
| price | double | 成交价 |
|
||||
| profit | double | 盈亏 |
|
||||
| commission | double | 佣金 |
|
||||
| swap | double | 库存费 |
|
||||
| symbol | string | 品种 |
|
||||
| comment | string | 注释 |
|
||||
### Python
|
||||
|
||||
```python
|
||||
import requests
|
||||
|
||||
BRIDGE = "http://IP:端口"
|
||||
HEADERS = {"X-API-Key": "你的密码"}
|
||||
|
||||
# 健康检查
|
||||
resp = requests.get(f"{BRIDGE}/health", headers=HEADERS)
|
||||
print(resp.json())
|
||||
|
||||
# 账户信息
|
||||
resp = requests.get(f"{BRIDGE}/account", headers=HEADERS)
|
||||
print(resp.json())
|
||||
|
||||
# 实时行情
|
||||
resp = requests.get(f"{BRIDGE}/symbols/XAUUSDc/tick", headers=HEADERS)
|
||||
tick = resp.json()
|
||||
print(f"Bid: {tick['data'][0]['bid']}, Ask: {tick['data'][0]['ask']}")
|
||||
|
||||
# 获取 K 线
|
||||
resp = requests.get(f"{BRIDGE}/rates/from-pos", headers=HEADERS, params={
|
||||
"symbol": "XAUUSDc",
|
||||
"timeframe": "TIMEFRAME_H1",
|
||||
"start_pos": 0,
|
||||
"count": 100
|
||||
})
|
||||
print(resp.json())
|
||||
|
||||
# 下单
|
||||
resp = requests.post(f"{BRIDGE}/order/send", headers=HEADERS, json={
|
||||
"request": {
|
||||
"action": 1,
|
||||
"symbol": "XAUUSDc",
|
||||
"volume": 0.01,
|
||||
"order_type": 0,
|
||||
"price": 4180.0,
|
||||
"sl": 4170.0,
|
||||
"tp": 4190.0,
|
||||
"magic": 123456,
|
||||
"comment": "test",
|
||||
"deviation": 10
|
||||
}
|
||||
})
|
||||
print(resp.json())
|
||||
```
|
||||
|
||||
### curl
|
||||
|
||||
```bash
|
||||
# 健康检查
|
||||
curl -H "X-API-Key: 你的密码" http://IP:端口/health
|
||||
|
||||
# 账户信息
|
||||
curl -H "X-API-Key: 你的密码" http://IP:端口/account
|
||||
|
||||
# 下单
|
||||
curl -X POST http://IP:端口/order/send \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "X-API-Key: 你的密码" \
|
||||
-d '{"request":{"action":1,"symbol":"XAUUSDc","volume":0.01,"order_type":0,"price":4180.0,"sl":4170.0,"tp":4190.0,"magic":123456,"comment":"test","deviation":10}}'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 项目结构
|
||||
## 八、迁移到新主机
|
||||
|
||||
```
|
||||
Mt5Bridge/
|
||||
├── Program.cs # 全部代码(单文件 ASP.NET Core)
|
||||
├── Mt5Bridge.csproj # 项目文件
|
||||
├── libs/ # MtApi5 依赖 DLL
|
||||
│ ├── MtApi5.dll
|
||||
│ ├── MtClient.dll
|
||||
│ └── Newtonsoft.Json.dll
|
||||
└── README.md
|
||||
### 需要复制的内容
|
||||
|
||||
| 从哪里 | 复制什么 | 放到哪里 |
|
||||
|--------|---------|---------|
|
||||
| 本地 `bin\Debug\net8.0\` | 整个文件夹 | 新主机 `C:\Mt5Bridge\` |
|
||||
| MtApi5 安装包 | 运行 MSI 安装 | 新主机 |
|
||||
| MtApi5 项目 | `MtApi5.ex5` | 新主机 MT5 的 `MQL5\Experts\` |
|
||||
|
||||
### 新主机操作步骤
|
||||
|
||||
1. 安装 .NET 8 ASP.NET Core Runtime
|
||||
2. 运行 MtApi5 MSI 安装包
|
||||
3. 复制 `bin\Debug\net8.0\` 到 `C:\Mt5Bridge\`
|
||||
4. 复制 `MtApi5.ex5` 到 MT5 Experts 目录
|
||||
5. 在 MT5 图表上挂载 MtApi5 EA
|
||||
6. 配置云服务商端口映射(如需要外网访问)
|
||||
7. 配置 Windows 防火墙
|
||||
8. 注册任务计划程序实现开机自启
|
||||
9. 验证:`Invoke-RestMethod -Uri "http://localhost:8080/health" -Headers @{"X-API-Key"="密码"}`
|
||||
|
||||
---
|
||||
|
||||
## 九、常用维护命令
|
||||
|
||||
```powershell
|
||||
# 查看 Bridge 是否在运行
|
||||
Get-ScheduledTask -TaskName "Mt5Bridge" | Get-ScheduledTaskInfo
|
||||
|
||||
# 查看是否在监听端口
|
||||
netstat -ano | findstr 8080
|
||||
|
||||
# 查看 .NET 运行时版本
|
||||
dotnet --list-runtimes
|
||||
|
||||
# 手动启动 Bridge(前台调试)
|
||||
cd C:\Mt5Bridge
|
||||
dotnet Mt5Bridge.dll
|
||||
|
||||
# 杀死 Bridge 进程
|
||||
Stop-ScheduledTask -TaskName "Mt5Bridge"
|
||||
```
|
||||
|
||||
## 部署到其他机器
|
||||
---
|
||||
|
||||
1. 拷贝整个 `Mt5Bridge/` 文件夹
|
||||
2. 确保目标机器安装了 .NET 8 SDK
|
||||
3. 确保 MT5 客户端已登录 + MtApi5 EA 挂载在图表上
|
||||
4. `dotnet run` 即可启动
|
||||
|
||||
## 修改端口
|
||||
|
||||
编辑 `Program.cs` 第 5 行:
|
||||
|
||||
```csharp
|
||||
builder.WebHost.UseUrls("http://localhost:8080");
|
||||
```
|
||||
|
||||
将 `8080` 改为其他端口即可。
|
||||
|
||||
## 连接超时
|
||||
|
||||
当前 CommandTimeout 设为 120 秒(通过反射设置),适用于请求大量历史 K 线的场景。如需调整,修改 `Program.cs` 第 14 行即可。
|
||||
|
||||
## 常见问题
|
||||
|
||||
**Q: 启动后一直显示 "Connecting..."?**
|
||||
|
||||
A: 确保 MT5 已打开并登录,且 MtApi5 EA 已挂载在任意图表上。EA 默认监听 8228 端口。
|
||||
|
||||
**Q: 请求返回 500 错误?**
|
||||
|
||||
A: 查看 Bridge 控制台输出的错误日志,常见原因:品种名不存在、MT5 断连、数据量过大超时。
|
||||
|
||||
**Q: 能用在其他语言的项目中吗?**
|
||||
|
||||
A: 可以。Bridge 是标准 HTTP REST API,任何语言的 HTTP 客户端都能调用。详见上方 API 文档。
|
||||
## 十、安全建议
|
||||
|
||||
1. **API Key 必须修改**:部署前把默认的 `mt5bridge-2024-secret-key` 改成随机字符串
|
||||
2. **端口号不要用默认的**:使用 13485-13489 范围内的随机端口
|
||||
3. **防火墙白名单**:如果只有固定 IP 访问,在云服务商安全组里限制来源 IP
|
||||
4. **不要用 HTTP 明文传输敏感数据**:可配合 Nginx Proxy Manager 加 HTTPS
|
||||
5. **定期更换 API Key**:修改 `Program.cs` 中的 Key 后重新编译部署
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -13,7 +13,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Mt5Bridge")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+4fcaca631b5248ef99a4298f2c4b6aad64db78f3")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+279385d8fc1eedefb38ed10aca22ab8ff3708014")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Mt5Bridge")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Mt5Bridge")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
@@ -1 +1 @@
|
||||
33186613575b28ec79f4f05d1201256e888df42aa2ca8bfeae92d758f37c4c84
|
||||
4235236514da1df525d2d1220aead15991cbafc6db41ab379c545a99c2487020
|
||||
|
||||
@@ -9,11 +9,11 @@ build_property.EnforceExtendedAnalyzerRules =
|
||||
build_property._SupportedPlatformList = Linux,macOS,Windows
|
||||
build_property.RootNamespace = Mt5Bridge
|
||||
build_property.RootNamespace = Mt5Bridge
|
||||
build_property.ProjectDir = C:\Users\Administrator\Desktop\ares\Mt5Bridge\
|
||||
build_property.ProjectDir = C:\Users\Administrator\Desktop\Mt5Bridge\
|
||||
build_property.EnableComHosting =
|
||||
build_property.EnableGeneratedComInterfaceComImportInterop =
|
||||
build_property.RazorLangVersion = 8.0
|
||||
build_property.SupportLocalizedComponentNames =
|
||||
build_property.GenerateRazorMetadataSourceChecksumAttributes =
|
||||
build_property.MSBuildProjectDirectory = C:\Users\Administrator\Desktop\ares\Mt5Bridge
|
||||
build_property.MSBuildProjectDirectory = C:\Users\Administrator\Desktop\Mt5Bridge
|
||||
build_property._RazorSourceGeneratorDebug =
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
24217677bf38b3110e8f08546d3dc4465f97487641f8f2dc6cd22a663bb79f21
|
||||
e4a3bf35146236aef5bb528777d38d0e2ac57b458c987684a599a9692351687b
|
||||
|
||||
@@ -26,3 +26,31 @@ C:\Users\Administrator\Desktop\ares\Mt5Bridge\obj\Debug\net8.0\refint\Mt5Bridge.
|
||||
C:\Users\Administrator\Desktop\ares\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.pdb
|
||||
C:\Users\Administrator\Desktop\ares\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.genruntimeconfig.cache
|
||||
C:\Users\Administrator\Desktop\ares\Mt5Bridge\obj\Debug\net8.0\ref\Mt5Bridge.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\Mt5Bridge.exe
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\Mt5Bridge.deps.json
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\Mt5Bridge.runtimeconfig.json
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\Mt5Bridge.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\Mt5Bridge.pdb
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\MtApi5.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\MtClient.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\bin\Debug\net8.0\Newtonsoft.Json.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.csproj.AssemblyReference.cache
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.GeneratedMSBuildEditorConfig.editorconfig
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.AssemblyInfoInputs.cache
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.AssemblyInfo.cs
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.csproj.CoreCompileInputs.cache
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.MvcApplicationPartsAssemblyInfo.cache
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets.build.json
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets.development.json
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets\msbuild.Mt5Bridge.Microsoft.AspNetCore.StaticWebAssets.props
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets\msbuild.build.Mt5Bridge.props
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets\msbuild.buildMultiTargeting.Mt5Bridge.props
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets\msbuild.buildTransitive.Mt5Bridge.props
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\staticwebassets.pack.json
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\scopedcss\bundle\Mt5Bridge.styles.css
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.csproj.Up2Date
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\refint\Mt5Bridge.dll
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.pdb
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\Mt5Bridge.genruntimeconfig.cache
|
||||
C:\Users\Administrator\Desktop\Mt5Bridge\obj\Debug\net8.0\ref\Mt5Bridge.dll
|
||||
|
||||
Binary file not shown.
@@ -1 +1 @@
|
||||
d1ebbd23b71aef41cd0fc60ac0cb097334a2e9c856ee1cb44e91c163c704c5fc
|
||||
553e1529407b4931cc01fed3b677a250cf906214d6ce2c116197797f05fc988d
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"format": 1,
|
||||
"restore": {
|
||||
"C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj": {}
|
||||
"C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj": {}
|
||||
},
|
||||
"projects": {
|
||||
"C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj": {
|
||||
"C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectUniqueName": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectName": "Mt5Bridge",
|
||||
"projectPath": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectPath": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"packagesPath": "C:\\Users\\Administrator\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\obj\\",
|
||||
"outputPath": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\Administrator\\AppData\\Roaming\\NuGet\\NuGet.Config"
|
||||
|
||||
@@ -13,11 +13,11 @@
|
||||
"project": {
|
||||
"version": "1.0.0",
|
||||
"restore": {
|
||||
"projectUniqueName": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectUniqueName": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectName": "Mt5Bridge",
|
||||
"projectPath": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectPath": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"packagesPath": "C:\\Users\\Administrator\\.nuget\\packages\\",
|
||||
"outputPath": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\obj\\",
|
||||
"outputPath": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\obj\\",
|
||||
"projectStyle": "PackageReference",
|
||||
"configFilePaths": [
|
||||
"C:\\Users\\Administrator\\AppData\\Roaming\\NuGet\\NuGet.Config"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"version": 2,
|
||||
"dgSpecHash": "8pDiazJllfw=",
|
||||
"dgSpecHash": "A5kXayphZIY=",
|
||||
"success": true,
|
||||
"projectFilePath": "C:\\Users\\Administrator\\Desktop\\ares\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"projectFilePath": "C:\\Users\\Administrator\\Desktop\\Mt5Bridge\\Mt5Bridge.csproj",
|
||||
"expectedPackageFiles": [],
|
||||
"logs": []
|
||||
}
|
||||
Reference in New Issue
Block a user