Keyboard Shortcuts
Likes
- Twsapi
- Messages
Search
questions on bracket and hege orders
Three questions:
1. Suppose I send a bracket order to buy. Once the parent buy order executes, two sell orders go out. One is at a higher price and is? a limit order, and the other is a stop order that gets activated at a lower price. After the main order fills, but before the two sell orders fill, is it possible to cancel the two sell orders? Or will I get an error because all three are a package deal? 2. What is the difference between bracket orders and hedging orders? The conditional orders execute only after the parent order is filled, that is the same. Also, both make use of the .transmit flag. However, the bracket order examples seem to have more legs, and when non parent id orders are filled, that fill cancels the others. Is that the only difference? 3. Can I construct "bracket/hedge" orders that are more general and have more legs? Will the behavior always be a.) child orders are only sent after the parent order goes out, and b.) only one child order can fill? |
Re: Order Id in error messages
On Mon, Oct 30, 2023 at 09:35 AM, ´³¨¹°ù²µ±ð²Ô Reinold wrote:
Well, your characterization is not correct. The id parameter for callbacks always identifies the message the error relates to: This is what I would expect, but the point is exactly it does not work this way. EWrapper.error(reqId:?int. The request identifier corresponding to the most recent reqId that maintained the error stream. (source:?) |
Re: IB Gateway crash
Not sure I understand how an IGB crash may impact your keyboard.Also I don't see how IBG may impact the OS so deep that you need a Hard reset. This look more an issue at OS level. If you use a remote desktop or a VNC like KVM that also could be a culprit, Some dislike very fast scrolling display like a log burst on a window. |
IB Gateway crash
Today, 2023.10.23 21:12:12 UTC IBG crashed and did not restart. This happened on two machines. One hosts my trading application and a realtime IBG, the other only a paper IBG.
Subsequently, the keyboard was dead and I had to hard reset to recover. Does anyone had a similar experience or has a clue? |
Re: Correlate orders and fills from the API to those in Flex Report
I never had the need for Flex Reports but recently started a low-priority project to make an XML schema for automatic ingestion of Flex XML data. The test data I had collected for that does show some line-up between TWS API and Flex XML:
toggle quoted message
Show quoted text
There may be others, but at least in my test data, "permId" does not line up with "ibOrderID". You might have to select the Flex Query option "Include Audit Trail Fields" to see those fields in the Flex XML. ´³¨¹°ù²µ±ð²Ô On Mon, Oct 30, 2023 at 10:19 AM, Little Trader wrote:
|
Re: C++ reqHistoricalData() closing connection
From my experience a connection closed trough exception happens when your submit to GTW or TWS a message that was build in EClient.cpp but contains a non valid value. From that perspective, the area that maybe an issue is what is inside your "Contract" object, ? |
Re: Order Id in error messages
Well, your characterization is not correct. The id parameter for callbacks always identifies the message the error relates to:
toggle quoted message
Show quoted text
Between requestIds and orderIds, numeric values for orderIds have to follow strict requirements possibly for very long periods of time (as in forever or until you reset the sequence in TWS/IBGW) while requestIds are ephemeral and can be reused as soon as the last request they have been used for is complete. Therefore, you simple design a numeric assignment strategy for your client that makes sure that, at any point in time, the id value of an error callback can be uniquely related to a recent request or an order. There are may ways you can do that, but a simple approach, that worked well for us for years is this:
Your error callback can uniquely be related to requests or order. ´³¨¹°ù²µ±ð²Ô On Mon, Oct 30, 2023 at 05:19 AM, bespalex wrote: This one thing has almost blown my mind recently, so I guess the 'discovery' may be helpful for others. |
Order Id in error messages
This one thing has almost blown my mind recently, so I guess the 'discovery' may be helpful for others.
Normally, when you handle errors, you would expect to get an order id the callback, but it actually does not work this way. You only get the order id as a reqId if the last thing you did was placing an order, but if you requested something else requiring reqId, like reqPnLSingle for example, you would be getting this reqId back in the errors callback. Yes, I know this is mentioned in the documentation, but still come to think about it, this can really mess up your algo, if you are not careful enough! |
Re: Does IB really limit you 1 session at a time with SSO?
Oh ok I see. I just verified that you can't have multiple users under your demo account, so I guess only for the demo I have to deal with this 1 session for the entire account problem... I will be sure to create a second user in my live account though. Thanks!
|
Re: Does IB really limit you 1 session at a time with SSO?
The limitation is one session for each user name at any point in time. But you can create a second user name for your live account through the Client Portal. That second user can have the same or fewer permissions. For example you could disable trading permissions for the second user if you are concerned about accidental mobile "butt trading". ´³¨¹°ù²µ±ð²Ô For me it is impossible to do the following which I can do with any other brokers with APIs. |
Re: updateMktDepthL2 missing data points
IDK how much more of this you want to read about. But, I'll just try to bolster the crux of ´³¨¹°ù²µ±ð²Ô's reply by referring you to Wikipedia regarding the . I'll also add that the "first approach" they describe (re-entrancy, local store, immutable objs) is often the approach people tend to overlook. This may happen because one doesn't need extra tools for the first approach, it's basically a "style". And, I suspect if you show someone a "thing" (mutex, semaphore, etc) they remember it more than if you describe a "way" (don't share data, put everything on the stack, etc). Well, I'm not an educator so that's all conjecture. The second approach, otoh, can't be avoided in some cases... often when dealing with physical resources. Anyway, you should choose the approach which suits your given circumstances. Only experience and judgement will help you know which. I'd err toward the first approach if there are any doubts. But again, the first approach doesn't often come naturally until it's practiced a bit... and sometimes it's not worth the extra mental gymnastics. As usual, YMMV. |
Does IB really limit you 1 session at a time with SSO?
For me it is impossible to do the following which I can do with any other brokers with APIs.
With IB, I have this weird limitation where
Is this really IB's limitation? It's impossible for you to run your trading system and login to their client app to check your own account? |
C++ reqHistoricalData() closing connection
Hi, Whenever I call reqHistoricalData() the connectionClosed callback is hit in my Client Class. I am trying to get real time bar updates. Below is what I am passing into reqHistoricalData(): |
Re: updateMktDepthL2 missing data points
my design is pretty the same, except much feature-less than what ´³¨¹°ù²µ±ð²Ô and his buddies implemented.
if i should write it as simple as i can, the design is this:
|
Re: Placing an order using the Gateway API to the demo account results in 401 Unauthorised
Hi Jurgen,
Thanks for helping out again. The maintenance was the issue. I tried placing the order this morning, and the order was successfully placed with PreSubmitted status. However, it is now stuck in PreSubmitted and not actually getting submitted. Is this because today is Sunday, and markets are closed? Or am I missing something in my API call? Response from place order request [
{
"order_id": "1172085515",
"order_status": "PreSubmitted",
"encrypt_message": "1"
}
]
Response from order status request {
"sub_type": null,
"request_id": "759",
"server_id": "496",
"order_id": 1172085515,
"conidex": "586139726@CME",
"conid": 586139726,
"symbol": "MES",
"side": "B",
"contract_description_1": "MES DEC23 (5)",
"listing_exchange": "CME",
"option_acct": "c",
"company_name": "Micro E-Mini S&P 500 Stock Price Index",
"size": "5.0",
"total_size": "5.0",
"currency": "USD",
"account": "DU8021006",
"order_type": "MARKET",
"cum_fill": "0.0",
"order_status": "PreSubmitted",
"order_ccp_status": "0",
"order_status_description": "Order Submitted",
"tif": "GTC",
"fg_color": "#FFFFFF",
"bg_color": "#0000CC",
"order_not_editable": false,
"editable_fields":"",
"cannot_cancel_order": false,
"deactivate_order": false,
"sec_type": "FUT",
"available_chart_periods": "#R|1",
"order_description": "Buy 5 Market, GTC",
"order_description_with_contract": "Buy 5 MES DEC'23 Market, GTC",
"alert_active": 1,
"child_order_type": "3",
"order_clearing_account": "DU8021006",
"size_and_fills": "0/5",
"exit_strategy_display_price": "4136.50",
"exit_strategy_chart_description": "Buy 5 Market, GTC",
"exit_strategy_tool_availability": "1",
"allowed_duplicate_opposite": true,
"order_time": "231029050317"
}
|
Re: Placing an order using the Gateway API to the demo account results in 401 Unauthorised
You are now moving past the point that I can be helpful. Get a "second opinion", as in place an order in the paper account through TWS or the Client Portal to make sure the paper account is ready. Then try the same order through the Client Portal API. Are you sure you have trading permissions for the instrument? And I would not dismiss intermittent outages over the weekend due to maintenance. It is not often that notes/warnings about maintenance pop up during the TWS login, but this weekend they did. The messages are gone now, so it's worth another try. ´³¨¹°ù²µ±ð²Ô On Sat, Oct 28, 2023 at 11:11 AM, Jimin Park wrote: Following is what I did: |
Re: updateMktDepthL2 missing data points
When I read your initial post, my first thought was "data corruption due to multi-threading" and it looks like that is where the discussion with Gordon Eldest, buddy, and fordfrog is coming to. Level II data for active instruments can generate a lot of data and, more importantly, bursts of hundreds even thousands of callbacks in peak seconds. Take a look at this post where I shared some stats for our setup. We have days with 2,000,000 callbacks withing five minute windows which is a sustained rate of 6,000 callbacks per second for the entire period. I am not sure how busy USD.JPY is and whether you subscribe to more than one pair, but it is safe to assume that you will have peak seconds with tens or hundreds of callbacks. On the other side, your code seems to have no synchronization between threads at all. So it is just a matter of time until corruption happens. You pointed to some code from Ewald's ib_sync . If you look a little closer to the entire library you will find carefully placed synchronization statements that make sure no data corruption takes place and a design that eliminates globally shared state as much as possible. You will find several posts in the archive about multi-threading, how to do it and that its hard. And there is a lot of truth to the various contributions but let me share some thoughts on architecture and design for (massively) multi-threaded TWS API clients that has worked very well for us and yielded rock stable applications with little or nor data access synchronization. We even have certain applications with 100++ threads that connect to several TWS/IBGW instances simultaneously and process the individual "data firehouses" flawlessly on a multi-processor machine that executes many of them really in parallel. Granted, we develop in Java and the language has a rich set of concurrency features, but all programming languages (including Python) have add-ons or libraries with similar or identical functionality. The following should, therefore, apply equally to all TWS API implementations (and multi-processing applications in general). We had the following goals for our applications:
So here is what we do ... Ruthless separation of concerns, strict need-to-know-only, and only immutable objects At the architecture level we break classes and modules into the smallest possible pieces so that all functions are related to just one topic/domain/subject. Instead of having an EWrapper object accessible to all functions in the application, we have a thin layer of code that wraps TWS API into a "controller" paradigm and groups the various functions into approx 50 small task oriented interfaces such as: Account, Position, Contract, Order, TickByTick, MarketDepth, ... Also, each interface defines classes for the data returned by TWS API callbacks so that each request returns a single immutable object that carries all parameters from the callback. In Java, these classes cannot be extended and instantiated objects cannot be modified once created. This way, objects can be shared side-effect free with many different modules in many parallel threads. The controller completely hides the existence and details of TWS API (such as requestIds) so that the application code only deals with high level objects along the lines of the domain interfaces. The signature of request calls does not have a requestId parameter any longer but callers provide a handler object instead that receives all callbacks and errors for just that request. In other words and closer to your problem, even multiple MarketData subscriptions are completely separate from each other in that the application provides unique handler objects for each of them. The Java implementation of TWS API ships with an ApiController class that shows how this can be implemented. And the good news is that you can develop your controller over time since it only needs to support the requests your applications actually use. No global state and data streams The main reason why a multi-threaded application needs locks/semaphores is to prevent data corruption when multiple threads simultaneously modify some global state or data. In your case, you have a shared global object that is not only modified by the updateMktDepthL2 callback [self.series[reqId].append( ...] and the thread that saves the data [app.series[reqId] = list()] but also by several independent market data streams for different instruments [e.g. indexed by reqId]. If you try to solve your issue with locks and semaphores, that object will become the application's bottleneck since it will be locked all the time effectively reducing parallelism to just about 1. One way to eliminate the need for synchronization is to eliminate the global series object entirely:
This became a little longer than initially intended but hopefully gives you some food for thought for a more powerful and scalable way to solve the data corruption and deal with MarketDepth fire hoses. ´³¨¹°ù²µ±ð²Ô On Sat, Oct 28, 2023 at 02:44 PM, John wrote:
@Buddy, ... However you might be correct that it could come from an unfortunate thread concurrency, i.e. a huge amount of data being unequally added to the tuple/list at the exact time the dataframe is created, so I might simply need to hard copy the list before converting that copy to a dataframe instead of the list itself. I'll try that next week and keep the group posted. |