解决simnow经常出现的未初始化异常。交易时间定时判断MD/TD是否连接。

This commit is contained in:
msincenselee 2017-05-11 11:39:38 +08:00
parent fdea5a35af
commit 4cc6497560
4 changed files with 59 additions and 13 deletions

View File

@ -117,7 +117,6 @@ class CtpGateway(VtGateway):
f = file(fileName) f = file(fileName)
except IOError: except IOError:
self.writeLog(text.LOADING_ERROR) self.writeLog(text.LOADING_ERROR)
return return
# 解析json文件 # 解析json文件
@ -173,16 +172,28 @@ class CtpGateway(VtGateway):
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def qryAccount(self): def qryAccount(self):
"""查询账户资金""" """查询账户资金"""
if self.tdApi is not None: if self.tdApi is None:
self.tdApi.qryAccount() self.tdConnected = False
return
self.tdApi.qryAccount()
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def qryPosition(self): def qryPosition(self):
"""查询持仓""" """查询持仓"""
if self.tdApi is None: if self.tdApi is None:
self.mdConnected = False
return return
self.tdApi.qryPosition() self.tdApi.qryPosition()
def checkStatus(self):
"""查询md/td的状态"""
if self.tdApi is None or self.mdApi is None:
return False
if not self.tdConnected or not self.mdConnected:
return False
return True
#---------------------------------------------------------------------- #----------------------------------------------------------------------
def close(self): def close(self):
"""关闭""" """关闭"""
@ -190,11 +201,13 @@ class CtpGateway(VtGateway):
tmp1 = self.mdApi tmp1 = self.mdApi
self.mdApi = None self.mdApi = None
tmp1.close() tmp1.close()
self.mdConnected = False
if self.tdConnected and self.tdApi is not None: if self.tdConnected and self.tdApi is not None:
tmp2 = self.tdApi tmp2 = self.tdApi
self.tdApi = None self.tdApi = None
tmp2.close() tmp2.close()
self.tdConnected = False
self.writeLog(u'主动断开连接') self.writeLog(u'主动断开连接')
@ -560,7 +573,8 @@ class CtpTdApi(TdApi):
self.gateway.tdConnected = True self.gateway.tdConnected = True
self.writeLog(text.TRADING_SERVER_LOGIN) self.writeLog(text.TRADING_SERVER_LOGIN)
# 确认结算信息 # 确认结算信息
req = {} req = {}
req['BrokerID'] = self.brokerID req['BrokerID'] = self.brokerID

View File

@ -32,13 +32,15 @@ class NoUiMain(object):
# gateway 是否连接 # gateway 是否连接
self.connected = False self.connected = False
# gateway 的连接名称在vtEngine.initGateway()里面定义,对应的配置文件是 "连接名称_connect.json" # gateway 的连接名称在vtEngine.initGateway()里面定义,对应的配置文件是 "连接名称_connect.json"
self.gateway_name = 'CTP_EBF' self.gateway_name = 'CTP'
# 启动的策略实例须在catAlgo/CtaSetting.json 里面定义 [u'S28_RB1001', u'S28_TFT', u'S28_HCRB',u'atr_rsi'] # 启动的策略实例须在catAlgo/CtaSetting.json 里面定义 [u'S28_RB1001', u'S28_TFT', u'S28_HCRB',u'atr_rsi']
self.strategies = [u'S28_HCRB'] self.strategies = [u'S28_HCRB']
self.g_count = 0 self.g_count = 0
# 实例化主引擎 self.last_dt = datetime.now()
# 实例化 主引擎
print u'instance mainengine' print u'instance mainengine'
self.mainEngine = MainEngine() self.mainEngine = MainEngine()
@ -64,28 +66,44 @@ class NoUiMain(object):
# 十秒才执行一次检查 # 十秒才执行一次检查
self.g_count += 1 self.g_count += 1
if self.g_count <= 10: if self.g_count <= 20:
return return
self.g_count = 0 self.g_count = 0
print u'noUiMain.py checkpoint:{0}'.format(datetime.now()) dt = datetime.now()
if dt.hour != self.last_dt.hour:
self.last_dt = dt
self.mainEngine.writeLog( u'noUiMain.py checkpoint:{0}'.format(dt))
# 定时断开 # 定时断开
if self.trade_off(): if self.trade_off():
"""非交易时间"""
if self.connected: if self.connected:
self.disconnect()
self.mainEngine.writeLog(u'断开连接{0}'.format(self.gateway_name)) self.mainEngine.writeLog(u'断开连接{0}'.format(self.gateway_name))
self.disconnect()
self.mainEngine.writeLog(u'清空数据引擎') self.mainEngine.writeLog(u'清空数据引擎')
self.mainEngine.clearData() self.mainEngine.clearData()
self.connected = False self.connected = False
return return
# 定时重连 # 交易时间内,定时重连和检查
if not self.connected: if not self.connected:
self.mainEngine.writeLog(u'启动连接{0}'.format(self.gateway_name))
self.mainEngine.writeLog(u'清空数据引擎') self.mainEngine.writeLog(u'清空数据引擎')
self.mainEngine.clearData() self.mainEngine.clearData()
self.mainEngine.writeLog(u'重新连接{0}'.format(self.gateway_name)) self.mainEngine.writeLog(u'重新连接{0}'.format(self.gateway_name))
self.mainEngine.connect(self.gateway_name) self.mainEngine.connect(self.gateway_name)
self.connected = True self.connected = True
return
else:
if not self.mainEngine.checkGatewayStatus(self.gateway_name):
self.mainEngine.writeLog(u'检查连接{0}异常,重新启动连接'.format(self.gateway_name))
self.mainEngine.writeLog(u'断开连接{0}'.format(self.gateway_name))
self.disconnect()
self.mainEngine.writeLog(u'清空数据引擎')
self.mainEngine.clearData()
self.mainEngine.writeLog(u'重新连接{0}'.format(self.gateway_name))
self.mainEngine.connect(self.gateway_name)
self.connected = True
def Start(self): def Start(self):
"""启动""" """启动"""

View File

@ -86,6 +86,16 @@ class MainEngine(object):
else: else:
self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName)) self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
def checkGatewayStatus(self,gatewayName):
"""check gateway connect status"""
if gatewayName in self.gatewayDict:
gateway = self.gatewayDict[gatewayName]
return gateway.checkStatus()
else:
self.writeLog(text.GATEWAY_NOT_EXIST.format(gateway=gatewayName))
return False
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
def subscribe(self, subscribeReq, gatewayName): def subscribe(self, subscribeReq, gatewayName):
"""订阅特定接口的行情""" """订阅特定接口的行情"""

View File

@ -145,7 +145,11 @@ class VtGateway(object):
def qryPosition(self): def qryPosition(self):
"""查询持仓""" """查询持仓"""
pass pass
def checkStatus(self):
"""查询状态"""
return True
# ---------------------------------------------------------------------- # ----------------------------------------------------------------------
def close(self): def close(self):
"""关闭""" """关闭"""