2026-03-06 22:38:09 +07:00
|
|
|
|
//+------------------------------------------------------------------+
|
2026-03-10 04:22:02 +07:00
|
|
|
|
//| ICT EA – FVG Edition (MQL5) v4.3 |
|
2026-03-08 05:18:56 +07:00
|
|
|
|
//| Architecture : BiasTF(D1) + MiddleTF(H1) + TriggerTF(M5) |
|
|
|
|
|
|
//| State Machine: IDLE → WAIT_TOUCH → WAIT_TRIGGER → IN_TRADE |
|
2026-03-08 01:09:31 +07:00
|
|
|
|
//| |
|
2026-03-08 23:54:12 +07:00
|
|
|
|
//| Flow tổng thể: |
|
|
|
|
|
|
//| 1. D1 bias (UP/DOWN) đồng thuận H1 trend |
|
|
|
|
|
|
//| 2. H1 FVG thuận xu hướng → chờ price retrace vào FVG |
|
|
|
|
|
|
//| 3. Giá touch H1 FVG → chờ M5 MSS xác nhận đảo chiều |
|
2026-03-10 04:22:02 +07:00
|
|
|
|
//| 4. M5 MSS = swing break thuận chiều H1: |
|
|
|
|
|
|
//| - H1 UP → close > tH0 (phá swing high) = bull MSS |
|
|
|
|
|
|
//| - H1 DOWN → close < tL0 (phá swing low) = bear MSS |
|
|
|
|
|
|
//| v4.3: MSS chỉ detect khi WAIT_TRIGGER, không vẽ/detect khác |
|
|
|
|
|
|
//| 5. Entry = limit tại swing level vừa bị phá (tH0 hoặc tL0) |
|
|
|
|
|
|
//| 6. SL = swing đối diện (tL0 cho buy, tH0 cho sell) |
|
2026-03-08 23:54:12 +07:00
|
|
|
|
//| 7. TP = Entry ± 2R |
|
2026-03-08 05:18:56 +07:00
|
|
|
|
//| |
|
|
|
|
|
|
//| Drawing: objects KHÔNG BAO GIỜ bị xóa, chỉ update |
|
2026-03-06 22:38:09 +07:00
|
|
|
|
//+------------------------------------------------------------------+
|
2026-03-10 20:51:27 +07:00
|
|
|
|
#property copyright "Bell's ICT EA"
|
|
|
|
|
|
#property version "4.30"
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
#define MAX_FVG_POOL 30
|
2026-03-08 05:18:56 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
#include "EA_ICT_CL/Config.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/State.mqh"
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
#include "EA_ICT_CL/Utils.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Logging.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Market.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Indicators.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Sessions.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Filters.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Risk.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Orders.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Swing.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Trailing.mqh"
|
2026-03-08 06:45:32 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
EAState g_State = EA_IDLE;
|
|
|
|
|
|
BlockReason g_BlockReason = BLOCK_NONE;
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
BiasContext g_Bias;
|
|
|
|
|
|
TFTrendContext g_MiddleTrend;
|
|
|
|
|
|
TFTrendContext g_TriggerTrend;
|
|
|
|
|
|
DailyRiskContext g_DailyRisk;
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
FVGRecord g_FVGPool[MAX_FVG_POOL];
|
|
|
|
|
|
int g_FVGCount = 0;
|
|
|
|
|
|
int g_NextFVGId = 0;
|
|
|
|
|
|
int g_ActiveFVGIdx = -1;
|
|
|
|
|
|
int g_TradeBarIndex = -1;
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
OrderPlan g_OrderPlan;
|
|
|
|
|
|
ulong g_PendingTicket = 0;
|
2026-03-08 06:45:32 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
const string PREFIX_SWING_MIDDLE = "SwingMiddle_";
|
|
|
|
|
|
const string PREFIX_SWING_TRIGGER = "SwingTrigger_";
|
|
|
|
|
|
const string PREFIX_MSS_MARKER = "MSSMarker_";
|
|
|
|
|
|
const string PREFIX_FVG_POOL = "FVGPool_";
|
|
|
|
|
|
const string PREFIX_ORDER_VISUAL = "OrderVisual_";
|
|
|
|
|
|
const string PREFIX_DEBUG_PANEL = "DebugPanel_";
|
2026-03-10 13:47:42 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
#include "EA_ICT_CL/Contexts.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Guards.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Signals_BOS_FVG_OB.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Trade.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/StateMachine.mqh"
|
|
|
|
|
|
#include "EA_ICT_CL/Drawing.mqh"
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
/** Initializes globals, contexts, FVG pool and first draw. */
|
2026-03-06 22:38:09 +07:00
|
|
|
|
int OnInit()
|
|
|
|
|
|
{
|
2026-03-10 20:51:27 +07:00
|
|
|
|
ZeroMemory(g_Bias); ZeroMemory(g_MiddleTrend); ZeroMemory(g_TriggerTrend);
|
|
|
|
|
|
ZeroMemory(g_DailyRisk); ZeroMemory(g_OrderPlan);
|
|
|
|
|
|
for (int i = 0; i < MAX_FVG_POOL; i++) ZeroMemory(g_FVGPool[i]);
|
|
|
|
|
|
g_FVGCount = 0; g_NextFVGId = 0;
|
|
|
|
|
|
g_ActiveFVGIdx = -1; g_TradeBarIndex = -1; g_PendingTicket = 0;
|
|
|
|
|
|
g_State = EA_IDLE; g_BlockReason = BLOCK_NONE;
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
UpdateAllContexts();
|
|
|
|
|
|
ScanAndRegisterFVGs();
|
|
|
|
|
|
DrawVisuals();
|
2026-03-06 22:38:09 +07:00
|
|
|
|
|
2026-03-10 04:22:02 +07:00
|
|
|
|
PrintFormat("✅ ICT EA v4.3 | Bias=%s | H1=%s | M5=%s | Pool=%d",
|
2026-03-08 05:18:56 +07:00
|
|
|
|
EnumToString(g_Bias.bias), EnumToString(g_MiddleTrend.trend),
|
|
|
|
|
|
EnumToString(g_TriggerTrend.trend), g_FVGCount);
|
2026-03-10 20:51:27 +07:00
|
|
|
|
return INIT_SUCCEEDED;
|
2026-03-06 22:38:09 +07:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
/** Each tick: update contexts, run guards and state machine, optionally redraw. */
|
2026-03-06 22:38:09 +07:00
|
|
|
|
void OnTick()
|
|
|
|
|
|
{
|
2026-03-10 20:51:27 +07:00
|
|
|
|
UpdateAllContexts();
|
|
|
|
|
|
if (EvaluateGuards())
|
|
|
|
|
|
RunStateMachine();
|
2026-03-10 13:47:42 +07:00
|
|
|
|
else if (g_State != EA_IDLE)
|
2026-03-10 20:51:27 +07:00
|
|
|
|
ResetToIdle(EnumToString(g_BlockReason));
|
|
|
|
|
|
if (InpDebugDraw) DrawVisuals();
|
2026-03-06 22:38:09 +07:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-10 20:51:27 +07:00
|
|
|
|
/** Removes swing and debug panel objects and redraws chart. */
|
2026-03-06 22:38:09 +07:00
|
|
|
|
void OnDeinit(const int reason)
|
|
|
|
|
|
{
|
2026-03-10 20:51:27 +07:00
|
|
|
|
ObjectsDeleteAll(0, PREFIX_SWING_MIDDLE);
|
|
|
|
|
|
ObjectsDeleteAll(0, PREFIX_SWING_TRIGGER);
|
|
|
|
|
|
ObjectsDeleteAll(0, PREFIX_DEBUG_PANEL);
|
|
|
|
|
|
ChartRedraw(0);
|
|
|
|
|
|
PrintFormat("ICT EA v4.3 deinit | reason=%d | pool=%d", reason, g_FVGCount);
|
2026-03-10 13:47:42 +07:00
|
|
|
|
}
|