forked from mnbvc188199/Warrior_EA
84 lines
3.7 KiB
Python
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()
|