⚠ SUPERSEDED — Current addendum through Hotfix15 review (2026-06-03)
v3 spec đã được thay thế bởi Hotfix5+, rồi tiếp tục điều chỉnh bởi Hotfix7 prevCache, re-entry, hotfix15 review, và weekend/reopen debug:
  1. DD metric → Account DD (balance−equity)/balance×100 (đồng nhất UI Row 2)
  2. 2-Condition Filter direction FLIPPED — Hotfix4 sai: checkAbove = (lnType==SELL); đúng: (lnType==BUY). BUY dom → đếm BELOW prevLn, SELL dom → đếm ABOVE prevLn.
  3. Anchor REVERTED Hotfix3 L1-fixed → prevLn (relative). Snowball/blow-up chấp nhận theo SS strategic.
  4. State machine SIMPLIFIED: bỏ offset entry; sau Ln-1 fire → "S1 của Ln+1 kích hoạt" ngay (continuous monitor).
  5. L_n+1 fire condition: DD ≥ N×Thr AND Array List of Ln all-negative (drop full-grid Con1 cho L_n+1, giữ cho L1).
  6. prevCache cascade — khi highest Ln close thì cache phải trỏ về highest Ln còn sống; clear chỉ khi full cycle reset.
  7. Re-entry anti-spam — closed-Ln cache phải disarm khi cùng Ln active lại; weekend/reopen cần crossing gate, không chỉ level trigger.
  8. hf15 basket threshold exit — bỏ khỏi spec hiện tại; hard DD loss-floor để check sau.

ALAMO Exit — Spec Preview [v3 + current addendum]

feat/alamo-hedge · updated 2026-06-03 · v3 historical base + Hotfix5/7/15 review

Spec timeline: prototype 18:58 → Max walkthrough 21:37–22:14 → SS reply 23:57 chốt 6/6 ambiguity. Code FBotAlamo.mqh đã unlocked. Trang này lưu state-machine comparison + concrete example với lệnh 0.61 + 3 price scenarios + final spec recap cho SS xác nhận lần cuối.

CURRENT ADDENDUM — 2026-06-03
Spec update sau Hotfix7 + re-entry + hf15 review
1. prevCache: cache không được stale khi Ln cao nhất đóng. Nếu L3 đóng mà L2 còn sống, prevCache phải cascade về L2; nếu không còn Ln sống thì clear cache và chờ full-cycle reset.

2. Re-entry: nếu Dominant Sell, giá đi xuống làm Ln exit đơn lẻ nhưng loop chưa đủ lời để thoát, rồi giá quay lại đúng vùng đã kích hoạt Ln trước đó, ALAMO được re-fire Ln bằng MARKET order. Điều kiện exit đơn lẻ giữ nguyên: re-entry hedge vẫn tự close khi profit > 0 / checkpoint hợp lệ, không đổi rule thoát.

2b. Re-entry guard: cache closed-Ln không được stale. Nếu L2 đã active lại bằng luồng ALAMO thường, cache re-entry của L2 cũ phải clear/disarm. Re-entry không được trigger nếu cùng Ln đang active; với weekend/reopen, phải có crossing/away-then-return gate thay vì chỉ check bid <= savedPrice hoặc ask >= savedPrice.

3. hf15: bỏ AlamoBasketExitBuffer / basket-threshold exit khỏi spec hiện tại. hard DD loss-floor chỉ là safety pad chống cook quá sâu, để kiểm chứng sau, chưa coi là logic exit chính.
SS FINAL SPEC — 23:57 RECAP
3 rules chính SS chốt
1. Hedge direction: đám âm là BUY → hedge là SELL (và ngược lại). Vĩnh viễn opposite.
2. Close cases (chỉ 2, không có 3):
  • (a) Ln đóng trước → full grid đóng sau (eventual cycle close)
  • (b) Đóng toàn bộ grid kể cả Ln (PosMan triggered close-all)
  • Case "chỉ đóng 1 trong 2" → KHÔNG xảy ra theo operational logic
3. 2-Condition Filter (áp dụng cho cả Checkpoint check + L2 trigger):
  • (a) Lệnh ở VỊ TRÍ "trên" (với hedge SELL) / "dưới" (với hedge BUY) so với L1
  • (b) Lệnh đó đang âm
  • Cả 2 yes → biến số cho phép tính L2 lot khi DD ≥ 20%
