2026-03-10 19:28:06 +07:00
# EA_ICT_CL – Kiến trúc & cấu trúc file
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
**EA chính:** `Experts/EA_ICT_CL.mq5`
**Thư mục module:** `Experts/EA_ICT_CL/` (các file `.mqh` )
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
---
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
## 1. Cấu trúc thư mục và chức năng từng file
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
### File chính (entry point)
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
| File | Vai trò |
|------|--------|
| ** `EA_ICT_CL.mq5` ** | File “glue”: khai báo globals, include 3 tầng module, và chỉ chứa `OnInit()` , `OnTick()` , `OnDeinit()` . Không chứa logic nghiệp vụ. |
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
### Layer 1 – Cấu hình & kiểu dữ liệu (include đầu tiên)
| File | Chức năng |
|------|-----------|
| ** `Config.mqh` ** | Toàn bộ **input** của EA: timeframe (Bias/Middle/Trigger), risk %, session giờ (London/NY), swing/FVG/MSS params, magic, slippage, debug flags. |
2026-03-10 22:21:59 +07:00
| ** `State.mqh` ** | **Enums** và **struct** : `EAState` , `MarketDir` , `BlockReason` , `FVGStatus` ; struct `TFTrendContext` , `FVGRecord` , `OrderPlan` , `DailyRiskContext` . Không chứa biến global. |
2026-03-10 19:28:06 +07:00
### Layer 2 – Tiện ích (sau Config + State)
| File | Chức năng |
|------|-----------|
| ** `Utils.mqh` ** | Hàm helper thuần: `ClampDouble` , `ClampInt` , `RoundToStep` , `IsNewBar` . |
| ** `Logging.mqh` ** | Wrapper log bật/tắt: `LogPrint` , `LogPrintF` (gọi khi `InpDebugLog` bật). |
| ** `Market.mqh` ** | Helper market: `GetBid` , `GetAsk` , `GetPoint` , `GetDigits` , `GetSpreadPoints` , `IsTradeAllowedNow` . |
| ** `Indicators.mqh` ** | Wrapper an toàn: `CopyBufferSafe` , `CopyTimeSafe` cho dữ liệu series. |
| ** `Sessions.mqh` ** | Lọc theo giờ: `IsHourInRange` , `GetUTCHour` (dùng cho session London/NY). |
| ** `Filters.mqh` ** | Bộ lọc chung: `Filter_MaxSpreadPoints` (có thể mở rộng news, max trades/day). |
| ** `Risk.mqh` ** | Risk & volume: `NormalizeVolume` , `LotsFromRiskMoneyAndSLPoints` . |
| ** `Orders.mqh` ** | Chuẩn hoá order: `NormalizePrice` , `BuildOrderComment` . |
| ** `Swing.mqh` ** | **Swing structure** : `MyBarShift` , `IsSwingHighAt` , `IsSwingLowAt` , `ScanSwingStructure` , `ResolveTrendFromSwings` . |
| ** `Trailing.mqh` ** | Placeholder cho logic trailing / breakeven / partial close (chưa implement). |
### Layer 3 – Logic nghiệp vụ (sau khi đã khai báo globals trong `.mq5`)
| File | Chức năng |
|------|-----------|
2026-03-10 22:21:59 +07:00
| ** `Contexts.mqh` ** | Cập nhật context: `UpdateTFTrendContext` , `UpdateDailyRiskContext` , `UpdateAllContexts` . Dùng globals `g_MiddleTrend` , `g_TriggerTrend` , `g_DailyRisk` . |
| ** `Guards.mqh` ** | Điều kiện trước khi trade: `IsSessionAllowed` , `IsDailyLossOK` , `IsMiddleTrendValid` , `EvaluateGuards` . Set `g_BlockReason` khi block. |
2026-03-10 19:28:06 +07:00
| ** `Signals_BOS_FVG_OB.mqh` ** | **FVG** : `IsCandleStrong` , `IsFVGInPool` , `ScanAndRegisterFVGs` , `UpdateFVGStatuses` , `GetBestActiveFVGIdx` . Quản lý pool FVG và trạng thái PENDING/TOUCHED/USED. |
| ** `Trade.mqh` ** | **Order plan & execution** : `CalcLotFromRisk` , `BuildOrderPlan` , `ExecuteLimitOrder` . Gửi lệnh pending limit, dùng `g_OrderPlan` . |
| ** `StateMachine.mqh` ** | **State machine** : `TransitionTo` , `ResetToIdle` , `OnStateIdle` , `OnStateWaitTouch` , `OnStateWaitTrigger` , `OnStateInTrade` , `RunStateMachine` . Điều phối theo `g_State` . |
| ** `Drawing.mqh` ** | **Vẽ trên chart** : `DrawOneSwingPoint` , `DrawMiddleSwingPoints` , `DrawTriggerSwingPoints` , `DrawMSSMarker` , `DrawMSSMarkers` , `DrawOrderVisualization` , `DrawOneFVGRecord` , `DrawFVGPool` , `DrawContextDebug` , `DrawVisuals` . Dùng prefix `PREFIX_SWING_MIDDLE` , `PREFIX_ORDER_VISUAL` , v.v. |
---
## 2. Thứ tự include trong `EA_ICT_CL.mq5`
```
Layer 1: Config.mqh → State.mqh
Layer 2: Utils, Logging, Market, Indicators, Sessions, Filters, Risk, Orders, Swing, Trailing
2026-03-10 22:21:59 +07:00
Globals: g_State, g_MiddleTrend, g_TriggerTrend, g_DailyRisk, g_FVGPool, g_OrderPlan, PREFIX_*
2026-03-10 19:28:06 +07:00
Layer 3: Contexts.mqh → Guards.mqh → Signals_BOS_FVG_OB.mqh → Trade.mqh → StateMachine.mqh → Drawing.mqh
```
Layer 3 phải include **sau** khi globals và prefix đã được khai báo trong `.mq5` .
---
## 3. Luồng chạy tổng thể (v4.3)
### Timeframe
- **MiddleTF (H1):** trend + quét FVG thuận xu hướng.
- **TriggerTF (M5):** xác nhận entry bằng MSS (market structure shift).
2026-03-10 13:47:42 +07:00
### State machine
2026-03-10 19:28:06 +07:00
| State | Mục đích |
|-------|----------|
| **EA_IDLE** | Chọn FVG “tốt nhất” (ưu tiên TOUCHED, rồi PENDING mới nhất). |
| **EA_WAIT_TOUCH** | Chờ giá retrace vào vùng FVG (H1). |
| **EA_WAIT_TRIGGER** | Đã touch FVG → chờ M5 MSS (chỉ detect MSS trong state này). |
| **EA_IN_TRADE** | Theo dõi pending/position; reset khi fill, cancel hoặc đóng lệnh. |
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
### Luồng quyết định (mỗi tick)
2026-03-10 13:47:42 +07:00
2026-03-10 22:21:59 +07:00
1. **UpdateAllContexts()** – Cập nhật H1/M5 swing (và MSS nếu đang WAIT_TRIGGER).
2. **EvaluateGuards()** – Kiểm tra session, daily loss, H1 trend.
2026-03-10 19:28:06 +07:00
3. Nếu pass → **RunStateMachine()** : `UpdateFVGStatuses()` + `ScanAndRegisterFVGs()` + xử lý theo state (Idle → chọn FVG; WaitTouch → chờ touch/switch FVG; WaitTrigger → khi FVG triggered thì BuildOrderPlan + ExecuteLimitOrder; InTrade → theo dõi order/position).
4. Nếu **InpDebugDraw** bật → **DrawVisuals()** (swing, MSS, FVG pool, order, debug panel).
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
### Entry / SL / TP
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
- **Entry:** giá swing bị phá (tH0 cho buy, tL0 cho sell).
- **SL:** swing đối diện (tL0 cho buy, tH0 cho sell) + buffer 2 point.
- **TP:** Entry ± `InpRiskReward` × |Entry − SL|.
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
---
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
## 4. Đặt tên object trên chart (prefix)
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
Các hằng trong `EA_ICT_CL.mq5` dùng cho Drawing:
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
- `PREFIX_SWING_MIDDLE` – H1 swing (MiddleH0/L0…).
- `PREFIX_SWING_TRIGGER` – M5 swing (TriggerH0/L0…).
- `PREFIX_MSS_MARKER` – Điểm đánh dấu MSS.
- `PREFIX_FVG_POOL` – Các hình chữ nhật FVG.
- `PREFIX_ORDER_VISUAL` – Vùng/label Entry/SL/TP.
2026-03-10 22:21:59 +07:00
- `PREFIX_DEBUG_PANEL` – Bảng thông tin góc trái (H1/M5, Risk, State, Pool, Order).
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
---
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
## 5. Mở rộng / chỉnh sửa gợi ý
2026-03-10 13:47:42 +07:00
2026-03-10 19:28:06 +07:00
- **Thêm input:** chỉnh trong `Config.mqh` .
- **Thêm enum/struct:** chỉnh trong `State.mqh` .
- **Logic FVG / chọn FVG:** chỉnh trong `Signals_BOS_FVG_OB.mqh` .
- **Tính lot / gửi lệnh:** chỉnh trong `Trade.mqh` .
- **Chuyển state / xử lý từng state:** chỉnh trong `StateMachine.mqh` .
- **Trailing / breakeven:** bổ sung trong `Trailing.mqh` và gọi từ state IN_TRADE (trong `StateMachine.mqh` hoặc từ `OnTick` ).
- **Vẽ thêm object:** chỉnh trong `Drawing.mqh` , dùng đúng prefix để `OnDeinit` có thể dọn theo prefix nếu cần.