71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
import sqlite3
|
|
import json
|
|
from datetime import datetime, timezone
|
|
|
|
def log_trade_to_db(trade_data, db_path='learning_log.db'):
|
|
"""
|
|
Logging hasil trade ke database SQLite.
|
|
trade_data: dict dengan field minimal:
|
|
- timestamp (str/datetime)
|
|
- symbol (str)
|
|
- tf (str)
|
|
- entry (float)
|
|
- exit (float)
|
|
- pnl (float)
|
|
- direction (str)
|
|
- features (str/list/dict)
|
|
- setup (str/dict)
|
|
- confidence (float, optional)
|
|
- regime (str, optional)
|
|
"""
|
|
# Normalisasi timestamp
|
|
ts = trade_data.get('timestamp')
|
|
if ts is None:
|
|
ts = datetime.now(timezone.utc).isoformat()
|
|
elif isinstance(ts, datetime):
|
|
ts = ts.isoformat()
|
|
|
|
# Konversi features dan setup ke JSON string supaya aman untuk semua tipe
|
|
features_str = json.dumps(trade_data.get('features', ''))
|
|
setup_str = json.dumps(trade_data.get('setup', ''))
|
|
|
|
# Siapkan kolom-kolom wajib
|
|
vals = (
|
|
ts,
|
|
trade_data.get('symbol', 'XAUUSD'),
|
|
trade_data.get('tf', 'M15'),
|
|
float(trade_data.get('entry', 0.0)),
|
|
float(trade_data.get('exit', 0.0)),
|
|
float(trade_data.get('pnl', 0.0)),
|
|
trade_data.get('direction', ''),
|
|
features_str,
|
|
setup_str,
|
|
float(trade_data.get('confidence', 0.0)),
|
|
trade_data.get('regime', ''),
|
|
)
|
|
# Eksekusi insert
|
|
conn = sqlite3.connect(db_path)
|
|
c = conn.cursor()
|
|
c.execute("""
|
|
CREATE TABLE IF NOT EXISTS learning_log (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
timestamp TEXT,
|
|
symbol TEXT,
|
|
tf TEXT,
|
|
entry REAL,
|
|
exit REAL,
|
|
pnl REAL,
|
|
direction TEXT,
|
|
features TEXT,
|
|
setup TEXT,
|
|
confidence REAL,
|
|
regime TEXT
|
|
)
|
|
""")
|
|
c.execute("""
|
|
INSERT INTO learning_log (
|
|
timestamp, symbol, tf, entry, exit, pnl, direction, features, setup, confidence, regime
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
""", vals)
|
|
conn.commit()
|
|
conn.close()
|