Files

59 lines
1.4 KiB
Python
Raw Permalink Normal View History

"""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