kch123 analysis, copy-trade sim, monitoring, admin panel todos, nginx proxy
This commit is contained in:
81
projects/feed-hunter/track-kch123.py
Normal file
81
projects/feed-hunter/track-kch123.py
Normal file
@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Track kch123's new trades and log them"""
|
||||
import json
|
||||
import os
|
||||
import subprocess
|
||||
import sys
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
|
||||
WALLET = "0x6a72f61820b26b1fe4d956e17b6dc2a1ea3033ee"
|
||||
DATA_DIR = Path(__file__).parent / "data" / "kch123-tracking"
|
||||
TRADES_FILE = DATA_DIR / "all-trades.json"
|
||||
NEW_FILE = DATA_DIR / "new-trades.json"
|
||||
STATS_FILE = DATA_DIR / "stats.json"
|
||||
|
||||
def fetch_recent(limit=50):
|
||||
url = f"https://data-api.polymarket.com/activity?user={WALLET}&limit={limit}"
|
||||
r = subprocess.run(["curl", "-s", "-H", "User-Agent: Mozilla/5.0", url],
|
||||
capture_output=True, text=True, timeout=15)
|
||||
return json.loads(r.stdout)
|
||||
|
||||
def main():
|
||||
DATA_DIR.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# Load known trades
|
||||
known_hashes = set()
|
||||
all_trades = []
|
||||
if TRADES_FILE.exists():
|
||||
with open(TRADES_FILE) as f:
|
||||
all_trades = json.load(f)
|
||||
known_hashes = {t.get("transactionHash", "") + str(t.get("outcomeIndex", "")) for t in all_trades}
|
||||
|
||||
# Fetch recent
|
||||
recent = fetch_recent(100)
|
||||
|
||||
new_trades = []
|
||||
for t in recent:
|
||||
key = t.get("transactionHash", "") + str(t.get("outcomeIndex", ""))
|
||||
if key not in known_hashes:
|
||||
new_trades.append(t)
|
||||
known_hashes.add(key)
|
||||
all_trades.append(t)
|
||||
|
||||
# Save updated trades
|
||||
with open(TRADES_FILE, "w") as f:
|
||||
json.dump(all_trades, f)
|
||||
|
||||
# Save new trades for alerting
|
||||
with open(NEW_FILE, "w") as f:
|
||||
json.dump(new_trades, f)
|
||||
|
||||
# Update stats
|
||||
stats = {}
|
||||
if STATS_FILE.exists():
|
||||
with open(STATS_FILE) as f:
|
||||
stats = json.load(f)
|
||||
|
||||
stats["last_check"] = datetime.now(timezone.utc).isoformat()
|
||||
stats["total_tracked"] = len(all_trades)
|
||||
stats["new_this_check"] = len(new_trades)
|
||||
|
||||
with open(STATS_FILE, "w") as f:
|
||||
json.dump(stats, f, indent=2)
|
||||
|
||||
# Output for alerting
|
||||
if new_trades:
|
||||
buys = [t for t in new_trades if t.get("type") == "TRADE" and t.get("side") == "BUY"]
|
||||
redeems = [t for t in new_trades if t.get("type") == "REDEEM"]
|
||||
|
||||
print(f"NEW TRADES: {len(new_trades)} ({len(buys)} buys, {len(redeems)} redeems)")
|
||||
for t in buys:
|
||||
print(f" BUY ${t.get('usdcSize',0):,.2f} | {t.get('title','')} ({t.get('outcome','')})")
|
||||
for t in redeems:
|
||||
amt = t.get('usdcSize', 0)
|
||||
status = "WIN" if amt > 0 else "LOSS"
|
||||
print(f" REDEEM ${amt:,.2f} [{status}] | {t.get('title','')}")
|
||||
else:
|
||||
print("NO_NEW_TRADES")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user