- Added comprehensive MQ4/MQ5 comparison documentation (60+ pages) - Added MT4 EA implementation plan and tracking documents (60+ pages) - Phase 1: Core infrastructure with input parameters and data structures - Phase 2: Bar detection system for H4, M30, M15 timeframes - Phase 3: Pattern detection logic (Regular/Irregular Buy/Sell patterns) - Reference files: FINAL_H4_ZONES.mq4, MultiTimeframeZoneEA.mq5, Strategy.md
33 KiB
Implementation Plan: Multi-Timeframe Zone EA for MT4
Document Version: 1.0
Date: November 4, 2025
Target Platform: MetaTrader 4
Language: MQL4 (legacy compatibility)
Strategy Source: Strategy.md
Reference Code: FINAL_H4_ZONES.mq4
Executive Summary
This document outlines the step-by-step implementation plan for creating a Multi-Timeframe Zone Expert Advisor for MetaTrader 4. The EA will implement a three-level confirmation strategy (H4 → M30 → M15) with automated trade execution, building upon the proven zone detection logic from FINAL_H4_ZONES.mq4.
Key Objectives:
- Detect zones on H4 timeframe with reversal tracking
- Confirm with M30 zones when price pulls back
- Execute trades on M15 zone confirmations
- Manage full trade lifecycle (entry, SL, TP, closure)
- Maintain MT4 compatibility (no MQL5 constructs)
Phase 1: Requirements Analysis
1.1 Strategy Requirements Breakdown
H4 Level (Primary Zone Detection)
REQUIREMENTS:
├─► Pattern Detection (4 types)
│ ├─► Regular Engulfing Buy
│ ├─► Irregular Engulfing Buy
│ ├─► Regular Engulfing Sell
│ └─► Irregular Engulfing Sell
│
├─► Zone Lifecycle Management
│ ├─► Create: Draw dashed rectangle
│ ├─► Break Detection: H4 close beyond zone
│ ├─► Reversal: Change direction + solid style
│ └─► Delete: Second break removes zone
│
└─► Monitoring State
├─► Track active zones
├─► Detect price entry into zones
└─► Trigger M30 monitoring
M30 Level (Confirmation)
REQUIREMENTS:
├─► Conditional Activation
│ └─► Only when price enters H4 zone
│
├─► Pattern Detection
│ ├─► Same 4 patterns as H4
│ ├─► Must match H4 direction
│ └─► Only check NEW bars after entry
│
├─► Zone Management
│ ├─► Create M30 zone on pattern match
│ ├─► One-break deletion (no reversal)
│ └─► Stop searching after break
│
└─► State Tracking
├─► Link to parent H4 zone
├─► Monitor for price entry
└─► Trigger M15 search
M15 Level (Entry Execution)
REQUIREMENTS:
├─► Conditional Activation
│ └─► Only when price enters M30 zone
│
├─► Pattern Detection
│ ├─► Same 4 patterns
│ ├─► Must match H4/M30 direction
│ └─► Only check NEW bars after entry
│
├─► Trade Execution
│ ├─► Buy: Limit at M15 High, SL at M15 Low
│ ├─► Sell: Limit at M15 Low, SL at M15 High
│ └─► One trade per M15 zone
│
└─► Order Management
├─► Place pending limit order
├─► Calculate TP from inputs
└─► Monitor order status
1.2 MT4 Constraints & Considerations
Language Limitations:
- ❌ No classes/objects (use structs and functions)
- ❌ No
CTradelibrary (useOrderSend()directly) - ❌ No
MqlRates[]structures (useiOpen/iClose/iHigh/iLow) - ❌ No dynamic arrays of complex types (use parallel arrays)
- ✅ Structs are allowed
- ✅ Global functions and variables
- ✅ Arrays with fixed or resizable simple types
API Differences:
OrderSend()for all order types (no separate functions)OrderSelect()+OrderModify()for management- Different magic number handling
- No position concept (only orders/trades)
1.3 Input Parameters (From Strategy.md)
// Core Trading Parameters
input double LotSize = 0.01; // Fixed lot size for all trades
input int StopLossPips = 30; // SL distance in pips from entry
input int TakeProfitPips = 60; // TP distance in pips from entry
input int MagicNumber = 123456; // Unique EA identifier
input int Slippage = 3; // Max slippage in pips
// Zone Detection Parameters
input int RecentBarsToCheck = 10; // Bars to scan for patterns
// Display Parameters
input color BuyZoneColor = Lime; // Color for buy zones
input color SellZoneColor = Red; // Color for sell zones
input bool ShowM30Zones = true; // Display M30 zones
input bool ShowM15Zones = true; // Display M15 zones
input bool EnableDebugLogs = false; // Print debug messages
Phase 2: Data Structure Design
2.1 Zone Storage Strategy
Since MT4 doesn't support dynamic arrays of structs reliably, we'll use parallel arrays (proven approach from FINAL_H4_ZONES.mq4):
// Maximum zones per timeframe
#define MAX_H4_ZONES 50
#define MAX_M30_ZONES 100
#define MAX_M15_ZONES 200
// H4 Zone Data
double h4_ZoneHighs[MAX_H4_ZONES];
double h4_ZoneLows[MAX_H4_ZONES];
datetime h4_ZoneTimes[MAX_H4_ZONES];
bool h4_ZoneIsReversed[MAX_H4_ZONES];
string h4_ZoneTypes[MAX_H4_ZONES]; // "Buy", "Sell", "ReversalBuy", "ReversalSell"
bool h4_ZoneMonitoringM30[MAX_H4_ZONES]; // Is this zone monitoring M30?
datetime h4_M30MonitorStart[MAX_H4_ZONES]; // When did M30 monitoring start?
int h4_M30ChildIndex[MAX_H4_ZONES]; // Index of child M30 zone (-1 if none)
bool h4_ZoneActive[MAX_H4_ZONES]; // Is zone still active?
int h4_ZoneCount = 0; // Current H4 zone count
// M30 Zone Data
double m30_ZoneHighs[MAX_M30_ZONES];
double m30_ZoneLows[MAX_M30_ZONES];
datetime m30_ZoneTimes[MAX_M30_ZONES];
string m30_ZoneTypes[MAX_M30_ZONES]; // "Buy" or "Sell"
int m30_ParentH4Index[MAX_M30_ZONES]; // Link to parent H4 zone
bool m30_ZoneMonitoringM15[MAX_M30_ZONES];
datetime m30_M15MonitorStart[MAX_M30_ZONES];
int m30_M15ChildIndex[MAX_M30_ZONES]; // Index of child M15 zone
bool m30_ZoneActive[MAX_M30_ZONES];
int m30_ZoneCount = 0;
// M15 Zone Data
double m15_ZoneHighs[MAX_M15_ZONES];
double m15_ZoneLows[MAX_M15_ZONES];
datetime m15_ZoneTimes[MAX_M15_ZONES];
string m15_ZoneTypes[MAX_M15_ZONES];
int m15_ParentM30Index[MAX_M15_ZONES]; // Link to parent M30 zone
int m15_OrderTicket[MAX_M15_ZONES]; // Order ticket number
bool m15_OrderPlaced[MAX_M15_ZONES];
bool m15_ZoneActive[MAX_M15_ZONES];
int m15_ZoneCount = 0;
// Bar tracking for each timeframe
datetime lastH4BarTime = 0;
datetime lastM30BarTime = 0;
datetime lastM15BarTime = 0;
Rationale:
- Parallel arrays avoid struct array issues in MT4
- Each timeframe has independent storage
- Parent-child relationships via index references
- Active flags for lifecycle management
- Proven pattern from FINAL_H4_ZONES.mq4
2.2 Helper Structures (Limited Use)
// Only for temporary data passing, not for storage
struct PatternInfo {
bool found;
string type; // "Buy" or "Sell"
double high;
double low;
datetime time;
int anchorIndex;
};
Phase 3: Architecture Overview
3.1 Function Hierarchy
OnInit()
├─► InitializeArrays()
└─► CreateInfoPanel()
OnTick()
├─► CheckNewBars()
│ ├─► IsNewH4Bar()
│ ├─► IsNewM30Bar()
│ └─► IsNewM15Bar()
│
├─► ProcessH4()
│ ├─► DetectH4Patterns()
│ │ ├─► IsRegularBuy(i)
│ │ ├─► IsIrregularBuy(i)
│ │ ├─► IsRegularSell(i)
│ │ └─► IsIrregularSell(i)
│ ├─► CreateH4Zone(type, index)
│ └─► CheckH4Breaks()
│ ├─► DetectBreak(zoneIndex)
│ ├─► ReverseZone(zoneIndex)
│ └─► DeleteZone(zoneIndex)
│
├─► ProcessM30()
│ ├─► CheckPriceInH4Zones()
│ │ └─► StartM30Monitoring(h4Index)
│ ├─► DetectM30Patterns(h4Index)
│ │ └─► (Same 4 pattern functions)
│ ├─► CreateM30Zone(h4Index, type)
│ └─► CheckM30Breaks()
│ └─► DeleteM30Zone(m30Index)
│
├─► ProcessM15()
│ ├─► CheckPriceInM30Zones()
│ │ └─► StartM15Monitoring(m30Index)
│ ├─► DetectM15Patterns(m30Index)
│ ├─► CreateM15Zone(m30Index, type)
│ └─► PlacePendingOrder(m15Index)
│ ├─► CalculateOrderPrices()
│ └─► OrderSend()
│
├─► MonitorOrders()
│ ├─► CheckOrderStatus(ticket)
│ └─► ManageOpenTrades()
│
└─► UpdateDisplay()
├─► UpdateH4Zones()
├─► UpdateM30Zones()
├─► UpdateM15Zones()
└─► UpdateInfoPanel()
OnDeinit()
├─► CloseAllOrders()
└─► DeleteAllObjects()
3.2 Modular Design (Without Classes)
Pattern Detection Module:
// Pattern detection functions (timeframe-agnostic)
bool IsRegularBuy(ENUM_TIMEFRAMES tf, int index);
bool IsIrregularBuy(ENUM_TIMEFRAMES tf, int index);
bool IsRegularSell(ENUM_TIMEFRAMES tf, int index);
bool IsIrregularSell(ENUM_TIMEFRAMES tf, int index);
PatternInfo DetectPattern(ENUM_TIMEFRAMES tf, string direction, int startIndex);
Zone Management Module:
// H4 zone functions
int CreateH4Zone(string type, int barIndex);
void UpdateH4Zone(int zoneIndex);
bool CheckH4Break(int zoneIndex);
void ReverseH4Zone(int zoneIndex);
void DeleteH4Zone(int zoneIndex);
void DrawH4Zone(int zoneIndex);
// M30 zone functions
int CreateM30Zone(int h4ParentIndex, string type, int barIndex);
bool CheckM30Break(int zoneIndex);
void DeleteM30Zone(int zoneIndex);
void DrawM30Zone(int zoneIndex);
// M15 zone functions
int CreateM15Zone(int m30ParentIndex, string type, int barIndex);
void DrawM15Zone(int zoneIndex);
Trade Management Module:
// Order execution
int PlacePendingOrder(int m15ZoneIndex);
bool ModifyOrder(int ticket, double sl, double tp);
void MonitorPendingOrders();
void CloseTradeIfNeeded(int ticket);
// Helper functions
double CalculateStopLoss(string type, double entryPrice);
double CalculateTakeProfit(string type, double entryPrice);
double NormalizeLots(double lots);
double NormalizePrice(double price);
State Management Module:
// Price monitoring
bool IsPriceInZone(double price, double high, double low);
void CheckH4ZoneEntries();
void CheckM30ZoneEntries();
// Bar detection
bool IsNewBar(ENUM_TIMEFRAMES tf);
datetime GetLastBarTime(ENUM_TIMEFRAMES tf);
Display Module:
// Visual updates
void DrawZoneRectangle(string name, datetime startTime, double high, double low,
color zoneColor, int style);
void UpdateZoneEnd(string name, datetime endTime);
void UpdateZoneStyle(string name, color newColor, int newStyle);
void DeleteZoneObjects(string baseName);
// Info panel
void CreateInfoPanel();
void UpdateInfoPanel();
string GetPanelText();
Phase 4: Implementation Steps
Step 1: Core Infrastructure (Foundation)
Files to Create:
MultiTimeframeZoneEA_MT4.mq4(main EA file)
Tasks:
- Define all global variables and arrays
- Implement
OnInit():- Initialize arrays to zero/default values
- Set up bar time trackers
- Create info panel placeholder
- Implement
OnDeinit():- Delete all chart objects
- Close any open orders (optional based on strategy)
- Implement basic
OnTick()skeleton - Add input parameters with validation
Testing: Compile successfully, attach to chart, verify no errors
Step 2: Bar Detection System
Tasks:
- Implement
IsNewBar()function:bool IsNewBar(ENUM_TIMEFRAMES tf) { datetime currentBar = iTime(Symbol(), tf, 0); datetime lastBar = GetLastBarTime(tf); if (currentBar != lastBar) { SetLastBarTime(tf, currentBar); return true; } return false; } - Implement bar time getters/setters for H4, M30, M15
- Add debug logging for bar detection
Testing: Attach to chart, verify correct bar detection on all timeframes
Step 3: Pattern Detection (Port from MQ4 Indicator)
Tasks:
- Copy and adapt pattern functions from
FINAL_H4_ZONES.mq4:IsRegularBuy()IsIrregularBuy()IsRegularSell()IsIrregularSell()
- Make them work with any timeframe (add
ENUM_TIMEFRAMESparameter) - Create wrapper function
DetectPattern()that tries all 4 patterns - Add comprehensive logging for detected patterns
Testing:
- Run on H4 chart, verify patterns detected correctly
- Compare with original FINAL_H4_ZONES.mq4 output
- Test on M30 and M15 timeframes
Step 4: H4 Zone Management
Tasks:
- Implement
CreateH4Zone():- Add to arrays at next available index
- Draw dashed rectangle
- Initialize monitoring flags
- Implement
DrawH4Zone():- Use
ObjectCreate()withOBJ_RECTANGLE - Set color, style, ray right
- Use
- Implement
CheckH4Breaks():- Loop all active H4 zones
- Check if H4 close broke zone
- Call
ReverseH4Zone()orDeleteH4Zone()
- Implement zone lifecycle functions:
ReverseH4Zone(): Flip direction, change style to solidDeleteH4Zone(): Remove objects, mark inactive
Testing:
- Verify zones draw correctly
- Test break detection (manual chart manipulation)
- Verify reversals change style
- Verify second break deletes zone
Step 5: M30 Monitoring & Zone Creation
Tasks:
- Implement
CheckH4ZoneEntries():void CheckH4ZoneEntries() { double currentPrice = (Bid + Ask) / 2; for (int i = 0; i < h4_ZoneCount; i++) { if (!h4_ZoneActive[i]) continue; if (h4_ZoneMonitoringM30[i]) continue; // Already monitoring if (h4_M30ChildIndex[i] >= 0) continue; // Already has child if (IsPriceInZone(currentPrice, h4_ZoneHighs[i], h4_ZoneLows[i])) { h4_ZoneMonitoringM30[i] = true; h4_M30MonitorStart[i] = iTime(Symbol(), PERIOD_M30, 0); LogEvent("H4 Zone entered, starting M30 monitoring"); } } } - Implement
ProcessM30():- For each H4 zone monitoring M30
- Only check bars AFTER monitor start time
- Detect pattern matching H4 direction
- Create M30 zone on match
- Implement
CreateM30Zone():- Link to parent H4 zone
- Draw zone on chart
- Implement
CheckM30Breaks():- One break = immediate deletion
- No reversal logic
Testing:
- Verify M30 monitoring starts when price enters H4 zone
- Verify only new bars checked (not historical)
- Verify M30 zone created correctly
- Verify break deletes M30 zone
Step 6: M15 Entry & Order Placement
Tasks:
- Implement
CheckM30ZoneEntries():- Similar to H4 logic
- Start M15 monitoring when price enters M30 zone
- Implement
ProcessM15():- Detect M15 pattern matching direction
- Create M15 zone
- Immediately place pending order
- Implement
PlacePendingOrder():int PlacePendingOrder(int m15Index) { string type = m15_ZoneTypes[m15Index]; double entryPrice, sl, tp; int orderType; if (type == "Buy") { entryPrice = m15_ZoneHighs[m15Index]; sl = m15_ZoneLows[m15Index] - (StopLossPips * Point); tp = entryPrice + (TakeProfitPips * Point); orderType = OP_BUYLIMIT; } else { entryPrice = m15_ZoneLows[m15Index]; sl = m15_ZoneHighs[m15Index] + (StopLossPips * Point); tp = entryPrice - (TakeProfitPips * Point); orderType = OP_SELLLIMIT; } entryPrice = NormalizeDouble(entryPrice, Digits); sl = NormalizeDouble(sl, Digits); tp = NormalizeDouble(tp, Digits); int ticket = OrderSend(Symbol(), orderType, LotSize, entryPrice, Slippage, sl, tp, "MTZ_EA", MagicNumber, 0, clrNONE); if (ticket > 0) { m15_OrderTicket[m15Index] = ticket; m15_OrderPlaced[m15Index] = true; LogEvent("Order placed: Ticket " + IntegerToString(ticket)); return ticket; } else { LogEvent("Order failed: " + GetLastError()); return -1; } } - Implement order calculation helpers:
NormalizePrice(): Round to symbol digitsNormalizeLots(): Round to lot stepCalculateStopLoss(): From strategy rulesCalculateTakeProfit(): From input parameters
Testing:
- Verify M15 zone created correctly
- Verify pending order placed immediately
- Verify order prices are correct (entry, SL, TP)
- Test order placement failure handling
Step 7: Order Monitoring & Management
Tasks:
- Implement
MonitorPendingOrders():void MonitorPendingOrders() { for (int i = 0; i < m15_ZoneCount; i++) { if (!m15_OrderPlaced[i]) continue; int ticket = m15_OrderTicket[i]; if (!OrderSelect(ticket, SELECT_BY_TICKET)) continue; // Check if order filled if (OrderType() == OP_BUY || OrderType() == OP_SELL) { LogEvent("Order filled: Ticket " + IntegerToString(ticket)); // Trade is now active, manage via normal trade management } // Check if order was deleted/cancelled if (OrderCloseTime() > 0) { m15_OrderPlaced[i] = false; LogEvent("Order closed/cancelled: Ticket " + IntegerToString(ticket)); } } } - Implement optional trade management:
- Trailing stop (if desired)
- Breakeven move (if desired)
- Partial close (if desired)
- Add order cleanup on zone breaks:
- If H4 zone breaks, cancel related M15 orders
- If M30 zone breaks, cancel child M15 order
Testing:
- Verify order status tracked correctly
- Test order fill detection
- Test order cancellation on zone breaks
Step 8: Visual Display System
Tasks:
- Implement zone drawing functions:
void DrawZone(string name, datetime startTime, double high, double low, color zoneColor, int style, string label) { if (ObjectFind(name) >= 0) { ObjectMove(name, 1, TimeCurrent(), low); // Update end time } else { ObjectCreate(name, OBJ_RECTANGLE, 0, startTime, high, TimeCurrent(), low); ObjectSet(name, OBJPROP_COLOR, zoneColor); ObjectSet(name, OBJPROP_STYLE, style); ObjectSet(name, OBJPROP_WIDTH, 1); ObjectSet(name, OBJPROP_BACK, false); ObjectSet(name, OBJPROP_RAY, true); ObjectSetText(name, label); } } - Implement info panel:
- Show active zone counts (H4, M30, M15)
- Show monitoring status
- Show active orders
- Show account info (balance, equity, P&L)
- Update all zones on each tick (extend end time)
Testing:
- Verify zones visible on all timeframes
- Verify colors and styles correct
- Test zone updates (reversals, deletions)
- Verify info panel accuracy
Step 9: Error Handling & Validation
Tasks:
- Add array bounds checking:
int CreateH4Zone(string type, int barIndex) { if (h4_ZoneCount >= MAX_H4_ZONES) { LogEvent("ERROR: H4 zone limit reached!"); return -1; } // ... rest of function } - Add order validation:
- Check free margin before OrderSend
- Validate lot size is within limits
- Verify prices are within allowed distance
- Add error logging:
- Log all OrderSend failures with error codes
- Log zone creation failures
- Log invalid states
- Add input parameter validation in
OnInit():- LotSize > 0
- StopLossPips > 0
- TakeProfitPips > 0
Testing:
- Test with insufficient margin
- Test with invalid lot sizes
- Test array limit reached
- Verify error messages clear
Step 10: Testing & Optimization
Tasks:
- Strategy Tester Validation:
- Run on H4 chart with visual mode
- Verify all three timeframe levels work
- Check order placement accuracy
- Review trade results
- Edge Case Testing:
- Multiple H4 zones active simultaneously
- Rapid zone reversals
- Orders pending when zone breaks
- High volatility scenarios
- Performance Optimization:
- Minimize chart object operations
- Optimize loop iterations
- Cache frequently used values
- Code Cleanup:
- Add comprehensive comments
- Organize functions logically
- Remove debug code (or make conditional)
Testing:
- Backtest on 3+ months of data
- Visual mode to verify logic
- Compare with manual trading expectations
Phase 5: Critical Implementation Notes
5.1 MT4-Specific Considerations
Order Types:
// Buy Limit = buy when price comes DOWN to level
OP_BUYLIMIT // Entry below current price
OP_SELLLIMIT // Entry above current price
// BUT: Strategy says "place limit at zone high/low"
// If price is INSIDE zone, we need:
// - Buy: Entry at HIGH (price must go up) = BUY STOP
// - Sell: Entry at LOW (price must go down) = SELL STOP
// CORRECTION FOR STRATEGY:
if (type == "Buy") {
orderType = OP_BUYSTOP; // Entry above current price
} else {
orderType = OP_SELLSTOP; // Entry below current price
}
Price Normalization:
double NormalizePrice(double price) {
return NormalizeDouble(price, Digits);
}
double NormalizeLots(double lots) {
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
double maxLot = MarketInfo(Symbol(), MODE_MAXLOT);
double lotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
lots = MathMax(lots, minLot);
lots = MathMin(lots, maxLot);
lots = NormalizeDouble(lots / lotStep, 0) * lotStep;
return lots;
}
Point vs Pips:
double PipsToPoints(int pips) {
if (Digits == 3 || Digits == 5) {
return pips * 10 * Point; // 5-digit broker
}
return pips * Point; // 4-digit broker
}
5.2 Strategy Interpretation Clarifications
"Place limit order" Correction:
- Strategy says "Buy Limit at High" and "Sell Limit at Low"
- This is incorrect for limit orders (limit buys below price, sells above)
- CORRECTED: Use Buy Stop at High and Sell Stop at Low
- This matches the strategy intent (breakout entry)
"Stop Loss at zone boundary":
- Strategy says SL at opposite zone boundary
- Additional buffer from
StopLossPipsinput - Implementation: SL = zone boundary ± (StopLossPips × Point)
"Only monitor new bars":
- Critical for M30 and M15 levels
- Track
M30MonitorStartandM15MonitorStarttimes - Only check bars with
time >= monitorStartTime
5.3 Debugging Strategy
Enable Comprehensive Logging:
void LogEvent(string message) {
if (EnableDebugLogs) {
Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES), " | ", message);
}
}
// Usage throughout code:
LogEvent("H4: Buy pattern detected at bar " + IntegerToString(i));
LogEvent("M30: Monitoring started for H4 zone #" + IntegerToString(h4Index));
LogEvent("M15: Order placed - Ticket: " + IntegerToString(ticket));
Visual Debugging:
- Use different colors for each zone level
- Add text labels showing zone info
- Display monitoring status on chart
Phase 6: File Structure & Organization
6.1 Main EA File Structure
//+------------------------------------------------------------------+
//| MultiTimeframeZoneEA_MT4.mq4 |
//| _Thivyam Trading |
//| Version: 1.0 |
//+------------------------------------------------------------------+
#property copyright "_Thivyam Trading Systems"
#property link "https://www.rahuldhangar.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| INPUT PARAMETERS |
//+------------------------------------------------------------------+
// [All inputs here]
//+------------------------------------------------------------------+
//| GLOBAL CONSTANTS |
//+------------------------------------------------------------------+
#define MAX_H4_ZONES 50
#define MAX_M30_ZONES 100
#define MAX_M15_ZONES 200
//+------------------------------------------------------------------+
//| GLOBAL VARIABLES - H4 ZONES |
//+------------------------------------------------------------------+
// [All H4 arrays]
//+------------------------------------------------------------------+
//| GLOBAL VARIABLES - M30 ZONES |
//+------------------------------------------------------------------+
// [All M30 arrays]
//+------------------------------------------------------------------+
//| GLOBAL VARIABLES - M15 ZONES |
//+------------------------------------------------------------------+
// [All M15 arrays]
//+------------------------------------------------------------------+
//| GLOBAL VARIABLES - STATE TRACKING |
//+------------------------------------------------------------------+
// [Bar times, etc.]
//+------------------------------------------------------------------+
//| INITIALIZATION |
//+------------------------------------------------------------------+
int OnInit() { }
//+------------------------------------------------------------------+
//| DEINITIALIZATION |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) { }
//+------------------------------------------------------------------+
//| MAIN TICK HANDLER |
//+------------------------------------------------------------------+
void OnTick() { }
//+------------------------------------------------------------------+
//| SECTION: BAR DETECTION |
//+------------------------------------------------------------------+
// [Bar detection functions]
//+------------------------------------------------------------------+
//| SECTION: PATTERN DETECTION |
//+------------------------------------------------------------------+
// [Pattern functions]
//+------------------------------------------------------------------+
//| SECTION: H4 ZONE MANAGEMENT |
//+------------------------------------------------------------------+
// [H4 functions]
//+------------------------------------------------------------------+
//| SECTION: M30 ZONE MANAGEMENT |
//+------------------------------------------------------------------+
// [M30 functions]
//+------------------------------------------------------------------+
//| SECTION: M15 ZONE MANAGEMENT |
//+------------------------------------------------------------------+
// [M15 functions]
//+------------------------------------------------------------------+
//| SECTION: TRADE EXECUTION |
//+------------------------------------------------------------------+
// [Order functions]
//+------------------------------------------------------------------+
//| SECTION: VISUAL DISPLAY |
//+------------------------------------------------------------------+
// [Drawing functions]
//+------------------------------------------------------------------+
//| SECTION: UTILITY FUNCTIONS |
//+------------------------------------------------------------------+
// [Helpers]
6.2 File Location
MQL4/
└── Experts/
└── _Thivyam/
└── MultiTimeframeZone/
└── MultiTimeframeZoneEA_MT4.mq4
Phase 7: Testing Checklist
7.1 Unit Testing (Per Phase)
- Phase 2: Bar detection works on all timeframes
- Phase 3: Patterns detected correctly vs indicator
- Phase 4: H4 zones create, reverse, delete properly
- Phase 5: M30 monitoring starts on H4 entry
- Phase 5: M30 zones created correctly
- Phase 6: M15 monitoring starts on M30 entry
- Phase 6: M15 zones created correctly
- Phase 6: Orders placed with correct parameters
- Phase 7: Orders monitored and managed
- Phase 8: All zones visible and accurate
7.2 Integration Testing
- Full H4 → M30 → M15 cascade works
- Multiple concurrent H4 zones handled
- Zone breaks cancel related orders
- Reversals don't affect existing M30/M15 zones
- Orders placed only once per M15 zone
7.3 Strategy Tester Scenarios
Test Case 1: Simple Buy Setup
- H4 buy pattern detected
- Price pulls back into H4 zone
- M30 buy pattern forms
- Price pulls back into M30 zone
- M15 buy pattern forms
- Order placed at M15 high
- Order fills and hits TP
Test Case 2: H4 Reversal
- H4 buy zone created
- H4 zone breaks (no M30 child yet)
- Zone reverses to sell
- New sell M30 zone detected
Test Case 3: Multiple Concurrent Zones
- Multiple H4 zones active
- Each monitoring independently
- M30 zones link to correct parents
- Orders placed correctly for each
Test Case 4: Zone Break Cascade
- Full H4 → M30 → M15 setup
- Order pending
- H4 zone breaks
- Verify order cancelled
7.4 Visual Verification
- H4 zones visible on H4, M30, M15 charts
- M30 zones visible on M30, M15 charts
- M15 zones visible on M15 chart
- Colors correct (buy=lime, sell=red)
- Styles correct (dashed → solid on reversal)
- Info panel shows accurate data
Phase 8: Risk Considerations
8.1 Known Limitations
-
Array Size Limits:
- Max 50 H4 zones (should be sufficient)
- Max 100 M30 zones
- Max 200 M15 zones
- Risk: If limits reached, new zones won't create
-
Order Execution:
- No slippage protection beyond input parameter
- No re-quote handling
- Market conditions may prevent order placement
-
No Position Sizing:
- Fixed lot size only
- No dynamic risk management
- User must calculate appropriate lot size
-
No Trade Management:
- No trailing stop
- No breakeven
- No partial close
- Only initial SL/TP
8.2 Safety Features
-
Magic Number Filtering:
- EA only manages its own orders
- Won't interfere with other EAs/manual trades
-
One Trade Per Zone:
- Flag prevents duplicate orders
- Prevents over-trading
-
Input Validation:
- Check all inputs in OnInit
- Prevent invalid parameter combinations
-
Error Logging:
- All failures logged to Journal
- Helps diagnose issues
Phase 9: Future Enhancements (Post-MVP)
9.1 Potential Improvements
-
Dynamic Position Sizing:
- Add risk % input
- Calculate lots based on SL distance
-
Advanced Trade Management:
- Trailing stop option
- Breakeven move option
- Partial close at 1R, 2R, etc.
-
Multi-Symbol Support:
- Run on multiple charts simultaneously
- Centralized order management
-
Session Filters:
- Only trade during specific hours
- Avoid news times
-
Pattern Filters:
- Minimum zone size
- Maximum zone age
- Trend confirmation
9.2 Code Improvements
-
Separate Include Files:
- Break into multiple .mqh files
- Easier maintenance
- Reusable components
-
Configuration File:
- External settings
- Easier testing/optimization
-
Performance Optimization:
- Reduce redundant calculations
- Cache symbol info
- Optimize loops
Phase 10: Success Criteria
10.1 Functional Requirements
- ✅ Detects all 4 pattern types on H4
- ✅ Creates H4 zones with correct lifecycle
- ✅ Monitors M30 when price enters H4 zone
- ✅ Creates M30 zones matching H4 direction
- ✅ Monitors M15 when price enters M30 zone
- ✅ Creates M15 zones matching M30 direction
- ✅ Places pending orders at M15 zone boundaries
- ✅ Sets correct SL and TP
- ✅ Manages order lifecycle
- ✅ Cancels orders when parent zones break
- ✅ Handles zone reversals correctly
10.2 Quality Requirements
- ✅ Compiles without errors or warnings
- ✅ No runtime errors in Strategy Tester
- ✅ All zones visible and accurate
- ✅ Orders placed with correct parameters
- ✅ Backtest results match expectations
- ✅ Code is readable and documented
- ✅ Debug logs are comprehensive
10.3 Performance Requirements
- ✅ OnTick executes in < 10ms average
- ✅ No memory leaks (stable over days)
- ✅ Handles 50+ concurrent zones
- ✅ Works on 4 and 5-digit brokers
Conclusion
This implementation plan provides a comprehensive roadmap for creating the Multi-Timeframe Zone EA for MT4. The phased approach ensures:
- Solid Foundation: Core infrastructure first
- Incremental Testing: Each phase validated before proceeding
- MT4 Compatibility: No MQL5 constructs used
- Strategy Compliance: Follows Strategy.md requirements
- Maintainability: Clear organization and documentation
Estimated Development Time: 20-30 hours
- Phase 1-2: 2 hours
- Phase 3-4: 4 hours
- Phase 5-6: 6 hours
- Phase 7-8: 4 hours
- Phase 9-10: 4 hours
- Testing: 4-10 hours
Next Steps:
- Review and approve this plan
- Begin Phase 1 implementation
- Test each phase thoroughly
- Proceed to next phase only when previous is validated
- Final integration testing
- Deploy to demo account for live validation
Document Status: Ready for Implementation
Approval Required: Yes
Risk Level: Medium (new codebase, complex logic)
Recommended Approach: Phased development with continuous testing
End of Implementation Plan