参数优化报告自动保存

This commit is contained in:
2026-07-06 04:55:21 +08:00
parent 04be8aee9a
commit e49bdb1116
2 changed files with 70 additions and 26 deletions
+28 -14
View File
@@ -161,7 +161,7 @@ class ResultAnalyzer:
return results
def copy_xml_results_to_reports(self, mt5_terminal_dir: str, ea_name: str, reports_dir: str) -> str:
def copy_xml_results_to_reports(self, mt5_terminal_dir, ea_name: str, reports_dir: str) -> str:
xml_patterns = [
f'{ea_name}_optimization.xml',
f'{ea_name}_optimization[1].xml',
@@ -172,13 +172,18 @@ class ResultAnalyzer:
latest_xml = None
latest_time = 0
for pattern in xml_patterns:
xml_path = os.path.join(mt5_terminal_dir, pattern)
if os.path.exists(xml_path):
mtime = os.path.getmtime(xml_path)
if mtime > latest_time:
latest_time = mtime
latest_xml = xml_path
search_dirs = mt5_terminal_dir if isinstance(mt5_terminal_dir, (list, tuple)) else [mt5_terminal_dir]
for base_dir in search_dirs:
if not base_dir or not os.path.isdir(base_dir):
continue
for pattern in xml_patterns:
xml_path = os.path.join(base_dir, pattern)
if os.path.exists(xml_path):
mtime = os.path.getmtime(xml_path)
if mtime > latest_time:
latest_time = mtime
latest_xml = xml_path
if latest_xml:
dest_path = os.path.join(reports_dir, os.path.basename(latest_xml))
@@ -269,7 +274,7 @@ class ResultAnalyzer:
return output_path
def analyze_walk_forward(self, mt5_terminal_dir: str, ea_name: str, reports_dir: str) -> Dict:
def analyze_walk_forward(self, mt5_terminal_dir, ea_name: str, reports_dir: str) -> Dict:
result = {
'ea_name': ea_name,
'in_sample': {},
@@ -286,11 +291,20 @@ class ResultAnalyzer:
best_is = sorted(is_results, key=lambda x: x.get('profit_factor', 0), reverse=True)[0]
result['in_sample'] = best_is
forward_xml = os.path.join(mt5_terminal_dir, f'{ea_name}_optimization.forward.xml')
if not os.path.exists(forward_xml):
forward_xml = os.path.join(mt5_terminal_dir, f'{ea_name}_optimization[1].forward.xml')
search_dirs = mt5_terminal_dir if isinstance(mt5_terminal_dir, (list, tuple)) else [mt5_terminal_dir]
forward_xml = None
for base_dir in search_dirs:
if not base_dir or not os.path.isdir(base_dir):
continue
for candidate in (f'{ea_name}_optimization.forward.xml', f'{ea_name}_optimization[1].forward.xml'):
p = os.path.join(base_dir, candidate)
if os.path.exists(p):
forward_xml = p
break
if forward_xml:
break
if os.path.exists(forward_xml):
if forward_xml and os.path.exists(forward_xml):
oos_results = self.parse_mt5_xml_optimization(forward_xml)
if oos_results:
best_oos = sorted(oos_results, key=lambda x: x.get('profit_factor', 0), reverse=True)[0]
@@ -317,4 +331,4 @@ class ResultAnalyzer:
if is_dd > 0 and oos_dd > 0:
result['dd_increase'] = round((oos_dd / is_dd - 1) * 100, 1) if is_dd > 0 else 0
return result
return result