diff --git a/Program.cs b/Program.cs index 20409df..251e3ad 100644 --- a/Program.cs +++ b/Program.cs @@ -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(sp => { var client = new MtApi5Client(); @@ -30,6 +30,20 @@ builder.Services.AddSingleton(sp => builder.Services.AddHostedService(); 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; diff --git a/README.md.md b/README.md.md index 5e8def0..1f900ef 100644 --- a/README.md.md +++ b/README.md.md @@ -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 后重新编译部署 \ No newline at end of file diff --git a/bin/Debug/net8.0/Mt5Bridge.dll b/bin/Debug/net8.0/Mt5Bridge.dll index 1f3ac7d..0cd8ecf 100644 Binary files a/bin/Debug/net8.0/Mt5Bridge.dll and b/bin/Debug/net8.0/Mt5Bridge.dll differ diff --git a/bin/Debug/net8.0/Mt5Bridge.exe b/bin/Debug/net8.0/Mt5Bridge.exe index 07fe1d2..9b91761 100644 Binary files a/bin/Debug/net8.0/Mt5Bridge.exe and b/bin/Debug/net8.0/Mt5Bridge.exe differ diff --git a/bin/Debug/net8.0/Mt5Bridge.pdb b/bin/Debug/net8.0/Mt5Bridge.pdb index 9baf395..9b05231 100644 Binary files a/bin/Debug/net8.0/Mt5Bridge.pdb and b/bin/Debug/net8.0/Mt5Bridge.pdb differ diff --git a/obj/Debug/net8.0/Mt5Bridge.AssemblyInfo.cs b/obj/Debug/net8.0/Mt5Bridge.AssemblyInfo.cs index c28ad46..633a100 100644 --- a/obj/Debug/net8.0/Mt5Bridge.AssemblyInfo.cs +++ b/obj/Debug/net8.0/Mt5Bridge.AssemblyInfo.cs @@ -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")] diff --git a/obj/Debug/net8.0/Mt5Bridge.AssemblyInfoInputs.cache b/obj/Debug/net8.0/Mt5Bridge.AssemblyInfoInputs.cache index 47d6fc9..3892643 100644 --- a/obj/Debug/net8.0/Mt5Bridge.AssemblyInfoInputs.cache +++ b/obj/Debug/net8.0/Mt5Bridge.AssemblyInfoInputs.cache @@ -1 +1 @@ -33186613575b28ec79f4f05d1201256e888df42aa2ca8bfeae92d758f37c4c84 +4235236514da1df525d2d1220aead15991cbafc6db41ab379c545a99c2487020 diff --git a/obj/Debug/net8.0/Mt5Bridge.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net8.0/Mt5Bridge.GeneratedMSBuildEditorConfig.editorconfig index 83e5c6e..e846451 100644 --- a/obj/Debug/net8.0/Mt5Bridge.GeneratedMSBuildEditorConfig.editorconfig +++ b/obj/Debug/net8.0/Mt5Bridge.GeneratedMSBuildEditorConfig.editorconfig @@ -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 = diff --git a/obj/Debug/net8.0/Mt5Bridge.assets.cache b/obj/Debug/net8.0/Mt5Bridge.assets.cache index c55d72d..0ebc8ad 100644 Binary files a/obj/Debug/net8.0/Mt5Bridge.assets.cache and b/obj/Debug/net8.0/Mt5Bridge.assets.cache differ diff --git a/obj/Debug/net8.0/Mt5Bridge.csproj.AssemblyReference.cache b/obj/Debug/net8.0/Mt5Bridge.csproj.AssemblyReference.cache index adc239f..d62b2a8 100644 Binary files a/obj/Debug/net8.0/Mt5Bridge.csproj.AssemblyReference.cache and b/obj/Debug/net8.0/Mt5Bridge.csproj.AssemblyReference.cache differ diff --git a/obj/Debug/net8.0/Mt5Bridge.csproj.CoreCompileInputs.cache b/obj/Debug/net8.0/Mt5Bridge.csproj.CoreCompileInputs.cache index 626a4dd..de21020 100644 --- a/obj/Debug/net8.0/Mt5Bridge.csproj.CoreCompileInputs.cache +++ b/obj/Debug/net8.0/Mt5Bridge.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -24217677bf38b3110e8f08546d3dc4465f97487641f8f2dc6cd22a663bb79f21 +e4a3bf35146236aef5bb528777d38d0e2ac57b458c987684a599a9692351687b diff --git a/obj/Debug/net8.0/Mt5Bridge.csproj.FileListAbsolute.txt b/obj/Debug/net8.0/Mt5Bridge.csproj.FileListAbsolute.txt index 0906da1..869d32c 100644 --- a/obj/Debug/net8.0/Mt5Bridge.csproj.FileListAbsolute.txt +++ b/obj/Debug/net8.0/Mt5Bridge.csproj.FileListAbsolute.txt @@ -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 diff --git a/obj/Debug/net8.0/Mt5Bridge.dll b/obj/Debug/net8.0/Mt5Bridge.dll index 1f3ac7d..0cd8ecf 100644 Binary files a/obj/Debug/net8.0/Mt5Bridge.dll and b/obj/Debug/net8.0/Mt5Bridge.dll differ diff --git a/obj/Debug/net8.0/Mt5Bridge.genruntimeconfig.cache b/obj/Debug/net8.0/Mt5Bridge.genruntimeconfig.cache index b0d1370..c936662 100644 --- a/obj/Debug/net8.0/Mt5Bridge.genruntimeconfig.cache +++ b/obj/Debug/net8.0/Mt5Bridge.genruntimeconfig.cache @@ -1 +1 @@ -d1ebbd23b71aef41cd0fc60ac0cb097334a2e9c856ee1cb44e91c163c704c5fc +553e1529407b4931cc01fed3b677a250cf906214d6ce2c116197797f05fc988d diff --git a/obj/Debug/net8.0/Mt5Bridge.pdb b/obj/Debug/net8.0/Mt5Bridge.pdb index 9baf395..9b05231 100644 Binary files a/obj/Debug/net8.0/Mt5Bridge.pdb and b/obj/Debug/net8.0/Mt5Bridge.pdb differ diff --git a/obj/Debug/net8.0/apphost.exe b/obj/Debug/net8.0/apphost.exe index 07fe1d2..9b91761 100644 Binary files a/obj/Debug/net8.0/apphost.exe and b/obj/Debug/net8.0/apphost.exe differ diff --git a/obj/Debug/net8.0/ref/Mt5Bridge.dll b/obj/Debug/net8.0/ref/Mt5Bridge.dll index 3a0e9ac..519f3cb 100644 Binary files a/obj/Debug/net8.0/ref/Mt5Bridge.dll and b/obj/Debug/net8.0/ref/Mt5Bridge.dll differ diff --git a/obj/Debug/net8.0/refint/Mt5Bridge.dll b/obj/Debug/net8.0/refint/Mt5Bridge.dll index 3a0e9ac..519f3cb 100644 Binary files a/obj/Debug/net8.0/refint/Mt5Bridge.dll and b/obj/Debug/net8.0/refint/Mt5Bridge.dll differ diff --git a/obj/Mt5Bridge.csproj.nuget.dgspec.json b/obj/Mt5Bridge.csproj.nuget.dgspec.json index bfd94a3..337b88b 100644 --- a/obj/Mt5Bridge.csproj.nuget.dgspec.json +++ b/obj/Mt5Bridge.csproj.nuget.dgspec.json @@ -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" diff --git a/obj/project.assets.json b/obj/project.assets.json index 51edec3..26ecb14 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -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" diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index efe1280..75a67e4 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -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": [] } \ No newline at end of file