#!/usr/bin/env python3 """Тянет минутные свечи Binance для грид-лаборатории. Кэширует в CSV.""" import urllib.request, json, time, os, sys, csv OUT = os.path.dirname(os.path.abspath(__file__)) def fetch(symbol, interval="1m", days=60): end = int(time.time() * 1000) start = end - days * 86400 * 1000 rows, cur = [], start while cur < end: url = (f"https://api.binance.com/api/v3/klines?symbol={symbol}" f"&interval={interval}&startTime={cur}&limit=1000") for attempt in range(4): try: with urllib.request.urlopen(url, timeout=25) as r: data = json.load(r) break except Exception as e: if attempt == 3: raise time.sleep(1.5 * (attempt + 1)) if not data: break rows += [(int(k[0]), float(k[1]), float(k[2]), float(k[3]), float(k[4]), float(k[5])) for k in data] cur = data[-1][0] + 1 if len(data) < 1000: break return rows def save(symbol, rows, interval): p = os.path.join(OUT, f"{symbol}_{interval}.csv") with open(p, "w", newline="") as f: w = csv.writer(f); w.writerow(["ts", "o", "h", "l", "c", "v"]); w.writerows(rows) return p if __name__ == "__main__": days = int(sys.argv[1]) if len(sys.argv) > 1 else 60 iv = sys.argv[2] if len(sys.argv) > 2 else "1m" for s in ["SOLUSDT", "BTCUSDT", "ETHUSDT"]: t0 = time.time() rows = fetch(s, iv, days) p = save(s, rows, iv) span = (rows[-1][0] - rows[0][0]) / 86400000 if rows else 0 print(f"{s}: {len(rows):,} свечей, {span:.1f} дней, {time.time()-t0:.0f}с → {os.path.basename(p)}")