74
74
from tqsdk .tradeable import TqAccount , TqZq , TqKq , TqKqStock , TqSim , TqSimStock , BaseSim , BaseOtg
75
75
from tqsdk .trading_status import TqTradingStatus
76
76
from tqsdk .tqwebhelper import TqWebHelper
77
- from tqsdk .utils import _generate_uuid , _query_for_quote , BlockManagerUnconsolidated , _quotes_add_night , _bisect_value
77
+ from tqsdk .utils import _generate_uuid , _query_for_quote , BlockManagerUnconsolidated , _quotes_add_night , _bisect_value , \
78
+ deprecated_chart_id
78
79
from tqsdk .utils_symbols import _symbols_to_quotes
79
80
from tqsdk .tafunc import get_dividend_df , get_dividend_factor
80
81
from .__version__ import __version__
@@ -584,9 +585,10 @@ async def _handle_trading_status(self, symbol, ts):
584
585
if ts .trade_status != "" :
585
586
return ts
586
587
588
+ @deprecated_chart_id ("symbol" , "duration_seconds" , "data_length" , "adj_type" )
587
589
# ----------------------------------------------------------------------
588
590
def get_kline_serial (self , symbol : Union [str , List [str ]], duration_seconds : int , data_length : int = 200 ,
589
- chart_id : Optional [ str ] = None , adj_type : Union [str , None ] = None ) -> pd .DataFrame :
591
+ adj_type : Union [str , None ] = None , ** kwargs ) -> pd .DataFrame :
590
592
"""
591
593
获取k线序列数据
592
594
@@ -603,11 +605,11 @@ def get_kline_serial(self, symbol: Union[str, List[str]], duration_seconds: int,
603
605
data_length (int): 需要获取的序列长度。默认200根, 返回的K线序列数据是从当前最新一根K线开始往回取data_length根。\
604
606
每个序列最大支持请求 8000 个数据
605
607
606
- chart_id (str): [可选]指定序列id, 默认由 api 自动生成
607
-
608
608
adj_type (str/None): [可选]指定复权类型,默认为 None。adj_type 参数只对股票和基金类型合约有效。\
609
609
"F" 表示前复权;"B" 表示后复权;None 表示不做处理。
610
610
611
+ chart_id (str): [Deprecated] 由 api 自动生成,此参数不再使用
612
+
611
613
**注:关于传入合约代码列表 获取多合约K线的说明:**
612
614
613
615
1. 主合约的字段名为原始K线数据字段,从第一个副合约开始,字段名在原始字段后加数字,如第一个副合约的开盘价为 "open1" , 第二个副合约的收盘价为 "close2"。
@@ -699,18 +701,18 @@ def get_kline_serial(self, symbol: Union[str, List[str]], duration_seconds: int,
699
701
if data_length > 8964 :
700
702
data_length = 8964
701
703
dur_id = duration_seconds * 1000000000
702
- request = (tuple (symbol ), duration_seconds , data_length , adj_type , chart_id ) # request 中 symbols 为 tuple 序列
704
+ request = (tuple (symbol ), duration_seconds , data_length , adj_type ) # request 中 symbols 为 tuple 序列
703
705
serial = self ._requests ["klines" ].get (request , None )
704
706
pack = {
705
707
"aid" : "set_chart" ,
706
- "chart_id" : chart_id if chart_id is not None else _generate_uuid ("PYSDK_realtime" ),
708
+ "chart_id" : _generate_uuid ("PYSDK_realtime" ),
707
709
"ins_list" : "," .join (symbol ),
708
710
"duration" : dur_id ,
709
711
"view_width" : data_length if len (symbol ) == 1 else 8964 ,
710
712
# 如果同时订阅了两个以上合约K线,初始化数据时默认获取 1w 根K线(初始化完成后修改指令为设定长度)
711
- }
713
+ } if serial is None else {}
712
714
# 将数据权转移给TqChan时其所有权也随之转移,因pack还需要被用到,所以传入副本
713
- task = self .create_task (self ._get_serial_async (symbol , chart_id , serial , pack .copy ()), _caller_api = True )
715
+ task = self .create_task (self ._get_serial_async (symbol , pack .copy ()), _caller_api = True )
714
716
if serial is None :
715
717
serial = self ._init_serial ([_get_obj (self ._data , ["klines" , s , str (dur_id )]) for s in symbol ],
716
718
data_length , self ._prototype ["klines" ]["*" ]["*" ]["data" ]["@" ], adj_type )
@@ -729,16 +731,17 @@ def get_kline_serial(self, symbol: Union[str, List[str]], duration_seconds: int,
729
731
raise TqTimeoutError ("获取 %s (%d) 的K线超时,请检查客户端及网络是否正常" % (symbol , duration_seconds ))
730
732
return serial ["df" ]
731
733
732
- async def _get_serial_async (self , symbol , chart_id , serial , pack ):
734
+ async def _get_serial_async (self , symbol , pack ):
733
735
await self ._ensure_symbol_async (symbol )
734
736
self ._auth ._has_md_grants (symbol )
735
737
# 判断用户是否指定了 chart_id(参数), 如果指定了,则一定会发送新的请求。
736
- if serial is None or chart_id is not None :
738
+ if pack :
737
739
self ._send_pack (pack )
738
740
739
741
# ----------------------------------------------------------------------
740
- def get_tick_serial (self , symbol : str , data_length : int = 200 , chart_id : Optional [str ] = None ,
741
- adj_type : Union [str , None ] = None ) -> pd .DataFrame :
742
+ @deprecated_chart_id ("symbol" , "data_length" , "adj_type" )
743
+ def get_tick_serial (self , symbol : str , data_length : int = 200 , adj_type : Union [str , None ] = None ,
744
+ ** kwargs ) -> pd .DataFrame :
742
745
"""
743
746
获取tick序列数据
744
747
@@ -749,11 +752,11 @@ def get_tick_serial(self, symbol: str, data_length: int = 200, chart_id: Optiona
749
752
750
753
data_length (int): 需要获取的序列长度。每个序列最大支持请求 8000 个数据
751
754
752
- chart_id (str): [可选]指定序列id, 默认由 api 自动生成
753
-
754
755
adj_type (str/None): [可选]指定复权类型,默认为 None。adj_type 参数只对股票和基金类型合约有效。\
755
756
"F" 表示前复权;"B" 表示后复权;None 表示不做处理。
756
757
758
+ chart_id (str): [Deprecated] 由 api 自动生成,此参数不再使用
759
+
757
760
Returns:
758
761
pandas.DataFrame: 本函数总是返回一个 pandas.DataFrame 实例. 行数=data_length, 包含以下列:
759
762
@@ -798,17 +801,17 @@ def get_tick_serial(self, symbol: str, data_length: int = 200, chart_id: Optiona
798
801
adj_type = adj_type [0 ] if adj_type else adj_type
799
802
if data_length > 8964 :
800
803
data_length = 8964
801
- request = (symbol , data_length , adj_type , chart_id )
804
+ request = (symbol , data_length , adj_type )
802
805
serial = self ._requests ["ticks" ].get (request , None )
803
806
pack = {
804
807
"aid" : "set_chart" ,
805
- "chart_id" : chart_id if chart_id is not None else _generate_uuid ("PYSDK_realtime" ),
808
+ "chart_id" : _generate_uuid ("PYSDK_realtime" ),
806
809
"ins_list" : symbol ,
807
810
"duration" : 0 ,
808
811
"view_width" : data_length ,
809
- }
812
+ } if serial is None else {}
810
813
# pack 的副本数据和所有权转移给TqChan
811
- task = self .create_task (self ._get_serial_async (symbol , chart_id , serial , pack .copy ()), _caller_api = True )
814
+ task = self .create_task (self ._get_serial_async (symbol , pack .copy ()), _caller_api = True )
812
815
if serial is None :
813
816
serial = self ._init_serial ([_get_obj (self ._data , ["ticks" , symbol ])], data_length ,
814
817
self ._prototype ["ticks" ]["*" ]["data" ]["@" ], adj_type )
@@ -3425,11 +3428,11 @@ def _update_serial_single(self, serial):
3425
3428
ext [serial ["width" ] - shift :] = np .nan
3426
3429
serial ["update_row" ] = max (serial ["width" ] - shift - 1 , 0 )
3427
3430
else :
3428
- left_id = serial ["chart" ].get ("left_id" , - 1 )
3429
- right_id = serial ["chart" ].get ("right_id" , - 1 )
3430
- if (left_id != - 1 or right_id != - 1 ) and not serial ["chart" ].get ("more_data" , True ) and serial ["root" ][
3431
- 0 ].get ("last_id" , - 1 ) != - 1 :
3431
+ if serial ["chart" ].get ("ready" , False ) is True :
3432
3432
serial ["init" ] = True
3433
+ if serial ["root" ][0 ].get ("last_id" , - 1 ) == - 1 :
3434
+ # 该 kline 没有任何数据,直接退出
3435
+ return
3433
3436
symbol = serial ["chart" ]["ins_list" ].split ("," )[0 ] # 合约列表
3434
3437
quote = self ._data .quotes .get (symbol , {})
3435
3438
duration = serial ["chart" ]["duration" ] # 周期
@@ -3476,18 +3479,19 @@ def _ensure_dividend_factor(self, symbol):
3476
3479
def _update_serial_multi (self , serial ):
3477
3480
"""处理订阅多个合约时K线的数据更新"""
3478
3481
# 判断初始化数据是否接收完全, 否: 则返回
3479
- left_id = serial ["chart" ].get ("left_id" , - 1 ) # 主合约的left_id
3480
- right_id = serial ["chart" ].get ("right_id" , - 1 ) # 主合约的right_id
3481
- if (left_id == - 1 and right_id == - 1 ) or serial ["chart" ].get ("more_data" , True ):
3482
+ if serial ["chart" ].get ("ready" , False ) is False :
3482
3483
return
3483
- for root in serial ["root" ]:
3484
- if root .get ("last_id" , - 1 ) == - 1 :
3485
- return
3486
3484
3485
+ left_id = serial ["chart" ].get ("left_id" , - 1 ) # 主合约的left_id
3486
+ right_id = serial ["chart" ].get ("right_id" , - 1 ) # 主合约的right_id
3487
3487
array = serial ["array" ]
3488
3488
ins_list = serial ["chart" ]["ins_list" ].split ("," ) # 合约列表
3489
3489
3490
3490
if not serial ["init" ]: # 未初始化完成则进行初始化处理. init完成状态: 订阅K线后获取所有数据并填满df序列.
3491
+ if serial ["root" ][0 ].get ("last_id" , - 1 ) == - 1 :
3492
+ serial ["init" ] = True
3493
+ # 该 kline 没有任何数据,直接退出
3494
+ return
3491
3495
update_row = serial ["width" ] - 1 # 起始更新数据行,局部变量
3492
3496
current_id = right_id # 当前数据指针
3493
3497
while current_id >= left_id and current_id >= 0 and update_row >= 0 : # 如果当前id >= left_id 且 数据尚未填满width长度
@@ -3527,12 +3531,14 @@ def _update_serial_multi(self, serial):
3527
3531
"view_width" : len (array ) if len (array ) >= 30 else 30 ,
3528
3532
})
3529
3533
else : # 正常行情更新处理
3534
+ if serial ["root" ][0 ].get ("last_id" , - 1 ) == - 1 :
3535
+ # 该 kline 没有任何数据,直接退出
3536
+ return
3530
3537
serial ["update_row" ] = serial ["width" ] - 1
3531
3538
new_kline_range = None
3532
3539
new_data_index = serial ["width" ] - 1 # 记录更新数据位置
3533
3540
# 从 left_id 或 已有数据的最后一个 last_id 到服务器发回的最新数据的 last_id: 每次循环更新一行。max: 避免数据更新过多时产生大量多余循环判断
3534
- for i in range (max (serial ["chart" ].get ("left_id" , - 1 ), int (array [- 1 , 1 ])),
3535
- serial ["root" ][0 ].get ("last_id" , - 1 ) + 1 ):
3541
+ for i in range (max (left_id , int (array [- 1 , 1 ])), serial ["root" ][0 ].get ("last_id" , - 1 ) + 1 ):
3536
3542
# 如果某条主K线和某条副K线之间的 binding 映射数据存在: 则对应副合约数据也存在; 遍历主合约与所有副合约的binding信息, 如果都存在, 则将此K线填入array保存.
3537
3543
master_item = serial ["root" ][0 ]["data" ][str (i )] # 主合约数据
3538
3544
# array更新的一行数据: 初始化填入主合约数据
0 commit comments