分類
平台
難度
入門
適用情境
MT5 操作EA 評估

魔術數字

EA 在自己發出的每一筆委託上打的一個整數,用來認出自己的部位,並且不去碰帳戶裡的其他任何東西。

亦稱:EA 魔術號, 訂單魔術號, MAGIC

更新於 · 審閱於

一句話講清

每一筆交易上的名牌。終端並不在乎是誰開的倉,所以每個 EA 在委託單上寫下自己的號碼,之後只碰帶著這個號碼的單子。

為什麼重要

MetaTrader 讓帳戶裡的每個 EA 看到完全一樣的全部部位。沒有標記,EA 就無法把自己的交易和你的、或者另一個 EA 的區分開——而管錯了部位的 EA,是一種會花錢的 bug,不是一種會報錯的 bug。

  • 正是它才讓「在一個帳戶上同時跑好幾個 EA」這件事一開始就成為可能。
  • 它保護手動交易:那些單子帶著魔術號 0,寫得正確的 EA 永遠不會碰它們。
  • 它也是事後把交易紀錄按策略拆開的辦法——這個標記會一直留到成交紀錄裡。

在 MetaTrader 5 中

在 MT5 的什麼位置

  • 圖表 → EA 屬性(F7)→ 輸入參數——EA 自己的 MagicNumber 輸入項
  • 策略測試器 → 輸入參數——測試時用的是同一個輸入項
  • MQL5 程式碼:送出時用 MqlTradeRequest.magic,回讀時用 POSITION_MAGIC / ORDER_MAGIC / DEAL_MAGIC

EA 如何使用它

  • 啟動時設定一次——CTrade::SetExpertMagicNumber(MagicNumber)——此後 EA 送出的每一筆委託都帶著這個標記。
  • 每一輪都過濾:部位迴圈在修改、移動停損或平掉任何東西之前,會跳過 POSITION_MAGIC 不屬於自己的單子。
  • 紀錄也照樣過濾,這樣每個 EA 的統計只由那個 EA 的成交算出來。
  • mt5depot Builder 產生的每一個 EA 都帶一個 MagicNumber 輸入項,取值由策略推導而來,所以兩個不同的產生品開箱即用也不會撞號。

常見設定

設定項 常見取值 備註
手動交易 0 終端的預設值。EA 絕不應該去管魔術號 0。
一個 EA、一個商品 任意唯一整數 好記就行——20260807、1001。
同一個 EA 跑在多個商品上 每張圖表一個值 否則 EURUSD 那份會把 GBPUSD 那份的部位平掉。
同時跑多套策略的組合 EA 每條腿一個值 每條腿都需要自己的標記,才能被獨立移動停損與平倉。

常見運行問題

  • 兩份實例留在同一個魔術號上:各自把對方的部位當成自己的,在錯誤的時刻平掉。
  • 在有部位的時候改魔術號會讓它們變成孤兒——EA 認不出幾分鐘前自己開的單,而且再也不會有什麼自動去平掉它們。
  • 把魔術號留在 0,等於讓 EA 接管你的手動交易。
  • 終端重啟後用預設值而不是你設定過的值重新掛上 EA,會悄悄產生同樣的孤兒問題。

相關 MT5 函式

CTrade::SetExpertMagicNumber()
設定這份實例此後每一筆委託都會帶的標記。
PositionGetInteger(POSITION_MAGIC)
從一筆部位上讀出標記。
OrderGetInteger(ORDER_MAGIC)
從一筆掛單上讀出它。
HistoryDealGetInteger(ticket, DEAL_MAGIC)
從一筆已平倉的成交上讀出它,紀錄按 EA 拆分靠的就是這個。

範例

一個帳戶上跑三個 EA。每個都打上自己的號碼,所以儘管三個都看得見全部六筆部位,每個部位迴圈只碰屬於自己的那幾行。

一個終端、一個帳戶、三個主人——把他們分開的只有這個標記。
EURUSD 上的趨勢 EA
20260101
USDJPY 上的均值回歸 EA
20260102
你的手動交易
0
沒有任何 EA 認領這個標記,所以不會有自動的東西去平掉它們。

