Warrior_EA/Scripts/tester_results.py
2026-09-06 12:17:42 -04:00

84 lines
3.7 KiB
Python

"""One pass over a finished tester run: log counts, report headline, journal rows."""
import collections
import glob
import html
import os
import re
import sqlite3
import sys
STAMP = sys.argv[1] if len(sys.argv) > 1 else '12:07'
REPORT = sys.argv[2] if len(sys.argv) > 2 else 'WarriorIBG_SP500_2022'
TERM = r'C:\Users\admin\AppData\Roaming\MetaQuotes\Terminal\10CE948A1DFC9A8C27E56E827008EBD4'
TESTER = r'C:\Users\admin\AppData\Roaming\MetaQuotes\Tester\10CE948A1DFC9A8C27E56E827008EBD4'
COMMON = r'C:\Users\admin\AppData\Roaming\MetaQuotes\Terminal\Common\Files\Warrior_EA'
# --- the agent log that carries this build's run
seg = None
for p in glob.glob(os.path.join(TESTER, 'Agent-*', 'logs', '20260906.log')):
t = open(p, 'rb').read().decode('utf-16', 'ignore').split('\n')
idx = [k for k, l in enumerate(t) if 'COMPILED 2026.09.06 ' + STAMP in l]
if idx:
seg = t[idx[-1]:]
print('agent log:', p, 'lines', len(seg))
break
if seg is None:
print('no agent log carries build', STAMP)
sys.exit(1)
c = collections.Counter()
keys = {'fired': 'gap-up fired', 'nn_declined': 'DECLINED by the network', 'shaped': 'order shaped by setup',
'buy_stop_sent': 'buy stop', 'deals': 'deal #', 'buys': ' buy ', 'time_stops': 'time stop -',
'refused': 'REFUSED', 'withheld': 'withheld', 'lot_reject': 'invalid computed lot',
'no_history': 'not enough history', 'expired': 'expired', 'thread_finished': 'thread finished'}
for l in seg:
for k, pat in keys.items():
if pat in l and 'ChartSaveTemplate' not in l:
if k == 'buys' and 'deal #' not in l:
continue
c[k] += 1
print('counts:', dict(c))
shown = 0
for l in seg:
if ('order shaped by setup' in l or 'buy stop' in l and ('Trade\t' in l or 'OrderSend' in l)
or 'time stop -' in l or 'deal #' in l):
print(' ' + l.replace('CS\t0\t', '')[:210])
shown += 1
if shown >= 14:
break
# --- the report
rep = os.path.join(TERM, REPORT + '.htm')
if os.path.exists(rep):
raw = open(rep, 'rb').read()
try:
tx = raw.decode('utf-16')
except Exception:
tx = raw.decode('utf-8', 'ignore')
tx = re.sub(r'<[^>]+>', ' ', tx)
tx = html.unescape(tx)
tx = re.sub(r'\s+', ' ', tx)
print('report:', rep)
for k in ['Initial Deposit', 'Total Net Profit', 'Profit Factor', 'Expected Payoff', 'Total Trades',
'Profit Trades', 'Loss Trades', 'Balance Drawdown Maximal', 'Equity Drawdown Maximal',
'Largest profit trade', 'Largest loss trade', 'Sharpe Ratio', 'Recovery Factor']:
i = tx.find(k)
if i >= 0:
print(' ' + tx[i:i + 70])
else:
print('no report at', rep)
# --- the journal rows this run wrote
dbs = sorted(glob.glob(os.path.join(COMMON, 'Databases', 'Signals', 'SP500_16385_*.db')),
key=os.path.getmtime)
for db in dbs[-2:]:
con = sqlite3.connect(db)
try:
cols = [r[1] for r in con.execute('PRAGMA table_info(TradeJournal)')]
n = con.execute('SELECT COUNT(*) FROM TradeJournal').fetchone()[0]
nctx = con.execute("SELECT COUNT(*) FROM TradeJournal WHERE context IS NOT NULL AND context <> ''").fetchone()[0] if 'context' in cols else -1
print(f'journal {os.path.basename(db)}: {n} rows, {nctx} with context; has context={("context" in cols)} passages={("passages" in cols)}')
if nctx > 0:
for r in con.execute("SELECT context, passages FROM TradeJournal WHERE context <> '' ORDER BY rowid DESC LIMIT 2"):
print(' ctx:', r[0][:230])
print(' pas:', (r[1] or '')[:160])
except Exception as e:
print('journal', db, 'error', e)
con.close()