+ Re-fire: dùng MARKET order.
Hotfix5 correction (2026-05-14): Rule (a) đã được đảo lại sau Interpretation A — "dominant" = main grid majority. BUY dom → L1 = SELL → đếm BELOW (Hotfix4 đã đếm ABOVE = SAI). SELL dom → L1 = BUY → đếm ABOVE. Anchor cho L2/L3 = prevLn (không L1-fixed). Fire = DD ≥ N×Thr + Array List all-negative.
Macro concept
ALAMO đẻ ra 1 lệnh Hedge để cứu Grid
Khi Main Grid đang thua nặng (DD ≥ threshold), ALAMO bắn 1 lệnh ngược chiều với lot = tổng các lệnh đang âm. Mục tiêu: tránh lỗ + hòa vốn bằng cách dùng hedge profit bù cho Grid loss. Mỗi lệnh hedge (L1, L2, ...) là một "mạng sống" của account — khóa drawdown ở mức an toàn để các lệnh kế tiếp có thể trade tiếp mà không tăng DD = Second Chance.

Concrete example — Max 21:37

Stage 2 lifecycle với lệnh anchor 0.61 lot

t=0
Grid BUY drift xuống. Bot mở các lệnh từ index 0 (0.17 lot) đến index 7 (0.61 lot) — lệnh 0.61 là lớn nhất hiện tại, mới mở gần đây.
t=1
FIRE L1 Price Line khiến lệnh 0.61 tăng DD tới 10% threshold → S2 ACTIVE. Bắn L1 SELL với lot = tổng các BUY đang âm (≥ 0.01 lot).
t=2
CLOSE L1 Giá đi xuống → lệnh 0.61 (gần nhất với L1 theo lot/giá) dương trở lại → cắt L1. Loop close thành công → ALAMO RESET.
t=3 (alt)
LOOP FAIL Nếu giá đó chưa làm DD tới 10% (Grid vẫn lỗ) → quay về S1 Monitoring, chờ giá rớt thêm. Nếu sau đó giá quay lại vùng đã kích hoạt Ln, re-entry được phép bắn lại Ln để giữ hedge loop.
t=4 (alt)
WHIPSAW DD quay lại 10% → giá cao hơn price line 0.61 → tiếp tục S2 (L1) → có thể nhảy liên tục ăn sạch profit → trigger increase exit condition + PosMan tái cân bằng.
t=5
ESCALATE L2 Không thoát được L1 → DD ≥ 20% → S3.1 monitor (DD ≥ 2×thr − 2% = 18%) → S3.2 fire L2 với lot = tổng các lệnh âm có lots cao hơn L1 + tất cả đang âm.

3 Price scenarios khi S2 Active

2.1. Đi XUỐNG
L1 (SELL) ngày càng có lãi. Track lệnh 0.61 (gần nhất với L1) — khi nó dương trở lại → cắt L1.
2.1.1 OK → reset · 2.1.2 FAIL → về S1 · 2.1.3 whipsaw → PosMan
2.2. Đi NGANG
Hedge mở nhưng giá xuống chưa đủ thoát + lên chưa đủ vào lệnh tiếp. Giữ trạng thái tới khi đi xuống/lên.
Idle — không action
2.3. Đi LÊN
Ước lượng ~3 lệnh để đủ khối lượng. <3 lệnh: giống 2.1, check lệnh âm to nhất + gần 0.61 (checkpoint). ≥3 lệnh: PosMan kiểm soát.
<3 → ALAMO · ≥3 → PosMan + redundancy

Account "Mạng sống" — DD scale

10% L1
20% L2
30% L3
70% danger
80% DEAD
Mỗi Ln (L1, L2, L3...) = 1 mạng của account. DD bay tới 70-80% → hết cứu. Range 90-150 giá (XAU) → mất kiểm soát DD → nếu rebound thì vẫn sống (ít nhất không lỗ).

3 điểm khác lớn

prevCache
Clear-only → cascade
RISK Highest Ln close làm cache stale
NOW Trỏ về highest Ln còn sống
Re-entry
Closed Ln can re-fire
OLD Ln close rồi chờ loop/grid
NOW Price returns to saved trigger → MARKET re-fire
hf15 exit
Basket threshold removed
DROP combinedNet threshold exit
CHECK hard DD loss-floor later

State machines

CŨ — Prototype 17:00
2-case logic, 3-state machine

