I am having trouble using and incrementing the “orderId” for each stock order using modified IB example code. I have a method that produces nextValidId within the class and prints it to stdout but I am not sure how to access the defined property (self.nextValidOrderId) that is created in my main() program body. I am able to instantiate the EWrapper and EClient Class and place orders (If I manually input the orderId). In example code I hard code it to 126. I thought I would be able to use the following in my main() program body. “orderId = app.nextValidOrderId” but it does not work.
`__author__ = 'noone' from Testbed.OrderSamples import OrderSamples from ibapi.client import EClient from ibapi.wrapper import EWrapper from ibapi.common import * from ibapi.contract import * class OrderApp(EWrapper, EClient): def __init__(self): EClient.__init__(self,self) def error(self,reqId:TickerId, errorCode:int, errorString:str): print("Error:",reqId," ", errorCode, " ", errorString) # This is the initial response after connection to TS from the API providing next available OrderID @iswrapper def nextValidId(self, orderId: int): super().nextValidId(orderId) print("setting nextValidOrderId: %d", orderId) self.nextValidOrderId = orderId def contractDetails(self, reqId:int, contractDetails:ContractDetails): print("contractDetails: ", reqId, " ", contractDetails) def main(): app=OrderApp() app.connect("127.0.0.1",7497,0) ## Build the contract object to be passed to the order Method stock_contract = Contract() stock_contract.symbol = 'AAPL' stock_contract.secType = 'STK' stock_contract.exchange = 'SMART' stock_contract.currency = 'USD' stock_contract.primaryExchange = 'NASDAQ' # reqID must be provided to the Order. This method gets the reqID from IB DB's app.reqContractDetails(10, stock_contract) try: # Now place the order in Paper Money Account app.placeOrder(126, stock_contract, OrderSamples.LimitOrder("BUY", 50, 12)) except: raise app.run() if __name__ == "__main__": main()`
Advertisement
Answer
Your method is not syntactically correct. It should have indentation as below
@iswrapper def nextValidId(self, orderId: int): super().nextValidId(orderId) print("setting nextValidOrderId: %d" % orderId) self.nextValidOrderId = orderId
Also you are not importing the function decorator iswrapper
from ibapi.utils import iswrapper
Hope this helps