2026年9月29日 星期二

半自動出場工具:設計規劃與思路整理

 寫給想從零開始規劃一支半自動EA的交易者


一、這支工具原始思路

市面上大多數EA分成兩種極端:全自動策略機器人,或是純手動下單面板。但很多交易者真正需要的是中間地帶——進場交給自己的判斷,出場交給紀律。人在市場裡最容易失守的不是「該不該進場」,而是「獲利之後有沒有保護、虧損之後有沒有守住停損」。這支工具的出發點很單純:把「出場管理」這件最容易被情緒干擾的事,交給不會累、不會猶豫的程式。

設計上刻意不做自動進場判斷。進場牽涉太多主觀因素——技術分析、消息面、盤感——硬要自動化容易變成一套自己都不信任的黑盒子。與其做一個不敢重倉使用的全自動策略,不如做一個「進場我來,出場你顧」的協作型工具。


二、核心設計原則

整個開發過程中,幾個原則被反覆拿出來檢驗每一個新功能。

只管自己的部位,不干涉別人。交易者的圖表上常常同時有手動單、其他EA的單,工具如果不分青紅皂白地全部接管,風險很高。所以一開始就決定用Magic Number過濾,只管理自己開的單;手動單要不要一起接管,交給使用者自己決定,而不是預設全部接管。

停損停利數字要看得懂,不要心算。點數這個單位在不同商品上代表的意義天差地遠——同樣是「600點」,在指數CFD上可能是6塊錢的距離,換到外匯又是完全不同的意義,這是最容易讓人設錯停損的地方。設計後來全面改成百分比輸入,讓「多寬的停損」這件事跨商品都用同一套邏輯理解,並且在面板上即時把百分比換算成點數、換算成大約多少美元,讓使用者下單前就看得懂自己在冒多大風險,不用自己拿計算機心算。

相容性優先於效率。不同券商、不同商品的執行模式差異很大,指數CFD常見的「交易所式執行」不允許開倉指令同時夾帶停損停利,會直接被拒單。與其為每個商品寫特殊判斷,不如統一採用「先開倉、成功後再補停損停利」的兩段式下單,換取在任何執行模式下都能穩定運作。

風控要主動擋,不能只靠使用者自律。部位上限、帳戶保證金風控都設計成EA主動擋單,而不是被動提醒。人在盤中情緒起伏時,「提醒」往往沒用,「按鈕按下去也沒反應」才有效。


三、功能模組拆解

半自動下單面板:BUY / SELL / CLOSE三顆基本按鈕,加上一顆CLOSE ALL SYMBOLS。同一個交易邏輯常常會用在多個商品的圖表上,一鍵平掉所有相關部位是實務上真的會用到的功能,不是為了功能而功能。

兩種出場邏輯:追蹤止損與保藍。追蹤止損讓SL持續跟著行情移動,距離基準是目前市價,保護距離隨行情浮動;保藍模式(均價/各別兩種)只鎖一次,鎖定後不再變動,基準是開倉價,是固定值。這兩種模式對應的其實是兩種不同的交易心態:追蹤止損適合「讓利潤奔跑」的思路,保藍適合「先求不虧、再談獲利」的思路。

初始停損停利:開倉當下就用百分比自動帶上SL/TP,避免部位在還沒獲利到追蹤/保藍的觸發門檻之前,完全處於沒有保護的裸奔狀態——這其實是所有出場管理工具最容易忽略、卻風險最大的一個空窗期。

風控層:部位上限限制多空各自同時持有筆數;下單前用OrderCalcMargin()估算既有部位加上這筆新單總共需要的保證金,超過帳戶餘額就直接擋單並跳提示;StopsLevel與TickSize對齊確保算出來的價格符合券商精度要求,不會因為小數位或距離不夠被拒單。

資訊面板:在場部位盈虧點數,以及百分比設定換算成點數與大約美元金額,兩塊即時顯示,目的只有一個——讓使用者在按下按鈕之前,先知道自己在做什麼決定。


四、關鍵取捨

本EA之外的手動單要另外做接管開關,而不是預設全管,也是同樣的思路。手動下單往往是使用者臨時起意、想法還沒定型的單,不一定希望被同一套追蹤/保藍邏輯管理,把主導權留給使用者自己決定,比工具自作主張更符合「半自動」這個定位。

EasyTrader 半自動出場工具 使用說明

版本對應:EasyTrader_半自動出場工具.mq5 v1.30+(百分比版本)


一、這支EA是做什麼的

這是一支「半自動」交易輔助工具,本身不會自動判斷進場,進場仍由自己決定(用面板按鈕下市價單,或直接在圖表上手動掛限價/突破單)。EA 負責的是進場之後的事:

  • 提供面板按鈕手動下市價單、一鍵平倉(單一商品/跨所有商品)
  • 開倉時可自動帶上初始停損停利(百分比設定)
  • 幫你追蹤止損(Trailing Stop)
  • 幫你把 SL 移到成本價附近鎖利(保藍 / Breakeven)
  • 只管理「屬於自己」的部位(依 Magic Number 判斷),可選擇是否連同手動單一起接管
  • 下單前自動檢查帳戶保證金是否足夠,不足直接擋單
  • 面板即時顯示在場部位盈虧點數,以及各項百分比設定換算成的點數與大約美元金額

