TypeError: error() takes 2 positional arguments but 4 were given
-
Hello,
I'm switching my strategy to paper trading on interactivebrokers, the strangest thing is happening, this is my error as logged:
-------------------- ---> pavement.run Traceback (most recent call last): File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/ext/EClientSocket.py", line 958, in placeOrder self.send(order.m_tif) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/lib/overloading.py", line 82, in __call__ return func(*args) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/ext/EClientSocket.py", line 1754, in send_1 self.m_dos.write(val) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/lib/__init__.py", line 152, in write send(pack('!c', char)) BrokenPipeError: [Errno 32] Broken pipe During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/paver/tasks.py", line 201, in _run_task return do_task() File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/paver/tasks.py", line 198, in do_task return func(**kw) File "pavement.py", line 133, in run raise SystemExit(main([CODE_DIRECTORY] + args)) File "/Users/me/Documents/me/trading/trader/trader/main.py", line 79, in main raise error File "/Users/me/Documents/me/trading/trader/trader/main.py", line 76, in main action(options) File "/Users/me/Documents/me/trading/trader/trader/main.py", line 40, in _live live.run() File "/Users/me/Documents/me/trading/trader/trader/live.py", line 59, in run self.stats = self.cerebro.run() File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/cerebro.py", line 1127, in run runstrat = self.runstrategies(iterstrat) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/cerebro.py", line 1298, in runstrategies self._runnext(runstrats) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/cerebro.py", line 1630, in _runnext strat._next() File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/strategy.py", line 347, in _next super(Strategy, self)._next() File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/lineiterator.py", line 271, in _next self.next() File "/Users/me/Documents/me/trading/trader/trader/strategies/BankTradingStrategy.py", line 190, in next self.short_trade = self.place_short() File "/Users/me/Documents/me/trading/trader/trader/strategies/BankTradingStrategy.py", line 115, in place_short limitprice=price - limitdistance) File "/Users/me/Documents/me/trading/trader/trader/SupportStrategy.py", line 43, in sell_bracket orders = super(SupportStrategy, self).sell_bracket(**kargs) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/strategy.py", line 1217, in sell_bracket o = self.sell(**kargs) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/strategy.py", line 969, in sell **kwargs) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/brokers/ibbroker.py", line 391, in sell return self.submit(order) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/brokers/ibbroker.py", line 337, in submit self.ib.placeOrder(order.m_orderId, order.data.tradecontract, order) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/backtrader/stores/ibstore.py", line 1286, in placeOrder self.conn.placeOrder(orderid, contract, order) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/lib/__init__.py", line 60, in inner return func(*args, **kwds) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/ext/EClientSocket.py", line 1155, in placeOrder self.error_0(id, EClientErrors.FAIL_SEND_ORDER, str(e)) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/lib/__init__.py", line 60, in inner return func(*args, **kwds) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/ext/EClientSocket.py", line 1709, in error_0 self.m_anyWrapper.error(id, errorCode, errorMsg) File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/lib/overloading.py", line 82, in __call__ return func(*args) TypeError: error() takes 2 positional arguments but 4 were given
I can reproduce this with:
(Pdb) self.sell_bracket(price= 1.1350936200039081, exectype= 4, stopprice= 1.1373796835411358, limitprice= 1.1298980210556635) *** TypeError: error() takes 2 positional arguments but 4 were given (Pdb) self.sell_bracket(price= 1.1350936200039081, exectype= 4, stopprice= 1.1373796835411358, limitprice= 1.1298980210556635) [<backtrader.brokers.ibbroker.IBOrder object at 0x12b0b9668>, <backtrader.brokers.ibbroker.IBOrder object at 0x12b0b9908>, <backtrader.brokers.ibbroker.IBOrder object at 0x12b0b9ac8>] (Pdb)
basically sell_bracket fails only at the first call. the following ones see no problems
any ideas?
-
You could let us know that
exectype=4
isStopLimit
which differs from the standardLimit
which is shown by Interactive Brokers for bracket oerder.@dongiulio said in TypeError: error() takes 2 positional arguments but 4 were given:
File "/Users/me/Documents/me/trading/trader/trader_venv/lib/python3.7/site-packages/ib/ext/EClientSocket.py", line 1155, in placeOrder self.error_0(id, EClientErrors.FAIL_SEND_ORDER, str(e))
You could then look at this, which means the order wasn't sent and Interactive Brokers is probably giving you a huge warning and the TWS console is showing something, including orders which may have been created but not sent.
Since you try again, TWS interprets you are ok with the huge ignored warning.
-
Apologies for the late response, somehow I ran out of free time for this project, and was busy with something else.
@backtrader said in TypeError: error() takes 2 positional arguments but 4 were given:
You could let us know that exectype=4 is StopLimit which differs from the standard Limit which is shown by Interactive Brokers for bracket oerder.
exectype=4 is the result of
exectype=bt.Order.StopLimit
, I got that value by copy pasting the params for the method call.You could then look at this, which means the order wasn't sent and Interactive Brokers is probably giving you a huge warning and the TWS console is showing something, including orders which may have been created but not sent.
Since you try again, TWS interprets you are ok with the huge ignored warning.I checked on TWS log, it complains about number format,
2019-03-15 17:00:59.175 [HR] ERROR [JTS-EServerSocket-372] - [35:62:76:1:0:0:0:ERR] Client socket broken - java.lang.NumberFormatException: For input string: "1.132" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:580) at java.lang.Integer.parseInt(Integer.java:615) at jextend.bb.p(bb.java:908) at jextend.dI.aZ(dI.java:2517) at jextend.dI.run(dI.java:2114) at java.lang.Thread.run(Thread.java:748)
obviously my entry price (1.132) is not an Int, I'm not sure how should I represent my entry price as an int.
-
found my issue:
A StopLimit order requires the
plimit
parameter, to specify at which price to activate the limit order, somehow I managed to get through backtesting without setting it, but interactive broker didn't like it.apologies for the noise.
-
@dongiulio thanks for coming back and posting the solution, helped me get through the IB integration.
cheers