Readme and Comments

This commit is contained in:
Bell
2026-05-17 23:23:44 +07:00
parent 5c90171709
commit 7f68c86846
14 changed files with 487 additions and 47 deletions
+22 -1
View File
@@ -1,6 +1,20 @@
//+------------------------------------------------------------------+
//| HyperICT.mq5 |
//| HTF structure: swings, Key LV, CHoCH / Continue (modular) |
//| EA đọc cấu trúc HTF — không giao dịch |
//| Docs: Include/HyperICT/README.md |
//| Mở folder workspace: .../MQL5 (không mở riêng Include/HyperICT)|
//+------------------------------------------------------------------+
//| MAP SPEC → MODULE: |
//| § tiên quyết Fib + HH-HL → FibValidator, SwingEngine |
//| §1.1 trạng thái trend → Classifier, Panel |
//| §1.2 Key LV + OB → KeyLevels, Draw |
//| §1.3 vẽ label/rect → Draw |
//| §1.4 CHoCH/Continue → UpdateEngine, SwingEngine roll |
//| Pipeline → StateMachine |
//| Input HTF/swing/fib → Config |
//| Kiểu dữ liệu → Types |
//| |
//| CHƯA CÓ TRONG DỰ ÁN: đặt lệnh, LTF, session, alert |
//+------------------------------------------------------------------+
#property copyright "HyperICT"
#property version "0.11"
@@ -14,6 +28,8 @@
HtfContext g_ctx;
//+------------------------------------------------------------------+
//| Khóa snapshot swing HTF + vẽ lần đầu |
//+------------------------------------------------------------------+
int OnInit()
{
@@ -41,6 +57,9 @@ void OnDeinit(const int reason)
ChartRedraw();
}
//+------------------------------------------------------------------+
//| Mỗi tick: logic HTF chỉ trên nến HTF mới (StateMachine) |
//| Vẽ rectangle kéo dài mỗi tick |
//+------------------------------------------------------------------+
void OnTick()
{
@@ -49,6 +68,8 @@ void OnTick()
CPanel::Render(g_ctx);
}
//+------------------------------------------------------------------+
//| API cho EA/script khác đọc state |
//+------------------------------------------------------------------+
ENUM_HTF_STATE HyperICT_GetState() { return g_ctx.state; }
Binary file not shown.
+16 -3
View File
@@ -1,5 +1,16 @@
//+------------------------------------------------------------------+
//| Classifier.mqh — 7+ trạng thái §1.1 (bar đóng shift 1) |
//| Classifier.mqh |
//| Phân loại trạng thái HTF §1.1 (bar HTF đóng, shift 1) |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • Bull Pullback: Fib OK + giá (mid body) giữa L0H0 |
//| • Bull CHoCH: body phá dưới L0 HOẶC đang update.phase CHoCH |
//| • Bull Continue: body phá trên H0 HOẶC đang update Continue |
//| • Bear: đối xứng (phá H0 / phá L0) |
//| • Neutral: không đủ 4 swing hoặc cấu trúc không HH-HL/LH-LL |
//| • Fib fail → BULL/BEAR_INCOMPLETE (sóng chưa kết thúc) |
//| ƯU TIÊN: nếu đang §1.4 update → hiển thị CHoCH/Continue trước |
//| CHƯA: phân tầng ưu tiên phức tạp khi nhiều tín hiệu cùng bar |
//+------------------------------------------------------------------+
#ifndef HYPERICT_CLASSIFIER_MQH
#define HYPERICT_CLASSIFIER_MQH
@@ -9,7 +20,6 @@
#include <HyperICT/FibValidator.mqh>
#include <HyperICT/KeyLevels.mqh>
//+------------------------------------------------------------------+
class CClassifier
{
public:
@@ -21,10 +31,11 @@ public:
if(ctx.structBias == STRUCT_NONE)
return HTF_NEUTRAL;
const int sh = 1;
const int sh = 1; // bar HTF vừa đóng
const double bodyMid = (iClose(ctx.symbol, ctx.htf, sh) +
iOpen(ctx.symbol, ctx.htf, sh)) * 0.5;
//--- Đang trong §1.4 → state CHoCH / Continue theo event
if(ctx.update.phase != UPD_PHASE_IDLE)
{
if(ctx.structBias == STRUCT_BULL)
@@ -43,6 +54,7 @@ public:
}
}
//--- § tiên quyết Fib: fail ≠ Neutral
if(!ctx.fibOk)
{
if(ctx.structBias == STRUCT_BULL)
@@ -51,6 +63,7 @@ public:
return HTF_BEAR_INCOMPLETE;
}
//--- §1.1 trạng thái khi snapshot idle (chưa hoặc đã xong update)
if(ctx.structBias == STRUCT_BULL)
{
if(CKeyLevels::BodyBreakBelow(ctx.symbol, ctx.htf, sh, ctx.keyLv1.price))
+18 -9
View File
@@ -1,5 +1,14 @@
//+------------------------------------------------------------------+
//| Config.mqh — inputs & hằng số |
//| Config.mqh |
//| Tham số input map spec → runtime |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • InpHtf = H1 mặc định (§ HTF trend) |
//| • InpSwingRange — pivot §1.4 P2 & xác nhận đỉnh/đáy sau phá Key |
//| • InpFibMinRatio = 0.382 — chỉ tiên quyết trend (§ đầu) |
//| • InpSwingLookback — quét đủ H0L1 lúc lock snapshot |
//| • Màu / alpha — §1.3 vẽ vùng cung-cầu |
//| CHƯA CÓ: trading, session, LTF |
//+------------------------------------------------------------------+
#ifndef HYPERICT_CONFIG_MQH
#define HYPERICT_CONFIG_MQH
@@ -7,22 +16,22 @@
#include <HyperICT/Types.mqh>
input group "══ HTF Structure ══"
input ENUM_TIMEFRAMES InpHtf = PERIOD_H1;
input int InpSwingRange = 3;
input int InpSwingLookback = 400;
input double InpFibMinRatio = 0.382;
input ENUM_TIMEFRAMES InpHtf = PERIOD_H1; // §1: timeframe cấu trúc HTF
input int InpSwingRange = 3; // §1.4: số nến mỗi bên pivot (confirm đỉnh/đáy)
input int InpSwingLookback = 400; // quét swing lúc lock ban đầu
input double InpFibMinRatio = 0.382; // § tiên quyết: H1→L0 vs L1→H1 (chỉ lúc lock trend)
input group "══ Hiển thị ══"
input bool InpDrawSwings = true;
input bool InpDrawZones = true;
input bool InpDrawSwings = true; // §1.3 label H0L1
input bool InpDrawZones = true; // §1.3 rectangle Key LV1/L2
input bool InpDrawPanel = true;
input uchar InpZoneFillAlpha = 72;
input color InpClrBullHi = clrDodgerBlue;
input color InpClrBullLo = clrDeepSkyBlue;
input color InpClrBearHi = clrOrangeRed;
input color InpClrBearLo = clrGold;
input color InpClrSupply = C'140,50,55';
input color InpClrDemand = C'35,110,55';
input color InpClrSupply = C'140,50,55'; // vùng cung @ L0
input color InpClrDemand = C'35,110,55'; // vùng cầu @ H0
input int InpLabelFontSize = 9;
input int InpPanelX = 12;
input int InpPanelY = 28;
+11 -2
View File
@@ -1,5 +1,13 @@
//+------------------------------------------------------------------+
//| Draw.mqh — labels H0L1, vùng Key LV1/L2 |
//| Draw.mqh |
//| Vẽ chart §1.3 |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • Label H0, H1, L0, L1 tại pivot đã khóa |
//| • Label newH0, newL0, newL02 khi đang §1.4 update |
//| • Rectangle Key LV1 & LV2: swing → hết OB (kéo tới bar hiện tại)|
//| • Màu supply/demand theo Config |
//| CHƯA: vẽ trên chart HTF khác chart đang mở (luôn ChartID hiện tại)|
//+------------------------------------------------------------------+
#ifndef HYPERICT_DRAW_MQH
#define HYPERICT_DRAW_MQH
@@ -8,7 +16,6 @@
#include <HyperICT/Config.mqh>
#include <HyperICT/KeyLevels.mqh>
//+------------------------------------------------------------------+
class CDraw
{
static long Chart() { return ChartID(); }
@@ -45,6 +52,7 @@ class CDraw
ObjectSetInteger(ch, id, OBJPROP_SELECTABLE, false);
}
//--- §1.3: chiều cao rect = từ swing tới biên OB
static void DrawZoneRect(const string id,
const datetime t1, const double top, const double bottom,
const color fillClr, const string tip)
@@ -77,6 +85,7 @@ public:
const string p = HICT_OBJ_PFX;
//--- §1.3 labels swing khóa
if(InpDrawSwings && ctx.swings.IsComplete())
{
DrawSwingLabel(p + "H0", "H0", ctx.swings.h0.time, ctx.swings.h0.price, true, InpClrBullHi);
+10 -2
View File
@@ -1,5 +1,13 @@
//+------------------------------------------------------------------+
//| FibValidator.mqh — Fib 0.382 chỉ cho tiên quyết trend ban đầu |
//| FibValidator.mqh |
//| Điều kiện tiên quyết Fibonacci (§ đầu spec) |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • Bull HH-HL & Bear LH-LL: kiểm tra ở SwingEngine.Classify |
//| • Sóng hồi H1→L0 >= 0.382 × sóng L1→H1 (bull & bear cùng công thức) |
//| • Fib fail → HTF_BULL/BEAR_INCOMPLETE (không Neutral) |
//| KHÔNG DÙNG FIB TRONG: |
//| • §1.4 CHoCH / Continue — xác nhận đỉnh/đáy = InpSwingRange |
//+------------------------------------------------------------------+
#ifndef HYPERICT_FIBVALIDATOR_MQH
#define HYPERICT_FIBVALIDATOR_MQH
@@ -15,7 +23,7 @@ public:
return MathAbs(to - from);
}
// Sóng hồi H1→L0 >= ratio × sóng L1→H1 (bull & bear, chỉ lúc lock trend)
// § tiên quyết: pullback H1→L0 đủ sâu so với impulse L1→H1
static bool IsPullbackValid(const SwingSet &sw, const double ratio)
{
if(!sw.IsComplete())
+14 -4
View File
@@ -1,5 +1,14 @@
//+------------------------------------------------------------------+
//| KeyLevels.mqh — Key LV1/L2, supply/demand OB (body break) |
//| KeyLevels.mqh |
//| Key LV1/L2, vùng cung-cầu OB, phá level bằng body (§1.2) |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • Bull Key LV1=L0, Key LV2=H0 (đỉnh cao nhất L0→H0 = H0) |
//| • Bear Key LV1=H0, Key LV2=L0 |
//| • Vùng cung: L0 → high nến đỏ OB | Vùng cầu: H0 → low nến xanh |
//| • Phá Key = body close (shift 1), không dùng wick |
//| • Giá Pullback giữa L0H0 / H0L0 — PriceBetween |
//| CHƯA: OB mitigation filter đầy đủ ICT |
//+------------------------------------------------------------------+
#ifndef HYPERICT_KEYLEVELS_MQH
#define HYPERICT_KEYLEVELS_MQH
@@ -7,10 +16,10 @@
#include <HyperICT/Types.mqh>
#include <HyperICT/Config.mqh>
//+------------------------------------------------------------------+
class CKeyLevels
{
public:
//--- Thân nến (§: phá Key LV bằng body, không wick)
static double BodyTop(const string sym, const ENUM_TIMEFRAMES tf, const int shift)
{
return MathMax(iOpen(sym, tf, shift), iClose(sym, tf, shift));
@@ -31,7 +40,7 @@ public:
return iClose(sym, tf, shift) > iOpen(sym, tf, shift);
}
// Nến đỏ cuối cùng trước/at swing low (supply @ L0)
//--- §1.2.3 vùng cung @ L0: nến đỏ cuối cùng gần đáy Key LV1
static bool FindSupplyOB(const string sym, const ENUM_TIMEFRAMES tf,
const SwingPoint &swingLow,
OrderBlockZone &out)
@@ -60,7 +69,7 @@ public:
return false;
}
// Nến xanh cuối cùng tại swing high (demand @ H0)
//--- §1.2.4 vùng cầu @ H0: nến xanh cuối cùng gần đỉnh Key LV2 (bull)
static bool FindDemandOB(const string sym, const ENUM_TIMEFRAMES tf,
const SwingPoint &swingHigh,
OrderBlockZone &out)
@@ -89,6 +98,7 @@ public:
return false;
}
//--- Gán Key LV1/L2 + zone OB theo bias bull/bear
static void BuildKeyLevels(const string sym, const ENUM_TIMEFRAMES tf,
const ENUM_STRUCT_BIAS bias,
const SwingSet &sw,
+4 -2
View File
@@ -1,5 +1,8 @@
//+------------------------------------------------------------------+
//| Panel.mqh — nhãn trạng thái góc chart |
//| Panel.mqh |
//| Panel trạng thái HTF (đọc nhanh §1.1) |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: hiển thị structure, Fib, state, Key LV, phase §1.4 |
//+------------------------------------------------------------------+
#ifndef HYPERICT_PANEL_MQH
#define HYPERICT_PANEL_MQH
@@ -8,7 +11,6 @@
#include <HyperICT/Config.mqh>
#include <HyperICT/Classifier.mqh>
//+------------------------------------------------------------------+
class CPanel
{
public:
+311
View File
@@ -0,0 +1,311 @@
# HyperICT
Expert Advisor **chỉ đọc cấu trúc thị trường HTF** (Higher Timeframe): swing H0L1, Key Level, vùng cung/cầu (Order Block), trạng thái Pullback / CHoCH / Continue. **Không đặt lệnh.**
Phiên bản hiện tại: **0.11**
---
## Mục lục
<!-- Link dùng id ASCII (Cursor/VS Code không ổn định với anchor tiếng Việt có dấu) -->
1. [Cấu trúc thư mục](#folder-structure)
2. [Logic nghiệp vụ](#business-logic)
3. [Mô tả từng file](#file-reference)
4. [Luồng chạy (pipeline)](#pipeline)
5. [Cài đặt & sử dụng](#installation)
6. [Tham số input](#inputs)
7. [Trạng thái hiển thị](#display-states)
8. [API mở rộng](#api)
9. [Giới hạn & hướng phát triển](#roadmap)
10. [Map spec → module](#spec-map)
---
<a id="folder-structure"></a>
## Cấu trúc thư mục
```
MQL5/
├── Experts/
│ └── HyperICT.mq5 ← EA chính (OnInit / OnTick)
└── Include/
└── HyperICT/
├── README.md ← tài liệu này
├── Types.mqh ← enum, struct
├── Config.mqh ← input
├── FibValidator.mqh ← Fib 0.382 (chỉ tiên quyết)
├── SwingEngine.mqh ← pivot, snapshot, roll swing
├── KeyLevels.mqh ← Key LV1/L2, OB, body break
├── Classifier.mqh ← 7+ trạng thái trend
├── UpdateEngine.mqh ← §1.4 CHoCH / Continue
├── StateMachine.mqh ← pipeline điều phối
├── Draw.mqh ← vẽ chart
└── Panel.mqh ← panel góc chart
```
**Include trong code:** `#include <HyperICT/TênFile.mqh>`
---
<a id="business-logic"></a>
## Logic nghiệp vụ
### Điều kiện tiên quyết (chỉ lúc xác định trend)
| Xu hướng | Cấu trúc | Fib |
|----------|---------|-----|
| **Bull** | HH-HL (`H0>H1``L0>L1`) | Sóng hồi **H1→L0****38.2%** sóng **L1→H1** |
| **Bear** | LH-LL | Cùng công thức Fib |
- **Fib fail** → state `BULL/BEAR (Fib pending)`*không* coi là Neutral.
- **Neutral** chỉ khi không đủ 4 swing hoặc cấu trúc không HH-HL / LH-LL.
### Swing H0, H1, L0, L1
- Đếm từ **giá hiện tại về trước** trên HTF (mặc định H1).
- **H0 / L0** = đỉnh/đáy gần nhất; **H1 / L1** = đỉnh/đáy trước đó.
- **Khóa snapshot** khi bot chạy (`OnInit`) — **không** đổi mỗi nến mới.
### Key Level (§1.2)
| Bias | Key LV1 | Key LV2 | Vùng cung | Vùng cầu |
|------|---------|---------|-----------|----------|
| Bull | **L0** | **H0** (= đỉnh cao nhất L0→H0) | L0 → high nến đỏ OB | H0 → low nến xanh OB |
| Bear | **H0** | **L0** | (đối xứng) | (đối xứng) |
- **Phá Key** = thân nến (`max/min` openclose) trên bar HTF **đã đóng** (shift 1).
- Phá **Key LV1** → tín hiệu **CHoCH**.
- Phá **Key LV2** → tín hiệu **Trend Continue**.
### Trạng thái trend (§1.1)
| State | Điều kiện chính |
|-------|-----------------|
| **Bull Pullback** | Fib OK + giá giữa L0H0 |
| **Bull CHoCH** | Body phá dưới L0, hoặc đang xử lý §1.4 CHoCH |
| **Bull Continue** | Body phá trên H0 / đang tạo newH0 |
| **Bear Pullback / CHoCH / Continue** | Đối xứng |
| **Neutral** | Không phân loại được cấu trúc |
### Cập nhật sau phá Key (§1.4) — không quét lại full history
**Xác nhận đỉnh/đáy mới:** dùng `InpSwingRange` (pivot đủ N nến mỗi bên). **Không** dùng Fib trong giai đoạn này.
#### Bull Continue (phá H0)
1. **P1:** Body phá H0 → track `newH0` (nến xanh, high cao hơn), `newL0` (đáy impulse).
2. **P2:** Hồi đủ → `IsConfirmedSwingHigh(newH0)` → roll: `H0→H1`, `L0→L1`, `newH0→H0`, `newL0→L0`.
#### Bull CHoCH (phá L0)
1. **P1:** Track `newL0` (low thấp hơn).
2. **P2:** `IsConfirmedSwingLow(newL0)` → vào phase 3.
3. **P3 case 1:** Phá lên H0 → `newH0` confirm → roll bull (`L1` giữ).
4. **P3 case 2:** Phá xuống `newL0``newH0` + `newL02` confirm → roll bear.
Bear Continue / CHoCH: **đối xứng** với bull.
---
<a id="file-reference"></a>
## Mô tả từng file
### `Experts/HyperICT.mq5`
- Entry point: khởi tạo `HtfContext`, gọi `StateMachine`, `Draw`, `Panel`.
- `OnTick`: logic HTF chỉ khi **nến HTF mới**; vẽ rectangle cập nhật mỗi tick.
- Export: `HyperICT_GetState()` cho EA khác.
### `Types.mqh`
- `ENUM_STRUCT_BIAS`, `ENUM_HTF_STATE`, `ENUM_UPDATE_EVENT`, `ENUM_UPDATE_PHASE`.
- `SwingPoint`, `SwingSet`, `OrderBlockZone`, `KeyLevelPair`, `UpdateContext`, `HtfContext`.
- Không chứa logic tính toán.
### `Config.mqh`
- Toàn bộ `input`: HTF, swing range, lookback, Fib ratio, màu vẽ, debug.
- Prefix object chart: `HICT_`.
### `FibValidator.mqh`
- `IsPullbackValid()` — H1→L0 vs L1→H1 × `InpFibMinRatio`.
- **Chỉ** dùng cho tiên quyết trend (và tính lại sau roll swing).
### `SwingEngine.mqh`
- `IsSwingHigh` / `IsSwingLow`, `CollectSwings`, `PickLastTwo`.
- `LockInitialSnapshot`, `ClassifyStructure` (HH-HL / LH-LL).
- `IsConfirmedSwingHigh/Low` — xác nhận pivot sau phá Key.
- `RollBullContinue`, `RollBullChochCase1/2`, `RollBearContinue`, …
### `KeyLevels.mqh`
- Body break above/below.
- `FindSupplyOB` / `FindDemandOB`.
- `BuildKeyLevels`, `PriceBetween` (Pullback zone).
### `Classifier.mqh`
- `Evaluate()` → một trong các `ENUM_HTF_STATE`.
- Ưu tiên: đang `update.phase` → CHoCH/Continue; sau đó Fib pending; sau đó Pullback/break.
### `UpdateEngine.mqh`
- `DetectBreakEvents` — phá Key LV1/L2.
- `ProcessBullContinueBuild`, `ProcessBullChochBuild`, `ProcessBullChochResolve`, …
- `OnHtfBarClose` — gọi mỗi nến HTF mới.
### `StateMachine.mqh`
- `Init()` → lock snapshot + `RefreshDerived`.
- `OnChartEvent()``IsNewHtfBar``UpdateEngine` → Fib + Key + Classifier.
### `Draw.mqh`
- Label H0L1, newH0/newL0/newL02.
- Rectangle Key LV1/L2 (kéo tới thời điểm hiện tại).
### `Panel.mqh`
- Label góc trái: structure, Fib, state, Key prices, phase update.
---
<a id="pipeline"></a>
## Luồng chạy (pipeline)
```mermaid
flowchart TD
A[OnInit] --> B[SwingEngine.LockInitialSnapshot]
B --> C[RefreshDerived: Fib + Key + Classify]
C --> D[Draw + Panel]
E[OnTick] --> F{Nến HTF mới?}
F -->|Không| G[Draw refresh rect]
F -->|Có| H[UpdateEngine.OnHtfBarClose]
H --> I[RefreshDerived]
I --> G
G --> J[Panel update]
```
---
<a id="installation"></a>
## Cài đặt & sử dụng
1. Copy `Experts/HyperICT.mq5` và thư mục `Include/HyperICT/` vào terminal MT5.
2. MetaEditor → mở `HyperICT.mq5`**F7** compile.
3. Kéo EA lên chart (symbol cần đủ lịch sử HTF).
4. Khuyến nghị: mở chart **cùng symbol**; HTF logic đọc `InpHtf` (mặc định H1) dù chart có thể M15/M5.
5. Bật `InpDebug = true` để xem log `[HyperICT]``[HyperICT/Update]` trong tab Experts.
### Gợi ý tinh chỉnh
| Triệu chứng | Thử |
|-------------|-----|
| Init fail / không đủ swing | Giảm `InpSwingRange` hoặc tăng `InpSwingLookback` |
| Pivot confirm chậm | Giảm `InpSwingRange` |
| Pivot nhiễu | Tăng `InpSwingRange` |
| Fib mãi pending | Kiểm tra sóng H1→L0 trên chart H1 |
---
<a id="inputs"></a>
## Tham số input
| Input | Mặc định | Ý nghĩa |
|-------|----------|---------|
| `InpHtf` | H1 | Timeframe cấu trúc |
| `InpSwingRange` | 3 | Nến mỗi bên pivot; confirm đỉnh/đáy §1.4 |
| `InpSwingLookback` | 400 | Số nến quét lúc lock ban đầu |
| `InpFibMinRatio` | 0.382 | Tiên quyết pullback (chỉ lúc lock trend) |
| `InpDrawSwings` | true | Label H0L1 |
| `InpDrawZones` | true | Rectangle Key LV |
| `InpDrawPanel` | true | Panel trạng thái |
| `InpDebug` | false | Log chi tiết |
---
<a id="display-states"></a>
## Trạng thái hiển thị
| Panel text | Ý nghĩa |
|------------|---------|
| `BULL PULLBACK` | Bull hợp lệ, giá trong L0H0 |
| `BULL (Fib pending)` | HH-HL nhưng hồi chưa đủ 38.2% |
| `BULL CHoCH` | Phá L0 hoặc đang update CHoCH |
| `BULL CONTINUE` | Phá H0 / đang tạo đỉnh mới |
| `BEAR …` | Đối xứng |
| `NEUTRAL` | Cấu trúc không rõ |
Khi đang update: dòng `Update: evt=… phase=… | swingR=…`.
---
<a id="api"></a>
## API mở rộng
```cpp
// Trong HyperICT.mq5 — có thể #include Types từ EA khác nếu cần enum
ENUM_HTF_STATE HyperICT_GetState();
```
Trả về `ctx.state` hiện tại. EA khác có thể đọc sau khi HyperICT chạy trên cùng chart (cần thiết kế thêm export nếu muốn đọc swing/Key từ bên ngoài).
---
<a id="roadmap"></a>
## Giới hạn & hướng phát triển
### Đã có
- HTF structure, Key LV, OB đơn giản, 7+ states, snapshot lock, §1.4 incremental update với swing confirm.
### Chưa có
- Đặt lệnh, quản lý risk, session filter.
- LTF entry (MSS, FVG, …).
- OB mitigation filter chuẩn ICT.
- Vẽ trên chart HTF tách biệt (hiện dùng `ChartID()` đang mở).
- Alert / push notification.
### Hướng phát triển gợi ý
1. Test & harden `UpdateEngine` trên lịch sử (Strategy Tester visual).
2. Module `LTF` tách riêng, đọc `HyperICT_GetState()`.
3. Cải thiện `FindSupplyOB` / `FindDemandOB`.
4. Export struct `HtfContext` qua global hoặc file cho indicator.
---
<a id="spec-map"></a>
## Map spec → module (tóm tắt)
| Spec | Module |
|------|--------|
| Tiên quyết Fib + HH-HL | `FibValidator`, `SwingEngine` |
| §1.1 States | `Classifier`, `Panel` |
| §1.2 Key + OB | `KeyLevels`, `Draw` |
| §1.3 Vẽ | `Draw` |
| §1.4 CHoCH/Continue | `UpdateEngine`, `SwingEngine` |
| Pipeline | `StateMachine` |
| Input | `Config` |
| Data model | `Types` |
---
*Tài liệu đồng bộ với HyperICT v0.11. Khi đổi logic, cập nhật comment đầu từng file `.mqh` và README này.*
+12 -5
View File
@@ -1,5 +1,13 @@
//+------------------------------------------------------------------+
//| StateMachine.mqh — pipeline đánh giá HTF mỗi bar |
//| StateMachine.mqh |
//| Pipeline: Init → mỗi nến HTF → Update → Fib/Key → Classify |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • OnInit: LockInitialSnapshot (swing cố định từ lúc bot chạy) |
//| • Mỗi nến HTF mới: UpdateEngine → RefreshDerived → state |
//| • RefreshDerived: Fib tiên quyết + KeyLevels + Classifier |
//| • Sau roll swing: tính lại structBias, fibOk, key, state |
//| KHÔNG: trading logic, OnTimer intrabar cho update |
//+------------------------------------------------------------------+
#ifndef HYPERICT_STATEMACHINE_MQH
#define HYPERICT_STATEMACHINE_MQH
@@ -12,7 +20,6 @@
#include <HyperICT/Classifier.mqh>
#include <HyperICT/UpdateEngine.mqh>
//+------------------------------------------------------------------+
class CStateMachine
{
static void Dbg(const string msg)
@@ -23,7 +30,7 @@ class CStateMachine
static void RefreshDerived(HtfContext &ctx)
{
// Fib 0.382 chỉ kiểm tra tiên quyết trên bộ swing hiện tại (không dùng trong §1.4)
// Fib 0.382: chỉ ý nghĩa tiên quyết pullback trên bộ swing hiện tại
ctx.fibOk = CFibValidator::IsPullbackValid(ctx.swings, InpFibMinRatio);
CKeyLevels::BuildKeyLevels(ctx.symbol, ctx.htf, ctx.structBias,
ctx.swings, ctx.keyLv1, ctx.keyLv2);
@@ -58,8 +65,8 @@ public:
if(newBar)
{
ctx.lastHtfBar = iTime(ctx.symbol, ctx.htf, 0);
CUpdateEngine::OnHtfBarClose(ctx);
RefreshDerived(ctx);
CUpdateEngine::OnHtfBarClose(ctx); // §1.4 trước
RefreshDerived(ctx); // §1.1 + §1.2 sau
if(InpDebug)
Dbg("HTF bar → " + CClassifier::StateText(ctx.state));
}
+18 -3
View File
@@ -1,5 +1,14 @@
//+------------------------------------------------------------------+
//| SwingEngine.mqh — pivot, H0L1, snapshot khóa |
//| SwingEngine.mqh |
//| Pivot HTF, H0L1, khóa snapshot, roll swing §1.4 |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • §1: H0,H1,L0,L1 từ giá hiện tại về trước (2 high + 2 low) |
//| • HH-HL / LH-LL — ClassifyStructure |
//| • Khóa swing lúc bot chạy — LockInitialSnapshot (không đổi mỗi nến) |
//| • §1.4 roll: Continue, CHoCH case1 (L1 giữ), CHoCH case2 bear |
//| • Xác nhận pivot sau phá Key — IsConfirmedSwingHigh/Low + range |
//| CHƯA TỐI ƯU: quét OB chất lượng ICT (mitigation) |
//+------------------------------------------------------------------+
#ifndef HYPERICT_SWINGENGINE_MQH
#define HYPERICT_SWINGENGINE_MQH
@@ -7,10 +16,10 @@
#include <HyperICT/Types.mqh>
#include <HyperICT/Config.mqh>
//+------------------------------------------------------------------+
class CSwingEngine
{
public:
//--- Pivot chuẩn: `range` nến mỗi phía (dùng cho §1.4 confirm đỉnh/đáy)
static bool IsSwingHigh(const string sym, const ENUM_TIMEFRAMES tf,
const int shift, const int range)
{
@@ -144,6 +153,7 @@ public:
has1 = true;
}
//--- §1.1 tiên quyết đặc điểm 1: HH-HL hoặc LH-LL
static ENUM_STRUCT_BIAS ClassifyStructure(const SwingSet &sw)
{
if(!sw.IsComplete())
@@ -167,6 +177,7 @@ public:
return out.IsComplete();
}
//--- § chú ý: snapshot HTF cố định từ khi bot chạy (chỉ đổi qua UpdateEngine)
static bool LockInitialSnapshot(HtfContext &ctx)
{
ctx.swings.Clear();
@@ -178,6 +189,7 @@ public:
return true;
}
//--- §1.4a Bull Continue P2: H0→H1, L0→L1, newH0→H0, newL0→L0
static void RollBullContinue(SwingSet &sw, const SwingPoint &newH0, const SwingPoint &newL0)
{
sw.h1 = sw.h0;
@@ -190,17 +202,19 @@ public:
sw.hasL0 = true;
}
//--- §1.4b Bull CHoCH P3 case1: H0→H1, L1 giữ, newL0→L0, newH0→H0
static void RollBullChochCase1(SwingSet &sw, const SwingPoint &newH0, const SwingPoint &newL0)
{
sw.h1 = sw.h0;
sw.hasH1 = sw.hasH0;
// L1 giữ nguyên (spec)
// L1 giữ nguyên theo spec
sw.l0 = newL0;
sw.hasL0 = true;
sw.h0 = newH0;
sw.hasH0 = true;
}
//--- §1.4b Bull CHoCH P3 case2: confirm bear — H0→H1, newH0→H0, newL0→L1, newL02→L0
static void RollBullChochCase2(SwingSet &sw,
const SwingPoint &newH0,
const SwingPoint &newL0,
@@ -216,6 +230,7 @@ public:
sw.hasL0 = true;
}
//--- §1.4c Bear Continue (đối xứng bull continue)
static void RollBearContinue(SwingSet &sw, const SwingPoint &newH0, const SwingPoint &newL0)
{
sw.l1 = sw.l0;
+33 -14
View File
@@ -1,9 +1,19 @@
//+------------------------------------------------------------------+
//| Types.mqh — enums & structs (spec §11.4) |
//| Types.mqh |
//| Mô hình dữ liệu cho toàn bộ HyperICT (map trực tiếp spec §11.4) |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT (ánh xạ spec → code): |
//| • H0,H1,L0,L1 — SwingSet + SwingPoint |
//| • §1.1 trạng thái: ENUM_HTF_STATE (Pullback/CHoCH/Continue/…) |
//| • §1.2 Key LV1/L2 + vùng OB — KeyLevelPair, OrderBlockZone |
//| • §1.4 update tăng dần — UpdateContext (newH0, newL0, newL02) |
//| • Khóa snapshot HTF — HtfContext.snapshotReady, lockedAt |
//| CHƯA CÓ TRONG FILE NÀY: logic tính toán (nằm ở module khác) |
//+------------------------------------------------------------------+
#ifndef HYPERICT_TYPES_MQH
#define HYPERICT_TYPES_MQH
//--- §1.1 tiên quyết cấu trúc: HH-HL (bull) / LH-LL (bear)
enum ENUM_STRUCT_BIAS
{
STRUCT_NONE = 0,
@@ -11,31 +21,34 @@ enum ENUM_STRUCT_BIAS
STRUCT_BEAR = -1
};
//--- §1.1 các trạng thái trend HTF (+ Fib pending, không phải Neutral)
enum ENUM_HTF_STATE
{
HTF_NEUTRAL = 0,
HTF_BULL_INCOMPLETE = 1,
HTF_NEUTRAL = 0, // không phân loại được 4 swing / cấu trúc lẫn lộn
HTF_BULL_INCOMPLETE = 1, // HH-HL nhưng Fib hồi H1→L0 chưa đủ (§ tiên quyết)
HTF_BEAR_INCOMPLETE = 2,
HTF_BULL_PULLBACK = 3,
HTF_BULL_CHOCH = 4,
HTF_BULL_CONTINUE = 5,
HTF_BULL_PULLBACK = 3, // Fib OK + giá giữa L0H0
HTF_BULL_CHOCH = 4, // body phá L0 (Key LV1) hoặc đang phase CHoCH
HTF_BULL_CONTINUE = 5, // body phá H0 (Key LV2) hoặc đang phase Continue
HTF_BEAR_PULLBACK = 6,
HTF_BEAR_CHOCH = 7,
HTF_BEAR_CONTINUE = 8
};
//--- §1.2 / §1.4: sự kiện phá Key level (body close trên bar HTF đóng)
enum ENUM_UPDATE_EVENT
{
UPD_NONE = 0,
UPD_CHOCH = 1,
UPD_CONTINUE = 2
UPD_CHOCH = 1, // phá Key LV1 → Change of Character
UPD_CONTINUE = 2 // phá Key LV2 → tiếp diễn xu hướng
};
//--- §1.4 các giai đoạn sau khi phá Key (không quét lại full lookback)
enum ENUM_UPDATE_PHASE
{
UPD_PHASE_IDLE = 0,
UPD_PHASE_BUILD = 1,
UPD_PHASE_CHOCH_RESOLVE = 2
UPD_PHASE_BUILD = 1, // P1: track newH0/newL0; P2 CHoCH: xác nhận pivot
UPD_PHASE_CHOCH_RESOLVE = 2 // CHoCH P3: case1 về bull / case2 confirm bear
};
enum ENUM_CHOCH_BRANCH
@@ -45,6 +58,7 @@ enum ENUM_CHOCH_BRANCH
CHOCH_BRANCH_CONFIRM_BEAR = 2
};
//--- Đỉnh/đáy pivot (từ hiện tại về trước: H0/L0 mới nhất)
struct SwingPoint
{
double price;
@@ -59,6 +73,7 @@ struct SwingPoint
bool Valid() const { return shift >= 0 && price > 0.0; }
};
//--- §1.2 vùng cung/cầu: swing → biên OB (nến đỏ @ L0 / nến xanh @ H0)
struct OrderBlockZone
{
double swingPrice;
@@ -76,12 +91,14 @@ struct OrderBlockZone
}
};
//--- §1.2 Key LV1 / Key LV2 (giá + zone vẽ rectangle)
struct KeyLevelPair
{
double price;
OrderBlockZone zone;
};
//--- Bộ swing khóa: H0,H1,L0,L1
struct SwingSet
{
SwingPoint h0, h1, l0, l1;
@@ -97,6 +114,7 @@ struct SwingSet
}
};
//--- §1.4 ngữ cảnh cập nhật incremental (newH0/newL0/newL02, khóa khi pivot confirm)
struct UpdateContext
{
ENUM_UPDATE_EVENT event;
@@ -104,10 +122,10 @@ struct UpdateContext
ENUM_CHOCH_BRANCH chochBranch;
SwingPoint newH0;
SwingPoint newL0;
SwingPoint newL02;
bool newH0Locked;
SwingPoint newL02; // CHoCH bull case2 → roll thành L0
bool newH0Locked; // ngừng track high khi swing confirm
bool newLLocked;
bool case1TrackingH0;
bool case1TrackingH0; // CHoCH P3 case1: đang tạo đỉnh mới
void Clear()
{
event = UPD_NONE;
@@ -119,13 +137,14 @@ struct UpdateContext
}
};
//--- Trạng thái runtime toàn EA (một snapshot HTF tại thời điểm bot chạy / sau roll)
struct HtfContext
{
string symbol;
ENUM_TIMEFRAMES htf;
SwingSet swings;
ENUM_STRUCT_BIAS structBias;
bool fibOk;
bool fibOk; // § tiên quyết Fib (chỉ ý nghĩa pullback hợp lệ)
KeyLevelPair keyLv1;
KeyLevelPair keyLv2;
ENUM_HTF_STATE state;
+18 -2
View File
@@ -1,6 +1,18 @@
//+------------------------------------------------------------------+
//| UpdateEngine.mqh — §1.4: xác nhận đỉnh/đáy bằng InpSwingRange |
//| (Fib chỉ dùng lúc lock trend ban đầu — xem FibValidator) |
//| UpdateEngine.mqh |
//| §1.4 CHoCH & Trend Continue — cập nhật incremental |
//+------------------------------------------------------------------+
//| ĐÃ GIẢI QUYẾT: |
//| • Chỉ chạy khi nến HTF mới đóng; không quét lại full lookback |
//| • Phá Key LV1 (body) → CHoCH | Phá Key LV2 → Continue |
//| • §1.4a Bull Continue P1: track newH0 (nến xanh), newL0 (đáy) |
//| • §1.4a P2: IsConfirmedSwingHigh(newH0) → roll, khóa newH0 |
//| • §1.4b Bull CHoCH P12: track newL0 → swing low confirm → P3 |
//| • §1.4b P3 case1: phá H0 → newH0 confirm → roll (L1 giữ) |
//| • §1.4b P3 case2: phá newL0 → newH0+newL02 confirm → bear roll|
//| • §1.4c/d Bear: đối xứng Continue & CHoCH |
//| • Xác nhận đỉnh/đáy = InpSwingRange (KHÔNG dùng Fib ở đây) |
//| CHƯA TỐI ƯU: gắn OB chính xác cho newL0 mỗi leg; edge case đa tín hiệu |
//+------------------------------------------------------------------+
#ifndef HYPERICT_UPDATEENGINE_MQH
#define HYPERICT_UPDATEENGINE_MQH
@@ -66,6 +78,7 @@ public:
return t0 != 0 && t0 != ctx.lastHtfBar;
}
//--- Phát hiện body phá Key LV1/L2 lần đầu → bật BUILD
static void DetectBreakEvents(HtfContext &ctx)
{
if(ctx.update.phase != UPD_PHASE_IDLE)
@@ -118,6 +131,7 @@ public:
}
}
//--- §1.4a Bull Continue — P1 track + P2 swing high confirm → roll
static void ProcessBullContinueBuild(HtfContext &ctx, const int sh)
{
if(CKeyLevels::IsBullCandle(ctx.symbol, ctx.htf, sh))
@@ -160,6 +174,7 @@ public:
Dbg("Bear Continue — swing low confirmed, rolled");
}
//--- §1.4b Bull CHoCH — P1 track newL0, P2 swing low confirm → CHOCH_RESOLVE
static void ProcessBullChochBuild(HtfContext &ctx, const int sh)
{
TrackNewLow(ctx.symbol, ctx.htf, sh, ctx.update.newL0, ctx.update.newLLocked);
@@ -192,6 +207,7 @@ public:
Dbg("Bear CHoCH — newH0 swing confirmed → phase 3");
}
//--- §1.4b Bull CHoCH P3 — case1 về bull / case2 confirm bear
static void ProcessBullChochResolve(HtfContext &ctx, const int sh)
{
if(CKeyLevels::BodyBreakAbove(ctx.symbol, ctx.htf, sh, ctx.swings.h0.price))
Binary file not shown.