mql5/Experts/Advisors/DualEA/docs/Operations.md

212 satır
8,8 KiB
Markdown
Ham Kalıcı Bağlantı Normal Görünüm Geçmiş

2025-08-13 19:40:04 -04:00
# Operations Guide (DualEA)
Practical procedures for managing DualEA runtime, knowledge base, policy reloads, and interpreting logs. All paths are under MT5 Common Files.
- Typical path: `C:\Users\<you>\AppData\Roaming\MetaQuotes\Terminal\Common\Files\DualEA\`
- Alternate: `C:\ProgramData\MetaQuotes\Terminal\Common\Files\DualEA\`
## Controls & Inputs (PaperEA)
- `NoConstraintsMode` — disable all gating and caps for maximum data collection (bypasses trading hours, selector gating, insights gating, exploration caps, and open-position limit). Default: `true`.
- `UsePolicyGating` — enable/disable ML policy gating
- `DefaultPolicyFallback` — allow neutral trading when slice/policy missing
- `FallbackDemoOnly` — restrict fallback to demo only (default true)
- `FallbackWhenNoPolicy` — allow fallback when no policy file is loaded (default true)
- `ExploreMaxPerSlice` — weekly cap (default 3; `0` = unlimited)
- `ExploreMaxPerSlicePerDay` — daily cap (default 2; `0` = unlimited)
- `MaxOpenPositions` — global open-position limit (default `0`; `0` = unlimited)
- `Verbosity` — controls `ShouldLog(level)` (INFO/DEBUG)
## Knowledge Base Files
- Trades: `knowledge_base.csv` (see `docs/KB-Schemas.md`)
- Events: `knowledge_base_events.csv`
- Features: `features.csv` (long format, includes `r_multiple` rows)
- Insights: `insights.json` (built via script or builder)
- Exploration counters: `explore_counts.csv`, `explore_counts_day.csv`
## System Flow
```mermaid
flowchart LR
2025-08-14 00:52:02 -04:00
%% PaperEA orchestration
2025-08-13 19:40:04 -04:00
subgraph Paper
PEA[PaperEA]
2025-08-14 00:55:15 -04:00
STR[Strategies - IStrategy]
SEL[Selector - insights + recency]
TM[TradeManager - SL/TP/Trailing]
2025-08-14 00:52:02 -04:00
TEL[Telemetry]
2025-08-13 19:40:04 -04:00
end
2025-08-14 00:52:02 -04:00
%% Common Files runtime artifacts
2025-08-14 00:55:15 -04:00
subgraph KB["Knowledge Base - Common Files DualEA"]
2025-08-13 19:40:04 -04:00
FEAT[features.csv]
TRD[knowledge_base.csv]
EVT[knowledge_base_events.csv]
2025-08-14 00:55:15 -04:00
TLM[telemetry logs]
2025-08-13 19:40:04 -04:00
INS[insights.json]
POL[policy.json]
2025-08-14 00:52:02 -04:00
EXPW[explore_counts.csv]
EXPD[explore_counts_day.csv]
RLDI[insights.reload]
RLDP[policy.reload]
VREP[insights_validation.txt]
2025-08-13 19:40:04 -04:00
end
2025-08-14 00:52:02 -04:00
%% Insights builder (can be called by EA or script)
subgraph Builder[Insights Builder]
2025-08-14 00:55:15 -04:00
IB[CInsightsBuilder.Build]
2025-08-13 19:40:04 -04:00
end
2025-08-14 00:52:02 -04:00
%% Scripts and CI helpers
subgraph Scripts_CI[Scripts / CI]
IRB[Scripts/InsightsRebuild.mq5]
VAL[Scripts/ValidateInsights.mq5]
KBC[kb_check.bat]
end
%% ML trainer
subgraph ML[Trainer]
TRN[train.py / policy_export.py]
end
%% LiveEA consumer
2025-08-13 19:40:04 -04:00
subgraph Live
LEA[LiveEA]
end
2025-08-14 00:52:02 -04:00
%% Paper data flows
PEA --> STR
STR -->|ExportFeatures| FEAT
2025-08-13 19:40:04 -04:00
PEA --> TM
PEA -->|logs| TRD
PEA -->|events| EVT
2025-08-14 00:52:02 -04:00
PEA -->|telemetry| TLM
2025-08-14 00:55:15 -04:00
PEA <-->|caps read/write| EXPW
PEA <-->|caps read/write| EXPD
2025-08-14 00:52:02 -04:00
%% Insights lifecycle
FEAT --> IB
TRD --> IB
RLDI -->|On-demand rebuild| IB
PEA -. OnInit/OnTimer stale? .-> IB
IB -->|write| INS
INS -->|load| SEL
2025-08-14 00:55:15 -04:00
SEL -->|gate decisions - bypassed by NoConstraintsMode| PEA
2025-08-14 00:52:02 -04:00
%% Policy lifecycle
2025-08-13 19:40:04 -04:00
FEAT --> TRN
2025-08-14 00:52:02 -04:00
TRD --> TRN
TRN -->|write| POL
RLDP -->|reload trigger| PEA
2025-08-14 00:55:15 -04:00
POL -->|load and scale| PEA
2025-08-14 00:52:02 -04:00
%% Scripts / CI
IRB -->|run builder| IB
VAL -->|validate| VREP
KBC -->|build & validate| IRB
KBC -->|invoke| VAL
KBC -->|report| VREP
2025-08-13 19:40:04 -04:00
2025-08-14 00:52:02 -04:00
%% LiveEA consumption and feedback
INS --> LEA
2025-08-13 19:40:04 -04:00
POL --> LEA
LEA -->|results| TRD
LEA -->|events| EVT
2025-08-14 00:52:02 -04:00
LEA -->|telemetry| TLM
2025-08-13 19:40:04 -04:00
```
## Policy Lifecycle
- Location: `DualEA/policy.json`
- Reload trigger: touch `DualEA/policy.reload`
- The EA checks this in both `OnTimer()` and `OnTick()` (`CheckPolicyReload()`); when present, it reloads `policy.json`, logs `Policy reload signal detected: reloaded|failed`, and on success logs `Policy gating: min_conf=..., slices=N`.
- Loaded state: "loaded" iff one or more slices exist (slices > 0)
2026-02-05 01:22:42 -05:00
- Tracked via `ArraySize(g_pol_strat) > 0` in `PaperEA/PaperEA_v2.mq5`
2025-08-13 19:40:04 -04:00
## Fallback Behavior
- When `UsePolicyGating=true`:
- `fallback_no_policy`: if no policy is loaded and `FallbackWhenNoPolicy=true`
- `fallback_policy_miss`: if policy loaded but the exact slice is missing
- Both paths:
- Demo-only unless `FallbackDemoOnly=false`
- Bypass insights thresholds and exploration caps
- Neutral scaling (no SL/TP/trailing multipliers applied)
- Journal examples:
- `FALLBACK: no policy loaded -> neutral scaling used for <strat> on <symbol>/<tf> demo=<true|false>`
- `FALLBACK: policy slice missing -> neutral scaling used for <strat> on <symbol>/<tf> demo=<true|false>`
## Exploration Mode Management
- Purpose: allow limited trades to seed data for unseen slices.
- Counters:
- Weekly file: `explore_counts.csv` (key,week_monday_yyyymmdd,count)
- Daily file: `explore_counts_day.csv` (key,day_yyyymmdd,count)
- How counts advance:
- On successful explore execution, EA increments and persists counters (`SaveExploreCounts*()`)
- Caps and gating logs:
- Allow: `GATE: explore allow <strat> on <symbol>/<tf> reason=<...> (day=d/D, week=w/W) slice_exists=<true|false>`
- Block: `GATE: blocked <strat> on <symbol>/<tf> reason=explore_cap_day|explore_cap_week ...`
- Reset counters:
- Delete `explore_counts.csv` and/or `explore_counts_day.csv` from the Common Files folder
- Notes:
- Caps support `0 = unlimited` for both daily and weekly limits.
- When `NoConstraintsMode=true`, insights gating and exploration caps are bypassed entirely.
## NoConstraintsMode (Data Collection Mode)
- Purpose: run PaperEA without constraints to maximize data collection for ML training.
- Behavior when `true`:
- Bypasses: trading hours gate, selector gating, insights gating, exploration caps, and `MaxOpenPositions` guard.
- Exploration caps accept `0 = unlimited`, but are ignored in this mode.
- Startup log (INFO): `Mode: NoConstraintsMode=true -> bypass trading hours, selector gating, insights gating, exploration caps (0=unlimited), and MaxOpenPositions`.
- Recommended usage: PaperEA on demo/test for aggressive data harvesting. Not recommended for LiveEA.
## Rebuilding Insights
- Without re-running trades:
- Run script `Scripts/InsightsRebuild.mq5` from MT5 Navigator
- Inputs: `InFeaturesPath = "DualEA\\features.csv"`
- Output: `DualEA/insights.json`
- Logs: `InsightsRebuild: starting rebuild from features.csv ...`
## Troubleshooting & Common Messages
- Policy reload cannot open: `Policy gating: cannot open DualEA\policy.json (Common). Err=<code>`
- Policy reload detected: `Policy reload signal detected: reloaded|failed`
- Reload cleanup warning (non-fatal): `Policy reload: cannot delete signal file DualEA\policy.reload (err=<code>)`
- Cache loads:
- `Insights gating cache load: ok|fail`
- `Policy gating cache load: ok|fail`
- `Explore counters loaded: week=ok|fail day=ok|fail`
- Execution blocks:
- `EXEC: blocked <strat> on <symbol>/<tf> due to MaxOpenPositions=<N>` (only when `MaxOpenPositions > 0`; set to `0` to disable. Default: `0`)
- Scan/gate summaries:
- `[SCAN] <symbol> tf=<tf> time=<ts> strats=<N> spread_pts=<x>`
- `[STRAT] <name> p_win=<prob>`
- `[GATE] <summary>`
## Maintenance Procedures
- Reset exploration only:
- Delete `explore_counts.csv` and/or `explore_counts_day.csv`
- Full KB reset (dangerous, wipes history):
- Delete `knowledge_base.csv`, `knowledge_base_events.csv`, `features.csv`, `insights.json`
- Force policy refresh from trainer:
- Run `ML/run_train_and_export.bat` (writes `policy.json`, touches `policy.reload`)
## Safety Notes
- Fallback trades are neutral and do not consume exploration quotas
- File I/O uses `FILE_COMMON`; ensure your MT5 has write permissions to the Common Files directory
- Some readers use `FILE_ANSI` and plain text parsing — avoid altering CSV delimiters/headers
2025-09-10 13:27:03 -04:00
## Artifact Rotation & Compression
- All major artifacts (features.csv, insights.json, scaler.pkl, tf_model.keras, features.json) are automatically rotated if they exceed operational size limits.
- **features.csv** (MQL5): If file exceeds 100MB, it is renamed with a timestamped `.bak` suffix before new data is written. No compression (MQL5 limitation).
- **ML artifacts** (Python):
- `tf_model.keras`: Rotated if above 100MB (no compression).
- `scaler.pkl`, `features.json`: Rotated and compressed with gzip if above 20MB.
- Old files are preserved with a timestamped `.bak` (and `.gz` for compressed).
- Rotation occurs before each new write session.
## Trade Execution Retry Policy
- All trade executions (market, stop, limit) are guarded with a retry loop for transient broker errors (requote, busy, timeout, etc.).
- Up to 3 attempts are made, with a short sleep between retries.
- Each failure and retry is logged with error code, attempt number, and time.
- Non-retryable errors abort further attempts immediately.
## Insights Rebuild Timeout
- The InsightsRebuild script now accepts a `TimeoutMs` input (default: 60,000 ms).
- The feature scan is chunked and logs progress every 1000 rows, with a brief sleep to avoid watchdog timeouts.
- If the timeout is exceeded, the rebuild aborts and logs the row/time boundary.