605faf5310
Add cluster audit pipeline, united EA updates, brochure generators, and publication hygiene (gitignore, MT5 path desensitization, pre-upload scan). Remove tracked reports, models, and binary artifacts from the repo. Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
1.4 KiB
Python
59 lines
1.4 KiB
Python
"""Parse MetaTrader 5 .set optimization files."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
|
|
@dataclass
|
|
class SetParam:
|
|
name: str
|
|
value: Any
|
|
start: Any
|
|
step: Any
|
|
stop: Any
|
|
optimize: bool
|
|
|
|
|
|
def _cast(raw: str) -> Any:
|
|
low = raw.strip().lower()
|
|
if low == "true":
|
|
return True
|
|
if low == "false":
|
|
return False
|
|
if "." in raw:
|
|
try:
|
|
return float(raw)
|
|
except ValueError:
|
|
return raw
|
|
try:
|
|
return int(raw)
|
|
except ValueError:
|
|
return raw
|
|
|
|
|
|
def parse_set_file(path: str | Path) -> dict[str, SetParam]:
|
|
params: dict[str, SetParam] = {}
|
|
for line in Path(path).read_text(encoding="utf-8", errors="ignore").splitlines():
|
|
line = line.strip()
|
|
if not line or line.startswith(";"):
|
|
continue
|
|
if "=" not in line:
|
|
continue
|
|
name, rest = line.split("=", 1)
|
|
parts = rest.split("||")
|
|
if len(parts) < 5:
|
|
continue
|
|
value, start, step, stop, opt = parts[0], parts[1], parts[2], parts[3], parts[4]
|
|
params[name] = SetParam(
|
|
name=name,
|
|
value=_cast(value),
|
|
start=_cast(start),
|
|
step=_cast(step),
|
|
stop=_cast(stop),
|
|
optimize=opt.strip().upper() == "Y",
|
|
)
|
|
return params
|