开云体育

ctrl + shift + ? for shortcuts
© 2025 开云体育

Live and paper data mixed

 

I have a program that will place trades in either the paper or live account. I run both platforms simultaneously on the same machine. It crashes when I try get my account value after switching from one to the other because I get the first result over again. I have a support ticket in with IB, but they keep suggesting it's my code. Can anyone here create the problem to help me sort this out?

With two instances of TWS open, one paper and one live, here's the simplest code I've run to show the problem:

from ib_async import *

def ensure_connection(ib: IB, host: str, desired_port: int, client_id: int): """Ensure IB is connected to the desired port. Reconnect if necessary."""

# Check if IB is connected and if the port matches
if ib.isConnected() and ib.client.port == desired_port:
    print(f"Already connected on the desired port: {desired_port}")
    return

# If connected but on the wrong port, disconnect
if ib.isConnected():
    print(f"Connected on wrong port {ib.client.port}, disconnecting...")
    ib.disconnect()
    ib.sleep(1)

# Reconnect on the correct port
print(f"Connecting to port {desired_port}...")
ib.connect(host, desired_port, client_id)

print(f"Connected on port: {ib.client.port}")

ib = IB()

IBPort = 7496

ensure_connection(ib, "127.0.0.1", IBPort, 33) print(ib.isConnected()) print(ib.client.port)

SummaryAccountValue = ib.accountSummary() print(SummaryAccountValue)

IBPort = 7497

ensure_connection(ib, "127.0.0.1", IBPort, 33) print(ib.isConnected()) print(ib.client.port)

SummaryAccountValue = ib.accountSummary() print(SummaryAccountValue)

ib.disconnect()

print(ib.isConnected()) print(ib.client.port)

IBPort = 7497

ensure_connection(ib, "127.0.0.1", IBPort, 33) print(ib.isConnected()) print(ib.client.port)

SummaryAccountValue = ib.accountSummary() print(SummaryAccountValue)

IBPort = 7496

ensure_connection(ib, "127.0.0.1", IBPort, 33) print(ib.isConnected()) print(ib.client.port)

SummaryAccountValue = ib.accountSummary() print(SummaryAccountValue)

