//+------------------------------------------------------------------+ //| 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