| import json
|
| import os
|
| from dataclasses import dataclass, asdict
|
| from datetime import datetime
|
| from typing import Optional, Dict, Any
|
|
|
| # Default Common Files folder used elsewhere
|
| DEFAULT_COMMON = os.path.join(os.environ.get("APPDATA", ""), "MetaQuotes", "Terminal", "Common", "Files", "DualEA")
|
| POLICY_NAME = "policy.json"
|
|
|
|
|
| def resolve_policy_path(common_dir: str = None) -> str:
|
| base = common_dir or DEFAULT_COMMON
|
| os.makedirs(base, exist_ok=True)
|
| return os.path.join(base, POLICY_NAME)
|
|
|
|
|
| @dataclass
|
| class Policy:
|
| version: str
|
| timestamp: str
|
| min_confidence: float = 0.55
|
| # Optional: per-slice overrides in future
|
| overrides: Optional[Dict[str, Any]] = None
|
| # Optional: list of slice probabilities
|
| slice_probs: Optional[list[Dict[str, Any]]] = None
|
|
|
| def to_json(self) -> str:
|
| return json.dumps(asdict(self), indent=2)
|
|
|
|
|
| def write_policy(min_confidence: float, common_dir: str = None, version: str = "1.0.0", slice_probs: Optional[list[Dict[str, Any]]] = None) -> str:
|
| ts = datetime.utcnow().isoformat() + "Z"
|
| policy = Policy(version=version, timestamp=ts, min_confidence=min_confidence, slice_probs=slice_probs)
|
| path = resolve_policy_path(common_dir)
|
| with open(path, "w", encoding="utf-8") as f:
|
| f.write(policy.to_json())
|
| return path
|