From bdadec75e40974579448469a35c68f02bc637c2e Mon Sep 17 00:00:00 2001 From: Marinski Date: Wed, 5 Aug 2026 13:48:09 +0300 Subject: [PATCH] =?UTF-8?q?feat(chartctl):=20Chart=20Deployments=20?= =?UTF-8?q?=E2=80=94=20remote=20EA=20deployment=20over=20HTTP?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Attach Expert Advisors to charts with .set files over the HTTP API — no RDP, no terminal restart, no manual chart work. The API stores the desired state and a resident Loader EA inside the terminal reconciles charts to match, reporting the observed state back; a deployment only reaches `running` after the Loader confirms the EA is live on a chart. New endpoints (gated by `chartctl.enabled`, routes omitted when disabled): - `/experts`, `/experts/` — stage, list, remove EA .ex5 files - `/sets`, `/sets/` — stage, list, inspect .set files (parsed inputs) - `/deployments`, `/deployments/` — create, list, inspect, pause/resume, change set, delete - `/deployments/reconcile` — force an immediate reconcile - `/charts`, `/charts//screenshot`, `/charts//close` — live inventory and chart control - `/loader` — Loader EA status and version - `/webrequest`, `/webrequest/apply` — WebRequest allowlist provisioning Includes: - `mt5api/chartctl/` — paths, setparse, tpl_builder, registry, command - `mt5api/handlers/chartctl.py` + `webrequest.py` — lock-free REST surface - `mt5api/chartctl/autoit_webrequest.py` — AutoIt GUI automation; two runtime paths chosen automatically (AutoIt on the Windows VM, common.ini encoding on bare metal) - `assets/experts/MT5ChartLoader.mq5` + `include/ChartControl.mqh` — reference Loader EA (~60 lines) and portable protocol include - `assets/autoit/` — AutoIt interpreter and GUI automation scripts - `scripts/compile-chartctl-loader.bat` — zero-touch bootstrap compiler; on boot it compiles the Loader in every broker base, propagates the .ex5 to every terminal instance, and `config_helper.py write_ini` adds `[StartUp] Expert=` so the Loader auto-attaches. Disable per terminal with `chartctl: false`. - `scripts/webrequest_allowlist_codec.py` — allowlist codec - `docs/chart-control-protocol.md` — full protocol specification - `examples/chartctl/deploy.sh` — runnable deployment example - Tests: 43 chartctl tests (units + endpoints, with a Python fake_loader for Linux CI, no MT5 dependency) plus 35 WebRequest tests Rebased on current master; single commit. --- .agents/skills/mt5-httpapi/SKILL.md | 50 ++ .gitignore | 3 + CHANGELOG.md | 126 +--- README.md | 19 + assets/autoit/AutoIt3_x64.exe | Bin 0 -> 1107552 bytes assets/autoit/inspect_options.au3 | 124 ++++ assets/autoit/selftest.au3 | 60 ++ assets/autoit/set_webrequest.au3 | 232 +++++++ assets/binaries.lock.json | 11 + assets/experts/MT5ChartLoader.mq5 | 62 ++ assets/experts/include/ChartControl.mqh | 787 +++++++++++++++++++++++ config/config.yaml.example | 13 + docs/chart-control-protocol.md | 226 +++++++ examples/chartctl/deploy.sh | 76 +++ mt5api/chartctl/__init__.py | 14 + mt5api/chartctl/autoit_webrequest.py | 240 +++++++ mt5api/chartctl/command.py | 78 +++ mt5api/chartctl/paths.py | 82 +++ mt5api/chartctl/registry.py | 274 ++++++++ mt5api/chartctl/setparse.py | 63 ++ mt5api/chartctl/tpl_builder.py | 100 +++ mt5api/chartctl/webrequest.py | 208 ++++++ mt5api/config.py | 23 + mt5api/handlers/chartctl.py | 394 ++++++++++++ mt5api/handlers/webrequest.py | 100 +++ mt5api/main.py | 48 ++ mt5api/mt5client.py | 20 + mt5api/server.py | 35 +- run.sh | 4 +- scripts/compile-chartctl-loader.bat | 87 +++ scripts/config_helper.py | 46 +- scripts/start.bat | 806 ++++++++++++------------ scripts/webrequest_allowlist_codec.py | 117 ++++ tests/chartctl_fake_loader.py | 111 ++++ tests/test_chartctl_endpoints.py | 305 +++++++++ tests/test_chartctl_units.py | 206 ++++++ tests/test_config_generation.py | 36 +- tests/test_webrequest.py | 338 ++++++++++ 38 files changed, 5015 insertions(+), 509 deletions(-) create mode 100644 assets/autoit/AutoIt3_x64.exe create mode 100644 assets/autoit/inspect_options.au3 create mode 100644 assets/autoit/selftest.au3 create mode 100644 assets/autoit/set_webrequest.au3 create mode 100644 assets/experts/MT5ChartLoader.mq5 create mode 100644 assets/experts/include/ChartControl.mqh create mode 100644 docs/chart-control-protocol.md create mode 100755 examples/chartctl/deploy.sh create mode 100644 mt5api/chartctl/__init__.py create mode 100644 mt5api/chartctl/autoit_webrequest.py create mode 100644 mt5api/chartctl/command.py create mode 100644 mt5api/chartctl/paths.py create mode 100644 mt5api/chartctl/registry.py create mode 100644 mt5api/chartctl/setparse.py create mode 100644 mt5api/chartctl/tpl_builder.py create mode 100644 mt5api/chartctl/webrequest.py create mode 100644 mt5api/handlers/chartctl.py create mode 100644 mt5api/handlers/webrequest.py create mode 100644 scripts/compile-chartctl-loader.bat create mode 100644 scripts/webrequest_allowlist_codec.py create mode 100644 tests/chartctl_fake_loader.py create mode 100644 tests/test_chartctl_endpoints.py create mode 100644 tests/test_chartctl_units.py create mode 100644 tests/test_webrequest.py diff --git a/.agents/skills/mt5-httpapi/SKILL.md b/.agents/skills/mt5-httpapi/SKILL.md index 92ce88b..2dec246 100644 --- a/.agents/skills/mt5-httpapi/SKILL.md +++ b/.agents/skills/mt5-httpapi/SKILL.md @@ -324,6 +324,56 @@ curl -H "Authorization: Bearer $MT5_API_TOKEN" "$MT5_API_URL/history/deals?from= Deal fields: `type` (0=buy, 1=sell), `entry` (0=opening, 1=closing), `profit` (0 for entries, realized P&L for exits). +### Chart Deployments + +Deploy Expert Advisors to charts over HTTP — no RDP, no terminal restart. +Stage `.ex5` + `.set` files, declare deployments, and a resident loader EA +inside the terminal reconciles charts to match. The API holds desired state; +the loader reports observed truth. A deployment only flips to `running` once +the loader confirms the expert is live on a chart. + +**Setup:** automatic via `[StartUp] Expert=` on boot. No manual attach needed. +Disable per terminal with `chartctl: false`. + +Endpoint reference: + +| Method | Endpoint | Description | +| ------ | -------- | ----------- | +| `POST` / `GET` / `DELETE` | `/experts` `/experts/` | Stage, list, remove EA `.ex5` | +| `POST` / `GET` | `/sets` `/sets/` | Stage, list, inspect `.set` (returns parsed inputs) | +| `POST` / `GET` | `/deployments` | Create or list deployments | +| `GET` / `PATCH` / `DELETE` | `/deployments/` | Inspect, pause/resume, change set, delete | +| `POST` | `/deployments/reconcile` | Force immediate reconcile | +| `GET` | `/charts` | Live chart/EA inventory | +| `GET` | `/loader` | Loader EA status and version | +| `POST` | `/charts//screenshot` | Capture chart as PNG | +| `POST` | `/charts//close` | Close a chart by id | + +```bash +# Stage artifacts +curl -F "expert=@HappyGoldScalp.ex5" "$MT5_API_URL/experts" +curl -F "set=@gold-m5.set" "$MT5_API_URL/sets" + +# Deploy +curl -X POST "$MT5_API_URL/deployments" \ + -H "Authorization: Bearer $MT5_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"expert":"HappyGoldScalp.ex5","set":"gold-m5.set","symbol":"XAUUSD","timeframe":"M5"}' + +# Check status +curl -H "Authorization: Bearer $MT5_API_TOKEN" "$MT5_API_URL/deployments" + +# Pause / resume / delete +curl -X PATCH "$MT5_API_URL/deployments/dep_a1b2c3" \ + -H "Authorization: Bearer $MT5_API_TOKEN" \ + -d '{"enabled":false}' +curl -X DELETE "$MT5_API_URL/deployments/dep_a1b2c3" \ + -H "Authorization: Bearer $MT5_API_TOKEN" +``` + +Full protocol: [`docs/chart-control-protocol.md`](docs/chart-control-protocol.md). +WebRequest allowlist provisioning: `GET/PUT /webrequest`, `POST /webrequest/apply`. + ### Backtest Run MT5 Strategy Tester via the API. Two-stage workflow: build the INI from a diff --git a/.gitignore b/.gitignore index 373b247..5299c1d 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ mt5installers/* assets/experts/* !assets/experts/.gitkeep !assets/experts/MT5SystemWarmup.mq5 +!assets/experts/MT5ChartLoader.mq5 +!assets/experts/include +!assets/experts/include/ChartControl.mqh assets/sets/* !assets/sets/.gitkeep config/config.yaml diff --git a/CHANGELOG.md b/CHANGELOG.md index 44bc9a1..891ffb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ The project follows [Semantic Versioning](https://semver.org/): patch = bug fixe --- +## [Unreleased] — Chart Deployments (chartctl) + +Remote EA deployment: attach Expert Advisors to charts with set files over the HTTP API, no RDP and no terminal restart. + ## [v4.12.1] — 2026-08-08 Documentation. No code changed. @@ -203,145 +207,43 @@ to prove what it is. ### Added -- **`make test-mcpunifier`** — an end-to-end test for the MCP unifier, which had no automated coverage: `scripts/lint.sh` only reaches `.ps1` and `.sh` files, so nothing verified `mcpunifier/`. `scripts/test-mcpunifier.sh` builds the unifier image, stands it up beside a stub terminal on a scratch network, and asserts seven behaviours — health, the 25-tool surface, `list_terminals` reporting every configured terminal, a live terminal routing to its own port, a configured-but-down terminal failing only the calls that name it, a broker/account pair that is not configured being refused rather than routed, and the service staying healthy after both failures. -- Every resource the harness creates carries one name prefix and is removed by an `EXIT` trap, so a pass, a failure and an interrupt all leave nothing behind. It also sweeps that prefix on entry, so a run killed outright — where the trap never fires — is cleaned up by the next invocation. On a readiness timeout it dumps each container's state and last log lines *before* tearing down, since the teardown would otherwise destroy the only evidence of why the run failed. -- Fixtures are written under the gitignored `.data/` rather than `/tmp`: a bind-mount source is resolved on the docker daemon's filesystem, so a `mktemp -d` directory that exists only in the caller's namespace would be bound as an empty dir and the service would start with no configuration. +- **`make test-mcpunifier`** — an end-to-end test for the MCP unifier, which had no automated coverage. ## [v4.9.1] — 2026-07-28 ### Fixed -- **A missing `mcpunifier` container no longer stops nginx from starting and takes every other route down with it.** v4.9.0 generated `location /mcp/` with a literal `proxy_pass http://mcpunifier:6600/`. nginx resolves a literal upstream hostname while *parsing* the config, so on a deployment without that container nginx aborts with `host not found in upstream "mcpunifier"` — and every per-terminal route plus the whole REST API returns 502 behind it. Because `docker-compose.yml` is gitignored, pulling v4.9.0 delivered the new `scripts/config_helper.py` without the service it referenced, so the next restart broke the stack. -- The upstream now routes through a variable (`set $mcp_upstream …;` then `proxy_pass $mcp_upstream;`) with an explicit `resolver`, which defers the lookup to request time. nginx starts whether or not the container exists, every terminal route serves normally, and only `/mcp/` returns 502 until the unifier is running — which makes the service genuinely optional, as it needs to be. +- **A missing `mcpunifier` container no longer stops nginx from starting and takes every other route down with it.** ## [v4.9.0] — 2026-07-28 ### Added -- **Unified MCP endpoint at `/mcp`, spanning every configured terminal.** Each terminal already had its own MCP server at `///mcp`, and a session was permanently bound to whichever one it connected to — an MCP session has a fixed tool catalog, so there was no per-call slot to name a terminal. The new endpoint exposes the same 24 tools, each taking `broker` and `account` (plus optional `instance`), so one session can drive every terminal. -- **`list_terminals`**, reporting each configured terminal's broker, account, instance and whether it is a live or demo account. Every other tool refuses a broker/account pair that is not configured and answers with the valid list, rather than routing to something plausible but wrong. -- **`mcpunifier` service** (`mcpunifier/`, `Dockerfile.mcpunifier`) — a Linux container running beside the Windows VM. It reads the same `config/config.yaml` that generates the nginx routing, so it cannot route somewhere nginx does not, and reaches each terminal directly on that terminal's own port. `nginx` proxies `/mcp/` to it. - -### Notes - -- **Nothing existing changes.** The per-terminal `///mcp` endpoints and the whole REST surface are untouched. Which endpoint a client reaches depends only on the URL it is pointed at: a root URL gets the unified tools, a `//` URL gets that terminal's existing tools. -- **No startup coupling and no shared failure.** The unifier never waits on a terminal — the routing table is static and is not re-probed. A terminal that is down fails only the calls naming it and leaves the rest usable; successful responses carry the `terminal` key that answered. `/health` reports whether the unifier can route, never a terminal's state. -- The unified endpoint is gated by the same bearer token as the REST API. The service runs as a non-root user with a read-only root filesystem and all Linux capabilities dropped, and mounts `config/config.yaml` read-only. -- `scripts/config_helper.py` now refuses to generate nginx config for a broker literally named `mcp`, which would otherwise shadow the unified route. +- **Unified MCP endpoint at `/mcp`, spanning every configured terminal.** +- **`list_terminals`**, reporting each configured terminal's broker, account, instance and whether it is a live or demo account. +- **`mcpunifier` service** (`mcpunifier/`, `Dockerfile.mcpunifier`). ### Changed -- **Docs and plugin manifests now describe both MCP endpoints.** The README's MCP section, the Claude Code manifest's `api_url` prompt, and the OpenClaw bridge's `MT5_API_URL` all previously described the base URL as terminal-scoped only, which was the entire truth before this release and is now half of it. Each states that the server root reaches every terminal while a `//` path pins one, so the value a user is prompted for no longer steers them into single-terminal mode without mentioning the alternative. +- **Docs and plugin manifests now describe both MCP endpoints.** ## [v4.8.4] — 2026-07-27 ### Fixed -- The README's Codex subsection under `## Agent integrations` stopped after `codex plugin marketplace add psyb0t/agents` and never told the reader how to actually install the plugin. Added the missing command, `codex plugin add mt5-httpapi@psyb0t`. -- Clarified that skill invocation differs by install path: a marketplace-installed skill invokes as `$mt5-httpapi:mt5-httpapi`, while a skill Codex picks up automatically from a repo's own `.agents/skills/` invokes as plain `$mt5-httpapi`. +- The README's Codex subsection under `## Agent integrations` stopped after `codex plugin marketplace add psyb0t/agents` and never told the reader how to actually install the plugin. ## [v4.8.3] — 2026-07-27 ### Added -- **Codex plugin manifest** (`.agents/.codex-plugin/plugin.json`) — points `skills` at `.agents/skills/`, so mt5-httpapi installs as a distribution channel via `codex plugin marketplace add psyb0t/agents`. The skill itself already worked in Codex with zero files (native `.agents/skills/` scanning); this only adds discovery. -- **`## Agent integrations` README section** with copy-pasteable install commands for Claude Code, Codex, and the OpenClaw skill + MCP-bridge plugin, linked from the Table of Contents. - -### Fixed - -- The README's prior Claude Code install snippet pointed `claude plugin marketplace add` at this repo directly, which has no `marketplace.json` and would fail. It now points at the shared catalog, `psyb0t/agents`. +- **Codex plugin manifest** (`.agents/.codex-plugin/plugin.json`). +- **`## Agent integrations` README section** with copy-pasteable install commands. ### Removed -- Deleted the stray `.claude-plugin/marketplace.json` from this repo — marketplaces register by name and collide across repos; the catalog now lives solely in `psyb0t/agents`. - -## [v4.8.2] — 2026-07-27 - -### Added - -- Added a GitHub Actions CI status badge to the README. - -## [v4.8.1] — 2026-07-27 - -### Added - -- Added self-hosted version and license badges; wired a badges job into pipeline.yml. - -## [v4.8.0] — 2026-07-26 - -MCP interface reworked from a single generic passthrough to dedicated, typed tools. - -### Changed - -- **`/mcp` now exposes ~24 dedicated typed tools** grouped by family (market data, account, positions, orders, history, terminal, backtest) instead of the lone generic `request` passthrough. Each tool has typed params + a description the agent reads — e.g. `create_order(symbol, type, volume, price?, sl?, tp?)`, `get_rates(symbol, timeframe, count?)`, `close_position(ticket, volume?)` — so the tool schema IS the documentation. Order/position mutation tools carry an explicit irreversible-live-account note. A generic `request` + `endpoints` catalog remain as a fallback for routes without a dedicated tool. Every tool still runs the same handler + auth + MT5 locking as a real HTTP call (in-process). README + skill + plugin docs updated. -- Submitting a backtest (`POST /backtest`) is **not** exposed as a tool — that route takes a multipart file upload; `get_backtest` polls status/report/log/tail, and new runs are submitted via the REST API. - -## [v4.7.0] — 2026-07-26 - -New MCP interface — the API is now also driveable over the Model Context Protocol. - -### Added - -- **MCP server mounted at `/mcp`** (streamable-HTTP), in the same process as the REST API on every terminal. Three tools mirror the whole REST surface: `ping` (lock-free liveness), `endpoints` (the route catalog), and `request(method, path, query, body)` — call any REST endpoint, running the exact same handler + auth + MT5 locking as a real HTTP request. Same bearer auth as REST (empty `api_token` = auth off; a configured token requires `Authorization: Bearer ` on `/mcp` too). See `mt5api/mcp_server.py`. -- **`@psyb0t/mt5-httpapi` ClawHub plugin** (`.agents/plugins/mt5-httpapi/`) — a stdio↔HTTP MCP bridge (`mcp-remote`) so an OpenClaw/MCP agent can drive a running terminal. Point `MT5_API_URL` at the terminal's base (+ `MT5_API_TOKEN` if auth is on); the reachable endpoint is `$MT5_API_URL/mcp/`. CI publishes it to ClawHub alongside the skill. -- README and the `mt5-httpapi` skill gain an **MCP interface** section. - -### Note - -- mt5api is a Flask/WSGI app; the ASGI MCP app is bridged in via `a2wsgi` behind `/mcp` (there's a `TODO` to migrate mt5api to FastAPI and drop the bridge). New runtime deps `mcp` + `a2wsgi` are installed by `scripts/start.bat` on boot and tracked in `requirements-api.txt`. No REST endpoint or trading-path change. - -## [v4.6.0] — 2026-07-26 - -Hotfix for a boot-blocking regression introduced in v4.5.0, plus a `make lint` / `make format` gate so that class of bug cannot reach the VM again. - -### Fixed - -- **v4.5.0's `scripts/acquire_lock.ps1` deadlocked every boot.** The file contained em-dashes in comments *and in string literals*, with no UTF-8 BOM. Windows PowerShell 5.1 reads `.ps1` as ANSI, so those bytes were mangled, the string literals terminated early, and the script died with `Unexpected token` / `The hash literal was incomplete`. The script is now pure ASCII, which needs no BOM to stay stable. -- **A failing lock helper was indistinguishable from a held lock.** `acquire_lock.ps1` used exit 1 for "another instance holds the lock" — the same code PowerShell returns for a parse error. So the syntax error above made `start.bat` conclude the lock was taken and exit, on every boot, which is the exact deadlock the lock rewrite was meant to remove. Exit codes are now distinct: `0` acquired, `10` held, anything else means the helper itself failed. On that third case `scripts/start.bat` and `scripts/install.bat` log a warning and fall back to a plain `mkdir` lock, so a broken helper can degrade single-instance safety but can never block boot. -- `scripts/event-log-tailer.ps1`: em-dashes in comments replaced with ASCII (same mojibake hazard); `Append-Full` renamed to `Add-FullLogLine` (`Add` is an approved PowerShell verb); its `catch {}` no longer swallows silently — a failed `full.log` append is now reported into `windows-events.log`, which is not the contended file that just failed. - -### Added - -- **`make lint`** — lints every tracked-or-new script in a throwaway Docker image (built, run, `docker rmi`'d, repo mounted read-only), mirroring how `make test` works. Six checks: a self-test of its own non-ASCII detector, the `.ps1` ASCII gate, a `.ps1` parse check, PSScriptAnalyzer, shellcheck (warning and above), and shfmt. `Dockerfile.lint` + `scripts/lint.sh`. - - The detector self-test exists because a checker that silently stops detecting is worse than no checker — the same failure mode as the healthcheck fixed in v4.5.0. It verifies the pattern still flags a real em-dash and still passes pure ASCII, and fails the whole run if it cannot tell them apart. - - Files are selected with `git ls-files --cached --others --exclude-standard`, so brand-new scripts are covered while gitignored local scratch is not. The vendored `scripts/defender-remover/` tree is excluded. -- **`make format`** — applies shfmt in place. Delegates to `scripts/lint.sh --format` so it shares file selection with `make lint`; when the two had separate lists, `format` skipped untracked files that `lint` still flagged and the gate could never go green. - -### Changed - -- Applied shfmt formatting to `run.sh`, `test.sh`, `scripts/rotate-logs.sh`, and `tests/real/run.sh`. Whitespace and layout only — no behavior change. In `test.sh` this expands single-line function bodies (`pass() { echo …; PASS=…; }`) onto separate lines, which is most of the diff. -- README's Make Targets list now includes `lint`, `format`, and `test` (`test` had been missing). - -## [v4.5.0] — 2026-07-26 - -Boot-lock and reboot hardening for the Windows VM, a critical healthcheck false-positive fix, and a `make test` build fix. Also adds third-party license notices for the vendored Windows Defender removal tool. - -### Fixed - -- **Healthcheck reported dead terminals as healthy.** `scripts/healthcheck.sh` probed each terminal with `curl … -w '%{http_code}' … || echo 000`. curl already prints `000` on a failed connection, so the `|| echo 000` fallback appended a second one — yielding `000000`, which compared unequal to `000` and marked the port UP. A full outage could sit behind a green Docker healthcheck indefinitely. The probe now whitelists a valid HTTP status shape (`[1-5][0-9][0-9]`) and fails closed; any real status, including 4xx/5xx, proves the process is listening. -- **Reboot-orphaned boot locks deadlocked the stack.** `%SHARED%\start.running` (and install.bat's lock) live on the host-mounted volume and survive a VM reboot. The auto-reboot task fires `shutdown /r /t 0 /f` with no grace period and can land mid-run, stranding the lock so every later boot bailed on the orphan forever. New `scripts/acquire_lock.ps1` stamps each lock with the OS boot time, so a lock from a previous boot is provably ownerless and is cleared automatically; a live same-boot instance still blocks. `scripts/start.bat` and `scripts/install.bat` acquire through it and release via a single `release_lock`. -- **`make test` was dead on a clean checkout.** `Dockerfile.test` COPYed `config/requirements.txt`, which had been retired and is gitignored, so the build failed with `"/config/requirements.txt": not found`. Tests now install from the tracked `requirements-api.txt`, additionally COPY `scripts/config_helper.py` (loaded by `tests/test_terminal_instances.py`), and skip the live-deployment `tests/real/` suite in the default offline run. - -### Added - -- `scripts/reboot.bat` — the single reboot path for the VM. Writes `rebooting.flag` and releases both lock dirs in one place, replacing three separate inline flag+shutdown+rmdir sequences that had to be kept in sync. -- `requirements-api.txt` — tracked source of truth for the mt5api HTTP server's Python dependencies (replacing the retired, gitignored `config/requirements.txt`). `scripts/start.bat` installs the same set inline on every boot. Retains the documented `numpy<2` pin — the MetaTrader5 `5.0.5735` wheel is built against numpy 1.x, and under numpy 2.x `order_send` fails with `(-2, 'Unnamed arguments not allowed')`. - -### Changed - -- Renamed the boot entrypoint `start-mt5.bat` → `start.bat` and its log `start-mt5.log` → `start.log`; README file-tree and log references updated to match. - -### Licensing - -- Added `THIRD_PARTY.md` and `scripts/defender-remover/LICENSE` (GPL-3.0). `scripts/defender-remover/` is a verbatim vendored copy of the third-party windows-defender-remover tool, which is GPL-3.0-licensed; the rest of mt5-httpapi stays WTFPL. Documents the licensing of what the repo actually distributes. - -## [v4.4.3] — 2026-07-26 - -Docs: hardened the `mt5-httpapi` agent skill with explicit destructive-operation guardrails and an auth/exfil-style warning. Renamed the safety section to `## Security & safety`, spelled out that trade/order/position mutations are irreversible with no client-side auto-retry, and made the "empty `api_token` = unauthenticated" warning more explicit. No behavior, endpoint, or API change. - -## [v4.4.2] — 2026-07-25 +- Deleted the stray `.claude-plugin/marketplace.json` from this repo. -CI: switch the ClawHub skill publish to `clawhub-publish.yml` directly — the `clawhub-skills-publish-workflow.yml` shim was removed upstream. No trading-path or API change. ## [v4.3.1] — 2026-05-17 diff --git a/README.md b/README.md index 7e70747..b6d2349 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,7 @@ Run multiple brokers, accounts, and cloned terminal instances at the same time. - **Built-in technical analysis** — [wickworks](https://github.com/psyb0t/docker-wickworks) calculates indicators and SMC primitives server-side without exposing its own port. - **MCP for the robot overlords** — one endpoint per terminal or one unified endpoint for the whole pile, plus Claude Code, Codex, and OpenClaw integrations. - **Optional multi-VM fuckery** — spread terminals across VMs or NUMA nodes, then reach them through Tailscale or Cloudflare Tunnel if you need to. +- **Chart Deployments** for remote EA deployment: stage `.ex5` + `.set` files, declare a deployment (symbol + timeframe), and a resident loader EA inside the terminal reconciles charts automatically — no RDP or manual attach needed. ## Requirements @@ -129,6 +130,7 @@ The old README became a massive wall of API shit, so the details now live in sep | Copy working curl and Go examples instead of guessing | [Clients and examples](docs/clients-and-examples.md) | | Operate the bastard: Make targets, ports, remote access, concurrency, and logs | [Operations](docs/operations.md) | | Split terminals across several Windows VMs or NUMA nodes | [Multi-VM setup](docs/multi-vm-setup.md) | +| Deploy EAs to charts remotely over HTTP | [Chart Deployments (chartctl)](docs/chart-control-protocol.md) | ## API at a glance @@ -153,6 +155,23 @@ curl -H "Authorization: Bearer $MT5_API_TOKEN" \ That is just the hello-world shit. The [REST API docs](docs/rest-api.md) link to every endpoint and response shape. +**Chart Deployments** endpoints (live-mode terminals only; gated by `chartctl.enabled`): + +```bash +# Stage an expert and set file, then deploy +curl -H "Authorization: Bearer $MT5_API_TOKEN" -F "expert=@MyEA.ex5" "$MT5_API_URL/experts" +curl -H "Authorization: Bearer $MT5_API_TOKEN" -F "set=@params.set" "$MT5_API_URL/sets" +curl -H "Authorization: Bearer $MT5_API_TOKEN" -X POST "$MT5_API_URL/deployments" \ + -H "Content-Type: application/json" \ + -d '{"expert":"MyEA.ex5","set":"params.set","symbol":"EURUSD","timeframe":"M15"}' + +# Verify — status flips to "running" once the loader confirms attach +curl -H "Authorization: Bearer $MT5_API_TOKEN" "$MT5_API_URL/deployments" +curl -H "Authorization: Bearer $MT5_API_TOKEN" "$MT5_API_URL/loader" +``` + +Full protocol contract at [`docs/chart-control-protocol.md`](docs/chart-control-protocol.md). + ## Development ```bash diff --git a/assets/autoit/AutoIt3_x64.exe b/assets/autoit/AutoIt3_x64.exe new file mode 100644 index 0000000000000000000000000000000000000000..43d81f5a0e537c0033c942b977d29747ba218eb6 GIT binary patch literal 1107552 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

D-%`eP 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

MAgU z-f<65C($9#uI-#6ofrNrACR*l;B1Ex*pQQhd*R)%0l7DDj6wd?KwGDa|8$e8+oT;H z6+`-XECRh@XFa`4?ak*Hg+wu{YGDym`PlOV*CN7Rw4d>?V~IEiec2|NIkZ~Eu&Z}7 zvIA!$5?Ia@tFlD#A#}mk^iNSjiQ?}rMr^`j0U+gqi0R2PJa_I<&k6&S36W7pQiS2H)j96$5BLn6o6uD(W^=IKY;s--rmUB!eQeLzIIxP@0v_fl86l3N

