Files
Bell-PriceActionWithEma-EA/Experts/EA_ICT_CL.mq5
T
2026-03-10 19:28:06 +07:00

123 lines
7.2 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//+------------------------------------------------------------------+
//| ICT EA FVG Edition (MQL5) v4.3 |
//| Architecture : BiasTF(D1) + MiddleTF(H1) + TriggerTF(M5) |
//| State Machine: IDLE → WAIT_TOUCH → WAIT_TRIGGER → IN_TRADE |
//| |
//| 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 |
//| 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) |
//| 7. TP = Entry ± 2R |
//| |
//| Drawing: objects KHÔNG BAO GIỜ bị xóa, chỉ update |
//+------------------------------------------------------------------+
#property copyright "Bell's ICT EA" // Bản quyền EA
#property version "4.30" // Phiên bản
#define MAX_FVG_POOL 30 // Số FVG tối đa trong pool
//====================================================
// LAYER 1 Config + Types (no dependencies)
//====================================================
#include "EA_ICT_CL/Config.mqh" // Inputs và cấu hình
#include "EA_ICT_CL/State.mqh" // Enums, structs (EAState, BiasContext, FVGRecord...)
//====================================================
// LAYER 2 Utility modules (depend on types + inputs)
//====================================================
#include "EA_ICT_CL/Utils.mqh" // Clamp, RoundToStep, IsNewBar
#include "EA_ICT_CL/Logging.mqh" // LogPrint, LogPrintF
#include "EA_ICT_CL/Market.mqh" // GetBid, GetAsk, GetPoint, IsTradeAllowedNow
#include "EA_ICT_CL/Indicators.mqh" // CopyBufferSafe, CopyTimeSafe
#include "EA_ICT_CL/Sessions.mqh" // IsHourInRange, GetUTCHour
#include "EA_ICT_CL/Filters.mqh" // Filter_MaxSpreadPoints
#include "EA_ICT_CL/Risk.mqh" // NormalizeVolume, LotsFromRiskMoneyAndSLPoints
#include "EA_ICT_CL/Orders.mqh" // NormalizePrice, BuildOrderComment
#include "EA_ICT_CL/Swing.mqh" // MyBarShift, IsSwingHighAt, ScanSwingStructure, ResolveTrendFromSwings
#include "EA_ICT_CL/Trailing.mqh" // Placeholder trailing/BE
//====================================================
// GLOBALS
//====================================================
EAState g_State = EA_IDLE; // Trạng thái EA hiện tại
BlockReason g_BlockReason = BLOCK_NONE; // Lý do chặn trade (session/daily loss/bias...)
BiasContext g_Bias; // D1 bias (UP/DOWN/SIDEWAY/NONE)
TFTrendContext g_MiddleTrend; // H1 swing + trend + MSS
TFTrendContext g_TriggerTrend; // M5 swing + trend
DailyRiskContext g_DailyRisk; // Balance đầu ngày, limit hit
FVGRecord g_FVGPool[MAX_FVG_POOL]; // Pool các FVG đã quét
int g_FVGCount = 0; // Số FVG trong pool
int g_NextFVGId = 0; // ID gán cho FVG mới
int g_ActiveFVGIdx = -1; // Chỉ số FVG đang theo dõi (-1 = không có)
int g_TradeBarIndex = -1; // Bar index khi vào lệnh (dùng cho timeout...)
OrderPlan g_OrderPlan; // Kế hoạch lệnh (entry, SL, TP, lot)
ulong g_PendingTicket = 0; // Ticket lệnh pending đã gửi
const string PREFIX_SWING_MIDDLE = "SwingMiddle_"; // Tiền tố object H1 swing
const string PREFIX_SWING_TRIGGER = "SwingTrigger_"; // Tiền tố object M5 swing
const string PREFIX_MSS_MARKER = "MSSMarker_"; // Tiền tố marker MSS
const string PREFIX_FVG_POOL = "FVGPool_"; // Tiền tố hình FVG
const string PREFIX_ORDER_VISUAL = "OrderVisual_"; // Tiền tố vùng Entry/SL/TP
const string PREFIX_DEBUG_PANEL = "DebugPanel_"; // Tiền tố panel debug góc trái
//====================================================
// LAYER 3 Logic modules (depend on globals)
//====================================================
#include "EA_ICT_CL/Contexts.mqh" // UpdateBiasContext, UpdateTFTrendContext, UpdateAllContexts
#include "EA_ICT_CL/Guards.mqh" // IsSessionAllowed, EvaluateGuards
#include "EA_ICT_CL/Signals_BOS_FVG_OB.mqh" // ScanAndRegisterFVGs, UpdateFVGStatuses, GetBestActiveFVGIdx
#include "EA_ICT_CL/Trade.mqh" // BuildOrderPlan, ExecuteLimitOrder
#include "EA_ICT_CL/StateMachine.mqh" // TransitionTo, RunStateMachine, OnStateIdle...
#include "EA_ICT_CL/Drawing.mqh" // DrawVisuals, DrawFVGPool, DrawContextDebug...
//+------------------------------------------------------------------+
//| EA LIFECYCLE |
//+------------------------------------------------------------------+
int OnInit()
{
ZeroMemory(g_Bias); ZeroMemory(g_MiddleTrend); ZeroMemory(g_TriggerTrend); // Xóa context
ZeroMemory(g_DailyRisk); ZeroMemory(g_OrderPlan); // Xóa risk + order plan
for (int i = 0; i < MAX_FVG_POOL; i++) ZeroMemory(g_FVGPool[i]); // Xóa toàn bộ pool FVG
g_FVGCount = 0; g_NextFVGId = 0; // Reset đếm FVG
g_ActiveFVGIdx = -1; g_TradeBarIndex = -1; g_PendingTicket = 0; // Không FVG active, không pending
g_State = EA_IDLE; g_BlockReason = BLOCK_NONE; // State = IDLE, không block
UpdateAllContexts(); // Cập nhật D1 bias, H1/M5 trend, daily risk
ScanAndRegisterFVGs(); // Quét H1 và đăng ký FVG vào pool
DrawVisuals(); // Vẽ swing, FVG, debug panel (nếu bật)
PrintFormat("✅ ICT EA v4.3 | Bias=%s | H1=%s | M5=%s | Pool=%d",
EnumToString(g_Bias.bias), EnumToString(g_MiddleTrend.trend),
EnumToString(g_TriggerTrend.trend), g_FVGCount);
return INIT_SUCCEEDED; // Khởi tạo thành công
}
void OnTick()
{
UpdateAllContexts(); // Mỗi tick: cập nhật bias, H1/M5 swing, daily risk, MSS (nếu WAIT_TRIGGER)
if (EvaluateGuards()) // Kiểm tra session, daily loss, bias, alignment
RunStateMachine(); // Chạy state machine (Idle/WaitTouch/WaitTrigger/InTrade)
else if (g_State != EA_IDLE)
ResetToIdle(EnumToString(g_BlockReason)); // Đang không IDLE mà fail guard → reset về IDLE
if (InpDebugDraw) DrawVisuals(); // Vẽ lại nếu bật debug draw
}
void OnDeinit(const int reason)
{
ObjectsDeleteAll(0, PREFIX_SWING_MIDDLE); // Xóa toàn bộ object H1 swing
ObjectsDeleteAll(0, PREFIX_SWING_TRIGGER); // Xóa toàn bộ object M5 swing
ObjectsDeleteAll(0, PREFIX_DEBUG_PANEL); // Xóa panel debug (FVG/order objects giữ lại theo thiết kế)
ChartRedraw(0); // Vẽ lại chart
PrintFormat("ICT EA v4.3 deinit | reason=%d | pool=%d", reason, g_FVGCount); // Log thoát
}