From 02e55c1df5ebac8b9e132d00c8c3676b1d05e755 Mon Sep 17 00:00:00 2001 From: Marinski Date: Fri, 10 Jul 2026 04:50:17 +0000 Subject: [PATCH 1/2] =?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, and nobody clicking through the Navigator. Stage `.ex5`/`.set` artifacts, declare deployments (expert + set + symbol + timeframe) as desired state, and a resident loader EA reconciles the terminal's charts to it. New endpoints: `POST/GET/DELETE /experts`, `POST/GET /sets` + `GET /sets/`, `POST/GET /deployments` + `GET/PATCH/DELETE /deployments/`, `POST /deployments/reconcile`, `GET /charts`, `GET /loader`, `POST /charts//screenshot`, `POST /charts//close`. Chart Control Protocol v1 is a file-based contract in `MQL5\Files\chartctl\` (`desired.json` / `observed.json` / command channel), documented in docs/chart-control-protocol.md. A deployment only reports `running` once the loader confirms the expert is live on a chart, so the status reflects the terminal rather than the request. Drift and failures surface in `observed.json`. Ships a reference loader (`assets/experts/MT5ChartLoader.mq5`) plus a portable include so an existing resident EA can adopt the protocol with three calls instead of running a second EA. A terminal GlobalVariable mutex makes co-existence and duplicate launches safe. OPT-IN. `chartctl.enabled` defaults to false. Enabling it writes a `[StartUp]` section into every live terminal's INI so the loader attaches at launch - fleet-wide behaviour that has to be asked for, never inherited by upgrading. With the block absent nothing changes and the endpoints return 404. Any single terminal opts out with `chartctl: false`. WebRequest allowlist provisioning (`GET`/`PUT /webrequest`, `POST /webrequest/apply`) sets the terminal's allowed-URL list over the API instead of the Options dialog. Two apply paths, chosen at runtime: on this Windows build the list lives in machine-bound `MQL5\experts.dat` and is dropped on every restart, so a bundled portable AutoIt interpreter drives the dialog and main.py re-applies the persisted list ~25s after each terminal start; on bare metal, where `common.ini` is the store, it encodes the list directly (format reverse-engineered from terminal64.exe and verified byte-identical against 18 real broker blobs). GUI applies serialize host-wide behind a named kernel mutex, since desktop focus is shared across terminals. All chartctl handlers are lock-free - pure file I/O against the terminal data dir - so they never queue behind the process-wide MT5 SDK lock. Tests: chartctl units, endpoints, and webrequest, plus a Python fake loader that plays the EA side of the protocol so the endpoint suite runs on Linux with no MT5. 484 passing. --- .agents/skills/mt5-httpapi/SKILL.md | 50 ++ .gitignore | 3 + CHANGELOG.md | 34 + Dockerfile.test | 2 +- README.md | 1 + 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 | 15 + docs/chart-control-protocol.md | 226 +++++++ docs/chart-deployments.md | 222 +++++++ docs/rest-api.md | 1 + examples/chartctl/deploy.sh | 79 +++ 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 | 58 ++ mt5api/handlers/chartctl.py | 394 ++++++++++++ mt5api/handlers/webrequest.py | 100 +++ mt5api/main.py | 44 ++ mt5api/mt5client.py | 20 + mt5api/server.py | 35 +- run.sh | 2 + scripts/compile-chartctl-loader.bat | 87 +++ scripts/config_helper.py | 48 +- scripts/install.bat | 86 +-- scripts/start.bat | 769 ++++++++++++----------- scripts/webrequest_allowlist_codec.py | 117 ++++ tests/chartctl_fake_loader.py | 111 ++++ tests/test_chartctl_endpoints.py | 305 +++++++++ tests/test_chartctl_units.py | 251 ++++++++ tests/test_config_generation.py | 59 ++ tests/test_webrequest.py | 338 ++++++++++ 42 files changed, 5348 insertions(+), 444 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 100644 docs/chart-deployments.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 92ce88b7..2dec246d 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 373b2473..5299c1d5 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 a144eb44..f1b0145e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,40 @@ The project follows [Semantic Versioning](https://semver.org/): patch = bug fixe ## [Unreleased] +Remote EA deployment: attach Expert Advisors to charts with set files over the +HTTP API, no RDP and no terminal restart. + +### Added + +- **Chart Deployments feature** (`mt5api/chartctl/`, `mt5api/handlers/chartctl.py`). Stage `.ex5`/`.set` artifacts, declare deployments (expert + set + symbol + timeframe) as desired state, and a resident loader EA reconciles the terminal's charts to it. New endpoints: `POST/GET/DELETE /experts`, `POST/GET /sets` + `GET /sets/`, `POST/GET /deployments` + `GET/PATCH/DELETE /deployments/`, `POST /deployments/reconcile`, `GET /charts`, `GET /loader`, `POST /charts//screenshot`. +- **Chart Control Protocol v1** — a file-based contract in `MQL5\Files\chartctl\` (`desired.json` / `observed.json` / command channel). Documented in `docs/chart-control-protocol.md`. Deployments only report `running` once the loader confirms the expert is live on a chart; drift and failures surface in `observed.json`. +- **Reference loader EA** `assets/experts/MT5ChartLoader.mq5` plus the portable include `assets/experts/include/ChartControl.mqh`, so an existing resident EA (e.g. an account tracker) can adopt the protocol with three calls instead of running a second EA. Single-loader mutex via a terminal GlobalVariable makes co-existence safe. +- Config block `chartctl:` in `config.yaml` (enable flag, reconcile hint, staleness window, command timeout, upload cap). Live-mode terminals only; per-terminal `chartctl: false` override. +- **Zero-touch loader bootstrap** — `scripts/compile-chartctl-loader.bat` auto-compiles the loader in every broker base on boot and propagates the `.ex5` to existing terminal instances; `config_helper.py write_ini` adds a `[StartUp] Expert=Advisors\MT5ChartLoader` section (honoring `symbol_suffix`) to live chartctl-enabled terminals, so the loader attaches itself at terminal launch. No RDP or manual attach anywhere in the deploy path. Duplicate loaders from re-fired `[StartUp]` lines self-close via the mutex. +- Tests: `tests/test_chartctl_units.py`, `tests/test_chartctl_endpoints.py`, and a Python `tests/chartctl_fake_loader.py` that plays the EA side of the protocol so the full endpoint suite runs on Linux with no MT5. +- **WebRequest allowlist provisioning** (`GET`/`PUT /webrequest`, `POST /webrequest/apply`; `mt5api/chartctl/webrequest.py`, `mt5api/chartctl/autoit_webrequest.py`, `mt5api/handlers/webrequest.py`). Set the terminal's `WebRequest()` allowed-URL list over the API instead of the Options dialog. A dedicated call (not a deployment field) since it's rarely needed. Two apply paths, chosen at runtime: + - **Windows VM (default here):** the allowlist is *not* stored in `common.ini` on this terminal build — it lives in the machine-bound `MQL5\experts.dat` and MT5 drops it on every restart. So it's set the way a user would: a bundled portable AutoIt interpreter (`assets/autoit/AutoIt3_x64.exe` + `set_webrequest.au3`) drives Tools → Options → Expert Advisors and types the URLs in. Takes effect immediately in-session (verified: a probe EA's `WebRequest()` returns HTTP 200 right after). Since MT5 forgets it on restart, `main.py` re-applies the persisted list automatically ~25 s after each terminal (re)start, surviving the periodic auto-reboot. + - **Bare metal:** where `common.ini` *is* the store, falls back to encoding the list into `common.ini` (`scripts/webrequest_allowlist_codec.py`, format reverse-engineered from `terminal64.exe`, verified byte-identical against 18 real broker blobs) + a terminal restart. + + Desired list persisted per terminal (`Config/webrequest.json`); first use migrates from the terminal's existing list, preserving manually-configured URLs. GUI applies are serialized host-wide by a named Windows kernel mutex (`Global\mt5_httpapi_webrequest_autoit`; crash-safe via `WAIT_ABANDONED`) since desktop focus is shared across terminals, and each terminal's boot re-apply is staggered by its port — so many terminals per VM can provision URLs without keystroke collisions. `inspect_options.au3`/`selftest.au3` ship as GUI-automation diagnostics (`POST /webrequest/apply?script=`). Tests: `tests/test_webrequest.py`. Live-mode chartctl terminals only. + +- `POST /charts//close` + a `close_chart` loader command — close any chart by id, including charts the loader cannot attribute to a deployment. The loader refuses to close its own chart. + +### Fixed + +- **WebRequest AutoIt apply drove the wrong terminal window (`options_not_found` / silent wrong-terminal writes).** The scripts matched the MT5 main window by title substring (the login), but `WinList()` also returns hidden windows and cloned terminals of the same account have byte-identical titles — so the apply could target the wrong terminal or fail to activate one at all. The API now resolves its terminal64.exe PID by executable path (WMI) and passes it to the scripts, which match only visible windows owned by that PID and verify the Options dialog belongs to it too, with activation retries. Legacy 3-arg script invocation still works (title fallback). + +- **Loader v1.0.2 — duplicate-chart leak across terminal restarts.** The `chartctl:` chart-comment stamp does not survive MT5's profile save/restore cycle, so every terminal restart (including the periodic auto-reboot) left the loader unable to recognize its own chart and it opened a fresh duplicate — accumulating until the terminal's chart cap. Reconcile now first **adopts** an unowned chart already running the deployment's exact expert + symbol + timeframe before opening a new one; comment stamps are verified by read-back (`ChartSetString` is async); a failed attach closes the chart it opened (previously an expert-less chart leaked per attempt) and backs off for 60 s; and errors are tracked per deployment instead of in a single shared slot (one deployment's failure no longer masks another's). + +### Notes + +- All chartctl handlers are **lock-free** — pure file I/O against the terminal data dir — so they never queue behind the process-wide MT5 SDK lock. +- Additive and **opt-in**: `chartctl.enabled` defaults to `false`. With the block + absent the API behaves exactly as before and no `[StartUp]` section is written. + Enabling it auto-attaches the loader EA to every live terminal, which is a + fleet-wide behaviour change and must never arrive by upgrade. + + ## [v4.12.2] — 2026-08-20 ### Fixed diff --git a/Dockerfile.test b/Dockerfile.test index f4f7445d..e7dcdfdd 100644 --- a/Dockerfile.test +++ b/Dockerfile.test @@ -25,7 +25,7 @@ COPY tests ./tests # docker-compose.yml.j2 is here because the compose-generation test renders the # REAL template — a stub would assert nothing about what actually ships. COPY requirements-api.txt requirements-mcpunifier.txt docker-compose.yml.example docker-compose.yml.j2 run.sh ./ -COPY scripts/config_helper.py scripts/start.bat scripts/check_health.py scripts/healthcheck.sh scripts/verify_binaries.py scripts/wickworks-healthcheck.py scripts/recreate-vm.sh ./scripts/ +COPY scripts/config_helper.py scripts/start.bat scripts/check_health.py scripts/healthcheck.sh scripts/verify_binaries.py scripts/wickworks-healthcheck.py scripts/recreate-vm.sh scripts/webrequest_allowlist_codec.py ./scripts/ COPY assets/binaries.lock.json ./assets/ ENV PYTHONPATH=/app diff --git a/README.md b/README.md index 7e70747d..4d4a624b 100644 --- a/README.md +++ b/README.md @@ -129,6 +129,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 onto charts over HTTP instead of clicking through the Navigator | [Chart Deployments](docs/chart-deployments.md) | ## API at a glance 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 00000000..f544dc13 --- /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 00000000..8d97db32 --- /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 aacddfdc..509cd8c9 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 (portable interpreter)", + "version": "3.3.18.0", + "vendor": "AutoIt Team", + "source": "https://www.autoitscript.com/site/autoit/downloads/", + "signature": "valid", + "note": "Bundled because this terminal build keeps the WebRequest allowlist in machine-bound MQL5\\\\experts.dat rather than common.ini, so the list can only be set by driving Tools > Options > Expert Advisors. Only AutoIt3_x64.exe is vendored - no installer, no Aut2Exe, no UDFs - and it runs only the .au3 scripts in this repo. Authenticode signature present and validating. NOT cross-checked against a vendor-published hash: AutoIt does not publish per-file sha256 for the portable interpreter, so the signature is the provenance evidence here rather than a hash comparison." } ] } diff --git a/assets/experts/MT5ChartLoader.mq5 b/assets/experts/MT5ChartLoader.mq5 new file mode 100644 index 00000000..b8c109b9 --- /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 00000000..a2df55c0 --- /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 79bddb69..7a6a1260 100644 --- a/config/config.yaml.example +++ b/config/config.yaml.example @@ -25,6 +25,21 @@ 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: false # OPT-IN. true also auto-attaches the loader EA + # to every live terminal via [StartUp]; false = the + # chartctl endpoints return 404 and nothing changes. + 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 00000000..5df07b03 --- /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/docs/chart-deployments.md b/docs/chart-deployments.md new file mode 100644 index 00000000..c1c6fae2 --- /dev/null +++ b/docs/chart-deployments.md @@ -0,0 +1,222 @@ +# Chart Deployments — remote EA deployment over HTTP + +Attach Expert Advisors to charts with set files over the HTTP API. No RDP, no +terminal restart, and no human clicking through the Navigator. + +## Contents + +- [Quick start](#quick-start) +- [`POST /deployments`](#post-deployments) +- [`GET /loader`](#get-loader) +- [`GET /charts`](#get-charts) +- [Screenshots](#post-chartschart_idscreenshot) and [closing charts](#post-chartschart_idclose) +- [WebRequest allowlist](#webrequest-allowlist) +- [Chart Control Protocol](chart-control-protocol.md) — the file contract the loader speaks + + +> 📹 **Video walkthrough:** *Coming soon — a full walkthrough of staging, deploying, and +> debugging EAs via the chartctl API.* + +Attach Expert Advisors to charts with set files over the HTTP API — no RDP, +no terminal restart. Stage an `.ex5` + `.set`, declare a deployment (expert + +set + symbol + timeframe), and a resident loader EA inside the terminal +reconciles the terminal's actual charts to match. The API holds *desired +state*; the loader reports *observed truth* back, so a deployment only reads +`running` once the expert is confirmed live on a chart. + +Any client — a dashboard, a script, an AI agent — drives it over plain REST. +Full protocol contract and file formats: [`docs/chart-control-protocol.md`](docs/chart-control-protocol.md). + +| Method | Endpoint | Description | +| ------------------------------------------------ | ------------------------------------- | -------------------------------------------------------- | +| `POST` / `GET` / `DELETE` | `/experts` `/experts/` | Stage, list, remove EA `.ex5` files | +| `POST` / `GET` | `/sets` `/sets/` | Stage, list, inspect `.set` parameter files (parsed) | +| `POST` / `GET` | `/deployments` | Create or list deployments | +| `GET` / `PATCH` / `DELETE` | `/deployments/` | Inspect, pause/resume/change set, tear down a deployment | +| `POST` | `/deployments/reconcile` | Force an immediate reconcile cycle (otherwise periodic) | +| `GET` | `/charts` | Live chart/EA inventory from inside the terminal | +| `GET` | `/loader` | Loader EA status — alive, version, chart open count | +| `POST` | `/charts//screenshot` | Capture a chart PNG from inside the terminal | +| `POST` | `/charts//close` | Close a chart by id (any chart, including leaks) | + +**Opt-in.** `chartctl.enabled` defaults to `false`; set it to `true` in +`config.yaml` to switch the feature on. Live-mode terminals only, and any single +terminal can stay clear of it with `chartctl: false`. + +That default is deliberate. Enabling this writes a `[StartUp]` section into every +live terminal's INI, so the loader EA attaches itself at launch — fleet-wide +behaviour that must be asked for, never inherited from an upgrade. With the block +absent nothing changes and the endpoints return 404. + +**Once enabled, setup is none.** On boot, provisioning auto-compiles the bundled loader EA +(`assets/experts/MT5ChartLoader.mq5`) in every broker base and wires a +`[StartUp] Expert=` line into each live terminal's `mt5start.ini`, so the +loader attaches itself at launch — the whole path is API/config-driven, no +RDP. Already have a resident utility EA on every terminal? Adopt the protocol +into it with three calls instead of running a second EA — see +`assets/experts/include/ChartControl.mqh`. The standalone loader steps aside +automatically (single-loader mutex via terminal GlobalVariable). + +### Quick start + +```bash +# 0. Set your base URL + auth token +export MT5_API_URL=http://localhost:8888/yourbroker/yourlogin +export MT5_API_TOKEN=$(grep api_token config/config.yaml | awk -F'"' '{print $2}') + +# 1. Stage an expert (.ex5) and a set file (.set) +curl -F "expert=@HappyGoldScalp.ex5" "$MT5_API_URL/experts" +curl -F "set=@gold-m5.set" "$MT5_API_URL/sets" # returns parsed inputs + +# 2. Deploy — declare desired state +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"}' +# -> {"id":"dep_a1b2c3","status":"pending"} + +# 3. Verify — status flips to "running" once the loader confirms attach +curl -H "Authorization: Bearer $MT5_API_TOKEN" "$MT5_API_URL/deployments" + +# 4. Change the set file in place (no restart), pause, or tear down +curl -X PATCH "$MT5_API_URL/deployments/dep_a1b2c3" \ + -H "Authorization: Bearer $MT5_API_TOKEN" \ + -d '{"set":"gold-m5-v2.set"}' +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" +``` + +### `POST /deployments` + +| Field | Required | Description | +| ----------- | -------- | -------------------------------------------- | +| `expert` | yes | `.ex5` filename (previously staged via `POST /experts`) | +| `set` | yes | `.set` filename (previously staged via `POST /sets`) | +| `symbol` | yes | e.g. `EURUSD` | +| `timeframe` | yes | `M1` `M5` `M15` `M30` `H1` `H4` `D1` `W1` `MN` | + +Example response: + +```json +{ + "id": "dep_a1b2c3", + "expert": "HappyGoldScalp.ex5", + "set": "gold-m5.set", + "symbol": "XAUUSD", + "timeframe": "M5", + "enabled": true, + "status": "pending", + "revision": 1, + "created_at": "2026-07-27T12:00:00Z", + "updated_at": "2026-07-27T12:00:00Z" +} +``` + +Deployment lifecycle: `pending` → `running` (loader confirmed) → `degraded` +(loader sees an error) → `failed` (unrecoverable) or `paused` (disabled by +user). + +### `GET /loader` + +Returns the resident loader EA's status: + +```json +{ + "alive": true, + "version": "1.0.2", + "charts_open": 3, + "observed_revision": 5, + "desired_revision": 5, + "in_sync": true +} +``` + +If `alive` is `false`, the loader hasn't started yet — check that +`chartctl.enabled` is on and the terminal was restarted after provisioning. +The first boot compile log lives at `logs/compile-chartctl-loader.log` inside +the VM. + +### `GET /charts` + +Lists every chart known to the terminal, annotated with which deployment (if +any) the loader attributes it to: + +```json +{ + "charts": [ + {"id": 123, "symbol": "XAUUSD", "timeframe": "M5", + "expert": "HappyGoldScalp.ex5", "deployment_id": "dep_a1b2c3"}, + {"id": 456, "symbol": "EURUSD", "timeframe": "H1", + "expert": "", "deployment_id": null} + ] +} +``` + +Charts with no deployment (e.g. leftover duplicates) can be closed with +`POST /charts//close`. + +### `POST /charts//screenshot` + +Captures a PNG of the chart from inside the terminal. Returns the raw binary +(`image/png`). No query-string auth — put the token in the header. + +```bash +curl -H "Authorization: Bearer $MT5_API_TOKEN" \ + "$MT5_API_URL/charts/123/screenshot" -o xauusd-m5.png +``` + +### `POST /charts//close` + +Sends a `close_chart` command to the loader. The loader refuses to close its +own chart (returns `CLOSE_REFUSED`). + +```json +// Response +{"command_id":"cmd_xxx","status":"accepted"} +``` + +Poll the deployment status to confirm the chart was recreated if expected. + +## WebRequest allowlist + +EAs that call `WebRequest()` need their target hosts in the terminal's +allowlist (Tools → Options → Expert Advisors → *Allow WebRequest for*). +It's a dedicated call rather than something on the deploy hot path (most +deployments need no URLs): + +| Method | Endpoint | Description | +| ------ | ------------------------- | ------------------------------------- | +| `GET` | `/webrequest` | Current effective allowlist | +| `PUT` | `/webrequest` | Replace or add to the allowlist | +| `POST` | `/webrequest/apply` | Re-apply current desired list now | + +```bash +curl -H "Authorization: Bearer $MT5_API_TOKEN" "$MT5_API_URL/webrequest" +curl -X PUT "$MT5_API_URL/webrequest" \ + -H "Authorization: Bearer $MT5_API_TOKEN" \ + -H "Content-Type: application/json" \ + -d '{"add":["https://api.telegram.org"]}' # or {"urls":[...]} to replace +# -> {"success":true,"urls":[...],"applied_via":"autoit:OK"} +curl -X POST "$MT5_API_URL/webrequest/apply" \ + -H "Authorization: Bearer $MT5_API_TOKEN" # re-apply current list now +``` + +Inside the Windows VM the allowlist is **not** stored in `common.ini` — it +lives in the machine-bound `MQL5\experts.dat` and MT5 drops it on every +restart. So the list is applied the way a user would: a bundled AutoIt +interpreter (`assets/autoit/`) drives Tools → Options → Expert Advisors and +types the URLs in. This takes effect immediately in-session (no restart), and +because MT5 forgets it on restart, the API re-applies the persisted list +automatically ~25 s after each terminal (re)start, so it survives the periodic +auto-reboot. On a bare-metal terminal where `common.ini` *is* the store, it +falls back to writing `common.ini` + restarting. + +The desired list is persisted per terminal (`Config/webrequest.json`); the +first call migrates whatever the terminal already has, so manually configured +URLs are preserved. GUI applies are serialized across every terminal on a host +by a named Windows kernel mutex (crash-safe — a dead holder is auto-released), +and each terminal's boot re-apply is staggered by its port, so many terminals +per VM can safely provision WebRequest URLs without their keystrokes colliding. diff --git a/docs/rest-api.md b/docs/rest-api.md index de935f80..2efea264 100644 --- a/docs/rest-api.md +++ b/docs/rest-api.md @@ -12,6 +12,7 @@ One HTTP surface for routing, auth, health, terminal control, account state, and - [Market data](market-data.md) - [Trading and history](trading-and-history.md) - [Backtesting](backtesting.md) +- [Chart Deployments](chart-deployments.md) ## API diff --git a/examples/chartctl/deploy.sh b/examples/chartctl/deploy.sh new file mode 100755 index 00000000..a7966893 --- /dev/null +++ b/examples/chartctl/deploy.sh @@ -0,0 +1,79 @@ +#!/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:" +# Placeholder rather than "${AUTH[@]}": this line is printed, not run, and +# expanding the array here would echo the bearer token to the terminal (and +# into whatever captures this output). +echo " curl -X DELETE -H \"Authorization: Bearer \$MT5_API_TOKEN\" \"$MT5_API_URL/deployments/$DEPLOY_ID\"" diff --git a/mt5api/chartctl/__init__.py b/mt5api/chartctl/__init__.py new file mode 100644 index 00000000..96ea4a78 --- /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 00000000..a2da97f3 --- /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 00000000..6a79700c --- /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 00000000..15995ec9 --- /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 00000000..a910724d --- /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 00000000..8a874083 --- /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 00000000..e0cadbe6 --- /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 00000000..620d1364 --- /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 1338f4c5..a78a826d 100644 --- a/mt5api/config.py +++ b/mt5api/config.py @@ -280,6 +280,64 @@ 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") +# Opt-IN. Defaulting this on would auto-attach the loader EA to every live +# terminal of any install that upgraded without asking for it - a fleet-wide +# behaviour change nobody opted into. Absent chartctl block = unchanged API. +_chartctl_global_enabled = bool(_chartctl_cfg.get("enabled", False)) +CHARTCTL_ENABLED = ( + MODE == "live" + and _chartctl_global_enabled + and (_chartctl_terminal_override is not False) +) +def _chartctl_seconds(raw, default_text: str, floor: int) -> int: + """A duration from the chartctl block, never below `floor`. + + `or ` already covers absent and zero, but NOT negative: + parse_duration_to_seconds accepts "-5s" on purpose, because west-of-UTC + broker offsets need the sign. Without the floor a negative is taken + literally - a stale window that calls every observation stale, or a hint + interval that is permanently due. Both present as a broken loader rather + than as a bad setting. + + Clamped rather than refused, deliberately. This module is imported by the + whole API, so raising on an optional feature's tuning value would stop + trading and backtesting too. vm-watchdog makes the opposite call for the + opposite reason: it holds the Docker socket, so it refuses to start rather + than run on values nobody chose. + """ + parsed = parse_duration_to_seconds(str(raw or default_text)) + return max(floor, parsed or parse_duration_to_seconds(default_text)) + + +def _chartctl_bytes(raw, default: int, floor: int) -> int: + """A byte cap from the chartctl block, never below `floor`. + + A negative cap makes read(cap + 1) return nothing and every upload fail the + length check, reporting a limit of -1 bytes. + """ + return max(floor, int(raw or default)) + + +CHARTCTL_RECONCILE_HINT_SECONDS = _chartctl_seconds( + _chartctl_cfg.get("reconcile_hint_interval"), "5s", 1 +) +CHARTCTL_OBSERVED_STALE_SECONDS = _chartctl_seconds( + _chartctl_cfg.get("observed_stale_after"), "60s", 1 +) +CHARTCTL_COMMAND_TIMEOUT_SECONDS = _chartctl_seconds( + _chartctl_cfg.get("command_timeout"), "30s", 1 +) +# Floor of 1 KiB: a cap below that rejects every real .ex5 and .set. +CHARTCTL_MAX_UPLOAD_BYTES = _chartctl_bytes( + _chartctl_cfg.get("max_upload_bytes"), 16 * 1024 * 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 00000000..8dad4bc5 --- /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 00000000..f03bb9f4 --- /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 ac71e0d7..994e8c33 100644 --- a/mt5api/main.py +++ b/mt5api/main.py @@ -101,6 +101,48 @@ def _gated(environ, start_response): _WSGI_APP = DispatcherMiddleware(app, {"/mcp": _mcp_auth_gate(_MCP_BRIDGE)}) +# 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 + time.sleep(WEBREQUEST_BOOT_DELAY + (PORT % 10) * 3) + for attempt in range(1, 4): + 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() + def _background_init(): """Keep retrying MT5 init until it connects. Runs in a daemon thread. @@ -121,6 +163,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) @@ -204,6 +247,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 9f5baebe..4f3c4984 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 1aca624a..486881ed 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 dbe4b469..384f53d8 100755 --- a/run.sh +++ b/run.sh @@ -61,8 +61,10 @@ cp "${DIR}/scripts/acquire_lock.ps1" "${DIR}/data/shared/scripts/acquire_lock.ps 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/compile-chartctl-loader.bat" "${DIR}/data/shared/scripts/compile-chartctl-loader.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/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" diff --git a/scripts/compile-chartctl-loader.bat b/scripts/compile-chartctl-loader.bat new file mode 100644 index 00000000..cddd72cf --- /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 92c360b4..c7c51361 100644 --- a/scripts/config_helper.py +++ b/scripts/config_helper.py @@ -209,9 +209,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 @@ -223,9 +225,53 @@ 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 (opt-in, + # default FALSE) + 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 {} + # Opt-IN: see mt5api/config.py. A [StartUp] expert on every live terminal + # must never arrive by upgrade. + chartctl_on = bool(chartctl_cfg.get("enabled", False)) + 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", False)) 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/install.bat b/scripts/install.bat index faef744b..8098fa24 100644 --- a/scripts/install.bat +++ b/scripts/install.bat @@ -12,45 +12,34 @@ set "LOCKDIR=%SHARED%\install.running" set "DEBLOAT_DONE=%SHARED%\debloat.done" mkdir "%LOGDIR%" 2>nul -:: ── Stale lock cleanup after a protocol reboot ───────────────────── -:: reboot.bat writes this flag before every reboot. /s /q is REQUIRED now -:: that acquire_lock.ps1 stamps a boot.id file inside the lock dir -- a bare -:: rmdir fails on a non-empty directory and would leave the lock behind. +:: ── Stale lock cleanup after reboot ──────────────────────────────── if exist "%SHARED%\rebooting.flag" ( del "%SHARED%\rebooting.flag" 2>nul - rmdir /s /q "%SHARED%\install.running" 2>nul + rmdir "%SHARED%\install.running" 2>nul ) -:: ── Boot-scoped lock ─────────────────────────────────────────────── -:: The flag above only covers reboots that went through reboot.bat. An abrupt -:: kill -- container OOM, `docker kill`, host power loss -- writes no flag, and -:: %LOCKDIR% lives on the host-mounted %SHARED% volume so it outlives the VM. -:: That stranded lock would block every later boot exactly the way the -:: start.bat one did. The boot stamp makes an ownerless lock self-evident. -set "LOCK_OUT=%TEMP%\mt5_install_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 call :log "lock: %%A" +:: A lock from a previous boot session is stale even without the flag — +:: hard reboots (MT5AutoReboot, docker restart, power loss) give the +:: holder no cleanup window. Boot-time stamp lives in a sibling file so +:: the lock dir stays empty and plain rmdir release still works. +set "BOOTID=" +for /f "delims=" %%B in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).LastBootUpTime.ToString('yyyyMMddHHmmss')" 2^>nul') do set "BOOTID=%%B" +if defined BOOTID if exist "%LOCKDIR%" ( + set "LOCK_BOOTID=" + if exist "%LOCKDIR%.bootid" set /p LOCK_BOOTID=<"%LOCKDIR%.bootid" + if not "!LOCK_BOOTID!"=="!BOOTID!" ( + call :log "Removing stale install.running lock from previous boot." + rmdir /s /q "%LOCKDIR%" 2>nul + ) ) -del "%LOCK_OUT%" 2>nul -rem Exit 10 = a live instance from THIS boot holds it. Anything else non-zero -rem means the helper itself failed; fall back to the plain mkdir lock rather -rem than concluding "held", which is what deadlocked boot when a parse error -rem in the helper made PowerShell exit 1. -if !LOCK_EC! equ 10 ( - call :log "install.bat already running this boot, exiting." + +:: ── Atomic lock ───────────────────────────────────────────────────── +if defined BOOTID echo !BOOTID!>"%LOCKDIR%.bootid" +mkdir "%LOCKDIR%" 2>nul +if !errorlevel! neq 0 ( + call :log "Another install.bat is already running, exiting." exit /b 0 ) -if !LOCK_EC! neq 0 ( - call :log "WARN acquire_lock.ps1 failed (exit !LOCK_EC!), falling back to mkdir lock" - mkdir "%LOCKDIR%" 2>nul - if !errorlevel! neq 0 ( - call :log "fallback lock held, exiting." - exit /b 0 - ) -) call :log "============================================" call :log " MT5 Setup" @@ -91,7 +80,7 @@ call :log "[1/4] Creating scheduled task and disabling UAC..." schtasks /create /tn "MT5Start" /tr "cmd /c \"%SCRIPTS%\start.bat\"" /sc onlogon /ru "Docker" /rl HIGHEST /f >nul 2>&1 if !errorlevel! neq 0 ( call :log "ERROR: Failed to create MT5Start scheduled task" - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) call :log " MT5Start task created." @@ -131,21 +120,21 @@ call :log "[3/4] Installing Python 3.12..." curl -L -o C:\python-installer.exe https://www.python.org/ftp/python/3.12.7/python-3.12.7-amd64.exe >> "%INSTALL_LOG%" 2>&1 if not exist C:\python-installer.exe ( call :log "ERROR: Failed to download Python installer" - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) C:\python-installer.exe /quiet InstallAllUsers=1 PrependPath=1 Include_pip=1 Include_test=0 if !errorlevel! neq 0 ( call :log "ERROR: Python installer failed (exit code !errorlevel!)" del C:\python-installer.exe 2>nul - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) timeout /t 10 /nobreak >nul del C:\python-installer.exe 2>nul if not exist "%PYDIR%\python.exe" ( call :log "ERROR: python.exe not found after installation" - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) for /f "delims=" %%V in ('"%PYDIR%\python.exe" --version 2^>^&1') do call :log " %%V installed." @@ -154,7 +143,7 @@ call :log " Installing MetaTrader5 pip package..." "%PYDIR%\python.exe" -m pip install --upgrade pip >> "%INSTALL_LOG%" 2>&1 if !errorlevel! neq 0 ( call :log "ERROR: pip upgrade failed" - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) rem MetaTrader5 5.0.5735 was built against numpy 1.x. With numpy 2.x installed, @@ -164,7 +153,7 @@ rem Pin numpy<2 until MetaQuotes ships a wheel rebuilt for numpy 2.x. "%PYDIR%\python.exe" -m pip install MetaTrader5 "numpy<2" pyyaml >> "%INSTALL_LOG%" 2>&1 if !errorlevel! neq 0 ( call :log "ERROR: Failed to install MetaTrader5 / numpy / pyyaml" - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) call :log " MetaTrader5 + numpy<2 + pyyaml installed." @@ -215,7 +204,7 @@ for %%F in ("%BROKERS%\mt5setup-*.exe") do ( set "BNAME=!FNAME:mt5setup-=!" call :install_one "!BNAME!" "%%~F" if !errorlevel! neq 0 ( - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) ) @@ -228,7 +217,7 @@ for /d %%D in ("%BROKERS%\*") do ( ) if !HAS_TERMINALS! equ 0 ( call :log "ERROR: No MT5 terminals installed and no installers found!" - call :release_lock + rmdir "%LOCKDIR%" 2>nul exit /b 1 ) @@ -254,7 +243,7 @@ call :log "[4/4] All terminals present." call :log "============================================" call :log " Setup complete!" call :log "============================================" -call :release_lock +rmdir "%LOCKDIR%" 2>nul exit /b 0 @@ -302,20 +291,11 @@ tzutil /s "UTC" >nul 2>&1 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 strand the lock. -rmdir /s /q "%LOCKDIR%" 2>nul -exit /b 0 - :: ══════════════════════════════════════════════════════════════════ :do_reboot -:: Routed through reboot.bat so there is exactly ONE reboot implementation in -:: the stack. It writes rebooting.flag (which this script consumes on the next -:: boot to clear a stale lock) AND releases both lock dirs up front, so the -:: previous "lock intentionally NOT released" contract still holds either way. -call "%SCRIPTS%\reboot.bat" install-requested +echo rebooting > "%SHARED%\rebooting.flag" +shutdown /r /t 5 /f +:: lock intentionally NOT released — rebooting.flag cleans it on next boot exit /b 0 diff --git a/scripts/start.bat b/scripts/start.bat index b880b21f..9f52d26f 100644 --- a/scripts/start.bat +++ b/scripts/start.bat @@ -1,388 +1,381 @@ -@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 + +:: ── Stale lock cleanup ──────────────────────────────────────────── +:: The lock lives on the shared mount and survives reboots, but the +:: holder can't always release it: install.bat's staged reboots leave +:: only a 5s shutdown window (missable under TCG emulation), and +:: MT5AutoReboot / docker restart / power loss leave none. A lock can +:: only legitimately be held by a start.bat from THIS boot session, so +:: it's stamped with the boot time (sibling file, so the lock dir stays +:: empty and plain rmdir release still works) and any other stamp — or +:: none — marks it stale. +set "BOOTID=" +for /f "delims=" %%B in ('powershell -NoProfile -Command "(Get-CimInstance Win32_OperatingSystem).LastBootUpTime.ToString('yyyyMMddHHmmss')" 2^>nul') do set "BOOTID=%%B" +if defined BOOTID if exist "%LOCKDIR%" ( + set "LOCK_BOOTID=" + if exist "%LOCKDIR%.bootid" set /p LOCK_BOOTID=<"%LOCKDIR%.bootid" + if not "!LOCK_BOOTID!"=="!BOOTID!" ( + echo [%date% %time%] Removing stale start.running lock from previous boot. >> "%START_LOG%" + echo [%date% %time%] [start] Removing stale start.running lock from previous boot. >> "%FULL_LOG%" + rmdir /s /q "%LOCKDIR%" 2>nul + ) +) + +:: ── Atomic lock (only one start.bat instance at a time) ────────── +if defined BOOTID echo !BOOTID!>"%LOCKDIR%.bootid" +mkdir "%LOCKDIR%" 2>nul +if !errorlevel! neq 0 ( + echo [%date% %time%] Another start.bat is already running, exiting. + echo [%date% %time%] Another start.bat is already running, exiting. >> "%START_LOG%" + echo [%date% %time%] [start] Another start.bat is already running, 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." + rmdir "%LOCKDIR%" 2>nul + exit /b 0 +) +if !errorlevel! neq 0 ( + call :log "%START_LOG%" "ERROR: install.bat failed (exit code !errorlevel!)" + rmdir "%LOCKDIR%" 2>nul + 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" + rmdir "%LOCKDIR%" 2>nul + 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." + +if "!PIP_CHANGED!"=="1" ( + call :log "%START_LOG%" "pip changed packages -> rebooting so api_runners pick up new libs" + call :log "%FULL_LOG%" "[start] pip changed packages -> rebooting" + echo rebooting > "%SHARED%\rebooting.flag" + shutdown /r /t 5 /f + rmdir "%LOCKDIR%" 2>nul + 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." + rmdir "%LOCKDIR%" 2>nul + 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 + rmdir "%LOCKDIR%" 2>nul + 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. +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 "shutdown /r /t 0 /f /d p:0:0" /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 + rmdir "%LOCKDIR%" 2>nul + 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 + rmdir "%LOCKDIR%" 2>nul + 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 +rmdir "%LOCKDIR%" 2>nul +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 + +:: ══════════════════════════════════════════════════════════════════ +: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 00000000..4a59c7d7 --- /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 00000000..455b4cf9 --- /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 00000000..260f6aa6 --- /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 00000000..3e26087c --- /dev/null +++ b/tests/test_chartctl_units.py @@ -0,0 +1,251 @@ +"""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" + + +# ── Numeric configuration is clamped, not trusted ──────────────────────────── +# +# Same class as the vm-watchdog finding on PR #15: invalid configuration must +# not be taken literally. `or ` covers absent and zero but not +# negative — parse_duration_to_seconds accepts "-5s" on purpose, because +# west-of-UTC broker offsets need the sign. +# +# Clamped rather than refused: this module is imported by the whole API, so +# raising on an optional feature's tuning value would stop trading too. + +from mt5api.config import _chartctl_bytes, _chartctl_seconds + + +@pytest.mark.parametrize("raw", ["-5s", "-1h", "-90m"]) +def test_a_negative_duration_is_clamped_to_the_floor(raw): + """A negative stale window calls every observation stale; a negative hint + interval is permanently due. Both look like a broken loader.""" + assert _chartctl_seconds(raw, "60s", 1) >= 1 + + +@pytest.mark.parametrize("raw", [None, "", 0]) +def test_absent_and_zero_fall_back_to_the_default(raw): + assert _chartctl_seconds(raw, "60s", 1) == 60 + + +@pytest.mark.parametrize("raw,expected", [("12s", 12), ("2m", 120), ("1h", 3600)]) +def test_valid_durations_are_left_alone(raw, expected): + """The clamp must not quietly rewrite a configuration someone meant.""" + assert _chartctl_seconds(raw, "60s", 1) == expected + + +def test_a_negative_upload_cap_cannot_reject_every_file(): + """read(cap + 1) with cap = -1 reads nothing, then len(0) > -1 rejects the + upload while reporting a limit of -1 bytes.""" + assert _chartctl_bytes(-1, 16 * 1024 * 1024, 1024) >= 1024 + + +def test_absent_upload_cap_uses_the_default(): + assert _chartctl_bytes(None, 16 * 1024 * 1024, 1024) == 16 * 1024 * 1024 + + +def test_a_valid_upload_cap_is_left_alone(): + assert _chartctl_bytes(32 * 1024 * 1024, 16 * 1024 * 1024, 1024) == 32 * 1024 * 1024 diff --git a/tests/test_config_generation.py b/tests/test_config_generation.py index 9b03310f..b2243687 100644 --- a/tests/test_config_generation.py +++ b/tests/test_config_generation.py @@ -184,6 +184,65 @@ def test_live_terminal_ini_declares_no_startup_expert(tmp_path, monkeypatch): assert content.count("[Experts]") == 1 +def test_startup_expert_is_written_only_when_chartctl_is_opted_in(tmp_path, monkeypatch): + """The other half of the guard above. + + That test pins the default; this one pins that the feature still works when + asked for, so "no [StartUp]" cannot be satisfied by quietly breaking the + loader bootstrap. Chart Deployments is opt-IN: an upgrade must not start + attaching an EA to every live terminal in a fleet that never enabled it. + """ + helper = _load_config_helper_module() + path = tmp_path / "config.yaml" + path.write_text( + yaml.safe_dump({ + "api_token": "test-token", + "chartctl": {"enabled": True}, + "terminals": [{"broker": "acme", "account": "main", "port": 5001}], + }), + encoding="utf-8", + ) + outpath = tmp_path / "terminal.ini" + monkeypatch.setattr(helper, "CONFIG_PATH", str(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]" in content + assert "Expert=Advisors\\MT5ChartLoader" in content + + +def test_a_terminal_can_opt_out_even_when_chartctl_is_on(tmp_path, monkeypatch): + """Per-terminal `chartctl: false` has to beat the global enable, or there is + no way to keep one terminal clear of the loader.""" + helper = _load_config_helper_module() + path = tmp_path / "config.yaml" + path.write_text( + yaml.safe_dump({ + "api_token": "test-token", + "chartctl": {"enabled": True}, + "terminals": [ + {"broker": "acme", "account": "main", "port": 5001, "chartctl": False} + ], + }), + encoding="utf-8", + ) + outpath = tmp_path / "terminal.ini" + monkeypatch.setattr(helper, "CONFIG_PATH", str(path)) + monkeypatch.setattr( + "sys.argv", + ["config_helper.py", "write_ini", "acme", "main", str(outpath), "default", "live"], + ) + + helper.main() + + assert "[StartUp]" not in outpath.read_text(encoding="utf-8") + + def test_clean_start_uses_single_vm_compose_without_explicit_topology(tmp_path): repo_root = Path(__file__).resolve().parents[1] run_script = (repo_root / "run.sh").read_text(encoding="utf-8") diff --git a/tests/test_webrequest.py b/tests/test_webrequest.py new file mode 100644 index 00000000..a7648e8d --- /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"))) From 4eae86bb625950f75ef4be5318534056cb668332 Mon Sep 17 00:00:00 2001 From: Marinski Date: Thu, 27 Aug 2026 09:22:05 +0300 Subject: [PATCH 2/2] chore(autoit): ship the EULA and required notices beside the bundled binary AutoIt's EULA permits redistribution, including inside another product, on the condition that every copy 'should include all copyright and trademark notices, and shall be accompanied by a copy of this EULA'. The bundled AutoIt3_x64.exe met the provenance bar (byte-identical to the official portable archive, verified independently on both sides of review) but shipped bare of both. assets/autoit/ now carries: - EULA.htm - the official EULA, verbatim as published by the AutoIt Team in the AutoIt v3 documentation, matching the release the binary ships in. Not retyped or reformatted. - NOTICE.txt - the copyright notice taken from the binary's own version resource ('(c) 1999-2025 Jonathan Bennett & AutoIt Team'), the trademark notice from autoitscript.com, provenance (version, sha256, source archive), and a line making clear the .au3 scripts beside it are this repository's own, not AutoIt's. binaries.lock.json's provenance note is updated to record that the 'no vendor-published hash' caveat no longer stands alone: the file has been verified byte-identical to the official archive, and the EULA and notices are named as the redistribution terms. docs/chart-deployments.md points at NOTICE.txt where the bundled interpreter is introduced. --- assets/autoit/EULA.htm | 49 +++++++++++++++++++++++++++++++++++++++ assets/autoit/NOTICE.txt | 37 +++++++++++++++++++++++++++++ assets/binaries.lock.json | 2 +- docs/chart-deployments.md | 5 ++-- 4 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 assets/autoit/EULA.htm create mode 100644 assets/autoit/NOTICE.txt diff --git a/assets/autoit/EULA.htm b/assets/autoit/EULA.htm new file mode 100644 index 00000000..fb6130f4 --- /dev/null +++ b/assets/autoit/EULA.htm @@ -0,0 +1,49 @@ + + + + License + + + + +

