fix(HEL-356): harden realtime quote completeness
Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user