Ctrl/Cmd + wheel zoom · drag pan · dbl-click fit

Loading...
MỚI — Prototype 18:58
3-stage state machine, Trường hợp 1/2 + Stage 3 escalation

Ctrl/Cmd + wheel zoom · drag pan · dbl-click fit

Loading...

Full diff table

Aspect CŨ (Prototype 17:00) MỚI (Prototype 18:58)
State model 3-state: STANDBY / S1 / S2 5-state: + S3.1 monitor + S3.2 active
S1 entry trigger RANGER active OR DD ≥ 0.5×threshold DD ≥ 50% threshold (≡ 0.5×, cùng số)
S2 fire condition Con1 (all âm) + Con2 (DD ≥ threshold) SubCon1 (all âm) + DD ≥ threshold
Close logic structure Case 1 (Ln biggest) / Case 2 (not biggest) TH1 (no orders above/below) / TH2 (has orders)
Reference object for close MG-max = lệnh lot lớn nhất Main Grid Lệnh X = lệnh gần Ln nhất (theo gì?)
3-order gate Không có — ALAMO luôn tự đóng MỚI: ≥ 3 lệnh trên/dưới Ln → PosMan đóng
Re-fire timing Q1 pending (a immediate vs b wait) Current: khi Ln đã exit đơn lẻ nhưng loop chưa thoát, price quay lại saved Ln trigger → MARKET re-fire
prevCache after Ln close Clear / stale-risk khi highest Ln đóng Hotfix7: cascade về highest Ln còn sống; chỉ clear khi không còn Ln hoặc full-cycle reset
Escalation L2 DD ≥ 2×thr → fire L2 ngay (1-step) 2-step: S3.1 monitor (DD≥2×thr−2%) → S3.2 fire (DD≥2×thr)
Scaling Ln AlamoEscMultL2=2, AlamoEscMultLnPlus=3 L1=10% DD, L2=20%, L3=30% (clean N× rule)
PosMan integration Implicit (PosMan close loop) Addendum 1 explicit: PosMan close → ALAMO close all redundancy
Safety net Bỏ LnStopLossMult + BlockExitRatio Current: bỏ basket threshold exit; hard DD loss-floor để check sau, không chốt là primary exit
Order type re-fire Q2 pending — em propose MARKET Resolved: MARKET order qua Buy()/Sell(); giữ exit đơn lẻ như cũ

Tại sao margin còn nhưng Main Grid nhìn như không vào?

Evidence từ tester log 20260603.log. Đây là root-cause hiện tại, chưa phải fix final.

1.Đêm 20/2 → sáng 23/2: không phải margin block ROOT CAUSE
Không thấy MARGIN_BLOCK trong window 2026.02.20 20:00 → 2026.02.23 03:00. Margin/free-margin không phải lý do broker/code từ chối.
Trong window này Main Grid vẫn vào tối 20/2: 20:27 buy stop, rồi nhiều sell-stop từ 20:39 tới 23:53. Không có log ngày 21/222/2; sang 23/2 01:00:39-01:00:57 broker trả market closed cho sell-stop 1.11, sau đó 01:01:18 order đi được ngay.
1b.Main Grid thực ra có vào sau khi Skill6 unlock EVIDENCE
Main Grid bị khóa theo sequence khi Skill6 đang tạo grid; chỉ unlock khi Skill6 đủ 8/8 pair hoặc chuyển sang monitoring/breakout.
Log trong window đúng: 2026.02.20 20:27:42 đặt buy stop 0.15, 20:27:43 triggered. Sau đó SELL grid tăng tới level 88 lúc 23:53:41. Sáng 2026.02.23 cũng không phải no-entry: 01:01:18 đặt sell stop 1.11, 01:02:45 triggered; 01:04:30 đặt sell stop 1.34, 01:04:43 triggered.
2.DD hơn 15% nhưng UI có L:#RR... EXPLAINED
L:#RR... là state UI từ g_levels[]: # = active, R = re-entry-ready. Nó không tự chứng minh DD đã đạt L2/L3 đúng rule.
Sau 2026.02.23 01:05:48, log ghi ALAMO: All Ln closed → STANDBY (nextLnIdx=2 preserved). Tức là Ln đã đóng riêng, escalation index vẫn preserve để tránh reset sai cycle; UI có thể nhìn như còn level/re-entry, dù hệ thống không còn hedge primary đang chạy.
3.Sau 23/2 nhìn như pause rồi 24/2 lại trả lệnh và âm ~15% NEEDS FIX
Phần 23/2-24/2 khớp với re-entry spam, không phải Main Grid bị thiếu margin rồi tự nhiên hồi phục. Closed Ln được arm, price quay lại saved trigger nên log liên tục ALAMO_REENTRY: TRIGGERED.
Root cause đã detect ở 2026.02.23 01:05:48-01:06:29: L2 BUY mở tại 5122.83, close đơn lẻ và save cache; sau đó L2 active lại tại 5122.59 nhưng cache cũ saved=5122.83 vẫn còn. Vì BUY re-entry dùng level check bid <= savedPrice, tick reopen quanh giá đó làm trigger true liên tục. Cần clear cache khi cùng Ln active lại, skip nếu Ln đang active, chỉ log after real fire, và thêm crossing gate cho weekend/reopen.