Software License

+

AutoIt

+

Author : Jonathan Bennett and the AutoIt Team
+ WWW : https://www.autoitscript.com/site/autoit/
+ Email : support at autoitscript dot com
+ ________________________________________________________

+

END-USER LICENSE AGREEMENT FOR THIS SOFTWARE

+

This End-User License Agreement ("EULA") is a legal agreement between you (either an individual or a single entity) and the mentioned author of this Software for the software product identified above, which includes computer software and may include + associated media, printed materials, and "online" or electronic documentation ("SOFTWARE PRODUCT"). By installing, copying, or otherwise using the SOFTWARE PRODUCT, you agree to be bound by the terms of this EULA. If you do not agree to the terms of + this EULA, do not install or use the SOFTWARE PRODUCT.

+

 

+

SOFTWARE PRODUCT LICENSE

+

The SOFTWARE PRODUCT is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE PRODUCT is licensed, not sold.

+

The definition of SOFTWARE PRODUCT does not includes any files generated by the SOFTWARE PRODUCT, such as compiled script files in the form of standalone executables.

+

1. GRANT OF LICENSE

+

This EULA grants you the following rights:

+

Installation and Use. You may install and use an unlimited number of copies of the SOFTWARE PRODUCT.

+

Reproduction and Distribution. You may reproduce and distribute an unlimited number of copies of the SOFTWARE PRODUCT either in whole or in part; each copy should include all copyright and trademark notices, and shall be accompanied by a copy of + this EULA. Copies of the SOFTWARE PRODUCT may be distributed as a standalone product or included with your own product.

