ch2010structure
A multi-currency, multi-timeframe EA that trades five currency pairs (USDCHF, GBPUSD, AUDUSD, USDJPY, EURGBP) using a class-based architecture. It executes day trades on new daily bars and intraday trades on new 30-minute bars, with built-in order validation and volume capping logic.
Open the interactive view (equity curve, symbol switch)Key facts
Backtest results (H1, about 1 year)
| Symbol | P&L | Annual | Max DD | Trades | Win rate | Sharpe | Recovery | Losing streak | Per trade | Status |
|---|---|---|---|---|---|---|---|---|---|---|
| EURUSD | 0.00% | 0.00% | 0.00% | 0 | — | — | — | — | — | Not convertible yet |
| GBPUSD | 0.00% | 0.00% | 0.00% | 0 | — | — | — | — | — | Not convertible yet |
| USDJPY | 0.00% | 0.00% | 0.00% | 0 | — | — | — | — | — | Not convertible yet |
| XAUUSD | 0.00% | 0.00% | 0.00% | 0 | — | — | — | — | — | Not convertible yet |
Why this EA never traded: no entry rule survived the conversion.
Converted from MQL5 to Python and run with the same rules for every EA. Positions use MT5 lot sizes (100,000 units per FX lot, 100 oz per gold lot) with 1:100 leverage, one order at a time, and a stop-out below 10% of the starting balance. Sharpe is computed from the equity curve. Results marked as unreliable are shown for completeness only.
Blow-up risk: Elevated
- Has no stop loss or trailing stop
- Can hold up to 12 positions at once
High: stopped out in our backtest, or martingale/grid sizing without a stop loss. Elevated: martingale or grid sizing with a stop loss, or several positions at once without a stop loss. What the label means and what we found →
Strategy analysis
This EA employs a multi-timeframe strategy, making day trading decisions on new daily bars and intraday trading decisions on new M30 bars. The strategy core is encapsulated in the CExp class, which determines entry conditions through getTP() for take-profit, getVol() for trade volume, getOrderType() for order type, and getDB() for a baseline value. Exit conditions are realized via the take-profit price returned by getTP(). Position sizing is managed by the DebugOrderSend function with strict controls: total directional exposure capped at 15 lots, single trade maximum of 5 lots, minimum of 0.1 lot, and pending orders limited to 12 total. Money management ensures volume compliance by checking SYMBOL_VOLUME_MIN and SYMBOL_VOLUME_MAX. However, no explicit stop-loss logic is visible in the code, which represents a significant risk. The IsNewBar function ensures trading logic executes only on the first tick of each new bar, preventing duplicate entries.
Strengths
- Multi-currency diversification reduces single-instrument risk
- Built-in debug order functions facilitate troubleshooting trade execution issues
- Comprehensive position sizing with total exposure and per-trade limits
- IsNewBar check ensures one execution per bar, preventing duplicate entries
- Object-oriented architecture with CExp class enables code reuse across instruments
Weaknesses
- No visible stop-loss logic, exposing positions to unlimited loss risk
- Core strategy methods (getTP/getVol/getOrderType/getDB) are not shown, making strategy validity unverifiable
- IsNewBar uses an int index for only two periods, poor scalability for additional timeframes
- Duplicated validation logic between DebugOrderCheck and DebugOrderSend violates DRY principle
- Hard-coded magic numbers (12, 15, 5, 0.1) lack parameterized configuration
Possible improvements
- Add explicit stop-loss logic so every trade has a defined maximum loss
- Extract hard-coded numeric constants into configurable input parameters
- Refactor IsNewBar to use a map or dynamic array supporting arbitrary timeframe counts
Risk assessment
Overall risk: High risk
- Absence of stop-loss exposes positions to potentially catastrophic losses
- Simultaneous multi-currency trading can concentrate correlated risk
- 15-lot total position cap can still produce significant losses in extreme markets
Evaluation scores
Parameters
| Parameter | Default | Description |
|---|---|---|
Symbol | USDCHF/GBPUSD/AUDUSD/USDJPY/EURGBP | Trading symbol |
MaxPendingOrders | 12 | Maximum pending orders |
MaxTotalVolume | 15 | Max total volume per direction in lots |
MaxSingleVolume | 5 | Max single trade lot size |
MinSingleVolume | 0.1 | Min single trade lot size |
Similar Multi-Timeframe EAs
Backtests are historical simulations and do not guarantee future results. Not financial advice.