Files
Bell-PriceActionWithEma-EA/Include/ICT2026/Types.mqh
T
2026-05-26 20:27:12 +07:00

293 lines
6.8 KiB
Plaintext

//+------------------------------------------------------------------+
//| Types.mqh — ICT 2026 data model |
//+------------------------------------------------------------------+
#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;
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;
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