"""Fill exit_kind/ret/peak_ret for open aipaper picks from rh day DBs (read-only; same rules as settle_open.py: 10x target, -40% stop (rr<=0.6), else last price in 6h tape). Writes aipaper_settled.csv; never edits aipaper.db.""" import os, sqlite3, time, csv, sys sys.path.insert(0, "/opt/hist"); from featlib import SPB RH = "/opt/hist/rh" def days(t): for d in (time.strftime("%Y-%m-%d", time.gmtime(t)), time.strftime("%Y-%m-%d", time.gmtime(t - 86400)), time.strftime("%Y-%m-%d", time.gmtime(t + 86400))): p = "%s/%s.db" % (RH, d) if os.path.exists(p): yield sqlite3.connect("file:%s?mode=ro" % p, uri=True) def settle(tok, pool, tp, entry): for c in days(tp): r = c.execute("SELECT rowid, c1 FROM pools WHERE pool=?", (pool,)).fetchone() if not r: continue kv = dict(c.execute("SELECT k, v FROM kv")); b1 = int(kv["blocks"].split("-")[1]); t1 = int(kv["t1"]) start = b1 - int((t1 - tp) / SPB); inv = r[1] == tok; s = [] for b, sq in c.execute("SELECT block, sqrtp FROM swaps WHERE pid=? AND block>? ORDER BY block, li", (r[0], start)): x = (int(sq) / 2 ** 96) ** 2 if x > 0: s.append(1 / x if inv else x) if not s: continue peak = 1.0 for px in s: rr = px / entry; peak = max(peak, rr) if rr >= 10: return "target_settled", 10 * .97 - 1, peak, len(s) if rr <= .6: return "stop_settled", rr * .97 - 1, peak, len(s) return "tape_end_settled", s[-1] / entry * .97 - 1, peak, len(s) R = sqlite3.connect("file:/opt/hist/analysis/reconcile.db?mode=ro", uri=True) def settle_rec(pool, entry): # fallback: reconcile.db swaps (px already token-oriented), same rules s = [p for (p,) in R.execute("SELECT px FROM swaps WHERE pool=? ORDER BY b, li", (pool,)) if p and p > 0] if not s: return None peak = 1.0 for px in s: rr = px / entry; peak = max(peak, rr) if rr >= 10: return "target_settled_rec", 10 * .97 - 1, peak, len(s) if rr <= .6: return "stop_settled_rec", rr * .97 - 1, peak, len(s) return "tape_end_settled_rec", s[-1] / entry * .97 - 1, peak, len(s) D = sqlite3.connect("file:/opt/hist/analysis/aipaper.db?mode=ro", uri=True) rows = D.execute("SELECT token,pool,t_pick,entry,peak FROM picks WHERE status='open'").fetchall() out = []; nf = 0 for tok, pool, tp, entry, pk in rows: r = settle(tok, pool, tp, entry) if entry else None if not r and entry: r = settle_rec(pool, entry) if r: out.append((tok, tp) + r) else: nf += 1 w = csv.writer(open(sys.argv[1], "w")); w.writerow(["token", "t", "exit_kind", "ret", "peak_ret", "nswaps"]); w.writerows(out) print("open", len(rows), "settled", len(out), "no swaps/pool", nf)