97 lines
3.6 KiB
Python
97 lines
3.6 KiB
Python
"""End-to-end: INIGenerator picks the right MT5 Symbol from explicit alias map.
|
|
|
|
Run: python tests/test_ini_generator.py
|
|
"""
|
|
|
|
import os
|
|
import sys
|
|
import tempfile
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
sys.path.insert(0, os.path.normpath(os.path.join(HERE, "..", "scripts")))
|
|
|
|
from ini_generator import INIGenerator
|
|
|
|
|
|
def _make_cfg(aliases, symbols, out_dir):
|
|
return {
|
|
"mt5_settings": {"terminal_path": "", "data_dir": "",
|
|
"reports_dir": "{PROJECT_ROOT}/reports", "ini_dir": out_dir},
|
|
"backtest_settings": {
|
|
"currency": "USD",
|
|
"date_range": {"from": "2010.01.01", "to": "2024.12.31"},
|
|
"deposit": 10000, "execution_delay": 0, "forward_date": "",
|
|
"forward_mode": 0, "leverage": "1:100", "model": 0,
|
|
"optimization": 0, "replace_report": True, "shutdown_terminal": True,
|
|
"symbols": symbols, "timeframes": ["H1"], "visual": 0,
|
|
"symbol_aliases": aliases,
|
|
},
|
|
"eas": [{"name": "DummyEA", "filename": "MQL5/Experts/DummyEA.ex5", "parameters": {}}],
|
|
}
|
|
|
|
|
|
def _grep_symbol(ini_path, target):
|
|
with open(ini_path, "r", encoding="utf-8") as f:
|
|
for line in f:
|
|
if line.startswith("Symbol="):
|
|
return line.strip().split("=", 1)[1] == target
|
|
return False
|
|
|
|
|
|
def _get_ini_value(ini_path, key):
|
|
with open(ini_path, "r", encoding="utf-8") as f:
|
|
for line in f:
|
|
if line.startswith(f"{key}="):
|
|
return line.strip().split("=", 1)[1]
|
|
return None
|
|
|
|
|
|
def expect(label, ok):
|
|
print(f" {'PASS' if ok else 'FAIL'} {label}")
|
|
if not ok:
|
|
raise AssertionError(label)
|
|
|
|
|
|
def main():
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
cfg = _make_cfg({"XAUUSD": "XAUUSDc"}, ["XAUUSD", "EURUSD"], tmp)
|
|
files = INIGenerator(cfg).generate_ini_files()
|
|
expect("2 files", len(files) == 2)
|
|
expect("XAUUSD alias applied", any(_grep_symbol(f, "XAUUSDc") for f in files))
|
|
expect("EURUSD passes through", any(_grep_symbol(f, "EURUSD") for f in files))
|
|
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
cfg = _make_cfg({}, ["XAUUSD"], tmp)
|
|
files = INIGenerator(cfg).generate_ini_files()
|
|
expect("no alias -> bare", any(_grep_symbol(f, "XAUUSD") for f in files))
|
|
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
cfg = _make_cfg({"XAUUSD": "XAUUSDm"}, ["XAUUSD"], tmp)
|
|
files = INIGenerator(cfg).generate_ini_files()
|
|
expect("explicit override wins", any(_grep_symbol(f, "XAUUSDm") for f in files))
|
|
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
cfg = _make_cfg({}, ["XAUUSD"], tmp)
|
|
cfg["backtest_settings"]["execution_delay"] = 0
|
|
files = INIGenerator(cfg).generate_ini_files()
|
|
expect("delay=0 -> ExecutionMode=0", _get_ini_value(files[0], "ExecutionMode") == "0")
|
|
expect("delay=0 -> no ExecutionDelay line", _get_ini_value(files[0], "ExecutionDelay") is None)
|
|
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
cfg = _make_cfg({}, ["XAUUSD"], tmp)
|
|
cfg["backtest_settings"]["execution_delay"] = -1
|
|
files = INIGenerator(cfg).generate_ini_files()
|
|
expect("delay=-1 -> ExecutionMode=-1", _get_ini_value(files[0], "ExecutionMode") == "-1")
|
|
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
cfg = _make_cfg({}, ["XAUUSD"], tmp)
|
|
cfg["backtest_settings"]["execution_delay"] = 250
|
|
files = INIGenerator(cfg).generate_ini_files()
|
|
expect("delay=250 -> ExecutionMode=250", _get_ini_value(files[0], "ExecutionMode") == "250")
|
|
|
|
print("\nAll INI generator alias checks passed.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|