MT5-PositionMaster 是一個 MetaTrader 5 Expert Advisor(MT5 EA),集成了完整的 Telegram Bot 功能,讓交易者能夠隨時隨地通過手機遠程管理所有交易倉位(無開倉功能)。無需額外的外部服務器或 Python 腳本,所有功能都在 MT5 內原生運行。
┌─────────────────────────────┐
│ 📋 倉位管理面板 │
├─────────────────────────────┤
│ [✂️ 平倉一半] [🚫 平掉全部] │
│ [🎯 設置TP] [🛡️ 設置SL] │
│ [❌ 刪除TP] [❌ 刪除SL] │
└─────────────────────────────┘
| 指令 | 功能 | 示例 |
|---|---|---|
/menu |
顯示操作按鈕面板 | /menu |
/settp <價格> |
設置所有倉位止盈 | /settp 2050.50 |
/setsl <價格> |
設置所有倉位止損 | /setsl 2040.30 |
/rtp |
刪除所有倉位止盈 | /rtp |
/rsl |
刪除所有倉位止損 | /rsl |
/ch |
平倉約一半倉位 | /ch |
/ca |
平掉所有倉位 | /ca |
/cancel |
取消當前操作 | /cancel |
/help |
顯示幫助資訊 | /help |
- 批量設置 TP/SL - 一鍵為所有倉位設置相同的止盈止損價格
- 批量刪除 TP/SL - 快速移除所有倉位的止盈止損設置
- 跨品種操作 - 自動管理所有交易品種的倉位
- 實時反饋 - 每次操作後顯示成功/失敗詳情
- 平倉一半 - 使用貪婪演算法選擇最接近 50% 手數的倉位組合
- 全部平倉 - 一鍵關閉所有開倉倉位
- 單倉位保護 - 僅有 1 個倉位時自動跳過半倉操作
- 詳細統計 - 顯示平倉手數、成功/失敗數量
- 優化超時 - 2 秒 HTTP 超時,5 秒長輪詢
- 並發處理 - 高效的訊息輪詢機制
- 錯誤重試 - 自動處理網路錯誤和超時
┌─────────────────────────────────────────────────────────┐
│ Telegram Bot │
│ (用戶交互界面) │
└────────────────────┬────────────────────────────────────┘
│ Long Polling
│ (5秒輪詢)
▼
┌─────────────────────────────────────────────────────────┐
│ MT5-PositionMaster EA │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 訊息處理層 │ │
│ │ • ProcessTelegramUpdates() │ │
│ │ • ParseAndProcessUpdates() │ │
│ │ • ProcessSingleUpdate() │ │
│ └───────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌───────────────────┴──────────────────────────────┐ │
│ │ 指令路由層 │ │
│ │ • ProcessCommand() (指令處理) │ │
│ │ • ProcessCallbackQuery() (按鈕點擊處理) │ │
│ └───────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌───────────────────┴──────────────────────────────┐ │
│ │ 狀態管理層 │ │
│ │ • UserState (IDLE/WAITING_TP/WAITING_SL) │ │
│ │ • 自動狀態重置 │ │
│ └───────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌───────────────────┴──────────────────────────────┐ │
│ │ 業務邏輯層 │ │
│ │ • ModifyAllTakeProfit() (設置止盈) │ │
│ │ • ModifyAllStopLoss() (設置止損) │ │
│ │ • RemoveAllTakeProfit() (刪除止盈) │ │
│ │ • RemoveAllStopLoss() (刪除止損) │ │
│ │ • CloseHalfPositions() (平倉一半) │ │
│ │ • CloseAllPositions() (平倉全部) │ │
│ └───────────────────┬──────────────────────────────┘ │
│ │ │
│ ┌───────────────────┴──────────────────────────────┐ │
│ │ MT5 交易 API │ │
│ │ • PositionsTotal() │ │
│ │ • PositionSelect() │ │
│ │ • OrderSend() │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
// 5 秒長輪詢 + 2 秒緩衝
getUpdates?offset=<last_id>&timeout=5&allowed_updates=["message","callback_query"]// JSON 格式的按鈕定義
{
"inline_keyboard": [
[
{"text": "✂️ 平倉一半", "callback_data": "CH"},
{"text": "🚫 平掉全部", "callback_data": "CA"}
],
[
{"text": "🎯 設置TP", "callback_data": "SETTP"},
{"text": "🛡️ 設置SL", "callback_data": "SETSL"}
]
]
}目標:平倉約 50% 手數
算法:貪婪選擇最接近目標的倉位組合
示例:
倉位:[0.1, 0.1, 0.1, 0.1, 0.1] (5個倉位,總計 0.5 手)
目標:0.25 手 (50%)
選擇:前 3 個倉位 (0.3 手) - 最接近目標
// Chat ID 驗證
if(chatID != InpChatID) {
SendTelegramMessageToChatID("[錯誤] 未授權訪問!", chatID);
return;
}- 一台常開的電腦並運行 MetaTrader 5
- Telegram 帳號
- 穩定的網路連接
-
打開 Telegram,搜索
@BotFather -
創建新 Bot
-
獲取 Bot Token
BotFather 會返回類似這樣的 Token: 123456789:ABCdefGHIjklMNOpqrsTUVwxyz1234567890
-
打開剛創建的 Bot,發送任意訊息
-
打開以下 URL(替換 <YOUR_BOT_TOKEN>)
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates -
找到 Chat ID
{ "result": [{ "message": { "chat": { "id": 123456789 ← 這就是你的 Chat ID } } }] }
-
允許 WebRequest Telegeam API
- 打開 MT5 → 工具 → 選項 → Expert Advisors
- 勾選 "允許 WebRequest 訪問以下 URL"
- 添加:
https://api.telegram.org
-
複製 EA 程式
將 MT5-PositionMaster.mq5 複製到: <MT5目錄>/MQL5/Experts/ -
編譯 EA
- 在 MT5 中打開 MetaEditor
- 打開 MT5-PositionMaster.mq5
- 按 F7 編譯
-
拖動 EA 到圖表
- 在 MT5 導航器中找到 MT5-PositionMaster
- 拖動到任意圖表
-
配置參數
Bot Token: <貼上你的 Bot Token> Chat ID: <貼上你的 Chat ID> 輪詢間隔: 2 (秒) 快速模式: false (推薦) -
允許自動交易
- 確保圖表右上角有圖標,並開啟演算法交易
在 Telegram Bot 中發送:
/help
如果收到機器人教學訊息,說明設定成功!
┌─────────────────────────────────────────────┐
│ 1. 發送 /menu 顯示操作面板 │
├─────────────────────────────────────────────┤
│ 2. 點擊按鈕執行操作 │
│ • 平倉類:立即執行 │
│ • 設置類:等待輸入價格 │
│ • 刪除類:立即執行 │
├─────────────────────────────────────────────┤
│ 3. 查看操作結果 │
│ • 成功/失敗統計 │
│ • 詳細錯誤信息 │
│ • 自動刷新面板 │
└─────────────────────────────────────────────┘
# 設置止盈
/settp 2050.50
# 設置止損
/setsl 2040.30
# 刪除止盈
/rtp
# 刪除止損
/rsl
# 平倉一半
/ch
# 平掉全部
/ca| 參數名稱 | 類型 | 默認值 | 說明 |
|---|---|---|---|
Bot Token |
string | "" | Telegram Bot Token(必填) |
Chat ID |
long | 0 | 授權的 Telegram Chat ID(必填) |
輪詢間隔 |
int | 2 | 訊息輪詢間隔(秒),建議 1-5 |
快速模式 |
bool | false | 是否啟用快速模式 |
- 每次操作後自動刷新面板
- 更好的用戶體驗
- 響應時間:2-6 秒
- 跳過面板自動刷新
- 減少 1 次 API 調用
- 響應時間:1-4 秒
- 需要手動發送
/menu刷新面板
如果遇到回應慢的問題:
-
檢查網絡延遲
ping api.telegram.org
-
調整輪詢間隔
- 降低到 1 秒可以更快接收訊息
- 提高到 5 秒可以減少網絡流量
// 只允許指定的 Chat ID 使用
if(chatID != InpChatID) {
Print("[警告] 未授權的 Chat ID 嘗試訪問:", chatID);
SendTelegramMessageToChatID("[錯誤] 未授權訪問!", chatID);
return;
}// 防止重複處理舊訊息
if(updateID <= g_lastUpdateID)
return; // 已處理過的訊息// 連續錯誤超過 10 次時停止
if(g_errorCount > MAX_ERROR_COUNT) {
Alert("錯誤次數過多,請檢查網絡連接和配置");
}收到更新 → 提取 update_id → 驗證 Chat ID → 判斷類型
│ │ │ │
▼ ▼ ▼ ▼
檢查重複 更新 offset 通過驗證 message 或 callback_query
│ │ │ │
▼ ▼ ▼ ▼
跳過舊訊息 下次輪詢使用 處理訊息/回調 執行相應操作
STATE_IDLE (空閒)
│
├─ 點擊 [🎯 設置TP] ──→ STATE_WAITING_TP (等待輸入止盈)
│ │
│ ├─ 輸入數字 ──→ 執行設置 ──→ STATE_IDLE
│ ├─ 輸入 cancel ──→ STATE_IDLE
│ └─ 點擊其他按鈕 ──→ 自動重置 ──→ STATE_IDLE
│
└─ 點擊 [🛡️ 設置SL] ──→ STATE_WAITING_SL (等待輸入止損)
│
├─ 輸入數字 ──→ 執行設置 ──→ STATE_IDLE
├─ 輸入 cancel ──→ STATE_IDLE
└─ 點擊其他按鈕 ──→ 自動重置 ──→ STATE_IDLE
本項目採用 MIT 許可證 - 詳見 LICENSE 文件