Files
2026-05-27 03:18:59 +07:00

336 lines
9.8 KiB
Plaintext

//+------------------------------------------------------------------+
//| Types.mqh — ICT 2026 data model (foundation layer) |
//+------------------------------------------------------------------+
//| Mục đích: |
//| File này CHỈ CHỨA enums + structs + một vài hằng số. KHÔNG có |
//| function logic. Bất kỳ file nào trong ICT2026 module đều có thể |
//| include trực tiếp file này mà không lo cycle dependency. |
//| |
//| Enums chính: |
//| ENUM_ICT_BIAS : BULL / BEAR / NONE / RANGE |
//| ENUM_ICT_STRUCT : HH_HL / LH_LL / MIXED / UNKNOWN |
//| ENUM_ICT_MS_EVENT : NONE / BOS / CHOCH |
//| ENUM_ICT_TREND : UP / DOWN / NONE (+ EARLY phase) |
//| ENUM_ICT_FVG_SIDE : BULL / BEAR / NONE |
//| ENUM_ICT_FVG_STATE : AVAILABLE / USED |
//| ENUM_ICT_MSS_PHASE : IDLE → H1_TOUCH → CHOCH → M5_FVG → |
//| ENTRY_FILL → READY |
//| ENUM_ICT_HTF_BIAS : UP / DOWN / SIDEWAY / NONE (PreviousDay)|
//| ENUM_ICT_TREND_PHASE : CLEAR (HH-HL/LH-LL rõ) / EARLY (sau |
//| CHoCH chưa rõ) |
//| |
//| Structs chính: |
//| IctSwingPoint : 1 pivot {price, time, shift} |
//| IctSwingSet : 4 pivot H0/L0/H1/L1 + flags isComplete |
//| IctTrendResolveCtx : input for IctResolveTrend |
//| IctDailyBiasState : bias, structural, lastEvent, pdh/pdl/eq, |
//| keyLv1/keyLv2, swings, reason, htf |
//| IctIntradayState : trend, isAllowTrade, swings, lastEvent |
//| IctFvgZone : side, state, lower/upper, createdTime, |
//| firstTouchTime, maxFillRatio, pdHigh/Low,|
//| pdEq, pdComplete, pdSwing1Set, id, ... |
//| IctMssState : phase, h1FvgId, h1TouchTime, h1WatchFvgId,|
//| chochLocked, chochBias, chochKeyLevel, |
//| chochKeyTime, chochTime, slSwingPrice, |
//| liveL0/H0/L1/H1 price+time, |
//| m5FvgId, m5FvgTime, pendingTicket, |
//| pendingEntry/Sl/Tp, pendingPlacedTime, |
//| partialTriggerPrice, partialCloseDone, |
//| beMovedDone, displayReason |
//| IctEaState : code (STATE enum), title, detail |
//| IctLowTfState : lastBarTime, lastConfirmBarTime, mss, |
//| activeCount, availableCount, |
//| confirmFvgCount, displayReason |
//+------------------------------------------------------------------+
#ifndef ICT2026_TYPES_MQH
#define ICT2026_TYPES_MQH
enum ENUM_ICT_BIAS
{
ICT_BIAS_NONE = 0,
ICT_BIAS_BULL = 1,
ICT_BIAS_BEAR = -1,
ICT_BIAS_RANGE = 2
};
enum ENUM_ICT_STRUCT
{
ICT_STRUCT_NONE = 0,
ICT_STRUCT_BULL = 1,
ICT_STRUCT_BEAR = -1
};
enum ENUM_ICT_HTF_BIAS
{
ICT_HTF_NONE = 0,
ICT_HTF_UP = 1,
ICT_HTF_DOWN = -1,
ICT_HTF_SIDEWAY = 2
};
// BOS = Continue | CHoCH = Reversal
enum ENUM_ICT_MS_EVENT
{
ICT_MS_NONE = 0,
ICT_MS_BOS = 1,
ICT_MS_CHOCH = 2
};
enum ENUM_ICT_TREND
{
ICT_TREND_NONE = 0,
ICT_TREND_UP = 1,
ICT_TREND_DOWN = -1
};
// Rõ ràng (HH-HL/LH-LL) hoặc sớm (sau CHoCH, MS chưa rõ)
enum ENUM_ICT_TREND_PHASE
{
ICT_TREND_PHASE_NONE = 0,
ICT_TREND_PHASE_CLEAR = 1,
ICT_TREND_PHASE_EARLY = 2
};
struct IctSwingPoint
{
double price;
datetime time;
int shift;
void Clear()
{
price = 0.0;
time = 0;
shift = -1;
}
bool Valid() const { return shift >= 0 && price > 0.0; }
};
struct IctSwingSet
{
IctSwingPoint h0, h1, l0, l1;
bool hasH0, hasH1, hasL0, hasL1;
bool IsComplete() const
{
return hasH0 && hasH1 && hasL0 && hasL1;
}
void Clear()
{
h0.Clear(); h1.Clear(); l0.Clear(); l1.Clear();
hasH0 = hasH1 = hasL0 = hasL1 = false;
}
};
struct IctHTFBiasState
{
ENUM_ICT_HTF_BIAS bias;
double rangeHigh;
double rangeLow;
datetime lastUpdateTime;
};
struct IctDailyBiasState
{
ENUM_ICT_BIAS bias;
ENUM_ICT_TREND_PHASE biasPhase;
ENUM_ICT_STRUCT structural;
ENUM_ICT_MS_EVENT lastEvent;
bool fibOk;
IctSwingSet swings;
double keyLv1;
double keyLv2;
ENUM_ICT_STRUCT lastClearStructural;
double pdh;
double pdl;
double pdc;
double eq;
IctHTFBiasState htf;
datetime lastBarTime;
string reason;
string displayReason;
};
struct IctIntradayState
{
ENUM_ICT_TREND trend;
ENUM_ICT_TREND_PHASE trendPhase;
ENUM_ICT_STRUCT structural;
ENUM_ICT_MS_EVENT lastEvent;
IctSwingSet swings;
double keyLv1;
double keyLv2;
ENUM_ICT_STRUCT lastClearStructural;
datetime lastBarTime;
string displayReason;
bool isAllowTrade;
};
enum ENUM_ICT_FVG_SIDE
{
ICT_FVG_NONE = 0,
ICT_FVG_BULL = 1,
ICT_FVG_BEAR = -1
};
enum ENUM_ICT_FVG_STATE
{
ICT_FVG_AVAILABLE = 0,
ICT_FVG_USED = 1
};
enum ENUM_ICT_PD_ZONE
{
ICT_PD_NONE = 0,
ICT_PD_PREMIUM = 1,
ICT_PD_DISCOUNT = -1,
ICT_PD_EQUILIBRIUM = 2
};
enum ENUM_ICT_MSS_PHASE
{
ICT_MSS_IDLE = 0,
ICT_MSS_H1_TOUCH = 1, // Đã retest FVG H1 (POI): chạm + lấp ≥ InpMssH1MinFillPct trên H1
ICT_MSS_CHOCH = 2,
ICT_MSS_M5_FVG = 3,
ICT_MSS_ENTRY_FILL = 4,
ICT_MSS_READY = 5
};
struct IctFvgZone
{
ulong id;
ENUM_ICT_FVG_SIDE side;
ENUM_ICT_FVG_STATE state;
ENUM_ICT_PD_ZONE pdZone;
ENUM_ICT_PD_ZONE repPd;
double upper;
double lower;
double pdHigh;
double pdLow;
double pdEq;
double maxFillRatio;
datetime createdTime;
datetime timeStart;
datetime timeEnd;
datetime firstTouchTime;
datetime fvgUsedTime;
datetime expireTime;
bool locked;
datetime pdRangeStart;
datetime pdRangeEnd;
bool pdComplete;
bool pdSwing1Set;
bool mssH1Touch382;
void Clear()
{
id = 0;
side = ICT_FVG_NONE;
state = ICT_FVG_AVAILABLE;
pdZone = ICT_PD_NONE;
repPd = ICT_PD_NONE;
upper = 0.0;
lower = 0.0;
pdHigh = 0.0;
pdLow = 0.0;
pdEq = 0.0;
maxFillRatio = 0.0;
createdTime = 0;
timeStart = 0;
timeEnd = 0;
firstTouchTime = 0;
fvgUsedTime = 0;
expireTime = 0;
locked = false;
pdRangeStart = 0;
pdRangeEnd = 0;
pdComplete = false;
pdSwing1Set = false;
mssH1Touch382 = false;
}
};
struct IctMssState
{
ENUM_ICT_MSS_PHASE phase;
ulong h1FvgId;
datetime h1TouchTime;
ulong m5FvgId;
double chochKeyLevel;
datetime chochKeyTime;
datetime chochTime;
datetime m5FvgTime;
double slSwingPrice;
bool chochLocked;
ENUM_ICT_BIAS chochBias;
ulong pendingTicket;
datetime pendingPlacedTime;
double pendingEntry;
double pendingSl;
double pendingTp;
double partialTriggerPrice;
bool partialCloseDone;
bool beMovedDone;
double liveL0Price;
double liveH0Price;
datetime liveL0Time;
datetime liveH0Time;
double liveL1Price;
double liveH1Price;
datetime liveL1Time;
datetime liveH1Time;
datetime h1LastInvalidBarTime;
ulong h1WatchFvgId;
string displayReason;
void Clear()
{
phase = ICT_MSS_IDLE;
h1FvgId = 0;
h1TouchTime = 0;
m5FvgId = 0;
chochKeyLevel = 0.0;
chochKeyTime = 0;
chochTime = 0;
m5FvgTime = 0;
slSwingPrice = 0.0;
chochLocked = false;
chochBias = ICT_BIAS_NONE;
pendingTicket = 0;
pendingPlacedTime = 0;
pendingEntry = 0.0;
pendingSl = 0.0;
pendingTp = 0.0;
partialTriggerPrice = 0.0;
partialCloseDone = false;
beMovedDone = false;
liveL0Price = 0.0;
liveH0Price = 0.0;
liveL0Time = 0;
liveH0Time = 0;
liveL1Price = 0.0;
liveH1Price = 0.0;
liveL1Time = 0;
liveH1Time = 0;
h1LastInvalidBarTime = 0;
h1WatchFvgId = 0;
displayReason = "";
}
};
struct IctLowTfState
{
datetime lastBarTime;
datetime lastConfirmBarTime;
int activeCount;
int availableCount;
int confirmFvgCount;
string displayReason;
IctMssState mss;
};
#endif