feat: complete strategy and market data improvements

This commit is contained in:
leefer
2026-07-29 16:50:40 +08:00
parent c30d2107b3
commit 0030bb8cc1
18 changed files with 1622 additions and 162 deletions
+50 -1
View File
@@ -53,6 +53,14 @@ class FixedMarketDatetime(datetime):
return cls.fixed_now
class FixedPreopenDatetime(datetime):
fixed_now = datetime.now().astimezone().replace(hour=8, minute=45, second=0, microsecond=0)
@classmethod
def now(cls, tz=None):
return cls.fixed_now
class StockDetailRealtimeTests(unittest.TestCase):
def setUp(self):
self.service = DashboardService.__new__(DashboardService)
@@ -110,7 +118,48 @@ class StockDetailRealtimeTests(unittest.TestCase):
result = self.service._prepare_stock_detail(payload, "002141", historical)
self.assertEqual(result["stock"]["change"], 1.2)
self.assertNotIn("realtime", result["meta"])
self.assertFalse(result["meta"].get("realtime", False))
self.assertEqual(RealtimeClientStub.quote_calls, 0)
def test_today_detail_keeps_last_traded_bar_before_market_open(self):
today = FixedPreopenDatetime.fixed_now.strftime("%Y%m%d")
today_display = FixedPreopenDatetime.fixed_now.strftime("%Y-%m-%d")
yesterday = (FixedPreopenDatetime.fixed_now - timedelta(days=1)).strftime("%Y-%m-%d")
payload = {
"meta": {"trade_date": yesterday, "source": "tushare"},
"stock": {"code": "002141", "price": 10, "change": 0},
"prices": [
{
"trade_date": yesterday,
"open": 9.8,
"high": 10.1,
"low": 9.7,
"close": 10,
"change": 1.2,
"volume": 100,
},
{
"trade_date": today_display,
"open": 10,
"high": 10,
"low": 10,
"close": 10,
"change": 0,
"volume": 0,
"amount_billion": 0,
"realtime": True,
},
],
}
with patch("server.datetime", FixedPreopenDatetime), patch(
"server.TushareClient", RealtimeClientStub
):
result = self.service._prepare_stock_detail(payload, "002141", today)
self.assertEqual(result["meta"]["trade_date"], yesterday)
self.assertFalse(result["meta"].get("realtime", False))
self.assertEqual(result["prices"][-1]["trade_date"], yesterday)
self.assertEqual(result["stock"]["change"], 1.2)
self.assertEqual(RealtimeClientStub.quote_calls, 0)