Keyboard Shortcuts
Likes
- Twsapi
- Messages
Search
Re: Purebasic and TWS
Thank you for your detailed response.
?
My first idea was to use VB6 that I have used in the past but it is no longer supported.
Switching to VB.NET seems to be a step as large as to any other language. ?
The trading algorithm is very simple. It uses only one instrument (future). I do not expect to use a large variety of TWS function calls.
But things always get much more complicated as expected... ?
Programming also involves psychology. I have some aversion for (semi)interpreted stuff.
I have worked professionally in embedded computing which means designing compact electronic boards and compact programs that fit into small microcontrollers. My trading configuration will use a tiny PC (working 24 hours a day) that consumes 16W. Power will be backed up directly with a battery (no inverter at all). Thats the KISS approach. The simpler, the more reliable it should be: a professional "obsession" ;-) ?
With Purebasic the only thing that I am affraid of is that with TWS everything seems to be asynchronous.
So some kind of multitasking or multithreading handling could be required. ?
By the way, I just made a request to chatGPT and in just a few microseconds it generated source code for both socket and TWSLib.dll choices.
So both options seem to work. Although the second seems to be simpler. ?
|
Re: Purebasic and TWS
开云体育You need to decide what your priorities are. If you just want a large challenge, by all means push ahead with PureBasic, but it will be difficult to say the least because you’ll be pretty much entirely on your own, working on a topic that you have no experience of. And for what benefit? ‘compact’, ‘efficient’, ‘no dependencies’ etc are simply irrelevant distractions. ? But if you want to actually get something useful (for trading) working in the shortest possible time, then just forget about PureBasic. ? If you’re already familiar with some form of Basic, then you could use Visual Basic .Net, which will cost you nothing if you use the free Community Edition of Microsoft Visual Studio: if you haven’t used Visual Studio before you’ll be blown away by its massive capabilities, and ‘free’ doesn’t mean ‘cut down’, it just means you can’t use it for commercial software. ? Visual Basic .Net works perfectly well with IBKR’s C# API (as does any other .Net language). But it’s still a significant learning curve to make good use of the API, as it also is in other languages like Java. ? But by far the fastest way to be productive is to use Python (and especially the ib-async API from , which is a third-party API implementation that makes life a lot simpler in many ways). ? Don’t be fooled into thinking that Python, being interpreted rather than compiled, is a poor choice: for the kind of programs we write using the API, that difference is entirely irrelevant. While it’s true that a compiled API might get your order out of the door a couple of microseconds sooner than an interpreted one, that advantage is totally buried by the several milliseconds, or more likely several tens of milliseconds, that it takes for your order to reach the exchange. ? By the way, I’m not a Python user (there was no Python API when I started on this back in 2003), but I’m very much aware of the considerable productivity benefits it offers. I’m just too hugely invested in more ‘traditional’ languages to make the switch. ? If you decide to go the Visual Basic (or C#) route, I can provide you with a simple (but meaningful) sample program that shows how to get started. Actually I’ll link to it here – it’s a couple of years out of date and uses the 10.19 API version, but it still works fine: ? ? You’ll find the executable in the bin/debug subfolder, so you can run it to see what it does. If you load the project into Visual Studio, you won’t be able to compile it without first updating the reference to the C# API. ? I hope this isn’t all too confusing… ? Richard |
Re: No Security definition has been found for the request when running cpp sample code
开云体育reqRealTimeBars is served by the historical data server. But IBKR does not maintain ‘last price’ historical data for forex pairs. So you will never get realtime bars for any forex pair, if you have WhatToShow=”TRADES”: you’ll just get this error message 420: ? Invalid Real-time Query:No historical market data for EUR/CASH@FXSUBPIP Last 0 ? But if you set WhatToShow=”MIDPOINT”, it works fine: ? 20241203 09:49:47.068? id=131072 time=20241203-09:49:40 open=0.829655 high=0.829655 low=0.82962 close=0.82964 volume=-1 WAP=-1 count=-1 20241203 09:49:50.362? id=131072 time=20241203-09:49:45 open=0.82964 high=0.82968 low=0.82964 close=0.829665 volume=-1 WAP=-1 count=-1 20241203 09:49:55.533? id=131072 time=20241203-09:49:50 open=0.829665 high=0.829665 low=0.82962 close=0.82962 volume=-1 WAP=-1 count=-1 ? Richard ? |
Re: Is there generic method to format contract for reqContractDetails
Glad that this works for you. There is one caveat about requesting contracts by ConId. It may not apply to your use case but you should be aware (and you may already be). The ConId uniquely identifies a specific instrument, possibly even for a long time. But if the issuer makes any change to the instrument that requires a change to the secId (ISIN/CUSIP, ...) IBKR changes the ConId as well. Even if the Symbol or LocalSymbol of the instrument does not change. Examples are stock splits, change of primary listing exchange, and corporate mergers, but there may be others. SH just went through this in early November. Generally in these cases, the old ConIds become invalid and result in request errors the moment the instrument change takes place. The Contract option "includeExpired" only works for certain instruments (such as Futures) and does not work for Stocks/ETFs/ETNs etc. For many use cases, your "four field" contract lookup such as "SH:STK:SMART:USD" might still be the best bet. 闯ü谤驳别苍 ?
On Mon, Dec 2, 2024 at 07:51 AM, Andy Sanders wrote:
|
Re: Purebasic and TWS
开云体育I haven't seen an API version for basic or purebasic.? There are versions for C++, C#, Python, java and others.? But I'm not sure if that would work well and you wouldn't have much for support as you progress. Perrhaps someone else knows more on this... -------- Original message -------- From: "Tradiator via groups.io" <yahoo@...> Date: 2024-12-02 7:02 a.m. (GMT-08:00) Subject: [TWS API] Purebasic and TWS Hi,
?
I am looking for Purebasic source code that uses TWS API. I am a begineer in Purebasic and TWS but not in programming but dont really know where to start.
?
For example do I have to:
1 - Load a DLL such as TWSAPI.DLL or TWSLib.dll or something else, and then call the included functions? 2 - Open a windows socket connection and then send command strings ? ?
I tryed to find out exploring source code in other languages, but nothing appeared clearly to me.
?
My feeling is that Purebasic is a good language for this use as it generates a very compact and efficient executable file with no depencies.
?
I just need to get started, then I can manage the rest. However if I could find Purebasic source code I might save a lot of time.
?
Thanking you in advance for any help.
|
Purebasic and TWS
Hi,
?
I am looking for Purebasic source code that uses TWS API. I am a begineer in Purebasic and TWS but not in programming but dont really know where to start.
?
For example do I have to:
1 - Load a DLL such as TWSAPI.DLL or TWSLib.dll or something else, and then call the included functions? 2 - Open a windows socket connection and then send command strings ? ?
I tryed to find out exploring source code in other languages, but nothing appeared clearly to me.
?
My feeling is that Purebasic is a good language for this use as it generates a very compact and efficient executable file with no depencies.
?
I just need to get started, then I can manage the rest. However if I could find Purebasic source code I might save a lot of time.
?
Thanking you in advance for any help.
|
Re: Is there generic method to format contract for reqContractDetails
I wish that was true but it is not.?
Just double checked, having only ConID doesn't work for SPY stock, other security types work fine.?
Error validating request.-'bI' : cause - The symbol or the local-symbol or the security id must be entered |
Re: Is there generic method to format contract for reqContractDetails
The ConId by itself uniquely identifies the Contract. If you already have a ConId (as you said from orders, positions, or similar objects), SecType and LocalSymbol are not required to retrieve the corresponding ContractDetails object. 闯ü谤驳别苍 ? ? On Mon, Dec 2, 2024 at 12:38 AM, Andy Sanders wrote:
|
Re: Is there generic method to format contract for reqContractDetails
Thank you for the explanation.?
After mentioning that contract can be "overspecified", I tried? to simplify definition instead of complicating it.?
Appeared to be that specifying only 3 fields is enough to specify the contract.?
?
This information is returned for all open orders and positions. Technically, ConId is not required, but without ConId, reqContractDetails can't find some contracts within 5 seconds, specifically those with options expiring daily, which is not acceptable. Final version cut down to 3 fields only, works fine for stocks, options, forex, futures, futures options.?
?
public static Contract GetContract(InstrumentModel instrument)
{ ? var basis = instrument.Basis; ? var derivative = instrument.Derivative; ? var contract = new Contract ? { ? ? //Symbol = basis?.Name, ? ? LocalSymbol = instrument.Name, ? ? //Multiplier = $"{instrument.Leverage}", ? ? //Exchange = instrument.Exchange ?? "SMART", ? ? SecType = GetInstrumentType(instrument.Type), ? ? ConId = int.TryParse(instrument.Id, out var id) ? id : 0, ? ? //Currency = instrument.Currency?.Name ?? nameof(CurrencyEnum.USD) ? }; ? //if (derivative is not null)
? //{ ? // ?contract.Strike = derivative.Strike ?? 0; ? // ?contract.LastTradeDateOrContractMonth = $"{derivative.Expiration:yyyyMMdd}"; ? // ?switch (derivative.Side)
? // ?{ ? // ? ?case OptionSideEnum.Put: contract.Right = "P"; break; ? // ? ?case OptionSideEnum.Call: contract.Right = "C"; break; ? // ?} ? //} ? return contract;
} |
Re: Is there generic method to format contract for reqContractDetails
The Contract object contains a lot of information about an instrument, but the various API request calls thatt take Contract object parameters transmit only a subset of those to TWS/IBGW. Which those are is not defined by the API specification, so the best practice is to always use complete Contract objects that you receive from IBKR through reqContractDetails calls. I understand that many code samples give you a different impression (e.g. they make contract objects up on the fly) but "home made" Contract objects do not result in reliable results over long periods of time. Think about reqContractDetails as a database query. Depending on what you want to see, you provide more or less attributes to the query:
But you would generally not call reqContractDetails with a complete Contract object you have received from IBKR. Chances are that those contracts over-specify the instrument which can indeed result in a "No security definition was found" error. One convenient way to design your reqContractDetails queries (you'd do that once) is ?Richard King's Another path are the complete TWS API client applications that ship with TWS API (such as the pre-compiled Java and C# apps). They also have screens where you quickly can experiment with reqContractDetails. But Richard's tool is more purpose built and might get you results quicker. Many of our members call reqContractDetails for the instruments they are interested in when their client applications start, or at least once per session, and use the resulting Contract object for all requests. The returned ContractDetails object(s) do not just contain the Contract you are looking for, but also the actual trading hours for the next few days. This is very helpful to detect short notice changes (emergencies, local events) and the exact trading hours around public holidays. You can also search our message archive, since there are several topics about how to specify contract queries for various instrument types. Hope this helps as a direction for a reliable approach. 闯ü谤驳别苍 PS. When you request market data with a contract that specifies just ES:IND:CME:USD you get very likely data for the ES Index and not the ES Future. If you want to request data for the ES Future with a "home made" contract, specify the fields I mentioned above: type such as type FUT plus localName or lastTradeDateOrContractMonth or type CONTFUT. ? ?
On Sun, Dec 1, 2024 at 05:01 PM, Andy Sanders wrote:
|
Is there generic method to format contract for reqContractDetails
To get stock contract, it requires only 4 fields.?
?
Name = "SPY"
Exchange = "SMART" SecType = "STK" Currency = "USD" ?
For stock options, the 4 fields above + 3 more?
?
Right = "C"
Strike = 650
LastTradeDateOrContractMonth = "20241231"
?
When it comes to futures and futures options, it gets messy. For example, after reading couple of posts in this group, this is the contract definition that I used to subscribe to live data feed for ES futures. Of course, "SecType" = "FUT" and "Exchange" = "SMART" would be more appropriate but here we go.??
?
Name = "ES"
Exchange = "CME" SecType = "IND" Currency = "USD" ?
I have no idea why it has to be "IND" instead of "FUT" but somehow it worked for "reqMktData". Meanwhile, when I try to pass this to "reqContractDetails", I get "No security definition was found for the request".?The same happens when I try to request contract details for futures options.
The funny part is that I don't populate these parameters manually, I just request all open orders and positions, copy contract object from there and use it in reContractDetails but IB API returns "No security found" error for it. In other words, IB API returns INCORRECT data that can't be used to make other requests.?
?
Hence the question, Is there a map or table that clearly defines which security type and exchange need to be used with specific securities, e.g. if I have these assets, how do I create method that correctly populates properties for them, so I could use their contract definitions in other API calls, like reqMktData?
?
|
Re: How to get position info in "points"
For the future readers.
Using average open price and the current price, you can get PnL in points.?
?
?
Average? double average_op = (op1 * lot1 + op2 * lot2 + opN * lotN) / (lot1 + lot2 + lotN);
Profit in points: double profit = Bid - average_op;
What I was expected to receive from IB API is an ability to see the PnL in points and dollars separately.?
Appeared that IB returns only average cost in dollars and only for one unit, so there is no need to divide it by number of contracts but it needs to be divided by multiplier.?
?
Examples?
?
What "reqOpenPositions" returns
After dividing by multiplier I can get average open price?
I know average cost in dollars that IB returns.?
In other words, there are always 2 calls.?
|
TWS API Stopped accepting incoming connections sometimes
TWS sometimes suddenly cannot connect, and it must be re-verified and logged in again to fix it.
?
Belows are gateway logs happened before my connection failure today
?
2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - Farm ushmds/NATIVE: Closing dormant connection type:HISTORICAL_DATA
2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - Disconnecting cdc1.ibllc.com:4000 [disconnectDetails=DisconnectDetails[sessionID=9,endPoint=cdc1.ibllc.com:4000,reason=DISCONNECT_ON_INACTIVITY,cause=null,systemMessage=null,keepSocketOpen=false]]... 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - Socket closed. 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - SocketTracker[name=name=ushmds(cdc1.ibllc.com:4000),usesCcpConMan=false,lastReadTimestamp=1732869470298,lastReadDateTime=2024-11-29T08:37:50.298,lastFixSendTime=]. 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - Interrupting dispatcher [sessionID=9]... 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - Interrupting listener [sessionID=9,disconnectSocket=true]... 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - AuthTimeoutMonitor-ushmds: deactivate 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsDispatcherS9-282S9-283] - Dispatcher thread terminating [sessionID=9,interrupted=true]... 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsListenerS9-281] - Socket or stream for connection cdc1.ibllc.com:4000 was closed by another thread. 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsServicePingS9-286] - Terminating ping thread 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-ushmdsListenerS9-281] - Listener thread terminating [sessionID=9] [seen=36342294,totalShifted=36342294,moreAvailable=0] 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-DisconnectedS9-551] - Farm ushmds/NATIVE: Lost active connection with disconnect status DISCONNECT_ON_INACTIVITY 2024-11-29 08:37:59.254 [EY] INFO ?[JTS-DisconnectedS9-551] - Farm ushmds/NATIVE: Not resetting 2024-11-29 08:37:59.255 [EY] INFO ?[JTS-AsyncNonLocked-33] - [50:176:176:1:0:4:2:DET] Sending error. 2024-11-29 08:37:59.255 [EY] INFO ?[JTS-AsyncNonLocked-33] - [50:176:176:1:0:4:2:DET] [4;2;-1;2107;HMDS data farm connection is inactive but should be available upon demand.ushmds;] 2024-11-29 08:37:59.255 [EY] INFO ?[JTS-AsyncNonLocked-33] - [50:176:176:1:0:4:2:DET] Error sent. 2024-11-29 08:38:31.130 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:39:32.134 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:40:11.939 [EY] INFO ?[JTS-DeadlockMonitor-2] - Memory:total=786,432KB free=277,852KB HeapUsage: Max=786,432KB used=506,764KB committed=786,432KB NonHeapUsage: Max=0KB used=172,722KB committed=176,432KB 2024-11-29 08:40:12.940 [EY] INFO ?[JTS-DeadlockMonitor-2] - CPU:cur=12.52% avg=0.38% 30 min avg=4.46% 10 min avg=12.51% 5 min avg=12.50% 1 min avg=12.52% GC:called=953 times CPU used=0.03% Finalizer:cur=0.00% avg=0.00% 30 min avg=0.00% 10 min avg=0.00% 5 min avg=0.00% 1 min avg=0.00% Threads Count:curr live=72 curr daemon=33 2024-11-29 08:40:33.139 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:41:34.144 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:42:35.148 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:43:36.153 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:44:37.158 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:45:11.944 [EY] INFO ?[JTS-DeadlockMonitor-2] - Memory:total=786,432KB free=273,763KB HeapUsage: Max=786,432KB used=510,860KB committed=786,432KB NonHeapUsage: Max=0KB used=172,732KB committed=176,432KB 2024-11-29 08:45:12.945 [EY] INFO ?[JTS-DeadlockMonitor-2] - CPU:cur=12.52% avg=0.49% 30 min avg=6.54% 10 min avg=12.51% 5 min avg=12.51% 1 min avg=12.52% GC:called=953 times CPU used=0.03% Finalizer:cur=0.00% avg=0.00% 30 min avg=0.00% 10 min avg=0.00% 5 min avg=0.00% 1 min avg=0.00% Threads Count:curr live=72 curr daemon=33 2024-11-29 08:45:38.162 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:46:39.167 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:47:40.171 [EY] INFO ?[JTS-CCPPingS2-28] - Resetting long time mode 2024-11-29 08:49:00.405 [EY] INFO ?[JTS-EServerSocket-546] - [112501:187:187:1:0:0:0:ERR] Socket connection for client{112501} has closed. Reason: Connection terminated
2024-11-29 08:49:00.405 [EY] INFO ?[JTS-EServerSocket-546] - [112501:187:187:1:0:0:0:INFO] Stopped processing incoming messages for client{112501}. ?
?
Does anyone encounter this issue and know why is it happending? Appreciate if you can provide some insights.
?
Thanks?
xb
? |
Re: No real-time data after IB nightly server reset
I have an open ticket with IBKR about a very similar (even identical?) topic since a couple of weeks. I have experienced the same problems where on some days Gateway would not recover after a daily reset. In all cases was a disconnect from ushmds involved. Initially I did not respond to the opening post of this thread because I am not using Docker.
?
In recent weeks the problem has disappeared. I used to download once per day quite some historical data for a list of US stock tickers (5 years daily data for 230 tickers). Every now and then (once, twice per week?) ushmds would disconnect after I had submitted the data requests, and before I received the results. Immediately after this disconnect Gateway would disconnect all clients and not allow any new clients to connect! Forcing me to kill Gateway and restart it. Four weeks ago I changed my software: now I am downloading a lot less data every day, and merge that with data I already have. Since then has the problem disappeared. What I suspect, but don't have confirmation of, is that somehow I exceeded the "soft limits" IBKR has in place on historical data downloads. In the open ticket I'm having with IBKR I am hoping to get a confirmation that this was indeed the case. I must emphasize though that I never received a warning that I was downloading too much data, or that I had crossed the soft limit. |
Re: How to get position info in "points"
If you are not collecting order executions through the API as Juergen suggested, the other way to approach this is to collect and aggregate IBKR's trade reports or custom designed flex reports from email. чт, 28 нояб. 2024?г., 18:04 闯ü谤驳别苍 Reinold via <TwsApiOnGroupsIo=[email protected]>:
--
Best, DS |
Re: How to get position info in "points"
It sounds like you are looking in the wrong corner. At any point in time, a "Position" represents the cumulative effect of one or more Trades (Executions) that were caused by one or more Orders for the instrument in the "Position". The attributes you call "open time" and "open price" are actually attributes of the "Execution" not the "Position". The "Position" only know about sums and averages. Your client receives real-time order and execution callbacks as the position changes. You could collect and persist at least the executions if you need to know later, how the position changed over time. 闯ü谤驳别苍 ? ? On Thu, Nov 28, 2024 at 01:27 PM, Andy Sanders wrote:
? |