二、面板按鈕

掛上EA後,圖表左上角會出現五顆按鈕:

按鈕 功能
BUY 用 InpLotSize 設定的手數,市價買進。下單前會先檢查部位上限與帳戶保證金,若有設定初始SL/TP會自動補上
SELL 同上,方向相反
CLOSE 平掉目前圖表商品中,屬於本EA管理範圍的多單與空單
CLOSE ALL SYMBOLS 平掉整個帳戶、所有商品中,屬於本EA管理範圍(同一組Magic Number)的所有部位
點數資訊:ON/OFF 切換右側「點數換算面板」的顯示/隱藏。綠底=顯示中,灰底=已隱藏

按 BUY / SELL 時,依序會經過三道檢查,任何一關沒過就不會送單:

  1. 部位上限(InpMaxPositions)
  2. 帳戶保證金風控(見第七節)
  3. 通過才真正呼叫下單

三、在場部位盈虧顯示

按鈕列下方會列出目前圖表商品、屬於本EA管理範圍內的每一筆部位:

#123456789 多 0.10手  +125.3點
#123456790 空 0.10手  -42.0點

獲利用 InpPnlProfitColor(預設綠色)、虧損用 InpPnlLossColor(預設紅色)。點數算法:多單 (現價-開倉價)/Point(),空單 (開倉價-現價)/Point(),是純報價點數,不含手續費/庫存費/滑點。文字樣式由 InpPnlFontName / InpPnlFontSize / InpPnlFontBold 控制。


四、點數換算面板(百分比 → 點數 → 美元)

面板右側列出所有跟百分比有關的參數,換算成點數與大約美元金額:

初始SL(0.50%) ≈ 333.0點 ≈ $16.65 USD
初始TP(4.00%) ≈ 2664.0點 ≈ $133.20 USD
追蹤觸發(0.50%) ≈ 333.0點 ≈ $16.65 USD
追蹤保護距離(0.80%) ≈ 532.8點 ≈ $26.64 USD
保藍觸發(1.00%) ≈ 666.0點 ≈ $33.30 USD
保藍鎖定(0.25%) ≈ 166.5點 ≈ $8.33 USD
保藍啟動緩衝(0.25%) ≈ 166.5點 ≈ $8.33 USD
參考價:66600.00 手數:0.01 Point:0.01000

(以上為示範數字,實際依商品與目前市價即時計算)

這個面板在算什麼:每一行都用「目前市價」當統一的預覽基準,把百分比換算成實際價格距離,再換算成點數,再用 OrderCalcProfit() 算出對應的美元金額。這是一個通用預覽,不是綁定某一筆實際部位的即時數字——實際下單時,各項參數各自使用自己的基準價(見第六節),會跟面板預覽值略有差異,但通常很接近。

顯示/隱藏由 InpShowPointsInfoPanel(開機預設值)或面板上的「點數資訊」按鈕控制。文字樣式由 InpPointsInfoFontName / FontSize / FontBold / InpPointsInfoColor(一般列)/ InpPointsInfoHighlightColor(參考資訊列)控制,跟按鈕、盈虧顯示完全獨立設定。


五、輸入參數總表

基本設定

參數 說明
InpLotSize 按BUY/SELL按鈕時使用的下單手數。預設0.01,建議先看OnInit跳出的Alert確認該商品實際最小手數
InpMagicNumber 本EA的專屬識別碼。同一商品的所有部位、以及要用CLOSE ALL SYMBOLS一起處理的多商品,都必須用同一組數字

風控/過濾設定

參數 說明
InpMaxPositions 多單、空單各自最多同時持有幾筆(本EA管理範圍內,各商品獨立計算)。0=不限制
InpManageManualPositions 開啟後,Magic Number=0 的手動單也會被納入追蹤/保藍/平倉/初始SLTP補上的管理範圍

起始停損停利設定(百分比)

參數 說明
InpInitialSLPercent 開倉時的初始停損距離,佔開倉價的百分比(例如0.5代表0.5%),0=不設
InpInitialTPPercent 開倉時的初始停利距離,佔開倉價的百分比,0=不設

按鈕文字樣式

InpButtonFontName / InpButtonFontSize / InpButtonFontBold / InpButtonFontColor — 五顆按鈕共用的文字樣式。

盈虧點數顯示樣式

InpPnlFontName / InpPnlFontSize / InpPnlFontBold / InpPnlProfitColor / InpPnlLossColor

點數換算面板樣式

InpShowPointsInfoPanel / InpPointsInfoFontName / InpPointsInfoFontSize / InpPointsInfoFontBold / InpPointsInfoColor / InpPointsInfoHighlightColor

追蹤/保藍設定(百分比)