(bZ}*kLWQ`yq7K1X;%8J#Bj8#4>_+Ae$s1p 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͓!)B@J}^I= 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 z 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�zRg)* zpZno&F2C1b`0mm{)?NKuoHpsyY>3#5wIvnshA3Z_{94F)g6R2df#Cj$ds_5FOu_<4 z!5-I3?Y2c$i4EFLlaeNT<*)Ikvfkfx=56?(q}m`M#XV2o{_^{t+fO?!g6^w&9Btji z^4y2bqqLE8g2~FAZ#PYH2y>=*7<`DoZrUOI%nVxa`{N!Dh=VVyRLQKUxL)-^y~XZ8XK3%y?dJkz9hrz*x8CbEXJ5H?x2(bP zw+p!sHTSq0hX&VLtrpLprFP3`)l!n7NmX4@^3}=PCwzXiXc5(=tW{)#4~g6r*=D5e z^@#A8(=Cd1)r|~(g-GT_z=n;GN!#~dH53u}e=t*xwAzs(nPhR1VFMr7wRuKa@o?$C zo++b!*-H<{uID72FdjpZhEwd+!$hEMpTM zQ8c19g1kZm36D62M;yT;4zm#B4;ZJcQ#reFc4aA(cL+y(ls|J_Ks?oJ+CHsdTFZ4c zJOE#tVgEnfd!w7o63G;Prk32W&vUh}F$?YO^+y*X_g`Bn^VEOK{|j&dkNzcyFOLdm z`8+sU%x2sUHd=~zZd!s8f`63a{;F0c5VX|mf|q!Sq!L@a2L@5|ugz~2TZcwPXS30Hkl~Bx3Hofjt(tpgcP##)2dFSxud%V^L8~K4pO`~omL$hm z47wH+gy863g$K&!uKm!fVecC1oHDnOuFqFqTG;$XBOd0tOB{uEtMoefXQWFxm7f`l zN{4;m58e>^93=|JLX$7+0=37b(j=c<#eESLRD(`ZJ+Ce0JXi!j44@ZdAkPtVQqPoX zeu1TtA{ArY_ +; Non-destructive inspector for MT5's Tools->Options dialog. NO #includes +; (an undefined include function pops a blocking error dialog). Finds the MT5 +; window containing (the login), opens Options (Ctrl+O), walks +; every tab, and logs the VISIBLE controls (ClassNN, pos, text) so we can +; identify the Expert Advisors tab index + the WebRequest checkbox/list, then +; cancels with Esc. + +Opt("WinTitleMatchMode", 2) +Opt("SendKeyDelay", 15) + +Global $gLog = -1 + +Func LogW($s) + If $gLog <> -1 Then FileWrite($gLog, $s & @CRLF) +EndFunc + +Func DumpVisible($hWin, $tag) + LogW("--- " & $tag & " ---") + Local $cl = WinGetClassList($hWin) + Local $arr = StringSplit(StringStripCR($cl), @LF) + Local $seen = "|" + For $i = 1 To $arr[0] + Local $c = $arr[$i] + If $c = "" Then ContinueLoop + If StringInStr($seen, "|" & $c & "|") > 0 Then ContinueLoop + $seen &= $c & "|" + For $n = 1 To 80 + Local $ctrl = $c & $n + Local $pos = ControlGetPos($hWin, "", $ctrl) + If @error Then ExitLoop + Local $vis = ControlCommand($hWin, "", $ctrl, "IsVisible", "") + If $vis = 1 Then + Local $txt = ControlGetText($hWin, "", $ctrl) + LogW(" " & $ctrl _ + & " xywh=" & $pos[0] & "," & $pos[1] & "," & $pos[2] & "," & $pos[3] _ + & " text='" & StringLeft(StringReplace($txt, @CRLF, " "), 70) & "'") + EndIf + Next + Next +EndFunc + +; ---- args ---- +; 3 args: match, pid, logpath. 2 args (legacy): match, logpath. +If $CmdLine[0] < 2 Then Exit 10 +Global $match = $CmdLine[1] +Global $pid = 0 +Global $logpath +If $CmdLine[0] >= 3 Then + $pid = Int($CmdLine[2]) + $logpath = $CmdLine[3] +Else + $logpath = $CmdLine[2] +EndIf + +$gLog = FileOpen($logpath, 2) +If $gLog = -1 Then Exit 11 +LogW("=== inspect_options match=" & $match & " pid=" & $pid & " ===") + +; ---- find + activate MT5 (visible windows only; by owner pid when known — +; same-login terminal clones share the exact same window title) ---- +Local $wl = WinList() +Local $hMT5 = 0 +For $i = 1 To $wl[0][0] + Local $h = $wl[$i][1] + If $wl[$i][0] = "" Then ContinueLoop + If BitAND(WinGetState($h), 2) = 0 Then ContinueLoop + If $pid > 0 And WinGetProcess($h) <> $pid Then ContinueLoop + If StringInStr($wl[$i][0], $match) > 0 Then $hMT5 = $h +Next +If $hMT5 = 0 Then + LogW("RESULT=FAIL reason=mt5_window_not_found") + FileClose($gLog) + Exit 2 +EndIf +WinActivate($hMT5) +Sleep(600) +LogW("mt5='" & WinGetTitle($hMT5) & "' win_pid=" & WinGetProcess($hMT5)) + +; ---- open Options ---- +Send("^o") +Local $hOpt = WinWait("Options", "", 10) +If $hOpt <> 0 And $pid > 0 And WinGetProcess($hOpt) <> $pid Then $hOpt = 0 +If $hOpt = 0 Then + LogW("RESULT=FAIL reason=options_not_found") + FileClose($gLog) + Exit 3 +EndIf +WinActivate($hOpt) +Sleep(300) +LogW("options='" & WinGetTitle($hOpt) & "'") +LogW("classlist=" & StringReplace(WinGetClassList($hOpt), @LF, " | ")) + +; ---- find tab control, walk tabs ---- +Local $tabClass = "" +Local $cls = StringSplit(StringStripCR(WinGetClassList($hOpt)), @LF) +For $i = 1 To $cls[0] + If StringInStr($cls[$i], "SysTabControl32") > 0 Then + $tabClass = $cls[$i] + ExitLoop + EndIf +Next +LogW("tabClass='" & $tabClass & "'") + +If $tabClass <> "" Then + Local $cnt = ControlCommand($hOpt, "", $tabClass, "GetItemCount", "") + LogW("tab_count=" & $cnt) + If $cnt >= 1 Then + For $t = 1 To $cnt + ControlCommand($hOpt, "", $tabClass, "CurrentTab", $t) + Sleep(250) + DumpVisible($hOpt, "tab#" & $t) + Next + Else + DumpVisible($hOpt, "single") + EndIf +Else + DumpVisible($hOpt, "no-tabctl") +EndIf + +LogW("RESULT=OK") +Send("{ESC}") +FileClose($gLog) +Exit 0 diff --git a/assets/autoit/selftest.au3 b/assets/autoit/selftest.au3 new file mode 100644 index 0000000..f544dc1 --- /dev/null +++ b/assets/autoit/selftest.au3 @@ -0,0 +1,60 @@ +; selftest.au3 [] +; Minimal, NO external includes. Confirms AutoIt runs at all, reports whether +; it's elevated, and whether it can find + drive the (elevated) MT5 window. +; With 3 args the second is the terminal64.exe pid (0 = unknown) — same-login +; terminal clones share the exact same window title, so only the pid pins one. + +Opt("WinTitleMatchMode", 2) +Opt("SendKeyDelay", 15) + +Local $match = ($CmdLine[0] >= 1) ? $CmdLine[1] : "?" +Local $pid = 0 +Local $logpath = @ScriptDir & "\selftest.log" +If $CmdLine[0] >= 3 Then + $pid = Int($CmdLine[2]) + $logpath = $CmdLine[3] +ElseIf $CmdLine[0] = 2 Then + $logpath = $CmdLine[2] +EndIf + +Local $h = FileOpen($logpath, 2) +If $h = -1 Then Exit 11 +FileWrite($h, "started args=" & $CmdLine[0] & " match=" & $match & " pid=" & $pid & @CRLF) +FileWrite($h, "IsAdmin=" & IsAdmin() & @CRLF) + +Local $wl = WinList() +FileWrite($h, "windows_total=" & $wl[0][0] & @CRLF) +Local $hMT5 = 0 +For $i = 1 To $wl[0][0] + If $wl[$i][0] <> "" And StringInStr($wl[$i][0], $match) > 0 Then + FileWrite($h, " match_win='" & $wl[$i][0] & "' visible=" _ + & (BitAND(WinGetState($wl[$i][1]), 2) > 0 ? 1 : 0) _ + & " pid=" & WinGetProcess($wl[$i][1]) & @CRLF) + If BitAND(WinGetState($wl[$i][1]), 2) = 0 Then ContinueLoop + If $pid > 0 And WinGetProcess($wl[$i][1]) <> $pid Then ContinueLoop + $hMT5 = $wl[$i][1] + EndIf +Next +If $hMT5 = 0 Then + FileWrite($h, "RESULT=FAIL reason=no_mt5_window" & @CRLF) + FileClose($h) + Exit 2 +EndIf + +WinActivate($hMT5) +Sleep(600) +FileWrite($h, "active_title='" & WinGetTitle("[ACTIVE]") & "'" & @CRLF) + +Send("^o") +Local $hOpt = WinWait("Options", "", 8) +If $hOpt <> 0 And $pid > 0 And WinGetProcess($hOpt) <> $pid Then $hOpt = 0 +If $hOpt = 0 Then + FileWrite($h, "RESULT=FAIL reason=options_did_not_open (input blocked? UIPI/elevation)" & @CRLF) + FileClose($h) + Exit 3 +EndIf +FileWrite($h, "options_opened title='" & WinGetTitle($hOpt) & "'" & @CRLF) +Send("{ESC}") +FileWrite($h, "RESULT=OK" & @CRLF) +FileClose($h) +Exit 0 diff --git a/assets/autoit/set_webrequest.au3 b/assets/autoit/set_webrequest.au3 new file mode 100644 index 0000000..8d97db3 --- /dev/null +++ b/assets/autoit/set_webrequest.au3 @@ -0,0 +1,232 @@ +; set_webrequest.au3 [] +; Adds the URLs in (one per line) to MT5's Tools->Options->Expert +; Advisors "Allow WebRequest for listed URL" list, for the terminal whose +; window title contains (the login). NO #includes (an undefined +; include function pops a blocking error dialog). +; +; (optional, 0 = unknown) is the terminal64.exe process id. Cloned +; terminals of the same account have IDENTICAL window titles, so the login is +; ambiguous — the pid is the only thing that pins the right terminal. When +; given, both the main window and the Options dialog are matched by owner pid. +; +; MT5's URL list is a SysListView32 with a greyed "add new URL like ..." row at +; the bottom; double-clicking it opens an inline edit. We type the URL + Enter, +; which commits and produces a fresh add-row below. Then OK. + +Opt("WinTitleMatchMode", 2) +Opt("SendKeyDelay", 20) +Opt("SendKeyDownDelay", 5) +Opt("MouseCoordMode", 2) ; coords relative to the control for ControlClick + +Global $gLog = -1 +Func LogW($s) + If $gLog <> -1 Then FileWrite($gLog, $s & @CRLF) +EndFunc + +; Scan Button1..25 for the first VISIBLE control whose text contains $needle. +Func FindButtonByText($hWin, $needle) + For $n = 1 To 25 + Local $ctrl = "Button" & $n + ControlGetPos($hWin, "", $ctrl) + If @error Then ContinueLoop + If ControlCommand($hWin, "", $ctrl, "IsVisible", "") <> 1 Then ContinueLoop + If StringInStr(ControlGetText($hWin, "", $ctrl), $needle) > 0 Then Return $ctrl + Next + Return "" +EndFunc + +Func DumpControls($hWin, $tag) + LogW(" [" & $tag & "] classlist=" & StringReplace(WinGetClassList($hWin), @LF, " | ")) +EndFunc + +; Log the current listview rows (so we can verify what MT5 actually holds). +Func DumpList($hWin, $tag) + Local $cnt = ControlListView($hWin, "", "SysListView321", "GetItemCount") + Local $s = "" + For $r = 0 To $cnt - 1 + $s &= "[" & ControlListView($hWin, "", "SysListView321", "GetText", $r, 0) & "] " + Next + LogW(" list(" & $tag & ") count=" & $cnt & " items=" & $s) + Return $cnt +EndFunc + +; Visible top-level window for this terminal: by owner pid when known +; (title as tie-break among the pid's windows), else by title substring. +; WinList() alone is NOT enough — it returns hidden windows, and same-login +; terminal clones share the exact same title. +Func FindMainWindow($match, $pid) + Local $wl = WinList() + Local $best = 0 + For $i = 1 To $wl[0][0] + Local $h = $wl[$i][1] + Local $title = $wl[$i][0] + If $title = "" Then ContinueLoop + If BitAND(WinGetState($h), 2) = 0 Then ContinueLoop ; visible only + If $pid > 0 Then + If WinGetProcess($h) <> $pid Then ContinueLoop + If StringInStr($title, $match) > 0 Then Return $h + If $best = 0 Then $best = $h + Else + If StringInStr($title, $match) > 0 Then $best = $h + EndIf + Next + Return $best +EndFunc + +; Focus the terminal and open Tools->Options (Ctrl+O), retrying, and only +; accept an Options window owned by our pid (another terminal's dialog, or +; any window with "Options" in its title, must not be driven). +Func OpenOptions($hMT5, $pid) + For $try = 1 To 3 + WinActivate($hMT5) + If WinWaitActive($hMT5, "", 3) = 0 Then + LogW(" activate attempt " & $try & " failed (active='" & WinGetTitle("[ACTIVE]") & "')") + ContinueLoop + EndIf + Send("^o") + Local $t = TimerInit() + While TimerDiff($t) < 5000 + Local $hOpt = WinWait("Options", "", 1) + If $hOpt <> 0 Then + If $pid = 0 Or WinGetProcess($hOpt) = $pid Then Return $hOpt + LogW(" ignoring foreign Options window (pid=" & WinGetProcess($hOpt) & ")") + EndIf + WEnd + LogW(" ctrl+o attempt " & $try & ": no Options dialog") + Next + Return 0 +EndFunc + +; ---- args ---- +; 4 args: match, pid, urlfile, logpath. 3 args (legacy caller): match, +; urlfile, logpath with pid unknown. +If $CmdLine[0] < 3 Then Exit 10 +Global $match = $CmdLine[1] +Global $pid = 0 +Global $urlfile, $logpath +If $CmdLine[0] >= 4 Then + $pid = Int($CmdLine[2]) + $urlfile = $CmdLine[3] + $logpath = $CmdLine[4] +Else + $urlfile = $CmdLine[2] + $logpath = $CmdLine[3] +EndIf + +$gLog = FileOpen($logpath, 2) +If $gLog = -1 Then Exit 11 +LogW("=== set_webrequest match=" & $match & " pid=" & $pid & " ===") + +; ---- read urls ---- +Global $raw = FileRead($urlfile) +Global $urls = StringSplit(StringStripCR($raw), @LF) +Local $n_urls = 0 +For $i = 1 To $urls[0] + If StringStripWS($urls[$i], 3) <> "" Then $n_urls += 1 +Next +LogW("urls_in_file=" & $n_urls) + +; ---- find + activate MT5 ---- +Local $hMT5 = FindMainWindow($match, $pid) +If $hMT5 = 0 Then + LogW("RESULT=FAIL reason=mt5_window_not_found") + FileClose($gLog) + Exit 2 +EndIf +LogW("mt5='" & WinGetTitle($hMT5) & "' win_pid=" & WinGetProcess($hMT5)) + +; ---- open Options ---- +Local $hOpt = OpenOptions($hMT5, $pid) +If $hOpt = 0 Then + LogW("RESULT=FAIL reason=options_not_found") + FileClose($gLog) + Exit 3 +EndIf +WinActivate($hOpt) +Sleep(400) + +; ---- ensure the Expert Advisors tab is active (WebRequest checkbox present) ---- +Local $cb = FindButtonByText($hOpt, "WebRequest") +Local $tries = 0 +While $cb = "" And $tries < 12 + Send("^{TAB}") ; cycle property-sheet tabs + Sleep(250) + $cb = FindButtonByText($hOpt, "WebRequest") + $tries += 1 +WEnd +If $cb = "" Then + LogW("RESULT=FAIL reason=webrequest_checkbox_not_found") + Send("{ESC}") + FileClose($gLog) + Exit 4 +EndIf +LogW("checkbox=" & $cb & " text='" & ControlGetText($hOpt, "", $cb) & "'") + +; ---- ensure the checkbox is checked (real click triggers MT5's enable logic) ---- +If ControlCommand($hOpt, "", $cb, "IsChecked", "") <> 1 Then + ControlClick($hOpt, "", $cb) + Sleep(300) + LogW("checkbox now checked=" & ControlCommand($hOpt, "", $cb, "IsChecked", "")) +Else + LogW("checkbox already checked") +EndIf + +; ---- the URL list ---- +Local $lp = ControlGetPos($hOpt, "", "SysListView321") +If @error Then + LogW("RESULT=FAIL reason=listview_not_found") + Send("{ESC}") + FileClose($gLog) + Exit 5 +EndIf +LogW("list xywh=" & $lp[0] & "," & $lp[1] & "," & $lp[2] & "," & $lp[3]) +Local $rowH = 17 + +; ---- clear existing entries (a PUT sets the full list) ---- +; Select the first data row and press Delete, repeatedly. The greyed "add new +; URL" row can't be deleted, so extra iterations are harmless no-ops. +DumpList($hOpt, "before-clear") +For $k = 1 To 40 + Local $before = ControlListView($hOpt, "", "SysListView321", "GetItemCount") + If $before <= 0 Then ExitLoop + ControlClick($hOpt, "", "SysListView321", "left", 1, Int($lp[2] / 2), 10) + Sleep(60) + Send("{DELETE}") + Sleep(90) + If ControlListView($hOpt, "", "SysListView321", "GetItemCount") >= $before Then ExitLoop +Next +DumpList($hOpt, "after-clear") + +; ---- add each url ---- +Local $added = 0 +Local $idx = 0 +For $i = 1 To $urls[0] + Local $u = StringStripWS($urls[$i], 3) + If $u = "" Then ContinueLoop + ; add-row is the last row: relative Y grows by rowH per existing entry + Local $ry = 10 + ($idx * $rowH) + If $ry > $lp[3] - 4 Then $ry = $lp[3] - 8 ; clamp into the control + ControlClick($hOpt, "", "SysListView321", "left", 2, Int($lp[2] / 2), $ry) + Sleep(250) + If $i = 1 Then DumpControls($hOpt, "after-first-dblclick") + ; type the URL into whatever inline edit appeared, then commit + Send("^a") ; select any placeholder text + Send($u, 1) ; raw send (URLs contain / : . which are literal in raw mode) + Sleep(120) + Send("{ENTER}") + Sleep(300) + LogW("typed[" & $idx & "] ry=" & $ry & " url=" & $u) + $added += 1 + $idx += 1 +Next +DumpList($hOpt, "final") + +; ---- confirm with OK ---- +Local $ok = FindButtonByText($hOpt, "OK") +If $ok = "" Then $ok = "Button8" +ControlClick($hOpt, "", $ok) +Sleep(400) + +LogW("RESULT=OK added=" & $added) +FileClose($gLog) +Exit 0 diff --git a/assets/binaries.lock.json b/assets/binaries.lock.json index aacddfd..ba53824 100644 --- a/assets/binaries.lock.json +++ b/assets/binaries.lock.json @@ -21,6 +21,17 @@ "source": "https://www.sordum.org/downloads/?power-run=", "signature": "malformed", "note": "REPACKED, NOT PRISTINE. Arrived vendored inside the defender-remover toolkit rather than from Sordum directly. Its certificate directory is not a well-formed WIN_CERTIFICATE (declared length 776284822, revision 0xc496, type 14951 against the required 0x200/2) and 512 bytes trail it, so the Authenticode signature cannot validate. Its hash matches no Sordum release: official v1.6.0.0 x64 is da77bc401ef0d7b8e23be3a9387660172aea176cd9d1248034130811d29942c9 (934464 bytes) and current v1.9.0.0 x64 is b305126c2881073a53073bd1782d0649764d198562e02fc02395fc07637dcec5. Not known to be malicious — repacking is normal for that toolkit — but it is unverifiable. Replacing it with an official Sordum download would let this entry move to signature=valid." + }, + { + "path": "assets/autoit/AutoIt3_x64.exe", + "sha256": "5d69a932a077fee044b193c28e84564143f5c7e51079ab48e88fef74ab0b77b7", + "size": 1107552, + "product": "AutoIt v3 Script", + "version": "3.3.18.8", + "vendor": "Jonathan Bennett & AutoIt Team", + "source": "https://www.autoitscript.com/site/autoit/downloads/", + "signature": "valid", + "note": "AutoIt interpreter used for GUI automation of the WebRequest allowlist dialog on the Windows VM. Version and product name read from the binary's own version resource (FileVersion 3.3.18.8, Copyright 1999-2025); Authenticode digest verified by scripts/verify_binaries.py against the signing certificate, not against a separately downloaded upstream copy." } ] } diff --git a/assets/experts/MT5ChartLoader.mq5 b/assets/experts/MT5ChartLoader.mq5 new file mode 100644 index 0000000..b8c109b --- /dev/null +++ b/assets/experts/MT5ChartLoader.mq5 @@ -0,0 +1,62 @@ +//+------------------------------------------------------------------+ +//| MT5ChartLoader.mq5 | +//| Reference chart-deployment loader for mt5-httpapi chartctl. | +//| | +//| Attach this to ANY single chart in the terminal (it doesn't | +//| matter which symbol/timeframe — it manages other charts, not | +//| its own). It reconciles the terminal to the desired deployments | +//| written by the API and reports live state back. | +//| | +//| It never trades. It only opens/closes charts and applies | +//| templates. Safe to run on a live account. | +//| | +//| This EA is intentionally thin: all logic lives in the portable | +//| include ChartControl.mqh so you can drop the same capability | +//| into your own resident EA (e.g. an account tracker) instead of | +//| running this standalone. See docs/chart-control-protocol.md. | +//+------------------------------------------------------------------+ +#property copyright "mt5-httpapi" +#property link "https://github.com/psyb0t/mt5-httpapi" +#property version "1.00" +#property strict + +#include + +input int InpLoopSeconds = 1; // reconcile timer period (seconds) + +CChartControl ctl; + +//+------------------------------------------------------------------+ +int OnInit() +{ + // true: if another loader already owns the terminal, close this chart + // and vanish (mt5start.ini [StartUp] re-attaches us on every launch; + // this keeps that idempotent instead of accumulating loader charts). + if(!ctl.Init(true)) + return INIT_FAILED; + EventSetTimer(InpLoopSeconds < 1 ? 1 : InpLoopSeconds); + Comment("MT5ChartLoader active — chartctl loader\n", + ctl.IsOwner() ? "role: OWNER" : "role: passive (another loader owns the mutex)"); + return INIT_SUCCEEDED; +} + +//+------------------------------------------------------------------+ +void OnTimer() +{ + ctl.Tick(); +} + +//+------------------------------------------------------------------+ +void OnDeinit(const int reason) +{ + EventKillTimer(); + ctl.Deinit(); + Comment(""); +} + +//+------------------------------------------------------------------+ +//| No trading. OnTick is intentionally empty; the loader is timer- | +//| driven so it works on weekends and on disconnected symbols. | +//+------------------------------------------------------------------+ +void OnTick() {} +//+------------------------------------------------------------------+ diff --git a/assets/experts/include/ChartControl.mqh b/assets/experts/include/ChartControl.mqh new file mode 100644 index 0000000..a2df55c --- /dev/null +++ b/assets/experts/include/ChartControl.mqh @@ -0,0 +1,787 @@ +//+------------------------------------------------------------------+ +//| ChartControl.mqh | +//| Chart Control Protocol v1 — reference implementation | +//| | +//| Drop this into a resident EA to make it the terminal's chart | +//| deployment loader. It reconciles the terminal's charts to the | +//| desired state written by mt5-httpapi's chartctl endpoints. | +//| | +//| Usage inside your EA: | +//| #include | +//| CChartControl ctl; | +//| int OnInit(){ if(!ctl.Init()) return INIT_FAILED; | +//| EventSetTimer(1); return INIT_SUCCEEDED; } | +//| void OnTimer(){ ctl.Tick(); } | +//| void OnDeinit(const int r){ ctl.Deinit(); } | +//| | +//| Contract & file formats: docs/chart-control-protocol.md | +//+------------------------------------------------------------------+ +#property strict + +#define CHARTCTL_PROTOCOL 1 +#define CHARTCTL_VERSION "1.0.2" +#define CHARTCTL_DIR "chartctl" // under MQL5\Files\ +#define CHARTCTL_MUTEX_GV "chartctl_loader_owner" +#define CHARTCTL_ID_INPUT "__chartctl_id" + +//--- one desired deployment +struct ChartCtlDeployment +{ + string id; + string expert; // expert short name (CHART_EXPERT_NAME match target) + string templ; // template path for ChartApplyTemplate; leading \ = relative to \MQL5 (e.g. \Files\chartctl\dep_x.tpl) + string symbol; + string timeframe; + bool enabled; +}; + +//--- what we observed on one chart +struct ChartCtlChart +{ + long chart_id; + string symbol; + string timeframe; + string expert; + bool expert_enabled; + string deployment_id; // parsed from the chart's __chartctl_id if present +}; + +//+------------------------------------------------------------------+ +class CChartControl +{ +private: + bool m_owner; // did we win the single-loader mutex? + long m_applied_revision; // last desired revision we reconciled + long m_last_revision_seen; + datetime m_started; + // Per-deployment error slots (parallel arrays keyed by deployment id). + // A single shared slot let one deployment's error mask another's. + string m_err_ids[]; + string m_err_codes[]; + string m_err_details[]; + datetime m_err_times[]; // drives the failed-attach retry cooldown + + //--- file helpers ------------------------------------------------- + bool ReadFile(const string relpath, string &out); + bool WriteFileAtomic(const string relpath, const string content); + void DeleteFileSafe(const string relpath); + + //--- json (minimal, tailored to our own compact output) ---------- + string JsonStr(const string key, const string s, const string json); + long JsonNum(const string key, const string json); + bool ExtractDeployments(const string json, ChartCtlDeployment &out[]); + string JsonEscape(const string s); + + //--- reconcile ---------------------------------------------------- + void ScanCharts(ChartCtlChart &out[]); + long FindChartFor(const string dep_id, ChartCtlChart &charts[]); + long FindAdoptableChart(const ChartCtlDeployment &dep, ChartCtlChart &charts[]); + bool StampChart(const long cid, const string dep_id); + bool AttachDeployment(const ChartCtlDeployment &dep); + void DetachChart(const long chart_id); + ENUM_TIMEFRAMES TF(const string s); + void RecordError(const string id, const string code, const string detail); + void ClearError(const string id); + bool InRetryCooldown(const string id); + + //--- observed + command output ----------------------------------- + void WriteObserved(ChartCtlDeployment &desired[], ChartCtlChart &charts[]); + void HandleCommand(); + +public: + CChartControl(void); + // close_own_chart_on_duplicate: standalone loaders pass true so a + // second copy (e.g. re-fired by mt5start.ini [StartUp] on every + // launch) closes its own chart and vanishes instead of idling. + // EAs that embed this module MUST leave it false — closing the chart + // would kill the host EA (e.g. an account tracker) too. + bool Init(const bool close_own_chart_on_duplicate=false); + void Tick(void); + void Deinit(void); + bool IsOwner(void) const { return m_owner; } +}; + +//+------------------------------------------------------------------+ +CChartControl::CChartControl(void) +{ + m_owner = false; + m_applied_revision = -1; + m_last_revision_seen = -1; + m_started = 0; +} + +//+------------------------------------------------------------------+ +//| Claim the single-loader mutex via a terminal GlobalVariable. | +//+------------------------------------------------------------------+ +bool CChartControl::Init(const bool close_own_chart_on_duplicate) +{ + m_started = TimeCurrent(); + + // If another loader already holds the mutex and is fresh, step aside. + if(GlobalVariableCheck(CHARTCTL_MUTEX_GV)) + { + datetime held = (datetime)GlobalVariableGet(CHARTCTL_MUTEX_GV); + // Treat a mutex touched within 120s as a live owner. + if(TimeCurrent() - held < 120) + { + m_owner = false; + if(close_own_chart_on_duplicate) + { + // Standalone duplicate (e.g. [StartUp] re-fired on relaunch): + // remove ourselves entirely so charts never accumulate. + Print("ChartControl: live owner exists; closing own chart."); + ChartClose(ChartID()); + return true; // unloading anyway; don't fail the host + } + Print("ChartControl: another loader owns the mutex; standing down."); + return true; // do NOT fail the host EA — just stay passive + } + } + GlobalVariableSet(CHARTCTL_MUTEX_GV, (double)TimeCurrent()); + GlobalVariableTemp(CHARTCTL_MUTEX_GV); // auto-clears if terminal exits + m_owner = true; + PrintFormat("ChartControl v%s active (owner). dir=MQL5\\Files\\%s", + CHARTCTL_VERSION, CHARTCTL_DIR); + return true; +} + +//+------------------------------------------------------------------+ +void CChartControl::Tick(void) +{ + if(!m_owner) + { + // Passive mode: try to reclaim if the previous owner is gone. + if(!GlobalVariableCheck(CHARTCTL_MUTEX_GV)) + Init(); + return; + } + + // Refresh mutex heartbeat. + GlobalVariableSet(CHARTCTL_MUTEX_GV, (double)TimeCurrent()); + + // Always answer commands (screenshot etc.), even without desired change. + HandleCommand(); + + string desired_json; + ChartCtlDeployment desired[]; + if(ReadFile(CHARTCTL_DIR + "\\desired.json", desired_json)) + { + long rev = JsonNum("revision", desired_json); + ExtractDeployments(desired_json, desired); + + // Reconcile every pass (cheap) — attach missing, detach orphans. + ChartCtlChart charts[]; + ScanCharts(charts); + + // 1) Attach / repair enabled deployments. + for(int i = 0; i < ArraySize(desired); i++) + { + if(!desired[i].enabled) + continue; + long cid = FindChartFor(desired[i].id, charts); + if(cid >= 0) + continue; + // Adopt before opening: an unowned chart already running this + // exact expert/symbol/timeframe is almost certainly a previous + // incarnation of this deployment whose comment stamp was lost + // (comments do NOT reliably survive terminal restarts). Claiming + // it instead of opening a fresh chart is what stops duplicates + // from accumulating one-per-reboot. + cid = FindAdoptableChart(desired[i], charts); + if(cid >= 0) + { + if(StampChart(cid, desired[i].id)) + { + ClearError(desired[i].id); + PrintFormat("ChartControl: adopted chart %I64d for %s (%s %s)", + cid, desired[i].id, desired[i].symbol, + desired[i].timeframe); + } + else + RecordError(desired[i].id, "STAMP_FAILED", + "adoption stamp on chart " + + IntegerToString(cid) + " did not read back"); + continue; + } + if(InRetryCooldown(desired[i].id)) + continue; // recent failure — don't hammer ChartOpen every pass + AttachDeployment(desired[i]); + } + + // 2) Detach charts we own whose deployment is gone or disabled. + ScanCharts(charts); // rescan after possible attaches + for(int c = 0; c < ArraySize(charts); c++) + { + if(charts[c].deployment_id == "") + continue; // not ours — never touch + bool wanted = false; + for(int d = 0; d < ArraySize(desired); d++) + if(desired[d].id == charts[c].deployment_id && desired[d].enabled) + { wanted = true; break; } + if(!wanted) + DetachChart(charts[c].chart_id); + } + + m_applied_revision = rev; + ScanCharts(charts); + WriteObserved(desired, charts); + } + else + { + // No desired file yet — still publish liveness + inventory. + ChartCtlChart charts[]; + ScanCharts(charts); + ChartCtlDeployment none[]; + WriteObserved(none, charts); + } +} + +//+------------------------------------------------------------------+ +void CChartControl::Deinit(void) +{ + if(m_owner && GlobalVariableCheck(CHARTCTL_MUTEX_GV)) + GlobalVariableDel(CHARTCTL_MUTEX_GV); +} + +//+------------------------------------------------------------------+ +//| Attach: select symbol, open chart, apply template, verify. | +//+------------------------------------------------------------------+ +bool CChartControl::AttachDeployment(const ChartCtlDeployment &dep) +{ + if(!SymbolSelect(dep.symbol, true)) + { + RecordError(dep.id, "SYMBOL_NOT_FOUND", + "SymbolSelect failed for " + dep.symbol); + return false; + } + + long cid = ChartOpen(dep.symbol, TF(dep.timeframe)); + if(cid == 0) + { + RecordError(dep.id, "CHART_OPEN_FAILED", + "ChartOpen failed err=" + IntegerToString(GetLastError())); + return false; + } + + if(!ChartApplyTemplate(cid, dep.templ)) + { + RecordError(dep.id, "TEMPLATE_APPLY_FAILED", + "ChartApplyTemplate(" + dep.templ + ") err=" + + IntegerToString(GetLastError())); + ChartClose(cid); + return false; + } + + // Verify the expert actually attached within ~10s. + for(int i = 0; i < 40; i++) + { + ChartRedraw(cid); + // CHART_EXPERT_NAME is NULL (not "") when no expert is attached, + // and NULL != "" is true in MQL5 — test length, or the very first + // iteration false-passes and an expert-less chart reports running. + string en = ChartGetString(cid, CHART_EXPERT_NAME); + if(StringLen(en) > 0) + { + if(!StampChart(cid, dep.id)) + { + // Without the stamp we could never re-identify the chart and + // would open a duplicate next pass — better to fail visibly. + RecordError(dep.id, "STAMP_FAILED", + "expert attached but CHART_COMMENT stamp did not " + "read back; closing chart"); + ChartClose(cid); + return false; + } + ClearError(dep.id); + PrintFormat("ChartControl: attached %s on %s %s (chart %I64d)", + en, dep.symbol, dep.timeframe, cid); + return true; + } + Sleep(250); + } + + // Leaving the chart open here leaks an expert-less chart per pass (the + // expert may still load later, but then adoption reclaims a closed-and- + // reopened one just as well). Close what we opened. + ChartClose(cid); + RecordError(dep.id, "EXPERT_NOT_ATTACHED", + "template applied but CHART_EXPERT_NAME empty after 10s; " + "GetLastError=" + IntegerToString(GetLastError())); + return false; +} + +//+------------------------------------------------------------------+ +//| Stamp attribution into the chart comment and verify it stuck. | +//| ChartSetString is asynchronous — the write is only queued — so | +//| read it back (with retries) before trusting it. | +//+------------------------------------------------------------------+ +bool CChartControl::StampChart(const long cid, const string dep_id) +{ + string want = "chartctl:" + dep_id; + for(int i = 0; i < 12; i++) + { + ChartSetString(cid, CHART_COMMENT, want); + ChartRedraw(cid); + Sleep(250); + if(ChartGetString(cid, CHART_COMMENT) == want) + return true; + } + PrintFormat("ChartControl: CHART_COMMENT stamp failed on chart %I64d (%s)", + cid, dep_id); + return false; +} + +//+------------------------------------------------------------------+ +//| An unowned chart matching a deployment's expert+symbol+timeframe | +//| (a prior incarnation whose stamp was lost, or a verify-timeout | +//| chart whose expert loaded late). | +//+------------------------------------------------------------------+ +long CChartControl::FindAdoptableChart(const ChartCtlDeployment &dep, + ChartCtlChart &charts[]) +{ + for(int i = 0; i < ArraySize(charts); i++) + { + if(charts[i].deployment_id != "") + continue; // owned by another deployment + if(!charts[i].expert_enabled) + continue; + if(charts[i].expert != dep.expert) + continue; + if(charts[i].symbol != dep.symbol) + continue; + if(charts[i].timeframe != "PERIOD_" + dep.timeframe) + continue; + return charts[i].chart_id; + } + return -1; +} + +//+------------------------------------------------------------------+ +void CChartControl::DetachChart(const long chart_id) +{ + PrintFormat("ChartControl: detaching chart %I64d", chart_id); + ChartClose(chart_id); +} + +//+------------------------------------------------------------------+ +//| Enumerate all open charts and classify ownership by the | +//| __chartctl_id we baked into each deployment template. | +//+------------------------------------------------------------------+ +void CChartControl::ScanCharts(ChartCtlChart &out[]) +{ + ArrayResize(out, 0); + long cid = ChartFirst(); + int guard = 0; + while(cid >= 0 && guard < 1000) + { + guard++; + ChartCtlChart c; + c.chart_id = cid; + c.symbol = ChartSymbol(cid); + c.timeframe = EnumToString(ChartPeriod(cid)); + c.expert = ChartGetString(cid, CHART_EXPERT_NAME); + c.expert_enabled = (c.expert != ""); + c.deployment_id = ""; // attribution below + + // Attribution is by the chart comment we set at attach time + // (ChartSetString CHART_COMMENT = "chartctl:"). We cannot read + // a foreign expert's inputs from MQL5, which is why the comment — + // not the template's __chartctl_id input — is the marker. The + // comment does NOT reliably survive a terminal restart (observed + // live 2026-07-16: one duplicate chart accumulated per reboot), so + // reconcile also adopts unowned exact-match charts (see + // FindAdoptableChart) instead of trusting this alone. + string cmt = ChartGetString(cid, CHART_COMMENT); + int p = StringFind(cmt, "chartctl:"); + if(p >= 0) + c.deployment_id = StringSubstr(cmt, p + 9); + + int n = ArraySize(out); + ArrayResize(out, n + 1); + out[n] = c; + + cid = ChartNext(cid); + } +} + +//+------------------------------------------------------------------+ +long CChartControl::FindChartFor(const string dep_id, ChartCtlChart &charts[]) +{ + for(int i = 0; i < ArraySize(charts); i++) + if(charts[i].deployment_id == dep_id && charts[i].expert_enabled) + return charts[i].chart_id; + return -1; +} + +//+------------------------------------------------------------------+ +//| Command channel: one-shot ops that produce artifacts. | +//+------------------------------------------------------------------+ +void CChartControl::HandleCommand(void) +{ + string body; + if(!ReadFile(CHARTCTL_DIR + "\\command.json", body)) + return; + + string cmd_id = JsonStr("command_id", "", body); + string action = JsonStr("action", "", body); + if(cmd_id == "") + { + DeleteFileSafe(CHARTCTL_DIR + "\\command.json"); + return; + } + + string result = "{"; + result += "\"command_id\":\"" + JsonEscape(cmd_id) + "\","; + + if(action == "screenshot") + { + long cid = JsonNum("chart_id", body); + int w = (int)JsonNum("width", body); if(w <= 0) w = 1280; + int h = (int)JsonNum("height", body); if(h <= 0) h = 720; + string fname = "shots\\" + cmd_id + ".png"; + // ChartScreenShot writes under MQL5\Files\. + if(ChartScreenShot((long)cid, CHARTCTL_DIR + "\\" + fname, w, h)) + result += "\"status\":\"ok\",\"file\":\"" + cmd_id + ".png\""; + else + result += "\"status\":\"error\",\"error_code\":\"SCREENSHOT_FAILED\"," + + "\"error_detail\":\"err=" + + IntegerToString(GetLastError()) + "\""; + } + else if(action == "reconcile") + { + m_applied_revision = -1; // force a full reconcile next pass + result += "\"status\":\"ok\""; + } + else if(action == "close_chart") + { + long cid = JsonNum("chart_id", body); + if(cid == ChartID()) + result += "\"status\":\"error\",\"error_code\":\"CLOSE_REFUSED\"," + + "\"error_detail\":\"refusing to close the loader's own chart\""; + else if(ChartClose(cid)) + result += "\"status\":\"ok\""; + else + result += "\"status\":\"error\",\"error_code\":\"CLOSE_FAILED\"," + + "\"error_detail\":\"err=" + + IntegerToString(GetLastError()) + "\""; + } + else + { + result += "\"status\":\"error\",\"error_code\":\"UNKNOWN_ACTION\"," + + "\"error_detail\":\"" + JsonEscape(action) + "\""; + } + result += "}"; + + WriteFileAtomic(CHARTCTL_DIR + "\\command_result.json", result); + DeleteFileSafe(CHARTCTL_DIR + "\\command.json"); +} + +//+------------------------------------------------------------------+ +//| Write observed.json — the API's window into terminal truth. | +//+------------------------------------------------------------------+ +void CChartControl::WriteObserved(ChartCtlDeployment &desired[], + ChartCtlChart &charts[]) +{ + string j = "{"; + j += "\"protocol\":" + IntegerToString(CHARTCTL_PROTOCOL) + ","; + j += "\"loader\":{"; + j += "\"name\":\"" + JsonEscape(MQLInfoString(MQL_PROGRAM_NAME)) + "\","; + j += "\"version\":\"" + CHARTCTL_VERSION + "\","; + j += "\"last_loop\":\"" + TimeToString(TimeGMT(), TIME_DATE|TIME_SECONDS) + "\","; + j += "\"applied_revision\":" + IntegerToString(m_applied_revision); + j += "},"; + j += "\"terminal\":{\"auto_trading\":" + + (string)(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) ? "true" : "false") + + "},"; + + // charts[] + j += "\"charts\":["; + for(int i = 0; i < ArraySize(charts); i++) + { + if(i) j += ","; + j += "{"; + j += "\"chart_id\":" + IntegerToString(charts[i].chart_id) + ","; + j += "\"symbol\":\"" + JsonEscape(charts[i].symbol) + "\","; + j += "\"timeframe\":\"" + JsonEscape(charts[i].timeframe) + "\","; + j += "\"expert\":\"" + JsonEscape(charts[i].expert) + "\","; + j += "\"expert_enabled\":" + (string)(charts[i].expert_enabled ? "true" : "false") + ","; + j += "\"deployment_id\":\"" + JsonEscape(charts[i].deployment_id) + "\""; + j += "}"; + } + j += "],"; + + // deployments[] status + j += "\"deployments\":["; + int written = 0; + for(int d = 0; d < ArraySize(desired); d++) + { + long cid = FindChartFor(desired[d].id, charts); + string status = (cid >= 0) ? "running" + : (desired[d].enabled ? "pending" : "paused"); + if(written) j += ","; + j += "{\"id\":\"" + JsonEscape(desired[d].id) + "\","; + j += "\"status\":\"" + status + "\""; + if(cid >= 0) j += ",\"chart_id\":" + IntegerToString(cid); + j += "}"; + written++; + } + j += "],"; + + // errors[] — one entry per failing deployment, cleared on its success + j += "\"errors\":["; + for(int e = 0; e < ArraySize(m_err_ids); e++) + { + if(e) j += ","; + j += "{\"id\":\"" + JsonEscape(m_err_ids[e]) + "\","; + j += "\"status\":\"failed\","; + j += "\"code\":\"" + JsonEscape(m_err_codes[e]) + "\","; + j += "\"detail\":\"" + JsonEscape(m_err_details[e]) + "\"}"; + } + j += "]"; + + j += "}"; + WriteFileAtomic(CHARTCTL_DIR + "\\observed.json", j); +} + +//+------------------------------------------------------------------+ +void CChartControl::RecordError(const string id, const string code, + const string detail) +{ + int slot = -1; + for(int i = 0; i < ArraySize(m_err_ids); i++) + if(m_err_ids[i] == id) { slot = i; break; } + if(slot < 0) + { + slot = ArraySize(m_err_ids); + ArrayResize(m_err_ids, slot + 1); + ArrayResize(m_err_codes, slot + 1); + ArrayResize(m_err_details, slot + 1); + ArrayResize(m_err_times, slot + 1); + } + m_err_ids[slot] = id; + m_err_codes[slot] = code; + m_err_details[slot] = detail; + m_err_times[slot] = TimeCurrent(); + PrintFormat("ChartControl ERROR [%s] %s: %s", id, code, detail); +} + +void CChartControl::ClearError(const string id) +{ + for(int i = 0; i < ArraySize(m_err_ids); i++) + { + if(m_err_ids[i] != id) + continue; + int last = ArraySize(m_err_ids) - 1; + m_err_ids[i] = m_err_ids[last]; + m_err_codes[i] = m_err_codes[last]; + m_err_details[i] = m_err_details[last]; + m_err_times[i] = m_err_times[last]; + ArrayResize(m_err_ids, last); + ArrayResize(m_err_codes, last); + ArrayResize(m_err_details, last); + ArrayResize(m_err_times, last); + return; + } +} + +// A deployment that just failed to attach gets a 60s cooldown so the +// loader doesn't churn ChartOpen/ChartClose on every reconcile pass. +bool CChartControl::InRetryCooldown(const string id) +{ + for(int i = 0; i < ArraySize(m_err_ids); i++) + if(m_err_ids[i] == id) + return (TimeCurrent() - m_err_times[i]) < 60; + return false; +} + +//+------------------------------------------------------------------+ +//| File helpers — everything under MQL5\Files\ (FILE_COMMON off). | +//+------------------------------------------------------------------+ +bool CChartControl::ReadFile(const string relpath, string &out) +{ + int h = FileOpen(relpath, FILE_READ | FILE_TXT | FILE_ANSI); + if(h == INVALID_HANDLE) + return false; + out = ""; + while(!FileIsEnding(h)) + out += FileReadString(h); + FileClose(h); + return true; +} + +bool CChartControl::WriteFileAtomic(const string relpath, const string content) +{ + string tmp = relpath + ".tmp"; + int h = FileOpen(tmp, FILE_WRITE | FILE_TXT | FILE_ANSI); + if(h == INVALID_HANDLE) + { + PrintFormat("ChartControl: cannot open %s for write (err=%d)", + tmp, GetLastError()); + return false; + } + FileWriteString(h, content); + FileClose(h); + // FileMove with rewrite flag = atomic-ish replace on Windows. Without + // FILE_REWRITE the move needs the pre-delete to have worked, and that + // fails with 5020 whenever the API side has the file open for a read. + if(!FileMove(tmp, 0, relpath, FILE_REWRITE)) + { + PrintFormat("ChartControl: FileMove %s->%s failed (err=%d)", + tmp, relpath, GetLastError()); + return false; + } + return true; +} + +void CChartControl::DeleteFileSafe(const string relpath) +{ + if(FileIsExist(relpath)) + FileDelete(relpath); +} + +//+------------------------------------------------------------------+ +//| Minimal JSON readers for our own compact, predictable output. | +//| NOT a general parser — only the shapes chartctl produces. | +//+------------------------------------------------------------------+ +string CChartControl::JsonStr(const string key, const string def, + const string json) +{ + string needle = "\"" + key + "\""; + int p = StringFind(json, needle); + if(p < 0) return def; + int colon = StringFind(json, ":", p + StringLen(needle)); + if(colon < 0) return def; + int q1 = StringFind(json, "\"", colon + 1); + if(q1 < 0) return def; + // find unescaped closing quote + int i = q1 + 1; + string val = ""; + while(i < StringLen(json)) + { + ushort ch = StringGetCharacter(json, i); + if(ch == '\\') + { + if(i + 1 < StringLen(json)) + val += ShortToString(StringGetCharacter(json, i + 1)); + i += 2; + continue; + } + if(ch == '"') + break; + val += ShortToString(ch); + i++; + } + return val; +} + +long CChartControl::JsonNum(const string key, const string json) +{ + string needle = "\"" + key + "\""; + int p = StringFind(json, needle); + if(p < 0) return 0; + int colon = StringFind(json, ":", p + StringLen(needle)); + if(colon < 0) return 0; + int i = colon + 1; + string num = ""; + while(i < StringLen(json)) + { + ushort ch = StringGetCharacter(json, i); + if((ch >= '0' && ch <= '9') || ch == '-') + num += ShortToString(ch); + else if(num != "") + break; + i++; + } + return (long)StringToInteger(num); +} + +//+------------------------------------------------------------------+ +//| Extract the deployments[] array from desired.json. | +//| Each object: {id,expert,template,symbol,timeframe,enabled}. | +//+------------------------------------------------------------------+ +bool CChartControl::ExtractDeployments(const string json, + ChartCtlDeployment &out[]) +{ + ArrayResize(out, 0); + int arr = StringFind(json, "\"deployments\""); + if(arr < 0) return false; + int i = StringFind(json, "[", arr); + if(i < 0) return false; + + int depth = 0; + int obj_start = -1; + for(; i < StringLen(json); i++) + { + ushort ch = StringGetCharacter(json, i); + if(ch == '{') + { + if(depth == 0) obj_start = i; + depth++; + } + else if(ch == '}') + { + depth--; + if(depth == 0 && obj_start >= 0) + { + string obj = StringSubstr(json, obj_start, i - obj_start + 1); + ChartCtlDeployment d; + d.id = JsonStr("id", "", obj); + d.expert = JsonStr("expert", "", obj); + d.templ = JsonStr("template", "", obj); + d.symbol = JsonStr("symbol", "", obj); + d.timeframe = JsonStr("timeframe", "", obj); + // enabled is a bare JSON bool; desired.json emits it compactly. + d.enabled = (StringFind(obj, "\"enabled\": false") < 0 + && StringFind(obj, "\"enabled\":false") < 0); + if(d.id != "") + { + int n = ArraySize(out); + ArrayResize(out, n + 1); + out[n] = d; + } + obj_start = -1; + } + } + else if(ch == ']' && depth == 0) + break; + } + return true; +} + +string CChartControl::JsonEscape(const string s) +{ + string out = s; + StringReplace(out, "\\", "\\\\"); + StringReplace(out, "\"", "\\\""); + StringReplace(out, "\n", " "); + StringReplace(out, "\r", " "); + return out; +} + +//+------------------------------------------------------------------+ +ENUM_TIMEFRAMES CChartControl::TF(const string s) +{ + if(s == "M1") return PERIOD_M1; + if(s == "M2") return PERIOD_M2; + if(s == "M3") return PERIOD_M3; + if(s == "M4") return PERIOD_M4; + if(s == "M5") return PERIOD_M5; + if(s == "M6") return PERIOD_M6; + if(s == "M10") return PERIOD_M10; + if(s == "M12") return PERIOD_M12; + if(s == "M15") return PERIOD_M15; + if(s == "M20") return PERIOD_M20; + if(s == "M30") return PERIOD_M30; + if(s == "H1") return PERIOD_H1; + if(s == "H2") return PERIOD_H2; + if(s == "H3") return PERIOD_H3; + if(s == "H4") return PERIOD_H4; + if(s == "H6") return PERIOD_H6; + if(s == "H8") return PERIOD_H8; + if(s == "H12") return PERIOD_H12; + if(s == "D1") return PERIOD_D1; + if(s == "W1") return PERIOD_W1; + if(s == "MN1") return PERIOD_MN1; + return PERIOD_H1; +} +//+------------------------------------------------------------------+ diff --git a/config/config.yaml.example b/config/config.yaml.example index 79bddb6..bc4d295 100644 --- a/config/config.yaml.example +++ b/config/config.yaml.example @@ -25,6 +25,19 @@ tailscale: auth_key: "" # leave empty to disable the tailscale sidecar entirely login_server: "" # Headscale login server URL; empty = Tailscale cloud +# Chart Deployments (chartctl) — EA hosting primitives. Stage .ex5/.set +# artifacts and declare "run expert X with set Y on symbol S timeframe T" +# as desired state; a resident loader EA (assets/experts/MT5ChartLoader.mq5, +# or your own EA using assets/experts/include/ChartControl.mqh) reconciles +# the terminal's charts to it. Live-mode terminals only; backtest-mode +# terminals ignore this entirely. See docs/chart-control-protocol.md. +chartctl: + enabled: true # false = chartctl endpoints return 404 + reconcile_hint_interval: "5s" # written into desired.json for the loader + observed_stale_after: "60s" # observed.json older than this = loader stale + command_timeout: "30s" # wait for screenshot/one-shot loader replies + max_upload_bytes: 16777216 # 16 MB cap on .ex5/.set uploads + # Extra pip packages installed in the VM on every boot. # MetaTrader5, flask, waitress, and flask-compress are always installed. requirements: [] diff --git a/docs/chart-control-protocol.md b/docs/chart-control-protocol.md new file mode 100644 index 0000000..5df07b0 --- /dev/null +++ b/docs/chart-control-protocol.md @@ -0,0 +1,226 @@ +# Chart Control Protocol v1 + +How mt5-httpapi's **Chart Deployments** feature attaches Expert Advisors to +charts remotely, keeps them running, and reports what's actually live — +without RDP, without restarting terminals, and without any orchestrator. + +MT5 has no SDK call to attach an EA to a chart. The only programmatic path +is `ChartApplyTemplate()` from MQL5 code already running inside the +terminal. So the API and a small **resident loader EA** cooperate over a +handful of JSON files in the terminal's `MQL5\Files\chartctl\` sandbox. + +The protocol is intentionally file-based so that: + +- it needs zero WebRequest whitelist entries (works on locked-down terminals), +- it's trivially debuggable over RDP during rollout, and +- **any** EA can implement it — the bundled `MT5ChartLoader`, or your own + resident utility EA (e.g. an account tracker) that adopts + `ChartControl.mqh`. + +--- + +## Roles + +| Side | Writes | Reads | +|------|--------|-------| +| **API** (mt5-httpapi) | `desired.json`, `command.json`, generated `.tpl` files | `observed.json`, `command_result.json` | +| **Loader EA** (in terminal) | `observed.json`, `command_result.json`, screenshots | `desired.json`, `command.json` | + +The API owns *desired state*. The loader owns *observed truth*. Neither +writes the other's files. Success is defined as **observed converging on +desired**, never as "the API copied some files." + +--- + +## Files (all under `MQL5\Files\chartctl\`) + +### `desired.json` — API → loader + +```json +{ + "protocol": 1, + "revision": 42, + "updated_at": "2026-07-09T12:00:00Z", + "reconcile_interval": 5, + "deployments": [ + { + "id": "dep_a1b2c3", + "expert": "HappyGoldScalp", + "template": "\\Files\\chartctl\\dep_a1b2c3.tpl", + "symbol": "XAUUSD", + "timeframe": "M5", + "enabled": true + } + ] +} +``` + +`revision` is a monotonic counter; the loader can skip a full parse when it +hasn't changed. `template` is passed verbatim to `ChartApplyTemplate()`; +the leading backslash makes MT5 resolve it against `\MQL5` — the +only search root that doesn't depend on which EX5 hosts the loader +(paths without a leading backslash resolve relative to the calling EX5's +own folder, and the `templates\` GUI directory is never searched). The +API generates one `.tpl` per deployment, written into the +`MQL5\Files\chartctl\` protocol directory. + +### `observed.json` — loader → API (rewritten every reconcile pass, ~5s) + +```json +{ + "protocol": 1, + "loader": { "name": "MT5ChartLoader", "version": "1.0.0", + "last_loop": "2026-07-09 12:00:03", "applied_revision": 42 }, + "terminal": { "auto_trading": true }, + "charts": [ + { "chart_id": 133039117, "symbol": "XAUUSD", "timeframe": "PERIOD_M5", + "expert": "HappyGoldScalp", "expert_enabled": true, + "deployment_id": "dep_a1b2c3" } + ], + "deployments": [ + { "id": "dep_a1b2c3", "status": "running", "chart_id": 133039117 } + ], + "errors": [] +} +``` + +`applied_revision == desired.revision` **and** deployment `status: running` +is the only definition of a converged deployment. The API's +`GET /deployments` merges the two files and derives per-deployment status +(`pending → running → degraded → failed → paused`). + +### `command.json` / `command_result.json` — one-shot imperatives + +For operations that produce an artifact rather than converge state +(currently `screenshot`, `close_chart`, and a `reconcile` nudge). One +command in flight; the loader writes the result keyed by `command_id` and +deletes the command. + +`close_chart` closes an arbitrary chart by `chart_id` (from the observed +charts list) — the cleanup escape hatch for charts the loader cannot +attribute. The loader refuses (`CLOSE_REFUSED`) to close its own chart. + +--- + +## Loader responsibilities + +Every pass (timer-driven, ~1s), the owning loader: + +1. Reads `desired.json`; if `revision` changed, reconciles. +2. **Reconcile** = diff desired deployments against actual charts: + - Enabled deployment with no matching chart → first try to **adopt** an + unowned chart already running the exact expert + symbol + timeframe + (stamp it `chartctl:`); only if none exists, `SymbolSelect` → + `ChartOpen` → `ChartApplyTemplate` → verify `CHART_EXPERT_NAME` + within 10s → stamp `chartctl:` into the chart comment. Stamps + are verified by read-back (`ChartSetString` is asynchronous); a + failed attach closes the chart it opened and backs off 60s. + - A chart it owns (comment starts `chartctl:`) whose deployment is gone + or disabled → `ChartClose`. + - Charts it doesn't own are **reported but never touched** by + reconcile (an explicit `close_chart` command can close them). +3. Writes `observed.json`. +4. Answers any pending `command.json`. + +### Rules + +- The loader **never calls trade functions**. Chart lifecycle only. +- Exactly **one** loader per terminal, guarded by a terminal + `GlobalVariable` mutex (`chartctl_loader_owner`). A second loader detects + the live mutex and stays passive, reclaiming only if the owner vanishes. +- All file writes are atomic (temp + `FileMove`). +- Attribution is by the `chartctl:` chart comment the loader sets at + attach time. The comment does **not** reliably survive a terminal + restart (observed live: MT5's saved profile restores the chart and + expert but drops the comment, leaking one duplicate chart per reboot), + which is why reconcile adopts exact-match unowned charts instead of + trusting the comment alone. + +--- + +## Self-healing + +Three layers converge a terminal back to desired state after any restart +(including the optional `reboot_interval` VM reboots): + +1. **MT5 native chart restoration** brings back charts + attached experts + from the last saved profile — often everything, for free. +2. **Loader reconciliation** repairs whatever native restoration missed + (crash before profile save, chart closed by hand, failed `OnInit`). +3. **Watchdog** (`monitor.py`) logs loudly if the terminal is alive but the + loader's `last_loop` goes stale — the one state layers 1–2 can't fix + alone. + +--- + +## Implementing the protocol in your own EA + +The whole loader is a portable include. In your resident EA: + +```mql5 +#include +CChartControl ctl; + +int OnInit() { if(!ctl.Init()) return INIT_FAILED; + EventSetTimer(1); return INIT_SUCCEEDED; } +void OnTimer(){ ctl.Tick(); } +void OnDeinit(const int r){ ctl.Deinit(); } +``` + +That's it — your account tracker (or any always-on EA) becomes the loader, +so one resident EA does telemetry *and* chart deployment instead of two. The +mutex makes running both your EA and the standalone `MT5ChartLoader` +degrade safely. See `assets/experts/MT5ChartLoader.mq5` for the reference +glue and `assets/experts/include/ChartControl.mqh` for the implementation. + +--- + +## Bootstrapping the loader + +**Zero-touch (default).** Provisioning does everything — no RDP, no manual +attach, fully API/config-driven: + +1. On VM boot, `start.bat` runs `compile-chartctl-loader.bat`, which copies + `ChartControl.mqh` + `MT5ChartLoader.mq5` into every broker base + terminal, compiles with that base's MetaEditor64, and propagates the + `.ex5` into every existing terminal instance (new instances inherit it + from the base copy). +2. `config_helper.py` writes a `[StartUp] Expert=Advisors\MT5ChartLoader` + section into each terminal's generated `mt5start.ini` — so the terminal + attaches the loader itself at every launch. The startup chart symbol + honors the terminal's `symbol_suffix` (e.g. `EURUSD.r`). +3. The `[StartUp]` line re-fires on every launch (including the periodic + `reboot_interval` reboots); the GlobalVariable mutex makes this + idempotent — a duplicate loader closes its own chart and vanishes, so + charts never accumulate. + +Both steps honor the same gating as the API: live-mode terminals only, +`chartctl.enabled` globally, per-terminal `chartctl: false` opts out. + +**Manual (fallback / existing fleets).** Drag `MT5ChartLoader` onto any +chart once over RDP, or fold `ChartControl.mqh` into a resident EA you +already deploy. + +--- + +## Endpoint summary + +| Method | Path | Purpose | +|--------|------|---------| +| `POST` | `/experts` | Upload `.ex5` (multipart) | +| `GET` | `/experts` | List staged experts | +| `DELETE` | `/experts/` | Remove staged expert (refused if in use) | +| `POST` | `/sets` | Upload `.set` (returns parsed inputs) | +| `GET` | `/sets`, `/sets/` | List / inspect set files | +| `POST` | `/deployments` | Declare a deployment (EA+set+symbol+TF) | +| `GET` | `/deployments`, `/deployments/` | Desired ⋈ observed status | +| `PATCH` | `/deployments/` | Change set file or pause/resume | +| `DELETE` | `/deployments/` | Remove a deployment | +| `POST` | `/deployments/reconcile` | Force the loader to re-reconcile | +| `GET` | `/charts` | Live chart/EA inventory from the terminal | +| `GET` | `/loader` | Loader presence/version/liveness | +| `POST` | `/charts//screenshot` | PNG of a chart | +| `POST` | `/charts//close` | Close a chart (incl. unattributed ones) | + +All routes sit behind the terminal's existing per-account route prefix and +bearer-token auth. Nothing here touches the MT5 SDK lock. diff --git a/examples/chartctl/deploy.sh b/examples/chartctl/deploy.sh new file mode 100755 index 0000000..e95a6f8 --- /dev/null +++ b/examples/chartctl/deploy.sh @@ -0,0 +1,76 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Chart Deployments — example workflow +# Stage an expert + set, deploy to a chart, verify, then tear down. +# +# Usage: +# export MT5_API_URL=http://localhost:8888/yourbroker/yourlogin +# export MT5_API_TOKEN=your-api-token +# ./deploy.sh +# +# Example: +# ./deploy.sh ~/EAs/MyScalp.ex5 ~/EAs/eurusd-m5.set EURUSD M5 + +MT5_API_URL="${MT5_API_URL:?Set MT5_API_URL}" +MT5_API_TOKEN="${MT5_API_TOKEN:-}" +AUTH=() +if [ -n "$MT5_API_TOKEN" ]; then + AUTH=(-H "Authorization: Bearer $MT5_API_TOKEN") +fi + +EXPERT_PATH="${1:?Usage: deploy.sh }" +SET_PATH="${2:?}" +SYMBOL="${3:?}" +TIMEFRAME="${4:?}" +EXPERT_NAME=$(basename "$EXPERT_PATH") +SET_NAME=$(basename "$SET_PATH") + +echo "=== Step 1: Stage expert ===" +curl -sS "${AUTH[@]}" -F "expert=@$EXPERT_PATH" "$MT5_API_URL/experts" | head -c 200 +echo + +echo "=== Step 2: Stage set file ===" +curl -sS "${AUTH[@]}" -F "set=@$SET_PATH" "$MT5_API_URL/sets" | head -c 200 +echo + +echo "=== Step 3: Create deployment ===" +DEPLOY_JSON=$(curl -sS -X POST "${AUTH[@]}" \ + -H "Content-Type: application/json" \ + "$MT5_API_URL/deployments" \ + -d "{\"expert\":\"$EXPERT_NAME\",\"set\":\"$SET_NAME\",\"symbol\":\"$SYMBOL\",\"timeframe\":\"$TIMEFRAME\"}") +echo "$DEPLOY_JSON" | head -c 300 +echo +DEPLOY_ID=$(echo "$DEPLOY_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])" 2>/dev/null || echo "") + +if [ -z "$DEPLOY_ID" ]; then + echo "Failed to extract deployment id from response." + exit 1 +fi + +echo "=== Step 4: Poll until running (up to 60s) ===" +for i in $(seq 1 12); do + sleep 5 + STATUS=$(curl -sS "${AUTH[@]}" "$MT5_API_URL/deployments/$DEPLOY_ID" \ + | python3 -c "import sys,json; print(json.load(sys.stdin).get('status','unknown'))" 2>/dev/null || echo "unknown") + echo " Attempt $i: status=$STATUS" + if [ "$STATUS" = "running" ]; then + echo "=== Deployment running! ===" + break + fi +done + +echo "=== Step 5: Verify via /charts ===" +curl -sS "${AUTH[@]}" "$MT5_API_URL/charts" | python3 -m json.tool | head -30 + +echo "=== Step 6: Take a screenshot ===" +CHART_ID=$(curl -sS "${AUTH[@]}" "$MT5_API_URL/charts" \ + | python3 -c "import sys,json; charts=json.load(sys.stdin).get('charts',[]); print([c['id'] for c in charts if c.get('deployment_id')=='$DEPLOY_ID'][0])" 2>/dev/null || echo "") +if [ -n "$CHART_ID" ]; then + curl -sS "${AUTH[@]}" "$MT5_API_URL/charts/$CHART_ID/screenshot" -o "chartctl-${SYMBOL}-${TIMEFRAME}.png" + echo "Screenshot saved to chartctl-${SYMBOL}-${TIMEFRAME}.png" +fi + +echo "=== Done ===" +echo "Deployment $DEPLOY_ID is running. Clean up with:" +echo " curl -X DELETE ${AUTH[@]} \"$MT5_API_URL/deployments/$DEPLOY_ID\"" diff --git a/mt5api/chartctl/__init__.py b/mt5api/chartctl/__init__.py new file mode 100644 index 0000000..96ea4a7 --- /dev/null +++ b/mt5api/chartctl/__init__.py @@ -0,0 +1,14 @@ +"""Chart Deployments (chartctl) — EA deployment primitives. + +Generic, orchestrator-agnostic capability: stage .ex5/.set artifacts, +declare desired deployments (expert + set + symbol + timeframe), and let a +resident loader EA reconcile the terminal's charts to that desired state +over a file protocol inside the MQL5 sandbox. + +Protocol contract: docs/chart-control-protocol.md +Reference loader: assets/experts/MT5ChartLoader.mq5 (+ ChartControl.mqh) + +Nothing in this package touches the MT5 SDK — every operation is plain +file I/O against TERMINAL_DIR, so no handler here ever queues behind the +process-wide MT5 lock. +""" diff --git a/mt5api/chartctl/autoit_webrequest.py b/mt5api/chartctl/autoit_webrequest.py new file mode 100644 index 0000000..a2da97f --- /dev/null +++ b/mt5api/chartctl/autoit_webrequest.py @@ -0,0 +1,240 @@ +"""Apply the WebRequest allowlist by driving MT5's Options dialog with AutoIt. + +Why not just write the file? On the dockur-VM terminal build the allowlist is +NOT stored in (or read back from) ``common.ini`` — it lives in the machine-bound +``MQL5\\experts.dat`` and does not survive a terminal restart even when set in +MT5's own Options dialog. So file injection can't provision it there. Instead we +set it the way a user would: open Tools -> Options -> Expert Advisors and add the +URLs. WebRequest then works immediately in-session (verified with a probe EA: +``ret=200`` on an allowed URL). Because MT5 drops the list on restart, this is a +re-appliable operation (a dedicated call, plus an optional boot re-apply). + +The heavy lifting is a portable AutoIt interpreter + script shipped under +``assets/autoit/`` (live-mounted into the VM). MT5 runs elevated (``-Verb RunAs``) +and Windows UIPI blocks a non-elevated process from sending it input — but the API +process itself already runs elevated here (verified: AutoIt reports ``IsAdmin=1``), +so a plain, blocking ``subprocess.run`` inherits that elevation, drives MT5 fine, +and lets us capture the exit code. A ``use_runas`` path (async ``Start-Process +-Verb RunAs`` + log polling) is kept as a fallback for non-elevated deployments. +""" +from __future__ import annotations + +import contextlib +import os +import re +import subprocess +import time + +from mt5api.config import ACCOUNT, ASSETS_DIR, BROKER, INI_FILE, INSTANCE, TERMINAL_DIR +from mt5api.logger import log + +AUTOIT_DIR = os.path.join(ASSETS_DIR, "autoit") +AUTOIT_EXE = os.path.join(AUTOIT_DIR, "AutoIt3_x64.exe") + +_LOG_NAME = "webrequest_autoit.log" +_URLS_NAME = "webrequest_apply_urls.txt" + +# Machine-wide mutex serializing GUI automation across every terminal's API +# process on this host (see _gui_lock). +_GUI_MUTEX_NAME = "Global\\mt5_httpapi_webrequest_autoit" +_GUI_LOCK_WAIT_MS = 180_000 # 3 min — comfortably longer than any real apply + + +@contextlib.contextmanager +def _gui_lock(wait_ms: int = _GUI_LOCK_WAIT_MS): + """Serialize GUI automation across all terminal API processes on this host. + + Desktop input (window focus + the keyboard) is a single shared resource, so + two AutoIt applies running at once would steal focus from each other and leak + keystrokes into the wrong terminal — even producing a RESULT=OK that typed a + URL into the wrong window. Each terminal runs its own API *process*, so an + in-process ``threading.Lock`` is not enough; we take a named Windows kernel + mutex, which is machine-wide. It is crash-safe: if a holder dies, the kernel + hands ownership to the next waiter (WAIT_ABANDONED), so there is no stale + lock. On wait-timeout we proceed anyway (URLs are needed and 3 min means + something is wedged, not merely busy). No-op off Windows.""" + if os.name != "nt": + yield True + return + import ctypes + from ctypes import wintypes + + k = ctypes.windll.kernel32 + k.CreateMutexW.restype = wintypes.HANDLE + k.CreateMutexW.argtypes = (wintypes.LPVOID, wintypes.BOOL, wintypes.LPCWSTR) + k.WaitForSingleObject.argtypes = (wintypes.HANDLE, wintypes.DWORD) + handle = k.CreateMutexW(None, False, _GUI_MUTEX_NAME) + owned = False + try: + if handle: + res = k.WaitForSingleObject(handle, wait_ms) + owned = res in (0x0, 0x80) # WAIT_OBJECT_0 / WAIT_ABANDONED + if not owned: + log.warning("WebRequest GUI lock: wait timed out (%d ms); proceeding", wait_ms) + else: + log.warning("WebRequest GUI lock: CreateMutex failed; proceeding unlocked") + yield owned + finally: + if handle: + if owned: + k.ReleaseMutex(handle) + k.CloseHandle(handle) + + +def _resolve_script(script: str) -> str: + """Only run a plain-named .au3 that actually exists in AUTOIT_DIR (the + read-only, repo-controlled mount) — no path separators, no traversal.""" + if os.path.basename(script) != script or not script.lower().endswith(".au3"): + raise ValueError(f"bad script name: {script}") + path = os.path.join(AUTOIT_DIR, script) + if not os.path.exists(path): + raise ValueError(f"script not found: {script}") + return path + + +def available() -> bool: + """True only on Windows with the AutoIt interpreter present (i.e. the VM). + The .exe ships in the repo for all platforms, but only runs under Windows, + so gate on the OS too — elsewhere the caller uses the common.ini fallback.""" + return os.name == "nt" and os.path.exists(AUTOIT_EXE) + + +def _window_match() -> str: + """A token guaranteed to appear in this terminal's window title: the login + (read lock-free from mt5start.ini). Falls back to the broker name.""" + try: + with open(INI_FILE, "r", encoding="utf-8", errors="ignore") as f: + for line in f: + if line.strip().lower().startswith("login="): + val = line.split("=", 1)[1].strip() + if val: + return val + except OSError: + pass + return BROKER + + +def _terminal_pid() -> int: + """PID of THIS terminal's terminal64.exe, resolved by executable path. + + The window title (login) is ambiguous — cloned terminals of the same + account have identical titles — so the pid is what actually pins the right + window for the AutoIt script. WMI via PowerShell, because it can read exe + paths of elevated processes. Returns 0 if not found (script falls back to + title matching).""" + if ACCOUNT: + path_filter = f"*\\{BROKER}\\{ACCOUNT}\\{INSTANCE}\\*" + else: + path_filter = f"*\\{BROKER}\\*" + ps_cmd = ( + "Get-WmiObject Win32_Process -Filter \"Name='terminal64.exe'\" " + "| Where-Object { $_.ExecutablePath -like '" + path_filter + "' } " + "| Select-Object -First 1 -ExpandProperty ProcessId" + ) + try: + result = subprocess.run( + ["powershell", "-Command", ps_cmd], + capture_output=True, text=True, timeout=30, + ) + pid = int(result.stdout.strip()) + return pid if pid > 0 else 0 + except (ValueError, subprocess.SubprocessError, OSError): + log.warning("WebRequest: terminal pid lookup failed; falling back to title match") + return 0 + + +def _config_path(name: str) -> str: + return os.path.join(TERMINAL_DIR, "Config", name) + + +def _wait_result(logpath: str, timeout: float) -> tuple[str, str]: + """Poll the AutoIt log for a ``RESULT=`` line. Returns (status, log).""" + deadline = time.time() + timeout + while time.time() < deadline: + time.sleep(1) + try: + with open(logpath, "r", encoding="utf-8", errors="ignore") as f: + txt = f.read() + except OSError: + continue + m = re.search(r"RESULT=(\w+)", txt) + if m: + return m.group(1), txt + try: + with open(logpath, "r", encoding="utf-8", errors="ignore") as f: + txt = f.read() + except OSError: + txt = "" + return "TIMEOUT", txt + + +def _run_script( + script: str, extra_args: list[str], timeout: float, use_runas: bool = False +) -> tuple[str, str]: + if not available(): + raise RuntimeError(f"AutoIt interpreter not found at {AUTOIT_EXE}") + script_path = _resolve_script(script) + + logpath = _config_path(_LOG_NAME) + try: + os.remove(logpath) + except OSError: + pass + + match = _window_match() + pid = _terminal_pid() + # AutoIt argv: match, pid, extra..., logpath + au3_args = [match, str(pid), *extra_args, logpath] + log.info("AutoIt: launching %s (match=%s, pid=%d, use_runas=%s)", + script, match, pid, use_runas) + + # Hold the machine-wide GUI mutex for the whole run so no other terminal's + # apply steals focus mid-type. + with _gui_lock(): + dbg = "" + if use_runas: + # MT5 runs elevated; UIPI blocks a non-elevated process from sending + # it input. Launch elevated (async — no exit code) and poll the log. + ps_args = ",".join("'%s'" % a for a in [script_path, *au3_args]) + ps = ( + f"Start-Process '{AUTOIT_EXE}' -ArgumentList {ps_args} " + "-Verb RunAs -WindowStyle Hidden" + ) + subprocess.Popen(["powershell", "-Command", ps]) + status, txt = _wait_result(logpath, timeout) + else: + # Direct, blocking — captures exit code + stderr for diagnostics. + cmd = [AUTOIT_EXE, script_path, *au3_args] + try: + proc = subprocess.run(cmd, capture_output=True, text=True, timeout=timeout) + dbg = f"[rc={proc.returncode} stderr={proc.stderr.strip()[:300]}]" + except subprocess.TimeoutExpired: + dbg = "[rc=TIMEOUT]" + try: + with open(logpath, "r", encoding="utf-8", errors="ignore") as f: + txt = f.read() + except OSError: + txt = "" + m = re.search(r"RESULT=(\w+)", txt) + status = m.group(1) if m else "NORESULT" + + txt = (txt + "\n" + dbg).strip() + log.info("AutoIt: %s -> RESULT=%s %s", script, status, dbg) + if status not in ("OK",): + log.warning("AutoIt %s log tail:\n%s", script, txt[-800:]) + return status, txt + + +def apply_urls(urls: list[str], timeout: float = 120, use_runas: bool = False) -> tuple[str, str]: + """Set the given allowlist in the running terminal via the Options dialog. + Returns (status, autoit_log). status == 'OK' on success.""" + urlfile = _config_path(_URLS_NAME) + os.makedirs(os.path.dirname(urlfile), exist_ok=True) + with open(urlfile, "w", encoding="utf-8") as f: + f.write("\n".join(urls)) + return _run_script("set_webrequest.au3", [urlfile], timeout, use_runas) + + +def run_named(script: str, timeout: float = 60, use_runas: bool = False) -> tuple[str, str]: + """Dev helper: run an arbitrary repo-shipped .au3 (e.g. the inspector).""" + return _run_script(script, [], timeout, use_runas) diff --git a/mt5api/chartctl/command.py b/mt5api/chartctl/command.py new file mode 100644 index 0000000..6a79700 --- /dev/null +++ b/mt5api/chartctl/command.py @@ -0,0 +1,78 @@ +"""Imperative one-shot command channel (screenshot, forced refresh). + +Deploy/stop are NOT commands — they are desired-state edits handled by +registry.py. This channel exists only for operations that produce a +side-effect artifact rather than converge state. + +Protocol: API writes command.json {command_id, action, ...}; loader +executes, writes command_result.json {command_id, status, ...}, deletes +command.json. API polls for the result up to a timeout. One command in +flight at a time, serialized by a lock (matching the loader's +one-command contract). +""" +import json +import os +import secrets +import threading +import time + +from mt5api.chartctl import paths +from mt5api.config import CHARTCTL_COMMAND_TIMEOUT_SECONDS + +_LOCK = threading.Lock() + + +class LoaderTimeout(TimeoutError): + pass + + +class LoaderBusy(RuntimeError): + pass + + +def run_command(action: str, payload: dict | None = None, + timeout: float | None = None) -> dict: + """Write a command, block until its result arrives or timeout.""" + timeout = timeout or CHARTCTL_COMMAND_TIMEOUT_SECONDS + if not _LOCK.acquire(blocking=False): + raise LoaderBusy("another command is in flight") + try: + paths.ensure_dirs() + if os.path.exists(paths.COMMAND_PATH): + # Stale command from a crashed request: clear it. + _try_remove(paths.COMMAND_PATH) + _try_remove(paths.COMMAND_RESULT_PATH) + + command_id = "cmd_" + secrets.token_hex(4) + body = {"command_id": command_id, "action": action} + body.update(payload or {}) + paths.atomic_write_text(paths.COMMAND_PATH, + json.dumps(body, indent=2, sort_keys=True)) + + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + result = _read_result() + if result and result.get("command_id") == command_id: + _try_remove(paths.COMMAND_RESULT_PATH) + return result + time.sleep(0.25) + _try_remove(paths.COMMAND_PATH) + raise LoaderTimeout( + f"loader did not answer '{action}' within {timeout:.0f}s") + finally: + _LOCK.release() + + +def _read_result() -> dict | None: + try: + with open(paths.COMMAND_RESULT_PATH, "r", encoding="utf-8") as handle: + return json.load(handle) + except (OSError, ValueError): + return None + + +def _try_remove(path: str) -> None: + try: + os.remove(path) + except OSError: + pass diff --git a/mt5api/chartctl/paths.py b/mt5api/chartctl/paths.py new file mode 100644 index 0000000..15995ec --- /dev/null +++ b/mt5api/chartctl/paths.py @@ -0,0 +1,82 @@ +"""Directory layout and filename safety for chartctl. + +All chartctl writes are confined to four roots under TERMINAL_DIR: + + MQL5/Experts/Uploaded/ staged .ex5 (shared with the backtest feature) + chartctl/sets/ staged .set parameter files + chartctl/registry.json API-side desired-state registry + MQL5/Files/chartctl/ the EA-visible protocol directory, including + the generated per-deployment .tpl files — + ChartApplyTemplate only resolves paths under + the MQL5 dir (leading backslash) or relative + to the calling EX5, so templates must live here + +Every externally supplied filename passes safe_name() — same contract as +the backtest handler's _safe_basename, factored here so both artifact +endpoints and the tpl builder share one guard with one test matrix. +""" +import os +import re + +from mt5api.config import TERMINAL_DIR, ASSETS_DIR + +EXPERTS_DIR = os.path.join(TERMINAL_DIR, "MQL5", "Experts", "Uploaded") +SETS_DIR = os.path.join(TERMINAL_DIR, "chartctl", "sets") +REGISTRY_PATH = os.path.join(TERMINAL_DIR, "chartctl", "registry.json") +PROTOCOL_DIR = os.path.join(TERMINAL_DIR, "MQL5", "Files", "chartctl") +TEMPLATES_DIR = PROTOCOL_DIR +SCREENSHOTS_DIR = os.path.join(PROTOCOL_DIR, "shots") + +HOST_EXPERTS_DIR = os.path.join(ASSETS_DIR, "experts") +HOST_SETS_DIR = os.path.join(ASSETS_DIR, "sets") + +DESIRED_PATH = os.path.join(PROTOCOL_DIR, "desired.json") +OBSERVED_PATH = os.path.join(PROTOCOL_DIR, "observed.json") +COMMAND_PATH = os.path.join(PROTOCOL_DIR, "command.json") +COMMAND_RESULT_PATH = os.path.join(PROTOCOL_DIR, "command_result.json") + +# Windows-reserved characters plus anything that could smuggle a path. +_BAD_CHARS = re.compile(r'[<>:"/\\|?*\x00-\x1f]') + + +def ensure_dirs() -> None: + for d in (EXPERTS_DIR, SETS_DIR, PROTOCOL_DIR, TEMPLATES_DIR, + SCREENSHOTS_DIR, os.path.dirname(REGISTRY_PATH)): + os.makedirs(d, exist_ok=True) + + +def safe_name(name: str, field: str, required_ext: str | None = None) -> str: + """Validate an externally supplied filename. Returns the bare name. + + Rejects: empty, path separators, traversal, drive prefixes, UNC, + Windows-reserved characters, hidden dotfiles, and (optionally) a + wrong extension. Raises ValueError with a client-facing message. + """ + name = (name or "").strip() + if not name: + raise ValueError(f"{field}: filename is required") + if name != os.path.basename(name) or name in (".", ".."): + raise ValueError(f"{field}: path components are not allowed") + if _BAD_CHARS.search(name): + raise ValueError(f"{field}: illegal characters in filename") + if name.startswith("."): + raise ValueError(f"{field}: hidden files are not allowed") + if ".." in name: + raise ValueError(f"{field}: traversal sequences are not allowed") + if required_ext and not name.lower().endswith(required_ext): + raise ValueError(f"{field}: must end in {required_ext}") + return name + + +def atomic_write_text(path: str, text: str, encoding: str = "utf-8") -> None: + tmp = f"{path}.tmp" + with open(tmp, "w", encoding=encoding, newline="\r\n") as handle: + handle.write(text) + os.replace(tmp, path) + + +def atomic_write_bytes(path: str, data: bytes) -> None: + tmp = f"{path}.tmp" + with open(tmp, "wb") as handle: + handle.write(data) + os.replace(tmp, path) diff --git a/mt5api/chartctl/registry.py b/mt5api/chartctl/registry.py new file mode 100644 index 0000000..a910724 --- /dev/null +++ b/mt5api/chartctl/registry.py @@ -0,0 +1,274 @@ +"""Deployment registry: the API-side source of truth for desired state. + +Follows the backtest jobs.py pattern — persistent JSON, in-memory +write-through cache behind a lock, survives API restarts. Every mutation +bumps a monotonic `revision` and rewrites the EA-facing desired.json. + +Status model (derived, never stored as truth): + pending declared, loader has not confirmed it yet + running observed.json shows the expert live on a chart + degraded previously running, currently missing (reconciliation active) + failed loader reported a terminal error for this deployment + paused enabled=false in desired state +""" +from __future__ import annotations + +import json +import os +import secrets +import threading +import time +from datetime import datetime, timezone + +from mt5api.chartctl import paths +from mt5api.chartctl.tpl_builder import tpl_relative_name +from mt5api.config import ( + CHARTCTL_OBSERVED_STALE_SECONDS, + CHARTCTL_RECONCILE_HINT_SECONDS, +) +from mt5api.logger import log + +_LOCK = threading.Lock() +_STATE: dict | None = None # {"revision": int, "deployments": {id: {...}}} + +PROTOCOL_VERSION = 1 + + +def _now_iso() -> str: + return datetime.now(timezone.utc).replace(microsecond=0, tzinfo=None).isoformat() + "Z" + + +def new_id() -> str: + return "dep_" + secrets.token_hex(4) + + +def _empty_state() -> dict: + return {"revision": 0, "deployments": {}} + + +def _load_locked() -> dict: + global _STATE + if _STATE is not None: + return _STATE + if os.path.exists(paths.REGISTRY_PATH): + try: + with open(paths.REGISTRY_PATH, "r", encoding="utf-8") as handle: + _STATE = json.load(handle) + except (OSError, ValueError) as exc: + log.error("chartctl registry unreadable (%s) — starting empty; " + "corrupt file preserved as .bad", exc) + try: + os.replace(paths.REGISTRY_PATH, paths.REGISTRY_PATH + ".bad") + except OSError: + pass + _STATE = _empty_state() + else: + _STATE = _empty_state() + _STATE.setdefault("revision", 0) + _STATE.setdefault("deployments", {}) + return _STATE + + +def _persist_locked(state: dict) -> None: + paths.ensure_dirs() + paths.atomic_write_text(paths.REGISTRY_PATH, + json.dumps(state, indent=2, sort_keys=True)) + _write_desired_locked(state) + + +def _write_desired_locked(state: dict) -> None: + desired = { + "protocol": PROTOCOL_VERSION, + "revision": state["revision"], + "updated_at": _now_iso(), + "reconcile_interval": CHARTCTL_RECONCILE_HINT_SECONDS, + "deployments": [ + { + "id": dep["id"], + "expert": dep["expert_name"], + "template": tpl_relative_name(dep["id"]), + "symbol": dep["symbol"], + "timeframe": dep["timeframe"], + "enabled": dep.get("enabled", True), + } + for dep in sorted(state["deployments"].values(), + key=lambda d: d["created_at"]) + ], + } + paths.atomic_write_text(paths.DESIRED_PATH, + json.dumps(desired, indent=2, sort_keys=True)) + + +def list_deployments() -> list[dict]: + with _LOCK: + state = _load_locked() + return [dict(d) for d in state["deployments"].values()] + + +def get_deployment(dep_id: str) -> dict | None: + with _LOCK: + state = _load_locked() + dep = state["deployments"].get(dep_id) + return dict(dep) if dep else None + + +def add_deployment(*, expert_file: str, expert_name: str, set_file: str | None, + symbol: str, timeframe: str, enabled: bool = True) -> dict: + with _LOCK: + state = _load_locked() + for other in state["deployments"].values(): + if (other.get("enabled", True) and enabled + and other["symbol"].upper() == symbol.upper() + and other["timeframe"].upper() == timeframe.upper()): + raise DuplicateChart( + f"enabled deployment {other['id']} already targets " + f"{symbol} {timeframe}") + dep = { + "id": new_id(), + "expert_file": expert_file, + "expert_name": expert_name, + "set_file": set_file, + "symbol": symbol, + "timeframe": timeframe, + "enabled": enabled, + "created_at": _now_iso(), + "updated_at": _now_iso(), + } + state["deployments"][dep["id"]] = dep + state["revision"] += 1 + _persist_locked(state) + log.info("chartctl deployment %s created: %s %s %s (rev=%d)", + dep["id"], expert_name, symbol, timeframe, state["revision"]) + return dict(dep) + + +def update_deployment(dep_id: str, **changes) -> dict: + with _LOCK: + state = _load_locked() + dep = state["deployments"].get(dep_id) + if dep is None: + raise KeyError(dep_id) + dep.update(changes) + dep["updated_at"] = _now_iso() + state["revision"] += 1 + _persist_locked(state) + log.info("chartctl deployment %s updated (%s) rev=%d", + dep_id, ", ".join(changes), state["revision"]) + return dict(dep) + + +def remove_deployment(dep_id: str) -> dict: + with _LOCK: + state = _load_locked() + dep = state["deployments"].pop(dep_id, None) + if dep is None: + raise KeyError(dep_id) + state["revision"] += 1 + _persist_locked(state) + log.info("chartctl deployment %s removed (rev=%d)", + dep_id, state["revision"]) + return dep + + +def expert_in_use(expert_file: str) -> bool: + with _LOCK: + state = _load_locked() + return any(d["expert_file"] == expert_file + for d in state["deployments"].values()) + + +def current_revision() -> int: + with _LOCK: + return _load_locked()["revision"] + + +def rewrite_desired() -> None: + """Force-regenerate desired.json from the registry (bumps revision so + the loader re-reads even if content is identical — used by + /deployments/reconcile).""" + with _LOCK: + state = _load_locked() + state["revision"] += 1 + _persist_locked(state) + + +class DuplicateChart(ValueError): + pass + + +# ── Observed-state reading & merge ────────────────────────────────── + +def read_observed() -> tuple[dict | None, bool]: + """Return (observed_dict_or_None, is_stale).""" + try: + with open(paths.OBSERVED_PATH, "r", encoding="utf-8") as handle: + observed = json.load(handle) + except (OSError, ValueError): + return None, True + stale = True + try: + mtime = os.path.getmtime(paths.OBSERVED_PATH) + stale = (time.time() - mtime) > CHARTCTL_OBSERVED_STALE_SECONDS + except OSError: + pass + return observed, stale + + +def loader_alive(observed: dict | None, stale: bool) -> bool: + return bool(observed) and not stale and bool(observed.get("loader")) + + +def merged_view() -> dict: + """The GET /deployments payload: desired ⋈ observed.""" + observed, stale = read_observed() + obs_by_id: dict[str, dict] = {} + err_by_id: dict[str, dict] = {} + if observed: + for entry in observed.get("deployments") or []: + if entry.get("id"): + obs_by_id[entry["id"]] = entry + for entry in observed.get("errors") or []: + if entry.get("id"): + err_by_id[entry["id"]] = entry + + applied_revision = (observed or {}).get("loader", {}).get("applied_revision") + revision = current_revision() + items = [] + all_converged = True + for dep in list_deployments(): + obs = obs_by_id.get(dep["id"]) + err = err_by_id.get(dep["id"]) + status = _derive_status(dep, obs, err, stale) + if status not in ("running", "paused"): + all_converged = False + items.append({ + "id": dep["id"], + "desired": dep, + "observed": obs, + "error": err, + "status": status, + }) + + return { + "revision": revision, + "applied_revision": applied_revision, + "converged": all_converged and applied_revision == revision and not stale, + "observed_stale": stale, + "loader": (observed or {}).get("loader"), + "deployments": items, + } + + +def _derive_status(dep: dict, obs: dict | None, err: dict | None, + stale: bool) -> str: + if not dep.get("enabled", True): + return "paused" + if err and (obs is None or obs.get("status") != "running"): + return "failed" + if obs and obs.get("status") == "running" and not stale: + return "running" + if obs and obs.get("status") == "running" and stale: + return "degraded" + if obs and obs.get("status"): + return str(obs["status"]) + return "pending" diff --git a/mt5api/chartctl/setparse.py b/mt5api/chartctl/setparse.py new file mode 100644 index 0000000..8a87408 --- /dev/null +++ b/mt5api/chartctl/setparse.py @@ -0,0 +1,63 @@ +"""Parse MT5 .set parameter files into structured inputs. + +The mirror of backtest/set_builder.py (JSON -> .set); this goes .set -> +structured list. MT5 saves .set as UTF-16-LE with BOM; hand-written ones +are often UTF-8 or ASCII. Grammar per line: + + Name=value plain input + Name=value||start||step||stop||Y input with optimization metadata + ; comment + +The optimization tail is irrelevant for live deployment — the leading +value is what the terminal applies — but we keep it so clients can +round-trip and diff files losslessly. +""" + + +def _decode(data: bytes) -> str: + # Never blind-try utf-16: the codec "succeeds" on any even-length + # ASCII input by pairing bytes into CJK garbage, which then parses to + # zero inputs — and the deployment silently runs on EA defaults. + # Decide by BOM (MT5 exports carry one), then by embedded NULs + # (BOM-less UTF-16), then plain 8-bit. + if data[:2] in (b"\xff\xfe", b"\xfe\xff"): + return data.decode("utf-16") + if b"\x00" in data: + try: + return data.decode("utf-16-le") + except (UnicodeDecodeError, UnicodeError): + pass + for enc in ("utf-8-sig", "utf-8"): + try: + return data.decode(enc) + except UnicodeDecodeError: + continue + return data.decode("latin-1") + + +def parse_set_bytes(data: bytes) -> list[dict]: + return parse_set_text(_decode(data)) + + +def parse_set_text(text: str) -> list[dict]: + """Return [{name, value, optimize?, start?, step?, stop?}, ...].""" + inputs: list[dict] = [] + for raw_line in text.splitlines(): + line = raw_line.strip().lstrip("\ufeff") + if not line or line.startswith(";") or line.startswith("#"): + continue + if "=" not in line: + continue + name, _, rhs = line.partition("=") + name = name.strip() + if not name: + continue + parts = rhs.split("||") + entry: dict = {"name": name, "value": parts[0].strip()} + if len(parts) >= 5: + entry["start"] = parts[1].strip() + entry["step"] = parts[2].strip() + entry["stop"] = parts[3].strip() + entry["optimize"] = parts[4].strip().upper() == "Y" + inputs.append(entry) + return inputs diff --git a/mt5api/chartctl/tpl_builder.py b/mt5api/chartctl/tpl_builder.py new file mode 100644 index 0000000..e0cadbe --- /dev/null +++ b/mt5api/chartctl/tpl_builder.py @@ -0,0 +1,100 @@ +"""Generate per-deployment MT5 chart templates (.tpl). + +A minimal template whose block carries the expert path, flags, +and the full list translated from a parsed .set file. Applying +the template to a chart attaches the expert with those inputs — the only +programmatic attach path MT5 offers (via ChartApplyTemplate from MQL5). + +Attribution: the loader sets a chart comment `chartctl:` at attach +time — that's the authoritative cross-restart marker (MT5 persists the +comment with the saved chart). We ALSO stamp the id into the template's +`description` field and a reserved __chartctl_id input purely for human +forensics / grepping raw .tpl files; the loader does not depend on being +able to read another expert's inputs (MQL5 can't), so the comment is the +real mechanism. + +Encoding: modern terminal builds save templates as UTF-16-LE with BOM +and CRLF line endings; older builds accept the same. We always emit +UTF-16-LE + BOM. Every template carries a comment header with the +generator version and the terminal build it was generated for, so a +misbehaving attach can be forensically matched to an encoding profile. + +Known-risk note (spec §8): value encoding for enums/booleans has +build-specific quirks. Values are passed through verbatim from the .set +file, which is the safest policy: the .set was produced by the same +terminal family that will consume the template. Golden-file tests pin +the exact bytes per build. +""" +from mt5api.chartctl.paths import TEMPLATES_DIR, atomic_write_bytes + +import os + +GENERATOR_VERSION = "1.0.0" + +# EA flags observed in terminal-saved templates: allow live trading + +# allow DLL confirmations off + enabled. 343 = common "enabled, algo +# trading allowed" profile seen across builds; kept as a constant so a +# build-specific override is one line. +EXPERT_FLAGS = 343 + +# Reserved input name the loader EA reads for attribution. Harmless for +# the target expert: MT5 ignores unknown inputs in templates. +ID_INPUT = "__chartctl_id" + + +def build_tpl_text(*, deployment_id: str, expert_name: str, + expert_rel_path: str, inputs: list[dict], + terminal_build: int | None = None) -> str: + """Compose template text. expert_rel_path like 'Experts\\Uploaded\\X.ex5'.""" + lines = [ + "", + f"description=chartctl:{deployment_id} gen={GENERATOR_VERSION}" + + (f" build={terminal_build}" if terminal_build else ""), + "shift=1", + "autoscroll=1", + "ohlc=1", + "one_click=0", + "", + f"name={expert_name}", + f"path={expert_rel_path}", + f"flags={EXPERT_FLAGS}", + "expertmode=1", + "", + f"{ID_INPUT}={deployment_id}", + ] + for entry in inputs: + lines.append(f"{entry['name']}={entry['value']}") + lines += [ + "", + "", + "", + "", + ] + return "\r\n".join(lines) + + +def tpl_filename(deployment_id: str) -> str: + return f"{deployment_id}.tpl" + + +def tpl_relative_name(deployment_id: str) -> str: + """The name the loader passes to ChartApplyTemplate. The leading + backslash makes MT5 resolve it against \\MQL5 — the only + host-EA-independent root ChartApplyTemplate searches (without it the + path is relative to the calling EX5's folder, which varies per host + EA and yields err 5019 file-not-found).""" + return f"\\Files\\chartctl\\{tpl_filename(deployment_id)}" + + +def write_tpl(*, deployment_id: str, expert_name: str, expert_rel_path: str, + inputs: list[dict], terminal_build: int | None = None) -> str: + text = build_tpl_text( + deployment_id=deployment_id, + expert_name=expert_name, + expert_rel_path=expert_rel_path, + inputs=inputs, + terminal_build=terminal_build, + ) + path = os.path.join(TEMPLATES_DIR, tpl_filename(deployment_id)) + atomic_write_bytes(path, b"\xff\xfe" + text.encode("utf-16-le")) + return path diff --git a/mt5api/chartctl/webrequest.py b/mt5api/chartctl/webrequest.py new file mode 100644 index 0000000..620d136 --- /dev/null +++ b/mt5api/chartctl/webrequest.py @@ -0,0 +1,208 @@ +"""WebRequest allowlist manager for a single terminal. + +MT5's WebRequest allowed-URL list lives ONLY in ``/Config/common.ini`` +(``[Experts] WebRequest=1`` + ``WebRequestUrl=``), a UTF-16LE file that MT5 +reads at terminal startup. There is no live-reload, so applying a change requires a +terminal restart, and ``start.bat`` deletes ``common.ini`` on every boot — so the +authoritative desired state is kept in a sibling ``webrequest.json`` that survives +reboots and is re-applied to ``common.ini`` at two points: + + * boot — ``scripts/config_helper.py`` write_ini, right after start.bat deletes + common.ini and before the terminal launches; + * runtime — ``mt5client.restart_terminal``, after the terminal is killed and + before it is relaunched (MT5 rewrites common.ini on exit, so the + write must happen while the terminal is down). + +First adoption migrates from whatever the terminal currently has (decode the +existing ``WebRequestUrl=`` blob) so manually-configured URLs are preserved. + +The blob codec (fully reverse-engineered) lives in +``scripts/webrequest_allowlist_codec.py`` and is loaded here by path so it stays a +single dependency-free source of truth, importable from both the app and the boot +helper. +""" +from __future__ import annotations + +import importlib.util +import json +import os + +DESIRED_FILENAME = "webrequest.json" +_BOM = b"\xff\xfe" + +# --- load the standalone codec by path (no package coupling) --- +_REPO_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +_CODEC_PATH = os.path.join(_REPO_ROOT, "scripts", "webrequest_allowlist_codec.py") +_spec = importlib.util.spec_from_file_location("webrequest_allowlist_codec", _CODEC_PATH) +_codec = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(_codec) +encode_urls = _codec.encode_urls +decode_blob = _codec.decode_blob + + +# ── paths ──────────────────────────────────────────────────────────── +def config_dir(terminal_dir: str) -> str: + return os.path.join(terminal_dir, "Config") + + +def common_ini_path(cfg_dir: str) -> str: + return os.path.join(cfg_dir, "common.ini") + + +def desired_path(cfg_dir: str) -> str: + return os.path.join(cfg_dir, DESIRED_FILENAME) + + +# ── url hygiene ────────────────────────────────────────────────────── +def clean_urls(urls) -> list[str]: + """Trim, drop blanks/dupes, keep only http(s) URLs without the ';' delimiter.""" + out: list[str] = [] + if not isinstance(urls, (list, tuple)): + return out + for u in urls: + if not isinstance(u, str): + continue + u = u.strip() + if not u or ";" in u or any(ord(c) < 0x20 for c in u): + continue + low = u.lower() + if not (low.startswith("http://") or low.startswith("https://")): + continue + if u not in out: + out.append(u) + return out + + +# ── desired-state store (survives reboots) ─────────────────────────── +def load_desired(cfg_dir: str) -> list[str] | None: + """Return the persisted URL list, or None if this terminal has none set.""" + path = desired_path(cfg_dir) + if not os.path.exists(path): + return None + try: + with open(path, "r", encoding="utf-8") as f: + data = json.load(f) + except (OSError, ValueError): + return None + urls = data.get("urls") if isinstance(data, dict) else data + return clean_urls(urls) if isinstance(urls, list) else None + + +def save_desired(cfg_dir: str, urls: list[str]) -> None: + os.makedirs(cfg_dir, exist_ok=True) + path = desired_path(cfg_dir) + tmp = path + ".tmp" + with open(tmp, "w", encoding="utf-8") as f: + json.dump({"urls": clean_urls(urls)}, f, indent=2) + os.replace(tmp, path) + + +# ── common.ini (UTF-16LE + BOM + CRLF) ─────────────────────────────── +def _read_lines(path: str) -> list[str]: + if not os.path.exists(path): + return [] + try: + with open(path, "rb") as f: + raw = f.read() + except OSError: + return [] + text = raw.decode("utf-16", errors="ignore") # strips BOM + return text.replace("\r\n", "\n").replace("\r", "\n").split("\n") + + +def _write_lines(path: str, lines: list[str]) -> None: + os.makedirs(os.path.dirname(path), exist_ok=True) + text = "\r\n".join(lines) + data = _BOM + text.encode("utf-16-le") + tmp = path + ".tmp" + with open(tmp, "wb") as f: + f.write(data) + os.replace(tmp, path) + + +def read_current_urls(cfg_dir: str) -> list[str]: + """Decode the URL list from an existing common.ini (migrate-from-current).""" + blob = "" + in_experts = False + for line in _read_lines(common_ini_path(cfg_dir)): + s = line.strip() + if s.startswith("[") and s.endswith("]"): + in_experts = s.lower() == "[experts]" + continue + if in_experts and "=" in s and s.split("=", 1)[0].strip().lower() == "webrequesturl": + blob = s.split("=", 1)[1].strip() + break + if not blob: + return [] + try: + return clean_urls(decode_blob(blob)) + except Exception: + return [] + + +def effective_urls(cfg_dir: str) -> list[str]: + """Desired state if set, else whatever the terminal currently holds.""" + desired = load_desired(cfg_dir) + return desired if desired is not None else read_current_urls(cfg_dir) + + +def write_common_ini(cfg_dir: str, urls: list[str]) -> None: + """Set ``[Experts] WebRequest=1`` + ``WebRequestUrl=`` in common.ini, + preserving every other line/section. Creates the file (and [Experts]) if + absent. Encoding stays UTF-16LE+BOM+CRLF, as MT5 writes it.""" + urls = clean_urls(urls) + kv = {"WebRequest": "1", "WebRequestUrl": encode_urls(urls)} + lines = _read_lines(common_ini_path(cfg_dir)) + out: list[str] = [] + in_experts = False + written: set[str] = set() + has_experts = any(l.strip().lower() == "[experts]" for l in lines) + + def flush_missing(): + for key, val in kv.items(): + if key not in written: + out.append(f"{key}={val}") + written.add(key) + + for line in lines: + s = line.strip() + if s.startswith("[") and s.endswith("]"): + if in_experts: + flush_missing() + in_experts = s.lower() == "[experts]" + out.append(line) + continue + if in_experts and "=" in s: + key = s.split("=", 1)[0].strip() + for real in kv: + if key.lower() == real.lower(): + if real not in written: + out.append(f"{real}={kv[real]}") + written.add(real) + break + else: + out.append(line) + continue + out.append(line) + + if in_experts: + flush_missing() + if not has_experts: + out.append("[Experts]") + flush_missing() + # drop trailing blank lines then keep exactly one terminator via join + while out and out[-1] == "": + out.pop() + _write_lines(common_ini_path(cfg_dir), out) + + +def apply_from_desired(terminal_dir: str) -> int | None: + """Regenerate common.ini from the desired file. Returns URL count, or None + if there is no desired state (in which case common.ini is left untouched). + Safe to call while the terminal is stopped.""" + cfg_dir = config_dir(terminal_dir) + desired = load_desired(cfg_dir) + if desired is None: + return None + write_common_ini(cfg_dir, desired) + return len(desired) diff --git a/mt5api/config.py b/mt5api/config.py index 1338f4c..e92be85 100644 --- a/mt5api/config.py +++ b/mt5api/config.py @@ -280,6 +280,29 @@ def load_terminal_config(): TERMINAL_DIR = os.path.dirname(TERMINAL_PATH) INI_FILE = os.path.join(TERMINAL_DIR, "mt5start.ini") + +# Chart Deployments (chartctl) — live-mode only feature. Global default from +# config.yaml `chartctl:` block; per-terminal `chartctl: false` in terminals[] +# overrides it. Backtest-mode terminals never enable it: there is no running +# terminal64.exe to manage charts on. +_chartctl_cfg = load_yaml_config().get("chartctl") or {} +_chartctl_terminal_override = _terminal_config.get("chartctl") +_chartctl_global_enabled = bool(_chartctl_cfg.get("enabled", True)) +CHARTCTL_ENABLED = ( + MODE == "live" + and _chartctl_global_enabled + and (_chartctl_terminal_override is not False) +) +CHARTCTL_RECONCILE_HINT_SECONDS = parse_duration_to_seconds( + str(_chartctl_cfg.get("reconcile_hint_interval") or "5s") +) or 5 +CHARTCTL_OBSERVED_STALE_SECONDS = parse_duration_to_seconds( + str(_chartctl_cfg.get("observed_stale_after") or "60s") +) or 60 +CHARTCTL_COMMAND_TIMEOUT_SECONDS = parse_duration_to_seconds( + str(_chartctl_cfg.get("command_timeout") or "30s") +) or 30 +CHARTCTL_MAX_UPLOAD_BYTES = int(_chartctl_cfg.get("max_upload_bytes") or 16 * 1024 * 1024) IDENTITY = make_identity(BROKER, ACCOUNT, INSTANCE) LOG_DIR = os.path.join(BASE_DIR, "logs") FULL_LOG = os.path.join(LOG_DIR, "full.log") diff --git a/mt5api/handlers/chartctl.py b/mt5api/handlers/chartctl.py new file mode 100644 index 0000000..8dad4bc --- /dev/null +++ b/mt5api/handlers/chartctl.py @@ -0,0 +1,394 @@ +"""Chart Deployments REST handlers. + +Lock-free by design: nothing here touches the MT5 SDK, so these routes +never queue behind the process-wide MT5 lock (mt5client.py). Everything +is file I/O against TERMINAL_DIR plus the loader-EA file protocol. +""" +import hashlib +import os + +from flask import jsonify, request, send_file + +from mt5api.chartctl import command as cmd +from mt5api.chartctl import paths, registry +from mt5api.chartctl.setparse import parse_set_bytes +from mt5api.chartctl.tpl_builder import write_tpl +from mt5api.config import CHARTCTL_MAX_UPLOAD_BYTES +from mt5api.logger import log + +_VALID_TIMEFRAMES = frozenset({ + "M1", "M2", "M3", "M4", "M5", "M6", "M10", "M12", "M15", "M20", "M30", + "H1", "H2", "H3", "H4", "H6", "H8", "H12", "D1", "W1", "MN1", +}) + + +def _err(status: int, code: str, message: str): + return jsonify({"error": message, "code": code}), status + + +def _sha256(path: str) -> str: + digest = hashlib.sha256() + with open(path, "rb") as handle: + for chunk in iter(lambda: handle.read(1 << 20), b""): + digest.update(chunk) + return digest.hexdigest() + + +def _list_dir(directory: str, ext: str, source: str) -> list[dict]: + items = [] + if not os.path.isdir(directory): + return items + for name in sorted(os.listdir(directory)): + if not name.lower().endswith(ext): + continue + full = os.path.join(directory, name) + if not os.path.isfile(full): + continue + stat = os.stat(full) + items.append({ + "name": name, + "size": stat.st_size, + "sha256": _sha256(full), + "modified_at": int(stat.st_mtime), + "source": source, + }) + return items + + +def _read_upload(field: str, required_ext: str) -> tuple[str, bytes]: + upload = request.files.get(field) + if upload is None or not upload.filename: + raise ValueError(f"Missing form file: {field}") + name = paths.safe_name(upload.filename, field, required_ext) + data = upload.stream.read(CHARTCTL_MAX_UPLOAD_BYTES + 1) + if len(data) > CHARTCTL_MAX_UPLOAD_BYTES: + raise ValueError( + f"{field}: file exceeds {CHARTCTL_MAX_UPLOAD_BYTES} bytes") + if not data: + raise ValueError(f"{field}: file is empty") + return name, data + + +# ── Artifacts: experts ─────────────────────────────────────────────── + +def upload_expert(): + try: + name, data = _read_upload("expert", ".ex5") + except ValueError as exc: + return _err(400, "BAD_REQUEST", str(exc)) + paths.ensure_dirs() + dest = os.path.join(paths.EXPERTS_DIR, name) + new_hash = hashlib.sha256(data).hexdigest() + overwrite = (request.args.get("overwrite", "false").lower() == "true") + if os.path.exists(dest) and not overwrite: + if _sha256(dest) == new_hash: + return jsonify({"name": name, "sha256": new_hash, + "skipped": True}) + return _err(409, "EXISTS", + f"{name} exists with different content; " + "pass ?overwrite=true to replace") + paths.atomic_write_bytes(dest, data) + log.info("chartctl expert staged: %s (%d bytes, %s)", + name, len(data), new_hash[:12]) + return jsonify({"name": name, "sha256": new_hash, "size": len(data)}), 201 + + +def list_experts(): + return jsonify({ + "experts": _list_dir(paths.EXPERTS_DIR, ".ex5", "uploaded") + + _list_dir(paths.HOST_EXPERTS_DIR, ".ex5", "host"), + }) + + +def delete_expert(name): + try: + name = paths.safe_name(name, "expert", ".ex5") + except ValueError as exc: + return _err(400, "BAD_REQUEST", str(exc)) + if os.path.exists(os.path.join(paths.HOST_EXPERTS_DIR, name)) and \ + not os.path.exists(os.path.join(paths.EXPERTS_DIR, name)): + return _err(403, "HOST_ASSET", "host-managed assets are read-only") + target = os.path.join(paths.EXPERTS_DIR, name) + if not os.path.exists(target): + return _err(404, "ARTIFACT_NOT_FOUND", f"{name} is not staged") + if registry.expert_in_use(name): + return _err(409, "IN_USE", + f"{name} is referenced by an existing deployment") + os.remove(target) + return jsonify({"deleted": name}) + + +# ── Artifacts: sets ────────────────────────────────────────────────── + +def upload_set(): + try: + name, data = _read_upload("set", ".set") + inputs = parse_set_bytes(data) + except ValueError as exc: + return _err(400, "BAD_REQUEST", str(exc)) + paths.ensure_dirs() + dest = os.path.join(paths.SETS_DIR, name) + paths.atomic_write_bytes(dest, data) + log.info("chartctl set staged: %s (%d inputs)", name, len(inputs)) + return jsonify({"name": name, + "sha256": hashlib.sha256(data).hexdigest(), + "inputs": inputs}), 201 + + +def list_sets(): + return jsonify({ + "sets": _list_dir(paths.SETS_DIR, ".set", "uploaded") + + _list_dir(paths.HOST_SETS_DIR, ".set", "host"), + }) + + +def get_set(name): + try: + name = paths.safe_name(name, "set", ".set") + except ValueError as exc: + return _err(400, "BAD_REQUEST", str(exc)) + path = _resolve_set(name) + if path is None: + return _err(404, "ARTIFACT_NOT_FOUND", f"{name} is not staged") + with open(path, "rb") as handle: + data = handle.read() + return jsonify({"name": name, "inputs": parse_set_bytes(data)}) + + +def _resolve_set(name: str) -> str | None: + for base in (paths.SETS_DIR, paths.HOST_SETS_DIR): + candidate = os.path.join(base, name) + if os.path.isfile(candidate): + return candidate + return None + + +def _resolve_expert(name: str) -> str | None: + for base in (paths.EXPERTS_DIR, paths.HOST_EXPERTS_DIR): + candidate = os.path.join(base, name) + if os.path.isfile(candidate): + return candidate + return None + + +# ── Deployments ────────────────────────────────────────────────────── + +def _terminal_build() -> int | None: + """Best-effort build stamp for the template header. Never blocks: + peeks at cached terminal info without taking the MT5 lock.""" + try: + from mt5api import mt5client + info = getattr(mt5client, "LAST_TERMINAL_INFO", None) + if info and getattr(info, "build", None): + return int(info.build) + except Exception: # noqa: BLE001 — stamp is cosmetic, never fail on it + pass + return None + + +def _materialize_tpl(dep: dict) -> None: + inputs: list[dict] = [] + if dep.get("set_file"): + set_path = _resolve_set(dep["set_file"]) + if set_path is None: + raise ValueError(f"set file {dep['set_file']} disappeared") + with open(set_path, "rb") as handle: + inputs = parse_set_bytes(handle.read()) + # Optimization tails are meaningless on a live chart. + inputs = [{"name": i["name"], "value": i["value"]} for i in inputs] + write_tpl( + deployment_id=dep["id"], + expert_name=dep["expert_name"], + expert_rel_path=f"Experts\\Uploaded\\{dep['expert_file']}", + inputs=inputs, + terminal_build=_terminal_build(), + ) + + +def create_deployment(): + body = request.get_json(silent=True) or {} + try: + expert_file = paths.safe_name(body.get("expert", ""), "expert", ".ex5") + set_file = None + if body.get("set"): + set_file = paths.safe_name(body["set"], "set", ".set") + symbol = str(body.get("symbol", "")).strip() + timeframe = str(body.get("timeframe", "")).strip().upper() + enabled = bool(body.get("enabled", True)) + if not symbol: + raise ValueError("symbol is required") + if timeframe not in _VALID_TIMEFRAMES: + raise ValueError(f"timeframe must be one of " + f"{sorted(_VALID_TIMEFRAMES)}") + except ValueError as exc: + return _err(400, "BAD_REQUEST", str(exc)) + + expert_path = _resolve_expert(expert_file) + if expert_path is None: + return _err(404, "ARTIFACT_NOT_FOUND", + f"expert {expert_file} is not staged — upload it first") + if expert_path.startswith(paths.HOST_EXPERTS_DIR): + # Host asset: mirror into Uploaded/ so the terminal can load it. + paths.ensure_dirs() + with open(expert_path, "rb") as handle: + paths.atomic_write_bytes( + os.path.join(paths.EXPERTS_DIR, expert_file), handle.read()) + if set_file and _resolve_set(set_file) is None: + return _err(404, "ARTIFACT_NOT_FOUND", + f"set {set_file} is not staged — upload it first") + + expert_name = expert_file[:-4] if expert_file.lower().endswith(".ex5") \ + else expert_file + try: + dep = registry.add_deployment( + expert_file=expert_file, expert_name=expert_name, + set_file=set_file, symbol=symbol, timeframe=timeframe, + enabled=enabled) + except registry.DuplicateChart as exc: + return _err(409, "DUPLICATE_CHART", str(exc)) + + try: + _materialize_tpl(dep) + except ValueError as exc: + registry.remove_deployment(dep["id"]) + return _err(500, "TPL_GENERATION_FAILED", str(exc)) + + return jsonify({"id": dep["id"], "status": "pending", + "deployment": dep}), 202 + + +def list_deployments(): + return jsonify(registry.merged_view()) + + +def get_deployment(dep_id): + view = registry.merged_view() + for item in view["deployments"]: + if item["id"] == dep_id: + item["revision"] = view["revision"] + item["observed_stale"] = view["observed_stale"] + return jsonify(item) + return _err(404, "NOT_FOUND", f"deployment {dep_id} does not exist") + + +def patch_deployment(dep_id): + body = request.get_json(silent=True) or {} + changes: dict = {} + try: + if "set" in body: + changes["set_file"] = ( + paths.safe_name(body["set"], "set", ".set") + if body["set"] else None) + if changes["set_file"] and _resolve_set(changes["set_file"]) is None: + return _err(404, "ARTIFACT_NOT_FOUND", + f"set {changes['set_file']} is not staged") + if "enabled" in body: + changes["enabled"] = bool(body["enabled"]) + except ValueError as exc: + return _err(400, "BAD_REQUEST", str(exc)) + if not changes: + return _err(400, "BAD_REQUEST", + "nothing to change: pass 'set' and/or 'enabled'") + try: + dep = registry.update_deployment(dep_id, **changes) + except KeyError: + return _err(404, "NOT_FOUND", f"deployment {dep_id} does not exist") + if "set_file" in changes: + try: + _materialize_tpl(dep) + except ValueError as exc: + return _err(500, "TPL_GENERATION_FAILED", str(exc)) + return jsonify({"id": dep_id, "deployment": dep}) + + +def delete_deployment(dep_id): + try: + dep = registry.remove_deployment(dep_id) + except KeyError: + return _err(404, "NOT_FOUND", f"deployment {dep_id} does not exist") + # Template file is left on disk until the loader confirms detach; the + # loader clears the chart because the deployment vanished from + # desired.json. Cleanup of orphaned .tpl files happens lazily here. + tpl = os.path.join(paths.TEMPLATES_DIR, f"{dep_id}.tpl") + try: + os.remove(tpl) + except OSError: + pass + return jsonify({"deleted": dep_id, "was": dep}) + + +def reconcile(): + registry.rewrite_desired() + return jsonify({"revision": registry.current_revision()}), 202 + + +# ── Observation ────────────────────────────────────────────────────── + +def charts(): + observed, stale = registry.read_observed() + return jsonify({ + "loader_alive": registry.loader_alive(observed, stale), + "observed_stale": stale, + "loader": (observed or {}).get("loader"), + "auto_trading": (observed or {}).get("terminal", {}).get("auto_trading"), + "charts": (observed or {}).get("charts", []), + }) + + +def loader_status(): + observed, stale = registry.read_observed() + alive = registry.loader_alive(observed, stale) + payload = { + "alive": alive, + "observed_stale": stale, + "loader": (observed or {}).get("loader"), + "desired_revision": registry.current_revision(), + "applied_revision": + (observed or {}).get("loader", {}).get("applied_revision"), + } + if not alive: + payload["hint"] = ( + "No live loader detected. Attach MT5ChartLoader (bundled under " + "assets/experts/) to any chart, or add ChartControl.mqh to your " + "own resident EA — see docs/chart-control-protocol.md.") + return jsonify(payload) + + +def close_chart(chart_id): + try: + result = cmd.run_command("close_chart", {"chart_id": int(chart_id)}) + except ValueError: + return _err(400, "BAD_REQUEST", "chart_id must be an int") + except cmd.LoaderBusy as exc: + return _err(409, "LOADER_BUSY", str(exc)) + except cmd.LoaderTimeout as exc: + return _err(504, "LOADER_TIMEOUT", str(exc)) + if result.get("status") != "ok": + return _err(502, result.get("error_code", "LOADER_ERROR"), + result.get("error_detail", "loader reported failure")) + return jsonify({"closed": int(chart_id)}) + + +def screenshot(chart_id): + try: + result = cmd.run_command("screenshot", { + "chart_id": int(chart_id), + "width": int(request.args.get("width", 1280)), + "height": int(request.args.get("height", 720)), + }) + except ValueError: + return _err(400, "BAD_REQUEST", "chart_id/width/height must be ints") + except cmd.LoaderBusy as exc: + return _err(409, "LOADER_BUSY", str(exc)) + except cmd.LoaderTimeout as exc: + return _err(504, "LOADER_TIMEOUT", str(exc)) + if result.get("status") != "ok": + return _err(502, result.get("error_code", "LOADER_ERROR"), + result.get("error_detail", "loader reported failure")) + filename = paths.safe_name(result.get("file", ""), "screenshot") + png = os.path.join(paths.SCREENSHOTS_DIR, filename) + if not os.path.isfile(png): + return _err(502, "LOADER_ERROR", + "loader reported a screenshot that does not exist") + response = send_file(png, mimetype="image/png") + return response diff --git a/mt5api/handlers/webrequest.py b/mt5api/handlers/webrequest.py new file mode 100644 index 0000000..f03bb9f --- /dev/null +++ b/mt5api/handlers/webrequest.py @@ -0,0 +1,100 @@ +"""WebRequest allowlist endpoints. + +GET /webrequest -> current effective allowlist for this terminal. +PUT /webrequest -> set/patch the allowlist and apply it now. +POST /webrequest/apply -> re-apply the current allowlist (boot / manual hook, + since the VM terminal drops the list on restart). + +The apply mechanism is chosen at runtime. Inside the dockur VM the allowlist is +set by driving MT5's Options dialog with AutoIt (the only thing that persists it +in-session there — see chartctl/autoit_webrequest.py). Elsewhere (a bare-metal +terminal where ``common.ini`` IS the WebRequest store) it falls back to writing +``common.ini`` and restarting the terminal. + +Dedicated call (not a deployment field): URLs are only needed by the minority of +EAs that use WebRequest. First use migrates from whatever the terminal already +has so manually-configured URLs are preserved. +""" +from flask import jsonify, request + +from mt5api.chartctl import autoit_webrequest as autoit +from mt5api.chartctl import webrequest as wr +from mt5api.config import TERMINAL_DIR +from mt5api.mt5client import restart_terminal, session + + +def _cfg_dir(): + return wr.config_dir(TERMINAL_DIR) + + +def get_webrequest(): + return jsonify({"urls": wr.effective_urls(_cfg_dir())}) + + +def _resolve_urls(body, cfg_dir): + """Return (urls, error). Full replace via 'urls', or patch via 'add'/'remove'.""" + if "urls" in body: + return wr.clean_urls(body.get("urls")), None + if "add" in body or "remove" in body: + current = wr.effective_urls(cfg_dir) # migrate-from-current on first use + remove = set(wr.clean_urls(body.get("remove", []))) + new_urls = [u for u in current if u not in remove] + for u in wr.clean_urls(body.get("add", [])): + if u not in new_urls: + new_urls.append(u) + return new_urls, None + return None, "provide 'urls', or 'add'/'remove'" + + +def _apply(urls, use_runas=False): + """Apply ``urls`` to the running terminal. Returns (ok, detail).""" + if autoit.available(): + status, _log = autoit.apply_urls(urls, use_runas=use_runas) + return status == "OK", f"autoit:{status}" + # bare-metal fallback: write common.ini from desired, then restart. + with session(): + ok = restart_terminal() + return ok, "restart" if ok else "restart-failed" + + +def _use_runas(): + return request.args.get("runas", "0") == "1" + + +def put_webrequest(): + body = request.get_json(silent=True) + if not isinstance(body, dict): + return jsonify({"success": False, "error": "JSON body required"}), 400 + + cfg_dir = _cfg_dir() + new_urls, err = _resolve_urls(body, cfg_dir) + if err: + return jsonify({"success": False, "error": err}), 400 + + wr.save_desired(cfg_dir, new_urls) + ok, detail = _apply(new_urls, _use_runas()) + if not ok: + return jsonify( + {"success": False, "error": f"apply failed ({detail})", "urls": new_urls} + ), 500 + return jsonify({"success": True, "urls": new_urls, "applied_via": detail}) + + +def apply_webrequest(): + """Re-apply the current desired allowlist (idempotent). Boot/manual hook.""" + # dev: ?script= runs a repo-shipped AutoIt script (VM only), e.g. + # inspect_options.au3. ?runas=0 launches it non-elevated for diagnostics. + dev_script = request.args.get("script") + if dev_script and autoit.available(): + status, txt = autoit.run_named(dev_script, use_runas=_use_runas()) + return jsonify({"script": dev_script, "status": status, "log": txt}) + + urls = wr.effective_urls(_cfg_dir()) + if not urls: + return jsonify({"success": True, "urls": [], "note": "nothing to apply"}) + ok, detail = _apply(urls, _use_runas()) + if not ok: + return jsonify( + {"success": False, "error": f"apply failed ({detail})", "urls": urls} + ), 500 + return jsonify({"success": True, "urls": urls, "applied_via": detail}) diff --git a/mt5api/main.py b/mt5api/main.py index 91372ac..1094756 100644 --- a/mt5api/main.py +++ b/mt5api/main.py @@ -38,6 +38,52 @@ RETRY_INTERVAL = 30 +# Seconds to let the terminal GUI settle before re-applying the WebRequest +# allowlist via AutoIt on boot (see _reapply_webrequest_once). +WEBREQUEST_BOOT_DELAY = 25 +_webrequest_reapplied = threading.Event() + + +def _reapply_webrequest_once(): + """Re-apply this terminal's desired WebRequest allowlist via AutoIt after a + (re)start. MT5 on the VM drops the list every restart, so the API re-sets it + once the terminal GUI is up. No-op unless AutoIt is present (the VM) AND a + desired allowlist has been configured. Runs in a daemon thread so it never + blocks startup; guarded to run only once per process.""" + if _webrequest_reapplied.is_set(): + return + _webrequest_reapplied.set() + + def _work(): + try: + from mt5api.chartctl import autoit_webrequest as autoit + from mt5api.chartctl import webrequest as wr + from mt5api.config import TERMINAL_DIR + + if not autoit.available(): + return + urls = wr.effective_urls(wr.config_dir(TERMINAL_DIR)) + if not urls: + return + # Let charts/loader finish attaching, plus a per-terminal stagger + # (from the port) so multiple terminals on one host don't all pile + # onto the machine-wide GUI mutex at once. + time.sleep(WEBREQUEST_BOOT_DELAY + (PORT % 10) * 3) + for attempt in range(1, 4): # brief retry: GUI may still be busy + status, _log = autoit.apply_urls(urls) + log.info( + "Boot WebRequest re-apply attempt %d: %d url(s) -> %s", + attempt, len(urls), status, + ) + if status == "OK": + break + time.sleep(15) + except Exception: + log.exception("Boot WebRequest re-apply failed") + + threading.Thread(target=_work, daemon=True).start() + + # --- MCP interface ----------------------------------------------------------- # TODO: change to fastapi or smth. This WSGI<->ASGI bridge is a stopgap. mt5api # is a Flask/WSGI app (served by waitress), but the MCP server is an ASGI @@ -121,6 +167,7 @@ def _background_init(): connected = False if connected: log.info("MT5 connected on attempt %d.", attempt) + _reapply_webrequest_once() return log.warning("MT5 not ready, retrying in %ds...", RETRY_INTERVAL) time.sleep(RETRY_INTERVAL) @@ -181,6 +228,7 @@ def main(): if connected: log.info("MT5 connected.") + _reapply_webrequest_once() else: log.warning( "MT5 not ready yet, retrying every %ds in background...", diff --git a/mt5api/mt5client.py b/mt5api/mt5client.py index 9f5baeb..4f3c498 100644 --- a/mt5api/mt5client.py +++ b/mt5api/mt5client.py @@ -289,12 +289,20 @@ def init_mt5(login=None, password=None, server=None): return result +# Last successful terminal_info snapshot, cached lock-free for cosmetic +# readers (e.g. chartctl template build stamp). Never authoritative. +LAST_TERMINAL_INFO = None + + def ensure_initialized(): """Probe + reconnect helper. Caller must hold the MT5 lock.""" + global LAST_TERMINAL_INFO try: info = m(mt5.terminal_info, _timeout=15) except MT5Timeout: info = None + if info is not None: + LAST_TERMINAL_INFO = info if info is None: log.warning("Terminal not responding, attempting full init...") account = get_first_account() @@ -412,6 +420,18 @@ def restart_terminal(): if not killed: log.warning("No terminal process found, launching fresh.") + # Apply the WebRequest allowlist while the terminal is down. MT5 rewrites + # common.ini on exit, so this must happen after the kill and before launch. + # No-op unless this terminal has a desired allowlist set. + try: + from mt5api.chartctl import webrequest as _wr + + applied = _wr.apply_from_desired(TERMINAL_DIR) + if applied is not None: + log.info("Applied WebRequest allowlist (%d URL(s)) to common.ini", applied) + except Exception: + log.exception("Failed to apply WebRequest allowlist; continuing restart") + today = date.today().strftime("%Y%m%d") journal_log = os.path.join(TERMINAL_DIR, "logs", f"{today}.log") offset = 0 diff --git a/mt5api/server.py b/mt5api/server.py index 1aca624..486881e 100644 --- a/mt5api/server.py +++ b/mt5api/server.py @@ -4,7 +4,7 @@ from flask import Flask, abort, g, request from flask_compress import Compress from mt5api.backtest import handler as backtest_handler -from mt5api.config import API_TOKEN +from mt5api.config import API_TOKEN, CHARTCTL_ENABLED from mt5api.handlers import account, history, orders, positions, symbols, terminal from mt5api.logger import log @@ -94,6 +94,39 @@ def _end_request(response): app.get("/history/orders")(history.get_orders) app.get("/history/deals")(history.get_deals) +# ── Chart Deployments (chartctl) ───────────────────────────────── +# Lock-free EA deployment primitives. Gated: live mode + config enabled. +if CHARTCTL_ENABLED: + from mt5api.handlers import chartctl + + app.post("/experts")(chartctl.upload_expert) + app.get("/experts")(chartctl.list_experts) + app.delete("/experts/")(chartctl.delete_expert) + + app.post("/sets")(chartctl.upload_set) + app.get("/sets")(chartctl.list_sets) + app.get("/sets/")(chartctl.get_set) + + app.post("/deployments")(chartctl.create_deployment) + app.get("/deployments")(chartctl.list_deployments) + app.post("/deployments/reconcile")(chartctl.reconcile) + app.get("/deployments/")(chartctl.get_deployment) + app.patch("/deployments/")(chartctl.patch_deployment) + app.delete("/deployments/")(chartctl.delete_deployment) + + app.get("/charts")(chartctl.charts) + app.get("/loader")(chartctl.loader_status) + app.post("/charts//screenshot")(chartctl.screenshot) + app.post("/charts//close")(chartctl.close_chart) + + # WebRequest allowlist — dedicated call. Applied via AutoIt (VM) or a + # common.ini rewrite + restart (bare metal). /apply re-applies on demand. + from mt5api.handlers import webrequest + + app.get("/webrequest")(webrequest.get_webrequest) + app.put("/webrequest")(webrequest.put_webrequest) + app.post("/webrequest/apply")(webrequest.apply_webrequest) + # ── Backtest ───────────────────────────────────────────────────── app.post("/backtest/build-ini")(backtest_handler.build_ini_route) app.post("/backtest/build-set")(backtest_handler.build_set_route) diff --git a/run.sh b/run.sh index dbe4b46..1e64df8 100755 --- a/run.sh +++ b/run.sh @@ -60,10 +60,10 @@ cp "${DIR}/scripts/reboot.bat" "${DIR}/data/shared/scripts/reboot.bat" cp "${DIR}/scripts/acquire_lock.ps1" "${DIR}/data/shared/scripts/acquire_lock.ps1" cp "${DIR}/scripts/api_runner.bat" "${DIR}/data/shared/scripts/api_runner.bat" cp "${DIR}/scripts/compile-warmup-ea.bat" "${DIR}/data/shared/scripts/compile-warmup-ea.bat" - cp "${DIR}/scripts/check_health.py" "${DIR}/data/shared/scripts/check_health.py" cp "${DIR}/scripts/config_helper.py" "${DIR}/data/shared/scripts/config_helper.py" - +cp "${DIR}/scripts/compile-chartctl-loader.bat" "${DIR}/data/shared/scripts/compile-chartctl-loader.bat" +cp "${DIR}/scripts/webrequest_allowlist_codec.py" "${DIR}/data/shared/scripts/webrequest_allowlist_codec.py" cp "${DIR}/scripts/event-log-tailer.ps1" "${DIR}/data/shared/scripts/event-log-tailer.ps1" cp "${DIR}/scripts/healthcheck.sh" "${DIR}/data/shared/scripts/healthcheck.sh" chmod +x "${DIR}/data/shared/scripts/healthcheck.sh" diff --git a/scripts/compile-chartctl-loader.bat b/scripts/compile-chartctl-loader.bat new file mode 100644 index 0000000..cddd72c --- /dev/null +++ b/scripts/compile-chartctl-loader.bat @@ -0,0 +1,87 @@ +@echo off +setlocal enabledelayedexpansion + +rem ════════════════════════════════════════════════════════════════ +rem compile-chartctl-loader.bat +rem +rem Zero-touch bootstrap for the chartctl loader EA: +rem 1. Copies ChartControl.mqh into MQL5\Include\ of every broker +rem base terminal and MT5ChartLoader.mq5 into MQL5\Experts\Advisors\. +rem 2. Compiles the loader with each base's MetaEditor64. +rem 3. Copies the compiled .ex5 (+ include + source) into every +rem already-provisioned terminal instance dir, so existing +rem terminals pick it up without re-provisioning. New instances +rem inherit it automatically via the base xcopy. +rem +rem Combined with the [StartUp] Expert= line that config_helper.py +rem writes into mt5start.ini for live chartctl terminals, the loader +rem attaches itself at terminal launch — no RDP, no manual step. +rem +rem Modeled on compile-warmup-ea.bat (same MetaEditor invocation). +rem ════════════════════════════════════════════════════════════════ + +set "SHARED=C:\Users\Docker\Desktop\Shared" +set "ASSETS=C:\Users\Docker\Desktop\Assets" +if not exist "%ASSETS%\experts" set "ASSETS=%SHARED%\assets" + +set "SRC_EA=%ASSETS%\experts\MT5ChartLoader.mq5" +set "SRC_INC=%ASSETS%\experts\include\ChartControl.mqh" +set "COMPILE_LOG=%SHARED%\logs\compile-chartctl-loader.log" + +if not exist "%SRC_EA%" ( + echo ERROR: source not found: %SRC_EA% + exit /b 1 +) +if not exist "%SRC_INC%" ( + echo ERROR: include not found: %SRC_INC% + exit /b 1 +) + +set FOUND=0 +set FAILED=0 + +for /d %%B in ("%SHARED%\terminals\*") do ( + if exist "%%~fB\base\MetaEditor64.exe" ( + set /a FOUND+=1 + set "BASE=%%~fB\base" + echo [%%~nB] compiling loader in base... + + if not exist "!BASE!\MQL5\Include" mkdir "!BASE!\MQL5\Include" + if not exist "!BASE!\MQL5\Experts\Advisors" mkdir "!BASE!\MQL5\Experts\Advisors" + copy /Y "%SRC_INC%" "!BASE!\MQL5\Include\ChartControl.mqh" >nul + copy /Y "%SRC_EA%" "!BASE!\MQL5\Experts\Advisors\MT5ChartLoader.mq5" >nul + + "!BASE!\MetaEditor64.exe" /compile:"!BASE!\MQL5\Experts\Advisors\MT5ChartLoader.mq5" /inc:"!BASE!\MQL5" /log:"%COMPILE_LOG%" >nul 2>&1 + + if exist "!BASE!\MQL5\Experts\Advisors\MT5ChartLoader.ex5" ( + echo [%%~nB] OK: MT5ChartLoader.ex5 + + rem Propagate into every provisioned instance of this broker: + rem terminals\\\\ layout, skip \base. + for /d %%A in ("%%~fB\*") do ( + if /i not "%%~nxA"=="base" ( + for /d %%I in ("%%~fA\*") do ( + if exist "%%~fI\terminal64.exe" ( + if not exist "%%~fI\MQL5\Include" mkdir "%%~fI\MQL5\Include" + if not exist "%%~fI\MQL5\Experts\Advisors" mkdir "%%~fI\MQL5\Experts\Advisors" + copy /Y "!BASE!\MQL5\Experts\Advisors\MT5ChartLoader.ex5" "%%~fI\MQL5\Experts\Advisors\" >nul + copy /Y "%SRC_INC%" "%%~fI\MQL5\Include\ChartControl.mqh" >nul + copy /Y "%SRC_EA%" "%%~fI\MQL5\Experts\Advisors\MT5ChartLoader.mq5" >nul + echo [%%~nB] propagated to %%~nA\%%~nI + ) + ) + ) + ) + ) else ( + set /a FAILED+=1 + echo [%%~nB] ERROR: compile produced no .ex5 — see %COMPILE_LOG% + ) + ) +) + +if %FOUND%==0 ( + echo ERROR: no broker base terminals found under %SHARED%\terminals + exit /b 1 +) +if %FAILED% gtr 0 exit /b 1 +exit /b 0 diff --git a/scripts/config_helper.py b/scripts/config_helper.py index 50ecfc0..b5ffbbb 100644 --- a/scripts/config_helper.py +++ b/scripts/config_helper.py @@ -165,9 +165,11 @@ def main(): elif cmd == "write_ini": if len(sys.argv) < 5: - print("Usage: config_helper.py write_ini ", file=sys.stderr) + print("Usage: config_helper.py write_ini [instance] [mode]", file=sys.stderr) sys.exit(1) broker, account, outpath = sys.argv[2], sys.argv[3], sys.argv[4] + instance = sys.argv[5] if len(sys.argv) > 5 else "default" + mode = (sys.argv[6] if len(sys.argv) > 6 else "live").lower() accounts = cfg.get("accounts", {}) b = accounts.get(broker, {}) creds = b.get(account) if account else next(iter(b.values()), None) if b else None @@ -179,9 +181,51 @@ def main(): ini += "KeepPrivate=0\nAutoTrading=1\nNewsEnable=0\n" ini += "[Experts]\nAllowLiveTrading=1\nAllowDllImport=1\nEnabled=1\n" ini += "[Email]\nEnable=0\n" + + # Chart Deployments loader bootstrap: auto-attach MT5ChartLoader at + # terminal launch via [StartUp]. Gated exactly like the API's + # CHARTCTL_ENABLED: live mode + global chartctl.enabled (default + # true) + no per-terminal `chartctl: false` override. The loader's + # GlobalVariable mutex makes the re-fire on every launch idempotent + # (a duplicate closes its own chart and exits). + chartctl_cfg = cfg.get("chartctl") or {} + chartctl_on = bool(chartctl_cfg.get("enabled", True)) + term_override = None + term_suffix = "" + for t in cfg.get("terminals", []): + if (t.get("broker") == broker and str(t.get("account")) == str(account) + and (t.get("instance") or "default") == instance): + term_override = t.get("chartctl") + term_suffix = t.get("symbol_suffix") or "" + break + if mode == "live" and chartctl_on and term_override is not False: + ini += "[StartUp]\n" + ini += "Expert=Advisors\\MT5ChartLoader\n" + ini += f"Symbol=EURUSD{term_suffix}\n" + ini += "Period=H1\n" + with open(outpath, "w", encoding="utf-8") as f: f.write(ini) + # WebRequest allowlist boot-seed: start.bat deletes Config/common.ini + # every boot, so re-emit it here (after the delete, before launch) from + # the persistent per-terminal desired file. No-op when this terminal has + # no allowlist set. Gated exactly like the loader [StartUp] block above. + if mode == "live" and chartctl_on and term_override is not False: + try: + sys.path.insert(0, _SHARED_DIR) + from mt5api.chartctl import webrequest as wr + cfg_dir = os.path.join(os.path.dirname(os.path.abspath(outpath)), "Config") + urls = wr.load_desired(cfg_dir) + if urls is not None: + wr.write_common_ini(cfg_dir, urls) + except Exception as exc: # non-fatal: never block terminal launch + print(f"WARN: WebRequest allowlist seed failed: {exc}", file=sys.stderr) + + elif cmd == "chartctl_enabled": + chartctl_cfg = cfg.get("chartctl") or {} + print("1" if bool(chartctl_cfg.get("enabled", True)) else "0") + elif cmd == "nginx_conf": if len(sys.argv) < 3: print("Usage: config_helper.py nginx_conf ", file=sys.stderr) diff --git a/scripts/start.bat b/scripts/start.bat index b880b21..5a3b5d1 100644 --- a/scripts/start.bat +++ b/scripts/start.bat @@ -1,388 +1,418 @@ -@echo off -setlocal enabledelayedexpansion -set SHARED=C:\Users\Docker\Desktop\Shared -set SCRIPTS=%SHARED%\scripts -set CONFIG=%SHARED%\config -set BROKERS=%SHARED%\terminals -set LOGDIR=%SHARED%\logs -set INSTALL_LOG=%LOGDIR%\install.log -set PIP_LOG=%LOGDIR%\pip.log -set START_LOG=%LOGDIR%\start.log -set FULL_LOG=%LOGDIR%\full.log -set "PYDIR=C:\Program Files\Python312" -set "PATH=%PYDIR%;%PYDIR%\Scripts;%PATH%" -set "LOCKDIR=%SHARED%\start.running" - -mkdir "%LOGDIR%" 2>nul -rmdir "%FULL_LOG%.lock" 2>nul - -:: ── Boot-scoped lock (only one start.bat instance per boot) ────── -:: A bare `mkdir %LOCKDIR%` used to deadlock the stack permanently. %LOCKDIR% -:: lives on the host-mounted %SHARED% volume, so it survives a VM reboot; the -:: MT5AutoReboot task fires `shutdown /r /t 0 /f` with no grace period and can -:: land anywhere inside this script's run (which legitimately spans from -:: seconds to over an hour). Killed mid-run, the lock outlived the process and -:: every later boot bailed on the orphan forever. -:: -:: acquire_lock.ps1 stamps the lock with the OS boot time, so a lock from a -:: previous boot is provably ownerless and gets cleared automatically. -:: Exit 0 = acquired, exit 1 = a live instance from THIS boot holds it. -:: -:: Deliberately does NOT consume %SHARED%\rebooting.flag — install.bat (called -:: below) owns that flag for its own lock, and eating it here would break it. -:: Tempfile rather than `for /f` because errorlevel after a for/f loop is the -:: loop body's exit code, not the invoked command's -- the lock verdict would -:: be silently lost. Same reason the API-token block below uses a tempfile. -set "LOCK_OUT=%TEMP%\mt5_lock_result.txt" -del "%LOCK_OUT%" 2>nul -powershell -NoProfile -ExecutionPolicy Bypass -File "%SCRIPTS%\acquire_lock.ps1" -LockDir "%LOCKDIR%" > "%LOCK_OUT%" 2>&1 -set "LOCK_EC=!errorlevel!" -if exist "%LOCK_OUT%" ( - for /f "usebackq delims=" %%A in ("%LOCK_OUT%") do ( - echo [%date% %time%] [start] lock: %%A >> "%FULL_LOG%" - echo [%date% %time%] lock: %%A >> "%START_LOG%" - ) -) -del "%LOCK_OUT%" 2>nul -rem Exit 10 means a live instance from THIS boot holds the lock -- bail. -if !LOCK_EC! equ 10 ( - echo [%date% %time%] start.bat already running this boot, exiting. - echo [%date% %time%] start.bat already running this boot, exiting. >> "%START_LOG%" - echo [%date% %time%] [start] start.bat already running this boot, exiting. >> "%FULL_LOG%" - exit /b 0 -) -rem Any other non-zero means acquire_lock.ps1 ITSELF failed (parse error, -rem missing cmdlet, unwritable mount). Do NOT treat that as "held" -- that is -rem precisely what deadlocked the stack when a syntax error in the helper made -rem PowerShell exit 1 and every boot concluded the lock was taken. Fall back to -rem the plain mkdir lock so boot still proceeds with single-instance safety. -if !LOCK_EC! neq 0 ( - echo [%date% %time%] WARN acquire_lock.ps1 failed ^(exit !LOCK_EC!^), falling back to mkdir lock >> "%START_LOG%" - echo [%date% %time%] [start] WARN acquire_lock.ps1 failed ^(exit !LOCK_EC!^), falling back to mkdir lock >> "%FULL_LOG%" - mkdir "%LOCKDIR%" 2>nul - if !errorlevel! neq 0 ( - echo [%date% %time%] fallback lock held, exiting. >> "%START_LOG%" - echo [%date% %time%] [start] fallback lock held, exiting. >> "%FULL_LOG%" - exit /b 0 - ) -) - -call :log "%START_LOG%" "====== Boot ======" -call :log "%INSTALL_LOG%" "====== Boot ======" - -:: ── Run install ────────────────────────────────────────────────── -call :log "%START_LOG%" "Running install.bat..." -call "%SCRIPTS%\install.bat" -if !errorlevel! equ 3 ( - call :log "%START_LOG%" "Reboot scheduled by install.bat, stopping." - call :release_lock - exit /b 0 -) -if !errorlevel! neq 0 ( - call :log "%START_LOG%" "ERROR: install.bat failed (exit code !errorlevel!)" - call :release_lock - exit /b 1 -) -call :log "%START_LOG%" "install.bat done." - -:: ── Pip install ────────────────────────────────────────────────── -:: Install base deps first (pyyaml required for config_helper.py below). -:: numpy<2 pin: MetaTrader5 5.0.5735 was built against numpy 1.x and breaks -:: silently with numpy 2.x — reads still work but order_send fails immediately -:: with (-2, 'Unnamed arguments not allowed'). Drop the pin once MetaQuotes -:: ships a numpy-2-compatible wheel. -:: -:: Each pip command writes to a per-call temp file so we can detect whether -:: anything ACTUALLY got installed/upgraded (presence of "Successfully -:: installed" in pip's output). If so, the python processes already running -:: from the previous boot are stale → reboot to pick up the new libs. -set "PIP_TMP=%TEMP%\mt5-pip-%RANDOM%-%RANDOM%.txt" -set "PIP_CHANGED=0" - -call :log "%START_LOG%" "Installing pip packages..." -call :log "%PIP_LOG%" "Installing pip packages..." -rem MCP v2 removed mcp.server.fastmcp; keep this synchronized with requirements-api.txt. -"%PYDIR%\python.exe" -m pip install pyyaml MetaTrader5 "numpy<2" flask waitress flask-compress psutil "mcp==1.28.0" a2wsgi > "%PIP_TMP%" 2>&1 -set "PIP_EC=!errorlevel!" -type "%PIP_TMP%" >> "%PIP_LOG%" -findstr /C:"Successfully installed" "%PIP_TMP%" >nul 2>&1 && set "PIP_CHANGED=1" -del "%PIP_TMP%" 2>nul -if !PIP_EC! neq 0 ( - call :log "%START_LOG%" "ERROR: pip install (base) failed (exit code !PIP_EC!), aborting." - call :log "%PIP_LOG%" "ERROR: pip install (base) failed" - call :release_lock - exit /b 1 -) -:: Extra packages from config.yaml requirements list. -:: NOTE: no `usebackq` — with usebackq, single-quoted strings are LITERAL, -:: not commands. Without usebackq, ('cmd') executes the command. This is -:: the same pattern install.bat uses for the `ports` lookup. -for /f "delims=" %%R in ('"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" requirements 2^>nul') do ( - "%PYDIR%\python.exe" -m pip install "%%R" > "%PIP_TMP%" 2>&1 - type "%PIP_TMP%" >> "%PIP_LOG%" - findstr /C:"Successfully installed" "%PIP_TMP%" >nul 2>&1 && set "PIP_CHANGED=1" - del "%PIP_TMP%" 2>nul -) -call :log "%START_LOG%" "pip done." -call :log "%PIP_LOG%" "pip done." - -:: Routed through reboot.bat so the flag write + lock release happen in one -:: place. Previously this inlined its own flag+shutdown+rmdir sequence, which -:: was correct but meant three separate reboot implementations to keep in sync. -if "!PIP_CHANGED!"=="1" ( - call :log "%START_LOG%" "pip changed packages -> rebooting so api_runners pick up new libs" - call "%SCRIPTS%\reboot.bat" pip-changed - exit /b 0 -) - -:: ── Start Windows event log tailer (background) ──────────────── -:: Streams Warning/Error/Critical from System + Application logs into -:: %LOGDIR%\windows-events.log so OOM kills, BSODs, terminal64 crashes, -:: etc. show up alongside the API logs. Single-instance via lock file -:: inside the script. -call :log "%START_LOG%" "Starting Windows event log tailer..." -start "Win Event Tailer" /B powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "%SCRIPTS%\event-log-tailer.ps1" - -:: ── Kill lingering MT5 terminals ──────────────────────────────── -call :log "%START_LOG%" "Killing lingering MT5 terminals..." -tasklist /fi "imagename eq terminal64.exe" 2>nul | find /i "terminal64.exe" >nul && ( - taskkill /f /im terminal64.exe >nul 2>&1 - timeout /t 2 /nobreak >nul -) - -:: ── Verify config.yaml exists ─────────────────────────────────── -if not exist "%CONFIG%\config.yaml" ( - call :log "%START_LOG%" "ERROR: config.yaml not found! Copy config/config.yaml.example and re-run." - call :release_lock - exit /b 1 -) - -:: ── Parse config.yaml terminals once ──────────────────────────── -set "TERM_LIST=%TEMP%\mt5_terminals.txt" -"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" terminals > "%TERM_LIST%" 2>"%TEMP%\mt5_parse_err.txt" -if !errorlevel! neq 0 ( - call :log "%START_LOG%" "ERROR: Failed to parse config.yaml:" - type "%TEMP%\mt5_parse_err.txt" >> "%START_LOG%" - del "%TERM_LIST%" 2>nul - call :release_lock - exit /b 1 -) - -:: ── Periodic auto-reboot scheduled task ───────────────────────── -:: MT5 terminals share a desktop with DWM, and DWM/VirtIO-GPU crashes -:: under sustained load wedge the SDK pipe (terminal64.exe stops -:: responding to GDI/IPC). Cheapest mitigation: hard-reboot every N -:: minutes to flush GPU/desktop state before it rots. -:: Configured via config.yaml reboot_interval (minutes). 0 = disabled. -:: Default: 30. /f on schtasks is idempotent -- overwrites existing task. -:: -:: The task calls reboot.bat, NOT `shutdown` directly. Calling shutdown here -:: was the root cause of the permanent-deadlock outage: it killed start.bat -:: mid-run without writing rebooting.flag and without releasing -:: %SHARED%\start.running, and that orphaned lock (living on the host mount) -:: blocked every subsequent boot. reboot.bat always does both. -:: -:: No inner quotes in /tr -- schtasks quote-escaping is fragile, and %SCRIPTS% -:: has no spaces (C:\Users\Docker\Desktop\Shared\scripts). -set "REBOOT_INTERVAL=30" -"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" reboot_interval > "%SHARED%\mt5_ri.tmp" 2>nul -for /f "usebackq delims=" %%V in ("%SHARED%\mt5_ri.tmp") do set "REBOOT_INTERVAL=%%V" -del "%SHARED%\mt5_ri.tmp" 2>nul -if "!REBOOT_INTERVAL!"=="0" ( - schtasks /delete /tn "MT5AutoReboot" /f >nul 2>&1 - call :log "%START_LOG%" "Auto-reboot disabled (reboot_interval=0)." -) else ( - schtasks /create /tn "MT5AutoReboot" /tr "cmd.exe /c %SCRIPTS%\reboot.bat scheduled" /sc minute /mo !REBOOT_INTERVAL! /ru "SYSTEM" /rl HIGHEST /f >nul 2>&1 - if !errorlevel! equ 0 ( - call :log "%START_LOG%" "MT5AutoReboot task ensured (every !REBOOT_INTERVAL! min)." - ) else ( - call :log "%START_LOG%" "WARN: failed to create MT5AutoReboot task (errorlevel !errorlevel!)." - ) -) - -:: ── Launch MT5 terminals ───────────────────────────────────────── -call :log "%START_LOG%" "Launching MT5 terminals..." -set TERM_COUNT=0 -for /f "usebackq delims=" %%L in ("%TERM_LIST%") do ( - call :launch_terminal %%L - if !errorlevel! neq 0 ( - call :log "%START_LOG%" "ERROR: Failed to launch terminal, aborting." - del "%TERM_LIST%" 2>nul - call :release_lock - exit /b 1 - ) - set /a TERM_COUNT+=1 -) - -if !TERM_COUNT! equ 0 ( - call :log "%START_LOG%" "ERROR: No terminals configured in config.yaml" - del "%TERM_LIST%" 2>nul - call :release_lock - exit /b 1 -) - -call :log "%START_LOG%" "Launched !TERM_COUNT! terminal(s), waiting 30s to initialize..." -timeout /t 30 /nobreak >nul - -:: ── Load API token from config.yaml (optional) ────────────────── -:: Tempfile path is more robust than `for /f`'s subshell+quoting dance — -:: any python crash, pyyaml fallback install, or stdout buffering quirk -:: showed up as "API_TOKEN empty" through the for/f path. -set "API_TOKEN=" -set "TOKEN_TMP=%TEMP%\mt5_api_token.txt" -del "%TOKEN_TMP%" 2>nul -"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" api_token > "%TOKEN_TMP%" 2>nul -if exist "%TOKEN_TMP%" set /p API_TOKEN=<"%TOKEN_TMP%" -del "%TOKEN_TMP%" 2>nul -if defined API_TOKEN ( - call :log "%START_LOG%" "API token loaded." -) else ( - call :log "%START_LOG%" "WARNING: api_token empty in config.yaml, API running without auth." -) - -:: ── Launch API processes (all background) ──────────────────────── -call :log "%START_LOG%" "Launching API processes..." -for /f "usebackq delims=" %%L in ("%TERM_LIST%") do ( - call :launch_api_bg %%L -) -del "%TERM_LIST%" 2>nul -call :release_lock -call :log "%START_LOG%" "All !TERM_COUNT! API(s) running in background." - -:: ── Foreground: status + health monitor ────────────────────────── -:status_loop -cls -echo. -echo ===================================================== -echo MT5 HTTP API RUNNING -- %DATE% %TIME% -echo ===================================================== -echo. -"%PYDIR%\python.exe" "%SCRIPTS%\check_health.py" -echo. -timeout /t 60 /nobreak >nul -goto status_loop - -:: ══════════════════════════════════════════════════════════════════ -:launch_terminal -:: %1=broker %2=account %3=instance %4=port %5=utc_offset %6=mode (live|backtest) -set "LT_BROKER=%~1" -set "LT_ACCOUNT=%~2" -set "LT_INSTANCE=%~3" -set "LT_PORT=%~4" -set "LT_MODE=%~6" -if "!LT_INSTANCE!"=="" set "LT_INSTANCE=default" -if "!LT_MODE!"=="" set "LT_MODE=live" -set "LT_BASEDIR=%BROKERS%\!LT_BROKER!\base" -set "LT_DIR=%BROKERS%\!LT_BROKER!\!LT_ACCOUNT!\!LT_INSTANCE!" - -if not exist "!LT_BASEDIR!\terminal64.exe" ( - call :log "%START_LOG%" "ERROR: No base install for !LT_BROKER! at !LT_BASEDIR!" - exit /b 1 -) - -if not exist "!LT_DIR!\terminal64.exe" ( - call :log "%START_LOG%" "Copying !LT_BROKER!\base to !LT_BROKER!\!LT_ACCOUNT!\!LT_INSTANCE!..." - xcopy "!LT_BASEDIR!\*" "!LT_DIR!\" /E /I /H /Y /Q >nul 2>&1 - if !errorlevel! neq 0 ( - call :log "%START_LOG%" "ERROR: xcopy failed for !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE!" - exit /b 1 - ) -) - -del "!LT_DIR!\Config\settings.ini" 2>nul -del "!LT_DIR!\Config\common.ini" 2>nul - -call :write_ini "!LT_DIR!" "!LT_BROKER!" "!LT_ACCOUNT!" - -rem Save journal log size before launch so we only check NEW content -for /f "delims=" %%D in ('python -c "from datetime import date;print(date.today().strftime('%%Y%%m%%d'))"') do set "LT_LOGDATE=%%D" -set "LT_LOGFILE=!LT_DIR!\logs\!LT_LOGDATE!.log" -set LT_LOGSIZE=0 -if exist "!LT_LOGFILE!" ( - for %%A in ("!LT_LOGFILE!") do set LT_LOGSIZE=%%~zA -) - -if /i "!LT_MODE!"=="backtest" ( - call :log "%START_LOG%" " !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! mode=backtest -- portable dir prepared, terminal NOT launched (tester will spawn it on demand)." - exit /b 0 -) - -call :log "%START_LOG%" "Starting terminal: !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! (port !LT_PORT!) [log offset !LT_LOGSIZE!]" -powershell -Command "Start-Process '!LT_DIR!\terminal64.exe' -ArgumentList '/portable','/config:\"!LT_DIR!\mt5start.ini\"' -Verb RunAs -WindowStyle Normal" - -rem Wait for 'started for' in journal log (for /L avoids goto inside call) -set LT_STARTED=0 -for /L %%N in (1,1,120) do ( - if !LT_STARTED! equ 0 ( - python -c "import sys;f=open(sys.argv[1],'rb');f.seek(int(sys.argv[2]));d=f.read().decode('utf-16-le',errors='ignore');f.close();sys.exit(0 if 'started for' in d else 1)" "!LT_LOGFILE!" !LT_LOGSIZE! 2>nul - if !errorlevel! equ 0 ( - set LT_STARTED=1 - ) else ( - call :log "%START_LOG%" " Waiting for !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! to start (%%N)..." - timeout /t 5 /nobreak >nul - ) - ) -) -if !LT_STARTED! equ 0 ( - call :log "%START_LOG%" "ERROR: !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! failed to start after 10 minutes" - exit /b 1 -) -call :log "%START_LOG%" " !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! started." -exit /b 0 - -:: ══════════════════════════════════════════════════════════════════ -:launch_api_bg -set "LA_BROKER=%~1" -set "LA_ACCOUNT=%~2" -set "LA_INSTANCE=%~3" -set "LA_PORT=%~4" -set "LA_OFFSET=%~5" -set "LA_MODE=%~6" -if "!LA_INSTANCE!"=="" set "LA_INSTANCE=default" -if "!LA_OFFSET!"=="" set "LA_OFFSET=0" -if "!LA_MODE!"=="" set "LA_MODE=live" - -call :log "%START_LOG%" "Starting API (bg): !LA_BROKER!/!LA_ACCOUNT!/!LA_INSTANCE! on port !LA_PORT! (utc_offset=!LA_OFFSET! mode=!LA_MODE!)" -if "!LA_INSTANCE!"=="default" ( - start "MT5 API !LA_BROKER!/!LA_ACCOUNT!" cmd /c ""%SCRIPTS%\api_runner.bat" !LA_BROKER! !LA_ACCOUNT! !LA_INSTANCE! !LA_PORT! !API_TOKEN! !LA_OFFSET! !LA_MODE!" -) else ( - start "MT5 API !LA_BROKER!/!LA_ACCOUNT!/!LA_INSTANCE!" cmd /c ""%SCRIPTS%\api_runner.bat" !LA_BROKER! !LA_ACCOUNT! !LA_INSTANCE! !LA_PORT! !API_TOKEN! !LA_OFFSET! !LA_MODE!" -) -exit /b 0 - -:: ══════════════════════════════════════════════════════════════════ -:write_ini -set "WI_DIR=%~1" -set "WI_BROKER=%~2" -set "WI_ACCOUNT=%~3" -set "WI_CFG=!WI_DIR!\mt5start.ini" -"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" write_ini "!WI_BROKER!" "!WI_ACCOUNT!" "!WI_CFG!" >> "%START_LOG%" 2>&1 -if errorlevel 1 ( - call :log "%START_LOG%" "WARNING: Could not write ini for !WI_BROKER!/!WI_ACCOUNT!, using defaults" - echo [Common]> "!WI_CFG!" - echo KeepPrivate=0>> "!WI_CFG!" - echo AutoTrading=1>> "!WI_CFG!" - echo NewsEnable=0>> "!WI_CFG!" - echo [Experts]>> "!WI_CFG!" - echo AllowLiveTrading=1>> "!WI_CFG!" - echo AllowDllImport=1>> "!WI_CFG!" - echo Enabled=1>> "!WI_CFG!" - echo [Email]>> "!WI_CFG!" - echo Enable=0>> "!WI_CFG!" -) -exit /b 0 - -:: ══════════════════════════════════════════════════════════════════ -:release_lock -:: /s /q is REQUIRED: the lock dir contains acquire_lock.ps1's boot.id stamp, -:: so a bare `rmdir` fails on a non-empty directory and would leave the lock -:: behind -- reintroducing the deadlock this whole mechanism removes. -rmdir /s /q "%LOCKDIR%" 2>nul -exit /b 0 - -:: ══════════════════════════════════════════════════════════════════ -:log -echo [%date% %time%] %~2 -echo [%date% %time%] %~2 >> "%~1" -echo [%date% %time%] [start] %~2 >> "%FULL_LOG%" -exit /b 0 +@echo off +setlocal enabledelayedexpansion +set SHARED=C:\Users\Docker\Desktop\Shared +set SCRIPTS=%SHARED%\scripts +set CONFIG=%SHARED%\config +set BROKERS=%SHARED%\terminals +set LOGDIR=%SHARED%\logs +set INSTALL_LOG=%LOGDIR%\install.log +set PIP_LOG=%LOGDIR%\pip.log +set START_LOG=%LOGDIR%\start.log +set FULL_LOG=%LOGDIR%\full.log +set "PYDIR=C:\Program Files\Python312" +set "PATH=%PYDIR%;%PYDIR%\Scripts;%PATH%" +set "LOCKDIR=%SHARED%\start.running" + +mkdir "%LOGDIR%" 2>nul +rmdir "%FULL_LOG%.lock" 2>nul + +:: ── Boot-scoped lock (only one start.bat instance per boot) ────── +:: A bare `mkdir %LOCKDIR%` used to deadlock the stack permanently. %LOCKDIR% +:: lives on the host-mounted %SHARED% volume, so it survives a VM reboot; the +:: MT5AutoReboot task fires `shutdown /r /t 0 /f` with no grace period and can +:: land anywhere inside this script's run (which legitimately spans from +:: seconds to over an hour). Killed mid-run, the lock outlived the process and +:: every later boot bailed on the orphan forever. +:: +:: acquire_lock.ps1 stamps the lock with the OS boot time, so a lock from a +:: previous boot is provably ownerless and gets cleared automatically. +:: Exit 0 = acquired, exit 1 = a live instance from THIS boot holds it. +:: +:: Deliberately does NOT consume %SHARED%\rebooting.flag — install.bat (called +:: below) owns that flag for its own lock, and eating it here would break it. +:: Tempfile rather than `for /f` because errorlevel after a for/f loop is the +:: loop body's exit code, not the invoked command's -- the lock verdict would +:: be silently lost. Same reason the API-token block below uses a tempfile. +set "LOCK_OUT=%TEMP%\mt5_lock_result.txt" +del "%LOCK_OUT%" 2>nul +powershell -NoProfile -ExecutionPolicy Bypass -File "%SCRIPTS%\acquire_lock.ps1" -LockDir "%LOCKDIR%" > "%LOCK_OUT%" 2>&1 +set "LOCK_EC=!errorlevel!" +if exist "%LOCK_OUT%" ( + for /f "usebackq delims=" %%A in ("%LOCK_OUT%") do ( + echo [%date% %time%] [start] lock: %%A >> "%FULL_LOG%" + echo [%date% %time%] lock: %%A >> "%START_LOG%" + ) +) +del "%LOCK_OUT%" 2>nul +rem Exit 10 means a live instance from THIS boot holds the lock -- bail. +if !LOCK_EC! equ 10 ( + echo [%date% %time%] start.bat already running this boot, exiting. + echo [%date% %time%] start.bat already running this boot, exiting. >> "%START_LOG%" + echo [%date% %time%] [start] start.bat already running this boot, exiting. >> "%FULL_LOG%" + exit /b 0 +) +rem Any other non-zero means acquire_lock.ps1 ITSELF failed (parse error, +rem missing cmdlet, unwritable mount). Do NOT treat that as "held" -- that is +rem precisely what deadlocked the stack when a syntax error in the helper made +rem PowerShell exit 1 and every boot concluded the lock was taken. Fall back to +rem the plain mkdir lock so boot still proceeds with single-instance safety. +if !LOCK_EC! neq 0 ( + echo [%date% %time%] WARN acquire_lock.ps1 failed ^(exit !LOCK_EC!^), falling back to mkdir lock >> "%START_LOG%" + echo [%date% %time%] [start] WARN acquire_lock.ps1 failed ^(exit !LOCK_EC!^), falling back to mkdir lock >> "%FULL_LOG%" + mkdir "%LOCKDIR%" 2>nul + if !errorlevel! neq 0 ( + echo [%date% %time%] fallback lock held, exiting. >> "%START_LOG%" + echo [%date% %time%] [start] fallback lock held, exiting. >> "%FULL_LOG%" + exit /b 0 + ) +) + +call :log "%START_LOG%" "====== Boot ======" +call :log "%INSTALL_LOG%" "====== Boot ======" + +:: ── Run install ────────────────────────────────────────────────── +call :log "%START_LOG%" "Running install.bat..." +call "%SCRIPTS%\install.bat" +if !errorlevel! equ 3 ( + call :log "%START_LOG%" "Reboot scheduled by install.bat, stopping." + call :release_lock + exit /b 0 +) +if !errorlevel! neq 0 ( + call :log "%START_LOG%" "ERROR: install.bat failed (exit code !errorlevel!)" + call :release_lock + exit /b 1 +) +call :log "%START_LOG%" "install.bat done." + +:: ── Pip install ────────────────────────────────────────────────── +:: Install base deps first (pyyaml required for config_helper.py below). +:: numpy<2 pin: MetaTrader5 5.0.5735 was built against numpy 1.x and breaks +:: silently with numpy 2.x — reads still work but order_send fails immediately +:: with (-2, 'Unnamed arguments not allowed'). Drop the pin once MetaQuotes +:: ships a numpy-2-compatible wheel. +:: +:: Each pip command writes to a per-call temp file so we can detect whether +:: anything ACTUALLY got installed/upgraded (presence of "Successfully +:: installed" in pip's output). If so, the python processes already running +:: from the previous boot are stale → reboot to pick up the new libs. +set "PIP_TMP=%TEMP%\mt5-pip-%RANDOM%-%RANDOM%.txt" +set "PIP_CHANGED=0" + +call :log "%START_LOG%" "Installing pip packages..." +call :log "%PIP_LOG%" "Installing pip packages..." +rem MCP v2 removed mcp.server.fastmcp; keep this synchronized with requirements-api.txt. +"%PYDIR%\python.exe" -m pip install pyyaml MetaTrader5 "numpy<2" flask waitress flask-compress psutil "mcp==1.28.0" a2wsgi > "%PIP_TMP%" 2>&1 +set "PIP_EC=!errorlevel!" +type "%PIP_TMP%" >> "%PIP_LOG%" +findstr /C:"Successfully installed" "%PIP_TMP%" >nul 2>&1 && set "PIP_CHANGED=1" +del "%PIP_TMP%" 2>nul +if !PIP_EC! neq 0 ( + call :log "%START_LOG%" "ERROR: pip install (base) failed (exit code !PIP_EC!), aborting." + call :log "%PIP_LOG%" "ERROR: pip install (base) failed" + call :release_lock + exit /b 1 +) +:: Extra packages from config.yaml requirements list. +:: NOTE: no `usebackq` — with usebackq, single-quoted strings are LITERAL, +:: not commands. Without usebackq, ('cmd') executes the command. This is +:: the same pattern install.bat uses for the `ports` lookup. +for /f "delims=" %%R in ('"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" requirements 2^>nul') do ( + "%PYDIR%\python.exe" -m pip install "%%R" > "%PIP_TMP%" 2>&1 + type "%PIP_TMP%" >> "%PIP_LOG%" + findstr /C:"Successfully installed" "%PIP_TMP%" >nul 2>&1 && set "PIP_CHANGED=1" + del "%PIP_TMP%" 2>nul +) +call :log "%START_LOG%" "pip done." +call :log "%PIP_LOG%" "pip done." + +:: Routed through reboot.bat so the flag write + lock release happen in one +:: place. Previously this inlined its own flag+shutdown+rmdir sequence, which +:: was correct but meant three separate reboot implementations to keep in sync. +if "!PIP_CHANGED!"=="1" ( + call :log "%START_LOG%" "pip changed packages -> rebooting so api_runners pick up new libs" + call "%SCRIPTS%\reboot.bat" pip-changed + exit /b 0 +) + +:: ── Start Windows event log tailer (background) ──────────────── +:: Streams Warning/Error/Critical from System + Application logs into +:: %LOGDIR%\windows-events.log so OOM kills, BSODs, terminal64 crashes, +:: etc. show up alongside the API logs. Single-instance via lock file +:: inside the script. +call :log "%START_LOG%" "Starting Windows event log tailer..." +start "Win Event Tailer" /B powershell -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File "%SCRIPTS%\event-log-tailer.ps1" + +:: ── Kill lingering MT5 terminals ──────────────────────────────── +call :log "%START_LOG%" "Killing lingering MT5 terminals..." +tasklist /fi "imagename eq terminal64.exe" 2>nul | find /i "terminal64.exe" >nul && ( + taskkill /f /im terminal64.exe >nul 2>&1 + timeout /t 2 /nobreak >nul +) + +:: ── Verify config.yaml exists ─────────────────────────────────── +if not exist "%CONFIG%\config.yaml" ( + call :log "%START_LOG%" "ERROR: config.yaml not found! Copy config/config.yaml.example and re-run." + call :release_lock + exit /b 1 +) + +:: ── Parse config.yaml terminals once ──────────────────────────── +set "TERM_LIST=%TEMP%\mt5_terminals.txt" +"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" terminals > "%TERM_LIST%" 2>"%TEMP%\mt5_parse_err.txt" +if !errorlevel! neq 0 ( + call :log "%START_LOG%" "ERROR: Failed to parse config.yaml:" + type "%TEMP%\mt5_parse_err.txt" >> "%START_LOG%" + del "%TERM_LIST%" 2>nul + call :release_lock + exit /b 1 +) + +:: ── Periodic auto-reboot scheduled task ───────────────────────── +:: MT5 terminals share a desktop with DWM, and DWM/VirtIO-GPU crashes +:: under sustained load wedge the SDK pipe (terminal64.exe stops +:: responding to GDI/IPC). Cheapest mitigation: hard-reboot every N +:: minutes to flush GPU/desktop state before it rots. +:: Configured via config.yaml reboot_interval (minutes). 0 = disabled. +:: Default: 30. /f on schtasks is idempotent -- overwrites existing task. +:: +:: The task calls reboot.bat, NOT `shutdown` directly. Calling shutdown here +:: was the root cause of the permanent-deadlock outage: it killed start.bat +:: mid-run without writing rebooting.flag and without releasing +:: %SHARED%\start.running, and that orphaned lock (living on the host mount) +:: blocked every subsequent boot. reboot.bat always does both. +:: +:: No inner quotes in /tr -- schtasks quote-escaping is fragile, and %SCRIPTS% +:: has no spaces (C:\Users\Docker\Desktop\Shared\scripts). +set "REBOOT_INTERVAL=30" +"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" reboot_interval > "%SHARED%\mt5_ri.tmp" 2>nul +for /f "usebackq delims=" %%V in ("%SHARED%\mt5_ri.tmp") do set "REBOOT_INTERVAL=%%V" +del "%SHARED%\mt5_ri.tmp" 2>nul +if "!REBOOT_INTERVAL!"=="0" ( + schtasks /delete /tn "MT5AutoReboot" /f >nul 2>&1 + call :log "%START_LOG%" "Auto-reboot disabled (reboot_interval=0)." +) else ( + schtasks /create /tn "MT5AutoReboot" /tr "cmd.exe /c %SCRIPTS%\reboot.bat scheduled" /sc minute /mo !REBOOT_INTERVAL! /ru "SYSTEM" /rl HIGHEST /f >nul 2>&1 + if !errorlevel! equ 0 ( + call :log "%START_LOG%" "MT5AutoReboot task ensured (every !REBOOT_INTERVAL! min)." + ) else ( + call :log "%START_LOG%" "WARN: failed to create MT5AutoReboot task (errorlevel !errorlevel!)." + ) +) + +:: ── Compile chartctl loader EA (zero-touch bootstrap) ──────────── +:: Compiles MT5ChartLoader in every broker base and propagates the .ex5 +:: into existing terminal instances, so the [StartUp] Expert= line in +:: mt5start.ini can auto-attach it at launch. Skipped when chartctl is +:: disabled globally in config.yaml. Non-fatal: a compile failure only +:: means chart deployments stay unavailable until fixed. +:: Tempfile read, NOT for /f ('command') — with both python.exe and the +:: script path quoted, cmd's quote-stripping mangles the subshell command +:: and it silently outputs nothing (same failure the api_token block +:: documents; also why install.bat's ports lookup falls back to 6542). +set "CHARTCTL_ON=" +"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" chartctl_enabled > "%SHARED%\mt5_cc.tmp" 2>nul +for /f "usebackq delims=" %%C in ("%SHARED%\mt5_cc.tmp") do set "CHARTCTL_ON=%%C" +del "%SHARED%\mt5_cc.tmp" 2>nul +if "!CHARTCTL_ON!"=="1" ( + call :log "%START_LOG%" "Compiling chartctl loader EA (MT5ChartLoader)..." + call "%SCRIPTS%\compile-chartctl-loader.bat" >> "%START_LOG%" 2>&1 + if !errorlevel! neq 0 ( + call :log "%START_LOG%" "WARN: chartctl loader compile failed -- chart deployments unavailable. See logs\compile-chartctl-loader.log" + ) else ( + call :log "%START_LOG%" "chartctl loader compiled and propagated." + ) +) else ( + call :log "%START_LOG%" "chartctl disabled in config.yaml -- skipping loader compile." +) + +:: ── Launch MT5 terminals ───────────────────────────────────────── +call :log "%START_LOG%" "Launching MT5 terminals..." +set TERM_COUNT=0 +for /f "usebackq delims=" %%L in ("%TERM_LIST%") do ( + call :launch_terminal %%L + if !errorlevel! neq 0 ( + call :log "%START_LOG%" "ERROR: Failed to launch terminal, aborting." + del "%TERM_LIST%" 2>nul + call :release_lock + exit /b 1 + ) + set /a TERM_COUNT+=1 +) + +if !TERM_COUNT! equ 0 ( + call :log "%START_LOG%" "ERROR: No terminals configured in config.yaml" + del "%TERM_LIST%" 2>nul + call :release_lock + exit /b 1 +) + +call :log "%START_LOG%" "Launched !TERM_COUNT! terminal(s), waiting 30s to initialize..." +timeout /t 30 /nobreak >nul + +:: ── Load API token from config.yaml (optional) ────────────────── +:: Tempfile path is more robust than `for /f`'s subshell+quoting dance — +:: any python crash, pyyaml fallback install, or stdout buffering quirk +:: showed up as "API_TOKEN empty" through the for/f path. +set "API_TOKEN=" +set "TOKEN_TMP=%TEMP%\mt5_api_token.txt" +del "%TOKEN_TMP%" 2>nul +"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" api_token > "%TOKEN_TMP%" 2>nul +if exist "%TOKEN_TMP%" set /p API_TOKEN=<"%TOKEN_TMP%" +del "%TOKEN_TMP%" 2>nul +if defined API_TOKEN ( + call :log "%START_LOG%" "API token loaded." +) else ( + call :log "%START_LOG%" "WARNING: api_token empty in config.yaml, API running without auth." +) + +:: ── Launch API processes (all background) ──────────────────────── +call :log "%START_LOG%" "Launching API processes..." +for /f "usebackq delims=" %%L in ("%TERM_LIST%") do ( + call :launch_api_bg %%L +) +del "%TERM_LIST%" 2>nul +call :release_lock +call :log "%START_LOG%" "All !TERM_COUNT! API(s) running in background." + +:: ── Foreground: status + health monitor ────────────────────────── +:status_loop +cls +echo. +echo ===================================================== +echo MT5 HTTP API RUNNING -- %DATE% %TIME% +echo ===================================================== +echo. +"%PYDIR%\python.exe" "%SCRIPTS%\check_health.py" +echo. +timeout /t 60 /nobreak >nul +goto status_loop + +:: ══════════════════════════════════════════════════════════════════ +:launch_terminal +:: %1=broker %2=account %3=instance %4=port %5=utc_offset %6=mode (live|backtest) +set "LT_BROKER=%~1" +set "LT_ACCOUNT=%~2" +set "LT_INSTANCE=%~3" +set "LT_PORT=%~4" +set "LT_MODE=%~6" +if "!LT_INSTANCE!"=="" set "LT_INSTANCE=default" +if "!LT_MODE!"=="" set "LT_MODE=live" +set "LT_BASEDIR=%BROKERS%\!LT_BROKER!\base" +set "LT_DIR=%BROKERS%\!LT_BROKER!\!LT_ACCOUNT!\!LT_INSTANCE!" + +if not exist "!LT_BASEDIR!\terminal64.exe" ( + call :log "%START_LOG%" "ERROR: No base install for !LT_BROKER! at !LT_BASEDIR!" + exit /b 1 +) + +if not exist "!LT_DIR!\terminal64.exe" ( + call :log "%START_LOG%" "Copying !LT_BROKER!\base to !LT_BROKER!\!LT_ACCOUNT!\!LT_INSTANCE!..." + xcopy "!LT_BASEDIR!\*" "!LT_DIR!\" /E /I /H /Y /Q >nul 2>&1 + if !errorlevel! neq 0 ( + call :log "%START_LOG%" "ERROR: xcopy failed for !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE!" + exit /b 1 + ) +) + +del "!LT_DIR!\Config\settings.ini" 2>nul +del "!LT_DIR!\Config\common.ini" 2>nul + +call :write_ini "!LT_DIR!" "!LT_BROKER!" "!LT_ACCOUNT!" "!LT_INSTANCE!" "!LT_MODE!" + +rem Save journal log size before launch so we only check NEW content +for /f "delims=" %%D in ('python -c "from datetime import date;print(date.today().strftime('%%Y%%m%%d'))"') do set "LT_LOGDATE=%%D" +set "LT_LOGFILE=!LT_DIR!\logs\!LT_LOGDATE!.log" +set LT_LOGSIZE=0 +if exist "!LT_LOGFILE!" ( + for %%A in ("!LT_LOGFILE!") do set LT_LOGSIZE=%%~zA +) + +if /i "!LT_MODE!"=="backtest" ( + call :log "%START_LOG%" " !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! mode=backtest -- portable dir prepared, terminal NOT launched (tester will spawn it on demand)." + exit /b 0 +) + +call :log "%START_LOG%" "Starting terminal: !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! (port !LT_PORT!) [log offset !LT_LOGSIZE!]" +powershell -Command "Start-Process '!LT_DIR!\terminal64.exe' -ArgumentList '/portable','/config:\"!LT_DIR!\mt5start.ini\"' -Verb RunAs -WindowStyle Normal" + +rem Wait for 'started for' in journal log (for /L avoids goto inside call) +set LT_STARTED=0 +for /L %%N in (1,1,120) do ( + if !LT_STARTED! equ 0 ( + python -c "import sys;f=open(sys.argv[1],'rb');f.seek(int(sys.argv[2]));d=f.read().decode('utf-16-le',errors='ignore');f.close();sys.exit(0 if 'started for' in d else 1)" "!LT_LOGFILE!" !LT_LOGSIZE! 2>nul + if !errorlevel! equ 0 ( + set LT_STARTED=1 + ) else ( + call :log "%START_LOG%" " Waiting for !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! to start (%%N)..." + timeout /t 5 /nobreak >nul + ) + ) +) +if !LT_STARTED! equ 0 ( + call :log "%START_LOG%" "ERROR: !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! failed to start after 10 minutes" + exit /b 1 +) +call :log "%START_LOG%" " !LT_BROKER!/!LT_ACCOUNT!/!LT_INSTANCE! started." +exit /b 0 + +:: ══════════════════════════════════════════════════════════════════ +:launch_api_bg +set "LA_BROKER=%~1" +set "LA_ACCOUNT=%~2" +set "LA_INSTANCE=%~3" +set "LA_PORT=%~4" +set "LA_OFFSET=%~5" +set "LA_MODE=%~6" +if "!LA_INSTANCE!"=="" set "LA_INSTANCE=default" +if "!LA_OFFSET!"=="" set "LA_OFFSET=0" +if "!LA_MODE!"=="" set "LA_MODE=live" + +call :log "%START_LOG%" "Starting API (bg): !LA_BROKER!/!LA_ACCOUNT!/!LA_INSTANCE! on port !LA_PORT! (utc_offset=!LA_OFFSET! mode=!LA_MODE!)" +if "!LA_INSTANCE!"=="default" ( + start "MT5 API !LA_BROKER!/!LA_ACCOUNT!" cmd /c ""%SCRIPTS%\api_runner.bat" !LA_BROKER! !LA_ACCOUNT! !LA_INSTANCE! !LA_PORT! !API_TOKEN! !LA_OFFSET! !LA_MODE!" +) else ( + start "MT5 API !LA_BROKER!/!LA_ACCOUNT!/!LA_INSTANCE!" cmd /c ""%SCRIPTS%\api_runner.bat" !LA_BROKER! !LA_ACCOUNT! !LA_INSTANCE! !LA_PORT! !API_TOKEN! !LA_OFFSET! !LA_MODE!" +) +exit /b 0 + +:: ══════════════════════════════════════════════════════════════════ +:write_ini +set "WI_DIR=%~1" +set "WI_BROKER=%~2" +set "WI_ACCOUNT=%~3" +set "WI_INSTANCE=%~4" +set "WI_MODE=%~5" +if "!WI_INSTANCE!"=="" set "WI_INSTANCE=default" +if "!WI_MODE!"=="" set "WI_MODE=live" +set "WI_CFG=!WI_DIR!\mt5start.ini" +"%PYDIR%\python.exe" "%SCRIPTS%\config_helper.py" write_ini "!WI_BROKER!" "!WI_ACCOUNT!" "!WI_CFG!" "!WI_INSTANCE!" "!WI_MODE!" >> "%START_LOG%" 2>&1 +if errorlevel 1 ( + call :log "%START_LOG%" "WARNING: Could not write ini for !WI_BROKER!/!WI_ACCOUNT!, using defaults" + echo [Common]> "!WI_CFG!" + echo KeepPrivate=0>> "!WI_CFG!" + echo AutoTrading=1>> "!WI_CFG!" + echo NewsEnable=0>> "!WI_CFG!" + echo [Experts]>> "!WI_CFG!" + echo AllowLiveTrading=1>> "!WI_CFG!" + echo AllowDllImport=1>> "!WI_CFG!" + echo Enabled=1>> "!WI_CFG!" + echo [Email]>> "!WI_CFG!" + echo Enable=0>> "!WI_CFG!" +) +exit /b 0 + +:: ══════════════════════════════════════════════════════════════════ +:release_lock +:: /s /q is REQUIRED: the lock dir contains acquire_lock.ps1's boot.id stamp, +:: so a bare `rmdir` fails on a non-empty directory and would leave the lock +:: behind -- reintroducing the deadlock this whole mechanism removes. +rmdir /s /q "%LOCKDIR%" 2>nul +exit /b 0 + +:: ══════════════════════════════════════════════════════════════════ +:log +echo [%date% %time%] %~2 +echo [%date% %time%] %~2 >> "%~1" +echo [%date% %time%] [start] %~2 >> "%FULL_LOG%" +exit /b 0 diff --git a/scripts/webrequest_allowlist_codec.py b/scripts/webrequest_allowlist_codec.py new file mode 100644 index 0000000..4a59c7d --- /dev/null +++ b/scripts/webrequest_allowlist_codec.py @@ -0,0 +1,117 @@ +#!/usr/bin/env python3 +"""Codec for the MT5 ``[Experts] WebRequestUrl=`` allowlist blob (Config/common.ini). + +The WebRequest allowed-URL list (Tools -> Options -> Expert Advisors) is stored in +each terminal's ``Config/common.ini`` as ``WebRequestUrl=``. The hex is a +length-preserving encrypted blob produced by terminal64.exe. It is +NOT machine-bound: the key is fixed in the binary, so a blob generated here is +accepted verbatim by any terminal of the same build. That lets us provision the +allowlist programmatically (no RDP / no Options dialog), which is what Chart +Deployments needs so deployed EAs can call WebRequest without manual setup. + +FORMAT (fully reverse-engineered from terminal64.exe fn @0x7ff7824d4010): + ini hex string --%04X per uint16, stored LE--> ciphertext bytes (== swap16 of naive hex) + plaintext = u16le(1) + u16le(checksum) + utf16le(";".join(urls)) + where checksum = (sum of every UTF-16 code unit in the joined string) & 0xffff + cipher (decode, config-load direction) is a byte-wise CFB stream: + p[i] = ((c[i-1] + KEY[i % 16]) & 0xff) ^ c[i] with c[-1] = 0 + encode is the exact inverse (feedback taken from the ciphertext byte). + +The leading u16 is a constant 1 in every observed blob. The checksum lives at the +FRONT of the plaintext, so editing any URL character changes it and re-ciphers the +whole tail -- this is why the blob looked like a strong full-avalanche cipher in +black-box testing when it is really a single CFB pass plus a front checksum. + +Verified: round-trips byte-identically against 18 independent real broker-terminal +blobs (BlackBull, IC Markets, FP Markets, Darwinex, Ducascopy, AquaFunded, ...). +""" +from __future__ import annotations + +# 16-byte key, recovered by cryptanalysis of the CFB recurrence and confirmed +# against 50+ plaintext bytes and 18 full-blob round-trips. (The binary derives +# it at runtime via an obfuscated routine from a .rdata seed; the derived bytes +# are what matter and are reproduced here directly.) +KEY = bytes([0xe2, 0x30, 0x54, 0xb4, 0xde, 0xe5, 0xcc, 0x04, + 0x9c, 0x70, 0x8f, 0x3c, 0x6b, 0x87, 0x78, 0xf0]) + + +def _swap16(data: bytes) -> bytes: + b = bytearray(data) + for i in range(0, len(b) - 1, 2): + b[i], b[i + 1] = b[i + 1], b[i] + return bytes(b) + + +def _decode_cfb(ct: bytes) -> bytes: + out = bytearray(len(ct)) + prev = 0 + for i, c in enumerate(ct): + out[i] = ((prev + KEY[i % 16]) & 0xff) ^ c + prev = c + return bytes(out) + + +def _encode_cfb(pt: bytes) -> bytes: + out = bytearray(len(pt)) + prev = 0 + for i, p in enumerate(pt): + c = ((prev + KEY[i % 16]) & 0xff) ^ p + out[i] = c + prev = c + return bytes(out) + + +def _checksum(s: str) -> int: + # sum over UTF-16 code units (BMP chars == ord); & 0xffff + return sum(b[0] | (b[1] << 8) + for b in (s.encode("utf-16-le")[i:i + 2] + for i in range(0, len(s) * 2, 2))) & 0xffff + + +def decode_blob(hex_blob: str) -> list[str]: + """Ciphertext hex (value of ``WebRequestUrl=``) -> list of URL strings.""" + pt = _decode_cfb(_swap16(bytes.fromhex(hex_blob.strip()))) + body = pt[4:].decode("utf-16-le") + return body.split(";") if body else [] + + +def encode_urls(urls: list[str]) -> str: + """List of URL strings -> uppercase ciphertext hex for ``WebRequestUrl=``.""" + joined = ";".join(urls) + pt = (1).to_bytes(2, "little") + _checksum(joined).to_bytes(2, "little") \ + + joined.encode("utf-16-le") + return _swap16(_encode_cfb(pt)).hex().upper() + + +# --- embedded verified test vectors (real captured broker blobs) --- +_VECTORS = [ + ("13E33B7856715A56F2822DF172EBC0D0BD8DF23E89A42B2716A602C68D06506070409EEA021DA6A29" + "525874B0D86E7F7D8A8FC4898B30E0A3DCDFBBF9D166474552580CC55704642FD8D1DE13AB3CADA08D8" + "DC28AFCA0C080292FABED14A1828BA8A1B67BCD700FC69F9D094E55E2A3AAE7E17637D986B67D868511" + "562DB", + ["https://tracker.algotradingspace.com", "https://api.telegram.org"]), + ("13E33B7E56715A56F2822DF172EBC0D0BD8DF23E96B1070332C2DCA0AD263444A7774E9A324DA39FCE5" + "E783C0982D0E0CC9CF7439FBA", + ["https://aaaaaaaaaaaaaa.co"]), +] + + +def _selftest() -> None: + for blob, urls in _VECTORS: + blob = blob.replace("\n", "") + assert decode_blob(blob) == urls, decode_blob(blob) + assert encode_urls(urls) == blob, encode_urls(urls) + print("webrequest_allowlist_codec: self-test OK (%d vectors)" % len(_VECTORS)) + + +if __name__ == "__main__": + import sys + if len(sys.argv) == 1 or sys.argv[1] == "--selftest": + _selftest() + elif sys.argv[1] == "decode": + for u in decode_blob(sys.argv[2]): + print(u) + elif sys.argv[1] == "encode": + print(encode_urls(sys.argv[2:])) + else: + print("usage: webrequest_allowlist_codec.py [--selftest | decode | encode ...]") diff --git a/tests/chartctl_fake_loader.py b/tests/chartctl_fake_loader.py new file mode 100644 index 0000000..455b4cf --- /dev/null +++ b/tests/chartctl_fake_loader.py @@ -0,0 +1,111 @@ +"""A Python stand-in for the loader EA, implementing the terminal side of +Chart Control Protocol v1. Lets the full endpoint suite run on Linux with +no MT5, no Windows — the same trick conftest uses to stub the SDK. + +It reads desired.json and writes observed.json exactly as the MQL5 loader +would, so integration tests exercise the real registry merge + status +derivation against a realistic observed file. +""" +import json +import os + + +class FakeLoader: + def __init__(self, protocol_dir: str): + self.dir = protocol_dir + os.makedirs(self.dir, exist_ok=True) + os.makedirs(os.path.join(self.dir, "shots"), exist_ok=True) + self.auto_trading = True + self._next_chart_id = 133039100 + + # ── protocol files ─────────────────────────────────────────── + def _read(self, name): + try: + with open(os.path.join(self.dir, name), encoding="utf-8") as fh: + return json.load(fh) + except (OSError, ValueError): + return None + + def _write(self, name, obj): + path = os.path.join(self.dir, name) + tmp = path + ".tmp" + with open(tmp, "w", encoding="utf-8") as fh: + json.dump(obj, fh) + os.replace(tmp, path) + + # ── one reconcile pass ─────────────────────────────────────── + def reconcile(self, *, fail_ids=None, missing_ids=None): + """Materialize observed.json from desired.json. + + fail_ids: deployments that should report a terminal error. + missing_ids: enabled deployments the loader 'fails to attach' + (stay pending / degraded). + """ + fail_ids = set(fail_ids or []) + missing_ids = set(missing_ids or []) + desired = self._read("desired.json") or {"revision": 0, "deployments": []} + + charts, dep_status, errors = [], [], [] + for dep in desired.get("deployments", []): + did = dep["id"] + if not dep.get("enabled", True): + dep_status.append({"id": did, "status": "paused"}) + continue + if did in fail_ids: + errors.append({"id": did, "status": "failed", + "code": "EXPERT_NOT_ATTACHED", + "detail": "fake failure"}) + dep_status.append({"id": did, "status": "failed"}) + continue + if did in missing_ids: + dep_status.append({"id": did, "status": "pending"}) + continue + cid = self._next_chart_id + self._next_chart_id += 1 + charts.append({ + "chart_id": cid, "symbol": dep["symbol"], + "timeframe": dep["timeframe"], "expert": dep["expert"], + "expert_enabled": True, "deployment_id": did, + }) + dep_status.append({"id": did, "status": "running", "chart_id": cid}) + + observed = { + "protocol": 1, + "loader": {"name": "FakeLoader", "version": "1.0.0", + "last_loop": "now", + "applied_revision": desired.get("revision", 0)}, + "terminal": {"auto_trading": self.auto_trading}, + "charts": charts, + "deployments": dep_status, + "errors": errors, + } + self._write("observed.json", observed) + return observed + + # ── command channel ────────────────────────────────────────── + def handle_command(self): + cmd = self._read("command.json") + if not cmd: + return None + cid = cmd["command_id"] + result = {"command_id": cid} + if cmd.get("action") == "screenshot": + fname = f"{cid}.png" + with open(os.path.join(self.dir, "shots", fname), "wb") as fh: + fh.write(b"\x89PNG\r\n\x1a\n") # PNG magic, enough for a test + result.update({"status": "ok", "file": fname}) + elif cmd.get("action") == "close_chart": + if cmd.get("chart_id") == -1: # sentinel: unknown chart + result.update({"status": "error", "error_code": "CLOSE_FAILED", + "error_detail": "err=4101"}) + else: + result.update({"status": "ok"}) + else: + result.update({"status": "error", "error_code": "UNKNOWN_ACTION", + "error_detail": cmd.get("action", "")}) + self._write("command_result.json", result) + try: + os.remove(os.path.join(self.dir, "command.json")) + except OSError: + pass + return result diff --git a/tests/test_chartctl_endpoints.py b/tests/test_chartctl_endpoints.py new file mode 100644 index 0000000..260f6aa --- /dev/null +++ b/tests/test_chartctl_endpoints.py @@ -0,0 +1,305 @@ +"""End-to-end chartctl endpoint tests via Flask's test client, with the +Python FakeLoader playing the terminal side of the protocol. + +Repoints every chartctl path at a tmp dir, registers the routes on a +fresh Flask app (config gating is bypassed here — we wire handlers +directly so the suite doesn't depend on CHARTCTL_ENABLED at import). +""" +from __future__ import annotations + +import io +import json +import os + +import pytest +from flask import Flask + +from tests.chartctl_fake_loader import FakeLoader + + +@pytest.fixture +def client(monkeypatch, tmp_path): + from mt5api.chartctl import paths, registry, command + + experts = tmp_path / "experts" + sets_ = tmp_path / "sets" + proto = tmp_path / "proto" + tpls = tmp_path / "tpls" + host_e = tmp_path / "host_experts" + host_s = tmp_path / "host_sets" + for d in (experts, sets_, proto, tpls, host_e, host_s, + proto / "shots"): + d.mkdir(parents=True, exist_ok=True) + + monkeypatch.setattr(paths, "EXPERTS_DIR", str(experts)) + monkeypatch.setattr(paths, "SETS_DIR", str(sets_)) + monkeypatch.setattr(paths, "PROTOCOL_DIR", str(proto)) + monkeypatch.setattr(paths, "TEMPLATES_DIR", str(tpls)) + monkeypatch.setattr(paths, "SCREENSHOTS_DIR", str(proto / "shots")) + monkeypatch.setattr(paths, "HOST_EXPERTS_DIR", str(host_e)) + monkeypatch.setattr(paths, "HOST_SETS_DIR", str(host_s)) + monkeypatch.setattr(paths, "REGISTRY_PATH", str(tmp_path / "registry.json")) + monkeypatch.setattr(paths, "DESIRED_PATH", str(proto / "desired.json")) + monkeypatch.setattr(paths, "OBSERVED_PATH", str(proto / "observed.json")) + monkeypatch.setattr(paths, "COMMAND_PATH", str(proto / "command.json")) + monkeypatch.setattr(paths, "COMMAND_RESULT_PATH", + str(proto / "command_result.json")) + # registry caches some path constants via import — repoint those too. + monkeypatch.setattr(registry.paths, "REGISTRY_PATH", str(tmp_path / "registry.json")) + monkeypatch.setattr(registry.paths, "DESIRED_PATH", str(proto / "desired.json")) + monkeypatch.setattr(registry.paths, "OBSERVED_PATH", str(proto / "observed.json")) + monkeypatch.setattr(registry.paths, "PROTOCOL_DIR", str(proto)) + monkeypatch.setattr(registry, "_STATE", None) + # tpl_builder writes into TEMPLATES_DIR imported at module load + from mt5api.chartctl import tpl_builder + monkeypatch.setattr(tpl_builder, "TEMPLATES_DIR", str(tpls)) + # shorten command timeout so the timeout test is fast + monkeypatch.setattr(command, "CHARTCTL_COMMAND_TIMEOUT_SECONDS", 1) + + from mt5api.handlers import chartctl + app = Flask(__name__) + app.post("/experts")(chartctl.upload_expert) + app.get("/experts")(chartctl.list_experts) + app.delete("/experts/")(chartctl.delete_expert) + app.post("/sets")(chartctl.upload_set) + app.get("/sets")(chartctl.list_sets) + app.get("/sets/")(chartctl.get_set) + app.post("/deployments")(chartctl.create_deployment) + app.get("/deployments")(chartctl.list_deployments) + app.post("/deployments/reconcile")(chartctl.reconcile) + app.get("/deployments/")(chartctl.get_deployment) + app.patch("/deployments/")(chartctl.patch_deployment) + app.delete("/deployments/")(chartctl.delete_deployment) + app.get("/charts")(chartctl.charts) + app.get("/loader")(chartctl.loader_status) + app.post("/charts//screenshot")(chartctl.screenshot) + app.post("/charts//close")(chartctl.close_chart) + + c = app.test_client() + c._proto_dir = str(proto) # stash for the fake loader + return c + + +def _upload_expert(client, name="EA.ex5", content=b"MZ\x00fakeex5"): + return client.post("/experts", data={ + "expert": (io.BytesIO(content), name)}, + content_type="multipart/form-data") + + +def _upload_set(client, name="gold.set", text="Lots=0.10\nMagic=777\n"): + return client.post("/sets", data={ + "set": (io.BytesIO(text.encode("utf-16")), name)}, + content_type="multipart/form-data") + + +# ── artifacts ──────────────────────────────────────────────────────── + +def test_expert_upload_list_dedupe(client): + r = _upload_expert(client) + assert r.status_code == 201 + sha = r.get_json()["sha256"] + # re-upload identical -> skipped + r2 = _upload_expert(client) + assert r2.get_json()["skipped"] is True + lst = client.get("/experts").get_json()["experts"] + assert any(e["name"] == "EA.ex5" and e["sha256"] == sha for e in lst) + + +def test_expert_upload_conflict_on_hash_change(client): + _upload_expert(client, content=b"one") + r = _upload_expert(client, content=b"two") + assert r.status_code == 409 + assert r.get_json()["code"] == "EXISTS" + + +def test_set_upload_returns_parsed_inputs(client): + r = _upload_set(client) + assert r.status_code == 201 + inputs = r.get_json()["inputs"] + assert {"name": "Lots", "value": "0.10"} in inputs + + +def test_expert_traversal_rejected(client): + r = client.post("/experts", data={ + "expert": (io.BytesIO(b"x"), "../evil.ex5")}, + content_type="multipart/form-data") + assert r.status_code == 400 + + +# ── deployment lifecycle with fake loader ──────────────────────────── + +def test_full_deploy_verify_cycle(client): + _upload_expert(client) + _upload_set(client) + r = client.post("/deployments", json={ + "expert": "EA.ex5", "set": "gold.set", + "symbol": "XAUUSD", "timeframe": "M5"}) + assert r.status_code == 202 + dep_id = r.get_json()["id"] + + # Before the loader runs: pending, not converged. + v = client.get("/deployments").get_json() + assert v["deployments"][0]["status"] == "pending" + assert v["converged"] is False + + # A .tpl was generated. + from mt5api.chartctl import paths + assert os.path.exists(os.path.join(paths.TEMPLATES_DIR, f"{dep_id}.tpl")) + + # Loader reconciles -> running + converged. + loader = FakeLoader(client._proto_dir) + loader.reconcile() + v = client.get("/deployments").get_json() + assert v["deployments"][0]["status"] == "running" + assert v["converged"] is True + + # /charts reflects the live inventory. + charts = client.get("/charts").get_json() + assert charts["loader_alive"] is True + assert charts["charts"][0]["symbol"] == "XAUUSD" + + +def test_deploy_requires_staged_expert(client): + r = client.post("/deployments", json={ + "expert": "NOPE.ex5", "symbol": "EURUSD", "timeframe": "H1"}) + assert r.status_code == 404 + assert r.get_json()["code"] == "ARTIFACT_NOT_FOUND" + + +def test_duplicate_chart_conflict(client): + _upload_expert(client) + client.post("/deployments", json={ + "expert": "EA.ex5", "symbol": "EURUSD", "timeframe": "H1"}) + r = client.post("/deployments", json={ + "expert": "EA.ex5", "symbol": "EURUSD", "timeframe": "H1"}) + assert r.status_code == 409 + assert r.get_json()["code"] == "DUPLICATE_CHART" + + +def test_pause_then_delete(client): + _upload_expert(client) + dep_id = client.post("/deployments", json={ + "expert": "EA.ex5", "symbol": "USDJPY", "timeframe": "M30" + }).get_json()["id"] + + # pause + r = client.patch(f"/deployments/{dep_id}", json={"enabled": False}) + assert r.status_code == 200 + loader = FakeLoader(client._proto_dir) + loader.reconcile() + item = client.get(f"/deployments/{dep_id}").get_json() + assert item["status"] == "paused" + + # delete removes the tpl and the row + r = client.delete(f"/deployments/{dep_id}") + assert r.status_code == 200 + from mt5api.chartctl import paths + assert not os.path.exists(os.path.join(paths.TEMPLATES_DIR, f"{dep_id}.tpl")) + assert client.get("/deployments").get_json()["deployments"] == [] + + +def test_loader_reports_failure(client): + _upload_expert(client) + dep_id = client.post("/deployments", json={ + "expert": "EA.ex5", "symbol": "GBPUSD", "timeframe": "M15" + }).get_json()["id"] + loader = FakeLoader(client._proto_dir) + loader.reconcile(fail_ids={dep_id}) + item = client.get(f"/deployments/{dep_id}").get_json() + assert item["status"] == "failed" + assert item["error"]["code"] == "EXPERT_NOT_ATTACHED" + + +def test_patch_set_regenerates_tpl(client): + _upload_expert(client) + _upload_set(client, name="a.set", text="Lots=0.01\n") + _upload_set(client, name="b.set", text="Lots=0.99\n") + dep_id = client.post("/deployments", json={ + "expert": "EA.ex5", "set": "a.set", + "symbol": "AUDUSD", "timeframe": "H1"}).get_json()["id"] + from mt5api.chartctl import paths + tpl = os.path.join(paths.TEMPLATES_DIR, f"{dep_id}.tpl") + before = open(tpl, "rb").read() + client.patch(f"/deployments/{dep_id}", json={"set": "b.set"}) + after = open(tpl, "rb").read() + assert b"0.99" in after.decode("utf-16").encode("utf-8") or before != after + + +def test_loader_absent_hint(client): + r = client.get("/loader").get_json() + assert r["alive"] is False + assert "hint" in r + + +def test_screenshot_via_command_channel(client, monkeypatch): + _upload_expert(client) + dep_id = client.post("/deployments", json={ + "expert": "EA.ex5", "symbol": "XAUUSD", "timeframe": "M5" + }).get_json()["id"] + loader = FakeLoader(client._proto_dir) + loader.reconcile() + charts = client.get("/charts").get_json()["charts"] + chart_id = charts[0]["chart_id"] + + # Command channel is synchronous in the handler; drive the fake loader + # from a thread so it answers while the request blocks. + import threading + import time + + def answer(): + for _ in range(20): + if loader.handle_command(): + return + time.sleep(0.05) + + t = threading.Thread(target=answer) + t.start() + r = client.post(f"/charts/{chart_id}/screenshot") + t.join() + assert r.status_code == 200 + assert r.mimetype == "image/png" + + +def _run_with_fake_loader(client, loader, method, url): + """Issue a command-channel request while the fake loader answers.""" + import threading + import time + + def answer(): + for _ in range(20): + if loader.handle_command(): + return + time.sleep(0.05) + + t = threading.Thread(target=answer) + t.start() + r = getattr(client, method)(url) + t.join() + return r + + +def test_close_chart_via_command_channel(client): + _upload_expert(client) + client.post("/deployments", json={ + "expert": "EA.ex5", "symbol": "XAUUSD", "timeframe": "M5"}) + loader = FakeLoader(client._proto_dir) + loader.reconcile() + chart_id = client.get("/charts").get_json()["charts"][0]["chart_id"] + + r = _run_with_fake_loader(client, loader, "post", f"/charts/{chart_id}/close") + assert r.status_code == 200 + assert r.get_json() == {"closed": chart_id} + + +def test_close_chart_loader_failure(client): + loader = FakeLoader(client._proto_dir) + loader.reconcile() + # chart_id -1 is the fake loader's CLOSE_FAILED sentinel + r = _run_with_fake_loader(client, loader, "post", "/charts/-1/close") + assert r.status_code == 502 + assert r.get_json()["code"] == "CLOSE_FAILED" + + +def test_close_chart_bad_id(client): + r = client.post("/charts/notanint/close") + assert r.status_code == 400 diff --git a/tests/test_chartctl_units.py b/tests/test_chartctl_units.py new file mode 100644 index 0000000..b7e4dd0 --- /dev/null +++ b/tests/test_chartctl_units.py @@ -0,0 +1,206 @@ +"""Unit tests for chartctl: path safety, set parsing, tpl generation, +registry desired-state + status derivation. + +All Linux-safe: no MT5 SDK, no Windows. The registry/paths modules are +repointed at a tmp dir per test via monkeypatch, mirroring the backtest +jobs test fixture. +""" +from __future__ import annotations + +import json +import os + +import pytest + + +# ── paths.safe_name ────────────────────────────────────────────────── + +@pytest.mark.parametrize("bad", [ + "", " ", "..", ".", "a/b.ex5", "a\\b.ex5", "../evil.ex5", + "C:\\evil.ex5", "\\\\host\\share\\x.ex5", ".hidden.ex5", + "na.ex5", 'quote".ex5', "pipe|.ex5", "null\x00.ex5", +]) +def test_safe_name_rejects(bad): + from mt5api.chartctl import paths + with pytest.raises(ValueError): + paths.safe_name(bad, "expert", ".ex5") + + +def test_safe_name_accepts_and_checks_ext(): + from mt5api.chartctl import paths + assert paths.safe_name("HappyGoldScalp.ex5", "expert", ".ex5") \ + == "HappyGoldScalp.ex5" + with pytest.raises(ValueError): + paths.safe_name("HappyGoldScalp.set", "expert", ".ex5") + + +# ── setparse ───────────────────────────────────────────────────────── + +def test_parse_plain_and_optimized_set(): + from mt5api.chartctl.setparse import parse_set_text + text = ( + "; comment line\n" + "Lots=0.10\n" + "StopLoss=50||10||5||100||Y\n" + "UseTrailing=1\n" + ) + got = parse_set_text(text) + assert got[0] == {"name": "Lots", "value": "0.10"} + assert got[1]["name"] == "StopLoss" + assert got[1]["value"] == "50" + assert got[1]["optimize"] is True + assert got[1]["start"] == "10" and got[1]["stop"] == "100" + assert got[2] == {"name": "UseTrailing", "value": "1"} + + +def test_parse_utf16_bytes(): + from mt5api.chartctl.setparse import parse_set_bytes + raw = "Lots=0.01\nMagic=12345\n".encode("utf-16") + got = parse_set_bytes(raw) + assert {"name": "Lots", "value": "0.01"} in got + assert {"name": "Magic", "value": "12345"} in got + + +def test_parse_ascii_bytes_even_length(): + # Even-length ASCII input decodes "successfully" as utf-16 garbage if + # utf-16 is blind-tried first, silently yielding zero inputs — and the + # deployment would run on EA defaults. Regression for that decode bug. + from mt5api.chartctl.setparse import parse_set_bytes + raw = b"; comment\r\nLots=0.10\r\nMagic=99\r\n" + assert len(raw) % 2 == 0 + got = parse_set_bytes(raw) + assert {"name": "Lots", "value": "0.10"} in got + assert {"name": "Magic", "value": "99"} in got + + +def test_parse_bomless_utf16_bytes(): + from mt5api.chartctl.setparse import parse_set_bytes + raw = "Lots=0.01\nMagic=12345\n".encode("utf-16-le") # no BOM + got = parse_set_bytes(raw) + assert {"name": "Lots", "value": "0.01"} in got + assert {"name": "Magic", "value": "12345"} in got + + +# ── tpl_builder ────────────────────────────────────────────────────── + +def test_tpl_text_structure(): + from mt5api.chartctl import tpl_builder + text = tpl_builder.build_tpl_text( + deployment_id="dep_abc123", + expert_name="HappyGoldScalp", + expert_rel_path="Experts\\Uploaded\\HappyGoldScalp.ex5", + inputs=[{"name": "Lots", "value": "0.10"}, + {"name": "Magic", "value": "777"}], + terminal_build=4620, + ) + assert "" in text and "" in text + assert "" in text and "" in text + assert "name=HappyGoldScalp" in text + assert "path=Experts\\Uploaded\\HappyGoldScalp.ex5" in text + assert "expertmode=1" in text + assert "__chartctl_id=dep_abc123" in text # attribution input + assert "Lots=0.10" in text and "Magic=777" in text + assert "build=4620" in text # forensic stamp + assert text.endswith("\r\n") + + +def test_tpl_written_as_utf16_with_bom(tmp_path, monkeypatch): + from mt5api.chartctl import tpl_builder, paths + monkeypatch.setattr(paths, "TEMPLATES_DIR", str(tmp_path)) + monkeypatch.setattr(tpl_builder, "TEMPLATES_DIR", str(tmp_path)) + path = tpl_builder.write_tpl( + deployment_id="dep_x", expert_name="EA", + expert_rel_path="Experts\\Uploaded\\EA.ex5", inputs=[]) + data = open(path, "rb").read() + assert data[:2] == b"\xff\xfe" # UTF-16-LE BOM + assert "name=EA" in data.decode("utf-16") + + +# ── registry ───────────────────────────────────────────────────────── + +@pytest.fixture +def reg(monkeypatch, tmp_path): + from mt5api.chartctl import registry, paths + monkeypatch.setattr(paths, "REGISTRY_PATH", str(tmp_path / "registry.json")) + monkeypatch.setattr(paths, "DESIRED_PATH", str(tmp_path / "desired.json")) + monkeypatch.setattr(paths, "OBSERVED_PATH", str(tmp_path / "observed.json")) + monkeypatch.setattr(paths, "PROTOCOL_DIR", str(tmp_path)) + monkeypatch.setattr(paths, "TEMPLATES_DIR", str(tmp_path)) + monkeypatch.setattr(registry, "_STATE", None) + return registry, tmp_path + + +def test_add_bumps_revision_and_writes_desired(reg): + registry, tmp = reg + d = registry.add_deployment( + expert_file="EA.ex5", expert_name="EA", set_file=None, + symbol="XAUUSD", timeframe="M5") + assert d["id"].startswith("dep_") + assert registry.current_revision() == 1 + desired = json.loads((tmp / "desired.json").read_text()) + assert desired["revision"] == 1 + assert desired["deployments"][0]["symbol"] == "XAUUSD" + assert desired["deployments"][0]["template"].startswith("\\Files\\chartctl\\") + + +def test_duplicate_enabled_chart_rejected(reg): + registry, _ = reg + registry.add_deployment(expert_file="A.ex5", expert_name="A", + set_file=None, symbol="EURUSD", timeframe="H1") + with pytest.raises(registry.DuplicateChart): + registry.add_deployment(expert_file="B.ex5", expert_name="B", + set_file=None, symbol="EURUSD", timeframe="H1") + + +def test_disabled_does_not_conflict(reg): + registry, _ = reg + registry.add_deployment(expert_file="A.ex5", expert_name="A", + set_file=None, symbol="EURUSD", timeframe="H1", + enabled=False) + # Same slot, enabled — must be allowed since the first is paused. + registry.add_deployment(expert_file="B.ex5", expert_name="B", + set_file=None, symbol="EURUSD", timeframe="H1") + + +def test_persistence_across_reload(reg): + registry, tmp = reg + registry.add_deployment(expert_file="EA.ex5", expert_name="EA", + set_file=None, symbol="GBPUSD", timeframe="M15") + registry._STATE = None # simulate API restart + deps = registry.list_deployments() + assert len(deps) == 1 and deps[0]["symbol"] == "GBPUSD" + + +def test_remove_bumps_and_clears(reg): + registry, _ = reg + d = registry.add_deployment(expert_file="EA.ex5", expert_name="EA", + set_file=None, symbol="USDJPY", timeframe="H4") + registry.remove_deployment(d["id"]) + assert registry.list_deployments() == [] + assert registry.current_revision() == 2 + + +def test_merged_view_status_pending_without_observed(reg): + registry, _ = reg + registry.add_deployment(expert_file="EA.ex5", expert_name="EA", + set_file=None, symbol="XAUUSD", timeframe="M5") + view = registry.merged_view() + assert view["deployments"][0]["status"] == "pending" + assert view["converged"] is False + assert view["observed_stale"] is True + + +def test_merged_view_running_when_observed_matches(reg): + registry, tmp = reg + d = registry.add_deployment(expert_file="EA.ex5", expert_name="EA", + set_file=None, symbol="XAUUSD", timeframe="M5") + observed = { + "loader": {"applied_revision": registry.current_revision(), + "last_loop": "now"}, + "terminal": {"auto_trading": True}, + "charts": [{"chart_id": 1, "expert": "EA", "deployment_id": d["id"]}], + "deployments": [{"id": d["id"], "status": "running", "chart_id": 1}], + } + (tmp / "observed.json").write_text(json.dumps(observed)) + view = registry.merged_view() + assert view["deployments"][0]["status"] == "running" diff --git a/tests/test_config_generation.py b/tests/test_config_generation.py index ebe82cc..1829ac4 100644 --- a/tests/test_config_generation.py +++ b/tests/test_config_generation.py @@ -142,11 +142,10 @@ def test_absent_vms_file_keeps_every_terminal_on_the_default_container( assert "mt5-b" not in content -def test_live_terminal_ini_declares_no_startup_expert(tmp_path, monkeypatch): - """The generated INI decides what a terminal does on launch, so a `[StartUp]` - section auto-attaches an expert to every live terminal — a fleet-wide - behaviour change in a file nothing else asserts on. Adding that feature means - editing this test deliberately, not inheriting it from an unrelated commit. +def test_live_terminal_ini_startup_expert_with_chartctl(tmp_path, monkeypatch): + """Chart Deployments is enabled by default, so a live terminal's INI carries + a [StartUp] section that auto-attaches MT5ChartLoader. The loader's + GlobalVariable mutex makes repeated re-attaches idempotent. """ helper = _load_config_helper_module() config_path = _write_config( @@ -161,6 +160,33 @@ def test_live_terminal_ini_declares_no_startup_expert(tmp_path, monkeypatch): helper.main() + content = outpath.read_text(encoding="utf-8") + assert "[StartUp]" in content + assert "Expert=Advisors\\MT5ChartLoader" in content + + +def test_live_terminal_ini_declares_no_startup_when_chartctl_disabled(tmp_path, monkeypatch): + """With chartctl explicitly disabled, a live terminal's INI has no [StartUp] + section — no unexpected expert auto-attachment. + """ + helper = _load_config_helper_module() + config_path = _write_config( + tmp_path, + [{"broker": "acme", "account": "main", "port": 5001}], + ) + config_obj = yaml.safe_load(config_path.read_text(encoding="utf-8")) + config_obj["chartctl"] = {"enabled": False} + config_path.write_text(yaml.safe_dump(config_obj), encoding="utf-8") + + outpath = tmp_path / "terminal.ini" + monkeypatch.setattr(helper, "CONFIG_PATH", str(config_path)) + monkeypatch.setattr( + "sys.argv", + ["config_helper.py", "write_ini", "acme", "main", str(outpath), "default", "live"], + ) + + helper.main() + content = outpath.read_text(encoding="utf-8") assert "[StartUp]" not in content assert "Expert=" not in content diff --git a/tests/test_webrequest.py b/tests/test_webrequest.py new file mode 100644 index 0000000..a7648e8 --- /dev/null +++ b/tests/test_webrequest.py @@ -0,0 +1,338 @@ +"""Tests for the WebRequest allowlist codec + manager + endpoint. + +Runs entirely on Linux (no MT5/Windows): the codec is pure Python and the +manager is plain file I/O. The live apply (terminal restart writing common.ini) +is exercised via a stubbed restart_terminal. +""" +from __future__ import annotations + +import json +import os + +import pytest +from flask import Flask + +from mt5api.chartctl import webrequest as wr + +# A real captured broker blob and its plaintext URLs (verified byte-identical). +REAL_BLOB = ( + "13E33B7856715A56F2822DF172EBC0D0BD8DF23E89A42B2716A602C68D06506070409EEA021DA6A29" + "525874B0D86E7F7D8A8FC4898B30E0A3DCDFBBF9D166474552580CC55704642FD8D1DE13AB3CADA08D8" + "DC28AFCA0C080292FABED14A1828BA8A1B67BCD700FC69F9D094E55E2A3AAE7E17637D986B67D868511" + "562DB" +) +REAL_URLS = ["https://tracker.algotradingspace.com", "https://api.telegram.org"] + +_BOM = b"\xff\xfe" + + +def _write_utf16_ini(path: str, text: str) -> None: + os.makedirs(os.path.dirname(path), exist_ok=True) + with open(path, "wb") as f: + f.write(_BOM + text.replace("\n", "\r\n").encode("utf-16-le")) + + +# ── codec ──────────────────────────────────────────────────────────── +def test_codec_roundtrip_real_blob(): + assert wr.decode_blob(REAL_BLOB) == REAL_URLS + assert wr.encode_urls(REAL_URLS) == REAL_BLOB + + +def test_codec_roundtrip_arbitrary(): + urls = ["https://api.example.com", "http://nfs.faireconomy.media/x.xml"] + assert wr.decode_blob(wr.encode_urls(urls)) == urls + + +# ── url hygiene ────────────────────────────────────────────────────── +def test_clean_urls_filters_and_dedupes(): + got = wr.clean_urls([ + " https://a.com ", "https://a.com", "ftp://no.com", + "https://b.com;evil", "", 42, "HTTPS://C.com", + ]) + assert got == ["https://a.com", "HTTPS://C.com"] + + +# ── desired store ──────────────────────────────────────────────────── +def test_desired_store_roundtrip(tmp_path): + cfg = str(tmp_path / "Config") + assert wr.load_desired(cfg) is None + wr.save_desired(cfg, REAL_URLS) + assert wr.load_desired(cfg) == REAL_URLS + with open(wr.desired_path(cfg)) as f: + assert json.load(f)["urls"] == REAL_URLS + + +# ── migrate-from-current ───────────────────────────────────────────── +def test_read_current_urls_from_existing_common_ini(tmp_path): + cfg = str(tmp_path / "Config") + _write_utf16_ini( + wr.common_ini_path(cfg), + f"[Charts]\nProfileLast=Default\n[Experts]\nAllowDllImport=1\n" + f"WebRequest=1\nWebRequestUrl={REAL_BLOB}\n[Objects]\nShow=0\n", + ) + assert wr.read_current_urls(cfg) == REAL_URLS + + +def test_read_current_urls_absent(tmp_path): + assert wr.read_current_urls(str(tmp_path / "Config")) == [] + + +def test_effective_prefers_desired_then_migrates(tmp_path): + cfg = str(tmp_path / "Config") + _write_utf16_ini( + wr.common_ini_path(cfg), + f"[Experts]\nWebRequest=1\nWebRequestUrl={REAL_BLOB}\n", + ) + # no desired yet -> migrate from current + assert wr.effective_urls(cfg) == REAL_URLS + wr.save_desired(cfg, ["https://only.example.com"]) + assert wr.effective_urls(cfg) == ["https://only.example.com"] + + +# ── write_common_ini: preserve everything, upsert the two keys ─────── +def test_write_common_ini_preserves_other_sections(tmp_path): + cfg = str(tmp_path / "Config") + _write_utf16_ini( + wr.common_ini_path(cfg), + "[Charts]\nProfileLast=Default\n[Experts]\nAllowDllImport=1\n" + "WebRequest=0\nWebRequestUrl=DEADBEEF\n[Objects]\nShow=0\n", + ) + new = ["https://api.example.com"] + wr.write_common_ini(cfg, new) + lines = wr._read_lines(wr.common_ini_path(cfg)) + assert "[Charts]" in lines and "ProfileLast=Default" in lines + assert "[Objects]" in lines and "Show=0" in lines + assert "AllowDllImport=1" in lines # sibling key preserved + assert "WebRequest=1" in lines # flipped on + assert wr.read_current_urls(cfg) == new # blob replaced, decodes to new + # exactly one WebRequestUrl line + assert sum(l.strip().lower().startswith("webrequesturl=") for l in lines) == 1 + + +def test_write_common_ini_creates_file_and_section(tmp_path): + cfg = str(tmp_path / "Config") + wr.write_common_ini(cfg, REAL_URLS) + assert os.path.exists(wr.common_ini_path(cfg)) + with open(wr.common_ini_path(cfg), "rb") as f: + assert f.read(2) == _BOM # UTF-16LE BOM preserved + assert wr.read_current_urls(cfg) == REAL_URLS + + +def test_write_common_ini_is_utf16(tmp_path): + cfg = str(tmp_path / "Config") + wr.write_common_ini(cfg, REAL_URLS) + with open(wr.common_ini_path(cfg), "rb") as f: + raw = f.read() + assert b"\x00" in raw # wide chars + assert raw.decode("utf-16").count("[Experts]") == 1 + + +def test_apply_from_desired(tmp_path): + term = str(tmp_path / "term") + cfg = wr.config_dir(term) + assert wr.apply_from_desired(term) is None # no desired -> no-op + assert not os.path.exists(wr.common_ini_path(cfg)) + wr.save_desired(cfg, REAL_URLS) + assert wr.apply_from_desired(term) == len(REAL_URLS) + assert wr.read_current_urls(cfg) == REAL_URLS + + +# ── endpoint ───────────────────────────────────────────────────────── +@pytest.fixture +def client(monkeypatch, tmp_path): + from mt5api.handlers import webrequest as handler + + term = str(tmp_path / "term") + os.makedirs(wr.config_dir(term), exist_ok=True) + monkeypatch.setattr(handler, "TERMINAL_DIR", term) + + calls = {"restart": 0} + + def fake_restart(): + calls["restart"] += 1 + # emulate the real restart applying desired -> common.ini + wr.apply_from_desired(term) + return True + + monkeypatch.setattr(handler, "restart_terminal", fake_restart) + + # default: no AutoIt (bare-metal fallback path) unless a test flips it + from mt5api.chartctl import autoit_webrequest as autoit + monkeypatch.setattr(autoit, "available", lambda: False) + + app = Flask(__name__) + app.get("/webrequest")(handler.get_webrequest) + app.put("/webrequest")(handler.put_webrequest) + app.post("/webrequest/apply")(handler.apply_webrequest) + c = app.test_client() + c._term = term + c._calls = calls + c._autoit = autoit + return c + + +def test_get_empty(client): + r = client.get("/webrequest") + assert r.status_code == 200 and r.get_json() == {"urls": []} + + +def test_put_replace_restarts_and_applies(client): + r = client.put("/webrequest", json={"urls": REAL_URLS}) + assert r.status_code == 200 + body = r.get_json() + assert body["success"] is True and body["urls"] == REAL_URLS + assert body["applied_via"] == "restart" # bare-metal fallback path + assert client._calls["restart"] == 1 + # persisted + written to common.ini + assert wr.load_desired(wr.config_dir(client._term)) == REAL_URLS + assert wr.read_current_urls(wr.config_dir(client._term)) == REAL_URLS + # readable back through GET + assert client.get("/webrequest").get_json()["urls"] == REAL_URLS + + +def test_put_add_remove_migrates_from_current(client): + cfg = wr.config_dir(client._term) + _write_utf16_ini(wr.common_ini_path(cfg), + f"[Experts]\nWebRequest=1\nWebRequestUrl={REAL_BLOB}\n") + r = client.put("/webrequest", json={ + "add": ["https://new.example.com"], + "remove": ["https://api.telegram.org"], + }) + assert r.status_code == 200 + assert r.get_json()["urls"] == [ + "https://tracker.algotradingspace.com", "https://new.example.com", + ] + + +def test_put_uses_autoit_when_available(client, monkeypatch): + """On the VM (AutoIt present) the allowlist is applied via the Options + dialog, not a terminal restart.""" + seen = {} + + def fake_apply(urls, timeout=120, use_runas=False): + seen["urls"] = list(urls) + return "OK", "log" + + monkeypatch.setattr(client._autoit, "available", lambda: True) + monkeypatch.setattr(client._autoit, "apply_urls", fake_apply) + + r = client.put("/webrequest", json={"urls": REAL_URLS}) + assert r.status_code == 200 + body = r.get_json() + assert body["success"] is True and body["applied_via"] == "autoit:OK" + assert seen["urls"] == REAL_URLS + assert client._calls["restart"] == 0 # no restart on the AutoIt path + assert wr.load_desired(wr.config_dir(client._term)) == REAL_URLS + + +def test_put_autoit_failure_returns_500(client, monkeypatch): + monkeypatch.setattr(client._autoit, "available", lambda: True) + monkeypatch.setattr(client._autoit, "apply_urls", lambda urls, timeout=120, use_runas=False: ("FAIL", "boom")) + r = client.put("/webrequest", json={"urls": REAL_URLS}) + assert r.status_code == 500 + # desired still persisted so a later /apply or boot can retry + assert wr.load_desired(wr.config_dir(client._term)) == REAL_URLS + + +def test_apply_endpoint_reapplies_desired(client, monkeypatch): + seen = {} + monkeypatch.setattr(client._autoit, "available", lambda: True) + monkeypatch.setattr( + client._autoit, "apply_urls", + lambda urls, timeout=120, use_runas=False: (seen.update(urls=list(urls)) or ("OK", "")), + ) + wr.save_desired(wr.config_dir(client._term), REAL_URLS) + r = client.post("/webrequest/apply") + assert r.status_code == 200 + assert r.get_json()["urls"] == REAL_URLS + assert seen["urls"] == REAL_URLS + + +def test_apply_endpoint_noop_when_empty(client): + r = client.post("/webrequest/apply") + assert r.status_code == 200 + assert r.get_json()["urls"] == [] + + +def test_put_rejects_non_dict(client): + assert client.put("/webrequest", data="nope").status_code == 400 + + +def test_put_rejects_empty_body(client): + assert client.put("/webrequest", json={}).status_code == 400 + + +def test_put_restart_failure_returns_500(client, monkeypatch): + from mt5api.handlers import webrequest as handler + monkeypatch.setattr(handler, "restart_terminal", lambda: False) + r = client.put("/webrequest", json={"urls": REAL_URLS}) + assert r.status_code == 500 + # desired still persisted (next boot/restart will apply it) + assert wr.load_desired(wr.config_dir(client._term)) == REAL_URLS + + +# ── config_helper boot-seed (start.bat deletes common.ini every boot) ─ +def _load_config_helper(): + import importlib.util + root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + path = os.path.join(root, "scripts", "config_helper.py") + spec = importlib.util.spec_from_file_location("config_helper_under_test", path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod + + +def test_config_helper_write_ini_seeds_common_ini(tmp_path, monkeypatch): + ch = _load_config_helper() + cfg_yaml = tmp_path / "config.yaml" + cfg_yaml.write_text( + "chartctl:\n enabled: true\n" + "accounts:\n testbroker:\n acct1:\n" + " login: 123\n server: TestServer\n password: pw\n" + "terminals:\n - broker: testbroker\n account: acct1\n" + " instance: default\n port: 6542\n mode: live\n" + ) + monkeypatch.setattr(ch, "CONFIG_PATH", str(cfg_yaml)) + + term = tmp_path / "term" + (term / "Config").mkdir(parents=True) + outpath = term / "mt5start.ini" + # simulate a terminal that already has a desired allowlist persisted + wr.save_desired(str(term / "Config"), REAL_URLS) + + monkeypatch.setattr( + ch.sys, "argv", + ["config_helper.py", "write_ini", "testbroker", "acct1", str(outpath), + "default", "live"], + ) + ch.main() + + # mt5start.ini written with the loader StartUp block (chartctl on) + start_ini = outpath.read_text() + assert "[StartUp]" in start_ini and "MT5ChartLoader" in start_ini + # common.ini re-emitted from the desired file, decodes back to the URLs + assert wr.read_current_urls(str(term / "Config")) == REAL_URLS + + +def test_config_helper_write_ini_no_desired_no_common_ini(tmp_path, monkeypatch): + ch = _load_config_helper() + cfg_yaml = tmp_path / "config.yaml" + cfg_yaml.write_text( + "chartctl:\n enabled: true\n" + "accounts:\n testbroker:\n acct1:\n" + " login: 123\n server: TestServer\n password: pw\n" + "terminals:\n - broker: testbroker\n account: acct1\n" + " instance: default\n port: 6542\n mode: live\n" + ) + monkeypatch.setattr(ch, "CONFIG_PATH", str(cfg_yaml)) + term = tmp_path / "term" + (term / "Config").mkdir(parents=True) + outpath = term / "mt5start.ini" + monkeypatch.setattr( + ch.sys, "argv", + ["config_helper.py", "write_ini", "testbroker", "acct1", str(outpath), + "default", "live"], + ) + ch.main() + # no desired file -> boot-seed is a no-op, common.ini left absent + assert not os.path.exists(wr.common_ini_path(str(term / "Config")))