feat: complete strategy and market data improvements
This commit is contained in:
@@ -4,6 +4,7 @@ import tempfile
|
||||
import unittest
|
||||
from datetime import date, datetime, timedelta, timezone
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
from chart_data_provider import EastmoneyChartClient, MarketChartClient
|
||||
from database import ReviewDatabase
|
||||
@@ -42,6 +43,45 @@ class FakeIfind:
|
||||
return []
|
||||
|
||||
|
||||
class FakeIfindStalePreopen(FakeIfind):
|
||||
def history(self, codes, indicators, start_date, end_date, cache_ttl=0):
|
||||
return [
|
||||
*super().history(codes, indicators, start_date, end_date, cache_ttl),
|
||||
{
|
||||
"time": "2026-07-29",
|
||||
"thscode": "000001.SZ",
|
||||
"open": 10.5,
|
||||
"high": 10.5,
|
||||
"low": 10.5,
|
||||
"close": 10.5,
|
||||
"volume": 0,
|
||||
"amount": 0,
|
||||
},
|
||||
]
|
||||
|
||||
def real_time(self, codes, indicators, cache_ttl=0):
|
||||
return [
|
||||
{
|
||||
"time": "2026-07-28 15:00:00",
|
||||
"open": 10.2,
|
||||
"high": 10.8,
|
||||
"low": 10.1,
|
||||
"latest": 10.5,
|
||||
"preClose": 10.2,
|
||||
"volume": 120,
|
||||
"amount": 1_200_000,
|
||||
}
|
||||
]
|
||||
|
||||
|
||||
class FixedPreopenDatetime(datetime):
|
||||
fixed_now = datetime(2026, 7, 29, 8, 45, tzinfo=timezone(timedelta(hours=8)))
|
||||
|
||||
@classmethod
|
||||
def now(cls, tz=None):
|
||||
return cls.fixed_now
|
||||
|
||||
|
||||
class FakeIfindSnapshots:
|
||||
configured = True
|
||||
|
||||
@@ -93,6 +133,14 @@ class IfindFeatureTests(unittest.TestCase):
|
||||
self.assertEqual(rows[-1]["trade_date"], "2026-07-28")
|
||||
self.assertAlmostEqual(rows[-1]["change"], 2.9412, places=4)
|
||||
|
||||
def test_ifind_daily_chart_keeps_last_traded_bar_before_market_open(self):
|
||||
client = MarketChartClient(FakeIfindStalePreopen(), EastmoneyChartClient())
|
||||
with patch("chart_data_provider.datetime", FixedPreopenDatetime):
|
||||
rows = client.stock_daily("000001", "20260729")
|
||||
|
||||
self.assertEqual(rows[-1]["trade_date"], "2026-07-28")
|
||||
self.assertFalse(rows[-1].get("realtime", False))
|
||||
|
||||
def test_event_enrichment_keeps_blank_broken_reason_blank(self):
|
||||
dashboard = {"broken": [{"code": "000001", "reason": "原原因"}]}
|
||||
DashboardService._merge_ifind_event_enrichment(
|
||||
|
||||
Reference in New Issue
Block a user