Fix hub chart skipping remote fetch when DB bars are discontinuous.
Trim gaps before deciding fetch need, always backfill short contiguous tails, and relax gap detection so tail polls do not block full history loads. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -275,7 +275,69 @@ class TestHubKlineStore(unittest.TestCase):
|
||||
if len(candles) >= 2:
|
||||
for i in range(1, len(candles)):
|
||||
gap = candles[i]["time"] - candles[i - 1]["time"]
|
||||
self.assertLessEqual(gap, int(period / 1000 * 1.5))
|
||||
self.assertLessEqual(gap, int(period / 1000 * 3.0))
|
||||
|
||||
def test_resolve_refetches_when_db_has_discontinuous_full_count(self):
|
||||
init_db(self.db)
|
||||
period = TIMEFRAME_MS["15m"]
|
||||
now = int(time.time() * 1000)
|
||||
old_start = now - period * 3000
|
||||
recent_start = now - period * 25
|
||||
old_bars = [
|
||||
{
|
||||
"open_time_ms": old_start + i * period,
|
||||
"open": 62000,
|
||||
"high": 62100,
|
||||
"low": 61900,
|
||||
"close": 62050,
|
||||
"volume": 10,
|
||||
}
|
||||
for i in range(500)
|
||||
]
|
||||
recent = [
|
||||
{
|
||||
"open_time_ms": recent_start + i * period,
|
||||
"open": 104000,
|
||||
"high": 104100,
|
||||
"low": 103900,
|
||||
"close": 104050,
|
||||
"volume": 20,
|
||||
}
|
||||
for i in range(30)
|
||||
]
|
||||
upsert_bars("binance", "BTC/USDT", "15m", old_bars, self.db)
|
||||
upsert_bars("binance", "BTC/USDT", "15m", recent, self.db)
|
||||
fetch_calls = []
|
||||
|
||||
def remote_fetch(**kwargs):
|
||||
fetch_calls.append(dict(kwargs))
|
||||
full = []
|
||||
start = now - period * 120
|
||||
for i in range(120):
|
||||
full.append(
|
||||
{
|
||||
"open_time_ms": start + i * period,
|
||||
"open": 104000 + i,
|
||||
"high": 104100 + i,
|
||||
"low": 103900 + i,
|
||||
"close": 104050 + i,
|
||||
"volume": 30,
|
||||
}
|
||||
)
|
||||
return {"ok": True, "bars": full, "price_tick": 0.01}
|
||||
|
||||
out = resolve_chart_bars(
|
||||
"binance",
|
||||
"BTC/USDT",
|
||||
"15m",
|
||||
remote_fetch,
|
||||
db_path=self.db,
|
||||
limit=2000,
|
||||
)
|
||||
self.assertTrue(out.get("ok"))
|
||||
self.assertGreater(len(fetch_calls), 0)
|
||||
self.assertGreaterEqual(len(out.get("candles") or []), 100)
|
||||
self.assertGreater(int(out.get("fetched") or 0), 0)
|
||||
|
||||
def test_resolve_before_ms_exhausted(self):
|
||||
init_db(self.db)
|
||||
|
||||
Reference in New Issue
Block a user