diff --git a/vn.ib/test/vnib.pyd b/vn.ib/test/vnib.pyd index 6c4050ed..83df9317 100644 Binary files a/vn.ib/test/vnib.pyd and b/vn.ib/test/vnib.pyd differ diff --git a/vn.ib/vnib/Visual Studio 2013/settings/Windows Azure Subscriptions.xml b/vn.ib/vnib/Visual Studio 2013/settings/Windows Azure Subscriptions.xml index 0c26d6aa..73a800e4 100644 --- a/vn.ib/vnib/Visual Studio 2013/settings/Windows Azure Subscriptions.xml +++ b/vn.ib/vnib/Visual Studio 2013/settings/Windows Azure Subscriptions.xml @@ -1,5 +1,5 @@ - AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAhuIZgFnYcU6wvp5DI4FozAAAAAACAAAAAAAQZgAAAAEAACAAAAAXSj17R5SUHe+A58o1bYLSOOhH9W2Ix9DlZDFBrgVA4gAAAAAOgAAAAAIAACAAAADbVSL+BIaujSBj3UmMHFYW0NN/5M1VZMBFC5NayhA3uBAAAADlsZqLyiwLiExTjbbDU1nZQAAAAA8KhP6XKTAD/Iuw37pqb7rSwSDYQgFsBJvhh4KMkHc9aX3Q+ga9NjStuUrdZVmuMzeMGwsQ+bjLejvA3cCOI9c= + AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAhuIZgFnYcU6wvp5DI4FozAAAAAACAAAAAAAQZgAAAAEAACAAAADnrYSEO5qfCQPpiUFTIS3ZRFiTItrg4/VIVOH2J3epYgAAAAAOgAAAAAIAACAAAACso6CSyxkad28kFe3eIz1YgltVz/YV200C+PLOhtmmPhAAAABBWAXXnj8W8KUy+QlVKF7JQAAAAFuRLjt27YOpR9+kkpnrDzww07fBW08hBX6gGDrJVJp/hGhDL4nX/wEgsPuN/EJB4f48rrPnGlHmfb6B9a0Il60= \ No newline at end of file diff --git a/vn.ib/vnib/vnib/vnib.cpp b/vn.ib/vnib/vnib/vnib.cpp index f8052561..05a0feaa 100644 --- a/vn.ib/vnib/vnib/vnib.cpp +++ b/vn.ib/vnib/vnib/vnib.cpp @@ -1499,15 +1499,15 @@ BOOST_PYTHON_MODULE(vnib) .def_readwrite("shares", &Execution::shares) .def_readwrite("price", &Execution::price) .def_readwrite("permId", &Execution::permId) - .def_readwrite("clientId ", &Execution::clientId) - .def_readwrite("orderId ", &Execution::orderId) - .def_readwrite("liquidation ", &Execution::liquidation) - .def_readwrite("cumQty ", &Execution::cumQty) - .def_readwrite("avgPrice ", &Execution::avgPrice) - .def_readwrite("orderRef ", &Execution::orderRef) - .def_readwrite("evRule ", &Execution::evRule) - .def_readwrite("evMultiplier ", &Execution::evMultiplier) - .def_readwrite("modelCode ", &Execution::modelCode) + .def_readwrite("clientId", &Execution::clientId) + .def_readwrite("orderId", &Execution::orderId) + .def_readwrite("liquidation", &Execution::liquidation) + .def_readwrite("cumQty", &Execution::cumQty) + .def_readwrite("avgPrice", &Execution::avgPrice) + .def_readwrite("orderRef", &Execution::orderRef) + .def_readwrite("evRule", &Execution::evRule) + .def_readwrite("evMultiplier", &Execution::evMultiplier) + .def_readwrite("modelCode", &Execution::modelCode) ; class_("UnderComp") diff --git a/vn.trader/ctaAlgo/tools/multiTimeFrame/ctaBacktestMultiTF.py b/vn.trader/ctaAlgo/tools/multiTimeFrame/ctaBacktestMultiTF.py index 41a23bce..cc5c2579 100644 --- a/vn.trader/ctaAlgo/tools/multiTimeFrame/ctaBacktestMultiTF.py +++ b/vn.trader/ctaAlgo/tools/multiTimeFrame/ctaBacktestMultiTF.py @@ -166,12 +166,14 @@ class BacktestEngineMultiTF(BacktestingEngine): data = self.infobar[info_symbol] # Update data only when Time Stamp is matched - if data['datetime'] <= self.dt: + if (data is not None) and (data['datetime'] <= self.dt): + try: temp[info_symbol] = CtaBarData() temp[info_symbol].__dict__ = data self.infobar[info_symbol] = next(self.InfoCursor[info_symbol]) except StopIteration: + self.infobar[info_symbol] = None self.output("No more data in information database.") else: temp[info_symbol] = None diff --git a/vn.trader/ibGateway/IB_connect.json b/vn.trader/ibGateway/IB_connect.json index 71aa0cb4..1e62cab3 100644 --- a/vn.trader/ibGateway/IB_connect.json +++ b/vn.trader/ibGateway/IB_connect.json @@ -1,5 +1,6 @@ { "host": "localhost", - "port": 7496, - "clientId": 888 + "port": 7497, + "clientId": 888, + "accountCode": "DU545254" } \ No newline at end of file diff --git a/vn.trader/ibGateway/ibGateway.py b/vn.trader/ibGateway/ibGateway.py index 0f4747de..0cb6aba4 100644 --- a/vn.trader/ibGateway/ibGateway.py +++ b/vn.trader/ibGateway/ibGateway.py @@ -1,7 +1,7 @@ # encoding: UTF-8 ''' -ibpy的gateway接入 +Interactive Brokers的gateway接入,已经替换为vn.ib封装。 注意事项: 1. ib api只能获取和操作当前连接后下的单,并且每次重启程序后,之前下的单子收不到 @@ -19,11 +19,7 @@ from copy import copy from PyQt4 import QtGui, QtCore -from ib.ext.Contract import Contract -from ib.ext.Order import Order -from ib.ext.EWrapper import EWrapper -from ib.ext.EClientSocket import EClientSocket - +from vnib import * from vtGateway import * @@ -119,6 +115,7 @@ class IbGateway(VtGateway): self.host = EMPTY_STRING # 连接地址 self.port = EMPTY_INT # 连接端口 self.clientId = EMPTY_INT # 用户编号 + self.accountCode = EMPTY_STRING # 账户编号 self.tickerId = 0 # 订阅行情时的代码编号 self.tickDict = {} # tick快照字典,key为tickerId,value为VtTickData对象 @@ -135,8 +132,7 @@ class IbGateway(VtGateway): self.connected = False # 连接状态 - self.wrapper = IbWrapper(self) # 回调接口 - self.connection = EClientSocket(self.wrapper) # 主动接口 + self.api = IbWrapper(self) # API接口 #---------------------------------------------------------------------- def connect(self): @@ -161,6 +157,7 @@ class IbGateway(VtGateway): self.host = str(setting['host']) self.port = int(setting['port']) self.clientId = int(setting['clientId']) + self.accountCode = str(setting['accountCode']) except KeyError: log = VtLogData() log.gatewayName = self.gatewayName @@ -169,13 +166,13 @@ class IbGateway(VtGateway): return # 发起连接 - self.connection.eConnect(self.host, self.port, self.clientId) + self.api.eConnect(self.host, self.port, self.clientId, False) # 查询服务器时间 - self.connection.reqCurrentTime() + self.api.reqCurrentTime() # 请求账户数据主推更新 - self.connection.reqAccountUpdates(True, '') + self.api.reqAccountUpdates(True, self.accountCode) #---------------------------------------------------------------------- def subscribe(self, subscribeReq): @@ -186,17 +183,17 @@ class IbGateway(VtGateway): return contract = Contract() - contract.m_localSymbol = str(subscribeReq.symbol) - contract.m_exchange = exchangeMap.get(subscribeReq.exchange, '') - contract.m_secType = productClassMap.get(subscribeReq.productClass, '') - contract.m_currency = currencyMap.get(subscribeReq.currency, '') - contract.m_expiry = subscribeReq.expiry - contract.m_strike = subscribeReq.strikePrice - contract.m_right = optionTypeMap.get(subscribeReq.optionType, '') + contract.localSymbol = str(subscribeReq.symbol) + contract.exchange = exchangeMap.get(subscribeReq.exchange, '') + contract.secType = productClassMap.get(subscribeReq.productClass, '') + contract.currency = currencyMap.get(subscribeReq.currency, '') + contract.expiry = subscribeReq.expiry + contract.strike = subscribeReq.strikePrice + contract.right = optionTypeMap.get(subscribeReq.optionType, '') # 获取合约详细信息 self.tickerId += 1 - self.connection.reqContractDetails(self.tickerId, contract) + self.api.reqContractDetails(self.tickerId, contract) # 创建合约对象并保存到字典中 ct = VtContractData() @@ -209,7 +206,7 @@ class IbGateway(VtGateway): # 订阅行情 self.tickerId += 1 - self.connection.reqMktData(self.tickerId, contract, '', False) + self.api.reqMktData(self.tickerId, contract, '', False, TagValueList()) # 创建Tick对象并保存到字典中 tick = VtTickData() @@ -229,28 +226,28 @@ class IbGateway(VtGateway): # 创建合约对象 contract = Contract() - contract.m_localSymbol = str(orderReq.symbol) - contract.m_exchange = exchangeMap.get(orderReq.exchange, '') - contract.m_secType = productClassMap.get(orderReq.productClass, '') - contract.m_currency = currencyMap.get(orderReq.currency, '') - contract.m_expiry = orderReq.expiry - contract.m_strike = orderReq.strikePrice - contract.m_right = optionTypeMap.get(orderReq.optionType, '') + contract.localSymbol = str(orderReq.symbol) + contract.exchange = exchangeMap.get(orderReq.exchange, '') + contract.secType = productClassMap.get(orderReq.productClass, '') + contract.currency = currencyMap.get(orderReq.currency, '') + contract.expiry = orderReq.expiry + contract.strike = orderReq.strikePrice + contract.right = optionTypeMap.get(orderReq.optionType, '') # 创建委托对象 order = Order() - order.m_orderId = self.orderId - order.m_clientId = self.clientId - order.m_action = directionMap.get(orderReq.direction, '') - order.m_lmtPrice = orderReq.price - order.m_totalQuantity = orderReq.volume - order.m_orderType = priceTypeMap.get(orderReq.priceType, '') + order.orderId = self.orderId + order.clientId = self.clientId + order.action = directionMap.get(orderReq.direction, '') + order.lmtPrice = orderReq.price + order.totalQuantity = orderReq.volume + order.orderType = priceTypeMap.get(orderReq.priceType, '') # 发送委托 - self.connection.placeOrder(self.orderId, contract, order) + self.api.placeOrder(self.orderId, contract, order) # 查询下一个有效编号 - self.connection.reqIds(1) + self.api.reqIds(1) # 返回委托编号 vtOrderID = '.'.join([self.gatewayName, str(self.orderId)]) @@ -259,7 +256,7 @@ class IbGateway(VtGateway): #---------------------------------------------------------------------- def cancelOrder(self, cancelOrderReq): """撤单""" - self.connection.cancelOrder(cancelOrderReq.orderID) + self.api.cancelOrder(int(cancelOrderReq.orderID)) #---------------------------------------------------------------------- def qryAccount(self): @@ -280,11 +277,11 @@ class IbGateway(VtGateway): #---------------------------------------------------------------------- def close(self): """关闭""" - self.connection.eDisconnect() + self.api.eDisconnect() ######################################################################## -class IbWrapper(EWrapper): +class IbWrapper(IbApi): """IB回调接口的实现""" #---------------------------------------------------------------------- @@ -292,7 +289,7 @@ class IbWrapper(EWrapper): """Constructor""" super(IbWrapper, self).__init__() - self.connectionStatus = False # 连接状态 + self.apiStatus = False # 连接状态 self.gateway = gateway # gateway对象 self.gatewayName = gateway.gatewayName # gateway对象名称 @@ -303,10 +300,57 @@ class IbWrapper(EWrapper): self.contractDict = gateway.contractDict # contract字典 self.tickProductDict = gateway.tickProductDict self.subscribeReqDict = gateway.subscribeReqDict - + + #---------------------------------------------------------------------- + def nextValidId(self, orderId): + """""" + self.gateway.orderId = orderId + + #---------------------------------------------------------------------- + def currentTime(self, time): + """连接成功后推送当前时间""" + dt = datetime.fromtimestamp(time) + t = dt.strftime("%Y-%m-%d %H:%M:%S.%f") + + self.apiStatus = True + self.gateway.connected = True + + log = VtLogData() + log.gatewayName = self.gatewayName + log.logContent = (u'IB接口连接成功,当前服务器时间 %s' %t) + self.gateway.onLog(log) + + for symbol, req in self.subscribeReqDict.items(): + del self.subscribeReqDict[symbol] + self.gateway.subscribe(req) + + #---------------------------------------------------------------------- + def connectAck(self): + """""" + pass + + #---------------------------------------------------------------------- + def error(self, id_, errorCode, errorString): + """错误推送""" + err = VtErrorData() + err.gatewayName = self.gatewayName + err.errorID = errorCode + err.errorMsg = errorString + self.gateway.onError(err) + + #---------------------------------------------------------------------- + def accountSummary(self, reqId, account, tag, value, curency): + """""" + pass + + #---------------------------------------------------------------------- + def accountSummaryEnd(self, reqId): + """""" + pass + #---------------------------------------------------------------------- def tickPrice(self, tickerId, field, price, canAutoExecute): - """行情推送(价格相关)""" + """行情价格相关推送""" if field in tickFieldMap: tick = self.tickDict[tickerId] key = tickFieldMap[field] @@ -324,10 +368,10 @@ class IbWrapper(EWrapper): self.gateway.onTick(newtick) else: print field - + #---------------------------------------------------------------------- def tickSize(self, tickerId, field, size): - """行情推送(量相关)""" + """行情数量相关推送""" if field in tickFieldMap: tick = self.tickDict[tickerId] key = tickFieldMap[field] @@ -342,34 +386,30 @@ class IbWrapper(EWrapper): self.gateway.onTick(newtick) else: print field - + #---------------------------------------------------------------------- - def tickOptionComputation(self, tickerId, field, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice): - """行情推送(期权数值)""" + def tickOptionComputation(self, tickerId, tickType, impliedVol, delta, optPrice, pvDividend, gamma, vega, theta, undPrice): + """""" pass #---------------------------------------------------------------------- def tickGeneric(self, tickerId, tickType, value): - """行情推送(某些通用字段)""" + """""" pass - - #---------------------------------------------------------------------- - def tickString(self, tickerId, tickType, value): - """行情推送,特殊字段相关""" - # 参考了一些其他平台对于IB行情数据的开发建议后, - # 发现大部分都选择使用本地电脑时间戳而非IB推送的时间戳, - # 猜测原因可能是IB的行情质量一般(本身就是切片了的), - # 因此这里也选择使用电脑的本地时间 - pass - + #---------------------------------------------------------------------- - def tickEFP(self, tickerId, tickType, basisPoints, formattedBasisPoints, impliedFuture, holdDays, futureExpiry, dividendImpact, dividendsToExpiry): - """行情推送(合约属性相关)""" + def tickString(self, tickerId, tickType, value): + """""" pass - - #---------------------------------------------------------------------- + + #---------------------------------------------------------------------- + def tickEFP(self, tickerId, tickType, basisPoints, formattedBasisPoints, totalDividends, holdDays, futureLastTradeDate, dividendImpact, dividendsToLastTradeDate): + """""" + pass + + #---------------------------------------------------------------------- def orderStatus(self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld): - """报单成交回报""" + """委托状态更新""" orderId = str(orderId) if orderId in self.orderDict: @@ -386,10 +426,10 @@ class IbWrapper(EWrapper): newod = copy(od) self.gateway.onOrder(newod) - + #---------------------------------------------------------------------- def openOrder(self, orderId, contract, order, orderState): - """报单信息推送""" + """下达委托推送""" orderId = str(orderId) # orderId是整数 if orderId in self.orderDict: @@ -398,26 +438,42 @@ class IbWrapper(EWrapper): od = VtOrderData() # od代表orderData od.orderID = orderId od.vtOrderID = '.'.join([self.gatewayName, orderId]) - od.symbol = contract.m_localSymbol - od.exchange = exchangeMapReverse.get(contract.m_exchange, '') + od.symbol = contract.localSymbol + od.exchange = exchangeMapReverse.get(contract.exchange, '') od.vtSymbol = '.'.join([od.symbol, od.exchange]) od.gatewayName = self.gatewayName self.orderDict[orderId] = od - od.direction = directionMapReverse.get(order.m_action, '') - od.price = order.m_lmtPrice - od.totalVolume = order.m_totalQuantity + od.direction = directionMapReverse.get(order.action, '') + od.price = order.lmtPrice + od.totalVolume = order.totalQuantity newod = copy(od) self.gateway.onOrder(newod) - + #---------------------------------------------------------------------- def openOrderEnd(self): - """ generated source for method openOrderEnd """ + """""" pass - + #---------------------------------------------------------------------- - def updateAccountValue(self, key, value, currency, accountName): + def winError(self, str_, lastError): + """""" + pass + + #---------------------------------------------------------------------- + def connectionClosed(self): + """断线""" + self.apiStatus = False + self.gateway.connected = False + + log = VtLogData() + log.gatewayName = self.gatewayName + log.logContent = (u'IB接口连接断开') + self.gateway.onLog(log) + + #---------------------------------------------------------------------- + def updateAccountValue(self, key, val, currency, accountName): """更新账户数据""" # 仅逐个字段更新数据,这里对于没有currency的推送忽略 if currency: @@ -434,68 +490,62 @@ class IbWrapper(EWrapper): if key in accountKeyMap: k = accountKeyMap[key] - account.__setattr__(k, float(value)) + account.__setattr__(k, float(val)) #---------------------------------------------------------------------- def updatePortfolio(self, contract, position, marketPrice, marketValue, averageCost, unrealizedPNL, realizedPNL, accountName): - """持仓更新推送""" + """持仓更新""" pos = VtPositionData() - - pos.symbol = contract.m_localSymbol - pos.exchange = exchangeMapReverse.get(contract.m_exchange, contract.m_exchange) + + pos.symbol = contract.localSymbol + pos.exchange = exchangeMapReverse.get(contract.exchange, contract.exchange) pos.vtSymbol = '.'.join([pos.symbol, pos.exchange]) pos.direction = DIRECTION_NET pos.position = position pos.price = averageCost pos.vtPositionName = pos.vtSymbol pos.gatewayName = self.gatewayName - + self.gateway.onPosition(pos) - + #---------------------------------------------------------------------- def updateAccountTime(self, timeStamp): - """更新账户数据的时间""" + """更新账户时间""" # 推送数据 for account in self.accountDict.values(): newaccount = copy(account) self.gateway.onAccount(newaccount) - + #---------------------------------------------------------------------- def accountDownloadEnd(self, accountName): - """ generated source for method accountDownloadEnd """ + """""" pass - - #---------------------------------------------------------------------- - def nextValidId(self, orderId): - """下一个有效报单编号更新""" - self.gateway.orderId = orderId - + #---------------------------------------------------------------------- def contractDetails(self, reqId, contractDetails): """合约查询回报""" - symbol = contractDetails.m_summary.m_localSymbol - exchange = exchangeMapReverse.get(contractDetails.m_summary.m_exchange, EXCHANGE_UNKNOWN) + symbol = contractDetails.summary.localSymbol + exchange = exchangeMapReverse.get(contractDetails.summary.exchange, EXCHANGE_UNKNOWN) vtSymbol = '.'.join([symbol, exchange]) ct = self.contractDict.get(vtSymbol, None) if not ct: return - ct.name = contractDetails.m_longName.decode('UTF-8') - ct.priceTick = contractDetails.m_minTick + ct.name = contractDetails.longName.decode('UTF-8') + ct.priceTick = contractDetails.minTick # 推送 self.gateway.onContract(ct) - + #---------------------------------------------------------------------- def bondContractDetails(self, reqId, contractDetails): - """ generated source for method bondContractDetails """ + """""" pass - + #---------------------------------------------------------------------- def contractDetailsEnd(self, reqId): - """ 获取合约结束 """ - # 因为IB的合约获取是一个个合约进行的,并不会用于触发其他操作,因此无需发出日志 + """""" pass #---------------------------------------------------------------------- @@ -503,172 +553,168 @@ class IbWrapper(EWrapper): """成交推送""" trade = VtTradeData() trade.gatewayName = self.gatewayName - trade.tradeID = execution.m_execId + trade.tradeID = execution.execId trade.vtTradeID = '.'.join([self.gatewayName, trade.tradeID]) - - trade.symbol = contract.m_localSymbol - trade.exchange = exchangeMapReverse.get(contract.m_exchange, '') + + trade.symbol = contract.localSymbol + trade.exchange = exchangeMapReverse.get(contract.exchange, '') trade.vtSymbol = '.'.join([trade.symbol, trade.exchange]) - - trade.orderID = str(execution.m_orderId) - trade.direction = directionMapReverse.get(execution.m_side, '') - trade.price = execution.m_price - trade.volume = execution.m_shares - trade.tradeTime = execution.m_time - + + trade.orderID = str(execution.orderId) + trade.direction = directionMapReverse.get(execution.side, '') + trade.price = execution.price + trade.volume = execution.shares + trade.tradeTime = execution.time + self.gateway.onTrade(trade) - + #---------------------------------------------------------------------- def execDetailsEnd(self, reqId): - """ generated source for method execDetailsEnd """ + """""" pass #---------------------------------------------------------------------- - def updateMktDepth(self, tickerId, position, operation, side, price, size): - """ generated source for method updateMktDepth """ + def updateMktDepth(self, id_, position, operation, side, price, size): + """""" pass #---------------------------------------------------------------------- - def updateMktDepthL2(self, tickerId, position, marketMaker, operation, side, price, size): - """ generated source for method updateMktDepthL2 """ + def updateMktDepthL2(self, id_, position, marketMaker, operation, side, price, size): + """""" pass #---------------------------------------------------------------------- - def updateNewsBulletin(self, msgId, msgType, message, origExchange): - """ generated source for method updateNewsBulletin """ + def updateNewsBulletin(self, msgId, msgType, newsMessage, originExch): + """""" pass #---------------------------------------------------------------------- def managedAccounts(self, accountsList): - """ generated source for method managedAccounts """ + """""" pass - + #---------------------------------------------------------------------- - def receiveFA(self, faDataType, xml): - """ generated source for method receiveFA """ + def receiveFA(self, pFaDataType, cxml): + """""" pass - + #---------------------------------------------------------------------- - def historicalData(self, reqId, date, open, high, low, close, volume, count, WAP, hasGaps): - """ generated source for method historicalData """ + def historicalData(self, reqId, date, open_, high, low, close, volume, barCount, WAP, hasGaps): + """""" pass - + #---------------------------------------------------------------------- def scannerParameters(self, xml): - """ generated source for method scannerParameters """ + """""" pass - + #---------------------------------------------------------------------- def scannerData(self, reqId, rank, contractDetails, distance, benchmark, projection, legsStr): - ''' generated source for method scannerData ''' + """""" pass - + #---------------------------------------------------------------------- def scannerDataEnd(self, reqId): - """ generated source for method scannerDataEnd """ + """""" pass #---------------------------------------------------------------------- - def realtimeBar(self, reqId, time, open, high, low, close, volume, wap, count): - """ generated source for method realtimeBar """ + def realtimeBar(self, reqId, time, open_, high, low, close, volume, wap, count): + """""" pass - - #---------------------------------------------------------------------- - def currentTime(self, time): - """ generated source for method currentTime """ - dt = datetime.fromtimestamp(time) - t = dt.strftime("%Y-%m-%d %H:%M:%S.%f") - - self.connectionStatus = True - self.gateway.connected = True - log = VtLogData() - log.gatewayName = self.gatewayName - log.logContent = (u'IB接口连接成功,当前服务器时间 %s' %t) - self.gateway.onLog(log) - - for symbol, req in self.subscribeReqDict.items(): - del self.subscribeReqDict[symbol] - self.gateway.subscribe(req) - #---------------------------------------------------------------------- def fundamentalData(self, reqId, data): - """ generated source for method fundamentalData """ + """""" pass - + #---------------------------------------------------------------------- def deltaNeutralValidation(self, reqId, underComp): - """ generated source for method deltaNeutralValidation """ + """""" pass - + #---------------------------------------------------------------------- def tickSnapshotEnd(self, reqId): - """ generated source for method tickSnapshotEnd """ + """""" pass #---------------------------------------------------------------------- def marketDataType(self, reqId, marketDataType): - """ generated source for method marketDataType """ + """""" pass - + #---------------------------------------------------------------------- def commissionReport(self, commissionReport): - """ generated source for method commissionReport """ + """""" pass - + #---------------------------------------------------------------------- - def position(self, account, contract, pos, avgCost): - """ generated source for method position """ + def position(self, account, contract, position, avgCost): + """""" pass - + #---------------------------------------------------------------------- def positionEnd(self): - """ generated source for method positionEnd """ - pass - + """""" + pass + #---------------------------------------------------------------------- - def accountSummary(self, reqId, account, tag, value, currency): - """ generated source for method accountSummary """ - pass - - #---------------------------------------------------------------------- - def accountSummaryEnd(self, reqId): - """ generated source for method accountSummaryEnd """ + def verifyMessageAPI(self, apiData): + """""" pass #---------------------------------------------------------------------- - def error(self, id=None, errorCode=None, errorMsg=None): - """错误回报""" - err = VtErrorData() - err.gatewayName = self.gatewayName - err.errorID = errorCode - err.errorMsg = errorMsg - self.gateway.onError(err) + def verifyCompleted(self, isSuccessful, errorText): + """""" + pass #---------------------------------------------------------------------- - def error_0(self, strval=None): - """错误回报(单一字符串)""" - err = VtErrorData() - err.gatewayName = self.gatewayName - err.errorMsg = strval - self.gateway.onError(err) + def displayGroupList(self, reqId, groups): + """""" + pass + + #---------------------------------------------------------------------- + def displayGroupUpdated(self, reqId, contractInfo): + """""" + pass + + #---------------------------------------------------------------------- + def verifyAndAuthMessageAPI(self, apiData, xyzChallange): + """""" + pass #---------------------------------------------------------------------- - def error_1(self, id=None, errorCode=None, errorMsg=None): - """错误回报(字符串和代码)""" - err = VtErrorData() - err.gatewayName = self.gatewayName - err.errorID = errorCode - err.errorMsg = errorMsg - self.gateway.onError(err) - + def verifyAndAuthCompleted(self, isSuccessful, errorText): + """""" + pass + #---------------------------------------------------------------------- - def connectionClosed(self): - """连接断开""" - self.connectionStatus = False - self.gateway.connected = False - - log = VtLogData() - log.gatewayName = self.gatewayName - log.logContent = (u'IB接口连接断开') - self.gateway.onLog(log) + def positionMulti(self, reqId, account, modelCode, contract, pos, avgCost): + """""" + pass + + #---------------------------------------------------------------------- + def positionMultiEnd(self, reqId): + """""" + pass + + #---------------------------------------------------------------------- + def accountUpdateMulti(self, reqId, account, modelCode, key, value, currency): + """""" + pass + + #---------------------------------------------------------------------- + def accountUpdateMultiEnd(self, reqId): + """""" + pass + + #---------------------------------------------------------------------- + def securityDefinitionOptionalParameter(self, reqId, exchange, underlyingConId, tradingClass, multiplier, expirations, strikes): + """""" + pass + + #---------------------------------------------------------------------- + def securityDefinitionOptionalParameterEnd(self, reqId): + """""" + pass + \ No newline at end of file diff --git a/vn.trader/ibGateway/vnib.pyd b/vn.trader/ibGateway/vnib.pyd new file mode 100644 index 00000000..934fef61 Binary files /dev/null and b/vn.trader/ibGateway/vnib.pyd differ