+

Commercial Use. You may use the SOFTWARE PRODUCT for commercial purposes. You may sell for profit and freely distribute scripts and/or compiled scripts that were created with the SOFTWARE PRODUCT.

+

Reverse engineering. You may not reverse engineer or disassemble the SOFTWARE PRODUCT.

+

2. COPYRIGHT

+

All title and copyrights in and to the SOFTWARE PRODUCT (including but not limited to any images, photographs, animations, video, audio, music, text, and "applets" incorporated into the SOFTWARE PRODUCT), the accompanying printed materials, and any + copies of the SOFTWARE PRODUCT are owned by the Author of this Software. The SOFTWARE PRODUCT is protected by copyright laws and international treaty provisions. Therefore, you must treat the SOFTWARE PRODUCT like any other copyrighted material.

+

 

+

MISCELLANEOUS

+

If you acquired this product in the United Kingdom, this EULA is governed by the laws of the United Kingdom. If this product was acquired outside the United Kingdom, then local law may apply.

+

Should you have any questions concerning this EULA, or if you desire to contact the author of this Software for any reason, please contact him/her at the email address mentioned at the top of this EULA.

+

 

+

LIMITED WARRANTY

+

1. NO WARRANTIES

+

The Author of this Software expressly disclaims any warranty for the SOFTWARE PRODUCT. The SOFTWARE PRODUCT and any related documentation is provided "as is" without warranty of any kind, either express or implied, including, without limitation, the + implied warranties or merchantability, fitness for a particular purpose, or non-infringement. The entire risk arising out of use or performance of the SOFTWARE PRODUCT remains with you.