ib.disconnect() ''' ib.fills also seems to have problems. For the first connection, it will show correct information, but on the second connection, it will show the first plus the second.

Is there a problem somewhere in the ib_async library or is this an IB issue? Can anyone reproduce this or suggest how I can fix it?

Glenn


Re: Clicking an override button

 

Hi all,

I am answering my own question. I suspect I need to specify order conditions
and allow the advancedErrorOverride flag.

How do I do this?
Pranav

-----Original Message-----
From: Pranav Lal <pranav@...>
Sent: Monday, March 24, 2025 1:36 PM
To: '[email protected]' <[email protected]>
Subject: Clicking an override button

Hi all,

I have recently begun getting messages that a security is under
surveillance.
The exact entry in my program's log is below.
2025-03-24 06:59:15,321 ib_async.wrapper ERROR Error 201, reqId 7: Order
rejected - reason:Security is under Surveillance Measure - The scrip PE is
greater than 50 for the previous 4 trailing quarters.<br><br><br>Would you
like to continue?.

How do I click yes programmatically?
Pranav


Clicking an override button

 

Hi all,

I have recently begun getting messages that a security is under
surveillance.
The exact entry in my program's log is below.
2025-03-24 06:59:15,321 ib_async.wrapper ERROR Error 201, reqId 7: Order
rejected - reason:Security is under Surveillance Measure - The scrip PE is
greater than 50 for the previous 4 trailing quarters.<br><br><br>Would you
like to continue?.

How do I click yes programmatically?
Pranav


Re: ib.reqTickers() conflicts with ib.reqTickByTickData()

 

These two methods are very different:
?
reqTickers(*contracts,?regulatorySnapshot=False)

Request and return a list of snapshot tickers. The list is returned when all tickers are ready.

This method is blocking.

?

reqTickByTickData(contract,?tickType,?numberOfTicks=0,?ignoreSize=False)

Subscribe to tick-by-tick data and return the Ticker that holds the ticks in ticker.tickByTicks.

?

Can you post more code snippet, and more importantly what you are trying to achieve?


Re: Unable to determine when an order is submitted

 

开云体育

Hi Elat,

<snip Moreover the status gets fired once and not for each status.

PL] Ouch, that is one reason why my code is not executing the way I expect. I’ll do some tweaking.

?

Thanks for your input.

Pranav


Re: Unable to determine when an order is submitted

 

Hi Prenav,?
?
be careful on choosing the status.. I've noticed in paper trading that stutus (PreSubmitted) could never be reached as those statuses are executed very quickly. Moreover the status gets fired once and not for each status.
?
Elat


ib.reqTickers() conflicts with ib.reqTickByTickData()

 

Hello Everyone, when building the APP (not in a notebook Jupyter), if call the ib.reqTickers() after having called ib.reqTickByTickData() it goes in overflow and crashes. But, if I call reqTickers() before reqTickByTickData works perfectly! I have tried with ib.sleep(30) but nothing. Any help? Thank you.


Re: Unable to determine when an order is submitted

 

Might work in simulation, but remember in real trade there will be delay after placing order:
?

? ? stop_loss_trade = ib.placeOrder(contract, stop_loss_order)

# BELOW might not be true always so quickly!

? ? if stop_loss_trade.isActive():

?

You should stick to event driven for robustness as you had before.


Re: Unable to determine when an order is submitted

 

开云体育

Hi biney59,

Thanks for your suggestion.

?

I got rid of the event logic and the program is working as I want it to at least in the simulator.

?

Here is a snippet of the modified code.

? ? # Create the limit order (parent order)

? ? limit_order = LimitOrder(order_type, order_quantity, limit_price, outsideRth=True, transmit=False)

? ?

? ? # Place the limit order

? ? print("Placing limit order")

? ? parent_trade = ib.placeOrder(contract, limit_order)

? ?

? ? # Create the stop loss order (child order)

? ? stop_loss_order = Order()

? ? stop_loss_order.action = stop_loss_action

? ? stop_loss_order.orderType = "STP"

? ? stop_loss_order.totalQuantity = order_quantity

? ? stop_loss_order.auxPrice = stop_loss_price

? ? stop_loss_order.parentId = parent_trade.order.orderId

? ? stop_loss_order.transmit = True

? ?

? ? # Place the stop loss order (this transmits both orders)

? ? print("Placing stop loss order")

? ? stop_loss_trade = ib.placeOrder(contract, stop_loss_order)

? ? if stop_loss_trade.isActive():

? ? ? ? ib.disconnect()

? ? ? ? print("Exiting")

? ? ? ? sys.exit(0)

? ? # Run the event loop to process order status updates

? ? ib.run()

?

?

Pranav


Re: Unable to determine when an order is submitted

 

PreSubmitted is not the status you want, as that still does not mean active. What you want is Submitted. You can look at for different possible statuses.
?
But for your case, even simpler, trade object already has method which will verify if Submitted. Use that.


Unable to determine when an order is submitted

 

Hi all,

I am unable to determine when an order is submitted. See the below code of
my on_order_status event. What am I doing wrong? The on_order_status event
does fire. I suspect I have the if condition wrong but am not certain.


# Event handler for order status updates
def on_order_status(trade):
print("order status event fired")
if trade == stop_loss_trade and trade.orderStatus.status ==
"PreSubmitted":
print("Stop loss order submitted, disconnecting.")
ib.disconnect()
sys.exit(0)

Pranav


Re: groups of events into one event

 

Thanks so much. I didn’t know about the event kit notebook…..that will be useful, or the ticker event.


Re: groups of events into one event

 

开云体育

Hi,

You can use the event that is on the ticker.

You are referring to the ib_async.IB() events, which will emit updates for any ticker that is active. But there is a ticker event too, which will only emit when that particular ticker has updates. Which is what I think you are asking for



So use the Ticker.updateEvent of the individual ticker. By the way in eventkit there si a notebook with examples on how to use events. There are plenty of examples on how aggregate and disaggregate events.

Cheers


On 17 Mar 2025, at 05:51, in_woolloomooloo via groups.io <brendan.t.sands@...> wrote:

Hi,
When using TickerUpdateEvent, or pendingTickersEvent, is there a way to collect individual stock events into a grouped event......for example if I have 10 stocks in a portfolio that is streaming ticks but i want an event to occur only over a set of say 5 of those stocks. I seem to remember seeing something from Ewald where he collected several events into 1....maybe Im not remembering correct as i cant find it now!!!
?
Asking the question an alternate way, what would be the most efficient/fastest way for say 2 sets of 5 stock portfolios to respond to events over their respective holdings, and not have to also filter through the events of the other 5 also?
?
Thanks
B.


groups of events into one event

 

Hi,
When using TickerUpdateEvent, or pendingTickersEvent, is there a way to collect individual stock events into a grouped event......for example if I have 10 stocks in a portfolio that is streaming ticks but i want an event to occur only over a set of say 5 of those stocks. I seem to remember seeing something from Ewald where he collected several events into 1....maybe Im not remembering correct as i cant find it now!!!
?
Asking the question an alternate way, what would be the most efficient/fastest way for say 2 sets of 5 stock portfolios to respond to events over their respective holdings, and not have to also filter through the events of the other 5 also?
?
Thanks
B.


Re: discrepancy with historic data

 

thanks for the responses. i realised/figured out that the open print will get the first trade after 9.30.00 which isn't necessarily the open auction.


Re: Why strike price 5635 missing from SPX option chain for 2025-03-14?

 

If it's missing in TWS, then there's no API issue (at least not on the last mile).
I doubt it wasn't available on the market, so only reasonable explanation is that the gamma was so high it hit some ceiling in TWS.
?
Out of curiosity, did you have the checkbox for local calculations selected or not? Not sure if that is the problem or not so you might want to test (including re-launching TWS after changing it).
Configuration > Volatility and Analytics > Use Local PC to calculate Bid / Ask IV
?
Please let us know here of your results.


Re: Why strike price 5635 missing from SPX option chain for 2025-03-14?

 

Sorry, I attach here the screen shot for the missing strike?

Screenshot 2025-03-15 at 11.34.28?AM.png


Why strike price 5635 missing from SPX option chain for 2025-03-14?

 

My algo tried to define options contract for strike price 5635 with expiry on 2025-04-14 (0DTE), but got error message saying "Unknown contract". I then found that this particular strike (5635) was missing from the options chain (spot was trading at around 5610 at that moment). I suppose SPX's strikes are listed every 5 points (unless the strike is very far away from spot or it is long dated like a year ahead). Is this common ? How do you guys' code cater for this missing strike ??


What does the following error message mean?

 

ib_async.wrapper: ERROR orderStatus: No order found for orderId 109 and clientId 2

This message happens right after I issue ib.connectAsync(). I am pretty sure it is printed out from ib_async. What does it mean and what do I need to do?


Re: discrepancy with historic data

 

For the opening there's an auction and the price of the auction is the opening price (code=Q); note the high volume.
In-between the first ticks and the big auction there are some odd-lot trades (code=I) that could not be matched.
?
On the other hand, ticks relate to normal trade and the first tick is different than the opening auction price.
?
There is a good explanation on CME client systems wiki if you are so technically inclined. Here's an intro video that summarizes the approach.
I assume it's similar on the exchange you mentioned.
?
Net, for you as a trader, if you want to catch the opening price, you need to use:
- MOO orders (MKT with TIF=OPG) -> you get what price you get but guaranteed
- LOO orders (LMT with TIF=OPG) -> you try to make the market and have a say in the auction; if your limit is way off the auction price, it stays as normal LMT order after the auction
- LMT orders that are enabled for outside liquid hours (LMT with TIF=GTC and Outside RTH = True)
- OVERNIGHT orders
- non-US Auctions: MOO orders (MTL with TIF=AUC)
?
NB: IB might simulate MKT orders even if they are earmarked for open (TIF=OPG).
NB2: Back testing and paper trade cannot deal with the opening auction.
?
How and where you want to include the opening price - you need to really think about it hard.
?
* Liquidity: For 1 lot, don't worry about it. If you have $10m exposure and you need to get out cause some news came out, then you wouldn't be asking here. So don't worry about it.
* Trading Strategy: If 90.21 vs 90.28 is a deal breaker for your strategy, then the strategy is wrong 100%. I said.