feat(maea): migrate from MQL4 to MQL5 and simplify strategy

Migrate MAEA Expert Advisor from MetaTrader 4 to MetaTrader 5 platform with
significant strategy simplification and architectural improvements.

Key changes:
- Platform: MQL4 → MQL5
- Indicators: Reduced from 5 lines (3 EMAs + 2 borders) to 2 EMAs with zone fill
- Strategy: Removed pullback signals and dynamic lot sizing
- Lot sizing: Changed from dynamic (0.01/0.02) to fixed 0.01 lot
- Stop loss: Changed from Border Lines to opposite EMA (Buy: EMA Low, Sell: EMA High)
- Signal logic: Added opposite signal close for reversal protection
- New filter: Added minimum zone width filter (100 points)
- Documentation: Updated implementation plans and project summary
- New files: Added AGENTS.md, MAEA_Indicator.mq5, and opencode.jsonc

BREAKING CHANGE: Complete rewrite from MQL4 to MQL5 with simplified strategy.
Previous MAEA.mq4 and README.md deleted. New implementation requires MetaTrader 5.
This commit is contained in:
Kunthawat Greethong
2026-01-03 14:25:25 +07:00
parent cd0b2e35a2
commit db575179ae
8 changed files with 1019 additions and 1243 deletions

162
AGENTS.md Normal file
View File

@@ -0,0 +1,162 @@
# MAEA Development Guidelines
## Build and Test Commands
### Compilation
- Use MetaEditor (MT5 built-in editor) to compile the EA
- Press F7 or click Compile button in MetaEditor
- Check "Errors" tab in Toolbox for compilation issues
- All MQL5 files must compile with 0 errors before testing
### Testing
- Use MT5 Strategy Tester (Ctrl+T or View → Strategy Tester)
- Select "MAEA" from Expert Advisor dropdown
- Set testing parameters:
- Symbol: Desired currency pair
- Model: "Every tick" for accurate testing
- Period: H1 (recommended timeframe)
- Spread: Use current or specify fixed value
- Run single test: Click Start button in Strategy Tester
- Run optimization: Enable Genetic Algorithm or slow complete algorithm
- Optimization criteria: Balance, Profit Factor, Drawdown, or Sharpe Ratio
### Key Testing Scenarios
- Test EMA calculations accuracy by comparing with manual calculations
- Test breakthrough signals on historical data
- Test pullback detection on ranging markets
- Test all filters individually (enable one at a time)
- Test risk management (TP, SL, breakeven, trailing stop)
- Test max drawdown protection with aggressive parameters
## Code Style Guidelines
### File Naming and Organization
- EA file: `MAEA.mq5` (root directory)
- Use #include for external functions if needed
- Keep single file structure preferred for portability
### Naming Conventions
- **Input parameters**: PascalCase (e.g., `EMAPeriod`, `LotSizeNormal`, `TakeProfitUSD`)
- **Global variables**: g_PascalCase (e.g., `g_EMAHighBuffer`, `g_PullbackBuyDetected`)
- **Local variables**: camelCase (e.g., `currentClose`, `signalDetected`)
- **Functions**: PascalCase (e.g., `CalculateEMA()`, `CheckFilters()`, `OpenOrder()`)
- **Constants**: UPPER_CASE with underscore prefix (e.g., `_MAX_ORDERS`, `_DEFAULT_TP`)
### Imports and Includes
- MQL5 standard headers:
```mql5
#include <Trade\Trade.mqh>
#include <Indicators\Indicators.mqh>
#include <Arrays\ArrayDouble.mqh>
```
(Required for MT5 position management and indicator handling)
- Use MT5 standard functions and objects:
- CTrade class for position operations
- Indicator handles via iMA()
- Position operations: PositionSelect(), PositionGetSymbol()
- Use <Trade\Trade.mqh> as it's essential for MT5 trading operations
### Code Formatting
- Indentation: 4 spaces (no tabs)
- Braces: K&R style (opening brace on same line)
- Line length: Max 120 characters
- Blank line between functions
- Comment section headers like `// === INDICATOR CALCULATIONS ===`
### Variable Types
- Use explicit types, not auto
- Integer counts: `int`
- Prices and averages: `double`
- Boolean flags: `bool`
- Time values: `datetime`
- Array buffers: `double[]`
- String values: `string`
### Error Handling
- Always check return values for:
- CTrade.OrderOpen() - check return value
- CTrade.PositionModify() - check return value
- CTrade.PositionClose() - check return value
- Indicator handle creation - check if handle != INVALID_HANDLE
- ObjectCreate() - check return value
- Use GetLastError() after failed operations
- Log errors using Print() or Alert() for critical issues
- Example:
```mql5
CTrade trade;
trade.SetExpertMagicNumber(MagicNumber);
if(!trade.Buy(lotSize, Symbol(), price, sl, tp)) {
int err = GetLastError();
Print("OrderOpen failed. Error: ", err, " - ", ErrorDescription(err));
return;
}
```
### Input Parameters Structure
- Group related parameters together
- Use clear, descriptive comments
- Example format:
```mql5
// === EMA SETTINGS ===
input int EMAPeriod = 30; // EMA period for all indicator lines
// === RISK MANAGEMENT ===
input double TakeProfitUSD = 5.0; // Take profit target in USD
input int BreakevenPoints = 100; // Points to trigger breakeven
// === FILTERS ===
input bool UseMTFFilter = true; // Enable MTF filter
input int MaxSpread = 30; // Maximum spread in points
```
### Function Design
- Keep functions focused and under 40 lines if possible
- Use descriptive parameter names
- Return meaningful values (bool for success/failure when applicable)
- Document complex logic with inline comments
- Separate calculation logic from trading logic
### Timezone Handling
- All time-based logic uses Thailand timezone (UTC+7)
- Use TimeGMT() + 25200 seconds for Thailand time
- Convert server time to Thailand time for news filter checks
- Document timezone conversions explicitly in code
### Testing Best Practices
- Use MT5 Strategy Tester with "Every tick" model
- Test on multiple currency pairs (EURUSD, GBPUSD, XAUUSD)
- Test on different timeframes (M15, H1, H4)
- Verify indicators by visual inspection in tester
- Check both profitable and losing scenarios
- Validate filter logic by comparing tester results with expected behavior
- Paper trade on demo account before live trading
### Safety Constraints
- Never change code to bypass risk management
- Test all parameter changes in Strategy Tester first
- Ensure only one position can be open at a time (MT5 uses positions, not orders)
- Drawdown protection must be always active
- Stop Loss must always be set when opening positions
- Verify position count using PositionsTotal() and filter by MagicNumber
### Code Comments
- Comment complex calculations (especially EMA and Border Line formulas)
- Document edge cases and special conditions
- Include formula explanations: `// Border Line = EMA High + (EMA Medium - EMA Low)`
- No excessive comments for obvious code
### Trading Logic Organization
- Typical entry points: OnTick() (per tick) or OnNewBar() (on new candle)
- Structure: Indicators → Filters → Signals → Orders → Risk Management
- Use state variables to track:
- Pullback detection (buy and sell separately)
- Current drawdown
- Last bar time for new bar detection
- Order tracking for management
### Git Practices
- Commit after implementing each phase from the implementation plan
- Commit message format: "Phase X: Title - Brief description"
- Verify compilation before committing
- Test major features before committing
- Pull latest changes before starting new work