fix(HEL-356): harden realtime quote completeness

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
总管
2026-09-09 11:15:56 +08:00
co-authored by multica-agent
parent b950ea4344
commit b640e77264
10 changed files with 415 additions and 37 deletions
+22 -5
View File
@@ -303,10 +303,20 @@ class EastmoneyAdapter(MarketAdapter):
code = str(ts_code or "").split(".")[0]
if not code:
raise AdapterError("Invalid Shenwan code")
rows = self.fetch_shenwan_quotes([code])
if not rows:
raise AdapterError(f"Eastmoney Shenwan quote missing for {code}")
return rows[0]
def fetch_shenwan_quotes(self, ts_codes: list[str]) -> list[dict[str, Any]]:
codes = [str(item or "").split(".")[0] for item in ts_codes]
codes = list(dict.fromkeys(code for code in codes if code))
if not codes:
return []
payload = self._get_json(
EASTMONEY_INDEX_URL,
{
"secids": f"90.{code}",
"secids": ",".join(f"90.{code}" for code in codes),
"fltt": "2",
"invt": "2",
"fields": "f12,f14,f2,f3,f4,f15,f16,f17,f18,f6,f8,f104,f105,f128,f136,f140,f124",
@@ -314,14 +324,21 @@ class EastmoneyAdapter(MarketAdapter):
referer="https://quote.eastmoney.com/",
)
rows = list((payload.get("data") or {}).get("diff") or [])
row = next((item for item in rows if item), None)
if not row:
raise AdapterError(f"Eastmoney Shenwan quote missing for {code}")
result = [quote for row in rows if row and (quote := self._normalize_shenwan_quote(row))]
if not result:
raise AdapterError(f"Eastmoney Shenwan quotes missing for {','.join(codes)}")
return result
@staticmethod
def _normalize_shenwan_quote(row: dict[str, Any]) -> dict[str, Any] | None:
code = str(row.get("f12") or "")
if not code:
return None
epoch = int(finite_number(row.get("f124")) or 0)
close = round4(finite_number(row.get("f2")))
previous = round4(finite_number(row.get("f18")))
if close <= 0 or previous <= 0:
raise AdapterError(f"Eastmoney Shenwan quote empty for {code}")
return None
quote_time = (
datetime.fromtimestamp(epoch).astimezone().isoformat(timespec="seconds")
if epoch