Skip to content

Commit a07b0c9

Browse files
committed
add last_price
1 parent f5b664c commit a07b0c9

File tree

3 files changed

+55
-3
lines changed

3 files changed

+55
-3
lines changed

src/emtl/core.py

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import os
12
import re
23
from random import SystemRandom
34
from typing import Any
@@ -12,6 +13,7 @@
1213
from .const import _base_headers
1314
from .const import _urls
1415
from .utils import emt_trade_encrypt
16+
from .utils import get_float
1517
from .utils import get_logger
1618

1719
logger = get_logger(__name__)
@@ -20,6 +22,23 @@
2022
_em_validate_key = ""
2123

2224

25+
def _query_snapshot(symbol_code: str, market: str) -> Optional[dict]:
26+
url = "https://emhsmarketwg.eastmoneysec.com/api/SHSZQuoteSnapshot"
27+
params = {"id": symbol_code.strip(), "market": market}
28+
headers = _base_headers.copy()
29+
resp = session.get(url, params=params, headers=headers)
30+
_check_resp(resp)
31+
return resp.json()
32+
33+
34+
def get_last_price(symbol_code: str, market: str) -> float:
35+
ret = _query_snapshot(symbol_code, market)
36+
if ret is None or "status" not in ret or ret["status"] != 0:
37+
return float("nan")
38+
39+
return get_float(ret["realtimequote"], "currentPrice")
40+
41+
2342
def _check_resp(resp: Response):
2443
if resp.status_code != 200:
2544
logger.error(f"request {resp.url} fail, code={resp.status_code}, response={resp.text}")
@@ -33,9 +52,13 @@ def _query_something(tag: str, req_data: Optional[dict] = None) -> Optional[Dict
3352
:param req_data: 请求提交数据,可选
3453
:return:
3554
"""
36-
assert _em_validate_key, "em_validatekey is empty"
55+
if not _em_validate_key:
56+
validate_key = login()
57+
else:
58+
validate_key = _em_validate_key
59+
logger.info(validate_key)
3760
assert tag in _urls, f"{tag} not in url list"
38-
url = _urls[tag] + _em_validate_key
61+
url = _urls[tag] + validate_key
3962
if req_data is None:
4063
req_data = {
4164
"qqhs": 100,
@@ -46,6 +69,7 @@ def _query_something(tag: str, req_data: Optional[dict] = None) -> Optional[Dict
4669
logger.debug(f"(tag={tag}), (data={req_data}), (url={url})")
4770
resp = session.post(url, headers=headers, data=req_data)
4871
_check_resp(resp)
72+
logger.info(resp.text)
4973
return resp.json()
5074

5175

@@ -79,7 +103,7 @@ def _get_em_validate_key():
79103
return _em_validatekey
80104

81105

82-
def login(username: str, password: str, duration: int = 30) -> Optional[str]:
106+
def login(username: str = "", password: str = "", duration: int = 30) -> Optional[str]:
83107
"""登录接口.
84108
85109
:param str username: 用户名
@@ -88,6 +112,10 @@ def login(username: str, password: str, duration: int = 30) -> Optional[str]:
88112
:type duration: int, optional
89113
:return:
90114
"""
115+
if not username:
116+
username = os.getenv("EM_USERNAME", "")
117+
if not password:
118+
password = os.getenv("EM_PASSWORD", "")
91119
random_num, code = _get_captcha_code()
92120
headers = _base_headers.copy()
93121
headers["X-Requested-With"] = "XMLHttpRequest"
@@ -199,5 +227,6 @@ def insert_order(stock_code, trade_type, market: str, price: float, amount: int)
199227
def cancel_order(code: str):
200228
data = {"revokes": code.strip()}
201229
resp = _query_something("cancel_order", req_data=data)
230+
logger.info(resp)
202231
if resp:
203232
return resp

src/emtl/tests/test_core.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import datetime
2+
import math
23
import os
34

45
from emtl.core import cancel_order
6+
from emtl.core import get_last_price
57
from emtl.core import insert_order
68
from emtl.core import query_funds_flow
79
from emtl.core import query_history_orders
@@ -80,3 +82,7 @@ def test_cancel_order():
8082
resp = cancel_order("000002")
8183
assert resp
8284
assert resp["Status"] in (0, -1)
85+
86+
87+
def test_last_price():
88+
assert math.isnan(get_last_price("000001", "SH"))

src/emtl/utils.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import base64
22
import logging
3+
import math
34

45
from cryptography.hazmat.primitives import serialization
56
from cryptography.hazmat.primitives.asymmetric import padding
@@ -27,3 +28,19 @@ def emt_trade_encrypt(content: str) -> str:
2728
_pub_key: rsa.RSAPublicKey = serialization.load_pem_public_key(rsa_public_key.encode("utf-8")) # type:ignore
2829
encrypt_text = _pub_key.encrypt(content.encode(), padding.PKCS1v15())
2930
return base64.b64encode(encrypt_text).decode("utf-8")
31+
32+
33+
def double_equal(a, b) -> bool:
34+
return math.fabs(a - b) < 1e-6
35+
36+
37+
def get_float(data: dict, key: str) -> float:
38+
if v := data[key].strip():
39+
return float(v)
40+
return 0.0
41+
42+
43+
def get_int(data: dict, key: str) -> int:
44+
if v := data[key].strip():
45+
return int(v)
46+
return 0

0 commit comments

Comments
 (0)