計算 if (PositionGetInteger(POSITION_MAGIC) != MagicNumber) continue;

結果 每個 EA 只管自己開出來的部位

示意數字,並非任何上架 EA 的實際紀錄。

怎麼使用

把魔術數字當成帳戶設定,而不是策略參數:在 EA 上實盤之前寫下來,並且在有部位的時候絕不去改。

  • 按「正在執行的實例」分配取值,而不是按 EA 產品——同一個 EA 掛在兩張圖表上就需要兩個值。
  • 留一份清單。一旦跑到四五個實例,沒記下來的標記和撞號的標記就分不出來了。
  • 絕不要重用還掛著部位的標記,哪怕那個 EA 你已經卸掉了。
  • 每次重裝終端或還原設定檔之後都檢查一遍,預設值就是從那兒回來的。

這個值本身對 MetaTrader 沒有任何意義——任何整數都行。唯一重要的是它在那個帳戶上跑著的東西裡是唯一的。

常見誤解

以為魔術數字會影響成交

它不改變委託成交的任何環節。它是中繼資料:券商不會據此行動,它對價格、點差與滑價都沒有影響。

一個 EA 跨多張圖表只用一個魔術數字

真正要緊的身分是正在執行的實例,不是產品。兩張圖共用一個標記,意味著兩份實例在管同一池部位。

為了「重設」一個不聽話的 EA 而去改它

已經開著的部位仍然帶著舊標記。改輸入項等於把它們拋下:EA 不再認得它們,它們會一直開著,直到手動平倉或被強制平倉。

以為魔術數字會把帳戶結單分開

終端的「交易」分頁並不顯示它。要按 EA 分開結果,必須從紀錄裡讀 DEAL_MAGIC,那是報表工具做的事——不是預設結單會給你的。

深入說明

這個標記沒有一併買到的東西,在這個貨架上數出來

這裡公開的 14 支 EA數值
帶 MagicNumber 輸入項的商品10
安裝時需要改動它的商品0
要求你在沒有別的東西交易該商品的地方執行的商品8
其中仍然帶著 MagicNumber 輸入項的商品6
被不止一個商品佔用的交易商品15 個裡的 7 個
不能共用一個帳戶的 EA 組合91 組裡的 15 組

把第三行與第四行放在一起讀。給委託打標記是一件事;判斷一個新訊號是否被允許是另一件事,而一個把自己限制在一筆部位的 EA 必須先去數。如果它用 PositionsTotal() 加一次商品檢查來數,別人的部位就會算進總數;如果它先按 POSITION_MAGIC 過濾,就不會。這裡有六個商品帶著這個輸入項、卻照樣印著那句警告,這就告訴了你它們的部位計數用的是哪一種。

所以搭配的問題其實是商品的問題,而且在買之前就能回答。USD/JPY 同時被四個商品佔用—— Iridescence、Kestrel Hover、Lanternfish 與 Tessera——所以它們中任何兩個都不該放在一起。EUR/GBP 現在也有兩檔,Ballast 與 Thunderhead。只有 Orrery、Peregrine 與 Zerqon 不和任何人重疊。兩個確實重疊的時候,分開帳戶能解決標記解決不了的事:那樣每個 EA 數的就是一個只含自己交易的池子。我們的方法論會按商品記錄每一次公開的執行,這正是同一個區分從測量那一側看過去的樣子。

常見問題

我該用哪個魔術數字?
任何在那個帳戶上還沒被佔用的整數,並且不要用 0——那個值屬於手動交易。像 20260807 這樣日期形式的值,在多份實例同時執行時最容易追蹤。
兩個 EA 可以共用同一個魔術數字嗎?
技術上可以,而且這是難以定位的虧損的常見成因:每份實例都把對方的部位當成自己的,可能在錯誤的時刻平掉或移動停損。請給每一份正在執行的實例各自的取值。
魔術數字在策略測試器裡重要嗎?
只測一個 EA 的時候不重要,因為測試帳戶裡沒有別的東西在交易。一旦同一個實盤或模擬帳戶上跑著不止一個 EA,它就重要了。