ALAMO HOTFIX7 — prevCache Cascade

v2-LenhY-hotfix4 | 2026-05-24 | Branch: feat/alamo-hedge

Problem Statement

Bug L4/L5 không fire dù DD > 40%

Khi L3 close sớm (checkpoint profit), g_alamoPrevCache vẫn trỏ tới L3 (đã đóng). L4 fire check dùng stale data → qualCount=0 → không fire.

Root Cause Analysis

BEFORE (Bug)

L3 fires → cache = L3
L3 closes (checkpoint)
cache still = L3 (stale!)
L4 check → qualCount=0 → SKIP

AFTER (Fixed)

L3 fires → cache = L3
L3 closes (checkpoint)
cache cascades to L2 ✓
L4 check → uses L2 data → FIRE

Implementation

// HOTFIX7: when highest Ln closes, cascade cache to next-highest
bool wasHighestLn = (ticket == g_alamoPrevCache.ticket);
AlamoRemoveLnAt(i);

if(ArraySize(g_alamoTickets) == 0) {
   g_alamoPrevCache.valid = false;  // invalidate
}
else if(wasHighestLn) {
   // Cascade to new highest Ln (last in array)
   int newHighIdx = ArraySize(g_alamoTickets) - 1;
   ulong newHighTicket = g_alamoTickets[newHighIdx];
   if(PositionSelectByTicket(newHighTicket)) {
      g_alamoPrevCache.ticket    = newHighTicket;
      g_alamoPrevCache.priceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
      g_alamoPrevCache.type      = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
      g_alamoPrevCache.fireTime  = (datetime)PositionGetInteger(POSITION_TIME);
      g_alamoPrevCache.valid     = true;
      Print("ALAMO: prevCache updated to L", (newHighIdx + 1));
   }
}

Backtest Timeline (2026-02-23)

01:05:42
L1 FIRED
DD=10.28% | ticket=1801
01:28:04
L2 FIRED
DD=20.02% | ticket=1807
01:28:18
L2 closed → prevCache updated to L1
HOTFIX7 working ✓
01:44:38
L3 FIRE BLOCKED
margin 61,594 > free 44,892

Margin Block (Expected Behavior)

Info L3 blocked by margin, not code bug
ALAMO: S1 của L3 FIRE | DD=30.01% ≥ fireGate=30.00% | qualCount=7 | 2cond_lots=23.88
ALAMO: FIRE SKIP — margin 61594.76 > free 44892.36

Main grid đã dùng hết margin (20+ positions). Không còn margin để mở hedge 23.88 lots. Đây là expected behavior — không thể hedge nếu không có margin.

Verification Checklist

prevCache cascade khi Ln close
L3 fire check passes (DD ≥ 30%)
Margin check blocks correctly
Stale MONITOR timeout = cosmetic only