Really excellent information Jules - thank you for taking time out to explain! 
I does look a bit involved - but if thats what it takes, I will go that route. 

Only one last question to Tomasz before diving in - would you suggest an 
alternative approach? - or do you have additional hints in regards to IB 
Controller since Jules example is for AmiBroker?

Best regards
Jens



--- In [email protected], "jooleanlogic" <joole...@...> wrote:
>
> 
> 
> 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" <home@> 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
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> >
>


Reply via email to