|
|
|
@ -324,6 +324,75 @@ class TqSdkAdapter(BaseDataAdapter):
|
|
|
|
print(f"获取所有品种列表失败:{e}")
|
|
|
|
print(f"获取所有品种列表失败:{e}")
|
|
|
|
return self._get_mock_all_symbols()
|
|
|
|
return self._get_mock_all_symbols()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def get_main_contracts(self) -> Dict[str, str]:
|
|
|
|
|
|
|
|
"""获取主力合约
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
Dict[str, str]: 品种代码到主力合约代码的映射
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
if TQSDK_AVAILABLE and self.api:
|
|
|
|
|
|
|
|
# 使用TQSDK的query_quotes方法获取主力合约
|
|
|
|
|
|
|
|
main_contracts = {}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 尝试获取不同类别的主力合约
|
|
|
|
|
|
|
|
for ins_class in ['FUTURE']:
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
# 查询主力合约
|
|
|
|
|
|
|
|
quotes = self.api.query_quotes(ins_class=ins_class)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 等待数据准备就绪
|
|
|
|
|
|
|
|
import time
|
|
|
|
|
|
|
|
start_time = time.time()
|
|
|
|
|
|
|
|
timeout = 5 # 5秒超时
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while True:
|
|
|
|
|
|
|
|
if quotes:
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
if time.time() - start_time > timeout:
|
|
|
|
|
|
|
|
print("获取主力合约数据超时")
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
time.sleep(0.1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 处理获取到的主力合约
|
|
|
|
|
|
|
|
for quote in quotes:
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
|
|
# 获取合约信息
|
|
|
|
|
|
|
|
contract_info = self.api.get_quote(quote)
|
|
|
|
|
|
|
|
self.api.wait_update()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if hasattr(contract_info, 'underlying_symbol') and hasattr(contract_info, 'instrument_id'):
|
|
|
|
|
|
|
|
underlying_symbol = contract_info.underlying_symbol
|
|
|
|
|
|
|
|
instrument_id = contract_info.instrument_id
|
|
|
|
|
|
|
|
main_contracts[underlying_symbol] = instrument_id
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
|
|
print(f"处理主力合约 {quote} 失败:{e}")
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
|
|
print(f"获取 {ins_class} 类别的主力合约失败:{e}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
print(f"获取到主力合约:{main_contracts}")
|
|
|
|
|
|
|
|
return main_contracts
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
# 返回模拟数据
|
|
|
|
|
|
|
|
print("无法获取真实主力合约数据,使用模拟数据")
|
|
|
|
|
|
|
|
return self._get_mock_main_contracts()
|
|
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
|
|
print(f"获取主力合约失败:{e}")
|
|
|
|
|
|
|
|
return self._get_mock_main_contracts()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _get_mock_main_contracts(self) -> Dict[str, str]:
|
|
|
|
|
|
|
|
"""获取模拟主力合约数据"""
|
|
|
|
|
|
|
|
# 模拟主力合约数据
|
|
|
|
|
|
|
|
mock_main_contracts = {
|
|
|
|
|
|
|
|
'AU': 'AU2603', # 黄金
|
|
|
|
|
|
|
|
'AG': 'AG2603', # 白银
|
|
|
|
|
|
|
|
'CU': 'CU2603', # 铜
|
|
|
|
|
|
|
|
'NI': 'NI2603', # 镍
|
|
|
|
|
|
|
|
'SN': 'SN2603' # 锡
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
print(f"使用模拟主力合约数据: {mock_main_contracts}")
|
|
|
|
|
|
|
|
return mock_main_contracts
|
|
|
|
|
|
|
|
|
|
|
|
def _get_mock_all_symbols(self) -> List[str]:
|
|
|
|
def _get_mock_all_symbols(self) -> List[str]:
|
|
|
|
"""获取模拟品种列表"""
|
|
|
|
"""获取模拟品种列表"""
|
|
|
|
# 返回exchange_map中映射的所有品种
|
|
|
|
# 返回exchange_map中映射的所有品种
|
|
|
|
|