Modified:
trunk/ib/ext/EClientSocket.py
trunk/ib/ext/cfg/EClientSocket.py
Log:
Fixed IsEmpty bug. Thanks to Matthew Lloyd for the catch.
Modified: trunk/ib/ext/EClientSocket.py
==============================================================================
--- trunk/ib/ext/EClientSocket.py (original)
+++ trunk/ib/ext/EClientSocket.py Thu Aug 14 15:43:38 2008
@@ -32,7 +32,7 @@
""" generated source for EClientSocket
"""
- CLIENT_VERSION = 37
+ CLIENT_VERSION = 38
SERVER_VERSION = 38
EOL = 0
BAG_SEC_TYPE = "BAG"
@@ -78,6 +78,8 @@
REQ_CURRENT_TIME = 49
REQ_REAL_TIME_BARS = 50
CANCEL_REAL_TIME_BARS = 51
+ REQ_FUNDAMENTAL_DATA = 52
+ CANCEL_FUNDAMENTAL_DATA = 53
MIN_SERVER_VER_REAL_TIME_BARS = 34
MIN_SERVER_VER_SCALE_ORDERS = 35
MIN_SERVER_VER_SNAPSHOT_MKT_DATA = 35
@@ -85,12 +87,15 @@
MIN_SERVER_VER_WHAT_IF_ORDERS = 36
MIN_SERVER_VER_CONTRACT_CONID = 37
MIN_SERVER_VER_PTA_ORDERS = 39
+ MIN_SERVER_VER_FUNDAMENTAL_DATA = 40
+ MIN_SERVER_VER_UNDER_COMP = 40
+ MIN_SERVER_VER_CONTRACT_DATA_CHAIN = 40
+ MIN_SERVER_VER_SCALE_ORDERS2 = 40
m_anyWrapper = None
- m_socket = None
m_dos = None
m_connected = bool()
m_reader = None
- m_serverVersion = 1
+ m_serverVersion = 0
m_TwsTime = ""
def serverVersion(self):
@@ -121,6 +126,7 @@
socket = Socket(host, port)
self.eConnect(socket, clientId)
except (Exception, ), e:
+ self.eDisconnect()
self.connectionError()
def connectionError(self):
@@ -141,17 +147,16 @@
@eConnect.register(object, Socket, int)
@synchronized(mlock)
def eConnect_0(self, socket, clientId):
- self.m_socket = socket
- dis = DataInputStream(self.m_socket.getInputStream())
- self.m_dos = DataOutputStream(self.m_socket.getOutputStream())
+ self.m_dos = DataOutputStream(socket.getOutputStream())
self.send(self.CLIENT_VERSION)
- self.m_reader = self.createReader(self, dis)
+ self.m_reader = self.createReader(self,
DataInputStream(socket.getInputStream()))
self.m_serverVersion = self.m_reader.readInt()
debug("Server Version: %s", self.m_serverVersion)
if self.m_serverVersion >= 20:
self.m_TwsTime = self.m_reader.readStr()
debug("TWS Time at connection: %s", self.m_TwsTime)
if self.m_serverVersion < self.SERVER_VERSION:
+ self.eDisconnect()
self.m_anyWrapper.error(EClientErrors.NO_VALID_ID,
EClientErrors.UPDATE_TWS.code(), EClientErrors.UPDATE_TWS.msg())
return
if self.m_serverVersion >= 3:
@@ -161,17 +166,25 @@
@synchronized(mlock)
def eDisconnect(self):
- if not self.m_connected:
+ if self.m_dos is None:
return
+ self.m_connected = False
+ self.m_serverVersion = 0
+ self.m_TwsTime = ""
+ dos = self.m_dos
+ self.m_dos = None
+ self.reader = self.m_reader
+ self.m_reader = None
try:
- if self.m_reader is not None:
- self.m_reader.interrupt()
- if self.m_socket is not None:
- self.m_socket.shutdown(SHUT_RDWR)
- self.m_socket.close()
+ if self.reader is not None:
+ self.reader.interrupt()
+ except (Exception, ), e:
+ pass
+ try:
+ if dos is not None:
+ dos.close()
except (Exception, ), e:
pass
- self.m_connected = False
@synchronized(mlock)
def cancelScannerSubscription(self, tickerId):
@@ -254,7 +267,11 @@
if self.m_serverVersion < self.MIN_SERVER_VER_SNAPSHOT_MKT_DATA
and snapshot:
self.error(tickerId, EClientErrors.UPDATE_TWS, " It does not
support snapshot market data requests.")
return
- VERSION = 7
+ if self.m_serverVersion < self.MIN_SERVER_VER_UNDER_COMP:
+ if contract.m_underComp is not None:
+ self.error(tickerId, EClientErrors.UPDATE_TWS, " It does
not support delta-neutral orders.")
+ return
+ VERSION = 8
try:
self.send(self.REQ_MKT_DATA)
self.send(VERSION)
@@ -287,6 +304,15 @@
self.send(comboLeg.m_action)
self.send(comboLeg.m_exchange)
i += 1
+ if self.m_serverVersion >= self.MIN_SERVER_VER_UNDER_COMP:
+ if contract.m_underComp is not None:
+ underComp = contract.m_underComp
+ self.send(True)
+ self.send(underComp.m_conId)
+ self.send(underComp.m_delta)
+ self.send(underComp.m_price)
+ else:
+ self.send(False)
if self.m_serverVersion >= 31:
self.send(genericTickList)
if self.m_serverVersion >=
self.MIN_SERVER_VER_SNAPSHOT_MKT_DATA:
@@ -422,17 +448,19 @@
self.close()
@synchronized(mlock)
- def reqContractDetails(self, contract):
+ def reqContractDetails(self, reqId, contract):
if not self.m_connected:
self.error(EClientErrors.NO_VALID_ID,
EClientErrors.NOT_CONNECTED, "")
return
if self.m_serverVersion < 4:
self.error(EClientErrors.NO_VALID_ID,
EClientErrors.UPDATE_TWS.code(), EClientErrors.UPDATE_TWS.msg())
return
- VERSION = 4
+ VERSION = 5
try:
self.send(self.REQ_CONTRACT_DATA)
self.send(VERSION)
+ if self.m_serverVersion >=
self.MIN_SERVER_VER_CONTRACT_DATA_CHAIN:
+ self.send(reqId)
if self.m_serverVersion >= self.MIN_SERVER_VER_CONTRACT_CONID:
self.send(contract.m_conId)
self.send(contract.m_symbol)
@@ -552,7 +580,7 @@
self.error(EClientErrors.NO_VALID_ID,
EClientErrors.NOT_CONNECTED, "")
return
if self.m_serverVersion < self.MIN_SERVER_VER_SCALE_ORDERS:
- if (order.m_scaleNumComponents != Integer.MAX_VALUE) or
(order.m_scaleComponentSize != Integer.MAX_VALUE) or
(order.m_scalePriceIncrement != Double.MAX_VALUE):
+ if (order.m_scaleInitLevelSize != Integer.MAX_VALUE) or
(order.m_scalePriceIncrement != Double.MAX_VALUE):
self.error(id, EClientErrors.UPDATE_TWS, " It does not
support Scale orders.")
return
if self.m_serverVersion < self.MIN_SERVER_VER_SSHORT_COMBO_LEGS:
@@ -570,7 +598,15 @@
if order.m_whatIf:
self.error(id, EClientErrors.UPDATE_TWS, " It does not
support what-if orders.")
return
- VERSION = 25
+ if self.m_serverVersion < self.MIN_SERVER_VER_UNDER_COMP:
+ if contract.m_underComp is not None:
+ self.error(id, EClientErrors.UPDATE_TWS, " It does not
support delta-neutral orders.")
+ return
+ if self.m_serverVersion < self.MIN_SERVER_VER_SCALE_ORDERS2:
+ if (order.m_scaleSubsLevelSize != Integer.MAX_VALUE):
+ self.error(id, EClientErrors.UPDATE_TWS, " It does not
support Subsequent Level Size for Scale orders.")
+ return
+ VERSION = 26
try:
self.send(self.PLACE_ORDER)
self.send(VERSION)
@@ -688,12 +724,25 @@
if self.m_serverVersion >= 30:
self.sendMax(order.m_trailStopPrice)
if self.m_serverVersion >= self.MIN_SERVER_VER_SCALE_ORDERS:
- self.sendMax(order.m_scaleNumComponents)
- self.sendMax(order.m_scaleComponentSize)
+ if self.m_serverVersion >=
self.MIN_SERVER_VER_SCALE_ORDERS2:
+ self.sendMax(order.m_scaleInitLevelSize)
+ self.sendMax(order.m_scaleSubsLevelSize)
+ else:
+ self.send("")
+ self.sendMax(order.m_scaleInitLevelSize)
self.sendMax(order.m_scalePriceIncrement)
if self.m_serverVersion >= self.MIN_SERVER_VER_PTA_ORDERS:
self.send(order.m_clearingAccount)
self.send(order.m_clearingIntent)
+ if self.m_serverVersion >= self.MIN_SERVER_VER_UNDER_COMP:
+ if contract.m_underComp is not None:
+ underComp = contract.m_underComp
+ self.send(True)
+ self.send(underComp.m_conId)
+ self.send(underComp.m_delta)
+ self.send(underComp.m_price)
+ else:
+ self.send(False)
if self.m_serverVersion >= self.MIN_SERVER_VER_WHAT_IF_ORDERS:
self.send(order.m_whatIf)
except (Exception, ), e:
@@ -910,6 +959,47 @@
self.error(EClientErrors.NO_VALID_ID,
EClientErrors.FAIL_SEND_REQCURRTIME, str(e))
self.close()
+ @synchronized(mlock)
+ def reqFundamentalData(self, reqId, contract, reportType):
+ if not self.m_connected:
+ self.error(reqId, EClientErrors.NOT_CONNECTED, "")
+ return
+ if self.m_serverVersion < self.MIN_SERVER_VER_FUNDAMENTAL_DATA:
+ self.error(reqId, EClientErrors.UPDATE_TWS, " It does not
support fundamental data requests.")
+ return
+ VERSION = 1
+ try:
+ self.send(self.REQ_FUNDAMENTAL_DATA)
+ self.send(VERSION)
+ self.send(reqId)
+ self.send(contract.m_symbol)
+ self.send(contract.m_secType)
+ self.send(contract.m_exchange)
+ self.send(contract.m_primaryExch)
+ self.send(contract.m_currency)
+ self.send(contract.m_localSymbol)
+ self.send(reportType)
+ except (Exception, ), e:
+ self.error(reqId, EClientErrors.FAIL_SEND_REQFUNDDATA, str(e))
+ self.close()
+
+ @synchronized(mlock)
+ def cancelFundamentalData(self, reqId):
+ if not self.m_connected:
+ self.error(reqId, EClientErrors.NOT_CONNECTED, "")
+ return
+ if self.m_serverVersion < self.MIN_SERVER_VER_FUNDAMENTAL_DATA:
+ self.error(reqId, EClientErrors.UPDATE_TWS, " It does not
support fundamental data requests.")
+ return
+ VERSION = 1
+ try:
+ self.send(self.CANCEL_FUNDAMENTAL_DATA)
+ self.send(VERSION)
+ self.send(reqId)
+ except (Exception, ), e:
+ self.error(reqId, EClientErrors.FAIL_SEND_CANFUNDDATA, str(e))
+ self.close()
+
@overloaded
@synchronized(mlock)
def error(self, err):
@@ -922,7 +1012,7 @@
def close(self):
self.eDisconnect()
- self.m_anyWrapper.connectionClosed()
+ self.wrapper().connectionClosed()
@classmethod
def is_(cls, strval):
@@ -982,6 +1072,6 @@
@classmethod
def IsEmpty(cls, strval):
- return strval is None or len((strval) == 0)
+ return not bool(strval)
Modified: trunk/ib/ext/cfg/EClientSocket.py
==============================================================================
--- trunk/ib/ext/cfg/EClientSocket.py (original)
+++ trunk/ib/ext/cfg/EClientSocket.py Thu Aug 14 15:43:38 2008
@@ -36,6 +36,9 @@
(r'print "TWS Time at connection:" \+ self\.m_TwsTime',
r'debug("TWS Time at connection: %s", self.m_TwsTime)',),
+
+ (r' return strval is None or len\(\(strval\) == 0\)',
+ r' return not bool(strval)'),
]