# Policy JSON Schema (DualEA) This document defines the expected structure of `policy.json` consumed by both `PaperEA_v2` and `LiveEA`. > **Implementation Note:** LiveEA has full per-slice policy parsing with scaling support. PaperEA_v2 has minimal policy parsing (checks `min_confidence` string presence only). ## Location - MT5 Common Files: typically `C:\Users\\AppData\Roaming\MetaQuotes\Terminal\Common\Files\DualEA\policy.json` - Reload signal: `Common\Files\DualEA\policy.reload` - **PaperEA_v2**: Hot-reload supported via timer polling + optional HTTP - **LiveEA**: Policy loaded on init only; restart required for updates ## Top-level Fields - `min_confidence` (number): gating threshold; trades require `p_win >= min_confidence` unless a fallback path is taken. - Note: Policy is considered "loaded" when there is at least one slice (`slices.length > 0`). `min_confidence` does not determine loaded state. - `slices` (array of objects): per-slice policy entries. ## Slice Fields Each slice object supports: - `strategy` (string): strategy identifier matching EA strategies. - `symbol` (string): normalized symbol, e.g. `"EURUSD"`. Special case: `"*"` to indicate strategy-only aggregate. - `timeframe` (integer): MT5 timeframe constant number; `-1` indicates aggregate across timeframes for a symbol. - `p_win` (number): probability/confidence used by gating. - `sl_scale` (number): stop-loss scale multiplier. - `tp_scale` (number): take-profit scale multiplier. - `trail_atr_mult` (number): trailing policy multiplier (ATR-based or treated as generic trailing scale by the EA). ## Aggregation & Lookup `PaperEA` uses the following lookup order (see `GetPolicyProb()`): 1. Exact match: `(strategy, symbol, timeframe)` 2. Strategy + symbol aggregate: `(strategy, symbol, timeframe=-1)` 3. Strategy-only aggregate: `(strategy, symbol="*", timeframe=-1)` If no slice is found, `GetPolicyProb()` returns `-1.0` and the EA may use the default policy fallback path if enabled. ## Example ```json { "min_confidence": 0.45, "slices": [ { "strategy": "BollAverages", "symbol": "EURUSD", "timeframe": 60, "p_win": 0.52, "sl_scale": 1.0, "tp_scale": 1.2, "trail_atr_mult": 1.0 }, { "strategy": "BollAverages", "symbol": "EURUSD", "timeframe": -1, "p_win": 0.50, "sl_scale": 1.0, "tp_scale": 1.0, "trail_atr_mult": 1.0 }, { "strategy": "BollAverages", "symbol": "*", "timeframe": -1, "p_win": 0.48, "sl_scale": 1.0, "tp_scale": 1.0, "trail_atr_mult": 1.0 } ] } ``` ## Notes - Scaling is applied only when a valid slice is found and policy gating is active. Fallback trades (no policy or slice miss) use neutral scaling. - Trainer/export scripts should ensure symbols/timeframes align with EA normalization and MT5 constants.