參數 說明
InpEnableTrailing 總開關
InpTrailingMode 三選一:追蹤止損模式 / BE點保藍模式(均價) / 各別保藍模式(各自開倉價)
InpTrailingTriggerPercent 第一張單獲利大於開倉價的百分比,才啟動追蹤
InpTrailingProtectPercent 追蹤時,SL距離目前市價的百分比
InpBreakevenTriggerPercent 最新一張單獲利大於基準價的百分比,才啟動保藍判斷
InpBreakevenLockPercent 保藍時,SL鎖定在基準價 +/- 幾%
InpBreakevenActivatePercent 市價需超過基準價 +/- 幾%,才真正移動SL(緩衝)

六、三種追蹤/保藍模式,以及各自的百分比基準

  • 追蹤止損模式:SL持續跟著行情移動,不是鎖在固定成本價。InpTrailingProtectPercent的基準是目前市價,距離隨行情即時浮動;InpTrailingTriggerPercent的基準是第一張單開倉價,固定不變。
  • BE點保藍模式:以同方向所有部位的加權均價當基準,一次把所有部位SL都移到均價附近,鎖定後不再變動。InpBreakevenTriggerPercent基準是最新一張單開倉價;InpBreakevenLockPercent/InpBreakevenActivatePercent基準是均價,都是固定值。
  • 各別保藍模式:每一筆部位各自用自己的開倉價當基準,各自獨立鎖利。

保藍模式只處理SL,不會主動設定或改動TP。如果你有設定InpInitialTPPercent,那個TP從開倉起就存在,保藍鎖SL的整個過程中TP會原封不動地留著當停利目標;沒設定初始TP的話,保藍模式也不會主動幫你加一個。EA另外有一道防呆:算出來的新SL如果會跟現有TP衝突(多單SL≥TP、空單SL≤TP,邏輯上顛倒),會直接跳過不送單,並在Log記錄原因。


七、帳戶保證金風控

按BUY/SELL前,EA會用OrderCalcMargin()估算「本EA在所有商品上既有部位所需保證金」加上「這筆新單所需保證金」,跟帳戶餘額比對。超過的話:

  • 直接擋下這筆單,不會送出
  • 跳出Alert()顯示明細:帳戶餘額、既有部位保證金、新單保證金、超出金額
  • 在Log記錄詳細數字

這個估算用OrderCalcMargin()以目前市價重新計算,是業界常用的近似算法,不是券商當初實際鎖定的精確數字,在對沖帳戶等不同保證金模式下可能有些微落差,但拿來當風控門檻是合理的。


八、初始停損停利機制

兩段式下單:按BUY/SELL時,EA會先送純市價單開倉(不帶SL/TP),成功後再用另一筆指令補上初始SL/TP。這是因為部分商品(尤其是交易所式執行的指數CFD)不允許開倉指令同時夾帶SL/TP,會直接被拒單。拆成兩步後,對所有執行模式都相容。

價格精度對齊:百分比換算出來的SL/TP價格,會先對齊該商品的最小跳動單位(TickSize),再對齊報價小數位數(Digits),避免因為小數位不符合券商精度而被拒單。

距離驗證:補SL/TP前,會用券商回報的StopsLevel/FreezeLevel檢查距離是否足夠,不夠的話該筆SL或TP會被跳過並記錄原因。

手動單也會自動補上(僅一次):InpManageManualPositions=true且有設定初始SL/TP百分比時,EA每個tick會檢查目前圖表商品裡Magic=0的手動單,只要完全沒有SL也沒有TP,就自動補上一次。補過之後EA會記住這筆ticket,之後不論你手動怎麼改SL/TP都不會再干涉。這份記錄只存在記憶體,EA重啟會重置。


九、金額換算方式

點數換算面板與初始化Alert裡的美元金額,都是用OrderCalcProfit()計算——這跟MT5終端機自己算盈虧用的是同一套引擎,會正確處理合約大小與幣別換算。只有在OrderCalcProfit()計算失敗時,才會退回用TickValue公式估算,並在Log記錄。

這個換算假設帳戶是USD結算。EA初始化時會在「專家」分頁印出一行驗算資訊(商品合約大小、TickSize、TickValue、以及「價格移動1.00對應多少美元」),可以用來對照驗證換算是否正確。


十、多商品 / 多週期使用方式

部位是「帳戶+商品」層級的東西,跟圖表週期(M1/H1/H4...)無關,同一個商品只需要掛一份EA。不同商品才需要各自掛一份EA,除了CLOSE ALL SYMBOLS,其他所有函式都同時檢查Magic相符與商品相同,不會互相影響。

要用CLOSE ALL SYMBOLS一鍵平掉多個商品的部位,前提是這幾個商品上掛的EA,InpMagicNumber要設成同一組數字——這是唯一「只認Magic、不認商品」的例外設計。如果帳戶裡其他跟本EA無關的策略剛好用了同一組Magic Number,這顆按鈕也會一併平掉它們,建議這組Magic設成一個確定不會撞號的獨特數字。


十一、關於手動掛單

EA不會管理、修改或取消手動掛的限價/突破單,掛單狀態時EA不會碰它。一旦成交變成部位,才依InpManageManualPositions決定要不要接管。EA不會鎖定部位,隨時可以手動平掉被EA接管的部位,不會有殘留異常狀態。


沒有留言:

張貼留言