#!/usr/bin/env python3 """Parse MT5 HTML report and display formatted output""" import re import sys import os def extract_value(pattern, text, group=1): match = re.search(pattern, text) return match.group(group).strip() if match else None def parse_num(s): if not s: return 0 # Handle European format (space as thousands, comma as decimal) s = s.replace(' ', '').replace(',', '.') # Handle multiple dots (take last as decimal) parts = s.split('.') if len(parts) > 2: s = ''.join(parts[:-1]) + '.' + parts[-1] try: return float(s) except: return 0 def parse_report(html_file): try: with open(html_file, 'rb') as f: content = f.read().decode('utf-16-le', errors='ignore') except Exception as e: print(f"Error reading file: {e}") sys.exit(1) # Clean text text = re.sub('<[^<]+?>', ' ', content) text = text.replace(' ', ' ') # Color codes GREEN = '\033[0;32m' YELLOW = '\033[1;33m' RED = '\033[0;31m' BLUE = '\033[0;34m' NC = '\033[0m' BOLD = '\033[1m' # Extract account number from filename account_num = os.path.basename(html_file).split('-')[1].split('.')[0] if '-' in html_file else 'Unknown' print(f"{BOLD}{'='*70}{NC}") print(f"{BOLD} MT5 TRADING REPORT - Account {account_num}{NC}") print(f"{BOLD}{'='*70}{NC}") # Account info print(f"\n{BLUE}📊 ACCOUNT INFORMATION{NC}") print("-" * 50) name = extract_value(r'Name:\s*([^\d]+?)(?:\s+Account|\s*$)', text) if name: print(f"Name: {name}") company = extract_value(r'Company:\s*([^\d]+?)(?:\s+Date|\s*$)', text) if company: print(f"Company: {company}") # Financial results print(f"\n{GREEN}💰 FINANCIAL RESULTS{NC}") print("-" * 50) net_profit_str = extract_value(r'Total Net Profit[^\d\-]*([\-\d\s,\.]+)', text) gross_profit_str = extract_value(r'Gross Profit[^\d]*([\d\s,\.]+)', text) gross_loss_str = extract_value(r'Gross Loss[^\d\-]*([\-\d\s,\.]+)', text) profit_factor_str = extract_value(r'Profit Factor[^\d]*([\d\.]+)', text) if net_profit_str: val = parse_num(net_profit_str) color = GREEN if val > 0 else RED print(f"{color}Total Net Profit: ${val:>12,.2f}{NC}") if gross_profit_str: val = parse_num(gross_profit_str) print(f"Gross Profit: ${val:>12,.2f}") if gross_loss_str: val = parse_num(gross_loss_str) print(f"Gross Loss: ${val:>12,.2f}") if profit_factor_str: val = parse_num(profit_factor_str) color = GREEN if val > 1.5 else YELLOW if val > 1 else RED print(f"{color}Profit Factor: {val:>12.2f}{NC}") # Trade stats print(f"\n{YELLOW}📈 TRADE STATISTICS{NC}") print("-" * 50) trades = extract_value(r'Total Trades[^\d]*(\d+)', text) profit_trades = extract_value(r'Profit Trades \(%[^)]*\)[^\d]*(\d+)', text) loss_trades = extract_value(r'Loss Trades \(%[^)]*\)[^\d]*(\d+)', text) win_pct = extract_value(r'Profit Trades \(%[^)]*\)[^\d]*\d+[^\d]*\((\d+\.?\d*)%', text) largest_profit = extract_value(r'Largest profit trade[^\d]*([\d\s,\.]+)', text) largest_loss = extract_value(r'Largest loss trade[^\d\-]*([\-\d\s,\.]+)', text) if trades: print(f"Total Trades: {trades:>12}") if profit_trades: print(f"{GREEN}Winning Trades: {profit_trades:>12}{NC}") if loss_trades: print(f"{RED}Losing Trades: {loss_trades:>12}{NC}") if win_pct: val = parse_num(win_pct) color = GREEN if val > 60 else YELLOW if val > 40 else RED print(f"{color}Win Rate: {val:>11.2f}%{NC}") if largest_profit: val = parse_num(largest_profit) print(f"Largest Win: ${val:>12,.2f}") if largest_loss: val = parse_num(largest_loss) print(f"Largest Loss: ${val:>12,.2f}") # Calculate return if net_profit_str: profit = parse_num(net_profit_str) return_pct = (profit / 100000) * 100 print(f"\n{BOLD}{'='*70}{NC}") print(f"{BOLD} STARTING BALANCE: $100,000.00{NC}") print(f"{GREEN}{BOLD} CURRENT BALANCE: ${100000 + profit:>12,.2f}{NC}") print(f"{GREEN}{BOLD} NET PROFIT: ${profit:>12,.2f}{NC}") color = GREEN if return_pct > 0 else RED print(f"{color}{BOLD} RETURN: {return_pct:>11.2f}%{NC}") print(f"{BOLD}{'='*70}{NC}") print(f"\n{BLUE}🎯 STRATEGY{NC}") print("-" * 50) print("EA: MultiSignal Confluence EA") print("Signal: Confluence BUY (0.70+)") # Performance assessment print(f"\n{BOLD}✅ PERFORMANCE ASSESSMENT{NC}") print("-" * 50) assessment = [] if win_pct and parse_num(win_pct) > 80: assessment.append("• Excellent win rate (80%+)") elif win_pct and parse_num(win_pct) > 60: assessment.append("• Good win rate (60%+)") if profit_factor_str and parse_num(profit_factor_str) > 2: assessment.append("• Strong profit factor (2.0+)") elif profit_factor_str and parse_num(profit_factor_str) > 1.5: assessment.append("• Good profit factor (1.5+)") if net_profit_str and parse_num(net_profit_str) > 0: assessment.append("• Profitable strategy") if assessment: for item in assessment: print(item) else: print("• Review strategy performance") if __name__ == "__main__": if len(sys.argv) > 1: parse_report(sys.argv[1]) else: # Find latest report import glob report_dir = os.path.expanduser("~/mt5-docker/config/.wine/drive_c/users/abc/Desktop") reports = glob.glob(f"{report_dir}/ReportHistory-*.html") if reports: latest = max(reports, key=os.path.getmtime) parse_report(latest) else: print("No report files found!") print(f"Searched: {report_dir}") sys.exit(1)