pyqqq 0.12.175__py3-none-any.whl → 0.12.177__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pyqqq might be problematic. Click here for more details.
- pyqqq/brokerage/kis/domestic_stock.py +4 -3
- pyqqq/brokerage/kis/simple.py +27 -23
- pyqqq/data/realtime.py +14 -16
- pyqqq/datatypes.py +2 -0
- pyqqq/utils/daily_tickers.py +41 -16
- {pyqqq-0.12.175.dist-info → pyqqq-0.12.177.dist-info}/METADATA +1 -1
- {pyqqq-0.12.175.dist-info → pyqqq-0.12.177.dist-info}/RECORD +8 -8
- {pyqqq-0.12.175.dist-info → pyqqq-0.12.177.dist-info}/WHEEL +0 -0
|
@@ -219,7 +219,7 @@ class KISDomesticStock:
|
|
|
219
219
|
]
|
|
220
220
|
|
|
221
221
|
for k in date_keys:
|
|
222
|
-
if k in output and len(output[k]) > 0 and output[k] !=
|
|
222
|
+
if k in output and len(output[k]) > 0 and output[k] != "0": # NXT 종목이 아닌데 지정한 경우 output[k] 값이 0
|
|
223
223
|
output[k] = dtm.datetime.strptime(output[k], "%Y%m%d").date()
|
|
224
224
|
|
|
225
225
|
result = {"rt_cd": res_body["rt_cd"], "msg_cd": res_body["msg_cd"], "msg1": res_body["msg1"], "output": output}
|
|
@@ -3859,12 +3859,13 @@ class KISDomesticStock:
|
|
|
3859
3859
|
모의계좌의 경우, 한 번의 호출에 최대 20건까지 확인 가능하며, 이후의 값은 연속조회를 통해 확인하실 수 있습니다.
|
|
3860
3860
|
|
|
3861
3861
|
* 당일 전량매도한 잔고도 보유수량 0으로 보여질 수 있으나, 해당 보유수량 0인 잔고는 최종 D-2일 이후에는 잔고에서 사라집니다.
|
|
3862
|
+
* NXT 선택 시: NXT 거래종목만 시세 등 정보가 NXT 기준으로 변동됩니다. KRX 종목들은 그대로 유지됩니다.
|
|
3862
3863
|
|
|
3863
3864
|
Args:
|
|
3864
3865
|
cano (str): 종합계좌번호 - 계좌번호 체계(8-2)의 앞 8자리
|
|
3865
3866
|
acnt_prdt_cd (str): 계좌상품코드 - 계좌번호 체계(8-2)의 뒤 2자리
|
|
3866
3867
|
inqr_dvsn (str): 조회구분 - 01:대출일별 02:종목별
|
|
3867
|
-
afhr_flpr_yn (str): 시간외단일가여부 - N:기본값 Y:시간외단일가
|
|
3868
|
+
afhr_flpr_yn (str): 시간외단일가여부 - N:기본값 Y:시간외단일가 X:NXT 정규장 (프리마켓, 메인, 애프터마켓)
|
|
3868
3869
|
fund_sttl_icld_yn (str): 펀드결제분포함여부 - N:포함하지 않음 Y:포함
|
|
3869
3870
|
prcs_dvsn (str): 처리구분 - 00:전일매매포함 01:전일매매미포함
|
|
3870
3871
|
ctx_area_fk100 (str): 연속조회검색조건100 - 공란:최초 조회시. 이전 조회 output ctx_area_fk100 값:다음페이지 조회시(2번째부터)
|
|
@@ -3939,7 +3940,7 @@ class KISDomesticStock:
|
|
|
3939
3940
|
Raise:
|
|
3940
3941
|
ValueError: API 에러 발생시
|
|
3941
3942
|
"""
|
|
3942
|
-
assert afhr_flpr_yn in ["Y", "N"], 'afhr_flpr_yn must be "Y" or "N"'
|
|
3943
|
+
assert afhr_flpr_yn in ["Y", "N", "X"], 'afhr_flpr_yn must be "Y" or "N" or "X"'
|
|
3943
3944
|
assert inqr_dvsn in ["01", "02"], 'inqr_dvsn must be "01" or "02"'
|
|
3944
3945
|
assert fund_sttl_icld_yn in ["Y", "N"], 'fund_sttl_icld_yn must be "Y" or "N"'
|
|
3945
3946
|
assert prcs_dvsn in ["00", "01"], 'prcs_dvsn must be "00" or "01"'
|
pyqqq/brokerage/kis/simple.py
CHANGED
|
@@ -4,7 +4,7 @@ from pyqqq.brokerage.kis.oauth import KISAuth
|
|
|
4
4
|
from pyqqq.data.realtime import get_all_last_trades
|
|
5
5
|
from pyqqq.datatypes import *
|
|
6
6
|
from pyqqq.utils.logger import get_logger
|
|
7
|
-
from pyqqq.utils.market_schedule import get_market_schedule, get_last_trading_day
|
|
7
|
+
from pyqqq.utils.market_schedule import get_market_schedule, get_last_trading_day, is_full_day_closed
|
|
8
8
|
from pyqqq.utils.mock_api import with_mock
|
|
9
9
|
from typing import AsyncGenerator, Dict, List, Optional
|
|
10
10
|
import asyncio
|
|
@@ -164,6 +164,7 @@ class KISSimpleDomesticStock:
|
|
|
164
164
|
self.account_no,
|
|
165
165
|
self.account_product_code,
|
|
166
166
|
"02",
|
|
167
|
+
"X",
|
|
167
168
|
tr_cont=tr_cont,
|
|
168
169
|
ctx_area_fk100=ctx_area_fk100,
|
|
169
170
|
ctx_area_nk100=ctx_area_nk100,
|
|
@@ -199,6 +200,8 @@ class KISSimpleDomesticStock:
|
|
|
199
200
|
return "J"
|
|
200
201
|
elif data_exchange == DataExchange.NXT:
|
|
201
202
|
return "NX"
|
|
203
|
+
elif data_exchange == DataExchange.UN:
|
|
204
|
+
return "UN"
|
|
202
205
|
else:
|
|
203
206
|
raise ValueError("지원하지 않는 거래소입니다.")
|
|
204
207
|
|
|
@@ -213,6 +216,10 @@ class KISSimpleDomesticStock:
|
|
|
213
216
|
"""
|
|
214
217
|
일봉 데이터 검색
|
|
215
218
|
|
|
219
|
+
Note:
|
|
220
|
+
- 두 거래소에서 공통으로 거래정지된 종목의 시가/고가/저가/종가는 모두 동일하며, 그 외 값은 모두 0 입니다.
|
|
221
|
+
- NXT 매매체결 종목이 아니거나, NXT 거래소에서 거래가 불가능한 종목을 DataExchange.NXT 또는 DataExchange.UN으로 조회하면, 모든 값은 0 입니다.
|
|
222
|
+
|
|
216
223
|
Args:
|
|
217
224
|
asset_code(str): 종목코드
|
|
218
225
|
first_date(datetime.date): 조회 시작일자
|
|
@@ -257,16 +264,22 @@ class KISSimpleDomesticStock:
|
|
|
257
264
|
"low": item["stck_lwpr"],
|
|
258
265
|
"close": item["stck_clpr"],
|
|
259
266
|
"volume": item["acml_vol"],
|
|
267
|
+
"value": item["acml_tr_pbmn"],
|
|
260
268
|
}
|
|
261
269
|
)
|
|
262
|
-
chunk.reverse()
|
|
263
270
|
result.extend(chunk)
|
|
264
271
|
|
|
265
|
-
df = pd.DataFrame(result)
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
272
|
+
df = pd.DataFrame(result, columns=["date", "open", "high", "low", "close", "volume", "value"])
|
|
273
|
+
df["date"] = pd.to_datetime(df["date"])
|
|
274
|
+
df.set_index("date", inplace=True)
|
|
275
|
+
|
|
276
|
+
# 조회기간 중 데이터가 없는 날짜는 0 으로 채움
|
|
277
|
+
dates = pd.date_range(start=first_date, end=last_date, freq="B")
|
|
278
|
+
if len(dates) != len(df):
|
|
279
|
+
dates = [date for date in dates if not is_full_day_closed(date)]
|
|
280
|
+
df = df.reindex(dates, fill_value=0)
|
|
269
281
|
|
|
282
|
+
df = df.sort_index(ascending=False)
|
|
270
283
|
return df
|
|
271
284
|
|
|
272
285
|
def get_today_minute_data(
|
|
@@ -277,9 +290,13 @@ class KISSimpleDomesticStock:
|
|
|
277
290
|
"""
|
|
278
291
|
분봉 데이터 검색
|
|
279
292
|
|
|
293
|
+
Note:
|
|
294
|
+
- 두 거래소에서 공통으로 거래정지된 종목의 시가/고가/저가/종가는 모두 동일하며, 그 외 값은 모두 0 입니다.
|
|
295
|
+
- NXT 매매체결 종목이 아니거나, NXT 거래소에서 거래가 불가능한 종목을 DataExchange.NXT 또는 DataExchange.UN으로 조회하면, 모든 값은 0 입니다.
|
|
296
|
+
|
|
280
297
|
Args:
|
|
281
298
|
asset_code(str): 종목코드
|
|
282
|
-
data_exchange(DataExchange): 데이터 거래소
|
|
299
|
+
data_exchange(DataExchange): 데이터 거래소
|
|
283
300
|
|
|
284
301
|
Returns:
|
|
285
302
|
pd.DataFrame: 분봉 데이터 (시간의 역순)
|
|
@@ -288,14 +305,7 @@ class KISSimpleDomesticStock:
|
|
|
288
305
|
request_datetime = dtm.datetime.now()
|
|
289
306
|
request_time = request_datetime.replace(second=0, microsecond=0)
|
|
290
307
|
result = []
|
|
291
|
-
schedule = get_market_schedule(dtm.date.today())
|
|
292
|
-
if schedule.full_day_closed:
|
|
293
|
-
_last_day = get_last_trading_day()
|
|
294
|
-
schedule = get_market_schedule(_last_day)
|
|
295
|
-
if data_exchange == DataExchange.NXT:
|
|
296
|
-
request_time = dtm.datetime.combine(_last_day, dtm.time(20, 0, 0))
|
|
297
|
-
else:
|
|
298
|
-
request_time = dtm.datetime.combine(_last_day, schedule.close_time)
|
|
308
|
+
schedule = get_market_schedule(dtm.date.today(), exchange="KRX" if data_exchange == DataExchange.KRX else "NXT")
|
|
299
309
|
|
|
300
310
|
while True:
|
|
301
311
|
r = self.stock_api.inquire_time_itemchartprice(
|
|
@@ -326,16 +336,10 @@ class KISSimpleDomesticStock:
|
|
|
326
336
|
|
|
327
337
|
last_item_time = result[-1]["time"]
|
|
328
338
|
request_time = last_item_time - dtm.timedelta(minutes=1)
|
|
329
|
-
|
|
330
|
-
open_time = schedule.open_time
|
|
331
|
-
|
|
332
|
-
# FIXME: 넥스트레이드 시장 (수능일 같은 경우 넥스트레이드는 시간 변동 없이 8시 그대로 오픈한다는 얘기가 있어서 확인 필요)
|
|
333
|
-
if data_exchange == DataExchange.NXT:
|
|
334
|
-
open_time = dtm.time(8, 0, 0)
|
|
335
|
-
|
|
336
|
-
if request_time.time() < open_time:
|
|
339
|
+
if request_time.time() < schedule.open_time:
|
|
337
340
|
break
|
|
338
341
|
|
|
342
|
+
# 거래대금, 누적거래량 계산
|
|
339
343
|
prev_cum_value = None
|
|
340
344
|
prev_cum_volume = None
|
|
341
345
|
|
pyqqq/data/realtime.py
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
from typing import List, Union
|
|
2
|
-
from pyqqq.datatypes import DataExchange
|
|
3
|
-
from pyqqq.utils.api_client import raise_for_status, send_request
|
|
4
|
-
from pyqqq.utils.logger import get_logger
|
|
5
|
-
from pyqqq.utils.singleton import singleton
|
|
6
|
-
import pyqqq.config as c
|
|
7
1
|
import asyncio
|
|
2
|
+
import datetime as dtm
|
|
3
|
+
import inspect
|
|
4
|
+
import json
|
|
8
5
|
import os
|
|
6
|
+
from typing import List
|
|
7
|
+
|
|
9
8
|
import websockets
|
|
10
|
-
import json
|
|
11
|
-
import inspect
|
|
12
|
-
import datetime as dtm
|
|
13
9
|
|
|
10
|
+
import pyqqq.config as c
|
|
11
|
+
from pyqqq.utils.api_client import raise_for_status, send_request
|
|
12
|
+
from pyqqq.utils.logger import get_logger
|
|
13
|
+
from pyqqq.utils.singleton import singleton
|
|
14
14
|
|
|
15
15
|
logger = get_logger(__name__)
|
|
16
16
|
|
|
@@ -21,21 +21,17 @@ def get_all_last_trades(codes: List[str] = None, exchange: str = "KRX"):
|
|
|
21
21
|
|
|
22
22
|
Args:
|
|
23
23
|
codes (List[str], optional): 종목 코드 리스트. 모든 종목의 체결 정보를 반환하려면 None을 전달합니다.
|
|
24
|
-
exchange (str
|
|
24
|
+
exchange (str): 거래소. 기본값은 "KRX"입니다. 지원하는 거래소는 "KRX", "UN" 입니다.
|
|
25
25
|
|
|
26
26
|
Returns:
|
|
27
27
|
list:
|
|
28
28
|
- dict:
|
|
29
|
-
-
|
|
30
|
-
- sign (str): 전일대비구분
|
|
29
|
+
- sign (int): 전일대비구분
|
|
31
30
|
- change (int): 전일대비가격
|
|
32
31
|
- drate (float): 전일대비등락율
|
|
33
32
|
- price (int): 체결가
|
|
34
|
-
- opentime (str): 시가시간
|
|
35
33
|
- open (int): 시가
|
|
36
|
-
- hightime (str): 고가시간
|
|
37
34
|
- high (int): 고가
|
|
38
|
-
- lowtime (str): 저가시간
|
|
39
35
|
- low (int): 저가
|
|
40
36
|
- cgubun (str): 체결구분
|
|
41
37
|
- cvolume (int): 체결량
|
|
@@ -51,7 +47,9 @@ def get_all_last_trades(codes: List[str] = None, exchange: str = "KRX"):
|
|
|
51
47
|
- status (str): 장정보
|
|
52
48
|
- jnilvolume (int): 전일동시간대거래량
|
|
53
49
|
- shcode (str): 종목코드
|
|
54
|
-
|
|
50
|
+
- exchname (str): 거래소명
|
|
51
|
+
- date (str): 체결일자
|
|
52
|
+
- update_time (str): 업데이트 시간
|
|
55
53
|
"""
|
|
56
54
|
|
|
57
55
|
params = {"exchange": exchange}
|
pyqqq/datatypes.py
CHANGED
pyqqq/utils/daily_tickers.py
CHANGED
|
@@ -4,7 +4,7 @@ from functools import lru_cache
|
|
|
4
4
|
|
|
5
5
|
import pandas as pd
|
|
6
6
|
from pyqqq.data import domestic
|
|
7
|
-
from pyqqq.utils import
|
|
7
|
+
from pyqqq.utils.market_schedule import is_full_day_closed, get_last_trading_day
|
|
8
8
|
from pyqqq.utils.logger import get_bare_logger as get_logger
|
|
9
9
|
|
|
10
10
|
|
|
@@ -24,7 +24,10 @@ class DailyTickers:
|
|
|
24
24
|
self._initialized = True
|
|
25
25
|
|
|
26
26
|
self._today = dtm.date.today()
|
|
27
|
-
self.
|
|
27
|
+
if is_full_day_closed(self._today):
|
|
28
|
+
self._date = get_last_trading_day(self._today)
|
|
29
|
+
else:
|
|
30
|
+
self._date = self._today
|
|
28
31
|
self._tickers = None
|
|
29
32
|
self._change_date()
|
|
30
33
|
|
|
@@ -34,69 +37,91 @@ class DailyTickers:
|
|
|
34
37
|
@lru_cache(maxsize=30) # memory_profiler 로 확인 결과 하루치 fetch 결과가 약 2.5MiB
|
|
35
38
|
@staticmethod
|
|
36
39
|
def fetch_tickers(date: dtm.date) -> pd.DataFrame:
|
|
37
|
-
DailyTickers.logger.debug(f'\tfetch_tickers date={date}')
|
|
40
|
+
DailyTickers.logger.debug(f'\tfetch_tickers date={date} cache_info={DailyTickers.fetch_tickers.cache_info()}')
|
|
38
41
|
return domestic.get_tickers(date)
|
|
39
42
|
|
|
40
|
-
def _change_date(self, date: Optional[dtm.date] = None):
|
|
43
|
+
def _change_date(self, date: Optional[dtm.date] = None, force: bool = False):
|
|
41
44
|
"""_tickers 가 비었거나 날짜가 바뀌었으면 새로 채워넣는다."""
|
|
42
45
|
if not date:
|
|
43
46
|
if self._chk_days_passed():
|
|
44
47
|
self._today = dtm.date.today()
|
|
45
|
-
|
|
48
|
+
if is_full_day_closed(self._today):
|
|
49
|
+
date = get_last_trading_day(self._today)
|
|
50
|
+
else:
|
|
51
|
+
date = self._today
|
|
46
52
|
else:
|
|
47
53
|
date = self._date
|
|
48
54
|
|
|
55
|
+
if force:
|
|
56
|
+
DailyTickers.fetch_tickers.cache_clear()
|
|
57
|
+
self._tickers = None
|
|
58
|
+
|
|
49
59
|
if self._tickers is None or self._date != date:
|
|
50
60
|
self._date = date
|
|
51
61
|
self.logger.debug(f'\tdate changed. date={self._date} wait for get_tickers()')
|
|
52
62
|
self._tickers = DailyTickers.fetch_tickers(self._date)
|
|
53
63
|
|
|
54
|
-
def get_tickers(self, date: Optional[dtm.date] = None) -> pd.DataFrame:
|
|
64
|
+
def get_tickers(self, date: Optional[dtm.date] = None, force: bool = False) -> pd.DataFrame:
|
|
55
65
|
"""
|
|
56
66
|
종목정보 가져오기
|
|
57
67
|
"""
|
|
58
|
-
self._change_date(date)
|
|
68
|
+
self._change_date(date, force)
|
|
59
69
|
return self._tickers
|
|
60
70
|
|
|
61
|
-
def get_ticker_info(self, code: str, date: Optional[dtm.date] = None) -> Tuple[Optional[str], Optional[str]]:
|
|
71
|
+
def get_ticker_info(self, code: str, date: Optional[dtm.date] = None, force: bool = False) -> Tuple[Optional[str], Optional[str]]:
|
|
62
72
|
"""
|
|
63
73
|
종목정보 가져오기
|
|
64
74
|
"""
|
|
65
|
-
self._change_date(date)
|
|
75
|
+
self._change_date(date, force)
|
|
66
76
|
|
|
67
77
|
# self.logger.debug(f'\tget_ticker_info code={code} date={self._date}')
|
|
68
78
|
try:
|
|
69
79
|
name = self._tickers.loc[code, 'name']
|
|
70
80
|
type = self._tickers.loc[code, 'type']
|
|
71
81
|
except KeyError:
|
|
72
|
-
|
|
82
|
+
try:
|
|
83
|
+
self._change_date(date, True)
|
|
84
|
+
name = self._tickers.loc[code, 'name']
|
|
85
|
+
type = self._tickers.loc[code, 'type']
|
|
86
|
+
except KeyError:
|
|
87
|
+
self.logger.warning(f'KeyError on get_ticker_info. code={code}')
|
|
73
88
|
return (None, None)
|
|
74
89
|
|
|
75
90
|
return (name, type)
|
|
76
91
|
|
|
77
|
-
def get_listing_date(self, code: str) -> Optional[dtm.date]:
|
|
92
|
+
def get_listing_date(self, code: str, date: Optional[dtm.date] = None, force: bool = False) -> Optional[dtm.date]:
|
|
78
93
|
"""
|
|
79
94
|
상장일 가져오기
|
|
80
95
|
"""
|
|
96
|
+
self._change_date(date, force)
|
|
97
|
+
|
|
81
98
|
try:
|
|
82
99
|
list_date = self._tickers.loc[code, 'listing_date']
|
|
83
100
|
except KeyError:
|
|
84
|
-
|
|
101
|
+
try:
|
|
102
|
+
self._change_date(date, True)
|
|
103
|
+
list_date = self._tickers.loc[code, 'listing_date']
|
|
104
|
+
except KeyError:
|
|
105
|
+
self.logger.warning(f'KeyError on get_listing_date. code={code}')
|
|
85
106
|
return None
|
|
86
107
|
|
|
87
108
|
return dtm.datetime.strptime(list_date, "%Y%m%d").date() if list_date else None
|
|
88
109
|
|
|
89
|
-
def get_ticker_upper_limit(self, code: str, date: Optional[dtm.date] = None) -> Optional[int]:
|
|
110
|
+
def get_ticker_upper_limit(self, code: str, date: Optional[dtm.date] = None, force: bool = False) -> Optional[int]:
|
|
90
111
|
"""
|
|
91
112
|
상한가 가져오기
|
|
92
113
|
"""
|
|
93
|
-
self._change_date(date)
|
|
114
|
+
self._change_date(date, force)
|
|
94
115
|
|
|
95
116
|
# self.logger.debug(f'\tget_ticker_upper_limit code={code} date={self._date}')
|
|
96
117
|
try:
|
|
97
118
|
upper_limit = self._tickers.loc[code, 'upper_limit']
|
|
98
119
|
except KeyError:
|
|
99
|
-
|
|
100
|
-
|
|
120
|
+
try:
|
|
121
|
+
self._change_date(date, True)
|
|
122
|
+
upper_limit = self._tickers.loc[code, 'upper_limit']
|
|
123
|
+
except KeyError:
|
|
124
|
+
self.logger.warning(f'KeyError on get_ticker_upper_limit. code={code}')
|
|
125
|
+
return None
|
|
101
126
|
|
|
102
127
|
return int(upper_limit) if upper_limit else None
|
|
@@ -20,10 +20,10 @@ pyqqq/brokerage/ebest/simple.py,sha256=Ade3m18yhGt1fyn7ZbN-LmyNKiFP2ahUMSLLqMXWc
|
|
|
20
20
|
pyqqq/brokerage/ebest/tr_client.py,sha256=6vtod4xXr35yMAIji5qXUr_C3Bf4C_1NDLgELohDuks,7914
|
|
21
21
|
pyqqq/brokerage/helper.py,sha256=6pDiHo2eqsppC5ObIUMJibeMZ7cq8V9pVzNLTsdAy1w,6675
|
|
22
22
|
pyqqq/brokerage/kis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
23
|
-
pyqqq/brokerage/kis/domestic_stock.py,sha256=
|
|
23
|
+
pyqqq/brokerage/kis/domestic_stock.py,sha256=0mEC5B0HXlIMck4BmOw0Ke5utnWeWnRPngbDKW_jqRs,226778
|
|
24
24
|
pyqqq/brokerage/kis/oauth.py,sha256=jA7QydFEe5NN8t0QSwEhFoFtQiwTP4fr2segcibOXVU,7805
|
|
25
25
|
pyqqq/brokerage/kis/overseas_stock.py,sha256=9QUkEX13Lev5BcXMfK2GLve4xwFptOd1vXh4lDbrpYw,90096
|
|
26
|
-
pyqqq/brokerage/kis/simple.py,sha256=
|
|
26
|
+
pyqqq/brokerage/kis/simple.py,sha256=eniD_A2yd_hPii9JPBUPTuLrigdyLcNJBaD_W-sGgSk,40732
|
|
27
27
|
pyqqq/brokerage/kis/simple_overseas.py,sha256=1DuQBuJosg0mJQV7Ey2N3UOY8F3uOhzPDay4ncothuc,50360
|
|
28
28
|
pyqqq/brokerage/kis/tr_client.py,sha256=9fTok0d8FmfXw4YxZSdn6T8UTHIG2aN1yMSkiMJUB3c,5530
|
|
29
29
|
pyqqq/brokerage/multiprocess_tracker.py,sha256=Xx0hSpRZYITBGWjxclOEtNZdHV5agX94s34q1A8EE-Y,7283
|
|
@@ -35,10 +35,10 @@ pyqqq/data/domestic.py,sha256=2FOYxDGw2W7DGwY61p3uGFb4IWqWUKiNdR3RlewjkCU,30352
|
|
|
35
35
|
pyqqq/data/index.py,sha256=d5b-8a7IXu7yNJWt1tIe1Mj83NW0ZnQq8nsj2Sl3Gx8,6988
|
|
36
36
|
pyqqq/data/minutes.py,sha256=b-bqThP39t7V5io5dzI953bi1oWrUH3uie8GsFS7HUY,14727
|
|
37
37
|
pyqqq/data/overseas.py,sha256=yx7tCZHW8AvjIbtrP4dqIeC6wseRSzbg5ag3dm6H0LY,1234
|
|
38
|
-
pyqqq/data/realtime.py,sha256=
|
|
38
|
+
pyqqq/data/realtime.py,sha256=GkZPBkom4ufKiLAbQ7zCqkYgSITN4Ir9THaDZEOEhyw,14972
|
|
39
39
|
pyqqq/data/ticks.py,sha256=DXioiKBsGTzwXyvEH0lpm8t5g-1nHIOLKMXoSrE1Rko,4127
|
|
40
40
|
pyqqq/data/us_stocks.py,sha256=jXR9dQEVigrwTLEpX1aX1_AQvOlBopW265gwx8Nq8OA,12959
|
|
41
|
-
pyqqq/datatypes.py,sha256=
|
|
41
|
+
pyqqq/datatypes.py,sha256=JhsouFfSzAaK0p4FHIh0KZUuAeOzIDFBvfgYMp2-p20,8403
|
|
42
42
|
pyqqq/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
43
|
pyqqq/executors/hook.py,sha256=xV9SVUpUwGm8AgEuz8aD7U4ema47lRoKn4KFthuLJwQ,36985
|
|
44
44
|
pyqqq/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -47,7 +47,7 @@ pyqqq/utils/array.py,sha256=8E8JW-P1GWzluiqIDuKdUEALZ30AkKRtfxgdrWmu__Q,1747
|
|
|
47
47
|
pyqqq/utils/casting.py,sha256=nCHnJQ_F88R22xfnBg58fiJXwHYYnsnk3qSDw_rVIY8,135
|
|
48
48
|
pyqqq/utils/compute.py,sha256=nM5WUZ7aWnsrcHnKEQT-Omv56lrZJO6LfmDH6tnrg1M,5645
|
|
49
49
|
pyqqq/utils/copycat.py,sha256=1cMuQKteOuzBbH3aAdsDCH7ZTxTyM6OyJ5Wii7gmBpk,10837
|
|
50
|
-
pyqqq/utils/daily_tickers.py,sha256=
|
|
50
|
+
pyqqq/utils/daily_tickers.py,sha256=hVYhfNjGNAFHJTr8bjPmd4Cd6KxCMqD8ctd4E3kBDQA,4623
|
|
51
51
|
pyqqq/utils/display.py,sha256=kFoXw52ODDgbR-ufAKRJdY5NEA7UTikrosZRukEIWFc,1177
|
|
52
52
|
pyqqq/utils/kvstore.py,sha256=aAWQrs2IugHBPTRUkbYNxCKF9NZe2MCMD5nSj_lVbVw,4586
|
|
53
53
|
pyqqq/utils/limiter.py,sha256=M4ApMyWNtibTmLEOLsMViKFs-HZewYf2MsLygH4AFcs,2641
|
|
@@ -58,6 +58,6 @@ pyqqq/utils/mock_api.py,sha256=7EsaVQ9mOVZQAqtQW24isPnk9QTbJII7x3guhFyEMAE,10569
|
|
|
58
58
|
pyqqq/utils/position_classifier.py,sha256=EaomByAWM2lVuYow5OFdJNrN64Fpukhj-lhFkjYpjeo,14908
|
|
59
59
|
pyqqq/utils/retry.py,sha256=4mw9MQvgSBC8bTLvDauaCEI5N9tL8upHCk8rSfaVRG8,2066
|
|
60
60
|
pyqqq/utils/singleton.py,sha256=m6NZ8fwVDpI6U-gUUihMPgVK_NkDh-Z1NSAtjisrpjY,810
|
|
61
|
-
pyqqq-0.12.
|
|
62
|
-
pyqqq-0.12.
|
|
63
|
-
pyqqq-0.12.
|
|
61
|
+
pyqqq-0.12.177.dist-info/METADATA,sha256=xDGJD1HVG-GfMhv7W2cSI5a0F98kRBJpLR2rVvQJsUM,1664
|
|
62
|
+
pyqqq-0.12.177.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
|
63
|
+
pyqqq-0.12.177.dist-info/RECORD,,
|
|
File without changes
|