Fetch native exchange OHLCV per timeframe instead of local aggregation.
Store and serve 15m/2h/4h directly from the exchange so market charts match venue candles. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -130,14 +130,14 @@ class TestHubKlineStore(unittest.TestCase):
|
||||
self.assertTrue(out.get("ok"))
|
||||
self.assertEqual(len(out.get("candles") or []), 300)
|
||||
|
||||
def test_resolve_15m_from_5m_aggregate(self):
|
||||
def test_resolve_15m_reads_native_bars(self):
|
||||
init_db(self.db)
|
||||
now = int(time.time() * 1000)
|
||||
period = TIMEFRAME_MS["5m"]
|
||||
last_closed = last_closed_bar_open_ms("5m", now)
|
||||
period = TIMEFRAME_MS["15m"]
|
||||
last_closed = last_closed_bar_open_ms("15m", now)
|
||||
bars = []
|
||||
for i in range(30):
|
||||
oms = last_closed - (29 - i) * period
|
||||
for i in range(12):
|
||||
oms = last_closed - (11 - i) * period
|
||||
bars.append(
|
||||
{
|
||||
"open_time_ms": oms,
|
||||
@@ -148,7 +148,7 @@ class TestHubKlineStore(unittest.TestCase):
|
||||
"volume": 10.0,
|
||||
}
|
||||
)
|
||||
upsert_bars("okx", "ETH/USDT", "5m", bars, self.db)
|
||||
upsert_bars("okx", "ETH/USDT", "15m", bars, self.db)
|
||||
|
||||
def remote_fetch(**kwargs):
|
||||
self.fail("不应请求交易所")
|
||||
@@ -159,11 +159,12 @@ class TestHubKlineStore(unittest.TestCase):
|
||||
"15m",
|
||||
remote_fetch,
|
||||
db_path=self.db,
|
||||
limit=5,
|
||||
limit=10,
|
||||
)
|
||||
self.assertTrue(out.get("ok"))
|
||||
self.assertEqual(out.get("source"), "aggregate")
|
||||
self.assertGreaterEqual(len(out.get("candles") or []), 5)
|
||||
self.assertEqual(out.get("source"), "db")
|
||||
self.assertEqual(out.get("storage_timeframe"), "15m")
|
||||
self.assertGreaterEqual(len(out.get("candles") or []), 10)
|
||||
|
||||
def test_load_bars_before(self):
|
||||
init_db(self.db)
|
||||
|
||||
Reference in New Issue
Block a user