[增强功能] tdx排除异常站点

This commit is contained in:
msincenselee 2020-07-02 17:23:19 +08:00
parent bd944e30fc
commit 6ddcbf7b0c

View File

@ -89,7 +89,7 @@ def get_tdx_marketid(symbol):
class TdxFutureData(object): class TdxFutureData(object):
exclude_ips = []
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
def __init__(self, strategy=None, best_ip={}, proxy_ip="", proxy_port=0): def __init__(self, strategy=None, best_ip={}, proxy_ip="", proxy_port=0):
""" """
@ -132,14 +132,15 @@ class TdxFutureData(object):
self.write_log(u'开始连接通达信行情服务器') self.write_log(u'开始连接通达信行情服务器')
self.api = TdxExHq_API(heartbeat=True, auto_retry=True, raise_exception=True) self.api = TdxExHq_API(heartbeat=True, auto_retry=True, raise_exception=True)
exclude_ips = []
# 选取最佳服务器 # 选取最佳服务器
if is_reconnect or len(self.best_ip) == 0: if is_reconnect or len(self.best_ip) == 0:
self.best_ip = get_cache_json(TDX_FUTURE_CONFIG) self.best_ip = get_cache_json(TDX_FUTURE_CONFIG)
if is_reconnect: if is_reconnect:
if is_reconnect: if is_reconnect:
exclude_ips.append(self.best_ip.get('ip')) selected_ip = self.best_ip.get('ip')
if selected_ip not in self.exclude_ips:
self.exclude_ips.append(selected_ip)
self.best_ip = {} self.best_ip = {}
else: else:
# 超时的话,重新选择 # 超时的话,重新选择
@ -149,13 +150,14 @@ class TdxFutureData(object):
last_datetime = datetime.strptime(last_datetime_str, '%Y-%m-%d %H:%M:%S') last_datetime = datetime.strptime(last_datetime_str, '%Y-%m-%d %H:%M:%S')
if (datetime.now() - last_datetime).total_seconds() > 60 * 60 * 2: if (datetime.now() - last_datetime).total_seconds() > 60 * 60 * 2:
self.best_ip = {} self.best_ip = {}
self.exclude_ips = []
except Exception as ex: # noqa except Exception as ex: # noqa
self.best_ip = {} self.best_ip = {}
else: else:
self.best_ip = {} self.best_ip = {}
if len(self.best_ip) == 0: if len(self.best_ip) == 0:
self.best_ip = self.select_best_ip(exclude_ips) self.best_ip = self.select_best_ip(self.exclude_ips)
self.write_log(f'选取服务器:{self.best_ip}') self.write_log(f'选取服务器:{self.best_ip}')
else: else:
self.write_log(f'使用缓存服务器:{self.best_ip}') self.write_log(f'使用缓存服务器:{self.best_ip}')
@ -182,7 +184,13 @@ class TdxFutureData(object):
# 更新 symbol_exchange_dict , symbol_market_dict # 更新 symbol_exchange_dict , symbol_market_dict
# self.qryInstrument() # self.qryInstrument()
except Exception as ex: except Exception as ex:
self.write_log(u'连接服务器tdx异常:{},{}'.format(str(ex), traceback.format_exc())) ip = self.best_ip.get('ip', '')
self.write_log(u'连接服务器tdx:{} 异常:{},{}'.format(ip,str(ex), traceback.format_exc()))
if ip not in self.exclude_ips:
self.write_log(f'添加{ip}到异常列表中')
self.exclude_ips.append(ip)
self.best_ip = {}
return return
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
@ -218,7 +226,8 @@ class TdxFutureData(object):
:return: :return:
""" """
self.write_log(u'选择通达信行情服务器') self.write_log(u'选择通达信行情服务器')
if len(exclude_ips) > 0:
self.write_log(f'排除IP:{self.exclude_ips}')
data_future = [self.ping(x['ip'], x['port']) for x in TDX_FUTURE_HOSTS if x['ip'] not in exclude_ips] data_future = [self.ping(x['ip'], x['port']) for x in TDX_FUTURE_HOSTS if x['ip'] not in exclude_ips]
best_future_ip = TDX_FUTURE_HOSTS[data_future.index(min(data_future))] best_future_ip = TDX_FUTURE_HOSTS[data_future.index(min(data_future))]
@ -226,6 +235,8 @@ class TdxFutureData(object):
self.write_log(u'选取 {}:{}'.format(best_future_ip['ip'], best_future_ip['port'])) self.write_log(u'选取 {}:{}'.format(best_future_ip['ip'], best_future_ip['port']))
# print(u'选取 {}:{}'.format(best_future_ip['ip'], best_future_ip['port'])) # print(u'选取 {}:{}'.format(best_future_ip['ip'], best_future_ip['port']))
best_future_ip.update({'datetime': datetime.now().strftime('%Y-%m-%d %H:%M:%S')}) best_future_ip.update({'datetime': datetime.now().strftime('%Y-%m-%d %H:%M:%S')})
# 写入排除列表
best_future_ip.update({'exclude_ips': exclude_ips})
save_cache_json(best_future_ip, TDX_FUTURE_CONFIG) save_cache_json(best_future_ip, TDX_FUTURE_CONFIG)
return best_future_ip return best_future_ip
@ -870,7 +881,7 @@ class TdxFutureData(object):
'{},{},{},{},{}'.format(tdx_market_id, full_symbol, underlying_symbol, mi_symbol, vn_exchange)) '{},{},{},{},{}'.format(tdx_market_id, full_symbol, underlying_symbol, mi_symbol, vn_exchange))
if underlying_symbol in self.future_contracts: if underlying_symbol in self.future_contracts:
info = self.future_contracts.get(underlying_symbol) info = self.future_contracts.get(underlying_symbol)
if mi_symbol > info.get('mi_symbol'): if mi_symbol > info.get('mi_symbol', ''):
self.write_log(u'主力合约变化:{} =>{}'.format(info.get('mi_symbol'), mi_symbol)) self.write_log(u'主力合约变化:{} =>{}'.format(info.get('mi_symbol'), mi_symbol))
info.update({'mi_symbol': mi_symbol, 'full_symbol': full_symbol}) info.update({'mi_symbol': mi_symbol, 'full_symbol': full_symbol})
self.future_contracts.update({underlying_symbol: info}) self.future_contracts.update({underlying_symbol: info})