If you've never worked with com before Jens, then no it's probably not trivial. At least it wasn't for me. I haven't used the IB interface at all and am no com expert, but I've managed to interface with Amibroker so will outline how I went about it.
Here's a useful tute on it http://www.relisoft.com/win32/auto.html all done with OO and strict resource management. That's where I started and then it took me a lot of testing and googling from there. Here's the basic steps and I've put some of my code to match below. It's based on objects used from the tute above. 1. Initialise/Uninitialise COM. This is done using ::OleInitialize and ::OleUnInitialize which I have as constructor and destructor calls in the ComClass used below. 2. Get the ClassID for the com object you want. "BrokerIB.Application" as paultsho said. 3. Get IDispatch interface to object using a call to ::CoCreateInstance. This call is wrapped in the constructor of DispObject. 4. Use DispObject.GetProperty to access properties and functions of the com object. COM data types are passed via the VARIANT union data type. 5. I don't know if the IB interface has child objects but to access a different com object, you get a VARIANT.pdispVal to it via DispObject.GetProperty and then pass that VARIANT into the DispObject constructor. I.e. you access other com objects from existing ones. This is shown below when getting the Amibroker Stocks object from the Application object. // Basic wrapper code // 1. Initialises OLE. ComClass comClass; // 2. Retrieve Class ID. CLSID clsIdAmibroker; HRESULT hr = ::CLSIDFromProgID (L"Broker.Application", &clsIdAmibroker); // 3. Get IDispatch interface to Amibroker Application object. // This calls ::CoCreateInstance internally DispObject amibroker(clsIdAmibroker); // 4. Get the Version property of the Application object VARIANT varResult; amibroker.GetProperty(L"Version", varResult); // Convert VARIANT datatype to a normal string string version(_bstr_t(varResult.bstrVal)); // 5. Access Stock object IDispatch interface using existing Application interface ::VariantInit(&varResult); amibroker.GetProperty(L"Stocks", varResult); DispObject stocks(varResult); There's plenty more to it but I wouldn't want to spoil the fun for you. Here's some useful links VARIANT Data Type http://msdn.microsoft.com/en-us/library/ms221627.aspx IDispatch Interface http://msdn.microsoft.com/en-us/library/ms221608.aspx COM string conversions http://www.codeguru.com/cpp/cpp/string/conversions/article.php/c5639/ Most of what you'll need can be found at msdn by just following the links from one function to another. Hope that helps a bit. Jules. --- In [email protected], "tiedemj" <h...@...> wrote: > > > Hello Tomasz > > I would be nowhere without the simplicity - yet unparalleled power of AFL. > > However, over time, refinement of "checks and balances" deployed for a (real > money) automated trendline trading system had grown quite complex. Long story > short - in order to improve entegrity of the system I went from "procedural" > to "real oo" (abstraction using classses, inheritance etc.), by moving some > functionability into plugin (thus using C++ to provide the OO aspects). > > For the TWS link, I'm quite happy with IB Controller, and in particular the > "window" into what goes on between AmiBroker and TWS - but I'm unhappy with > my (own) interface to IB Controller (from plugin through AFL and feedback to > plugin again - since plugin has a static part keeping track of real trades - > that have dynamic exit points - so they need to be "managed" throughout the > trade). > > So if you can give me some hints on how to interface with IB Controller (a > COM object - right?) so that methods and attributes are exposed in C++ plugin > (I'm using visual studio 2008), I would be very grateful indeed! > > Regards > > Jens > > > > > --- In [email protected], Tomasz Janeczko <groups@> wrote: > > > > Hello, > > > > First and foremost: why would you like to do that ?? (it is possible, > > but why make things harder when you can do this > > from AFL?) > > > > Best regards, > > Tomasz Janeczko > > amibroker.com > > > > On 2010-04-09 19:03, tiedemj wrote: > > > Tx, but nothing in TWSAPI forum about how to call IB Broker interface > > > directly from a C++ Amibroker plugin. Also, not possible to call user > > > defined functions (in afl) from C++ Amibroker plugin using > > > gSite.CallFunction() - so I'm stuck... > > > > > > Anybody? > > > > > > Best regards > > > Jens Tiedemann > > > > > > --- In [email protected], "reefbreak_sd"<reefbreak_sd@> wrote: > > > > > >> There is a Yahoo! discussion group TWSAPI that talks about the IB TWS > > >> interface. > > >> > > >> > > >> > > >> --- In [email protected], "tiedemj"<home@> wrote: > > >> > > >>> > > >>> bump - anybody? > > >>> > > >>> I've seen this question asked before - but can't find any answers. Can > > >>> somebody just give a hint (if the explanation is not trivial...) > > >>> > > >>> best regards > > >>> > > >>> Jens Tiedemann > > >>> --- In [email protected], "tiedemj"<home@> wrote: > > >>> > > >>>> Assume it's possible to call IB Controller directly from an AmiBroker > > >>>> c++ plugin. Can anybody show how to do it in native c++? > > >>>> > > >>>> Best regards > > >>>> > > >>>> > > >>> > > >> > > > > > > > > > > > > ------------------------------------ > > > > > > **** IMPORTANT PLEASE READ **** > > > This group is for the discussion between users only. > > > This is *NOT* technical support channel. > > > > > > TO GET TECHNICAL SUPPORT send an e-mail directly to > > > SUPPORT {at} amibroker.com > > > > > > TO SUBMIT SUGGESTIONS please use FEEDBACK CENTER at > > > http://www.amibroker.com/feedback/ > > > (submissions sent via other channels won't be considered) > > > > > > For NEW RELEASE ANNOUNCEMENTS and other news always check DEVLOG: > > > http://www.amibroker.com/devlog/ > > > > > > Yahoo! Groups Links > > > > > > > > > > > > > > > > > >