Code FBotAlamo.mqh đã unlocked ✓

Max walkthrough resolve 4/6, SS reply 23:57 resolve nốt 2 còn lại + clarify 2 CLARIFIED. Tất cả ambiguity đã chốt. Em sẵn sàng code state machine 5-stage.

1."Trên Ln / dưới Ln" — phân loại theo gì? RESOLVED
Em hiểu cuối cùng: theo VỊ TRÍ giá relative to L1, direction phụ thuộc CHIỀU Ln.
SS confirm 23:57: "Lệnh ở vị trí 'trên' (với chiều SELL) / 'dưới' (với chiều BUY) so với L1". Tức là:
  • Hedge SELL (đám BUY âm) → "trên L1" = orders có giá CAO hơn L1
  • Hedge BUY (đám SELL âm) → "dưới L1" = orders có giá THẤP hơn L1
2."Lệnh X" / "Checkpoint" — định nghĩa RESOLVED
Em hiểu cuối cùng: orders thỏa 2-condition filter — vị trí (Q1) + đang âm.
SS confirm 23:57: "Hai điều kiện check: a) vị trí trên/dưới L1, b) đang âm. Nếu cả 2 yes → biến số cho phép tính L2 khi DD ≥ 20%". Filter này áp dụng:
  • Khi check L1 thoát: checkpoint flip dương → close L1
  • Khi tính L2 lot: sum lots tất cả orders qualified
3.Trường hợp 1 "không có lệnh trên/dưới Ln" RESOLVED
Em hiểu cuối cùng: KHÔNG có TH1 riêng — không xảy ra theo operational logic.
SS confirm 23:57: "Sẽ luôn là 1 trong 2 trường hợp: (a) Ln đóng trước full grid đóng sau, (b) đóng toàn bộ grid kể cả Ln. Trường hợp (c) 'chỉ đóng 1 trong 2' không thể xảy ra theo operational logic". Code đơn giản: chỉ implement 2 close cases, không cần edge case TH1.
4.S3.1 "đo" = sum lots? RESOLVED
Em hiểu: tính TỔNG LOT trong khoảng đó = volume Ln+1 sắp bắn.
Max confirm 22:01: "Hedge = tổng các lệnh ≥ 0.01 lot mà đang có lợi nhuận âm và lots cao hơn L1". RESOLVED — đo = sum lots (filter: âm + > L1 lots).
5."Loop đóng được / Loop FAIL" RESOLVED
Em hiểu: OK = full close cycle. FAIL = đóng Ln nhưng Grid vẫn lỗ.
Max confirm 21:37:
  • 2.1.1 OK → reset
  • 2.1.2 FAIL (DD chưa tới 10%) → về S1 Monitoring
  • 2.1.3 Whipsaw (DD quay lại 10% liên tục) → ăn sạch profit → trigger PosMan rebalance
RESOLVED + thêm case whipsaw em chưa nghĩ tới.
6.Re-fire Ln — order type RESOLVED
Em hiểu cuối cùng: MARKET order.
SS confirm 23:57: "Dùng market order Update". Code g_alamoTrade.Buy() / g_alamoTrade.Sell() với giá thị trường hiện tại (đã có pattern trong AlamoFire cũ).

✓ ALL 6 RESOLVED 6 RESOLVED  · Code FBotAlamo.mqh rewrite chuẩn bị bắt đầu. Plan dir sẽ tạo tại plans/260513-0003-alamo-prototype-3stage-rewrite/ với phase files.