{"id":"cdd63e98-d66e-4026-9bf7-dd6fe32b5a7c","entityType":"agent","slug":"clawhub-apuba-mt4-trader","name":"Mt4 Trader","canonicalUrl":"https://www.xpersona.co/agent/clawhub-apuba-mt4-trader","canonicalPath":"/agent/clawhub-apuba-mt4-trader","generatedAt":"2026-10-11T03:54:58.360Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T00:21:25.734Z","emptyReason":null},"description":"MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies. Skill: Mt4 Trader Owner: apuba Summary: MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies. Tags: automated-trading:1.0.7, forex:1.0.7, grid:1.0.7, latest:1.2.1, mt4:1.0.7, python:1.0.7, trading:1.0.7 Version history: v1.2.1 | 2026-05-12T17:46:26.544Z | user v1.86: restore full SKILL.md v1.2.0 | 2026-05-12T15:5","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.2K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s170awvgg1xj09qps70x185k9h863qvh:mt4-trader","sourceUrl":"https://clawhub.ai/apuba/mt4-trader","homepage":"https://clawhub.ai/apuba/skills/mt4-trader","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/apuba/mt4-trader","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/apuba/skills/mt4-trader","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies. "},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T00:21:25.734Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T00:21:25.734Z","emptyReason":null},"stars":null,"forks":null,"downloads":1221,"packageName":null,"latestVersion":"1.2.1","tractionLabel":"1.2K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T00:21:25.639Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T00:21:25.734Z","lastCrawledAt":"2026-10-11T00:21:25.639Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T00:21:25.639Z","lastVerifiedAt":null,"highlights":[{"version":"1.2.1","createdAt":"2026-05-12T17:46:26.544Z","changelog":"v1.86: restore full SKILL.md","fileCount":11,"zipByteSize":26753},{"version":"1.2.0","createdAt":"2026-05-12T15:51:29.868Z","changelog":"v1.86: chart object operations (clear_chart_objects/draw_hline/clear_hline)","fileCount":10,"zipByteSize":18348},{"version":"1.1.12","createdAt":"2026-05-08T14:35:13.453Z","changelog":"英文 Communication & Feedback 同步更新：添加老码农备注、Gitee 主页链接","fileCount":10,"zipByteSize":32942},{"version":"1.1.11","createdAt":"2026-05-08T14:19:53.926Z","changelog":"添加英文 Communication & Feedback 联系方式同步","fileCount":10,"zipByteSize":33366},{"version":"1.1.10","createdAt":"2026-05-08T14:07:01.179Z","changelog":"微信二维码改为 Gitee CDN URL 直接显示图片","fileCount":10,"zipByteSize":32841},{"version":"1.1.9","createdAt":"2026-05-08T13:54:51.651Z","changelog":"用户手动还原正确版本","fileCount":10,"zipByteSize":32500},{"version":"1.1.8","createdAt":"2026-05-08T13:46:21.915Z","changelog":"恢复中英双语 SKILL.md，修复编码损坏问题","fileCount":10,"zipByteSize":30626},{"version":"1.1.7","createdAt":"2026-05-08T13:06:24.906Z","changelog":"从 Gitee 仓库还原中英双语版 SKILL.md","fileCount":10,"zipByteSize":30516}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s170awvgg1xj09qps70x185k9h863qvh:mt4-trader","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T03:54:58.357Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-apuba-mt4-trader/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T00:21:25.734Z","emptyReason":null},"readme":"Skill: Mt4 Trader\n\nOwner: apuba\n\nSummary: MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies.\n\nTags: automated-trading:1.0.7, forex:1.0.7, grid:1.0.7, latest:1.2.1, mt4:1.0.7, python:1.0.7, trading:1.0.7\n\nVersion history:\n\nv1.2.1 | 2026-05-12T17:46:26.544Z | user\n\nv1.86: restore full SKILL.md\n\nv1.2.0 | 2026-05-12T15:51:29.868Z | user\n\nv1.86: chart object operations (clear_chart_objects/draw_hline/clear_hline)\n\nv1.1.12 | 2026-05-08T14:35:13.453Z | user\n\n英文 Communication & Feedback 同步更新：添加老码农备注、Gitee 主页链接\n\nv1.1.11 | 2026-05-08T14:19:53.926Z | user\n\n添加英文 Communication & Feedback 联系方式同步\n\nv1.1.10 | 2026-05-08T14:07:01.179Z | user\n\n微信二维码改为 Gitee CDN URL 直接显示图片\n\nv1.1.9 | 2026-05-08T13:54:51.651Z | user\n\n用户手动还原正确版本\n\nv1.1.8 | 2026-05-08T13:46:21.915Z | user\n\n恢复中英双语 SKILL.md，修复编码损坏问题\n\nv1.1.7 | 2026-05-08T13:06:24.906Z | user\n\n从 Gitee 仓库还原中英双语版 SKILL.md\n\nv1.1.6 | 2026-05-08T12:52:29.830Z | user\n\nfull rewrite - fix all garbled characters, clean UTF-8\n\nv1.1.5 | 2026-05-08T12:48:50.150Z | user\n\nfix garbled char, image link only (clawhub cannot render images)\n\nv1.1.4 | 2026-05-08T12:45:42.984Z | user\n\nuse text link for qr code (clawhub does not package image files)\n\nv1.1.3 | 2026-05-08T12:44:57.865Z | user\n\nmove qr code to assets folder for proper packaging\n\nv1.1.2 | 2026-05-08T12:36:53.993Z | user\n\nfix qr code image display - use relative path inside skill package\n\nv1.1.1 | 2026-05-08T12:28:24.149Z | user\n\n修复微信二维码图片显示（使用Gitee外链）\n\nv1.1.0 | 2026-05-08T12:20:16.151Z | user\n\n添加交流群二维码（微信：老码农）\n\nv1.0.10 | 2026-05-04T20:50:23.890Z | user\n\n搜索展示名称改为中文为主\n\nv1.0.9 | 2026-05-04T20:44:36.651Z | user\n\nSKILL.md 新增完整英文说明（下半段），中英双语版本\n\nv1.0.8 | 2026-05-04T20:28:57.406Z | user\n\nmt4_bridge.ex4 v1.85: 新增 get_klines 命令，支持通过 CopyRates 实时获取 H1/M15 等周期 K 线数据\n\nv1.0.7 | 2026-05-04T17:07:49.148Z | auto\n\n**重大变更：移除自动脚本下载，.ex4 文件需手动下载并部署。**\n\n- 用户现在需手动从 Gitee 仓库下载 mt4_bridge.ex4、芝麻网格V2.ex4、tools2.3.ex4 文件，放入 mql4 目录。\n- deploy_ex4.py 脚本不再自动下载 .ex4，改为显示下载指引和手动安装步骤。\n- 安装文档（SKILL.md）已全面更新，明确说明手动下载与部署流程，降低自动化依赖。\n- 其它功能和用法保持不变，Python 客户端接口未调整。\n\nv1.0.6 | 2026-05-04T16:49:20.464Z | auto\n\n**重大变更：.ex4 EA 文件从本地内嵌改为自动从 Gitee 下载，优化升级网格策略支持。**\n\n- EA 安装方式变更，`deploy_ex4.py` 现在自动从 Gitee 下载 .ex4 文件，无需解压内嵌压缩包。\n- 支持新版网格策略 EA，芝麻网格 EA 升级为 V2，说明文档同步更新。\n- 文件结构和部署流程优化，更清晰区分 .ex4 目的目录和下载说明。\n- SKILL.md 安装说明全面调整，删除“内嵌 EX4/ZIP”，新增 Gitee 下载指引。\n- 提升未来维护和更新便捷性，便于后续版本通过 Gitee 定向升级 EA。\n\nv1.0.5 | 2026-05-04T15:22:38.524Z | user\n\nex4文件因ClawHub安全过滤改为内嵌在deploy_ex4.py中，运行脚本自动解压部署\n\nv1.0.4 | 2026-05-04T15:19:52.496Z | user\n\nex4文件因ClawHub安全过滤改为zip打包，SKILL.md更新解压部署说明\n\nv1.0.3 | 2026-05-04T14:58:58.790Z | user\n\n大幅补充 SKILL.md 部署说明和 api_docs.md 完整文档（57+ 方法）\n\nv1.0.2 | 2026-05-04T14:40:41.123Z | user\n\n标题改为中文，便于中文用户搜索\n\nv1.0.1 | 2026-05-04T13:59:46.751Z | user\n\n新增SEO关键词标签，提升搜索曝光\n\nv1.0.0 | 2026-05-04T13:49:25.902Z | user\n\n初始发布：MT4交易桥，支持通用交易/网格策略/辅助工具，含Python客户端\n\nArchive index:\n\nArchive v1.2.1: 11 files, 26753 bytes\n\nFiles: references/api_docs.md (927b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (24851b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), skill-card.md (2588b), SKILL.md (21029b), _meta.json (129b)\n\nFile v1.2.1:SKILL.md\n\n# MT4 智能交易桥 · 量化自动交易系统\r\n\r\nMT4 智能交易桥。通过文件 I/O 与 MT4 EA 通信，无需 DLL 或额外依赖。支持 OpenClaw（小龙虾 AI Agent）通过微信 / 飞书 / Telegram 等渠道直接操作 MT4 交易。\r\n\r\n> **关键词**：MT4, MetaTrader 4, 外汇交易, Python交易, 算法交易, 自动交易, 网格策略, 支撑压力位, ATR止损, 移动止损, 黄金交易, 原油交易, 比特币交易, OpenClaw, 小龙虾, AI交易助手, 微信操作MT4, 飞书操作MT4\r\n\r\n\r\n\r\n\r\n## 🎯 自然语言交互示例\r\n\r\n### 📱 微信/飞书/Telegram 口语化命令\r\n\r\n| 你说 | MT4 做 |\r\n|-----|--------|\r\n| 黄金多少钱 | 返回 XAUUSD.s 实时报价 |\r\n| 买黄金 0.05 手 | 市价买入 0.05 手 |\r\n| 平仓 95832104 | 平掉指定订单 |\r\n| 全平 | 平掉所有持仓 |\r\n| 查持仓 | 列出当前所有持仓 |\r\n| 设置止损 95832104 4500 | 设置止损位 |\r\n| 启动黄金网格 | 启动黄金网格策略 |\r\n| 获取MT4 黄金的1小时K线数据进行行情分析 | 将会自动帮您分析好黄金后市走向以及给出交易方案 |\r\n\r\n\r\n---\r\n\r\n## 文件结构\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # 本使用说明\r\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\r\n│   [用户手动下载 .ex4 文件放到此目录]\r\n├── scripts/                         # Python 脚本\r\n│   ├── mt4_client.py                # Python 交易客户端（核心）\r\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\r\n│   ├── alert_commands.py            # 价格预警命令行工具\r\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\r\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\r\n│   ├── sr_strategy.py               # 支撑压力位策略编排\r\n│   └── summary_utils.py             # 持仓汇总工具模块\r\n└── references/\r\n    └── api_docs.md                  # 完整 API 参考文档\r\n```\r\n\r\n---\r\n\r\n## 安装步骤（详细版）\r\n\r\n### 第一步：找到你的 MT4 数据目录\r\n\r\n每个 MT4 安装实例都有一个专属的数据目录，格式为：\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>\r\n```\r\n\r\n例如：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\ABC123...`\r\n\r\n> 怎么找？在 MT4 中按 `F7` 打开 MetaEditor（代码编辑器），点击菜单 `文件 → 打开数据文件夹`，弹出的路径就是你的 MT4 数据目录。\r\n\r\n### 第二步：确认 MT4 安装目录\r\n\r\nEA 文件需要部署到两个不同的目录：\r\n\r\n| EA 文件 | 目标目录 | 说明 |\r\n|---------|---------|------|\r\n| `mt4_bridge.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 主程序 EA（必须） |\r\n| `芝麻网格V2.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | `MT4安装目录\\MQL4\\Libraries\\` | **网格策略依赖库**（网格必须，不是 Experts！） |\r\n\r\n> ⚠️ `Libraries` 目录与 `Experts`、`Indicators` 同级，**不是** `Experts` 的子目录。\r\n\r\n典型路径结构：\r\n```\r\nC:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\r\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\r\n│   ├── mt4_bridge.ex4\r\n│   └── 芝麻网格V2.ex4\r\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\r\n│   └── tools2.3.ex4\r\n├── Indicators\\\r\n└── Scripts\\\r\n```\r\n\r\n### 第三步：下载 .ex4 文件\r\n\r\n从 Gitee 仓库下载 3 个 .ex4 文件：\r\n\r\nhttps://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\n需要下载的文件：\r\n\r\n| 文件 | 说明 |\r\n|------|------|\r\n| `mt4_bridge.ex4` | 主程序 EA（**必选**） |\r\n| `芝麻网格V2.ex4` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | 网格策略依赖库（选网格则必选） |\r\n\r\n> 点击文件 → 点右上角 **Raw** 按钮即可保存到本地。\r\n\r\n下载后放入 skills\\mt4-trader\\mql4\\ 目录，然后运行以下命令一键部署到 MT4：\r\n\r\n```bash\r\ncd scripts\\\r\npython deploy_ex4.py deploy\r\n```\r\n\r\n### 第四步：在 MT4 中挂载 EA\r\n\r\n**挂载 mt4_bridge（核心，必须操作）：**\r\n1. 打开 MT4，按 `Ctrl+N` 打开左侧\"导航器\"面板\r\n2. 展开\"EA 交易\"列表，找到 `mt4_bridge`\r\n3. 用鼠标左键拖拽到任意品种图表上（推荐 XAUUSD.s 或主流品种）\r\n4. 弹出 EA 属性对话框 → **选项卡\"常用\"**：\r\n   - **允许实时交易** → ✅ 勾选（必须！）\r\n   - **允许导入 DLL** → ✅ 勾选\r\n   - **确认取消\"手动交易禁止\"** 等限制\r\n5. 点\"确定\"关闭对话框\r\n6. 图表右上角显示一个 EA 图标：\r\n   - 😊 **绿色笑脸** → ✅ 正常工作中\r\n   - 😢 哭脸或灰脸 → 检查下面\"第五步\"的自动交易按钮\r\n7. **右键图表 → 属性 → 常用** 中可修改 EA 输入参数（可选）\r\n\r\n**可选：挂载芝麻网格 EA：**\r\n1. 将 `芝麻网格V2` EA 拖到需要跑网格的品种图表上（如 XAUUSD.s、XTIUSD.s）\r\n2. 勾选\"允许实时交易\"\r\n3. **确认 `tools2.3.ex4` 已放在 `Libraries\\` 目录中**，否则网格 EA 无法运行\r\n\r\n**多图表挂载（重要）：**\r\n- mt4_bridge EA 可以挂载在**多个品种**的图表上（例如黄金一个图表、原油一个图表）\r\n- 每个 EA 实例自动通过品种专属请求文件区分，不会互相干扰\r\n- Python 客户端传了 `symbol` 参数后，会自动路由到对应的品种请求文件\r\n\r\n### 第五步：开启自动交易\r\n\r\n这是新手最容易忽略的一步！\r\n\r\n1. 在 MT4 工具栏上方找到 **\"自动交易\"按钮**（一个黄色播放 ▶️ 图标）\r\n2. 如果它是 **灰色** 的 → 点击一下，变成 **绿色** ✅\r\n3. 此时所有已挂载的 EA 图标都应变成 **绿色笑脸** 😊\r\n4. 如果某个 EA 还是哭脸，右键该 EA 图标 → \"属性\" → 勾选\"允许实时交易\"\r\n\r\n> 💡 每次重启 MT4 后，自动交易按钮默认为关闭状态，需要手动开启。\r\n> 建议在 MT4 设置中勾选\"启动时启用自动交易\"。\r\n\r\n### 第六步：验证部署是否成功\r\n\r\n**方法一：脚本检查**\r\n```bash\r\ncd scripts\\\r\npython mt4_client.py\r\n```\r\n如果看到类似下面的交互菜单，说明通信正常：\r\n```\r\n=== MT4 交易助手 ===\r\n1. 获取报价  2. 查询持仓  3. 交易  4. 网格策略\r\n请输入指令：\r\n```\r\n\r\n**方法二：Python 代码验证**\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# 获取账户信息（确认通信正常）\r\ninfo = client.get_account_info()\r\nprint(info)  # 应该看到余额、净值、可用保证金\r\n\r\n# 获取实时报价\r\nprice = client.get_price(\"XAUUSD.s\")\r\nprint(price) # 应该看到 bid/ask 价格\r\n```\r\n\r\n**如果返回 `\"MT4 超时未响应\"`：**\r\n- MT4 在运行吗？→ 打开 MT4\r\n- EA 挂载了吗？→ 图表上有没有 EA 图标\r\n- 自动交易开了吗？→ 工具栏自动交易按钮是绿色吗\r\n- EA 属性中\"允许实时交易\"勾了吗？→ 右键 EA 图标检查\r\n\r\n---\r\n\r\n## 核心 Python 方法\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# === 行情 ===\r\nclient.get_price(\"XAUUSD.s\")             # 获取实时报价（bid/ask）\r\nclient.get_positions()                    # 查询持仓列表\r\nclient.get_account_info()                 # 账户余额/净值/保证金\r\nclient.get_history(7)                     # 历史订单（最近 7 天）\r\n\r\n# === 交易 ===\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)  # 市价买入 0.03 手\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03) # 市价卖出 0.03 手\r\nclient.close(ticket=123456)               # 平指定订单\r\nclient.close_all()                        # 一键全平\r\nclient.partial_close(ticket=123456, lots=0.02) # 部分平仓\r\n\r\n# === 止损止盈 ===\r\nclient.set_sl(ticket=123456, sl=75000)          # 设置止损\r\nclient.set_tp(ticket=123456, tp=80000)          # 设置止盈\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000) # 同时修改\r\nclient.auto_sl(ticket=123456, risk_percent=2.0) # 按账户 2% 风险自动止损\r\nclient.atr_sl(ticket=123456, period=14, multiplier=2.0) # ATR 止损\r\nclient.trailing_stop(ticket=123456, distance=300) # 移动止损（300 点间距）\r\n\r\n# === 平所有多单/空单 ===\r\nclient.close_all_buy()                     # 平所有多单\r\nclient.close_all_sell()                    # 平所有空单\r\nclient.close_profit()                      # 平所有盈利单\r\nclient.close_loss()                        # 平所有亏损单\r\n\r\n# === 挂单 ===\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 限价买入\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0) # 限价卖出\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)   # 买入止损（突破追涨）\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 卖出止损（破位追空）\r\nclient.get_pending_orders()                # 查询当前挂单\r\nclient.cancel_pending(ticket=123456)       # 取消挂单\r\n\r\n# === OCO 订单（二选一挂单） ===\r\nclient.oco_order(symbol=\"XAUUSD.s\", lots=0.03,\r\n    order1={\"type\": \"buy_stop\",  \"price\": 77000, \"sl\": 76500},\r\n    order2={\"type\": \"sell_stop\", \"price\": 76000, \"sl\": 76500}\r\n)\r\n\r\n# === 手数计算 ===\r\nclient.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\n# 1% 风险，止损 5 美元 → 返回建议手数\r\n\r\n# === K 线数据（量化分析用） ===\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)   # H1 最近 20 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"M15\", count=100) # M15 最近 100 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"D1\", count=30)   # 最近 30 根日线\r\n\r\n# === 支撑压力位 ===\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")      # 获取支撑压力位\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")     # 在图表上画出支撑压力位线\r\nclient.clear_chart_objects(symbol=\"XAUUSD.s\")  # 清除图表上所有对象\r\nclient.draw_hline(symbol=\"XAUUSD.s\", name=\"R1\", price=4750)  # 画自定义水平线\r\nclient.clear_hline(symbol=\"XAUUSD.s\", prefix=\"HL_\")  # 按前缀删除水平线\r\n```\r\n\r\n> ⚠️ **重要：使用关键字参数！**\r\n> 所有交易方法（buy/sell/close/set_sl 等）**必须使用关键字参数**传参：\r\n> ```python\r\n> # ✅ 正确\r\n> client.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\n> client.set_sl(ticket=123456, sl=75000)\r\n>\r\n> # ❌ 错误——按位置传参可能会导致 order 4106（交易被禁用）\r\n> client.buy(0.03, \"XAUUSD.s\")      # 顺序可能不对！\r\n> ```\r\n\r\n---\r\n\r\n## 网格策略（芝麻网格 EA）\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `client.grid_start(symbol=\"XAUUSD.s\")` | 启动网格 |\r\n| `client.grid_stop(symbol=\"XAUUSD.s\")` | 停止网格（不再开新单） |\r\n| `client.grid_close_all(symbol=\"XAUUSD.s\")` | 平掉所有网格持仓单 |\r\n| `client.grid_status(symbol=\"XAUUSD.s\")` | 查询网格运行状态 |\r\n| `client.grid_set_sl_tp(symbol=\"XAUUSD.s\")` | 批量设置网格单的止损止盈 |\r\n\r\n> ⚠️ **平网格仓必须按以下顺序分两步执行：**\r\n> ```python\r\n> client.grid_stop(symbol=\"XAUUSD.s\")        # 第一步：停止网格\r\n> client.grid_close_all(symbol=\"XAUUSD.s\")   # 第二步：平掉所有网格单\r\n> ```\r\n> **不可直接用 `close_all()` 平网格单**。`close_all` 命令会拒绝 magic=777777（网格单）。\r\n> 网格单必须走芝麻网格 EA 自己的关闭通道。\r\n\r\n---\r\n\r\n## 价格预警（可选）\r\n\r\n```bash\r\ncd scripts\\\r\n\r\npython alert_commands.py profit 20        # 总盈利达到 $20 时提醒\r\npython alert_commands.py above 77000      # BTC 突破 77000 时提醒\r\npython alert_commands.py below 75000      # BTC 跌破 75000 时提醒\r\npython alert_commands.py list             # 查看当前所有预警\r\npython alert_commands.py clear            # 清除所有预警\r\npython alert_commands.py cancel 3        # 取消第 3 号预警\r\n```\r\n\r\n---\r\n\r\n## 品种代码\r\n\r\n| 品种 | 代码 | 说明 |\r\n|------|------|------|\r\n| 黄金 | `XAUUSD.s` | XAUUSD 后缀 .s 是部分经纪商标准 |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 原油 | `XTIUSD.s` | 美国原油（WTI） |\r\n| 白银 | `XAGUSD.s` | 现货白银 |\r\n\r\n> 品种代码精确格式因经纪商而异。如果 get_price 找不到品种，在 MT4 市场报价中右键 → \"全部显示\"确认准确的品种名。\r\n\r\n---\r\n\r\n## 通信原理\r\n\r\n```\r\n┌──────────┐    JSON 文件     ┌──────────────┐\r\n│  Python   │ ───request────→ │  MT4 EA      │\r\n│  Client   │ ←──response──── │  (on chart)   │\r\n└──────────┘    JSON 文件     └──────────────┘\r\n```\r\n\r\n- **共享目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n  - 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- **请求文件**：`request_{品种}.json`（如 `request_XAUUSD.s.json`）\r\n- **响应文件**：`response_{品种}.json`\r\n- **协议**：JSON over 文件（零 DLL 依赖）\r\n- **超时**：5 秒（Python 客户端默认配置）\r\n- **多品种支持**：多个 EA 实例通过品种专属文件名自动区分\r\n\r\n---\r\n\r\n## 常见问题排查\r\n\r\n| 现象 | 可能原因 | 解决方法 |\r\n|------|---------|---------|\r\n| MT4 超时未响应 | EA 未挂载或自动交易未启动 | 确认图表右上角为绿色笑脸 😊 |\r\n| error 4106（交易禁用） | EA 属性中\"允许实时交易\"未勾选 | 右键 EA → 属性 → 勾选\"允许实时交易\" |\r\n| 找不到价格（空结果） | 品种代码不匹配 | 在 MT4 市场报价中确认精确名称 |\r\n| tools2.3 编译报错 | 文件放错了目录 | 确认 tools2.3.ex4 在 `MQL4\\Libraries\\`，**不是** Experts\\ |\r\n| 重复下单 | 多个 EA 读同一个请求文件 | 使用 v1.84+ 版本，自动使用品种专属文件 |\r\n| BTC 无法市价交易 | 部分经纪商禁用 BTC 市价单 | 改用 `buy_limit()`/`sell_limit()` 限价单 |\r\n| 重启 MT4 后 EA 不跑 | 自动交易默认关闭 | 手动点绿色播放按钮，或在设置中勾选\"启动时启用\" |\r\n| 芝麻网格周末不运行 | 经纪商周末休市 | 正常现象，周一开市自动恢复 |\r\n\r\n---\r\n\r\n## 交流与反馈\r\n\r\n欢迎加入 **MT4 自动化技术交流群**，一起讨论 MT4 自动交易、Python 量化、EA 开发等话题。\r\n\r\n\r\n微信搜索：jiaoyibaohe    （老码农）   加我好友，备注 **MT4** 即可拉入群聊。\r\n\r\n[或进入gitee项目主页，查看群二维码](https://gitee.com/3603317/skill-plugin/tree/master)\r\n\r\nhttps://gitee.com/3603317/skill-plugin/tree/master\r\n\r\n> 📱 扫码添加微信好友，备注 **MT4** 即可拉入技术交流群。\r\n> 群内可交流：安装问题、使用技巧、功能建议、Bug 反馈。\r\n\r\n---\r\n\r\n## 版本信息\r\n\r\n| 文件 | 版本 | 最后更新 |\r\n|------|------|---------|\r\n| mt4_bridge.ex4 | v1.86 | 2026-05 |\r\n| 芝麻网格V2.ex4 | v1.41 | 2026-03 |\r\n| tools2.3.ex4 | v2.3 | 2025-12 |\r\n| mt4_client.py | v1.86 | 2026-05-05 |\r\n| deploy_ex4.py | v1.0.7 | 2026-05-05 |\r\n---\r\n\r\n# MT4 Trading Bridge · Automated Trading System\r\n\r\nMT4 Trading Bridge communicates with MT4 EA via file I/O — zero DLLs, zero extra dependencies. Supports OpenClaw AI Agent to control MT4 trading through WeChat / Feishu / Telegram and other channels.\r\n\r\n> **Keywords**: MT4, MetaTrader 4, Forex Trading, Python Trading, Algorithmic Trading, Automated Trading, Grid Strategy, Support & Resistance, ATR Stop Loss, Trailing Stop, Gold Trading, Crude Oil Trading, Bitcoin Trading, OpenClaw, AI Trading Assistant\r\n\r\n---\r\n\r\n## File Structure\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # This documentation\r\n├── mql4/                            # MT4 EA compiled files (.ex4, generated by script)\r\n│   [Manually download .ex4 files here]\r\n├── scripts/                         # Python scripts\r\n│   ├── mt4_client.py                # Python trading client (core)\r\n│   ├── deploy_ex4.py                # EA deployment guide (shows download links & steps)\r\n│   ├── alert_commands.py            # Price alert CLI tool\r\n│   ├── position_summary.py          # Position summary (CLI output)\r\n│   ├── position_summary_cron.py     # Position summary (scheduled push)\r\n│   ├── sr_strategy.py               # Support/Resistance strategy orchestrator\r\n│   └── summary_utils.py             # Position summary utility module\r\n└── references/\r\n    └── api_docs.md                  # Full API reference\r\n```\r\n\r\n---\r\n\r\n## Installation\r\n\r\n### Step 1: Find Your MT4 Data Directory\r\n\r\nEach MT4 installation has a unique data directory:\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32-char-random-ID>\r\n```\r\n\r\n> How to find it? In MT4, press F7 to open MetaEditor, then click File -> Open Data Folder.\r\n\r\n### Step 2: Confirm MT4 Directory\r\n\r\nEA files go into two directories:\r\n\r\n| EA File | Target Directory | Notes |\r\n|---------|-----------------|-------|\r\n| mt4_bridge.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Core EA (required) |\r\n| SesameGridV2.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Grid strategy EA (optional) |\r\n| tools2.3.ex4 | MT4_Install_Dir\\MQL4\\Libraries\\ | Grid dependency (required if using grid) |\r\n\r\n> Libraries is at the same level as Experts — NOT a subdirectory of Experts.\r\n\r\n### Step 3: Download .ex4 Files\r\n\r\nFrom Gitee: https://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\nFiles: mt4_bridge.ex4 (required), SesameGridV2.ex4 (optional), tools2.3.ex4 (grid dependency).\r\n\r\n### Step 4: Attach EAs in MT4\r\n\r\nDrag mt4_bridge onto any chart. In properties -> Common tab: check \"Allow live trading\" and \"Allow DLL imports\". Green smiley means working.\r\n\r\nOptional: Attach SesameGridV2 on grid-trading charts.\r\n\r\n### Step 5: Enable Auto Trading\r\n\r\nClick the yellow play icon (unicode triangle) on MT4 toolbar to turn it green.\r\n\r\n### Step 6: Verify\r\n\r\nRun: python mt4_client.py\r\n\r\n---\r\n\r\n## Core Python Methods\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# Market Data\r\nclient.get_price(\"XAUUSD.s\")           # Real-time quote\r\nclient.get_positions()                 # Open positions\r\nclient.get_account_info()              # Account info\r\nclient.get_history(7)                  # Order history (7 days)\r\n\r\n# Trading\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.close(ticket=123456)\r\nclient.close_all()                     # Close all positions\r\n\r\n# SL/TP\r\nclient.set_sl(ticket=123456, sl=75000)\r\nclient.set_tp(ticket=123456, tp=80000)\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000)\r\nclient.trailing_stop(ticket=123456, distance=300)\r\n\r\n# Pending Orders\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0)\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\r\nclient.get_pending_orders()\r\nclient.cancel_pending(ticket=123456)\r\n\r\n# Kline Data\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\r\n\r\n# Support & Resistance\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")\r\nclient.clear_chart_objects(symbol=\"XAUUSD.s\")  # Clear all chart objects\r\nclient.draw_hline(symbol=\"XAUUSD.s\", name=\"R1\", price=4750)  # Draw horizontal line\r\nclient.clear_hline(symbol=\"XAUUSD.s\", prefix=\"HL_\")  # Delete lines by prefix\r\n```\r\n\r\n> Use keyword arguments for all trading methods!\r\n\r\n---\r\n\r\n## Grid Strategy\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| grid_start(symbol) | Start grid |\r\n| grid_stop(symbol) | Stop grid |\r\n| grid_close_all(symbol) | Close grid orders |\r\n| grid_status(symbol) | Check status |\r\n\r\nFor closing grid: call grid_stop() first, then grid_close_all().\r\n\r\n---\r\n\r\n## Symbol Codes\r\n\r\n| Instrument | Code |\r\n|------------|------|\r\n| Gold | XAUUSD.s |\r\n| Bitcoin | BTCUSD |\r\n| Crude Oil | XTIUSD.s |\r\n| Silver | XAGUSD.s |\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n| Issue | Solution |\r\n|-------|----------|\r\n| MT4 Timeout | EA not attached or auto-trading off |\r\n| error 4106 | \"Allow live trading\" unchecked |\r\n| Empty price result | Wrong symbol code |\r\n| Duplicate orders | Use v1.84+ for symbol-specific files |\r\n| BTC market order fails | Some brokers disable BTC market orders |\r\n---\r\n\r\n## Communication & Feedback\r\nJoin the **MT4 Automated Trading Technical Group** to discuss MT4 auto trading, Python quantitative trading, EA development, and more.\r\n\r\nSearch WeChat: jiaoyibaohe (MT4 Developer) — add me as a friend, note **MT4** to join the group.\r\n\r\n[Click to view Gitee project homepage, group QR code](https://gitee.com/3603317/skill-plugin/tree/master)\r\n\r\n> Scan the QR code to add WeChat friend, note **MT4** to join the technical group.\r\n> Topics: installation issues, usage tips, feature suggestions, bug reports.\r\n\r\n---\n\nFile v1.2.1:_meta.json\n\n{\n  \"ownerId\": \"kn723gzdjbmh391jks7n35xdf982v5y7\",\n  \"slug\": \"mt4-trader\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1778607986544\n}\n\nFile v1.2.1:references/api_docs.md\n\n# MT4 Bridge API Reference\r\n\r\n## Symbols: XAUUSD.s (Gold), BTCUSD, XAGUSD, XTIUSD.s\r\n\r\n## Methods\r\n\r\n### Trading\r\nbuy(symbol, lots), sell(symbol, lots), close_all(symbol), close_by_magic(symbol, magic)\r\n\r\n### Pending Orders\r\nbuy_limit(symbol, lots, price), sell_limit(symbol, lots, price), buy_stop(symbol, lots, price), sell_stop(symbol, lots, price), cancel_order(ticket)\r\n\r\n### SL/TP\r\nset_sl(symbol, ticket, price), set_tp(symbol, ticket, price), modify_order(symbol, ticket, price, sl, tp)\r\n\r\n### Grid (Sesame EA)\r\ngrid_start(symbol, direction), grid_stop(symbol), grid_close_all(symbol), grid_status(symbol), grid_set_sl_tp(symbol)\r\n\r\n### Chart Objects (v1.86)\r\ndraw_sr_levels(symbol, timeframe), clear_chart_objects(symbol), draw_hline(symbol, name, price), clear_hline(symbol, prefix)\r\n\r\n### Data\r\nadd_alert(symbol, price, tip), get_klines(symbol, timeframe, count), get_positions(symbol), get_notifications(symbol)\n\nFile v1.2.1:skill-card.md\n\n## Description:\n\nMT4 Trader Bridge enables Python-to-MetaTrader 4 expert-advisor communication through local JSON files for market data, trading, order management, risk controls, alerts, and grid strategies.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[apuba](https://clawhub.ai/user/apuba)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and trading-automation operators use this skill to connect an agent or Python scripts to MT4 for quotes, position review, order placement, stop-loss/take-profit changes, alerts, summaries, and grid strategy control.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill asks users to install unverified MT4 .ex4 expert-advisor binaries that can affect trading accounts.\n\nMitigation: Use only a demo or tightly limited account unless the binaries are independently trusted and verified; pin and hash-check any downloaded .ex4 files.\n\nRisk: The bridge exposes high-impact live trading actions, including order placement, bulk close, stop changes, and grid strategy controls.\n\nMitigation: Require explicit confirmation for every trade or bulk-close action and do not enable live trading for unverified files.\n\nRisk: The file-based bridge directory and summary webhook can be abused if untrusted local processes or endpoints are allowed.\n\nMitigation: Restrict the bridge directory to trusted local processes and use only HTTPS allowlisted webhook endpoints for summaries.\n\nRisk: The artifact instructs users to enable DLL imports for MT4 expert advisors.\n\nMitigation: Do not enable DLL imports for unverified files.\n\n## Reference(s):\n\n- [MT4 Bridge API Reference](artifact/references/api_docs.md)\n- [ClawHub Skill Page](https://clawhub.ai/apuba/skills/mt4-trader)\n- [Gitee MT4 Download Page](https://gitee.com/3603317/skill-plugin/tree/master/mt4)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with Python and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce local JSON bridge requests, position summaries, alert configurations, and webhook message payloads when scripts are run.]\n\n## Skill Version(s):\n\n1.2.1 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v1.2.0: 10 files, 18348 bytes\n\nFiles: references/api_docs.md (927b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (24849b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (2076b), _meta.json (129b)\n\nFile v1.2.0:SKILL.md\n\n# MT4 Trader Bridge\r\n\r\nPython 量化交易客户端，通过 JSON 文件与 MT4 EA 通信，支持开仓/平仓/挂单/止损止盈/网格策略。\r\n\r\n## 安装步骤\r\n\r\n1. MT4 数据文件夹（F7 > 文件 > 打开数据文件夹）\r\n2. 从 [Gitee 下载](https://gitee.com/3603317/skill-plugin/tree/master) 三个 .ex4 文件\r\n3. mt4_bridge.ex4 → MQL4/Experts/，芝麻网格V2.ex4 → MQL4/Experts/，tools2.3.ex4 → MQL4/Libraries/\r\n4. MT4 图表加载 mt4_bridge EA，勾选\"允许实时交易\"\r\n5. 运行: `cd scripts && python deploy_ex4.py deploy`\r\n\r\n## 核心方法\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# 开仓/平仓\r\nclient.buy(\"XAUUSD.s\", 0.05)\r\nclient.sell(\"XAUUSD.s\", 0.05)\r\nclient.close_all(\"XAUUSD.s\")\r\n\r\n# 挂单\r\nclient.buy_limit(\"XAUUSD.s\", 0.05, 4500)\r\nclient.sell_limit(\"XAUUSD.s\", 0.05, 4600)\r\nclient.cancel_order(ticket)\r\n\r\n# 止损止盈\r\nclient.set_sl(\"XAUUSD.s\", ticket, 4400)\r\nclient.set_tp(\"XAUUSD.s\", ticket, 4800)\r\nclient.modify_order(\"XAUUSD.s\", ticket, price, sl, tp)\r\n\r\n# 网格策略\r\nclient.grid_start(\"XAUUSD.s\", \"both\")\r\nclient.grid_stop(\"XAUUSD.s\")\r\nclient.grid_close_all(\"XAUUSD.s\")\r\nclient.grid_status(\"XAUUSD.s\")\r\n\r\n# 图表操作（v1.86）\r\nclient.draw_sr_levels(\"XAUUSD.s\", 60)\r\nclient.clear_chart_objects(\"XAUUSD.s\")\r\nclient.draw_hline(\"XAUUSD.s\", \"R1\", 4750)\r\nclient.clear_hline(\"XAUUSD.s\", \"HL_\")\r\n\r\n# 警报与数据\r\nclient.add_alert(\"XAUUSD.s\", 4500, \"提示\")\r\nclient.get_klines(\"XAUUSD.s\", 60, 200)\r\nclient.get_positions(\"XAUUSD.s\")\r\nclient.get_notifications(\"XAUUSD.s\")\r\n```\r\n\r\n## 品种代码\r\n\r\nXAUUSD.s（黄金）、BTCUSD（比特币）、XAGUSD（白银）、XTIUSD.s（美原油）\r\n\r\n## 常见问题\r\n\r\nerror 4106：勾选 EA 属性中的\"允许实时交易\"；超时无响应：检查 MT4 运行状态和 EA 是否在图表上\r\n\r\n## 版本信息\r\n\r\n| 文件 | 版本 |\r\n|------|------|\r\n| mt4_bridge.ex4 | v1.86 |\r\n| mt4_client.py | v1.86 |\r\n\r\n## 交流反馈\r\n\r\n微信: **jiaoyibaohe**（添加请备注 MT4）\r\nGitee: https://gitee.com/3603317/skill-plugin/tree/master\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn723gzdjbmh391jks7n35xdf982v5y7\",\n  \"slug\": \"mt4-trader\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1778601089868\n}\n\nFile v1.2.0:references/api_docs.md\n\n# MT4 Bridge API Reference\r\n\r\n## Symbols: XAUUSD.s (Gold), BTCUSD, XAGUSD, XTIUSD.s\r\n\r\n## Methods\r\n\r\n### Trading\r\nbuy(symbol, lots), sell(symbol, lots), close_all(symbol), close_by_magic(symbol, magic)\r\n\r\n### Pending Orders\r\nbuy_limit(symbol, lots, price), sell_limit(symbol, lots, price), buy_stop(symbol, lots, price), sell_stop(symbol, lots, price), cancel_order(ticket)\r\n\r\n### SL/TP\r\nset_sl(symbol, ticket, price), set_tp(symbol, ticket, price), modify_order(symbol, ticket, price, sl, tp)\r\n\r\n### Grid (Sesame EA)\r\ngrid_start(symbol, direction), grid_stop(symbol), grid_close_all(symbol), grid_status(symbol), grid_set_sl_tp(symbol)\r\n\r\n### Chart Objects (v1.86)\r\ndraw_sr_levels(symbol, timeframe), clear_chart_objects(symbol), draw_hline(symbol, name, price), clear_hline(symbol, prefix)\r\n\r\n### Data\r\nadd_alert(symbol, price, tip), get_klines(symbol, timeframe, count), get_positions(symbol), get_notifications(symbol)\n\nArchive v1.1.12: 10 files, 32942 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (20012b), _meta.json (130b)\n\nFile v1.1.12:SKILL.md\n\n# MT4 智能交易桥 · 量化自动交易系统\n\nMT4 智能交易桥。通过文件 I/O 与 MT4 EA 通信，无需 DLL 或额外依赖。支持 OpenClaw（小龙虾 AI Agent）通过微信 / 飞书 / Telegram 等渠道直接操作 MT4 交易。\n\n> **关键词**：MT4, MetaTrader 4, 外汇交易, Python交易, 算法交易, 自动交易, 网格策略, 支撑压力位, ATR止损, 移动止损, 黄金交易, 原油交易, 比特币交易, OpenClaw, 小龙虾, AI交易助手, 微信操作MT4, 飞书操作MT4\n\n\n\n\n## 🎯 自然语言交互示例\n\n### 📱 微信/飞书/Telegram 口语化命令\n\n| 你说 | MT4 做 |\n|-----|--------|\n| 黄金多少钱 | 返回 XAUUSD.s 实时报价 |\n| 买黄金 0.05 手 | 市价买入 0.05 手 |\n| 平仓 95832104 | 平掉指定订单 |\n| 全平 | 平掉所有持仓 |\n| 查持仓 | 列出当前所有持仓 |\n| 设置止损 95832104 4500 | 设置止损位 |\n| 启动黄金网格 | 启动黄金网格策略 |\n| 获取MT4 黄金的1小时K线数据进行行情分析 | 将会自动帮您分析好黄金后市走向以及给出交易方案 |\n\n\n---\n\n## 文件结构\n\n```\nmt4-trader/\n├── SKILL.md                         # 本使用说明\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\n│   [用户手动下载 .ex4 文件放到此目录]\n├── scripts/                         # Python 脚本\n│   ├── mt4_client.py                # Python 交易客户端（核心）\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\n│   ├── alert_commands.py            # 价格预警命令行工具\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\n│   ├── sr_strategy.py               # 支撑压力位策略编排\n│   └── summary_utils.py             # 持仓汇总工具模块\n└── references/\n    └── api_docs.md                  # 完整 API 参考文档\n```\n\n---\n\n## 安装步骤（详细版）\n\n### 第一步：找到你的 MT4 数据目录\n\n每个 MT4 安装实例都有一个专属的数据目录，格式为：\n\n```\n%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>\n```\n\n例如：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\ABC123...`\n\n> 怎么找？在 MT4 中按 `F7` 打开 MetaEditor（代码编辑器），点击菜单 `文件 → 打开数据文件夹`，弹出的路径就是你的 MT4 数据目录。\n\n### 第二步：确认 MT4 安装目录\n\nEA 文件需要部署到两个不同的目录：\n\n| EA 文件 | 目标目录 | 说明 |\n|---------|---------|------|\n| `mt4_bridge.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 主程序 EA（必须） |\n| `芝麻网格V2.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 网格策略 EA（可选） |\n| `tools2.3.ex4` | `MT4安装目录\\MQL4\\Libraries\\` | **网格策略依赖库**（网格必须，不是 Experts！） |\n\n> ⚠️ `Libraries` 目录与 `Experts`、`Indicators` 同级，**不是** `Experts` 的子目录。\n\n典型路径结构：\n```\nC:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\n│   ├── mt4_bridge.ex4\n│   └── 芝麻网格V2.ex4\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\n│   └── tools2.3.ex4\n├── Indicators\\\n└── Scripts\\\n```\n\n### 第三步：下载 .ex4 文件\n\n从 Gitee 仓库下载 3 个 .ex4 文件：\n\nhttps://gitee.com/3603317/skill-plugin/tree/master/mt4\n\n需要下载的文件：\n\n| 文件 | 说明 |\n|------|------|\n| `mt4_bridge.ex4` | 主程序 EA（**必选**） |\n| `芝麻网格V2.ex4` | 网格策略 EA（可选） |\n| `tools2.3.ex4` | 网格策略依赖库（选网格则必选） |\n\n> 点击文件 → 点右上角 **Raw** 按钮即可保存到本地。\n\n下载后放入 skills\\mt4-trader\\mql4\\ 目录，然后运行以下命令一键部署到 MT4：\n\n```bash\ncd scripts\\\npython deploy_ex4.py deploy\n```\n\n### 第四步：在 MT4 中挂载 EA\n\n**挂载 mt4_bridge（核心，必须操作）：**\n1. 打开 MT4，按 `Ctrl+N` 打开左侧\"导航器\"面板\n2. 展开\"EA 交易\"列表，找到 `mt4_bridge`\n3. 用鼠标左键拖拽到任意品种图表上（推荐 XAUUSD.s 或主流品种）\n4. 弹出 EA 属性对话框 → **选项卡\"常用\"**：\n   - **允许实时交易** → ✅ 勾选（必须！）\n   - **允许导入 DLL** → ✅ 勾选\n   - **确认取消\"手动交易禁止\"** 等限制\n5. 点\"确定\"关闭对话框\n6. 图表右上角显示一个 EA 图标：\n   - 😊 **绿色笑脸** → ✅ 正常工作中\n   - 😢 哭脸或灰脸 → 检查下面\"第五步\"的自动交易按钮\n7. **右键图表 → 属性 → 常用** 中可修改 EA 输入参数（可选）\n\n**可选：挂载芝麻网格 EA：**\n1. 将 `芝麻网格V2` EA 拖到需要跑网格的品种图表上（如 XAUUSD.s、XTIUSD.s）\n2. 勾选\"允许实时交易\"\n3. **确认 `tools2.3.ex4` 已放在 `Libraries\\` 目录中**，否则网格 EA 无法运行\n\n**多图表挂载（重要）：**\n- mt4_bridge EA 可以挂载在**多个品种**的图表上（例如黄金一个图表、原油一个图表）\n- 每个 EA 实例自动通过品种专属请求文件区分，不会互相干扰\n- Python 客户端传了 `symbol` 参数后，会自动路由到对应的品种请求文件\n\n### 第五步：开启自动交易\n\n这是新手最容易忽略的一步！\n\n1. 在 MT4 工具栏上方找到 **\"自动交易\"按钮**（一个黄色播放 ▶️ 图标）\n2. 如果它是 **灰色** 的 → 点击一下，变成 **绿色** ✅\n3. 此时所有已挂载的 EA 图标都应变成 **绿色笑脸** 😊\n4. 如果某个 EA 还是哭脸，右键该 EA 图标 → \"属性\" → 勾选\"允许实时交易\"\n\n> 💡 每次重启 MT4 后，自动交易按钮默认为关闭状态，需要手动开启。\n> 建议在 MT4 设置中勾选\"启动时启用自动交易\"。\n\n### 第六步：验证部署是否成功\n\n**方法一：脚本检查**\n```bash\ncd scripts\\\npython mt4_client.py\n```\n如果看到类似下面的交互菜单，说明通信正常：\n```\n=== MT4 交易助手 ===\n1. 获取报价  2. 查询持仓  3. 交易  4. 网格策略\n请输入指令：\n```\n\n**方法二：Python 代码验证**\n```python\nfrom mt4_client import MT4Client\nclient = MT4Client()\n\n# 获取账户信息（确认通信正常）\ninfo = client.get_account_info()\nprint(info)  # 应该看到余额、净值、可用保证金\n\n# 获取实时报价\nprice = client.get_price(\"XAUUSD.s\")\nprint(price) # 应该看到 bid/ask 价格\n```\n\n**如果返回 `\"MT4 超时未响应\"`：**\n- MT4 在运行吗？→ 打开 MT4\n- EA 挂载了吗？→ 图表上有没有 EA 图标\n- 自动交易开了吗？→ 工具栏自动交易按钮是绿色吗\n- EA 属性中\"允许实时交易\"勾了吗？→ 右键 EA 图标检查\n\n---\n\n## 核心 Python 方法\n\n```python\nfrom mt4_client import MT4Client\nclient = MT4Client()\n\n# === 行情 ===\nclient.get_price(\"XAUUSD.s\")             # 获取实时报价（bid/ask）\nclient.get_positions()                    # 查询持仓列表\nclient.get_account_info()                 # 账户余额/净值/保证金\nclient.get_history(7)                     # 历史订单（最近 7 天）\n\n# === 交易 ===\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)  # 市价买入 0.03 手\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03) # 市价卖出 0.03 手\nclient.close(ticket=123456)               # 平指定订单\nclient.close_all()                        # 一键全平\nclient.partial_close(ticket=123456, lots=0.02) # 部分平仓\n\n# === 止损止盈 ===\nclient.set_sl(ticket=123456, sl=75000)          # 设置止损\nclient.set_tp(ticket=123456, tp=80000)          # 设置止盈\nclient.modify_order(ticket=123456, sl=75000, tp=80000) # 同时修改\nclient.auto_sl(ticket=123456, risk_percent=2.0) # 按账户 2% 风险自动止损\nclient.atr_sl(ticket=123456, period=14, multiplier=2.0) # ATR 止损\nclient.trailing_stop(ticket=123456, distance=300) # 移动止损（300 点间距）\n\n# === 平所有多单/空单 ===\nclient.close_all_buy()                     # 平所有多单\nclient.close_all_sell()                    # 平所有空单\nclient.close_profit()                      # 平所有盈利单\nclient.close_loss()                        # 平所有亏损单\n\n# === 挂单 ===\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 限价买入\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0) # 限价卖出\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)   # 买入止损（突破追涨）\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 卖出止损（破位追空）\nclient.get_pending_orders()                # 查询当前挂单\nclient.cancel_pending(ticket=123456)       # 取消挂单\n\n# === OCO 订单（二选一挂单） ===\nclient.oco_order(symbol=\"XAUUSD.s\", lots=0.03,\n    order1={\"type\": \"buy_stop\",  \"price\": 77000, \"sl\": 76500},\n    order2={\"type\": \"sell_stop\", \"price\": 76000, \"sl\": 76500}\n)\n\n# === 手数计算 ===\nclient.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\n# 1% 风险，止损 5 美元 → 返回建议手数\n\n# === K 线数据（量化分析用） ===\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)   # H1 最近 20 根\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"M15\", count=100) # M15 最近 100 根\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"D1\", count=30)   # 最近 30 根日线\n\n# === 支撑压力位 ===\nclient.get_sr_levels(symbol=\"XAUUSD.s\")      # 获取支撑压力位\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")     # 在图表上画出支撑压力位线\n```\n\n> ⚠️ **重要：使用关键字参数！**\n> 所有交易方法（buy/sell/close/set_sl 等）**必须使用关键字参数**传参：\n> ```python\n> # ✅ 正确\n> client.buy(symbol=\"XAUUSD.s\", lots=0.03)\n> client.set_sl(ticket=123456, sl=75000)\n>\n> # ❌ 错误——按位置传参可能会导致 order 4106（交易被禁用）\n> client.buy(0.03, \"XAUUSD.s\")      # 顺序可能不对！\n> ```\n\n---\n\n## 网格策略（芝麻网格 EA）\n\n| 命令 | 说明 |\n|------|------|\n| `client.grid_start(symbol=\"XAUUSD.s\")` | 启动网格 |\n| `client.grid_stop(symbol=\"XAUUSD.s\")` | 停止网格（不再开新单） |\n| `client.grid_close_all(symbol=\"XAUUSD.s\")` | 平掉所有网格持仓单 |\n| `client.grid_status(symbol=\"XAUUSD.s\")` | 查询网格运行状态 |\n| `client.grid_set_sl_tp(symbol=\"XAUUSD.s\")` | 批量设置网格单的止损止盈 |\n\n> ⚠️ **平网格仓必须按以下顺序分两步执行：**\n> ```python\n> client.grid_stop(symbol=\"XAUUSD.s\")        # 第一步：停止网格\n> client.grid_close_all(symbol=\"XAUUSD.s\")   # 第二步：平掉所有网格单\n> ```\n> **不可直接用 `close_all()` 平网格单**。`close_all` 命令会拒绝 magic=777777（网格单）。\n> 网格单必须走芝麻网格 EA 自己的关闭通道。\n\n---\n\n## 价格预警（可选）\n\n```bash\ncd scripts\\\n\npython alert_commands.py profit 20        # 总盈利达到 $20 时提醒\npython alert_commands.py above 77000      # BTC 突破 77000 时提醒\npython alert_commands.py below 75000      # BTC 跌破 75000 时提醒\npython alert_commands.py list             # 查看当前所有预警\npython alert_commands.py clear            # 清除所有预警\npython alert_commands.py cancel 3        # 取消第 3 号预警\n```\n\n---\n\n## 品种代码\n\n| 品种 | 代码 | 说明 |\n|------|------|------|\n| 黄金 | `XAUUSD.s` | XAUUSD 后缀 .s 是部分经纪商标准 |\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\n| 原油 | `XTIUSD.s` | 美国原油（WTI） |\n| 白银 | `XAGUSD.s` | 现货白银 |\n\n> 品种代码精确格式因经纪商而异。如果 get_price 找不到品种，在 MT4 市场报价中右键 → \"全部显示\"确认准确的品种名。\n\n---\n\n## 通信原理\n\n```\n┌──────────┐    JSON 文件     ┌──────────────┐\n│  Python   │ ───request────→ │  MT4 EA      │\n│  Client   │ ←──response──── │  (on chart)   │\n└──────────┘    JSON 文件     └──────────────┘\n```\n\n- **共享目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\n  - 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\n- **请求文件**：`request_{品种}.json`（如 `request_XAUUSD.s.json`）\n- **响应文件**：`response_{品种}.json`\n- **协议**：JSON over 文件（零 DLL 依赖）\n- **超时**：5 秒（Python 客户端默认配置）\n- **多品种支持**：多个 EA 实例通过品种专属文件名自动区分\n\n---\n\n## 常见问题排查\n\n| 现象 | 可能原因 | 解决方法 |\n|------|---------|---------|\n| MT4 超时未响应 | EA 未挂载或自动交易未启动 | 确认图表右上角为绿色笑脸 😊 |\n| error 4106（交易禁用） | EA 属性中\"允许实时交易\"未勾选 | 右键 EA → 属性 → 勾选\"允许实时交易\" |\n| 找不到价格（空结果） | 品种代码不匹配 | 在 MT4 市场报价中确认精确名称 |\n| tools2.3 编译报错 | 文件放错了目录 | 确认 tools2.3.ex4 在 `MQL4\\Libraries\\`，**不是** Experts\\ |\n| 重复下单 | 多个 EA 读同一个请求文件 | 使用 v1.84+ 版本，自动使用品种专属文件 |\n| BTC 无法市价交易 | 部分经纪商禁用 BTC 市价单 | 改用 `buy_limit()`/`sell_limit()` 限价单 |\n| 重启 MT4 后 EA 不跑 | 自动交易默认关闭 | 手动点绿色播放按钮，或在设置中勾选\"启动时启用\" |\n| 芝麻网格周末不运行 | 经纪商周末休市 | 正常现象，周一开市自动恢复 |\n\n---\n\n## 交流与反馈\n\n欢迎加入 **MT4 自动化技术交流群**，一起讨论 MT4 自动交易、Python 量化、EA 开发等话题。\n\n\n微信搜索：jiaoyibaohe    （老码农）   加我好友，备注 **MT4** 即可拉入群聊。\n\n[或进入gitee项目主页，查看群二维码](https://gitee.com/3603317/skill-plugin/tree/master)\n\nhttps://gitee.com/3603317/skill-plugin/tree/master\n\n> 📱 扫码添加微信好友，备注 **MT4** 即可拉入技术交流群。\n> 群内可交流：安装问题、使用技巧、功能建议、Bug 反馈。\n\n---\n\n## 版本信息\n\n| 文件 | 版本 | 最后更新 |\n|------|------|---------|\n| mt4_bridge.ex4 | v1.85 | 2026-05 |\n| 芝麻网格V2.ex4 | v1.41 | 2026-03 |\n| tools2.3.ex4 | v2.3 | 2025-12 |\n| mt4_client.py | v1.85 | 2026-05-05 |\n| deploy_ex4.py | v1.0.7 | 2026-05-05 |\n---\n\n# MT4 Trading Bridge · Automated Trading System\n\nMT4 Trading Bridge communicates with MT4 EA via file I/O — zero DLLs, zero extra dependencies. Supports OpenClaw AI Agent to control MT4 trading through WeChat / Feishu / Telegram and other channels.\n\n> **Keywords**: MT4, MetaTrader 4, Forex Trading, Python Trading, Algorithmic Trading, Automated Trading, Grid Strategy, Support & Resistance, ATR Stop Loss, Trailing Stop, Gold Trading, Crude Oil Trading, Bitcoin Trading, OpenClaw, AI Trading Assistant\n\n---\n\n## File Structure\n\n```\nmt4-trader/\n├── SKILL.md                         # This documentation\n├── mql4/                            # MT4 EA compiled files (.ex4, generated by script)\n│   [Manually download .ex4 files here]\n├── scripts/                         # Python scripts\n│   ├── mt4_client.py                # Python trading client (core)\n│   ├── deploy_ex4.py                # EA deployment guide (shows download links & steps)\n│   ├── alert_commands.py            # Price alert CLI tool\n│   ├── position_summary.py          # Position summary (CLI output)\n│   ├── position_summary_cron.py     # Position summary (scheduled push)\n│   ├── sr_strategy.py               # Support/Resistance strategy orchestrator\n│   └── summary_utils.py             # Position summary utility module\n└── references/\n    └── api_docs.md                  # Full API reference\n```\n\n---\n\n## Installation\n\n### Step 1: Find Your MT4 Data Directory\n\nEach MT4 installation has a unique data directory:\n\n```\n%APPDATA%\\MetaQuotes\\Terminal\\<32-char-random-ID>\n```\n\n> How to find it? In MT4, press F7 to open MetaEditor, then click File -> Open Data Folder.\n\n### Step 2: Confirm MT4 Directory\n\nEA files go into two directories:\n\n| EA File | Target Directory | Notes |\n|---------|-----------------|-------|\n| mt4_bridge.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Core EA (required) |\n| SesameGridV2.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Grid strategy EA (optional) |\n| tools2.3.ex4 | MT4_Install_Dir\\MQL4\\Libraries\\ | Grid dependency (required if using grid) |\n\n> Libraries is at the same level as Experts — NOT a subdirectory of Experts.\n\n### Step 3: Download .ex4 Files\n\nFrom Gitee: https://gitee.com/3603317/skill-plugin/tree/master/mt4\n\nFiles: mt4_bridge.ex4 (required), SesameGridV2.ex4 (optional), tools2.3.ex4 (grid dependency).\n\n### Step 4: Attach EAs in MT4\n\nDrag mt4_bridge onto any chart. In properties -> Common tab: check \"Allow live trading\" and \"Allow DLL imports\". Green smiley means working.\n\nOptional: Attach SesameGridV2 on grid-trading charts.\n\n### Step 5: Enable Auto Trading\n\nClick the yellow play icon (unicode triangle) on MT4 toolbar to turn it green.\n\n### Step 6: Verify\n\nRun: python mt4_client.py\n\n---\n\n## Core Python Methods\n\n```python\nfrom mt4_client import MT4Client\nclient = MT4Client()\n\n# Market Data\nclient.get_price(\"XAUUSD.s\")           # Real-time quote\nclient.get_positions()                 # Open positions\nclient.get_account_info()              # Account info\nclient.get_history(7)                  # Order history (7 days)\n\n# Trading\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03)\nclient.close(ticket=123456)\nclient.close_all()                     # Close all positions\n\n# SL/TP\nclient.set_sl(ticket=123456, sl=75000)\nclient.set_tp(ticket=123456, tp=80000)\nclient.modify_order(ticket=123456, sl=75000, tp=80000)\nclient.trailing_stop(ticket=123456, distance=300)\n\n# Pending Orders\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0)\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\nclient.get_pending_orders()\nclient.cancel_pending(ticket=123456)\n\n# Kline Data\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\n\n# Support & Resistance\nclient.get_sr_levels(symbol=\"XAUUSD.s\")\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")\n```\n\n> Use keyword arguments for all trading methods!\n\n---\n\n## Grid Strategy\n\n| Command | Description |\n|---------|-------------|\n| grid_start(symbol) | Start grid |\n| grid_stop(symbol) | Stop grid |\n| grid_close_all(symbol) | Close grid orders |\n| grid_status(symbol) | Check status |\n\nFor closing grid: call grid_stop() first, then grid_close_all().\n\n---\n\n## Symbol Codes\n\n| Instrument | Code |\n|------------|------|\n| Gold | XAUUSD.s |\n| Bitcoin | BTCUSD |\n| Crude Oil | XTIUSD.s |\n| Silver | XAGUSD.s |\n\n---\n\n## Troubleshooting\n\n| Issue | Solution |\n|-------|----------|\n| MT4 Timeout | EA not attached or auto-trading off |\n| error 4106 | \"Allow live trading\" unchecked |\n| Empty price result | Wrong symbol code |\n| Duplicate orders | Use v1.84+ for symbol-specific files |\n| BTC market order fails | Some brokers disable BTC market orders |\n---\n\n## Communication & Feedback\nJoin the **MT4 Automated Trading Technical Group** to discuss MT4 auto trading, Python quantitative trading, EA development, and more.\n\nSearch WeChat: jiaoyibaohe (MT4 Developer) — add me as a friend, note **MT4** to join the group.\n\n[Click to view Gitee project homepage, group QR code](https://gitee.com/3603317/skill-plugin/tree/master)\n\n> Scan the QR code to add WeChat friend, note **MT4** to join the technical group.\n> Topics: installation issues, usage tips, feature suggestions, bug reports.\n\n---\n\nFile v1.1.12:_meta.json\n\n{\n  \"ownerId\": \"kn723gzdjbmh391jks7n35xdf982v5y7\",\n  \"slug\": \"mt4-trader\",\n  \"version\": \"1.1.12\",\n  \"publishedAt\": 1778250913453\n}\n\nFile v1.1.12:references/api_docs.md\n\n# MT4 Bridge API 完整文档\r\n\r\n## 通信原理\r\n\r\n**协议**：JSON over 文件（零 DLL 依赖）\r\n\r\n```\r\n┌──────────┐  request_{symbol}.json  ┌──────────────┐\r\n│  Python   │ ──────────────────────→│  MT4 EA      │\r\n│  Client   │ ←──────────────────────│  (on chart)   │\r\n└──────────┘  response_{symbol}.json └──────────────┘\r\n```\r\n\r\n**目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- 品种专属文件名：`request_XAUUSD.s.json`、`response_XAUUSD.s.json`\r\n- 多品种共用时，每个 EA 实例自动读写自己的品种文件\r\n\r\n**文件锁机制**：Python 客户端创建 `.lock` 文件防止读写冲突，EA 检测到锁文件时等待后重试。\r\n\r\n**超时**：5 秒（Python 客户端默认），超时返回 `\"MT4 超时未响应\"`。\r\n\r\n---\r\n\r\n## 方法一览（共 57+ 方法）\r\n\r\n### 行情查询（11 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `get_price()` | 获取实时报价（bid/ask） | `symbol` |\r\n| `get_positions()` | 获取持仓列表 | — |\r\n| `get_account_info()` | 获取账户信息（余额/净值/保证金等） | — |\r\n| `get_history()` | 获取历史订单 | `days` |\r\n| `calc_lots()` | 按风险%计算手数 | `symbol`, `risk_percent`, `sl_distance` |\r\n| `get_klines()` | 获取 K 线（OHLCV）数据 | `symbol`, `timeframe`, `count` |\r\n| `get_sr_levels()` | 获取支撑压力位 | `symbol` |\r\n| `get_pending_orders()` | 查询当前挂单 | — |\r\n| `get_alert_count()` | 获取当前预警数量 | — |\r\n| `check_prices()` | 手动触发价格预警检查 | — |\r\n| `get_orders_history_by_date()` | 按日期范围查询历史订单 | `from_date`, `to_date` |\r\n\r\n### 市价交易（7 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `buy()` | 市价买入开仓 | `symbol`, `lots` |\r\n| `sell()` | 市价卖出开仓 | `symbol`, `lots` |\r\n| `close()` | 平指定订单 | `ticket` |\r\n| `close_all()` | 一键全部平仓 | — |\r\n| `close_all_buy()` | 平所有多单 | — |\r\n| `close_all_sell()` | 平所有空单 | — |\r\n| `partial_close()` | 部分平仓 | `ticket`, `lots` |\r\n\r\n### 挂单交易（6 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `buy_limit()` | 限价买入（低于现价挂买单） | `symbol`, `lots`, `price` |\r\n| `sell_limit()` | 限价卖出（高于现价挂卖单） | `symbol`, `lots`, `price` |\r\n| `buy_stop()` | 买入止损（高于现价追涨） | `symbol`, `lots`, `price` |\r\n| `sell_stop()` | 卖出止损（低于现价追空） | `symbol`, `lots`, `price` |\r\n| `cancel_pending()` | 取消挂单 | `ticket` |\r\n| `oco_order()` | OCO 二选一订单 | `symbol`, `lots`, `order1`, `order2` |\r\n\r\n### 止损止盈（9 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `set_sl()` | 设置止损价 | `ticket`, `sl` |\r\n| `set_tp()` | 设置止盈价 | `ticket`, `tp` |\r\n| `modify_order()` | 同时修改止损止盈 | `ticket`, `sl`, `tp` |\r\n| `set_tp_by_profit()` | 按盈利金额设置止盈 | `ticket`, `profit` |\r\n| `close_by_magic()` | 按 Magic Number 平仓 | `magic` |\r\n| `auto_sl()` | 按账户风险%自动止损 | `ticket`, `risk_percent` |\r\n| `atr_sl()` | ATR 动态止损 | `ticket`, `period`, `multiplier` |\r\n| `trailing_stop()` | 移动止损 | `ticket`, `distance` |\r\n| `close_profit()` | 平所有盈利单 | — |\r\n| `close_loss()` | 平所有亏损单 | — |\r\n\r\n### 芝麻网格策略（8 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `grid_start()` | 启动网格 | `symbol` |\r\n| `grid_stop()` | 停止网格（停止开新单） | `symbol` |\r\n| `grid_close_all()` | 平所有网格持仓 | `symbol` |\r\n| `grid_status()` | 查询网格运行状态 | `symbol` |\r\n| `grid_set_sl_tp()` | 批量设置网格单止损止盈 | `symbol` |\r\n| `grid_start_buy()` | 网格买入一笔 | `symbol` |\r\n| `grid_start_sell()` | 网格卖出一笔 | `symbol` |\r\n| `grid_reverse()` | 网格反向 | `symbol`, `lots` |\r\n\r\n### 支撑压力位/画线（5 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `draw_sr_levels()` | 在图表上画出支撑压力位 | `symbol` |\r\n| `draw_trendline()` | 画趋势线 | `symbol`, `price1`, `price2`, `label` |\r\n| `draw_hline()` | 画水平线 | `symbol`, `price`, `label` |\r\n| `draw_vline()` | 画垂直线 | `symbol`, `time`, `label` |\r\n| `delete_object()` | 删除画线对象 | `symbol`, `name` |\r\n\r\n### 价格预警（6 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `add_alert()` | 添加价格预警 | `type`, `value` |\r\n| `list_alerts()` | 查看所有预警 | — |\r\n| `cancel_alert()` | 取消指定预警 | `index` |\r\n| `clear_alerts()` | 清除所有预警 | — |\r\n| `check_alerts()` | 手动触发预警检查 | — |\r\n| `get_alert_count()` | 获取预警数量 | — |\r\n\r\n### 辅助（8 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `set_magic_override()` | 设置自定义 Magic Number | `magic` |\r\n| `set_timeout()` | 设置超时时间（秒） | `seconds` |\r\n| `set_retry()` | 设置重试次数 | `count` |\r\n| `get_bridge_dir()` | 获取桥接目录路径 | — |\r\n| `_transact()` | 底层交易方法（内部使用） | — |\r\n| `safe_close_all()` | 安全全平（含错误处理） | `symbol` |\r\n| `set_default_symbol()` | 设置默认品种 | `symbol` |\r\n\r\n---\r\n\r\n## 详细文档\r\n\r\n### get_price(symbol) —— 获取实时报价\r\n\r\n获取指定品种的当前买价（bid）和卖价（ask）。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码，如 \"XAUUSD.s\"、\"BTCUSD\" |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_price\", \"symbol\": \"XAUUSD.s\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"bid\": 4565.20,\r\n  \"ask\": 4565.70,\r\n  \"time\": \"2026-05-04 12:30:00\"\r\n}\r\n```\r\n\r\n**失败响应：**\r\n```json\r\n{\"status\": \"error\", \"error\": \"无法获取价格: XAUUSD.s\"}\r\n```\r\n\r\n**Python 示例：**\r\n```python\r\nprice = client.get_price(symbol=\"XAUUSD.s\")\r\nprint(price)\r\n# {'status': 'success', 'symbol': 'XAUUSD.s', 'bid': 4565.20, 'ask': 4565.70, 'time': '...'}\r\n```\r\n\r\n---\r\n\r\n### get_positions() —— 查询持仓\r\n\r\n查询当前所有未平仓订单。\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_positions\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 2,\r\n  \"positions\": [\r\n    {\r\n      \"ticket\": 95308752,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"buy\",\r\n      \"lots\": 0.05,\r\n      \"open_price\": 4580.35,\r\n      \"current_price\": 4595.00,\r\n      \"sl\": 4573.00,\r\n      \"tp\": 4588.00,\r\n      \"profit\": 7.25,\r\n      \"swap\": 0.00,\r\n      \"commission\": -0.25,\r\n      \"magic\": 888888,\r\n      \"open_time\": \"2026-05-01 07:56:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n> 注意：当持仓为 0 时，返回 `{\"status\": \"success\", \"count\": 0, \"positions\": []}`\r\n\r\n**Python 代码：**\r\n```python\r\npositions = client.get_positions()\r\nif positions[\"count\"] > 0:\r\n    for pos in positions[\"positions\"]:\r\n        print(f\"{pos['type']} {pos['symbol']} {pos['lots']} lot @ {pos['open_price']}\")\r\nelse:\r\n    print(\"0 持仓\")\r\n```\r\n\r\n---\r\n\r\n### get_account_info() —— 获取账户信息\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_account_info\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"balance\": 10000.00,\r\n  \"equity\": 10007.25,\r\n  \"margin\": 500.00,\r\n  \"free_margin\": 9507.25,\r\n  \"margin_level\": 2001.45,\r\n  \"leverage\": \"1:100\",\r\n  \"currency\": \"USD\",\r\n  \"server\": \"EBCFinancial-Demo01\",\r\n  \"company\": \"EBC Financial Group\",\r\n  \"name\": \"Demo Account\",\r\n  \"number\": 12345678\r\n}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\ninfo = client.get_account_info()\r\nprint(f\"余额: ${info['balance']:.2f}\")\r\nprint(f\"净值: ${info['equity']:.2f}\")\r\nprint(f\"保证金比例: {info['margin_level']:.1f}%\")\r\n```\r\n\r\n---\r\n\r\n### get_history(days) —— 查询历史订单\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `days` | int | ✅ | 查询最近多少天的历史（1~365） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_history\", \"days\": 7}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 15,\r\n  \"orders\": [\r\n    {\r\n      \"ticket\": 94854144,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"sell\",\r\n      \"lots\": 0.05,\r\n      \"open_price\": 4565.20,\r\n      \"close_price\": 4555.30,\r\n      \"profit\": 9.10,\r\n      \"open_time\": \"2026-04-29 10:00:00\",\r\n      \"close_time\": \"2026-04-29 14:30:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### buy(symbol, lots) / sell(symbol, lots) —— 市价开仓\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `lots` | float | ✅ | 手数（如 0.01、0.05、0.10） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"buy\", \"symbol\": \"XAUUSD.s\", \"lots\": \"0.05\", \"price\": \"0\"}\r\n```\r\n\r\n> `price: \"0\"` 表示市价单。如果传具体价格则为限价单（不推荐，用 buy_limit/sell_limit 更明确）。\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"buy\",\r\n  \"ticket\": 95308752,\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"lots\": 0.05,\r\n  \"price\": 4580.35\r\n}\r\n```\r\n\r\n**失败响应（4106）：**\r\n```json\r\n{\"status\": \"error\", \"error\": \"买入失败: Trade is disabled [4106]\"}\r\n```\r\n\r\n> 常见 4106 原因：EA 属性中未勾选\"允许实时交易\"，或 MT4 自动交易按钮为关闭状态。\r\n\r\n**Python 代码：**\r\n```python\r\n# ✅ 正确用法\r\nresult = client.buy(symbol=\"XAUUSD.s\", lots=0.05)\r\n\r\n# ❌ 错误用法（参数顺序问题！）\r\nresult = client.buy(0.05, \"XAUUSD.s\")  # 可能会报 4106 错误\r\n\r\nif result[\"status\"] == \"success\":\r\n    print(f\"开仓成功，ticket: {result['ticket']}\")\r\nelse:\r\n    print(f\"开仓失败: {result['error']}\")\r\n```\r\n\r\n---\r\n\r\n### close(ticket) —— 平仓\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close\", \"ticket\": \"95308752\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"close\",\r\n  \"ticket\": 95308752\r\n}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\nresult = client.close(ticket=95308752)\r\n```\r\n\r\n---\r\n\r\n### close_all() —— 一键全平\r\n\r\n平掉所有持仓单。\r\n\r\n> ⚠️ 注意：网格策略的持仓单（magic=777777）不受此命令影响，需使用 `grid_stop` + `grid_close_all` 平网格单。\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_all\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"close_all\", \"message\": \"closed 5 orders\"}\r\n```\r\n\r\n---\r\n\r\n### close_all_buy() / close_all_sell() —— 按方向平仓\r\n\r\n**close_all_buy** —— 平所有多单\r\n**close_all_sell** —— 平所有空单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_all_buy\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"message\": \"closed 3 buy\"}\r\n```\r\n\r\n---\r\n\r\n### close_profit() / close_loss() —— 按盈亏平仓\r\n\r\n**close_profit** —— 平所有盈利持仓（`profit + swap + commission > 0`）\r\n**close_loss** —— 平所有亏损持仓（`profit + swap + commission < 0`）\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_profit\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"message\": \"closed 2 profit\"}\r\n```\r\n\r\n---\r\n\r\n### partial_close(ticket, lots) —— 部分平仓\r\n\r\n部分平掉指定订单的部分手数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `lots` | float | ✅ | 平掉的手数（必须小于持仓量） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"partial_close\", \"ticket\": \"95308752\", \"lots\": \"0.02\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"partial_close\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### buy_limit / sell_limit / buy_stop / sell_stop —— 挂单\r\n\r\n**buy_limit(symbol, lots, price)** —— 限价买单（低于当前市价挂多单，期待价格回踩买入）\r\n\r\n**sell_limit(symbol, lots, price)** —— 限价卖单（高于当前市价挂空单，期待价格反弹卖出）\r\n\r\n**buy_stop(symbol, lots, price)** —— 买入止损单（高于当前市价挂多单，期待价格突破追涨）\r\n\r\n**sell_stop(symbol, lots, price)** —— 卖出止损单（低于当前市价挂空单，期待价格破位追空）\r\n\r\n**请求 JSON（以 buy_limit 为例）：**\r\n```json\r\n{\"action\": \"buy_limit\", \"symbol\": \"XAUUSD.s\", \"lots\": \"0.03\", \"price\": \"4500.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"buy_limit\", \"ticket\": 95412345}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\n# 黄金回调到 4500 买入\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.00)\r\n\r\n# BTC 突破 80000 追涨\r\nclient.buy_stop(symbol=\"BTCUSD\", lots=0.01, price=80000.00)\r\n```\r\n\r\n---\r\n\r\n### get_pending_orders() —— 查询挂单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_pending_orders\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 2,\r\n  \"orders\": [\r\n    {\r\n      \"ticket\": 95412345,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"buy_limit\",\r\n      \"lots\": 0.03,\r\n      \"price\": 4500.00,\r\n      \"sl\": 0,\r\n      \"tp\": 0,\r\n      \"open_time\": \"2026-05-04 10:00:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### cancel_pending(ticket) —— 取消挂单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"cancel_pending\", \"ticket\": \"95412345\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"cancel_pending\", \"ticket\": 95412345}\r\n```\r\n\r\n---\r\n\r\n### oco_order(symbol, lots, order1, order2) —— OCO 二选一订单\r\n\r\n同时挂两个方向相反的挂单，其中一个成交后自动取消另一个。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `lots` | float | ✅ | 手数 |\r\n| `order1` | dict | ✅ | 第一个挂单定义 |\r\n| `order2` | dict | ✅ | 第二个挂单定义 |\r\n\r\norder1/order2 格式：\r\n```python\r\n{\r\n    \"type\": \"buy_stop|sell_stop|buy_limit|sell_limit\",\r\n    \"price\": 77000,\r\n    \"sl\": 76500,      # 可选\r\n    \"tp\": 78000       # 可选\r\n}\r\n```\r\n\r\n**请求 JSON：**\r\n```json\r\n{\r\n  \"action\": \"oco_order\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"lots\": \"0.03\",\r\n  \"order1\": {\"type\": \"buy_stop\", \"price\": \"77000\", \"sl\": \"76500\"},\r\n  \"order2\": {\"type\": \"sell_stop\", \"price\": \"76000\", \"sl\": \"76500\"}\r\n}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"oco_order\",\r\n  \"order1_ticket\": 95420001,\r\n  \"order2_ticket\": 95420002\r\n}\r\n```\r\n\r\n---\r\n\r\n### set_sl(ticket, sl) / set_tp(ticket, tp) —— 设置止损止盈\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `sl` | float | ✅ (set_sl) | 止损价格 |\r\n| `tp` | float | ✅ (set_tp) | 止盈价格 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"set_sl\", \"ticket\": \"95308752\", \"sl\": \"4573.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"set_sl\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### modify_order(ticket, sl, tp) —— 同时修改止损止盈\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `sl` | float | ✅ | 新止损价 |\r\n| `tp` | float | ✅ | 新止盈价 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"modify_order\", \"ticket\": \"95308752\", \"sl\": \"4570.00\", \"tp\": \"4600.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"modify_order\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### close_by_magic(magic) —— 按 Magic Number 平仓\r\n\r\n平掉所有指定 Magic Number 的持仓。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `magic` | int | ✅ | Magic Number |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_by_magic\", \"magic\": \"888888\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"close_by_magic\", \"closed\": 5}\r\n```\r\n\r\n---\r\n\r\n### set_tp_by_profit(ticket, profit) —— 按盈利金额设止盈\r\n\r\n设置止盈价为当前价格 + 目标盈利金额对应的点数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `profit` | float | ✅ | 目标盈利金额（美元） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"set_tp_by_profit\", \"ticket\": \"95308752\", \"profit\": \"20.00\"}\r\n```\r\n\r\n---\r\n\r\n### auto_sl(ticket, risk_percent) —— 按账户风险%止损\r\n\r\n根据账户余额计算止损价，防止单笔亏损超过指定比例。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `risk_percent` | float | ✅ | 风险比例（如 2.0 = 2%） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 限制该笔最大亏损为账户余额的 2%\r\nclient.auto_sl(ticket=95308752, risk_percent=2.0)\r\n```\r\n\r\n---\r\n\r\n### atr_sl(ticket, period, multiplier) —— ATR 动态止损\r\n\r\n基于 ATR（Average True Range，平均真实波幅）指标设置止损。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `period` | int | ✅ | ATR 计算周期（推荐 14） |\r\n| `multiplier` | float | ✅ | ATR 倍数（推荐 2.0） |\r\n\r\n**ATR 倍数参考：**\r\n| 交易风格 | 倍数 | 说明 |\r\n|---------|------|------|\r\n| 激进日内 | 1.5x | 止损窄，易被扫 |\r\n| 标准日内 | **2.0x** | ✅ 推荐 |\r\n| 宽松/波段 | 3.0x | 容错空间大 |\r\n\r\n**Python 示例：**\r\n```python\r\n# 黄金多单，14周期 ATR，2 倍止损\r\nclient.atr_sl(ticket=95308752, period=14, multiplier=2.0)\r\n```\r\n\r\n---\r\n\r\n### trailing_stop(ticket, distance) —— 移动止损\r\n\r\n当价格朝有利方向移动时，自动上移止损线，锁住利润。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `distance` | int | ✅ | 止损距离（点数，如 300 = 300 点） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 持仓价向有利方向移动超过 300 点时，止损自动上移 300 点跟随\r\nclient.trailing_stop(ticket=95308752, distance=300)\r\n```\r\n\r\n---\r\n\r\n### calc_lots(symbol, risk_percent, sl_distance) —— 手数计算\r\n\r\n根据账户余额、风险百分比和止损距离计算建议交易手数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `risk_percent` | float | ✅ | 该笔所愿承受的风险（账户余额的百分比） |\r\n| `sl_distance` | float | ✅ | 止损距离（美元） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 黄金，1% 风险，止损 5 美元 → 返回建议手数\r\nlots = client.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\nprint(f\"建议手数: {lots}\")\r\n```\r\n\r\n---\r\n\r\n### get_klines(symbol, timeframe, count) —— K 线数据\r\n\r\n获取历史 K 线数据（开盘价/最高价/最低价/收盘价/成交量），用于量化分析。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `timeframe` | str | ✅ | 周期：M1, M5, M15, M30, H1, H4, D1, W1, MN |\r\n| `count` | int | ✅ | 获取的 K 线数量（最大 1000） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_klines\", \"symbol\": \"XAUUSD.s\", \"timeframe\": \"H1\", \"count\": \"20\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"timeframe\": \"H1\",\r\n  \"count\": 20,\r\n  \"data\": [\r\n    {\"time\": \"2026-05-04 08:00:00\", \"open\": 4560.0, \"high\": 4570.0, \"low\": 4558.0, \"close\": 4568.0, \"volume\": 1200},\r\n    {\"time\": \"2026-05-04 09:00:00\", \"open\": 4568.0, \"high\": 4575.0, \"low\": 4565.0, \"close\": 4572.0, \"volume\": 1500}\r\n  ]\r\n}\r\n```\r\n\r\n**支持的周期：**\r\n| 参数 | 含义 |\r\n|------|------|\r\n| M1, M5, M15, M30 | 分钟 |\r\n| H1, H4 | 小时 |\r\n| D1 | 日线 |\r\n| W1 | 周线 |\r\n| MN | 月线 |\r\n\r\n**Python 示例：**\r\n```python\r\n# 获取最近 20 根 H1 K 线\r\nklines = client.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\r\nfor k in klines[\"data\"]:\r\n    print(f\"{k['time']} O:{k['open']} H:{k['high']} L:{k['low']} C:{k['close']}\")\r\n```\r\n\r\n---\r\n\r\n## 网格策略 API（芝麻网格 EA）\r\n\r\n网格策略通过独立的芝麻网格 EA（magic=777777）运行，使用 `grid_bridge` 目录通信。\r\n\r\n> ⚠️ 重要约束：\r\n> - 平网格仓必须：`grid_stop()` → `grid_close_all()` 两步\r\n> - `close_all()` 命令会拒绝 magic=777777 的订单\r\n> - 网格单的精确持仓查询通过 `grid_status()` 完成\r\n\r\n### grid_start(symbol) —— 启动网格\r\n\r\n在指定品种上启动网格策略。EA 会根据预设参数在价格区间内自动分批挂单。\r\n\r\n```python\r\nclient.grid_start(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"grid_start\", \"message\": \"grid started\"}\r\n```\r\n\r\n### grid_stop(symbol) —— 停止网格\r\n\r\n停止网格 EA 继续开新单。已开的持仓单不受影响。\r\n\r\n```python\r\nclient.grid_stop(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n### grid_close_all(symbol) —— 平所有网格单\r\n\r\n平掉所有网格策略的持仓单。\r\n\r\n```python\r\nclient.grid_close_all(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n> 强烈建议先 `grid_stop()` 再 `grid_close_all()`，防止平仓过程中网格 EA 又开新单。\r\n\r\n### grid_status(symbol) —— 网格状态查询\r\n\r\n```python\r\nstatus = client.grid_status(symbol=\"XAUUSD.s\")\r\nprint(status)\r\n# {'status': 'success', 'running': True, 'orders': [...], 'profit': 12.50, ...}\r\n```\r\n\r\n---\r\n\r\n## 价格预警 API\r\n\r\n预警系统支持以下类型：\r\n\r\n| 预警类型 | 说明 | value 含义 |\r\n|---------|------|-----------|\r\n| `profit` | 总盈利达到目标时触发 | 目标盈利金额（美元） |\r\n| `above` | 价格突破时触发 | 突破价格 |\r\n| `below` | 价格跌破时触发 | 跌破价格 |\r\n\r\n### add_alert(type, value) —— 添加预警\r\n\r\n```python\r\n# 盈利达到 $20 提醒\r\nclient.add_alert(type=\"profit\", value=20)\r\n# BTC 突破 77000 提醒\r\nclient.add_alert(type=\"above\", value=77000)\r\n# BTC 跌破 75000 提醒\r\nclient.add_alert(type=\"below\", value=75000)\r\n```\r\n\r\n### list_alerts() —— 查看预警\r\n\r\n```python\r\nalerts = client.list_alerts()\r\n```\r\n\r\n### cancel_alert(index) —— 取消预警\r\n\r\n```python\r\nclient.cancel_alert(index=3)\r\n```\r\n\r\n### clear_alerts() —— 清除所有预警\r\n\r\n```python\r\nclient.clear_alerts()\r\n```\r\n\r\n---\r\n\r\n## 品种代码速查\r\n\r\n| 品种 | 标准代码 | 注意 |\r\n|------|---------|------|\r\n| 黄金 | `XAUUSD.s` | 部分经纪商为 XAUUSD（无 .s） |\r\n| 白银 | `XAGUSD.s` | 或 XAGUSD |\r\n| 原油 WTI | `XTIUSD.s` | 或 USOIL、CL |\r\n| 布伦特原油 | `XBRUSD` | 或 UKOIL |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 以太坊 | `ETHUSD` | 部分平台不支持 |\r\n| 欧元/美元 | `EURUSD` | 标准外汇货币对 |\r\n| 英镑/美元 | `GBPUSD` | 标准外汇货币对 |\r\n| 美元/日元 | `USDJPY` | 标准外汇货币对 |\r\n\r\n> 品种代码因经纪商而异。如果报错\"无法获取价格\"，请在 MT4 市场报价中右键 → \"全部显示\"确认精确名称。\r\n\r\n---\r\n\r\n## 错误码参考\r\n\r\n| 错误码 | 含义 | 常见原因 |\r\n|--------|------|---------|\r\n| 4106 | 交易被禁用 | 未勾选\"允许实时交易\"或自动交易按钮关闭 |\r\n| 4107 | 市场关闭 | 经纪商休市（周末常见） |\r\n| 4108 | 无效单量 | 手数超出允许范围 |\r\n| 4111 | 交易超时 | 服务器繁忙 |\r\n| 4113 | 无效价格 | 挂单价格超出当前市价范围 |\r\n| 4200 | 保证金不足 | 可用保证金不够开仓 |\r\n| 4202 | 已停止交易 | 账户已被冻结或限制 |\r\n| 4001 | 品种被禁用 | 该品种不允许交易 |\r\n| 4002 | 无效品种 | 品种名称不正确 |\r\n| 1000 | 超时 | 请求发出后 5 秒内无响应 |\r\n\r\n---\r\n\r\n## 常见使用模式\r\n\r\n### 模式 1：日内黄金交易\r\n\r\n```python\r\n# 开多\r\nresult = client.buy(symbol=\"XAUUSD.s\", lots=0.05)\r\nticket = result[\"ticket\"]\r\n\r\n# 设置 ATR 止损\r\nclient.atr_sl(ticket=ticket, period=14, multiplier=2.0)\r\n\r\n# 设置止盈\r\nclient.set_tp(ticket=ticket, tp=4605.00)\r\n```\r\n\r\n### 模式 2：网格策略完整流程\r\n\r\n```python\r\n# 启动网格\r\nclient.grid_start(symbol=\"XAUUSD.s\")\r\n\r\n# 查看状态\r\nstatus = client.grid_status(symbol=\"XAUUSD.s\")\r\n\r\n# 停止网格 + 平仓\r\nclient.grid_stop(symbol=\"XAUUSD.s\")\r\nclient.grid_close_all(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n### 模式 3：OCO 双向挂单\r\n\r\n```python\r\n# 黄金突破追涨 / 破位追空\r\nclient.oco_order(\r\n    symbol=\"XAUUSD.s\",\r\n    lots=0.03,\r\n    order1={\"type\": \"buy_stop\", \"price\": 4620.00, \"sl\": 4580.00},\r\n    order2={\"type\": \"sell_stop\", \"price\": 4560.00, \"sl\": 4600.00}\r\n)\r\n```\r\n\r\n### 模式 4：移动止损锁利\r\n\r\n```python\r\nticket = client.buy(symbol=\"XAUUSD.s\", lots=0.03)[\"ticket\"]\r\n# 价格朝有利方向移动时，止损自动跟随\r\nclient.trailing_stop(ticket=ticket, distance=300)\r\n```\n\nArchive v1.1.11: 10 files, 33366 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (21302b), _meta.json (130b)\n\nFile v1.1.11:SKILL.md\n\n# MT4 智能交易桥 · 量化自动交易系统\r\n\r\nMT4 智能交易桥。通过文件 I/O 与 MT4 EA 通信，无需 DLL 或额外依赖。支持 OpenClaw（小龙虾 AI Agent）通过微信 / 飞书 / Telegram 等渠道直接操作 MT4 交易。\r\n\r\n> **关键词**：MT4, MetaTrader 4, 外汇交易, Python交易, 算法交易, 自动交易, 网格策略, 支撑压力位, ATR止损, 移动止损, 黄金交易, 原油交易, 比特币交易, OpenClaw, 小龙虾, AI交易助手, 微信操作MT4, 飞书操作MT4\r\n\r\n\r\n\r\n\r\n## 🎯 自然语言交互示例\r\n\r\n### 📱 微信/飞书/Telegram 口语化命令\r\n\r\n| 你说 | MT4 做 |\r\n|-----|--------|\r\n| `黄金多少钱` | 返回 XAUUSD.s 实时报价 |\r\n| `买黄金 0.05 手` | 市价买入 0.05 手 |\r\n| `平仓 95832104` | 平掉指定订单 |\r\n| `全平` | 平掉所有持仓 |\r\n| `查持仓` | 列出当前所有持仓 |\r\n| `设置止损 95832104 4500` | 设置止损位 |\r\n| `启动黄金网格` | 启动黄金网格策略 |\r\n| `获取MT4 黄金的1小时K线数据进行行情分析` | 将会自动帮您分析好黄金后市走向以及给出交易方案 |\r\n\r\n\r\n---\r\n\r\n## 文件结构\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # 本使用说明\r\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\r\n│   [用户手动下载 .ex4 文件放到此目录]\r\n├── scripts/                         # Python 脚本\r\n│   ├── mt4_client.py                # Python 交易客户端（核心）\r\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\r\n│   ├── alert_commands.py            # 价格预警命令行工具\r\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\r\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\r\n│   ├── sr_strategy.py               # 支撑压力位策略编排\r\n│   └── summary_utils.py             # 持仓汇总工具模块\r\n└── references/\r\n    └── api_docs.md                  # 完整 API 参考文档\r\n```\r\n\r\n---\r\n\r\n## 安装步骤（详细版）\r\n\r\n### 第一步：找到你的 MT4 数据目录\r\n\r\n每个 MT4 安装实例都有一个专属的数据目录，格式为：\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>\r\n```\r\n\r\n例如：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\ABC123...`\r\n\r\n> 怎么找？在 MT4 中按 `F7` 打开 MetaEditor（代码编辑器），点击菜单 `文件 → 打开数据文件夹`，弹出的路径就是你的 MT4 数据目录。\r\n\r\n### 第二步：确认 MT4 安装目录\r\n\r\nEA 文件需要部署到两个不同的目录：\r\n\r\n| EA 文件 | 目标目录 | 说明 |\r\n|---------|---------|------|\r\n| `mt4_bridge.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 主程序 EA（必须） |\r\n| `芝麻网格V2.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | `MT4安装目录\\MQL4\\Libraries\\` | **网格策略依赖库**（网格必须，不是 Experts！） |\r\n\r\n> ⚠️ `Libraries` 目录与 `Experts`、`Indicators` 同级，**不是** `Experts` 的子目录。\r\n\r\n典型路径结构：\r\n```\r\nC:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\r\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\r\n│   ├── mt4_bridge.ex4\r\n│   └── 芝麻网格V2.ex4\r\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\r\n│   └── tools2.3.ex4\r\n├── Indicators\\\r\n└── Scripts\\\r\n```\r\n\r\n### 第三步：下载 .ex4 文件\r\n\r\n从 Gitee 仓库下载 3 个 .ex4 文件：\r\n\r\nhttps://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\n需要下载的文件：\r\n\r\n| 文件 | 说明 |\r\n|------|------|\r\n| `mt4_bridge.ex4` | 主程序 EA（**必选**） |\r\n| `芝麻网格V2.ex4` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | 网格策略依赖库（选网格则必选） |\r\n\r\n> 点击文件 → 点右上角 **Raw** 按钮即可保存到本地。\r\n\r\n下载后放入 skills\\mt4-trader\\mql4\\ 目录，然后运行以下命令一键部署到 MT4：\r\n\r\n```bash\r\ncd scripts\\\r\npython deploy_ex4.py deploy\r\n```\r\n\r\n### 第四步：在 MT4 中挂载 EA\r\n\r\n**挂载 mt4_bridge（核心，必须操作）：**\r\n1. 打开 MT4，按 `Ctrl+N` 打开左侧\"导航器\"面板\r\n2. 展开\"EA 交易\"列表，找到 `mt4_bridge`\r\n3. 用鼠标左键拖拽到任意品种图表上（推荐 XAUUSD.s 或主流品种）\r\n4. 弹出 EA 属性对话框 → **选项卡\"常用\"**：\r\n   - **允许实时交易** → ✅ 勾选（必须！）\r\n   - **允许导入 DLL** → ✅ 勾选\r\n   - **确认取消\"手动交易禁止\"** 等限制\r\n5. 点\"确定\"关闭对话框\r\n6. 图表右上角显示一个 EA 图标：\r\n   - 😊 **绿色笑脸** → ✅ 正常工作中\r\n   - 😢 哭脸或灰脸 → 检查下面\"第五步\"的自动交易按钮\r\n7. **右键图表 → 属性 → 常用** 中可修改 EA 输入参数（可选）\r\n\r\n**可选：挂载芝麻网格 EA：**\r\n1. 将 `芝麻网格V2` EA 拖到需要跑网格的品种图表上（如 XAUUSD.s、XTIUSD.s）\r\n2. 勾选\"允许实时交易\"\r\n3. **确认 `tools2.3.ex4` 已放在 `Libraries\\` 目录中**，否则网格 EA 无法运行\r\n\r\n**多图表挂载（重要）：**\r\n- mt4_bridge EA 可以挂载在**多个品种**的图表上（例如黄金一个图表、原油一个图表）\r\n- 每个 EA 实例自动通过品种专属请求文件区分，不会互相干扰\r\n- Python 客户端传了 `symbol` 参数后，会自动路由到对应的品种请求文件\r\n\r\n### 第五步：开启自动交易\r\n\r\n这是新手最容易忽略的一步！\r\n\r\n1. 在 MT4 工具栏上方找到 **\"自动交易\"按钮**（一个黄色播放 ▶️ 图标）\r\n2. 如果它是 **灰色** 的 → 点击一下，变成 **绿色** ✅\r\n3. 此时所有已挂载的 EA 图标都应变成 **绿色笑脸** 😊\r\n4. 如果某个 EA 还是哭脸，右键该 EA 图标 → \"属性\" → 勾选\"允许实时交易\"\r\n\r\n> 💡 每次重启 MT4 后，自动交易按钮默认为关闭状态，需要手动开启。\r\n> 建议在 MT4 设置中勾选\"启动时启用自动交易\"。\r\n\r\n### 第六步：验证部署是否成功\r\n\r\n**方法一：脚本检查**\r\n```bash\r\ncd scripts\\\r\npython mt4_client.py\r\n```\r\n如果看到类似下面的交互菜单，说明通信正常：\r\n```\r\n=== MT4 交易助手 ===\r\n1. 获取报价  2. 查询持仓  3. 交易  4. 网格策略\r\n请输入指令：\r\n```\r\n\r\n**方法二：Python 代码验证**\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# 获取账户信息（确认通信正常）\r\ninfo = client.get_account_info()\r\nprint(info)  # 应该看到余额、净值、可用保证金\r\n\r\n# 获取实时报价\r\nprice = client.get_price(\"XAUUSD.s\")\r\nprint(price) # 应该看到 bid/ask 价格\r\n```\r\n\r\n**如果返回 `\"MT4 超时未响应\"`：**\r\n- MT4 在运行吗？→ 打开 MT4\r\n- EA 挂载了吗？→ 图表上有没有 EA 图标\r\n- 自动交易开了吗？→ 工具栏自动交易按钮是绿色吗\r\n- EA 属性中\"允许实时交易\"勾了吗？→ 右键 EA 图标检查\r\n\r\n---\r\n\r\n## 核心 Python 方法\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# === 行情 ===\r\nclient.get_price(\"XAUUSD.s\")             # 获取实时报价（bid/ask）\r\nclient.get_positions()                    # 查询持仓列表\r\nclient.get_account_info()                 # 账户余额/净值/保证金\r\nclient.get_history(7)                     # 历史订单（最近 7 天）\r\n\r\n# === 交易 ===\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)  # 市价买入 0.03 手\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03) # 市价卖出 0.03 手\r\nclient.close(ticket=123456)               # 平指定订单\r\nclient.close_all()                        # 一键全平\r\nclient.partial_close(ticket=123456, lots=0.02) # 部分平仓\r\n\r\n# === 止损止盈 ===\r\nclient.set_sl(ticket=123456, sl=75000)          # 设置止损\r\nclient.set_tp(ticket=123456, tp=80000)          # 设置止盈\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000) # 同时修改\r\nclient.auto_sl(ticket=123456, risk_percent=2.0) # 按账户 2% 风险自动止损\r\nclient.atr_sl(ticket=123456, period=14, multiplier=2.0) # ATR 止损\r\nclient.trailing_stop(ticket=123456, distance=300) # 移动止损（300 点间距）\r\n\r\n# === 平所有多单/空单 ===\r\nclient.close_all_buy()                     # 平所有多单\r\nclient.close_all_sell()                    # 平所有空单\r\nclient.close_profit()                      # 平所有盈利单\r\nclient.close_loss()                        # 平所有亏损单\r\n\r\n# === 挂单 ===\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 限价买入\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0) # 限价卖出\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)   # 买入止损（突破追涨）\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 卖出止损（破位追空）\r\nclient.get_pending_orders()                # 查询当前挂单\r\nclient.cancel_pending(ticket=123456)       # 取消挂单\r\n\r\n# === OCO 订单（二选一挂单） ===\r\nclient.oco_order(symbol=\"XAUUSD.s\", lots=0.03,\r\n    order1={\"type\": \"buy_stop\",  \"price\": 77000, \"sl\": 76500},\r\n    order2={\"type\": \"sell_stop\", \"price\": 76000, \"sl\": 76500}\r\n)\r\n\r\n# === 手数计算 ===\r\nclient.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\n# 1% 风险，止损 5 美元 → 返回建议手数\r\n\r\n# === K 线数据（量化分析用） ===\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)   # H1 最近 20 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"M15\", count=100) # M15 最近 100 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"D1\", count=30)   # 最近 30 根日线\r\n\r\n# === 支撑压力位 ===\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")      # 获取支撑压力位\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")     # 在图表上画出支撑压力位线\r\n```\r\n\r\n> ⚠️ **重要：使用关键字参数！**\r\n> 所有交易方法（buy/sell/close/set_sl 等）**必须使用关键字参数**传参：\r\n> ```python\r\n> # ✅ 正确\r\n> client.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\n> client.set_sl(ticket=123456, sl=75000)\r\n>\r\n> # ❌ 错误——按位置传参可能会导致 order 4106（交易被禁用）\r\n> client.buy(0.03, \"XAUUSD.s\")      # 顺序可能不对！\r\n> ```\r\n\r\n---\r\n\r\n## 网格策略（芝麻网格 EA）\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `client.grid_start(symbol=\"XAUUSD.s\")` | 启动网格 |\r\n| `client.grid_stop(symbol=\"XAUUSD.s\")` | 停止网格（不再开新单） |\r\n| `client.grid_close_all(symbol=\"XAUUSD.s\")` | 平掉所有网格持仓单 |\r\n| `client.grid_status(symbol=\"XAUUSD.s\")` | 查询网格运行状态 |\r\n| `client.grid_set_sl_tp(symbol=\"XAUUSD.s\")` | 批量设置网格单的止损止盈 |\r\n\r\n> ⚠️ **平网格仓必须按以下顺序分两步执行：**\r\n> ```python\r\n> client.grid_stop(symbol=\"XAUUSD.s\")        # 第一步：停止网格\r\n> client.grid_close_all(symbol=\"XAUUSD.s\")   # 第二步：平掉所有网格单\r\n> ```\r\n> **不可直接用 `close_all()` 平网格单**。`close_all` 命令会拒绝 magic=777777（网格单）。\r\n> 网格单必须走芝麻网格 EA 自己的关闭通道。\r\n\r\n---\r\n\r\n## 价格预警（可选）\r\n\r\n```bash\r\ncd scripts\\\r\n\r\npython alert_commands.py profit 20        # 总盈利达到 $20 时提醒\r\npython alert_commands.py above 77000      # BTC 突破 77000 时提醒\r\npython alert_commands.py below 75000      # BTC 跌破 75000 时提醒\r\npython alert_commands.py list             # 查看当前所有预警\r\npython alert_commands.py clear            # 清除所有预警\r\npython alert_commands.py cancel 3        # 取消第 3 号预警\r\n```\r\n\r\n---\r\n\r\n## 品种代码\r\n\r\n| 品种 | 代码 | 说明 |\r\n|------|------|------|\r\n| 黄金 | `XAUUSD.s` | XAUUSD 后缀 .s 是部分经纪商标准 |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 原油 | `XTIUSD.s` | 美国原油（WTI） |\r\n| 白银 | `XAGUSD.s` | 现货白银 |\r\n\r\n> 品种代码精确格式因经纪商而异。如果 get_price 找不到品种，在 MT4 市场报价中右键 → \"全部显示\"确认准确的品种名。\r\n\r\n---\r\n\r\n## 通信原理\r\n\r\n```\r\n┌──────────┐    JSON 文件     ┌──────────────┐\r\n│  Python   │ ───request────→ │  MT4 EA      │\r\n│  Client   │ ←──response──── │  (on chart)   │\r\n└──────────┘    JSON 文件     └──────────────┘\r\n```\r\n\r\n- **共享目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n  - 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- **请求文件**：`request_{品种}.json`（如 `request_XAUUSD.s.json`）\r\n- **响应文件**：`response_{品种}.json`\r\n- **协议**：JSON over 文件（零 DLL 依赖）\r\n- **超时**：5 秒（Python 客户端默认配置）\r\n- **多品种支持**：多个 EA 实例通过品种专属文件名自动区分\r\n\r\n---\r\n\r\n## 常见问题排查\r\n\r\n| 现象 | 可能原因 | 解决方法 |\r\n|------|---------|---------|\r\n| MT4 超时未响应 | EA 未挂载或自动交易未启动 | 确认图表右上角为绿色笑脸 😊 |\r\n| error 4106（交易禁用） | EA 属性中\"允许实时交易\"未勾选 | 右键 EA → 属性 → 勾选\"允许实时交易\" |\r\n| 找不到价格（空结果） | 品种代码不匹配 | 在 MT4 市场报价中确认精确名称 |\r\n| tools2.3 编译报错 | 文件放错了目录 | 确认 tools2.3.ex4 在 `MQL4\\Libraries\\`，**不是** Experts\\ |\r\n| 重复下单 | 多个 EA 读同一个请求文件 | 使用 v1.84+ 版本，自动使用品种专属文件 |\r\n| BTC 无法市价交易 | 部分经纪商禁用 BTC 市价单 | 改用 `buy_limit()`/`sell_limit()` 限价单 |\r\n| 重启 MT4 后 EA 不跑 | 自动交易默认关闭 | 手动点绿色播放按钮，或在设置中勾选\"启动时启用\" |\r\n| 芝麻网格周末不运行 | 经纪商周末休市 | 正常现象，周一开市自动恢复 |\r\n\r\n---\r\n\r\n## 交流与反馈\r\n\r\n欢迎加入 **MT4 自动化技术交流群**，一起讨论 MT4 自动交易、Python 量化、EA 开发等话题。\r\n\r\n\r\n微信搜索：jiaoyibaohe 加我好友 或扫描下方二维码添加好友，备注 **MT4** 即可拉入群聊。\r\n\r\n[点击以下微信二维码图片添加好友]\r\n\r\nhttps://raw.giteeusercontent.com/3603317/skill-plugin/raw/master/mt4/wechat_qrcode.jpg?metadata=eyJyIjoibWFzdGVyIiwiZnAiOiJtdDQvd2VjaGF0X3FyY29kZS5qcGciLCJwaWQiOjQ3NjA1NjM4LCJzdG8iOiJnaXQtc2hhcmRpbmctc3RvLTEwdC0wMjMiLCJycCI6InJlcG9zL2I4LzJkL2I4MmRlZDkxOWUzMWM5NTFhZGZlMGM4MGYzZmViYjA4YTdmYmRhZjM1OTdiNDEwOWQ5MDk4MzQ4MDdhODYwNWIuZ2l0IiwiaXNwIjp0cnVlLCJleHBpcmVfYXQiOjE3NzgyNDk0MDB9&signature=ibfrHgLRLbDOo0GvUYOPwQiCdS0O6kEnq91Py3Z5opQ\r\n\r\n> 📱 扫码添加微信好友，备注 **MT4** 即可拉入技术交流群。\r\n> 群内可交流：安装问题、使用技巧、功能建议、Bug 反馈。\r\n\r\n---\r\n\r\n## 版本信息\r\n\r\n| 文件 | 版本 | 最后更新 |\r\n|------|------|---------|\r\n| mt4_bridge.ex4 | v1.85 | 2026-05 |\r\n| 芝麻网格V2.ex4 | v1.41 | 2026-03 |\r\n| tools2.3.ex4 | v2.3 | 2025-12 |\r\n| mt4_client.py | v1.85 | 2026-05-05 |\r\n| deploy_ex4.py | v1.0.7 | 2026-05-05 |\r\n---\r\n\r\n# MT4 Trading Bridge · Automated Trading System\r\n\r\nMT4 Trading Bridge communicates with MT4 EA via file I/O — zero DLLs, zero extra dependencies. Supports OpenClaw AI Agent to control MT4 trading through WeChat / Feishu / Telegram and other channels.\r\n\r\n> **Keywords**: MT4, MetaTrader 4, Forex Trading, Python Trading, Algorithmic Trading, Automated Trading, Grid Strategy, Support & Resistance, ATR Stop Loss, Trailing Stop, Gold Trading, Crude Oil Trading, Bitcoin Trading, OpenClaw, AI Trading Assistant\r\n\r\n---\r\n\r\n## File Structure\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # This documentation\r\n├── mql4/                            # MT4 EA compiled files (.ex4, generated by script)\r\n│   [Manually download .ex4 files here]\r\n├── scripts/                         # Python scripts\r\n│   ├── mt4_client.py                # Python trading client (core)\r\n│   ├── deploy_ex4.py                # EA deployment guide (shows download links & steps)\r\n│   ├── alert_commands.py            # Price alert CLI tool\r\n│   ├── position_summary.py          # Position summary (CLI output)\r\n│   ├── position_summary_cron.py     # Position summary (scheduled push)\r\n│   ├── sr_strategy.py               # Support/Resistance strategy orchestrator\r\n│   └── summary_utils.py             # Position summary utility module\r\n└── references/\r\n    └── api_docs.md                  # Full API reference\r\n```\r\n\r\n---\r\n\r\n## Installation\r\n\r\n### Step 1: Find Your MT4 Data Directory\r\n\r\nEach MT4 installation has a unique data directory:\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32-char-random-ID>\r\n```\r\n\r\n> How to find it? In MT4, press F7 to open MetaEditor, then click File -> Open Data Folder.\r\n\r\n### Step 2: Confirm MT4 Directory\r\n\r\nEA files go into two directories:\r\n\r\n| EA File | Target Directory | Notes |\r\n|---------|-----------------|-------|\r\n| mt4_bridge.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Core EA (required) |\r\n| SesameGridV2.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Grid strategy EA (optional) |\r\n| tools2.3.ex4 | MT4_Install_Dir\\MQL4\\Libraries\\ | Grid dependency (required if using grid) |\r\n\r\n> Libraries is at the same level as Experts — NOT a subdirectory of Experts.\r\n\r\n### Step 3: Download .ex4 Files\r\n\r\nFrom Gitee: https://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\nFiles: mt4_bridge.ex4 (required), SesameGridV2.ex4 (optional), tools2.3.ex4 (grid dependency).\r\n\r\n### Step 4: Attach EAs in MT4\r\n\r\nDrag mt4_bridge onto any chart. In properties -> Common tab: check \"Allow live trading\" and \"Allow DLL imports\". Green smiley means working.\r\n\r\nOptional: Attach SesameGridV2 on grid-trading charts.\r\n\r\n### Step 5: Enable Auto Trading\r\n\r\nClick the yellow play icon (unicode triangle) on MT4 toolbar to turn it green.\r\n\r\n### Step 6: Verify\r\n\r\nRun: python mt4_client.py\r\n\r\n---\r\n\r\n## Core Python Methods\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# Market Data\r\nclient.get_price(\"XAUUSD.s\")           # Real-time quote\r\nclient.get_positions()                 # Open positions\r\nclient.get_account_info()              # Account info\r\nclient.get_history(7)                  # Order history (7 days)\r\n\r\n# Trading\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.close(ticket=123456)\r\nclient.close_all()                     # Close all positions\r\n\r\n# SL/TP\r\nclient.set_sl(ticket=123456, sl=75000)\r\nclient.set_tp(ticket=123456, tp=80000)\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000)\r\nclient.trailing_stop(ticket=123456, distance=300)\r\n\r\n# Pending Orders\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0)\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\r\nclient.get_pending_orders()\r\nclient.cancel_pending(ticket=123456)\r\n\r\n# Kline Data\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\r\n\r\n# Support & Resistance\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n> Use keyword arguments for all trading methods!\r\n\r\n---\r\n\r\n## Grid Strategy\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| grid_start(symbol) | Start grid |\r\n| grid_stop(symbol) | Stop grid |\r\n| grid_close_all(symbol) | Close grid orders |\r\n| grid_status(symbol) | Check status |\r\n\r\nFor closing grid: call grid_stop() first, then grid_close_all().\r\n\r\n---\r\n\r\n## Symbol Codes\r\n\r\n| Instrument | Code |\r\n|------------|------|\r\n| Gold | XAUUSD.s |\r\n| Bitcoin | BTCUSD |\r\n| Crude Oil | XTIUSD.s |\r\n| Silver | XAGUSD.s |\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n| Issue | Solution |\r\n|-------|----------|\r\n| MT4 Timeout | EA not attached or auto-trading off |\r\n| error 4106 | \"Allow live trading\" unchecked |\r\n| Empty price result | Wrong symbol code |\r\n| Duplicate orders | Use v1.84+ for symbol-specific files |\r\n| BTC market order fails | Some brokers disable BTC market orders |\r\n---\r\n\r\n## Communication & Feedback\r\n\r\nJoin the **MT4 Automated Trading Technical Group** to discuss MT4 auto trading, Python quantitative trading, EA development, and more topics.\r\n\r\nSearch WeChat: jiaoyibaohe to add me as a friend, or scan the QR code below, note **MT4** to join the group.\r\n\r\n[Click to add WeChat friend via QR code]\r\n\r\nhttps://raw.giteeusercontent.com/3603317/skill-plugin/raw/master/mt4/wechat_qrcode.jpg?metadata=eyJyIjoibWFzdGVyIiwiZnAiOiJtdDQvd2VjaGF0X3FyY29kZS5qcGciLCJwaWQiOjQ3NjA1NjM4LCJzdG8iOiJnaXQtc2hhcmRpbmctc3RvLTEwdC0wMjMiLCJycCI6InJlcG9zL2I4LzJkL2I4MmRlZDkxOWUzMWM5NTFhZGZlMGM4MGYzZmViYjA4YTdmYmRhZjM1OTdiNDEwOWQ5MDk4MzQ4MDdhODYwNWIuZ2l0IiwiaXNwIjp0cnVlLCJleHBpcmVfYXQiOjE3NzgyNDk0MDB9&signature=ibfrHgLRLbDOo0GvUYOPwQiCdS0O6kEnq91Py3Z5opQ\r\n\r\n> �� Scan the QR code to add WeChat friend, note **MT4** to join the technical group.\r\n> Topics: installation issues, usage tips, feature suggestions, bug reports.\r\n---\n\nFile v1.1.11:_meta.json\n\n{\n  \"ownerId\": \"kn723gzdjbmh391jks7n35xdf982v5y7\",\n  \"slug\": \"mt4-trader\",\n  \"version\": \"1.1.11\",\n  \"publishedAt\": 1778249993926\n}\n\nFile v1.1.11:references/api_docs.md\n\n# MT4 Bridge API 完整文档\r\n\r\n## 通信原理\r\n\r\n**协议**：JSON over 文件（零 DLL 依赖）\r\n\r\n```\r\n┌──────────┐  request_{symbol}.json  ┌──────────────┐\r\n│  Python   │ ──────────────────────→│  MT4 EA      │\r\n│  Client   │ ←──────────────────────│  (on chart)   │\r\n└──────────┘  response_{symbol}.json └──────────────┘\r\n```\r\n\r\n**目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- 品种专属文件名：`request_XAUUSD.s.json`、`response_XAUUSD.s.json`\r\n- 多品种共用时，每个 EA 实例自动读写自己的品种文件\r\n\r\n**文件锁机制**：Python 客户端创建 `.lock` 文件防止读写冲突，EA 检测到锁文件时等待后重试。\r\n\r\n**超时**：5 秒（Python 客户端默认），超时返回 `\"MT4 超时未响应\"`。\r\n\r\n---\r\n\r\n## 方法一览（共 57+ 方法）\r\n\r\n### 行情查询（11 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `get_price()` | 获取实时报价（bid/ask） | `symbol` |\r\n| `get_positions()` | 获取持仓列表 | — |\r\n| `get_account_info()` | 获取账户信息（余额/净值/保证金等） | — |\r\n| `get_history()` | 获取历史订单 | `days` |\r\n| `calc_lots()` | 按风险%计算手数 | `symbol`, `risk_percent`, `sl_distance` |\r\n| `get_klines()` | 获取 K 线（OHLCV）数据 | `symbol`, `timeframe`, `count` |\r\n| `get_sr_levels()` | 获取支撑压力位 | `symbol` |\r\n| `get_pending_orders()` | 查询当前挂单 | — |\r\n| `get_alert_count()` | 获取当前预警数量 | — |\r\n| `check_prices()` | 手动触发价格预警检查 | — |\r\n| `get_orders_history_by_date()` | 按日期范围查询历史订单 | `from_date`, `to_date` |\r\n\r\n### 市价交易（7 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `buy()` | 市价买入开仓 | `symbol`, `lots` |\r\n| `sell()` | 市价卖出开仓 | `symbol`, `lots` |\r\n| `close()` | 平指定订单 | `ticket` |\r\n| `close_all()` | 一键全部平仓 | — |\r\n| `close_all_buy()` | 平所有多单 | — |\r\n| `close_all_sell()` | 平所有空单 | — |\r\n| `partial_close()` | 部分平仓 | `ticket`, `lots` |\r\n\r\n### 挂单交易（6 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `buy_limit()` | 限价买入（低于现价挂买单） | `symbol`, `lots`, `price` |\r\n| `sell_limit()` | 限价卖出（高于现价挂卖单） | `symbol`, `lots`, `price` |\r\n| `buy_stop()` | 买入止损（高于现价追涨） | `symbol`, `lots`, `price` |\r\n| `sell_stop()` | 卖出止损（低于现价追空） | `symbol`, `lots`, `price` |\r\n| `cancel_pending()` | 取消挂单 | `ticket` |\r\n| `oco_order()` | OCO 二选一订单 | `symbol`, `lots`, `order1`, `order2` |\r\n\r\n### 止损止盈（9 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `set_sl()` | 设置止损价 | `ticket`, `sl` |\r\n| `set_tp()` | 设置止盈价 | `ticket`, `tp` |\r\n| `modify_order()` | 同时修改止损止盈 | `ticket`, `sl`, `tp` |\r\n| `set_tp_by_profit()` | 按盈利金额设置止盈 | `ticket`, `profit` |\r\n| `close_by_magic()` | 按 Magic Number 平仓 | `magic` |\r\n| `auto_sl()` | 按账户风险%自动止损 | `ticket`, `risk_percent` |\r\n| `atr_sl()` | ATR 动态止损 | `ticket`, `period`, `multiplier` |\r\n| `trailing_stop()` | 移动止损 | `ticket`, `distance` |\r\n| `close_profit()` | 平所有盈利单 | — |\r\n| `close_loss()` | 平所有亏损单 | — |\r\n\r\n### 芝麻网格策略（8 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `grid_start()` | 启动网格 | `symbol` |\r\n| `grid_stop()` | 停止网格（停止开新单） | `symbol` |\r\n| `grid_close_all()` | 平所有网格持仓 | `symbol` |\r\n| `grid_status()` | 查询网格运行状态 | `symbol` |\r\n| `grid_set_sl_tp()` | 批量设置网格单止损止盈 | `symbol` |\r\n| `grid_start_buy()` | 网格买入一笔 | `symbol` |\r\n| `grid_start_sell()` | 网格卖出一笔 | `symbol` |\r\n| `grid_reverse()` | 网格反向 | `symbol`, `lots` |\r\n\r\n### 支撑压力位/画线（5 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `draw_sr_levels()` | 在图表上画出支撑压力位 | `symbol` |\r\n| `draw_trendline()` | 画趋势线 | `symbol`, `price1`, `price2`, `label` |\r\n| `draw_hline()` | 画水平线 | `symbol`, `price`, `label` |\r\n| `draw_vline()` | 画垂直线 | `symbol`, `time`, `label` |\r\n| `delete_object()` | 删除画线对象 | `symbol`, `name` |\r\n\r\n### 价格预警（6 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `add_alert()` | 添加价格预警 | `type`, `value` |\r\n| `list_alerts()` | 查看所有预警 | — |\r\n| `cancel_alert()` | 取消指定预警 | `index` |\r\n| `clear_alerts()` | 清除所有预警 | — |\r\n| `check_alerts()` | 手动触发预警检查 | — |\r\n| `get_alert_count()` | 获取预警数量 | — |\r\n\r\n### 辅助（8 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `set_magic_override()` | 设置自定义 Magic Number | `magic` |\r\n| `set_timeout()` | 设置超时时间（秒） | `seconds` |\r\n| `set_retry()` | 设置重试次数 | `count` |\r\n| `get_bridge_dir()` | 获取桥接目录路径 | — |\r\n| `_transact()` | 底层交易方法（内部使用） | — |\r\n| `safe_close_all()` | 安全全平（含错误处理） | `symbol` |\r\n| `set_default_symbol()` | 设置默认品种 | `symbol` |\r\n\r\n---\r\n\r\n## 详细文档\r\n\r\n### get_price(symbol) —— 获取实时报价\r\n\r\n获取指定品种的当前买价（bid）和卖价（ask）。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码，如 \"XAUUSD.s\"、\"BTCUSD\" |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_price\", \"symbol\": \"XAUUSD.s\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"bid\": 4565.20,\r\n  \"ask\": 4565.70,\r\n  \"time\": \"2026-05-04 12:30:00\"\r\n}\r\n```\r\n\r\n**失败响应：**\r\n```json\r\n{\"status\": \"error\", \"error\": \"无法获取价格: XAUUSD.s\"}\r\n```\r\n\r\n**Python 示例：**\r\n```python\r\nprice = client.get_price(symbol=\"XAUUSD.s\")\r\nprint(price)\r\n# {'status': 'success', 'symbol': 'XAUUSD.s', 'bid': 4565.20, 'ask': 4565.70, 'time': '...'}\r\n```\r\n\r\n---\r\n\r\n### get_positions() —— 查询持仓\r\n\r\n查询当前所有未平仓订单。\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_positions\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 2,\r\n  \"positions\": [\r\n    {\r\n      \"ticket\": 95308752,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"buy\",\r\n      \"lots\": 0.05,\r\n      \"open_price\": 4580.35,\r\n      \"current_price\": 4595.00,\r\n      \"sl\": 4573.00,\r\n      \"tp\": 4588.00,\r\n      \"profit\": 7.25,\r\n      \"swap\": 0.00,\r\n      \"commission\": -0.25,\r\n      \"magic\": 888888,\r\n      \"open_time\": \"2026-05-01 07:56:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n> 注意：当持仓为 0 时，返回 `{\"status\": \"success\", \"count\": 0, \"positions\": []}`\r\n\r\n**Python 代码：**\r\n```python\r\npositions = client.get_positions()\r\nif positions[\"count\"] > 0:\r\n    for pos in positions[\"positions\"]:\r\n        print(f\"{pos['type']} {pos['symbol']} {pos['lots']} lot @ {pos['open_price']}\")\r\nelse:\r\n    print(\"0 持仓\")\r\n```\r\n\r\n---\r\n\r\n### get_account_info() —— 获取账户信息\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_account_info\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"balance\": 10000.00,\r\n  \"equity\": 10007.25,\r\n  \"margin\": 500.00,\r\n  \"free_margin\": 9507.25,\r\n  \"margin_level\": 2001.45,\r\n  \"leverage\": \"1:100\",\r\n  \"currency\": \"USD\",\r\n  \"server\": \"EBCFinancial-Demo01\",\r\n  \"company\": \"EBC Financial Group\",\r\n  \"name\": \"Demo Account\",\r\n  \"number\": 12345678\r\n}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\ninfo = client.get_account_info()\r\nprint(f\"余额: ${info['balance']:.2f}\")\r\nprint(f\"净值: ${info['equity']:.2f}\")\r\nprint(f\"保证金比例: {info['margin_level']:.1f}%\")\r\n```\r\n\r\n---\r\n\r\n### get_history(days) —— 查询历史订单\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `days` | int | ✅ | 查询最近多少天的历史（1~365） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_history\", \"days\": 7}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 15,\r\n  \"orders\": [\r\n    {\r\n      \"ticket\": 94854144,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"sell\",\r\n      \"lots\": 0.05,\r\n      \"open_price\": 4565.20,\r\n      \"close_price\": 4555.30,\r\n      \"profit\": 9.10,\r\n      \"open_time\": \"2026-04-29 10:00:00\",\r\n      \"close_time\": \"2026-04-29 14:30:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### buy(symbol, lots) / sell(symbol, lots) —— 市价开仓\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `lots` | float | ✅ | 手数（如 0.01、0.05、0.10） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"buy\", \"symbol\": \"XAUUSD.s\", \"lots\": \"0.05\", \"price\": \"0\"}\r\n```\r\n\r\n> `price: \"0\"` 表示市价单。如果传具体价格则为限价单（不推荐，用 buy_limit/sell_limit 更明确）。\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"buy\",\r\n  \"ticket\": 95308752,\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"lots\": 0.05,\r\n  \"price\": 4580.35\r\n}\r\n```\r\n\r\n**失败响应（4106）：**\r\n```json\r\n{\"status\": \"error\", \"error\": \"买入失败: Trade is disabled [4106]\"}\r\n```\r\n\r\n> 常见 4106 原因：EA 属性中未勾选\"允许实时交易\"，或 MT4 自动交易按钮为关闭状态。\r\n\r\n**Python 代码：**\r\n```python\r\n# ✅ 正确用法\r\nresult = client.buy(symbol=\"XAUUSD.s\", lots=0.05)\r\n\r\n# ❌ 错误用法（参数顺序问题！）\r\nresult = client.buy(0.05, \"XAUUSD.s\")  # 可能会报 4106 错误\r\n\r\nif result[\"status\"] == \"success\":\r\n    print(f\"开仓成功，ticket: {result['ticket']}\")\r\nelse:\r\n    print(f\"开仓失败: {result['error']}\")\r\n```\r\n\r\n---\r\n\r\n### close(ticket) —— 平仓\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close\", \"ticket\": \"95308752\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"close\",\r\n  \"ticket\": 95308752\r\n}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\nresult = client.close(ticket=95308752)\r\n```\r\n\r\n---\r\n\r\n### close_all() —— 一键全平\r\n\r\n平掉所有持仓单。\r\n\r\n> ⚠️ 注意：网格策略的持仓单（magic=777777）不受此命令影响，需使用 `grid_stop` + `grid_close_all` 平网格单。\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_all\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"close_all\", \"message\": \"closed 5 orders\"}\r\n```\r\n\r\n---\r\n\r\n### close_all_buy() / close_all_sell() —— 按方向平仓\r\n\r\n**close_all_buy** —— 平所有多单\r\n**close_all_sell** —— 平所有空单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_all_buy\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"message\": \"closed 3 buy\"}\r\n```\r\n\r\n---\r\n\r\n### close_profit() / close_loss() —— 按盈亏平仓\r\n\r\n**close_profit** —— 平所有盈利持仓（`profit + swap + commission > 0`）\r\n**close_loss** —— 平所有亏损持仓（`profit + swap + commission < 0`）\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_profit\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"message\": \"closed 2 profit\"}\r\n```\r\n\r\n---\r\n\r\n### partial_close(ticket, lots) —— 部分平仓\r\n\r\n部分平掉指定订单的部分手数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `lots` | float | ✅ | 平掉的手数（必须小于持仓量） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"partial_close\", \"ticket\": \"95308752\", \"lots\": \"0.02\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"partial_close\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### buy_limit / sell_limit / buy_stop / sell_stop —— 挂单\r\n\r\n**buy_limit(symbol, lots, price)** —— 限价买单（低于当前市价挂多单，期待价格回踩买入）\r\n\r\n**sell_limit(symbol, lots, price)** —— 限价卖单（高于当前市价挂空单，期待价格反弹卖出）\r\n\r\n**buy_stop(symbol, lots, price)** —— 买入止损单（高于当前市价挂多单，期待价格突破追涨）\r\n\r\n**sell_stop(symbol, lots, price)** —— 卖出止损单（低于当前市价挂空单，期待价格破位追空）\r\n\r\n**请求 JSON（以 buy_limit 为例）：**\r\n```json\r\n{\"action\": \"buy_limit\", \"symbol\": \"XAUUSD.s\", \"lots\": \"0.03\", \"price\": \"4500.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"buy_limit\", \"ticket\": 95412345}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\n# 黄金回调到 4500 买入\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.00)\r\n\r\n# BTC 突破 80000 追涨\r\nclient.buy_stop(symbol=\"BTCUSD\", lots=0.01, price=80000.00)\r\n```\r\n\r\n---\r\n\r\n### get_pending_orders() —— 查询挂单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_pending_orders\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 2,\r\n  \"orders\": [\r\n    {\r\n      \"ticket\": 95412345,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"buy_limit\",\r\n      \"lots\": 0.03,\r\n      \"price\": 4500.00,\r\n      \"sl\": 0,\r\n      \"tp\": 0,\r\n      \"open_time\": \"2026-05-04 10:00:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### cancel_pending(ticket) —— 取消挂单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"cancel_pending\", \"ticket\": \"95412345\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"cancel_pending\", \"ticket\": 95412345}\r\n```\r\n\r\n---\r\n\r\n### oco_order(symbol, lots, order1, order2) —— OCO 二选一订单\r\n\r\n同时挂两个方向相反的挂单，其中一个成交后自动取消另一个。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `lots` | float | ✅ | 手数 |\r\n| `order1` | dict | ✅ | 第一个挂单定义 |\r\n| `order2` | dict | ✅ | 第二个挂单定义 |\r\n\r\norder1/order2 格式：\r\n```python\r\n{\r\n    \"type\": \"buy_stop|sell_stop|buy_limit|sell_limit\",\r\n    \"price\": 77000,\r\n    \"sl\": 76500,      # 可选\r\n    \"tp\": 78000       # 可选\r\n}\r\n```\r\n\r\n**请求 JSON：**\r\n```json\r\n{\r\n  \"action\": \"oco_order\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"lots\": \"0.03\",\r\n  \"order1\": {\"type\": \"buy_stop\", \"price\": \"77000\", \"sl\": \"76500\"},\r\n  \"order2\": {\"type\": \"sell_stop\", \"price\": \"76000\", \"sl\": \"76500\"}\r\n}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"oco_order\",\r\n  \"order1_ticket\": 95420001,\r\n  \"order2_ticket\": 95420002\r\n}\r\n```\r\n\r\n---\r\n\r\n### set_sl(ticket, sl) / set_tp(ticket, tp) —— 设置止损止盈\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `sl` | float | ✅ (set_sl) | 止损价格 |\r\n| `tp` | float | ✅ (set_tp) | 止盈价格 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"set_sl\", \"ticket\": \"95308752\", \"sl\": \"4573.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"set_sl\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### modify_order(ticket, sl, tp) —— 同时修改止损止盈\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `sl` | float | ✅ | 新止损价 |\r\n| `tp` | float | ✅ | 新止盈价 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"modify_order\", \"ticket\": \"95308752\", \"sl\": \"4570.00\", \"tp\": \"4600.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"modify_order\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### close_by_magic(magic) —— 按 Magic Number 平仓\r\n\r\n平掉所有指定 Magic Number 的持仓。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `magic` | int | ✅ | Magic Number |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_by_magic\", \"magic\": \"888888\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"close_by_magic\", \"closed\": 5}\r\n```\r\n\r\n---\r\n\r\n### set_tp_by_profit(ticket, profit) —— 按盈利金额设止盈\r\n\r\n设置止盈价为当前价格 + 目标盈利金额对应的点数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `profit` | float | ✅ | 目标盈利金额（美元） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"set_tp_by_profit\", \"ticket\": \"95308752\", \"profit\": \"20.00\"}\r\n```\r\n\r\n---\r\n\r\n### auto_sl(ticket, risk_percent) —— 按账户风险%止损\r\n\r\n根据账户余额计算止损价，防止单笔亏损超过指定比例。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `risk_percent` | float | ✅ | 风险比例（如 2.0 = 2%） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 限制该笔最大亏损为账户余额的 2%\r\nclient.auto_sl(ticket=95308752, risk_percent=2.0)\r\n```\r\n\r\n---\r\n\r\n### atr_sl(ticket, period, multiplier) —— ATR 动态止损\r\n\r\n基于 ATR（Average True Range，平均真实波幅）指标设置止损。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `period` | int | ✅ | ATR 计算周期（推荐 14） |\r\n| `multiplier` | float | ✅ | ATR 倍数（推荐 2.0） |\r\n\r\n**ATR 倍数参考：**\r\n| 交易风格 | 倍数 | 说明 |\r\n|---------|------|------|\r\n| 激进日内 | 1.5x | 止损窄，易被扫 |\r\n| 标准日内 | **2.0x** | ✅ 推荐 |\r\n| 宽松/波段 | 3.0x | 容错空间大 |\r\n\r\n**Python 示例：**\r\n```python\r\n# 黄金多单，14周期 ATR，2 倍止损\r\nclient.atr_sl(ticket=95308752, period=14, multiplier=2.0)\r\n```\r\n\r\n---\r\n\r\n### trailing_stop(ticket, distance) —— 移动止损\r\n\r\n当价格朝有利方向移动时，自动上移止损线，锁住利润。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `distance` | int | ✅ | 止损距离（点数，如 300 = 300 点） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 持仓价向有利方向移动超过 300 点时，止损自动上移 300 点跟随\r\nclient.trailing_stop(ticket=95308752, distance=300)\r\n```\r\n\r\n---\r\n\r\n### calc_lots(symbol, risk_percent, sl_distance) —— 手数计算\r\n\r\n根据账户余额、风险百分比和止损距离计算建议交易手数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `risk_percent` | float | ✅ | 该笔所愿承受的风险（账户余额的百分比） |\r\n| `sl_distance` | float | ✅ | 止损距离（美元） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 黄金，1% 风险，止损 5 美元 → 返回建议手数\r\nlots = client.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\nprint(f\"建议手数: {lots}\")\r\n```\r\n\r\n---\r\n\r\n### get_klines(symbol, timeframe, count) —— K 线数据\r\n\r\n获取历史 K 线数据（开盘价/最高价/最低价/收盘价/成交量），用于量化分析。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `timeframe` | str | ✅ | 周期：M1, M5, M15, M30, H1, H4, D1, W1, MN |\r\n| `count` | int | ✅ | 获取的 K 线数量（最大 1000） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_klines\", \"symbol\": \"XAUUSD.s\", \"timeframe\": \"H1\", \"count\": \"20\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"timeframe\": \"H1\",\r\n  \"count\": 20,\r\n  \"data\": [\r\n    {\"time\": \"2026-05-04 08:00:00\", \"open\": 4560.0, \"high\": 4570.0, \"low\": 4558.0, \"close\": 4568.0, \"volume\": 1200},\r\n    {\"time\": \"2026-05-04 09:00:00\", \"open\": 4568.0, \"high\": 4575.0, \"low\": 4565.0, \"close\": 4572.0, \"volume\": 1500}\r\n  ]\r\n}\r\n```\r\n\r\n**支持的周期：**\r\n| 参数 | 含义 |\r\n|------|------|\r\n| M1, M5, M15, M30 | 分钟 |\r\n| H1, H4 | 小时 |\r\n| D1 | 日线 |\r\n| W1 | 周线 |\r\n| MN | 月线 |\r\n\r\n**Python 示例：**\r\n```python\r\n# 获取最近 20 根 H1 K 线\r\nklines = client.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\r\nfor k in klines[\"data\"]:\r\n    print(f\"{k['time']} O:{k['open']} H:{k['high']} L:{k['low']} C:{k['close']}\")\r\n```\r\n\r\n---\r\n\r\n## 网格策略 API（芝麻网格 EA）\r\n\r\n网格策略通过独立的芝麻网格 EA（magic=777777）运行，使用 `grid_bridge` 目录通信。\r\n\r\n> ⚠️ 重要约束：\r\n> - 平网格仓必须：`grid_stop()` → `grid_close_all()` 两步\r\n> - `close_all()` 命令会拒绝 magic=777777 的订单\r\n> - 网格单的精确持仓查询通过 `grid_status()` 完成\r\n\r\n### grid_start(symbol) —— 启动网格\r\n\r\n在指定品种上启动网格策略。EA 会根据预设参数在价格区间内自动分批挂单。\r\n\r\n```python\r\nclient.grid_start(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"grid_start\", \"message\": \"grid started\"}\r\n```\r\n\r\n### grid_stop(symbol) —— 停止网格\r\n\r\n停止网格 EA 继续开新单。已开的持仓单不受影响。\r\n\r\n```python\r\nclient.grid_stop(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n### grid_close_all(symbol) —— 平所有网格单\r\n\r\n平掉所有网格策略的持仓单。\r\n\r\n```python\r\nclient.grid_close_all(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n> 强烈建议先 `grid_stop()` 再 `grid_close_all()`，防止平仓过程中网格 EA 又开新单。\r\n\r\n### grid_status(symbol) —— 网格状态查询\r\n\r\n```python\r\nstatus = client.grid_status(symbol=\"XAUUSD.s\")\r\nprint(status)\r\n# {'status': 'success', 'running': True, 'orders': [...], 'profit': 12.50, ...}\r\n```\r\n\r\n---\r\n\r\n## 价格预警 API\r\n\r\n预警系统支持以下类型：\r\n\r\n| 预警类型 | 说明 | value 含义 |\r\n|---------|------|-----------|\r\n| `profit` | 总盈利达到目标时触发 | 目标盈利金额（美元） |\r\n| `above` | 价格突破时触发 | 突破价格 |\r\n| `below` | 价格跌破时触发 | 跌破价格 |\r\n\r\n### add_alert(type, value) —— 添加预警\r\n\r\n```python\r\n# 盈利达到 $20 提醒\r\nclient.add_alert(type=\"profit\", value=20)\r\n# BTC 突破 77000 提醒\r\nclient.add_alert(type=\"above\", value=77000)\r\n# BTC 跌破 75000 提醒\r\nclient.add_alert(type=\"below\", value=75000)\r\n```\r\n\r\n### list_alerts() —— 查看预警\r\n\r\n```python\r\nalerts = client.list_alerts()\r\n```\r\n\r\n### cancel_alert(index) —— 取消预警\r\n\r\n```python\r\nclient.cancel_alert(index=3)\r\n```\r\n\r\n### clear_alerts() —— 清除所有预警\r\n\r\n```python\r\nclient.clear_alerts()\r\n```\r\n\r\n---\r\n\r\n## 品种代码速查\r\n\r\n| 品种 | 标准代码 | 注意 |\r\n|------|---------|------|\r\n| 黄金 | `XAUUSD.s` | 部分经纪商为 XAUUSD（无 .s） |\r\n| 白银 | `XAGUSD.s` | 或 XAGUSD |\r\n| 原油 WTI | `XTIUSD.s` | 或 USOIL、CL |\r\n| 布伦特原油 | `XBRUSD` | 或 UKOIL |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 以太坊 | `ETHUSD` | 部分平台不支持 |\r\n| 欧元/美元 | `EURUSD` | 标准外汇货币对 |\r\n| 英镑/美元 | `GBPUSD` | 标准外汇货币对 |\r\n| 美元/日元 | `USDJPY` | 标准外汇货币对 |\r\n\r\n> 品种代码因经纪商而异。如果报错\"无法获取价格\"，请在 MT4 市场报价中右键 → \"全部显示\"确认精确名称。\r\n\r\n---\r\n\r\n## 错误码参考\r\n\r\n| 错误码 | 含义 | 常见原因 |\r\n|--------|------|---------|\r\n| 4106 | 交易被禁用 | 未勾选\"允许实时交易\"或自动交易按钮关闭 |\r\n| 4107 | 市场关闭 | 经纪商休市（周末常见） |\r\n| 4108 | 无效单量 | 手数超出允许范围 |\r\n| 4111 | 交易超时 | 服务器繁忙 |\r\n| 4113 | 无效价格 | 挂单价格超出当前市价范围 |\r\n| 4200 | 保证金不足 | 可用保证金不够开仓 |\r\n| 4202 | 已停止交易 | 账户已被冻结或限制 |\r\n| 4001 | 品种被禁用 | 该品种不允许交易 |\r\n| 4002 | 无效品种 | 品种名称不正确 |\r\n| 1000 | 超时 | 请求发出后 5 秒内无响应 |\r\n\r\n---\r\n\r\n## 常见使用模式\r\n\r\n### 模式 1：日内黄金交易\r\n\r\n```python\r\n# 开多\r\nresult = client.buy(symbol=\"XAUUSD.s\", lots=0.05)\r\nticket = result[\"ticket\"]\r\n\r\n# 设置 ATR 止损\r\nclient.atr_sl(ticket=ticket, period=14, multiplier=2.0)\r\n\r\n# 设置止盈\r\nclient.set_tp(ticket=ticket, tp=4605.00)\r\n```\r\n\r\n### 模式 2：网格策略完整流程\r\n\r\n```python\r\n# 启动网格\r\nclient.grid_start(symbol=\"XAUUSD.s\")\r\n\r\n# 查看状态\r\nstatus = client.grid_status(symbol=\"XAUUSD.s\")\r\n\r\n# 停止网格 + 平仓\r\nclient.grid_stop(symbol=\"XAUUSD.s\")\r\nclient.grid_close_all(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n### 模式 3：OCO 双向挂单\r\n\r\n```python\r\n# 黄金突破追涨 / 破位追空\r\nclient.oco_order(\r\n    symbol=\"XAUUSD.s\",\r\n    lots=0.03,\r\n    order1={\"type\": \"buy_stop\", \"price\": 4620.00, \"sl\": 4580.00},\r\n    order2={\"type\": \"sell_stop\", \"price\": 4560.00, \"sl\": 4600.00}\r\n)\r\n```\r\n\r\n### 模式 4：移动止损锁利\r\n\r\n```python\r\nticket = client.buy(symbol=\"XAUUSD.s\", lots=0.03)[\"ticket\"]\r\n# 价格朝有利方向移动时，止损自动跟随\r\nclient.trailing_stop(ticket=ticket, distance=300)\r\n```\n\nArchive v1.1.10: 10 files, 32841 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (20043b), _meta.json (130b)\n\nFile v1.1.10:SKILL.md\n\n# MT4 智能交易桥 · 量化自动交易系统\r\n\r\nMT4 智能交易桥。通过文件 I/O 与 MT4 EA 通信，无需 DLL 或额外依赖。支持 OpenClaw（小龙虾 AI Agent）通过微信 / 飞书 / Telegram 等渠道直接操作 MT4 交易。\r\n\r\n> **关键词**：MT4, MetaTrader 4, 外汇交易, Python交易, 算法交易, 自动交易, 网格策略, 支撑压力位, ATR止损, 移动止损, 黄金交易, 原油交易, 比特币交易, OpenClaw, 小龙虾, AI交易助手, 微信操作MT4, 飞书操作MT4\r\n\r\n---\r\n\r\n## 文件结构\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # 本使用说明\r\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\r\n│   [用户手动下载 .ex4 文件放到此目录]\r\n├── scripts/                         # Python 脚本\r\n│   ├── mt4_client.py                # Python 交易客户端（核心）\r\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\r\n│   ├── alert_commands.py            # 价格预警命令行工具\r\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\r\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\r\n│   ├── sr_strategy.py               # 支撑压力位策略编排\r\n│   └── summary_utils.py             # 持仓汇总工具模块\r\n└── references/\r\n    └── api_docs.md                  # 完整 API 参考文档\r\n```\r\n\r\n---\r\n\r\n## 安装步骤（详细版）\r\n\r\n### 第一步：找到你的 MT4 数据目录\r\n\r\n每个 MT4 安装实例都有一个专属的数据目录，格式为：\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>\r\n```\r\n\r\n例如：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\ABC123...`\r\n\r\n> 怎么找？在 MT4 中按 `F7` 打开 MetaEditor（代码编辑器），点击菜单 `文件 → 打开数据文件夹`，弹出的路径就是你的 MT4 数据目录。\r\n\r\n### 第二步：确认 MT4 安装目录\r\n\r\nEA 文件需要部署到两个不同的目录：\r\n\r\n| EA 文件 | 目标目录 | 说明 |\r\n|---------|---------|------|\r\n| `mt4_bridge.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 主程序 EA（必须） |\r\n| `芝麻网格V2.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | `MT4安装目录\\MQL4\\Libraries\\` | **网格策略依赖库**（网格必须，不是 Experts！） |\r\n\r\n> ⚠️ `Libraries` 目录与 `Experts`、`Indicators` 同级，**不是** `Experts` 的子目录。\r\n\r\n典型路径结构：\r\n```\r\nC:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\r\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\r\n│   ├── mt4_bridge.ex4\r\n│   └── 芝麻网格V2.ex4\r\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\r\n│   └── tools2.3.ex4\r\n├── Indicators\\\r\n└── Scripts\\\r\n```\r\n\r\n### 第三步：下载 .ex4 文件\r\n\r\n从 Gitee 仓库下载 3 个 .ex4 文件：\r\n\r\nhttps://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\n需要下载的文件：\r\n\r\n| 文件 | 说明 |\r\n|------|------|\r\n| `mt4_bridge.ex4` | 主程序 EA（**必选**） |\r\n| `芝麻网格V2.ex4` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | 网格策略依赖库（选网格则必选） |\r\n\r\n> 点击文件 → 点右上角 **Raw** 按钮即可保存到本地。\r\n\r\n下载后放入 skills\\mt4-trader\\mql4\\ 目录，然后运行以下命令一键部署到 MT4：\r\n\r\n```bash\r\ncd scripts\\\r\npython deploy_ex4.py deploy\r\n```\r\n\r\n### 第四步：在 MT4 中挂载 EA\r\n\r\n**挂载 mt4_bridge（核心，必须操作）：**\r\n1. 打开 MT4，按 `Ctrl+N` 打开左侧\"导航器\"面板\r\n2. 展开\"EA 交易\"列表，找到 `mt4_bridge`\r\n3. 用鼠标左键拖拽到任意品种图表上（推荐 XAUUSD.s 或主流品种）\r\n4. 弹出 EA 属性对话框 → **选项卡\"常用\"**：\r\n   - **允许实时交易** → ✅ 勾选（必须！）\r\n   - **允许导入 DLL** → ✅ 勾选\r\n   - **确认取消\"手动交易禁止\"** 等限制\r\n5. 点\"确定\"关闭对话框\r\n6. 图表右上角显示一个 EA 图标：\r\n   - 😊 **绿色笑脸** → ✅ 正常工作中\r\n   - 😢 哭脸或灰脸 → 检查下面\"第五步\"的自动交易按钮\r\n7. **右键图表 → 属性 → 常用** 中可修改 EA 输入参数（可选）\r\n\r\n**可选：挂载芝麻网格 EA：**\r\n1. 将 `芝麻网格V2` EA 拖到需要跑网格的品种图表上（如 XAUUSD.s、XTIUSD.s）\r\n2. 勾选\"允许实时交易\"\r\n3. **确认 `tools2.3.ex4` 已放在 `Libraries\\` 目录中**，否则网格 EA 无法运行\r\n\r\n**多图表挂载（重要）：**\r\n- mt4_bridge EA 可以挂载在**多个品种**的图表上（例如黄金一个图表、原油一个图表）\r\n- 每个 EA 实例自动通过品种专属请求文件区分，不会互相干扰\r\n- Python 客户端传了 `symbol` 参数后，会自动路由到对应的品种请求文件\r\n\r\n### 第五步：开启自动交易\r\n\r\n这是新手最容易忽略的一步！\r\n\r\n1. 在 MT4 工具栏上方找到 **\"自动交易\"按钮**（一个黄色播放 ▶️ 图标）\r\n2. 如果它是 **灰色** 的 → 点击一下，变成 **绿色** ✅\r\n3. 此时所有已挂载的 EA 图标都应变成 **绿色笑脸** 😊\r\n4. 如果某个 EA 还是哭脸，右键该 EA 图标 → \"属性\" → 勾选\"允许实时交易\"\r\n\r\n> 💡 每次重启 MT4 后，自动交易按钮默认为关闭状态，需要手动开启。\r\n> 建议在 MT4 设置中勾选\"启动时启用自动交易\"。\r\n\r\n### 第六步：验证部署是否成功\r\n\r\n**方法一：脚本检查**\r\n```bash\r\ncd scripts\\\r\npython mt4_client.py\r\n```\r\n如果看到类似下面的交互菜单，说明通信正常：\r\n```\r\n=== MT4 交易助手 ===\r\n1. 获取报价  2. 查询持仓  3. 交易  4. 网格策略\r\n请输入指令：\r\n```\r\n\r\n**方法二：Python 代码验证**\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# 获取账户信息（确认通信正常）\r\ninfo = client.get_account_info()\r\nprint(info)  # 应该看到余额、净值、可用保证金\r\n\r\n# 获取实时报价\r\nprice = client.get_price(\"XAUUSD.s\")\r\nprint(price) # 应该看到 bid/ask 价格\r\n```\r\n\r\n**如果返回 `\"MT4 超时未响应\"`：**\r\n- MT4 在运行吗？→ 打开 MT4\r\n- EA 挂载了吗？→ 图表上有没有 EA 图标\r\n- 自动交易开了吗？→ 工具栏自动交易按钮是绿色吗\r\n- EA 属性中\"允许实时交易\"勾了吗？→ 右键 EA 图标检查\r\n\r\n---\r\n\r\n## 核心 Python 方法\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# === 行情 ===\r\nclient.get_price(\"XAUUSD.s\")             # 获取实时报价（bid/ask）\r\nclient.get_positions()                    # 查询持仓列表\r\nclient.get_account_info()                 # 账户余额/净值/保证金\r\nclient.get_history(7)                     # 历史订单（最近 7 天）\r\n\r\n# === 交易 ===\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)  # 市价买入 0.03 手\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03) # 市价卖出 0.03 手\r\nclient.close(ticket=123456)               # 平指定订单\r\nclient.close_all()                        # 一键全平\r\nclient.partial_close(ticket=123456, lots=0.02) # 部分平仓\r\n\r\n# === 止损止盈 ===\r\nclient.set_sl(ticket=123456, sl=75000)          # 设置止损\r\nclient.set_tp(ticket=123456, tp=80000)          # 设置止盈\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000) # 同时修改\r\nclient.auto_sl(ticket=123456, risk_percent=2.0) # 按账户 2% 风险自动止损\r\nclient.atr_sl(ticket=123456, period=14, multiplier=2.0) # ATR 止损\r\nclient.trailing_stop(ticket=123456, distance=300) # 移动止损（300 点间距）\r\n\r\n# === 平所有多单/空单 ===\r\nclient.close_all_buy()                     # 平所有多单\r\nclient.close_all_sell()                    # 平所有空单\r\nclient.close_profit()                      # 平所有盈利单\r\nclient.close_loss()                        # 平所有亏损单\r\n\r\n# === 挂单 ===\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 限价买入\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0) # 限价卖出\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)   # 买入止损（突破追涨）\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 卖出止损（破位追空）\r\nclient.get_pending_orders()                # 查询当前挂单\r\nclient.cancel_pending(ticket=123456)       # 取消挂单\r\n\r\n# === OCO 订单（二选一挂单） ===\r\nclient.oco_order(symbol=\"XAUUSD.s\", lots=0.03,\r\n    order1={\"type\": \"buy_stop\",  \"price\": 77000, \"sl\": 76500},\r\n    order2={\"type\": \"sell_stop\", \"price\": 76000, \"sl\": 76500}\r\n)\r\n\r\n# === 手数计算 ===\r\nclient.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\n# 1% 风险，止损 5 美元 → 返回建议手数\r\n\r\n# === K 线数据（量化分析用） ===\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)   # H1 最近 20 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"M15\", count=100) # M15 最近 100 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"D1\", count=30)   # 最近 30 根日线\r\n\r\n# === 支撑压力位 ===\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")      # 获取支撑压力位\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")     # 在图表上画出支撑压力位线\r\n```\r\n\r\n> ⚠️ **重要：使用关键字参数！**\r\n> 所有交易方法（buy/sell/close/set_sl 等）**必须使用关键字参数**传参：\r\n> ```python\r\n> # ✅ 正确\r\n> client.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\n> client.set_sl(ticket=123456, sl=75000)\r\n>\r\n> # ❌ 错误——按位置传参可能会导致 order 4106（交易被禁用）\r\n> client.buy(0.03, \"XAUUSD.s\")      # 顺序可能不对！\r\n> ```\r\n\r\n---\r\n\r\n## 网格策略（芝麻网格 EA）\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `client.grid_start(symbol=\"XAUUSD.s\")` | 启动网格 |\r\n| `client.grid_stop(symbol=\"XAUUSD.s\")` | 停止网格（不再开新单） |\r\n| `client.grid_close_all(symbol=\"XAUUSD.s\")` | 平掉所有网格持仓单 |\r\n| `client.grid_status(symbol=\"XAUUSD.s\")` | 查询网格运行状态 |\r\n| `client.grid_set_sl_tp(symbol=\"XAUUSD.s\")` | 批量设置网格单的止损止盈 |\r\n\r\n> ⚠️ **平网格仓必须按以下顺序分两步执行：**\r\n> ```python\r\n> client.grid_stop(symbol=\"XAUUSD.s\")        # 第一步：停止网格\r\n> client.grid_close_all(symbol=\"XAUUSD.s\")   # 第二步：平掉所有网格单\r\n> ```\r\n> **不可直接用 `close_all()` 平网格单**。`close_all` 命令会拒绝 magic=777777（网格单）。\r\n> 网格单必须走芝麻网格 EA 自己的关闭通道。\r\n\r\n---\r\n\r\n## 价格预警（可选）\r\n\r\n```bash\r\ncd scripts\\\r\n\r\npython alert_commands.py profit 20        # 总盈利达到 $20 时提醒\r\npython alert_commands.py above 77000      # BTC 突破 77000 时提醒\r\npython alert_commands.py below 75000      # BTC 跌破 75000 时提醒\r\npython alert_commands.py list             # 查看当前所有预警\r\npython alert_commands.py clear            # 清除所有预警\r\npython alert_commands.py cancel 3        # 取消第 3 号预警\r\n```\r\n\r\n---\r\n\r\n## 品种代码\r\n\r\n| 品种 | 代码 | 说明 |\r\n|------|------|------|\r\n| 黄金 | `XAUUSD.s` | XAUUSD 后缀 .s 是部分经纪商标准 |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 原油 | `XTIUSD.s` | 美国原油（WTI） |\r\n| 白银 | `XAGUSD.s` | 现货白银 |\r\n\r\n> 品种代码精确格式因经纪商而异。如果 get_price 找不到品种，在 MT4 市场报价中右键 → \"全部显示\"确认准确的品种名。\r\n\r\n---\r\n\r\n## 通信原理\r\n\r\n```\r\n┌──────────┐    JSON 文件     ┌──────────────┐\r\n│  Python   │ ───request────→ │  MT4 EA      │\r\n│  Client   │ ←──response──── │  (on chart)   │\r\n└──────────┘    JSON 文件     └──────────────┘\r\n```\r\n\r\n- **共享目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n  - 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- **请求文件**：`request_{品种}.json`（如 `request_XAUUSD.s.json`）\r\n- **响应文件**：`response_{品种}.json`\r\n- **协议**：JSON over 文件（零 DLL 依赖）\r\n- **超时**：5 秒（Python 客户端默认配置）\r\n- **多品种支持**：多个 EA 实例通过品种专属文件名自动区分\r\n\r\n---\r\n\r\n## 常见问题排查\r\n\r\n| 现象 | 可能原因 | 解决方法 |\r\n|------|---------|---------|\r\n| MT4 超时未响应 | EA 未挂载或自动交易未启动 | 确认图表右上角为绿色笑脸 😊 |\r\n| error 4106（交易禁用） | EA 属性中\"允许实时交易\"未勾选 | 右键 EA → 属性 → 勾选\"允许实时交易\" |\r\n| 找不到价格（空结果） | 品种代码不匹配 | 在 MT4 市场报价中确认精确名称 |\r\n| tools2.3 编译报错 | 文件放错了目录 | 确认 tools2.3.ex4 在 `MQL4\\Libraries\\`，**不是** Experts\\ |\r\n| 重复下单 | 多个 EA 读同一个请求文件 | 使用 v1.84+ 版本，自动使用品种专属文件 |\r\n| BTC 无法市价交易 | 部分经纪商禁用 BTC 市价单 | 改用 `buy_limit()`/`sell_limit()` 限价单 |\r\n| 重启 MT4 后 EA 不跑 | 自动交易默认关闭 | 手动点绿色播放按钮，或在设置中勾选\"启动时启用\" |\r\n| 芝麻网格周末不运行 | 经纪商周末休市 | 正常现象，周一开市自动恢复 |\r\n\r\n---\r\n\r\n## 交流与反馈\r\n\r\n欢迎加入 **MT4 自动化技术交流群**，一起讨论 MT4 自动交易、Python 量化、EA 开发等话题。\r\n\r\n\r\n![微信二维码](https://raw.giteeusercontent.com/3603317/skill-plugin/raw/master/mt4/wechat_qrcode.jpg?metadata=eyJyIjoibWFzdGVyIiwiZnAiOiJtdDQvd2VjaGF0X3FyY29kZS5qcGciLCJwaWQiOjQ3NjA1NjM4LCJzdG8iOiJnaXQtc2hhcmRpbmctc3RvLTEwdC0wMjMiLCJycCI6InJlcG9zL2I4LzJkL2I4MmRlZDkxOWUzMWM5NTFhZGZlMGM4MGYzZmViYjA4YTdmYmRhZjM1OTdiNDEwOWQ5MDk4MzQ4MDdhODYwNWIuZ2l0IiwiaXNwIjp0cnVlLCJleHBpcmVfYXQiOjE3NzgyNDk0MDB9&signature=ibfrHgLRLbDOo0GvUYOPwQiCdS0O6kEnq91Py3Z5opQ)\r\n\r\n\r\nhttps://raw.giteeusercontent.com/3603317/skill-plugin/raw/master/mt4/wechat_qrcode.jpg?metadata=eyJyIjoibWFzdGVyIiwiZnAiOiJtdDQvd2VjaGF0X3FyY29kZS5qcGciLCJwaWQiOjQ3NjA1NjM4LCJzdG8iOiJnaXQtc2hhcmRpbmctc3RvLTEwdC0wMjMiLCJycCI6InJlcG9zL2I4LzJkL2I4MmRlZDkxOWUzMWM5NTFhZGZlMGM4MGYzZmViYjA4YTdmYmRhZjM1OTdiNDEwOWQ5MDk4MzQ4MDdhODYwNWIuZ2l0IiwiaXNwIjp0cnVlLCJleHBpcmVfYXQiOjE3NzgyNDk0MDB9&signature=ibfrHgLRLbDOo0GvUYOPwQiCdS0O6kEnq91Py3Z5opQ\r\n\r\n> 📱 扫码添加微信好友，备注 **MT4** 即可拉入技术交流群。\r\n> 群内可交流：安装问题、使用技巧、功能建议、Bug 反馈。\r\n\r\n---\r\n\r\n## 版本信息\r\n\r\n| 文件 | 版本 | 最后更新 |\r\n|------|------|---------|\r\n| mt4_bridge.ex4 | v1.85 | 2026-05 |\r\n| 芝麻网格V2.ex4 | v1.41 | 2026-03 |\r\n| tools2.3.ex4 | v2.3 | 2025-12 |\r\n| mt4_client.py | v1.85 | 2026-05-05 |\r\n| deploy_ex4.py | v1.0.7 | 2026-05-05 |\r\n---\r\n\r\n# MT4 Trading Bridge · Automated Trading System\r\n\r\nMT4 Trading Bridge communicates with MT4 EA via file I/O — zero DLLs, zero extra dependencies. Supports OpenClaw AI Agent to control MT4 trading through WeChat / Feishu / Telegram and other channels.\r\n\r\n> **Keywords**: MT4, MetaTrader 4, Forex Trading, Python Trading, Algorithmic Trading, Automated Trading, Grid Strategy, Support & Resistance, ATR Stop Loss, Trailing Stop, Gold Trading, Crude Oil Trading, Bitcoin Trading, OpenClaw, AI Trading Assistant\r\n\r\n---\r\n\r\n## File Structure\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # This documentation\r\n├── mql4/                            # MT4 EA compiled files (.ex4, generated by script)\r\n│   [Manually download .ex4 files here]\r\n├── scripts/                         # Python scripts\r\n│   ├── mt4_client.py                # Python trading client (core)\r\n│   ├── deploy_ex4.py                # EA deployment guide (shows download links & steps)\r\n│   ├── alert_commands.py            # Price alert CLI tool\r\n│   ├── position_summary.py          # Position summary (CLI output)\r\n│   ├── position_summary_cron.py     # Position summary (scheduled push)\r\n│   ├── sr_strategy.py               # Support/Resistance strategy orchestrator\r\n│   └── summary_utils.py             # Position summary utility module\r\n└── references/\r\n    └── api_docs.md                  # Full API reference\r\n```\r\n\r\n---\r\n\r\n## Installation\r\n\r\n### Step 1: Find Your MT4 Data Directory\r\n\r\nEach MT4 installation has a unique data directory:\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32-char-random-ID>\r\n```\r\n\r\n> How to find it? In MT4, press F7 to open MetaEditor, then click File -> Open Data Folder.\r\n\r\n### Step 2: Confirm MT4 Directory\r\n\r\nEA files go into two directories:\r\n\r\n| EA File | Target Directory | Notes |\r\n|---------|-----------------|-------|\r\n| mt4_bridge.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Core EA (required) |\r\n| SesameGridV2.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Grid strategy EA (optional) |\r\n| tools2.3.ex4 | MT4_Install_Dir\\MQL4\\Libraries\\ | Grid dependency (required if using grid) |\r\n\r\n> Libraries is at the same level as Experts — NOT a subdirectory of Experts.\r\n\r\n### Step 3: Download .ex4 Files\r\n\r\nFrom Gitee: https://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\nFiles: mt4_bridge.ex4 (required), SesameGridV2.ex4 (optional), tools2.3.ex4 (grid dependency).\r\n\r\n### Step 4: Attach EAs in MT4\r\n\r\nDrag mt4_bridge onto any chart. In properties -> Common tab: check \"Allow live trading\" and \"Allow DLL imports\". Green smiley means working.\r\n\r\nOptional: Attach SesameGridV2 on grid-trading charts.\r\n\r\n### Step 5: Enable Auto Trading\r\n\r\nClick the yellow play icon (unicode triangle) on MT4 toolbar to turn it green.\r\n\r\n### Step 6: Verify\r\n\r\nRun: python mt4_client.py\r\n\r\n---\r\n\r\n## Core Python Methods\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# Market Data\r\nclient.get_price(\"XAUUSD.s\")           # Real-time quote\r\nclient.get_positions()                 # Open positions\r\nclient.get_account_info()              # Account info\r\nclient.get_history(7)                  # Order history (7 days)\r\n\r\n# Trading\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.close(ticket=123456)\r\nclient.close_all()                     # Close all positions\r\n\r\n# SL/TP\r\nclient.set_sl(ticket=123456, sl=75000)\r\nclient.set_tp(ticket=123456, tp=80000)\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000)\r\nclient.trailing_stop(ticket=123456, distance=300)\r\n\r\n# Pending Orders\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0)\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)\r\nclient.get_pending_orders()\r\nclient.cancel_pending(ticket=123456)\r\n\r\n# Kline Data\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\r\n\r\n# Support & Resistance\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n> Use keyword arguments for all trading methods!\r\n\r\n---\r\n\r\n## Grid Strategy\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| grid_start(symbol) | Start grid |\r\n| grid_stop(symbol) | Stop grid |\r\n| grid_close_all(symbol) | Close grid orders |\r\n| grid_status(symbol) | Check status |\r\n\r\nFor closing grid: call grid_stop() first, then grid_close_all().\r\n\r\n---\r\n\r\n## Symbol Codes\r\n\r\n| Instrument | Code |\r\n|------------|------|\r\n| Gold | XAUUSD.s |\r\n| Bitcoin | BTCUSD |\r\n| Crude Oil | XTIUSD.s |\r\n| Silver | XAGUSD.s |\r\n\r\n---\r\n\r\n## Troubleshooting\r\n\r\n| Issue | Solution |\r\n|-------|----------|\r\n| MT4 Timeout | EA not attached or auto-trading off |\r\n| error 4106 | \"Allow live trading\" unchecked |\r\n| Empty price result | Wrong symbol code |\r\n| Duplicate orders | Use v1.84+ for symbol-specific files |\r\n| BTC market order fails | Some brokers disable BTC market orders |\r\n---\n\nFile v1.1.10:_meta.json\n\n{\n  \"ownerId\": \"kn723gzdjbmh391jks7n35xdf982v5y7\",\n  \"slug\": \"mt4-trader\",\n  \"version\": \"1.1.10\",\n  \"publishedAt\": 1778249221179\n}\n\nFile v1.1.10:references/api_docs.md\n\n# MT4 Bridge API 完整文档\r\n\r\n## 通信原理\r\n\r\n**协议**：JSON over 文件（零 DLL 依赖）\r\n\r\n```\r\n┌──────────┐  request_{symbol}.json  ┌──────────────┐\r\n│  Python   │ ──────────────────────→│  MT4 EA      │\r\n│  Client   │ ←──────────────────────│  (on chart)   │\r\n└──────────┘  response_{symbol}.json └──────────────┘\r\n```\r\n\r\n**目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- 品种专属文件名：`request_XAUUSD.s.json`、`response_XAUUSD.s.json`\r\n- 多品种共用时，每个 EA 实例自动读写自己的品种文件\r\n\r\n**文件锁机制**：Python 客户端创建 `.lock` 文件防止读写冲突，EA 检测到锁文件时等待后重试。\r\n\r\n**超时**：5 秒（Python 客户端默认），超时返回 `\"MT4 超时未响应\"`。\r\n\r\n---\r\n\r\n## 方法一览（共 57+ 方法）\r\n\r\n### 行情查询（11 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `get_price()` | 获取实时报价（bid/ask） | `symbol` |\r\n| `get_positions()` | 获取持仓列表 | — |\r\n| `get_account_info()` | 获取账户信息（余额/净值/保证金等） | — |\r\n| `get_history()` | 获取历史订单 | `days` |\r\n| `calc_lots()` | 按风险%计算手数 | `symbol`, `risk_percent`, `sl_distance` |\r\n| `get_klines()` | 获取 K 线（OHLCV）数据 | `symbol`, `timeframe`, `count` |\r\n| `get_sr_levels()` | 获取支撑压力位 | `symbol` |\r\n| `get_pending_orders()` | 查询当前挂单 | — |\r\n| `get_alert_count()` | 获取当前预警数量 | — |\r\n| `check_prices()` | 手动触发价格预警检查 | — |\r\n| `get_orders_history_by_date()` | 按日期范围查询历史订单 | `from_date`, `to_date` |\r\n\r\n### 市价交易（7 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `buy()` | 市价买入开仓 | `symbol`, `lots` |\r\n| `sell()` | 市价卖出开仓 | `symbol`, `lots` |\r\n| `close()` | 平指定订单 | `ticket` |\r\n| `close_all()` | 一键全部平仓 | — |\r\n| `close_all_buy()` | 平所有多单 | — |\r\n| `close_all_sell()` | 平所有空单 | — |\r\n| `partial_close()` | 部分平仓 | `ticket`, `lots` |\r\n\r\n### 挂单交易（6 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `buy_limit()` | 限价买入（低于现价挂买单） | `symbol`, `lots`, `price` |\r\n| `sell_limit()` | 限价卖出（高于现价挂卖单） | `symbol`, `lots`, `price` |\r\n| `buy_stop()` | 买入止损（高于现价追涨） | `symbol`, `lots`, `price` |\r\n| `sell_stop()` | 卖出止损（低于现价追空） | `symbol`, `lots`, `price` |\r\n| `cancel_pending()` | 取消挂单 | `ticket` |\r\n| `oco_order()` | OCO 二选一订单 | `symbol`, `lots`, `order1`, `order2` |\r\n\r\n### 止损止盈（9 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `set_sl()` | 设置止损价 | `ticket`, `sl` |\r\n| `set_tp()` | 设置止盈价 | `ticket`, `tp` |\r\n| `modify_order()` | 同时修改止损止盈 | `ticket`, `sl`, `tp` |\r\n| `set_tp_by_profit()` | 按盈利金额设置止盈 | `ticket`, `profit` |\r\n| `close_by_magic()` | 按 Magic Number 平仓 | `magic` |\r\n| `auto_sl()` | 按账户风险%自动止损 | `ticket`, `risk_percent` |\r\n| `atr_sl()` | ATR 动态止损 | `ticket`, `period`, `multiplier` |\r\n| `trailing_stop()` | 移动止损 | `ticket`, `distance` |\r\n| `close_profit()` | 平所有盈利单 | — |\r\n| `close_loss()` | 平所有亏损单 | — |\r\n\r\n### 芝麻网格策略（8 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `grid_start()` | 启动网格 | `symbol` |\r\n| `grid_stop()` | 停止网格（停止开新单） | `symbol` |\r\n| `grid_close_all()` | 平所有网格持仓 | `symbol` |\r\n| `grid_status()` | 查询网格运行状态 | `symbol` |\r\n| `grid_set_sl_tp()` | 批量设置网格单止损止盈 | `symbol` |\r\n| `grid_start_buy()` | 网格买入一笔 | `symbol` |\r\n| `grid_start_sell()` | 网格卖出一笔 | `symbol` |\r\n| `grid_reverse()` | 网格反向 | `symbol`, `lots` |\r\n\r\n### 支撑压力位/画线（5 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `draw_sr_levels()` | 在图表上画出支撑压力位 | `symbol` |\r\n| `draw_trendline()` | 画趋势线 | `symbol`, `price1`, `price2`, `label` |\r\n| `draw_hline()` | 画水平线 | `symbol`, `price`, `label` |\r\n| `draw_vline()` | 画垂直线 | `symbol`, `time`, `label` |\r\n| `delete_object()` | 删除画线对象 | `symbol`, `name` |\r\n\r\n### 价格预警（6 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `add_alert()` | 添加价格预警 | `type`, `value` |\r\n| `list_alerts()` | 查看所有预警 | — |\r\n| `cancel_alert()` | 取消指定预警 | `index` |\r\n| `clear_alerts()` | 清除所有预警 | — |\r\n| `check_alerts()` | 手动触发预警检查 | — |\r\n| `get_alert_count()` | 获取预警数量 | — |\r\n\r\n### 辅助（8 个）\r\n\r\n| 方法 | 描述 | 必传参数 |\r\n|------|------|---------|\r\n| `set_magic_override()` | 设置自定义 Magic Number | `magic` |\r\n| `set_timeout()` | 设置超时时间（秒） | `seconds` |\r\n| `set_retry()` | 设置重试次数 | `count` |\r\n| `get_bridge_dir()` | 获取桥接目录路径 | — |\r\n| `_transact()` | 底层交易方法（内部使用） | — |\r\n| `safe_close_all()` | 安全全平（含错误处理） | `symbol` |\r\n| `set_default_symbol()` | 设置默认品种 | `symbol` |\r\n\r\n---\r\n\r\n## 详细文档\r\n\r\n### get_price(symbol) —— 获取实时报价\r\n\r\n获取指定品种的当前买价（bid）和卖价（ask）。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码，如 \"XAUUSD.s\"、\"BTCUSD\" |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_price\", \"symbol\": \"XAUUSD.s\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"bid\": 4565.20,\r\n  \"ask\": 4565.70,\r\n  \"time\": \"2026-05-04 12:30:00\"\r\n}\r\n```\r\n\r\n**失败响应：**\r\n```json\r\n{\"status\": \"error\", \"error\": \"无法获取价格: XAUUSD.s\"}\r\n```\r\n\r\n**Python 示例：**\r\n```python\r\nprice = client.get_price(symbol=\"XAUUSD.s\")\r\nprint(price)\r\n# {'status': 'success', 'symbol': 'XAUUSD.s', 'bid': 4565.20, 'ask': 4565.70, 'time': '...'}\r\n```\r\n\r\n---\r\n\r\n### get_positions() —— 查询持仓\r\n\r\n查询当前所有未平仓订单。\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_positions\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 2,\r\n  \"positions\": [\r\n    {\r\n      \"ticket\": 95308752,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"buy\",\r\n      \"lots\": 0.05,\r\n      \"open_price\": 4580.35,\r\n      \"current_price\": 4595.00,\r\n      \"sl\": 4573.00,\r\n      \"tp\": 4588.00,\r\n      \"profit\": 7.25,\r\n      \"swap\": 0.00,\r\n      \"commission\": -0.25,\r\n      \"magic\": 888888,\r\n      \"open_time\": \"2026-05-01 07:56:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n> 注意：当持仓为 0 时，返回 `{\"status\": \"success\", \"count\": 0, \"positions\": []}`\r\n\r\n**Python 代码：**\r\n```python\r\npositions = client.get_positions()\r\nif positions[\"count\"] > 0:\r\n    for pos in positions[\"positions\"]:\r\n        print(f\"{pos['type']} {pos['symbol']} {pos['lots']} lot @ {pos['open_price']}\")\r\nelse:\r\n    print(\"0 持仓\")\r\n```\r\n\r\n---\r\n\r\n### get_account_info() —— 获取账户信息\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_account_info\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"balance\": 10000.00,\r\n  \"equity\": 10007.25,\r\n  \"margin\": 500.00,\r\n  \"free_margin\": 9507.25,\r\n  \"margin_level\": 2001.45,\r\n  \"leverage\": \"1:100\",\r\n  \"currency\": \"USD\",\r\n  \"server\": \"EBCFinancial-Demo01\",\r\n  \"company\": \"EBC Financial Group\",\r\n  \"name\": \"Demo Account\",\r\n  \"number\": 12345678\r\n}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\ninfo = client.get_account_info()\r\nprint(f\"余额: ${info['balance']:.2f}\")\r\nprint(f\"净值: ${info['equity']:.2f}\")\r\nprint(f\"保证金比例: {info['margin_level']:.1f}%\")\r\n```\r\n\r\n---\r\n\r\n### get_history(days) —— 查询历史订单\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `days` | int | ✅ | 查询最近多少天的历史（1~365） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_history\", \"days\": 7}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 15,\r\n  \"orders\": [\r\n    {\r\n      \"ticket\": 94854144,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"sell\",\r\n      \"lots\": 0.05,\r\n      \"open_price\": 4565.20,\r\n      \"close_price\": 4555.30,\r\n      \"profit\": 9.10,\r\n      \"open_time\": \"2026-04-29 10:00:00\",\r\n      \"close_time\": \"2026-04-29 14:30:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### buy(symbol, lots) / sell(symbol, lots) —— 市价开仓\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `lots` | float | ✅ | 手数（如 0.01、0.05、0.10） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"buy\", \"symbol\": \"XAUUSD.s\", \"lots\": \"0.05\", \"price\": \"0\"}\r\n```\r\n\r\n> `price: \"0\"` 表示市价单。如果传具体价格则为限价单（不推荐，用 buy_limit/sell_limit 更明确）。\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"buy\",\r\n  \"ticket\": 95308752,\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"lots\": 0.05,\r\n  \"price\": 4580.35\r\n}\r\n```\r\n\r\n**失败响应（4106）：**\r\n```json\r\n{\"status\": \"error\", \"error\": \"买入失败: Trade is disabled [4106]\"}\r\n```\r\n\r\n> 常见 4106 原因：EA 属性中未勾选\"允许实时交易\"，或 MT4 自动交易按钮为关闭状态。\r\n\r\n**Python 代码：**\r\n```python\r\n# ✅ 正确用法\r\nresult = client.buy(symbol=\"XAUUSD.s\", lots=0.05)\r\n\r\n# ❌ 错误用法（参数顺序问题！）\r\nresult = client.buy(0.05, \"XAUUSD.s\")  # 可能会报 4106 错误\r\n\r\nif result[\"status\"] == \"success\":\r\n    print(f\"开仓成功，ticket: {result['ticket']}\")\r\nelse:\r\n    print(f\"开仓失败: {result['error']}\")\r\n```\r\n\r\n---\r\n\r\n### close(ticket) —— 平仓\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close\", \"ticket\": \"95308752\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"close\",\r\n  \"ticket\": 95308752\r\n}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\nresult = client.close(ticket=95308752)\r\n```\r\n\r\n---\r\n\r\n### close_all() —— 一键全平\r\n\r\n平掉所有持仓单。\r\n\r\n> ⚠️ 注意：网格策略的持仓单（magic=777777）不受此命令影响，需使用 `grid_stop` + `grid_close_all` 平网格单。\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_all\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"close_all\", \"message\": \"closed 5 orders\"}\r\n```\r\n\r\n---\r\n\r\n### close_all_buy() / close_all_sell() —— 按方向平仓\r\n\r\n**close_all_buy** —— 平所有多单\r\n**close_all_sell** —— 平所有空单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_all_buy\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"message\": \"closed 3 buy\"}\r\n```\r\n\r\n---\r\n\r\n### close_profit() / close_loss() —— 按盈亏平仓\r\n\r\n**close_profit** —— 平所有盈利持仓（`profit + swap + commission > 0`）\r\n**close_loss** —— 平所有亏损持仓（`profit + swap + commission < 0`）\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_profit\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"message\": \"closed 2 profit\"}\r\n```\r\n\r\n---\r\n\r\n### partial_close(ticket, lots) —— 部分平仓\r\n\r\n部分平掉指定订单的部分手数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `lots` | float | ✅ | 平掉的手数（必须小于持仓量） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"partial_close\", \"ticket\": \"95308752\", \"lots\": \"0.02\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"partial_close\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### buy_limit / sell_limit / buy_stop / sell_stop —— 挂单\r\n\r\n**buy_limit(symbol, lots, price)** —— 限价买单（低于当前市价挂多单，期待价格回踩买入）\r\n\r\n**sell_limit(symbol, lots, price)** —— 限价卖单（高于当前市价挂空单，期待价格反弹卖出）\r\n\r\n**buy_stop(symbol, lots, price)** —— 买入止损单（高于当前市价挂多单，期待价格突破追涨）\r\n\r\n**sell_stop(symbol, lots, price)** —— 卖出止损单（低于当前市价挂空单，期待价格破位追空）\r\n\r\n**请求 JSON（以 buy_limit 为例）：**\r\n```json\r\n{\"action\": \"buy_limit\", \"symbol\": \"XAUUSD.s\", \"lots\": \"0.03\", \"price\": \"4500.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"buy_limit\", \"ticket\": 95412345}\r\n```\r\n\r\n**Python 代码：**\r\n```python\r\n# 黄金回调到 4500 买入\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.00)\r\n\r\n# BTC 突破 80000 追涨\r\nclient.buy_stop(symbol=\"BTCUSD\", lots=0.01, price=80000.00)\r\n```\r\n\r\n---\r\n\r\n### get_pending_orders() —— 查询挂单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_pending_orders\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"count\": 2,\r\n  \"orders\": [\r\n    {\r\n      \"ticket\": 95412345,\r\n      \"symbol\": \"XAUUSD.s\",\r\n      \"type\": \"buy_limit\",\r\n      \"lots\": 0.03,\r\n      \"price\": 4500.00,\r\n      \"sl\": 0,\r\n      \"tp\": 0,\r\n      \"open_time\": \"2026-05-04 10:00:00\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n---\r\n\r\n### cancel_pending(ticket) —— 取消挂单\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"cancel_pending\", \"ticket\": \"95412345\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"cancel_pending\", \"ticket\": 95412345}\r\n```\r\n\r\n---\r\n\r\n### oco_order(symbol, lots, order1, order2) —— OCO 二选一订单\r\n\r\n同时挂两个方向相反的挂单，其中一个成交后自动取消另一个。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `lots` | float | ✅ | 手数 |\r\n| `order1` | dict | ✅ | 第一个挂单定义 |\r\n| `order2` | dict | ✅ | 第二个挂单定义 |\r\n\r\norder1/order2 格式：\r\n```python\r\n{\r\n    \"type\": \"buy_stop|sell_stop|buy_limit|sell_limit\",\r\n    \"price\": 77000,\r\n    \"sl\": 76500,      # 可选\r\n    \"tp\": 78000       # 可选\r\n}\r\n```\r\n\r\n**请求 JSON：**\r\n```json\r\n{\r\n  \"action\": \"oco_order\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"lots\": \"0.03\",\r\n  \"order1\": {\"type\": \"buy_stop\", \"price\": \"77000\", \"sl\": \"76500\"},\r\n  \"order2\": {\"type\": \"sell_stop\", \"price\": \"76000\", \"sl\": \"76500\"}\r\n}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"action\": \"oco_order\",\r\n  \"order1_ticket\": 95420001,\r\n  \"order2_ticket\": 95420002\r\n}\r\n```\r\n\r\n---\r\n\r\n### set_sl(ticket, sl) / set_tp(ticket, tp) —— 设置止损止盈\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `sl` | float | ✅ (set_sl) | 止损价格 |\r\n| `tp` | float | ✅ (set_tp) | 止盈价格 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"set_sl\", \"ticket\": \"95308752\", \"sl\": \"4573.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"set_sl\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### modify_order(ticket, sl, tp) —— 同时修改止损止盈\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `sl` | float | ✅ | 新止损价 |\r\n| `tp` | float | ✅ | 新止盈价 |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"modify_order\", \"ticket\": \"95308752\", \"sl\": \"4570.00\", \"tp\": \"4600.00\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"modify_order\", \"ticket\": 95308752}\r\n```\r\n\r\n---\r\n\r\n### close_by_magic(magic) —— 按 Magic Number 平仓\r\n\r\n平掉所有指定 Magic Number 的持仓。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `magic` | int | ✅ | Magic Number |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"close_by_magic\", \"magic\": \"888888\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"close_by_magic\", \"closed\": 5}\r\n```\r\n\r\n---\r\n\r\n### set_tp_by_profit(ticket, profit) —— 按盈利金额设止盈\r\n\r\n设置止盈价为当前价格 + 目标盈利金额对应的点数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `profit` | float | ✅ | 目标盈利金额（美元） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"set_tp_by_profit\", \"ticket\": \"95308752\", \"profit\": \"20.00\"}\r\n```\r\n\r\n---\r\n\r\n### auto_sl(ticket, risk_percent) —— 按账户风险%止损\r\n\r\n根据账户余额计算止损价，防止单笔亏损超过指定比例。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `risk_percent` | float | ✅ | 风险比例（如 2.0 = 2%） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 限制该笔最大亏损为账户余额的 2%\r\nclient.auto_sl(ticket=95308752, risk_percent=2.0)\r\n```\r\n\r\n---\r\n\r\n### atr_sl(ticket, period, multiplier) —— ATR 动态止损\r\n\r\n基于 ATR（Average True Range，平均真实波幅）指标设置止损。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `period` | int | ✅ | ATR 计算周期（推荐 14） |\r\n| `multiplier` | float | ✅ | ATR 倍数（推荐 2.0） |\r\n\r\n**ATR 倍数参考：**\r\n| 交易风格 | 倍数 | 说明 |\r\n|---------|------|------|\r\n| 激进日内 | 1.5x | 止损窄，易被扫 |\r\n| 标准日内 | **2.0x** | ✅ 推荐 |\r\n| 宽松/波段 | 3.0x | 容错空间大 |\r\n\r\n**Python 示例：**\r\n```python\r\n# 黄金多单，14周期 ATR，2 倍止损\r\nclient.atr_sl(ticket=95308752, period=14, multiplier=2.0)\r\n```\r\n\r\n---\r\n\r\n### trailing_stop(ticket, distance) —— 移动止损\r\n\r\n当价格朝有利方向移动时，自动上移止损线，锁住利润。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `ticket` | int | ✅ | 订单编号 |\r\n| `distance` | int | ✅ | 止损距离（点数，如 300 = 300 点） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 持仓价向有利方向移动超过 300 点时，止损自动上移 300 点跟随\r\nclient.trailing_stop(ticket=95308752, distance=300)\r\n```\r\n\r\n---\r\n\r\n### calc_lots(symbol, risk_percent, sl_distance) —— 手数计算\r\n\r\n根据账户余额、风险百分比和止损距离计算建议交易手数。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `risk_percent` | float | ✅ | 该笔所愿承受的风险（账户余额的百分比） |\r\n| `sl_distance` | float | ✅ | 止损距离（美元） |\r\n\r\n**Python 示例：**\r\n```python\r\n# 黄金，1% 风险，止损 5 美元 → 返回建议手数\r\nlots = client.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\nprint(f\"建议手数: {lots}\")\r\n```\r\n\r\n---\r\n\r\n### get_klines(symbol, timeframe, count) —— K 线数据\r\n\r\n获取历史 K 线数据（开盘价/最高价/最低价/收盘价/成交量），用于量化分析。\r\n\r\n**参数：**\r\n| 参数 | 类型 | 必填 | 说明 |\r\n|------|------|------|------|\r\n| `symbol` | str | ✅ | 品种代码 |\r\n| `timeframe` | str | ✅ | 周期：M1, M5, M15, M30, H1, H4, D1, W1, MN |\r\n| `count` | int | ✅ | 获取的 K 线数量（最大 1000） |\r\n\r\n**请求 JSON：**\r\n```json\r\n{\"action\": \"get_klines\", \"symbol\": \"XAUUSD.s\", \"timeframe\": \"H1\", \"count\": \"20\"}\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\r\n  \"status\": \"success\",\r\n  \"symbol\": \"XAUUSD.s\",\r\n  \"timeframe\": \"H1\",\r\n  \"count\": 20,\r\n  \"data\": [\r\n    {\"time\": \"2026-05-04 08:00:00\", \"open\": 4560.0, \"high\": 4570.0, \"low\": 4558.0, \"close\": 4568.0, \"volume\": 1200},\r\n    {\"time\": \"2026-05-04 09:00:00\", \"open\": 4568.0, \"high\": 4575.0, \"low\": 4565.0, \"close\": 4572.0, \"volume\": 1500}\r\n  ]\r\n}\r\n```\r\n\r\n**支持的周期：**\r\n| 参数 | 含义 |\r\n|------|------|\r\n| M1, M5, M15, M30 | 分钟 |\r\n| H1, H4 | 小时 |\r\n| D1 | 日线 |\r\n| W1 | 周线 |\r\n| MN | 月线 |\r\n\r\n**Python 示例：**\r\n```python\r\n# 获取最近 20 根 H1 K 线\r\nklines = client.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)\r\nfor k in klines[\"data\"]:\r\n    print(f\"{k['time']} O:{k['open']} H:{k['high']} L:{k['low']} C:{k['close']}\")\r\n```\r\n\r\n---\r\n\r\n## 网格策略 API（芝麻网格 EA）\r\n\r\n网格策略通过独立的芝麻网格 EA（magic=777777）运行，使用 `grid_bridge` 目录通信。\r\n\r\n> ⚠️ 重要约束：\r\n> - 平网格仓必须：`grid_stop()` → `grid_close_all()` 两步\r\n> - `close_all()` 命令会拒绝 magic=777777 的订单\r\n> - 网格单的精确持仓查询通过 `grid_status()` 完成\r\n\r\n### grid_start(symbol) —— 启动网格\r\n\r\n在指定品种上启动网格策略。EA 会根据预设参数在价格区间内自动分批挂单。\r\n\r\n```python\r\nclient.grid_start(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n**成功响应：**\r\n```json\r\n{\"status\": \"success\", \"action\": \"grid_start\", \"message\": \"grid started\"}\r\n```\r\n\r\n### grid_stop(symbol) —— 停止网格\r\n\r\n停止网格 EA 继续开新单。已开的持仓单不受影响。\r\n\r\n```python\r\nclient.grid_stop(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n### grid_close_all(symbol) —— 平所有网格单\r\n\r\n平掉所有网格策略的持仓单。\r\n\r\n```python\r\nclient.grid_close_all(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n> 强烈建议先 `grid_stop()` 再 `grid_close_all()`，防止平仓过程中网格 EA 又开新单。\r\n\r\n### grid_status(symbol) —— 网格状态查询\r\n\r\n```python\r\nstatus = client.grid_status(symbol=\"XAUUSD.s\")\r\nprint(status)\r\n# {'status': 'success', 'running': True, 'orders': [...], 'profit': 12.50, ...}\r\n```\r\n\r\n---\r\n\r\n## 价格预警 API\r\n\r\n预警系统支持以下类型：\r\n\r\n| 预警类型 | 说明 | value 含义 |\r\n|---------|------|-----------|\r\n| `profit` | 总盈利达到目标时触发 | 目标盈利金额（美元） |\r\n| `above` | 价格突破时触发 | 突破价格 |\r\n| `below` | 价格跌破时触发 | 跌破价格 |\r\n\r\n### add_alert(type, value) —— 添加预警\r\n\r\n```python\r\n# 盈利达到 $20 提醒\r\nclient.add_alert(type=\"profit\", value=20)\r\n# BTC 突破 77000 提醒\r\nclient.add_alert(type=\"above\", value=77000)\r\n# BTC 跌破 75000 提醒\r\nclient.add_alert(type=\"below\", value=75000)\r\n```\r\n\r\n### list_alerts() —— 查看预警\r\n\r\n```python\r\nalerts = client.list_alerts()\r\n```\r\n\r\n### cancel_alert(index) —— 取消预警\r\n\r\n```python\r\nclient.cancel_alert(index=3)\r\n```\r\n\r\n### clear_alerts() —— 清除所有预警\r\n\r\n```python\r\nclient.clear_alerts()\r\n```\r\n\r\n---\r\n\r\n## 品种代码速查\r\n\r\n| 品种 | 标准代码 | 注意 |\r\n|------|---------|------|\r\n| 黄金 | `XAUUSD.s` | 部分经纪商为 XAUUSD（无 .s） |\r\n| 白银 | `XAGUSD.s` | 或 XAGUSD |\r\n| 原油 WTI | `XTIUSD.s` | 或 USOIL、CL |\r\n| 布伦特原油 | `XBRUSD` | 或 UKOIL |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 以太坊 | `ETHUSD` | 部分平台不支持 |\r\n| 欧元/美元 | `EURUSD` | 标准外汇货币对 |\r\n| 英镑/美元 | `GBPUSD` | 标准外汇货币对 |\r\n| 美元/日元 | `USDJPY` | 标准外汇货币对 |\r\n\r\n> 品种代码因经纪商而异。如果报错\"无法获取价格\"，请在 MT4 市场报价中右键 → \"全部显示\"确认精确名称。\r\n\r\n---\r\n\r\n## 错误码参考\r\n\r\n| 错误码 | 含义 | 常见原因 |\r\n|--------|------|---------|\r\n| 4106 | 交易被禁用 | 未勾选\"允许实时交易\"或自动交易按钮关闭 |\r\n| 4107 | 市场关闭 | 经纪商休市（周末常见） |\r\n| 4108 | 无效单量 | 手数超出允许范围 |\r\n| 4111 | 交易超时 | 服务器繁忙 |\r\n| 4113 | 无效价格 | 挂单价格超出当前市价范围 |\r\n| 4200 | 保证金不足 | 可用保证金不够开仓 |\r\n| 4202 | 已停止交易 | 账户已被冻结或限制 |\r\n| 4001 | 品种被禁用 | 该品种不允许交易 |\r\n| 4002 | 无效品种 | 品种名称不正确 |\r\n| 1000 | 超时 | 请求发出后 5 秒内无响应 |\r\n\r\n---\r\n\r\n## 常见使用模式\r\n\r\n### 模式 1：日内黄金交易\r\n\r\n```python\r\n# 开多\r\nresult = client.buy(symbol=\"XAUUSD.s\", lots=0.05)\r\nticket = result[\"ticket\"]\r\n\r\n# 设置 ATR 止损\r\nclient.atr_sl(ticket=ticket, period=14, multiplier=2.0)\r\n\r\n# 设置止盈\r\nclient.set_tp(ticket=ticket, tp=4605.00)\r\n```\r\n\r\n### 模式 2：网格策略完整流程\r\n\r\n```python\r\n# 启动网格\r\nclient.grid_start(symbol=\"XAUUSD.s\")\r\n\r\n# 查看状态\r\nstatus = client.grid_status(symbol=\"XAUUSD.s\")\r\n\r\n# 停止网格 + 平仓\r\nclient.grid_stop(symbol=\"XAUUSD.s\")\r\nclient.grid_close_all(symbol=\"XAUUSD.s\")\r\n```\r\n\r\n### 模式 3：OCO 双向挂单\r\n\r\n```python\r\n# 黄金突破追涨 / 破位追空\r\nclient.oco_order(\r\n    symbol=\"XAUUSD.s\",\r\n    lots=0.03,\r\n    order1={\"type\": \"buy_stop\", \"price\": 4620.00, \"sl\": 4580.00},\r\n    order2={\"type\": \"sell_stop\", \"price\": 4560.00, \"sl\": 4600.00}\r\n)\r\n```\r\n\r\n### 模式 4：移动止损锁利\r\n\r\n```python\r\nticket = client.buy(symbol=\"XAUUSD.s\", lots=0.03)[\"ticket\"]\r\n# 价格朝有利方向移动时，止损自动跟随\r\nclient.trailing_stop(ticket=ticket, distance=300)\r\n```\n\nArchive v1.1.9: 10 files, 32500 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (24187b), _meta.json (129b)\n\nFile v1.1.9:SKILL.md\n\n# MT4 智能交易桥 · 量化自动交易系统\r\n\r\nMT4 智能交易桥。通过文件 I/O 与 MT4 EA 通信，无需 DLL 或额外依赖。支持 OpenClaw（小龙虾 AI Agent）通过微信 / 飞书 / Telegram 等渠道直接操作 MT4 交易。\r\n\r\n> **关键词**：MT4, MetaTrader 4, 外汇交易, Python交易, 算法交易, 自动交易, 网格策略, 支撑压力位, ATR止损, 移动止损, 黄金交易, 原油交易, 比特币交易, OpenClaw, 小龙虾, AI交易助手, 微信操作MT4, 飞书操作MT4\r\n\r\n---\r\n\r\n## 文件结构\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # 本使用说明\r\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\r\n│   [用户手动下载 .ex4 文件放到此目录]\r\n├── scripts/                         # Python 脚本\r\n│   ├── mt4_client.py                # Python 交易客户端（核心）\r\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\r\n│   ├── alert_commands.py            # 价格预警命令行工具\r\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\r\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\r\n│   ├── sr_strategy.py               # 支撑压力位策略编排\r\n│   └── summary_utils.py             # 持仓汇总工具模块\r\n└── references/\r\n    └── api_docs.md                  # 完整 API 参考文档\r\n```\r\n\r\n---\r\n\r\n## 安装步骤（详细版）\r\n\r\n### 第一步：找到你的 MT4 数据目录\r\n\r\n每个 MT4 安装实例都有一个专属的数据目录，格式为：\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>\r\n```\r\n\r\n例如：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\ABC123...`\r\n\r\n> 怎么找？在 MT4 中按 `F7` 打开 MetaEditor（代码编辑器），点击菜单 `文件 → 打开数据文件夹`，弹出的路径就是你的 MT4 数据目录。\r\n\r\n### 第二步：确认 MT4 安装目录\r\n\r\nEA 文件需要部署到两个不同的目录：\r\n\r\n| EA 文件 | 目标目录 | 说明 |\r\n|---------|---------|------|\r\n| `mt4_bridge.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 主程序 EA（必须） |\r\n| `芝麻网格V2.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | `MT4安装目录\\MQL4\\Libraries\\` | **网格策略依赖库**（网格必须，不是 Experts！） |\r\n\r\n> ⚠️ `Libraries` 目录与 `Experts`、`Indicators` 同级，**不是** `Experts` 的子目录。\r\n\r\n典型路径结构：\r\n```\r\nC:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\r\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\r\n│   ├── mt4_bridge.ex4\r\n│   └── 芝麻网格V2.ex4\r\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\r\n│   └── tools2.3.ex4\r\n├── Indicators\\\r\n└── Scripts\\\r\n```\r\n\r\n### 第三步：下载 .ex4 文件\r\n\r\n从 Gitee 仓库下载 3 个 .ex4 文件：\r\n\r\nhttps://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\n需要下载的文件：\r\n\r\n| 文件 | 说明 |\r\n|------|------|\r\n| `mt4_bridge.ex4` | 主程序 EA（**必选**） |\r\n| `芝麻网格V2.ex4` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | 网格策略依赖库（选网格则必选） |\r\n\r\n> 点击文件 → 点右上角 **Raw** 按钮即可保存到本地。\r\n\r\n下载后放入 skills\\mt4-trader\\mql4\\ 目录，然后运行以下命令一键部署到 MT4：\r\n\r\n```bash\r\ncd scripts\\\r\npython deploy_ex4.py deploy\r\n```\r\n\r\n### 第四步：在 MT4 中挂载 EA\r\n\r\n**挂载 mt4_bridge（核心，必须操作）：**\r\n1. 打开 MT4，按 `Ctrl+N` 打开左侧\"导航器\"面板\r\n2. 展开\"EA 交易\"列表，找到 `mt4_bridge`\r\n3. 用鼠标左键拖拽到任意品种图表上（推荐 XAUUSD.s 或主流品种）\r\n4. 弹出 EA 属性对话框 → **选项卡\"常用\"**：\r\n   - **允许实时交易** → ✅ 勾选（必须！）\r\n   - **允许导入 DLL** → ✅ 勾选\r\n   - **确认取消\"手动交易禁止\"** 等限制\r\n5. 点\"确定\"关闭对话框\r\n6. 图表右上角显示一个 EA 图标：\r\n   - 😊 **绿色笑脸** → ✅ 正常工作中\r\n   - 😢 哭脸或灰脸 → 检查下面\"第五步\"的自动交易按钮\r\n7. **右键图表 → 属性 → 常用** 中可修改 EA 输入参数（可选）\r\n\r\n**可选：挂载芝麻网格 EA：**\r\n1. 将 `芝麻网格V2` EA 拖到需要跑网格的品种图表上（如 XAUUSD.s、XTIUSD.s）\r\n2. 勾选\"允许实时交易\"\r\n3. **确认 `tools2.3.ex4` 已放在 `Libraries\\` 目录中**，否则网格 EA 无法运行\r\n\r\n**多图表挂载（重要）：**\r\n- mt4_bridge EA 可以挂载在**多个品种**的图表上（例如黄金一个图表、原油一个图表）\r\n- 每个 EA 实例自动通过品种专属请求文件区分，不会互相干扰\r\n- Python 客户端传了 `symbol` 参数后，会自动路由到对应的品种请求文件\r\n\r\n### 第五步：开启自动交易\r\n\r\n这是新手最容易忽略的一步！\r\n\r\n1. 在 MT4 工具栏上方找到 **\"自动交易\"按钮**（一个黄色播放 ▶️ 图标）\r\n2. 如果它是 **灰色** 的 → 点击一下，变成 **绿色** ✅\r\n3. 此时所有已挂载的 EA 图标都应变成 **绿色笑脸** 😊\r\n4. 如果某个 EA 还是哭脸，右键该 EA 图标 → \"属性\" → 勾选\"允许实时交易\"\r\n\r\n> 💡 每次重启 MT4 后，自动交易按钮默认为关闭状态，需要手动开启。\r\n> 建议在 MT4 设置中勾选\"启动时启用自动交易\"。\r\n\r\n### 第六步：验证部署是否成功\r\n\r\n**方法一：脚本检查**\r\n```bash\r\ncd scripts\\\r\npython mt4_client.py\r\n```\r\n如果看到类似下面的交互菜单，说明通信正常：\r\n```\r\n=== MT4 交易助手 ===\r\n1. 获取报价  2. 查询持仓  3. 交易  4. 网格策略\r\n请输入指令：\r\n```\r\n\r\n**方法二：Python 代码验证**\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# 获取账户信息（确认通信正常）\r\ninfo = client.get_account_info()\r\nprint(info)  # 应该看到余额、净值、可用保证金\r\n\r\n# 获取实时报价\r\nprice = client.get_price(\"XAUUSD.s\")\r\nprint(price) # 应该看到 bid/ask 价格\r\n```\r\n\r\n**如果返回 `\"MT4 超时未响应\"`：**\r\n- MT4 在运行吗？→ 打开 MT4\r\n- EA 挂载了吗？→ 图表上有没有 EA 图标\r\n- 自动交易开了吗？→ 工具栏自动交易按钮是绿色吗\r\n- EA 属性中\"允许实时交易\"勾了吗？→ 右键 EA 图标检查\r\n\r\n---\r\n\r\n## 核心 Python 方法\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# === 行情 ===\r\nclient.get_price(\"XAUUSD.s\")             # 获取实时报价（bid/ask）\r\nclient.get_positions()                    # 查询持仓列表\r\nclient.get_account_info()                 # 账户余额/净值/保证金\r\nclient.get_history(7)                     # 历史订单（最近 7 天）\r\n\r\n# === 交易 ===\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)  # 市价买入 0.03 手\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03) # 市价卖出 0.03 手\r\nclient.close(ticket=123456)               # 平指定订单\r\nclient.close_all()                        # 一键全平\r\nclient.partial_close(ticket=123456, lots=0.02) # 部分平仓\r\n\r\n# === 止损止盈 ===\r\nclient.set_sl(ticket=123456, sl=75000)          # 设置止损\r\nclient.set_tp(ticket=123456, tp=80000)          # 设置止盈\r\nclient.modify_order(ticket=123456, sl=75000, tp=80000) # 同时修改\r\nclient.auto_sl(ticket=123456, risk_percent=2.0) # 按账户 2% 风险自动止损\r\nclient.atr_sl(ticket=123456, period=14, multiplier=2.0) # ATR 止损\r\nclient.trailing_stop(ticket=123456, distance=300) # 移动止损（300 点间距）\r\n\r\n# === 平所有多单/空单 ===\r\nclient.close_all_buy()                     # 平所有多单\r\nclient.close_all_sell()                    # 平所有空单\r\nclient.close_profit()                      # 平所有盈利单\r\nclient.close_loss()                        # 平所有亏损单\r\n\r\n# === 挂单 ===\r\nclient.buy_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 限价买入\r\nclient.sell_limit(symbol=\"XAUUSD.s\", lots=0.03, price=4600.0) # 限价卖出\r\nclient.buy_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4700.0)   # 买入止损（突破追涨）\r\nclient.sell_stop(symbol=\"XAUUSD.s\", lots=0.03, price=4500.0)  # 卖出止损（破位追空）\r\nclient.get_pending_orders()                # 查询当前挂单\r\nclient.cancel_pending(ticket=123456)       # 取消挂单\r\n\r\n# === OCO 订单（二选一挂单） ===\r\nclient.oco_order(symbol=\"XAUUSD.s\", lots=0.03,\r\n    order1={\"type\": \"buy_stop\",  \"price\": 77000, \"sl\": 76500},\r\n    order2={\"type\": \"sell_stop\", \"price\": 76000, \"sl\": 76500}\r\n)\r\n\r\n# === 手数计算 ===\r\nclient.calc_lots(symbol=\"XAUUSD.s\", risk_percent=1.0, sl_distance=5.0)\r\n# 1% 风险，止损 5 美元 → 返回建议手数\r\n\r\n# === K 线数据（量化分析用） ===\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"H1\", count=20)   # H1 最近 20 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"M15\", count=100) # M15 最近 100 根\r\nclient.get_klines(symbol=\"XAUUSD.s\", timeframe=\"D1\", count=30)   # 最近 30 根日线\r\n\r\n# === 支撑压力位 ===\r\nclient.get_sr_levels(symbol=\"XAUUSD.s\")      # 获取支撑压力位\r\nclient.draw_sr_levels(symbol=\"XAUUSD.s\")     # 在图表上画出支撑压力位线\r\n```\r\n\r\n> ⚠️ **重要：使用关键字参数！**\r\n> 所有交易方法（buy/sell/close/set_sl 等）**必须使用关键字参数**传参：\r\n> ```python\r\n> # ✅ 正确\r\n> client.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\n> client.set_sl(ticket=123456, sl=75000)\r\n>\r\n> # ❌ 错误——按位置传参可能会导致 order 4106（交易被禁用）\r\n> client.buy(0.03, \"XAUUSD.s\")      # 顺序可能不对！\r\n> ```\r\n\r\n---\r\n\r\n## 网格策略（芝麻网格 EA）\r\n\r\n| 命令 | 说明 |\r\n|------|------|\r\n| `client.grid_start(symbol=\"XAUUSD.s\")` | 启动网格 |\r\n| `client.grid_stop(symbol=\"XAUUSD.s\")` | 停止网格（不再开新单） |\r\n| `client.grid_close_all(symbol=\"XAUUSD.s\")` | 平掉所有网格持仓单 |\r\n| `client.grid_status(symbol=\"XAUUSD.s\")` | 查询网格运行状态 |\r\n| `client.grid_set_sl_tp(symbol=\"XAUUSD.s\")` | 批量设置网格单的止损止盈 |\r\n\r\n> ⚠️ **平网格仓必须按以下顺序分两步执行：**\r\n> ```python\r\n> client.grid_stop(symbol=\"XAUUSD.s\")        # 第一步：停止网格\r\n> client.grid_close_all(symbol=\"XAUUSD.s\")   # 第二步：平掉所有网格单\r\n> ```\r\n> **不可直接用 `close_all()` 平网格单**。`close_all` 命令会拒绝 magic=777777（网格单）。\r\n> 网格单必须走芝麻网格 EA 自己的关闭通道。\r\n\r\n---\r\n\r\n## 价格预警（可选）\r\n\r\n```bash\r\ncd scripts\\\r\n\r\npython alert_commands.py profit 20        # 总盈利达到 $20 时提醒\r\npython alert_commands.py above 77000      # BTC 突破 77000 时提醒\r\npython alert_commands.py below 75000      # BTC 跌破 75000 时提醒\r\npython alert_commands.py list             # 查看当前所有预警\r\npython alert_commands.py clear            # 清除所有预警\r\npython alert_commands.py cancel 3        # 取消第 3 号预警\r\n```\r\n\r\n---\r\n\r\n## 品种代码\r\n\r\n| 品种 | 代码 | 说明 |\r\n|------|------|------|\r\n| 黄金 | `XAUUSD.s` | XAUUSD 后缀 .s 是部分经纪商标准 |\r\n| 比特币 | `BTCUSD` | 部分平台为 BTCUSD.pro |\r\n| 原油 | `XTIUSD.s` | 美国原油（WTI） |\r\n| 白银 | `XAGUSD.s` | 现货白银 |\r\n\r\n> 品种代码精确格式因经纪商而异。如果 get_price 找不到品种，在 MT4 市场报价中右键 → \"全部显示\"确认准确的品种名。\r\n\r\n---\r\n\r\n## 通信原理\r\n\r\n```\r\n┌──────────┐    JSON 文件     ┌──────────────┐\r\n│  Python   │ ───request────→ │  MT4 EA      │\r\n│  Client   │ ←──response──── │  (on chart)   │\r\n└──────────┘    JSON 文件     └──────────────┘\r\n```\r\n\r\n- **共享目录**：`%APPDATA%\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n  - 示例：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\Common\\Files\\mt4_bridge\\`\r\n- **请求文件**：`request_{品种}.json`（如 `request_XAUUSD.s.json`）\r\n- **响应文件**：`response_{品种}.json`\r\n- **协议**：JSON over 文件（零 DLL 依赖）\r\n- **超时**：5 秒（Python 客户端默认配置）\r\n- **多品种支持**：多个 EA 实例通过品种专属文件名自动区分\r\n\r\n---\r\n\r\n## 常见问题排查\r\n\r\n| 现象 | 可能原因 | 解决方法 |\r\n|------|---------|---------|\r\n| MT4 超时未响应 | EA 未挂载或自动交易未启动 | 确认图表右上角为绿色笑脸 😊 |\r\n| error 4106（交易禁用） | EA 属性中\"允许实时交易\"未勾选 | 右键 EA → 属性 → 勾选\"允许实时交易\" |\r\n| 找不到价格（空结果） | 品种代码不匹配 | 在 MT4 市场报价中确认精确名称 |\r\n| tools2.3 编译报错 | 文件放错了目录 | 确认 tools2.3.ex4 在 `MQL4\\Libraries\\`，**不是** Experts\\ |\r\n| 重复下单 | 多个 EA 读同一个请求文件 | 使用 v1.84+ 版本，自动使用品种专属文件 |\r\n| BTC 无法市价交易 | 部分经纪商禁用 BTC 市价单 | 改用 `buy_limit()`/`sell_limit()` 限价单 |\r\n| 重启 MT4 后 EA 不跑 | 自动交易默认关闭 | 手动点绿色播放按钮，或在设置中勾选\"启动时启用\" |\r\n| 芝麻网格周末不运行 | 经纪商周末休市 | 正常现象，周一开市自动恢复 |\r\n\r\n---\r\n\r\n## 交流与反馈\r\n\r\n欢迎加入 **MT4 自动化技术交流群**，一起讨论 MT4 自动交易、Python 量化、EA 开发等话题。\r\n\r\n![微信二维码](wechat_qrcode.jpg)\r\n\r\n> 📱 扫码添加微信好友，备注 **MT4** 即可拉入技术交流群。\r\n> 群内可交流：安装问题、使用技巧、功能建议、Bug 反馈。\r\n\r\n---\r\n\r\n## 版本信息\r\n\r\n| 文件 | 版本 | 最后更新 |\r\n|------|------|---------|\r\n| mt4_bridge.ex4 | v1.85 | 2026-05 |\r\n| 芝麻网格V2.ex4 | v1.41 | 2026-03 |\r\n| tools2.3.ex4 | v2.3 | 2025-12 |\r\n| mt4_client.py | v1.85 | 2026-05-05 |\r\n| deploy_ex4.py | v1.0.7 | 2026-05-05 |\r\n---\r\n\r\n# MT4 Trading Bridge · Automated Trading System\r\n\r\nMT4 Trading Bridge communicates with MT4 EA via file I/O — zero DLLs, zero extra dependencies. Supports OpenClaw AI Agent to control MT4 trading through WeChat / Feishu / Telegram and other channels.\r\n\r\n> **Keywords**: MT4, MetaTrader 4, Forex Trading, Python Trading, Algorithmic Trading, Automated Trading, Grid Strategy, Support & Resistance, ATR Stop Loss, Trailing Stop, Gold Trading, Crude Oil Trading, Bitcoin Trading, OpenClaw, AI Trading Assistant\r\n\r\n---\r\n\r\n## File Structure\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # This documentation\r\n├── mql4/                            # MT4 EA compiled files (.ex4, generated by script)\r\n│   [Manually download .ex4 files here]\r\n├── scripts/                         # Python scripts\r\n│   ├── mt4_client.py                # Python trading client (core)\r\n│   ├── deploy_ex4.py                # EA deployment guide (shows download links & steps)\r\n│   ├── alert_commands.py            # Price alert CLI tool\r\n│   ├── position_summary.py          # Position summary (CLI output)\r\n│   ├── position_summary_cron.py     # Position summary (scheduled push)\r\n│   ├── sr_strategy.py               # Support/Resistance strategy orchestrator\r\n│   └── summary_utils.py             # Position summary utility module\r\n└── references/\r\n    └── api_docs.md                  # Full API reference\r\n```\r\n\r\n---\r\n\r\n## Installation\r\n\r\n### Step 1: Find Your MT4 Data Directory\r\n\r\nEach MT4 installation has a unique data directory:\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32-char-random-ID>\r\n```\r\n\r\n> How to find it? In MT4, press F7 to open MetaEditor, then click File -> Open Data Folder.\r\n\r\n### Step 2: Confirm MT4 Directory\r\n\r\nEA files go into two directories:\r\n\r\n| EA File | Target Directory | Notes |\r\n|---------|-----------------|-------|\r\n| mt4_bridge.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Core EA (required) |\r\n| SesameGridV2.ex4 | MT4_Install_Dir\\MQL4\\Experts\\ | Grid strategy EA (optional) |\r\n| tools2.3.ex4 | MT4_Install_Dir\\MQL4\\Libraries\\ | Grid dependency (required if using grid) |\r\n\r\n> Libraries is at the same level as Experts — NOT a subdirectory of Experts.\r\n\r\n### Step 3: Download .ex4 Files\r\n\r\nFrom Gitee: https://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\nFiles: mt4_bridge.ex4 (required), SesameGridV2.ex4 (optional), tools2.3.ex4 (grid dependency).\r\n\r\n### Step 4: Attach EAs in MT4\r\n\r\nDrag mt4_bridge onto any chart. In properties -> Common tab: check \"Allow live trading\" and \"Allow DLL imports\". Green smiley means working.\r\n\r\nOptional: Attach SesameGridV2 on grid-trading charts.\r\n\r\n### Step 5: Enable Auto Trading\r\n\r\nClick the yellow play icon (unicode triangle) on MT4 toolbar to turn it green.\r\n\r\n### Step 6: Verify\r\n\r\nRun: python mt4_client.py\r\n\r\n---\r\n\r\n## Core Python Methods\r\n\r\n```python\r\nfrom mt4_client import MT4Client\r\nclient = MT4Client()\r\n\r\n# Market Data\r\nclient.get_price(\"XAUUSD.s\")           # Real-time quote\r\nclient.get_positions()                 # Open positions\r\nclient.get_account_info()              # Account info\r\nclient.get_history(7)                  # Order history (7 days)\r\n\r\n# Trading\r\nclient.buy(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.sell(symbol=\"XAUUSD.s\", lots=0.03)\r\nclient.close(ticket=123456)\r\nclient.close_all()                     # Close all positions\r\n\r\n# SL/TP\r\nclient.set_sl(ticket=123456, sl=75000)\r\nclient.set_tp(ticket=123456, tp=80000)\r\nclient.modify_o\n\nArchive v1.1.8: 10 files, 30626 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (13749b), _meta.json (129b)\n\nArchive v1.1.7: 10 files, 30516 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (13104b), _meta.json (129b)\n\nArchive v1.1.6: 10 files, 27238 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (5261b), _meta.json (129b)\n\nArchive v1.1.5: 10 files, 32661 bytes\n\nFiles: references/api_docs.md (25364b), scripts/alert_commands.py (4509b), scripts/deploy_ex4.py (3618b), scripts/mt4_client.py (26675b), scripts/position_summary_cron.py (2985b), scripts/position_summary.py (1205b), scripts/sr_strategy.py (6672b), scripts/summary_utils.py (2220b), SKILL.md (24704b), _meta.json (129b)","readmeExcerpt":"Skill: Mt4 Trader Owner: apuba Summary: MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies. Tags: automated-trading:1.0.7, forex:1.0.7, grid:1.0.7, latest:1.2.1, mt4:1.0.7, python:1.0.7, trading:1.0.7 Version history: v1.2.1 | 2026-05-12T17:46:26.544Z | user v1.86: restore full SKILL.md v1.2.0 | 2026-05-12T15:5","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"mt4-trader/\n├── SKILL.md                         # 本使用说明\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\n│   [用户手动下载 .ex4 文件放到此目录]\n├── scripts/                         # Python 脚本\n│   ├── mt4_client.py                # Python 交易客户端（核心）\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\n│   ├── alert_commands.py            # 价格预警命令行工具\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\n│   ├── sr_strategy.py               # 支撑压力位策略编排\n│   └── summary_utils.py             # 持仓汇总工具模块\n└── references/\n    └── api_docs.md                  # 完整 API 参考文档"},{"language":"text","snippet":"%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>"},{"language":"text","snippet":"C:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\n│   ├── mt4_bridge.ex4\n│   └── 芝麻网格V2.ex4\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\n│   └── tools2.3.ex4\n├── Indicators\\\n└── Scripts\\"},{"language":"bash","snippet":"cd scripts\\\npython deploy_ex4.py deploy"},{"language":"bash","snippet":"cd scripts\\\npython mt4_client.py"},{"language":"text","snippet":"=== MT4 交易助手 ===\n1. 获取报价  2. 查询持仓  3. 交易  4. 网格策略\n请输入指令："}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"# MT4 智能交易桥 · 量化自动交易系统\r\n\r\nMT4 智能交易桥。通过文件 I/O 与 MT4 EA 通信，无需 DLL 或额外依赖。支持 OpenClaw（小龙虾 AI Agent）通过微信 / 飞书 / Telegram 等渠道直接操作 MT4 交易。\r\n\r\n> **关键词**：MT4, MetaTrader 4, 外汇交易, Python交易, 算法交易, 自动交易, 网格策略, 支撑压力位, ATR止损, 移动止损, 黄金交易, 原油交易, 比特币交易, OpenClaw, 小龙虾, AI交易助手, 微信操作MT4, 飞书操作MT4\r\n\r\n\r\n\r\n\r\n## 🎯 自然语言交互示例\r\n\r\n### 📱 微信/飞书/Telegram 口语化命令\r\n\r\n| 你说 | MT4 做 |\r\n|-----|--------|\r\n| 黄金多少钱 | 返回 XAUUSD.s 实时报价 |\r\n| 买黄金 0.05 手 | 市价买入 0.05 手 |\r\n| 平仓 95832104 | 平掉指定订单 |\r\n| 全平 | 平掉所有持仓 |\r\n| 查持仓 | 列出当前所有持仓 |\r\n| 设置止损 95832104 4500 | 设置止损位 |\r\n| 启动黄金网格 | 启动黄金网格策略 |\r\n| 获取MT4 黄金的1小时K线数据进行行情分析 | 将会自动帮您分析好黄金后市走向以及给出交易方案 |\r\n\r\n\r\n---\r\n\r\n## 文件结构\r\n\r\n```\r\nmt4-trader/\r\n├── SKILL.md                         # 本使用说明\r\n├── mql4/                            # MT4 EA 编译文件（.ex4，由脚本生成）\r\n│   [用户手动下载 .ex4 文件放到此目录]\r\n├── scripts/                         # Python 脚本\r\n│   ├── mt4_client.py                # Python 交易客户端（核心）\r\n│   ├── deploy_ex4.py                # EA 部署指引（显示下载链接和安装步骤）\r\n│   ├── alert_commands.py            # 价格预警命令行工具\r\n│   ├── position_summary.py          # 持仓汇总（命令行输出）\r\n│   ├── position_summary_cron.py     # 持仓汇总（定时推送）\r\n│   ├── sr_strategy.py               # 支撑压力位策略编排\r\n│   └── summary_utils.py             # 持仓汇总工具模块\r\n└── references/\r\n    └── api_docs.md                  # 完整 API 参考文档\r\n```\r\n\r\n---\r\n\r\n## 安装步骤（详细版）\r\n\r\n### 第一步：找到你的 MT4 数据目录\r\n\r\n每个 MT4 安装实例都有一个专属的数据目录，格式为：\r\n\r\n```\r\n%APPDATA%\\MetaQuotes\\Terminal\\<32位随机ID>\r\n```\r\n\r\n例如：`C:\\Users\\Administrator\\AppData\\Roaming\\MetaQuotes\\Terminal\\ABC123...`\r\n\r\n> 怎么找？在 MT4 中按 `F7` 打开 MetaEditor（代码编辑器），点击菜单 `文件 → 打开数据文件夹`，弹出的路径就是你的 MT4 数据目录。\r\n\r\n### 第二步：确认 MT4 安装目录\r\n\r\nEA 文件需要部署到两个不同的目录：\r\n\r\n| EA 文件 | 目标目录 | 说明 |\r\n|---------|---------|------|\r\n| `mt4_bridge.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 主程序 EA（必须） |\r\n| `芝麻网格V2.ex4` | `MT4安装目录\\MQL4\\Experts\\` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | `MT4安装目录\\MQL4\\Libraries\\` | **网格策略依赖库**（网格必须，不是 Experts！） |\r\n\r\n> ⚠️ `Libraries` 目录与 `Experts`、`Indicators` 同级，**不是** `Experts` 的子目录。\r\n\r\n典型路径结构：\r\n```\r\nC:\\Program Files (x86)\\EBC Financial Group Cayman MT4 Terminal\\MQL4\\\r\n├── Experts\\           ← mt4_bridge.ex4, 芝麻网格V2.ex4 放这里\r\n│   ├── mt4_bridge.ex4\r\n│   └── 芝麻网格V2.ex4\r\n├── Libraries\\         ← tools2.3.ex4 放这里（与 Experts 同级！）\r\n│   └── tools2.3.ex4\r\n├── Indicators\\\r\n└── Scripts\\\r\n```\r\n\r\n### 第三步：下载 .ex4 文件\r\n\r\n从 Gitee 仓库下载 3 个 .ex4 文件：\r\n\r\nhttps://gitee.com/3603317/skill-plugin/tree/master/mt4\r\n\r\n需要下载的文件：\r\n\r\n| 文件 | 说明 |\r\n|------|------|\r\n| `mt4_bridge.ex4` | 主程序 EA（**必选**） |\r\n| `芝麻网格V2.ex4` | 网格策略 EA（可选） |\r\n| `tools2.3.ex4` | 网格策略依赖库（选网格则必选） |\r\n\r\n> 点击文件 → 点右上角 **Raw** 按钮即可保存到本地。\r\n\r\n下载后放入 skills\\mt4-trader\\mql4\\ 目录，然后运行以下命令一键部署到 MT4：\r\n\r\n```bash\r\ncd scripts\\\r\npython deploy_ex4.py deploy\r\n```\r\n\r\n### 第四步：在 MT4 中挂载 EA\r\n\r\n**挂载 mt4_bridge（核心，必须操作）：**\r\n1. 打开 MT4，按 `Ctrl+N` 打开左侧\"导航器\"面板\r\n2. 展开\"EA 交易\"列表，找到 `mt4_bridge`\r\n3. 用鼠标左键拖拽到任意品种图表上（推荐 XAUUSD.s 或主流品种）\r\n4. 弹出 EA 属性对话框 → **选项卡\"常用\"**：\r\n   - **允许实时交易** → ✅ 勾选（必须！）\r\n   - **允许导入 DLL** → ✅ 勾选\r\n   - **确认取消\"手动交易禁止\"** 等限制\r\n5. 点\"确定\"关闭对话框\r\n6. 图表右上角显示一个 EA 图标：\r\n   - 😊 **绿色笑脸** → ✅ 正常工作中\r\n   - 😢 哭脸或灰"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn723gzdjbmh391jks7n35xdf982v5y7\",\n  \"slug\": \"mt4-trader\",\n  \"version\": \"1.2.1\",\n  \"publishedAt\": 1778607986544\n}"},{"path":"references/api_docs.md","content":"# MT4 Bridge API Reference\r\n\r\n## Symbols: XAUUSD.s (Gold), BTCUSD, XAGUSD, XTIUSD.s\r\n\r\n## Methods\r\n\r\n### Trading\r\nbuy(symbol, lots), sell(symbol, lots), close_all(symbol), close_by_magic(symbol, magic)\r\n\r\n### Pending Orders\r\nbuy_limit(symbol, lots, price), sell_limit(symbol, lots, price), buy_stop(symbol, lots, price), sell_stop(symbol, lots, price), cancel_order(ticket)\r\n\r\n### SL/TP\r\nset_sl(symbol, ticket, price), set_tp(symbol, ticket, price), modify_order(symbol, ticket, price, sl, tp)\r\n\r\n### Grid (Sesame EA)\r\ngrid_start(symbol, direction), grid_stop(symbol), grid_close_all(symbol), grid_status(symbol), grid_set_sl_tp(symbol)\r\n\r\n### Chart Objects (v1.86)\r\ndraw_sr_levels(symbol, timeframe), clear_chart_objects(symbol), draw_hline(symbol, name, price), clear_hline(symbol, prefix)\r\n\r\n### Data\r\nadd_alert(symbol, price, tip), get_klines(symbol, timeframe, count), get_positions(symbol), get_notifications(symbol)"},{"path":"skill-card.md","content":"## Description:\n\nMT4 Trader Bridge enables Python-to-MetaTrader 4 expert-advisor communication through local JSON files for market data, trading, order management, risk controls, alerts, and grid strategies.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[apuba](https://clawhub.ai/user/apuba)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and trading-automation operators use this skill to connect an agent or Python scripts to MT4 for quotes, position review, order placement, stop-loss/take-profit changes, alerts, summaries, and grid strategy control.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill asks users to install unverified MT4 .ex4 expert-advisor binaries that can affect trading accounts.\n\nMitigation: Use only a demo or tightly limited account unless the binaries are independently trusted and verified; pin and hash-check any downloaded .ex4 files.\n\nRisk: The bridge exposes high-impact live trading actions, including order placement, bulk close, stop changes, and grid strategy controls.\n\nMitigation: Require explicit confirmation for every trade or bulk-close action and do not enable live trading for unverified files.\n\nRisk: The file-based bridge directory and summary webhook can be abused if untrusted local processes or endpoints are allowed.\n\nMitigation: Restrict the bridge directory to trusted local processes and use only HTTPS allowlisted webhook endpoints for summaries.\n\nRisk: The artifact instructs users to enable DLL imports for MT4 expert advisors.\n\nMitigation: Do not enable DLL imports for unverified files.\n\n## Reference(s):\n\n- [MT4 Bridge API Reference](artifact/references/api_docs.md)\n- [ClawHub Skill Page](https://clawhub.ai/apuba/skills/mt4-trader)\n- [Gitee MT4 Download Page](https://gitee.com/3603317/skill-plugin/tree/master/mt4)\n\n## Skill Output:\n\n**Output Type(s):** [Text, Markdown, Code, Shell commands, Configuration, Guidance]\n\n**Output Format:** [Markdown guidance with Python and shell command examples]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May produce local JSON bridge requests, position summaries, alert configurations, and webhook message payloads when scripts are run.]\n\n## Skill Version(s):\n\n1.2.1 (source: server-resolved release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies. Skill: Mt4 Trader Owner: apuba Summary: MT4 Trader Bridge enables Python to MT4 EA communication via files for trading, order management, risk control, and grid strategies without extra dependencies. Tags: automated-trading:1.0.7, forex:1.0.7, grid:1.0.7, latest:1.2.1, mt4:1.0.7, python:1.0.7, trading:1.0.7 Version history: v1.2.1 | 2026-05-12T17:46:26.544Z | user v1.86: restore full SKILL.md v1.2.0 | 2026-05-12T15:5","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1002,"uniquenessScore":53,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T00:21:25.734Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T00:21:25.734Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T03:54:58.360Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}