+

2. NO LIABILITY FOR DAMAGES

+

In no event shall the author of this Software be liable for any damages whatsoever (including, without limitation, damages for loss of business profits, business interruption, loss of business information, or any other pecuniary loss) arising out of + the use of or inability to use this product, even if the Author of this Software has been advised of the possibility of such damages. Because some states/jurisdictions do not allow the exclusion or limitation of liability for consequential or + incidental damages, the above limitation may not apply to you.

+

 

+

[END OF LICENSE]

+ + diff --git a/assets/autoit/NOTICE.txt b/assets/autoit/NOTICE.txt new file mode 100644 index 00000000..87024c46 --- /dev/null +++ b/assets/autoit/NOTICE.txt @@ -0,0 +1,37 @@ +AutoIt — bundled copy, copyright and trademark notices +====================================================== + +This directory redistributes one unmodified component of AutoIt v3: + + AutoIt3_x64.exe version 3.3.18.0 + sha256: 5d69a932a077fee044b193c28e84564143f5c7e51079ab48e88fef74ab0b77b7 + byte-identical to the copy in AutoIt's official portable archive + (https://www.autoitscript.com/files/autoit3/autoit-v3.zip) + +Copyright notice (from the binary's own version resource): + + © 1999-2025 Jonathan Bennett & AutoIt Team + +Trademark notice (from https://www.autoitscript.com/site/): + + AutoIt is a trademark of AutoIt Consulting Ltd. + +Author : Jonathan Bennett and the AutoIt Team +WWW : https://www.autoitscript.com/site/autoit/ +Email : support at autoitscript dot com + +License +------- + +AutoIt is redistributed here under its End-User License Agreement, which +permits reproduction and distribution of copies "either in whole or in part" +provided that "each copy should include all copyright and trademark notices, +and shall be accompanied by a copy of this EULA". + +The unmodified official EULA accompanies this copy as EULA.htm in this +directory, as published by the AutoIt Team in the AutoIt v3 documentation +(https://www.autoitscript.com/autoit3/docs/license.htm, retrieved 2026-08-27, +matching the release the bundled binary ships in). + +The .au3 scripts in this directory are NOT part of AutoIt. They are this +repository's own automation, covered by this repository's license. diff --git a/assets/binaries.lock.json b/assets/binaries.lock.json index 509cd8c9..092a711a 100644 --- a/assets/binaries.lock.json +++ b/assets/binaries.lock.json @@ -31,7 +31,7 @@ "vendor": "AutoIt Team", "source": "https://www.autoitscript.com/site/autoit/downloads/", "signature": "valid", - "note": "Bundled because this terminal build keeps the WebRequest allowlist in machine-bound MQL5\\\\experts.dat rather than common.ini, so the list can only be set by driving Tools > Options > Expert Advisors. Only AutoIt3_x64.exe is vendored - no installer, no Aut2Exe, no UDFs - and it runs only the .au3 scripts in this repo. Authenticode signature present and validating. NOT cross-checked against a vendor-published hash: AutoIt does not publish per-file sha256 for the portable interpreter, so the signature is the provenance evidence here rather than a hash comparison." + "note": "Bundled because this terminal build keeps the WebRequest allowlist in machine-bound MQL5\\\\experts.dat rather than common.ini, so the list can only be set by driving Tools > Options > Expert Advisors. Only AutoIt3_x64.exe is vendored - no installer, no Aut2Exe, no UDFs - and it runs only the .au3 scripts in this repo. Authenticode signature present and validating. AutoIt publishes no per-file sha256, but the file has since been verified BYTE-IDENTICAL (same sha256 as above) to AutoIt3_x64.exe inside the official portable archive at autoitscript.com/files/autoit3/autoit-v3.zip - independently by the upstream reviewer and by this repo's maintainer - in addition to the validating Authenticode signature. Redistribution terms: see EULA.htm and NOTICE.txt beside the binary (the EULA requires both to accompany every copy)." } ] } diff --git a/docs/chart-deployments.md b/docs/chart-deployments.md index c1c6fae2..dc5f30a6 100644 --- a/docs/chart-deployments.md +++ b/docs/chart-deployments.md @@ -207,8 +207,9 @@ curl -X POST "$MT5_API_URL/webrequest/apply" \ Inside the Windows VM the allowlist is **not** stored in `common.ini` — it lives in the machine-bound `MQL5\experts.dat` and MT5 drops it on every restart. So the list is applied the way a user would: a bundled AutoIt -interpreter (`assets/autoit/`) drives Tools → Options → Expert Advisors and -types the URLs in. This takes effect immediately in-session (no restart), and +interpreter (`assets/autoit/`; unmodified official binary, redistributed +with its EULA and notices — see `assets/autoit/NOTICE.txt`) drives +Tools → Options → Expert Advisors and types the URLs in. This takes effect immediately in-session (no restart), and because MT5 forgets it on restart, the API re-applies the persisted list automatically ~25 s after each terminal (re)start, so it survives the periodic auto-reboot. On a bare-metal terminal where `common.ini` *is* the store, it