Comments chi tiết
This commit is contained in:
+97
-114
@@ -1,134 +1,117 @@
|
||||
# EA_ICT_CL – Kiến trúc & luồng chạy
|
||||
# EA_ICT_CL – Kiến trúc & cấu trúc file
|
||||
|
||||
File chính: `Experts/EA_ICT_CL.mq5`
|
||||
Thư mục module: `Experts/EA_ICT_CL/` (các `.mqh`)
|
||||
**EA chính:** `Experts/EA_ICT_CL.mq5`
|
||||
**Thư mục module:** `Experts/EA_ICT_CL/` (các file `.mqh`)
|
||||
|
||||
## 1) Mục tiêu thiết kế
|
||||
---
|
||||
|
||||
- `EA_ICT_CL.mq5` nên là **file “glue”**: `OnInit/OnDeinit/OnTick/...` + gọi hàm module.
|
||||
- Mỗi `.mqh` chỉ gánh **một trách nhiệm**: config/state/signals/risk/trade/filters/…
|
||||
- Migrate **từng phần nhỏ** để tránh trùng định nghĩa (enum/struct/global) và dễ debug.
|
||||
## 1. Cấu trúc thư mục và chức năng từng file
|
||||
|
||||
## 2) Luồng chạy tổng thể (theo mô tả hiện tại trong header v4.3)
|
||||
### File chính (entry point)
|
||||
|
||||
### Bối cảnh timeframe
|
||||
| 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ụ. |
|
||||
|
||||
- **BiasTF (D1)**: xác định bias (UP/DOWN/SIDEWAY/NONE)
|
||||
- **MiddleTF (H1)**: xác định trend + quét FVG thuận xu hướng
|
||||
- **TriggerTF (M5)**: xác nhận entry bằng **MSS** (market structure shift)
|
||||
### 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. |
|
||||
| **`State.mqh`** | **Enums** và **struct**: `EAState`, `HTFBias`, `MarketDir`, `BlockReason`, `FVGStatus`; struct `BiasContext`, `TFTrendContext`, `FVGRecord`, `OrderPlan`, `DailyRiskContext`. Không chứa biến global. |
|
||||
|
||||
### 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 |
|
||||
|------|-----------|
|
||||
| **`Contexts.mqh`** | Cập nhật context: `ResolveBias`, `UpdateBiasContext`, `UpdateTFTrendContext`, `UpdateDailyRiskContext`, `UpdateAllContexts`. Dùng globals `g_Bias`, `g_MiddleTrend`, `g_TriggerTrend`, `g_DailyRisk`. |
|
||||
| **`Guards.mqh`** | Điều kiện trước khi trade: `IsSessionAllowed`, `IsDailyLossOK`, `IsBiasValid`, `IsMiddleTrendAligned`, `EvaluateGuards`. Set `g_BlockReason` khi block. |
|
||||
| **`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
|
||||
Globals: g_State, g_Bias, g_MiddleTrend, g_TriggerTrend, g_DailyRisk, g_FVGPool, g_OrderPlan, PREFIX_*
|
||||
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
|
||||
|
||||
- **BiasTF (D1):** xác định bias (UP/DOWN/SIDEWAY/NONE).
|
||||
- **MiddleTF (H1):** trend + quét FVG thuận xu hướng.
|
||||
- **TriggerTF (M5):** xác nhận entry bằng MSS (market structure shift).
|
||||
|
||||
### State machine
|
||||
|
||||
EA đang dùng state machine:
|
||||
| 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. |
|
||||
|
||||
- **`EA_IDLE`**
|
||||
- Mục tiêu: tìm/đặt “FVG tốt nhất” (MiddleTF) để theo dõi.
|
||||
- **`EA_WAIT_TOUCH`**
|
||||
- Mục tiêu: chờ giá retrace và **touch vào vùng FVG** (H1).
|
||||
- **`EA_WAIT_TRIGGER`**
|
||||
- Mục tiêu: khi đã touch FVG, chờ **M5 MSS** xác nhận đảo chiều theo trend.
|
||||
- v4.3: MSS chỉ detect khi state này.
|
||||
- **`EA_IN_TRADE`**
|
||||
- Mục tiêu: quản lý pending/position (trailing/timeout/cleanup tuỳ EA).
|
||||
### Luồng quyết định (mỗi tick)
|
||||
|
||||
### Decision flow “từ trên xuống”
|
||||
1. **UpdateAllContexts()** – Cập nhật D1 bias, H1/M5 swing (và MSS nếu đang WAIT_TRIGGER).
|
||||
2. **EvaluateGuards()** – Kiểm tra session, daily loss, bias, alignment H1/D1.
|
||||
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).
|
||||
|
||||
1) **D1 Bias**
|
||||
- Xác định `HTFBias` (UP/DOWN/SIDEWAY/NONE).
|
||||
2) **H1 Trend / Swing structure**
|
||||
- Xác định `MarketDir` (UP/DOWN/NONE) và các swing gần nhất: `h0/h1/l0/l1`.
|
||||
3) **Quét H1 FVG**
|
||||
- Tạo/duy trì pool FVG (`g_FVGPool`) tối đa `MAX_FVG_POOL`.
|
||||
- FVG có lifecycle: `PENDING → TOUCHED → USED`.
|
||||
4) **Touch FVG**
|
||||
- Khi bid/ask đi vào vùng gap → `touchTime` được set, chuyển state sang chờ trigger.
|
||||
5) **M5 MSS (chỉ khi `EA_WAIT_TRIGGER`)**
|
||||
- Nếu H1 UP: bull MSS khi close phá **OLD** `tH0` → entry = `tH0`, SL = `tL0`.
|
||||
- Nếu H1 DOWN: bear MSS khi close phá **OLD** `tL0` → entry = `tL0`, SL = `tH0`.
|
||||
6) **Lập kế hoạch lệnh (OrderPlan)**
|
||||
- `direction`: +1 BUY LIMIT / -1 SELL LIMIT
|
||||
- `entry`, `stopLoss`, `takeProfit`, `lot`
|
||||
7) **Risk sizing**
|
||||
- Lot theo `%risk` và khoảng SL (points).
|
||||
- Chặn trade nếu chạm max daily loss (`InpMaxDailyLossPct`).
|
||||
8) **Gửi pending limit**
|
||||
- Gắn `magic` và comment có `fvg_id` để trace.
|
||||
### Entry / SL / TP
|
||||
|
||||
## 3) Các folder/file module (vai trò + khi nào dùng)
|
||||
- **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|.
|
||||
|
||||
Thư mục: `Experts/EA_ICT_CL/`
|
||||
---
|
||||
|
||||
- **`Config.mqh`**
|
||||
- Nơi đưa `input`, `enum` và hằng số cấu hình.
|
||||
- Khi migrate: chuyển dần `input ...` và các enum khỏi `.mq5` sang đây (rồi include).
|
||||
## 4. Đặt tên object trên chart (prefix)
|
||||
|
||||
- **`State.mqh`**
|
||||
- Nơi đưa `struct` contexts (bias/trend/fvg/orderplan/daily risk) + state machine.
|
||||
- Khi migrate: chuyển dần các `struct`, `g_*` globals sang đây để module nào cũng dùng chung.
|
||||
Các hằng trong `EA_ICT_CL.mq5` dùng cho Drawing:
|
||||
|
||||
- **`Utils.mqh`**
|
||||
- Helper thuần: clamp/round/newbar/time formatting…
|
||||
- Ưu tiên migrate các hàm nhỏ, không phụ thuộc EA logic (vd `MyBarShift` cũng có thể đặt vào đây hoặc `Market/Indicators`).
|
||||
- `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.
|
||||
- `PREFIX_DEBUG_PANEL` – Bảng thông tin góc trái (Bias, H1/M5, Risk, State, Pool, Order).
|
||||
|
||||
- **`Logging.mqh`**
|
||||
- Chuẩn hoá log bật/tắt theo `InpDebugLog`.
|
||||
- Có thể mở rộng: prefix theo symbol/tf/state, ghi file, debug panel.
|
||||
---
|
||||
|
||||
- **`Market.mqh`**
|
||||
- Helper về symbol specs (digits/point/spread), trade allowed, quote access…
|
||||
|
||||
- **`Sessions.mqh`**
|
||||
- Helper session/time filter (London/NY theo UTC).
|
||||
- Khi migrate: đưa logic “được trade trong giờ nào?” sang đây.
|
||||
|
||||
- **`Filters.mqh`**
|
||||
- Các bộ lọc: spread, news (nếu có), day-of-week, max trades/day, cooldown…
|
||||
|
||||
- **`Indicators.mqh`**
|
||||
- Wrapper CopyBuffer/CopyTime, quản lý handles nếu bạn dùng iMA/iATR/…
|
||||
|
||||
- **`Signals_BOS_FVG_OB.mqh`**
|
||||
- Nơi tập trung **logic tín hiệu**: BOS/MSS/FVG/OB… và build `OrderPlan`.
|
||||
- Mục tiêu: module này “pure” nhất có thể (input/state snapshot → plan).
|
||||
|
||||
- **`Risk.mqh`**
|
||||
- Tính lot, normalize volume, kiểm soát daily drawdown.
|
||||
|
||||
- **`Orders.mqh`**
|
||||
- Chuẩn hoá normalize price, build comment, mapping direction→order type…
|
||||
|
||||
- **`Trade.mqh`**
|
||||
- Các hàm “side-effect”: `OrderSend`, modify, cancel, close.
|
||||
|
||||
- **`Trailing.mqh`**
|
||||
- Trailing/BE/partial close (nếu có).
|
||||
|
||||
## 4) Gợi ý thứ tự migrate (an toàn, ít rủi ro nhất)
|
||||
|
||||
Để tránh trùng định nghĩa và lỗi include:
|
||||
|
||||
1) **Move helpers**: `MyBarShift`, swing helper functions → `Utils.mqh` (hoặc tách `Swing.mqh` nếu bạn muốn).
|
||||
2) **Move trade wrappers**: các đoạn `MqlTradeRequest/Result` → `Trade.mqh` + helper normalize → `Orders.mqh`.
|
||||
3) **Move risk**: tính lot / daily loss → `Risk.mqh`.
|
||||
4) **Move filters/session** → `Sessions.mqh`, `Filters.mqh`.
|
||||
5) **Cuối cùng mới move types**: enums/struct/global sang `Config.mqh` + `State.mqh`.
|
||||
|
||||
> Lưu ý: Chỉ include module nào khi bạn đã chuyển phần tương ứng khỏi `.mq5` (để tránh “redefinition”).
|
||||
|
||||
## 5) Quy ước include trong `EA_ICT_CL.mq5` (gợi ý)
|
||||
|
||||
Khi bắt đầu migrate, thường include theo thứ tự:
|
||||
|
||||
1. `Config.mqh`
|
||||
2. `State.mqh`
|
||||
3. `Utils.mqh`
|
||||
4. `Logging.mqh`
|
||||
5. `Market.mqh`
|
||||
6. `Indicators.mqh`
|
||||
7. `Sessions.mqh` / `Filters.mqh`
|
||||
8. `Risk.mqh`
|
||||
9. `Orders.mqh`
|
||||
10. `Trade.mqh`
|
||||
11. `Signals_BOS_FVG_OB.mqh`
|
||||
12. `Trailing.mqh`
|
||||
## 5. Mở rộng / chỉnh sửa gợi ý
|
||||
|
||||
- **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.
|
||||
|
||||
Reference in New Issue
Block a user