Commits

Oliver Gu  committed 5b581ae

Initial public release

  • Participants

Comments (0)

Files changed (89)

+*.native
+*.byte
+*.log
+/setup.log
+/setup.data
+/setup.log
+/setup.data
+/_log
+/_build
+/API.docdir
+# OASIS_START
+# DO NOT EDIT (digest: 55cbe307fc22e2d031ccaf45993ada3a)
+lib/Config
+lib/Std_internal
+lib/Send_tag
+lib/Recv_tag
+lib/Tws_prot
+lib/Pickable
+lib/Unpickable
+lib/Query_intf
+lib/Submit_order
+lib/Execution_id
+lib/Query
+lib/Response_intf
+lib/Response
+lib/Symbol
+lib/Exchange
+lib/Currency
+lib/Price
+lib/Account_code
+lib/Raw_contract_intf
+lib/Raw_contract
+lib/Contract
+lib/Raw_order_intf
+lib/Raw_order
+lib/Order
+lib/Ib
+lib/Tws_reqs
+lib/Tws
+lib/Client_id
+lib/Client_intf
+lib/Std
+# OASIS_STOP
+(* OASIS_START *)
+(* DO NOT EDIT (digest: dfb3475ba7f1fde8086e4f1ef90fb41f) *)
+Authors of ibx
+Oliver Gu <gu.oliver@yahoo.com>
+(* OASIS_STOP *)
+2013-04-02: Initial public release.
+The Library is distributed under the terms of the GNU Lesser General
+Public License version 2.1 (included below).
+
+As a special exception to the GNU Lesser General Public License, you
+may link, statically or dynamically, a "work that uses the Library"
+with a publicly distributed version of the Library to produce an
+executable file containing portions of the Library, and distribute that
+executable file under terms of your choice, without any of the additional
+requirements listed in clause 6 of the GNU Lesser General Public License.
+By "a publicly distributed version of the Library", we mean either the
+unmodified Library as distributed by the authors, or a modified version
+of the Library that is distributed under the conditions defined in clause
+3 of the GNU Lesser General Public License.  This exception does not
+however invalidate any other reasons why the executable file might be
+covered by the GNU Lesser General Public License.
+
+---------------------------------------------------------------------------
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+		       Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL.  It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it.  You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+  When we speak of free software, we are referring to freedom of use,
+not price.  Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+  To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights.  These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  To protect each distributor, we want to make it very clear that
+there is no warranty for the free library.  Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+  Finally, software patents pose a constant threat to the existence of
+any free program.  We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder.  Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+  Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License.  This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License.  We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+  When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library.  The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom.  The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+  We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License.  It also provides other free software developers Less
+of an advantage over competing non-free programs.  These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries.  However, the Lesser license provides advantages in certain
+special circumstances.
+
+  For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard.  To achieve this, non-free programs must be
+allowed to use the library.  A more frequent case is that a free
+library does the same job as widely used non-free libraries.  In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+  In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software.  For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+  Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+		  GNU LESSER GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Use a suitable shared library mechanism for linking with the
+    Library.  A suitable mechanism is one that (1) uses at run time a
+    copy of the library already present on the user's computer system,
+    rather than copying library functions into the executable, and (2)
+    will operate properly with a modified version of the library, if
+    the user installs one, as long as the modified version is
+    interface-compatible with the version that the work was made with.
+
+    c) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    d) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    e) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+           How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
+(* OASIS_START *)
+(* DO NOT EDIT (digest: 8b5ac213a1133a18b1dcc638fd45971d) *)
+This is the INSTALL file for the ibx distribution.
+
+This package uses OASIS to generate its build system. See section OASIS for
+full information. 
+
+Dependencies
+============
+
+In order to compile this package, you will need:
+* ocaml (>= 3.12) for all, test test_runner, doc API
+* findlib (>= 1.3.1)
+* core for library ibx
+* async for library ibx
+* sexplib for library ibx
+* fieldslib for library ibx
+* core_extended for executable test_runner
+
+Installing
+==========
+
+1. Uncompress the source archive and go to the root of the package
+2. Run 'ocaml setup.ml -configure'
+3. Run 'ocaml setup.ml -build'
+4. Run 'ocaml setup.ml -install'
+
+Uninstalling
+============
+
+1. Go to the root of the package 
+2. Run 'ocaml setup.ml -uninstall'
+
+OASIS
+=====
+
+OASIS is a program that generates a setup.ml file using a simple '_oasis'
+configuration file. The generated setup only depends on the standard OCaml
+installation: no additional library is required.
+
+(* OASIS_STOP *)
+# OASIS_START
+# DO NOT EDIT (digest: bc1e05bfc8b39b664f29dae8dbd3ebbb)
+
+SETUP = ocaml setup.ml
+
+build: setup.data
+	$(SETUP) -build $(BUILDFLAGS)
+
+doc: setup.data build
+	$(SETUP) -doc $(DOCFLAGS)
+
+test: setup.data build
+	$(SETUP) -test $(TESTFLAGS)
+
+all: 
+	$(SETUP) -all $(ALLFLAGS)
+
+install: setup.data
+	$(SETUP) -install $(INSTALLFLAGS)
+
+uninstall: setup.data
+	$(SETUP) -uninstall $(UNINSTALLFLAGS)
+
+reinstall: setup.data
+	$(SETUP) -reinstall $(REINSTALLFLAGS)
+
+clean: 
+	$(SETUP) -clean $(CLEANFLAGS)
+
+distclean: 
+	$(SETUP) -distclean $(DISTCLEANFLAGS)
+
+setup.data:
+	$(SETUP) -configure $(CONFIGUREFLAGS)
+
+.PHONY: build doc test all install uninstall reinstall clean distclean configure
+
+# OASIS_STOP
+IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+==================================================================
+
+---------------------------------------------------------------------------
+
+Installation
+------------
+
+From Source
+
+    $ make
+    $ make install
+
+Usage
+-----
+
+### Prerequisites
+
+Before you start, please install the Interactive Brokers Trader Workstation
+[TWS](http://www.interactivebrokers.com/en/p.php?f=tws) or its low-resource alternative
+[IB Gateway](http://www.interactivebrokers.com/en/p.php?f=programInterface&ib_entity=llc)
+and make sure that the software allows for incoming API connections. How this is
+done for TWS can be watched [here](http://www.youtube.com/watch?v=53tmypRq5wI).
+For more detailed information please refer to the Interactive Brokers
+[API Reference Guide](http://www.interactivebrokers.com/en/software/api/api.htm).
+
+### Examples
+
+To get started please refer to the `examples`-directory of this distribution.
+
+
+Contact Information
+-------------------
+
+In case of bugs, feature requests and similar, please contact:
+
+  * Oliver Gu <gu.oliver@yahoo.com>
+* write a better README file
+* write more documentation
+* handle 'open order' messages on connection
+* implement account updates
+* implement more order types
+* implement further examples, e.g. a customized client for option data
+OASISFormat:     0.3
+OCamlVersion:    >= 3.12
+Name:            ibx
+Version:         0.5.0
+Synopsis:        IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+Description:     IBX offers a native OCaml interface to the Interactive Brokers
+                 Trader Workstation API (TWS API)
+Authors:         Oliver Gu <gu.oliver@yahoo.com>
+License:         LGPL-2.1+ with OCaml linking exception
+OCamlVersion:    >= 3.12
+FindlibVersion:  >= 1.3.1
+Homepage:        https://bitbucket.org/ogu/ibx
+Plugins:         META (0.3), StdFiles (0.3), DevFiles (0.3)
+XStdFilesREADME: false
+BuildTools:      ocamlbuild, ocamldoc
+PostDistcleanCommand: $rmdir ibx.log
+
+Library ibx
+  Path:          lib
+  FindlibName:   ibx
+  Pack:          true
+  Modules:       Config,
+                 Std_internal,
+                 Send_tag,
+                 Recv_tag,
+                 Tws_prot,
+                 Pickable,
+                 Unpickable,
+                 Query_intf,
+                 Submit_order,
+                 Execution_id,
+                 Query,
+                 Response_intf,
+                 Response,
+                 Symbol,
+                 Exchange,
+                 Currency,
+                 Price,
+                 Account_code,
+                 Raw_contract_intf,
+                 Raw_contract,
+                 Contract,
+                 Raw_order_intf,
+                 Raw_order,
+                 Order,
+                 Ib,
+                 Tws_reqs,
+                 Tws,
+                 Client_id,
+                 Client_intf,
+                 Std
+  BuildDepends:  core,
+                 async,
+                 sexplib.syntax,
+                 fieldslib.syntax,
+                 threads,
+                 str
+
+# Tests
+
+Executable test_runner
+  Path:             lib_test
+  MainIs:           test_runner.ml
+  BuildDepends:     ibx, core_extended
+  CompiledObject:   best
+
+Test test_runner
+  Run$:             flag(tests)
+  Command:          $test_runner
+  WorkingDirectory: lib_test
+
+# Documentation
+
+Document API
+  Title:                API reference for IBX
+  Type:                 Ocamlbuild (0.3)
+  Install:              true
+  InstallDir:           $docdir/api
+  BuildTools:           ocamldoc
+  XOCamlbuildPath:      .
+  XOCamlbuildLibraries: ibx
+# OASIS_START
+# DO NOT EDIT (digest: 12c8375971032f630d977a8af3e20d59)
+# Ignore VCS directories, you can use the same kind of rule outside 
+# OASIS_START/STOP if you want to exclude directories that contains 
+# useless stuff for the build process
+<**/.svn>: -traverse
+<**/.svn>: not_hygienic
+".bzr": -traverse
+".bzr": not_hygienic
+".hg": -traverse
+".hg": not_hygienic
+".git": -traverse
+".git": not_hygienic
+"_darcs": -traverse
+"_darcs": not_hygienic
+# Library ibx
+"lib/ibx.cmxs": use_ibx
+"lib/config.cmx": for-pack(Ibx)
+"lib/std_internal.cmx": for-pack(Ibx)
+"lib/send_tag.cmx": for-pack(Ibx)
+"lib/recv_tag.cmx": for-pack(Ibx)
+"lib/tws_prot.cmx": for-pack(Ibx)
+"lib/pickable.cmx": for-pack(Ibx)
+"lib/unpickable.cmx": for-pack(Ibx)
+"lib/query_intf.cmx": for-pack(Ibx)
+"lib/submit_order.cmx": for-pack(Ibx)
+"lib/execution_id.cmx": for-pack(Ibx)
+"lib/query.cmx": for-pack(Ibx)
+"lib/response_intf.cmx": for-pack(Ibx)
+"lib/response.cmx": for-pack(Ibx)
+"lib/symbol.cmx": for-pack(Ibx)
+"lib/exchange.cmx": for-pack(Ibx)
+"lib/currency.cmx": for-pack(Ibx)
+"lib/price.cmx": for-pack(Ibx)
+"lib/account_code.cmx": for-pack(Ibx)
+"lib/raw_contract_intf.cmx": for-pack(Ibx)
+"lib/raw_contract.cmx": for-pack(Ibx)
+"lib/contract.cmx": for-pack(Ibx)
+"lib/raw_order_intf.cmx": for-pack(Ibx)
+"lib/raw_order.cmx": for-pack(Ibx)
+"lib/order.cmx": for-pack(Ibx)
+"lib/ib.cmx": for-pack(Ibx)
+"lib/tws_reqs.cmx": for-pack(Ibx)
+"lib/tws.cmx": for-pack(Ibx)
+"lib/client_id.cmx": for-pack(Ibx)
+"lib/client_intf.cmx": for-pack(Ibx)
+"lib/std.cmx": for-pack(Ibx)
+<lib/*.ml{,i}>: pkg_core
+<lib/*.ml{,i}>: pkg_async
+<lib/*.ml{,i}>: pkg_sexplib.syntax
+<lib/*.ml{,i}>: pkg_fieldslib.syntax
+<lib/*.ml{,i}>: pkg_threads
+<lib/*.ml{,i}>: pkg_str
+# Executable test_runner
+<lib_test/test_runner.{native,byte}>: use_ibx
+<lib_test/test_runner.{native,byte}>: pkg_core_extended
+<lib_test/test_runner.{native,byte}>: pkg_core
+<lib_test/test_runner.{native,byte}>: pkg_async
+<lib_test/test_runner.{native,byte}>: pkg_sexplib.syntax
+<lib_test/test_runner.{native,byte}>: pkg_fieldslib.syntax
+<lib_test/test_runner.{native,byte}>: pkg_threads
+<lib_test/test_runner.{native,byte}>: pkg_str
+<lib_test/*.ml{,i}>: use_ibx
+<lib_test/*.ml{,i}>: pkg_core_extended
+<lib_test/*.ml{,i}>: pkg_core
+<lib_test/*.ml{,i}>: pkg_async
+<lib_test/*.ml{,i}>: pkg_sexplib.syntax
+<lib_test/*.ml{,i}>: pkg_fieldslib.syntax
+<lib_test/*.ml{,i}>: pkg_threads
+<lib_test/*.ml{,i}>: pkg_str
+# OASIS_STOP
+<lib/*.ml{,i}>: syntax_camlp4o
+<lib_test/*.ml{,i}>: syntax_camlp4o
+<examples/client/*.ml{,i}>: syntax_camlp4o
+<**/*.ml{,i}>: annot, warn_A, warn_e, warn_r
+#!/bin/sh
+
+# OASIS_START
+# DO NOT EDIT (digest: 425187ed8bfdbdd207fd76392dd243a7)
+set -e
+
+FST=true
+for i in "$@"; do 
+  if $FST; then
+    set --
+    FST=false
+  fi
+
+  case $i in
+    --*=*)
+      ARG=${i%%=*}
+      VAL=${i##*=}
+      set -- "$@" "$ARG" "$VAL"
+      ;;
+    *)
+      set -- "$@" "$i"
+      ;;
+  esac
+done
+
+ocaml setup.ml -configure "$@"
+# OASIS_STOP

File examples/buy_market_order.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let main ~enable_logging ~host ~port =
+  let aapl = Contract.stock
+    ~exchange:`BATS
+    ~currency:`USD
+    (Symbol.of_string "AAPL")
+  in
+  Tws.with_client ~enable_logging ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      Stream.iter (Tws.execution_reports tws) ~f:(fun exec_report ->
+        printf "%s\n\n%!"
+          (Sexp.to_string_hum (Execution_report.sexp_of_t exec_report)));
+      Stream.iter (Tws.commission_reports tws) ~f:(fun comm_report ->
+        printf "%s\n\n%!"
+          (Sexp.to_string_hum (Commission_report.sexp_of_t comm_report)));
+      let buy_market = Order.buy_market ~quantity:100 in
+      Tws.submit_order_exn tws
+        ~contract:aapl
+        ~order:buy_market
+      >>= fun (order_status, oid) ->
+      Pipe.iter_without_pushback order_status ~f:(fun status ->
+        printf "%s\n\n%!"
+          (Sexp.to_string_hum (Order_status.sexp_of_t status));
+        begin
+          match Order_status.state status with
+          | `Filled ->
+            after (sec 0.5) >>> (fun () -> Tws.cancel_order_status tws oid)
+          | _ -> ()
+        end))
+
+let main_cmd =
+  Command.async_basic ~summary:"submit market buy order for AAPL"
+    Command.Spec.(
+      empty
+      +> Common.logging_flag ()
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+    )
+    (fun enable_logging host port () ->
+      if enable_logging then Common.init_logger ();
+      main ~enable_logging ~host ~port
+    )
+
+let () = Command.run main_cmd

File examples/common.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let init_logger () =
+  let cwd = Core.Std.Unix.getcwd () in
+  let logfile = cwd ^/ "ibx.log" in
+  Log.Global.set_level `Debug;
+  Log.Global.set_output [Log.Output.file `Text ~filename:logfile]
+
+let logging_flag () =
+  Command.Spec.(
+    flag "-enable-logging" no_arg ~doc:" enable logging"
+  )
+
+let host_arg () =
+  Command.Spec.(
+    flag "-host" (optional_with_default "127.0.0.1" string)
+      ~doc:" hostname of TWS or Gateway (default localhost)"
+  )
+
+let port_arg () =
+  Command.Spec.(
+    flag "-port" (optional_with_default 4001 int)
+      ~doc:" TWS port 7946 or Gateway port 4001 (default 4001)"
+  )
+
+let duration_arg () =
+  Command.Spec.(
+    flag "-duration"
+      (optional_with_default (sec 30.) time_span)
+      ~doc:" duration of the data stream (default 30s)"
+  )
+
+module Currency = struct
+  let of_string x = Currency.t_of_sexp (Sexp.Atom x)
+  let arg_type = Command.Spec.Arg_type.create of_string
+end
+
+let currency_arg () =
+  Command.Spec.(
+    flag "-currency" (optional_with_default `USD Currency.arg_type)
+      ~doc:" contract's currency"
+  )

File examples/demultiplex.ml

+open Core.Std
+open Core_extended.Std
+open Async.Std
+open Ibx.Std
+
+let make_tick_printer id symbol ~color = stage (fun tick ->
+  Format.fprintf Format.str_formatter "@[<h 0>\\<%s\\>@ id=%s@ symbol=%s@ %a@]"
+    (Time.to_string (Time.now ()))
+    (Query_id.to_string id)
+    (Symbol.to_string symbol)
+    Market_data.pp tick;
+  Format.close_box ();
+  let unescape = unstage (String.Escaping.unescape ~escape_char:'\\') in
+  let output = unescape (Format.flush_str_formatter ()) in
+  if Console.is_color_tty () then
+    Console.Ansi.string_with_attr [`Bright; color] output
+  else output)
+
+let print_market_data ~enable_logging ~host ~port ~duration =
+  Tws.with_client ~enable_logging ~host ~port ~on_handler_error:`Raise (fun tws ->
+    let process_market_data symbol color =
+      Tws.market_data tws ~contract:(Contract.stock ~currency:`USD symbol)
+      >>| function
+      | Error e ->
+        prerr_endline (Error.to_string_hum e);
+        let pipe_r, pipe_w = Pipe.create () in
+        Pipe.close pipe_w;
+        pipe_r
+      | Ok (ticks, id) ->
+        upon (Clock.after duration) (fun () -> Tws.cancel_market_data tws id);
+        Pipe.map ticks ~f:(unstage (make_tick_printer id symbol ~color))
+    in
+    let symbols = ["AAPL"; "MSFT"; "GOOG"] in
+    let colors  = [`Red; `Green; `Blue] in
+    Deferred.all (List.map2_exn symbols colors ~f:(fun symbol color ->
+      process_market_data (Symbol.of_string symbol) color))
+    >>= fun pipes ->
+    Pipe.iter_without_pushback (Pipe.interleave pipes) ~f:print_endline)
+
+let print_market_data_cmd  =
+  Command.async_basic ~summary:" print market data"
+    Command.Spec.(
+      empty
+      +> Common.logging_flag ()
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+      +> Common.duration_arg ()
+    )
+    (fun enable_logging host port duration () ->
+      if enable_logging then Common.init_logger ();
+      Monitor.try_with (fun () ->
+        print_market_data ~enable_logging ~host ~port ~duration
+      ) >>| function
+      | Error exn ->
+        let err = Error.of_exn (Monitor.extract_exn exn) in
+        prerr_endline (Error.to_string_hum err);
+        shutdown 1
+      | Ok () -> ())
+
+let () = Command.run print_market_data_cmd

File examples/gnuplot.ml

+open Core.Std
+open Printf
+
+type t = out_channel
+
+let create () =
+  let t = Unix.open_process_out "gnuplot" in
+  output_string t "set term wxt enhanced persist\n";
+  t
+
+let close t = ignore (Unix.close_process_out t)
+let send t cmd = output_string t (sprintf "%s\n" cmd)
+
+let send_cols t cols =
+  let max_rows = List.fold_left (List.map cols ~f:Array.length) ~init:0 ~f:max in
+  for i = 0 to max_rows-1 do
+    List.iter cols ~f:(fun col ->
+      if i < Array.length col then fprintf t "%f " col.(i) else fprintf t "- ");
+    fprintf t "\n%!";
+  done;
+  fprintf t "e\n%!"
+
+let plot t data_opts =
+  let data, opts = List.unzip data_opts in
+  let cmd =
+    List.map opts ~f:(sprintf "'-' %s")
+    |! String.concat ~sep:","
+    |! sprintf "plot %s"
+  in
+  send t cmd;
+  List.iter data ~f:(fun cols -> send_cols t cols)

File examples/gnuplot.mli

+(** Simple interface to Gnuplot. Based on code from the Gp module of
+    Guillaume Hennequin <gje.hennequin@gmail.com>, which is available
+    {{:http://lcn.epfl.ch/~hennequi/software.html} online}  *)
+
+type t
+
+val create : unit -> t
+val close  : t -> unit
+
+val send : t -> string -> unit
+val plot : t -> (float array list * string) list -> unit

File examples/interactive_quotes.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let clear () =
+  In_thread.run (fun () ->
+    try Ok (Core_extended.Shell.run_full "clear" [])
+    with exn -> Error exn)
+
+let display host port duration currency symbol =
+  Tws.with_client ~host ~port ~on_handler_error:`Raise (fun tws ->
+    let symbol = Symbol.of_string symbol in
+    Tws.quotes_exn tws ~contract:(Contract.stock ~currency symbol)
+    >>= fun (quotes, id) ->
+    upon (Clock.after duration) (fun () -> Tws.cancel_quotes tws id);
+    clear () >>= fun clear_string ->
+    let clear_string =
+      match clear_string with
+      | Ok s -> s
+      | Error _ -> ""
+    in
+    Pipe.iter_without_pushback quotes ~f:(fun quote ->
+      let bid = Quote.bid_price quote in
+      let ask = Quote.ask_price quote in
+      printf "%s%4.2f-%4.2f\n%!" clear_string
+        (Price.to_float bid) (Price.to_float ask)))
+
+let display_cmd =
+  Command.async_basic ~summary:"displays quotes interactively"
+    Command.Spec.(
+      empty
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+      +> Common.duration_arg ()
+      +> Common.currency_arg ()
+      +> anon ("STOCK-SYMBOL" %: string)
+    )
+    (fun host port duration currency symbol () ->
+      Monitor.try_with (fun () -> display host port duration currency symbol)
+      >>| function
+      | Error exn ->
+        let err = Error.of_exn (Monitor.extract_exn exn) in
+        prerr_endline (Error.to_string_hum err);
+        shutdown 1
+      | Ok () -> ())
+
+let () = Command.run display_cmd

File examples/last_price.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let main ~enable_logging ~host ~port ~currency ~symbol =
+  Tws.with_client ~enable_logging ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      eprintf "[Error] Failed to retrieve last price for %s:\n%!" symbol;
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      let stock = Contract.stock ~currency (Symbol.of_string symbol) in
+      Tws.trade_snapshot_exn tws ~contract:stock
+      >>| fun snapshot ->
+      let last_price = Trade_snapshot.last_price snapshot in
+      printf "[Info] Last price for %s was %4.2f %s\n"
+        symbol (Price.to_float last_price) (Currency.to_string currency))
+
+let main_cmd =
+  Command.async_basic ~summary:"Retrieve last stock price"
+    Command.Spec.(
+      empty
+      +> Common.logging_flag ()
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+      +> Common.currency_arg ()
+      +> anon ("STOCK-SYMBOL" %: string)
+    )
+    (fun enable_logging host port currency symbol () ->
+      main ~enable_logging ~host ~port ~currency ~symbol
+    )
+
+let () = Command.run main_cmd

File examples/plot_hist_bars.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+module Filter = struct
+  let sma ~period =
+    if period <= 0 then
+      invalid_argf "Filter.sma: period must be positive: %d" period ();
+    let q = Queue.create () in
+    let sum = ref 0.0 in
+    stage (fun x_new ->
+      sum := !sum +. x_new;
+      Queue.enqueue q x_new;
+      if Queue.length q > period then begin
+        let x_last = Queue.dequeue_exn q in
+        sum := !sum -. x_last
+      end;
+      !sum /. float (Queue.length q))
+end
+
+let sma xs ~period = Array.map xs ~f:(unstage (Filter.sma ~period))
+let sma10 xs = sma ~period:10 xs
+let sma20 xs = sma ~period:20 xs
+let sma50 xs = sma ~period:50 xs
+
+let plot_hist_bars ~host ~port ~currency ~symbol =
+  Tws.with_client ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      Tws.historical_data_exn tws
+        ~contract:(Contract.stock ~currency (Symbol.of_string symbol))
+        ~bar_size:`Five_mins
+        ~duration:(`D 1)
+      >>| fun hist_data ->
+      let module Columns = Historical_data.Columns in
+      let hist_data = Historical_data.to_columns hist_data in
+      let num_bars  = Array.length (Columns.timestamps hist_data) in
+      let indices = Array.init num_bars ~f:Int.to_float in
+      let prices = Columns.close_prices hist_data in
+      let g = Gnuplot.create () in
+      Gnuplot.plot g [
+        [ indices;
+          Columns.open_prices  hist_data;
+          Columns.high_prices  hist_data;
+          Columns.low_prices   hist_data;
+          Columns.close_prices hist_data; ],
+        sprintf "with candlesticks title \"%s\"" symbol;
+        [ indices; sma10 prices; ], "w l lc rgb   \"blue\" title \"sma10\"";
+        [ indices; sma20 prices; ], "w l lc rgb  \"green\" title \"sma20\"";
+        [ indices; sma50 prices; ], "w l lc rgb \"yellow\" title \"sma50\"";
+      ];
+      Gnuplot.close g)
+
+let plot_hist_bars_cmd =
+  Command.async_basic ~summary:"plot historical bars"
+    Command.Spec.(
+      empty
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+      +> Common.currency_arg ()
+      +> anon ("STOCK-SYMBOL" %: string)
+    )
+    (fun host port currency symbol () ->
+      plot_hist_bars ~host ~port ~currency ~symbol
+    )
+
+let () = Command.run plot_hist_bars_cmd

File examples/plot_taq_data.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let verbose = ref true
+
+let plot_taq_data ~enable_logging ~host ~port ~duration ~currency ~symbol =
+  Tws.with_client ~enable_logging ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      let stock = Contract.stock ~currency (Symbol.of_string symbol) in
+      Tws.taq_data_exn tws ~contract:stock
+      >>= fun (taq_data, id) ->
+      upon (Clock.after duration) (fun () -> Tws.cancel_quotes tws id);
+      Pipe.fold taq_data ~init:([], [], [], [], [])
+        ~f:(fun (ttms, tpxs, qtms, asks, bids) taq_record ->
+          if !verbose then Format.printf "@[%a@]@\n%!" TAQ.pp taq_record;
+          match taq_record with
+          | TAQ.Trade trade ->
+            Trade.time  trade :: ttms,
+            Trade.price trade :: tpxs,
+            qtms, asks, bids
+          | TAQ.Quote quote ->
+            ttms, tpxs,
+            Quote.time      quote :: qtms,
+            Quote.ask_price quote :: asks,
+            Quote.bid_price quote :: bids)
+      >>| fun (ttms, tpxs, qtms, asks, bids) ->
+      let ttms = Array.of_list_rev (ttms : Time.t  list :> float list) in
+      let tpxs = Array.of_list_rev (tpxs : Price.t list :> float list) in
+      let qtms = Array.of_list_rev (qtms : Time.t  list :> float list) in
+      let asks = Array.of_list_rev (asks : Price.t list :> float list) in
+      let bids = Array.of_list_rev (bids : Price.t list :> float list) in
+      let g = Gnuplot.create () in
+      Gnuplot.send g (sprintf "set title \"%s\"" symbol);
+      Gnuplot.send g "unset xtics";
+      Gnuplot.plot g [
+        [ttms; tpxs], "with points lc rgb 'blue'  title \"trades\"";
+        [qtms; asks], "with steps  lc rgb 'red'   title \"ask\"";
+        [qtms; bids], "with steps  lc rgb 'green' title \"bid\"";
+      ];
+      Gnuplot.close g)
+
+let plot_taq_data_cmd =
+  Command.async_basic ~summary:"plot TAQ data"
+    Command.Spec.(
+      empty
+      +> Common.logging_flag ()
+      +> flag "-quiet" no_arg ~doc:" quiet mode"
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+      +> Common.duration_arg ()
+      +> Common.currency_arg ()
+      +> anon ("STOCK-SYMBOL" %: string)
+    )
+    (fun enable_logging quiet host port duration currency symbol () ->
+      if enable_logging then Common.init_logger ();
+      verbose := not quiet;
+      if Time.Span.(duration > minute) then begin
+        prerr_endline "Maximum duration is 1 minute";
+        exit 1;
+      end else
+        plot_taq_data ~enable_logging ~host ~port ~duration ~currency ~symbol
+    )
+
+let () = Command.run plot_taq_data_cmd

File examples/quote_table.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+module Ascii_table = Core_extended.Ascii_table
+
+let symbols = ["AAPL";"AMZN";"CSCO";"FB";"GOOG";"IBM";"MSFT";"ORCL";"SAP";"YHOO"]
+
+let print_quote_table quotes =
+  let module Q = Quote_snapshot in
+  let get_symbol    quote = sprintf "%s"    (Q.symbol quote |! Symbol.to_string) in
+  let get_bid_size  quote = sprintf "%d"    (Q.bid_size  quote) in
+  let get_bid_price quote = sprintf "%4.2f" (Q.bid_price quote |! Price.to_float) in
+  let get_ask_size  quote = sprintf "%d"    (Q.ask_size  quote) in
+  let get_ask_price quote = sprintf "%4.2f" (Q.ask_price quote |! Price.to_float) in
+  let create_col ?(align=Ascii_table.Align.right) =
+    Ascii_table.Column.create ~align
+  in
+  Ascii_table.output ~oc:stdout [
+    create_col "Symbol"    get_symbol ~align:Ascii_table.Align.left;
+    create_col "Bid size"  get_bid_size;
+    create_col "Bid price" get_bid_price;
+    create_col "Ask size"  get_ask_size;
+    create_col "Ask price" get_ask_price;
+  ] quotes
+
+let main ~enable_logging ~host ~port =
+  Tws.with_client ~enable_logging ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      Deferred.all (List.map symbols ~f:(fun symbol ->
+        let stock = Contract.stock
+          ~exchange:`SMART
+          ~currency:`USD
+          (Symbol.of_string symbol)
+        in
+        Tws.quote_snapshot_exn tws ~contract:stock))
+      >>| fun quotes -> print_quote_table quotes)
+
+let main_cmd =
+  Command.async_basic ~summary:" print market data"
+    Command.Spec.(
+      empty
+      +> Common.logging_flag ()
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+    )
+    (fun enable_logging host port () ->
+      if enable_logging then Common.init_logger ();
+      main ~enable_logging ~host ~port
+    )
+
+let () = Command.run main_cmd

File examples/server_time.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let print_server_time ~port ~host =
+  Tws.with_client ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      Tws.server_time_exn tws
+      >>| fun time ->
+      print_endline (Time.to_string_trimmed time))
+
+let server_time_cmd =
+  Command.async_basic ~summary:"print server time"
+    Command.Spec.(
+      empty
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+    )
+    (fun host port () -> print_server_time ~host ~port)
+
+let () = Command.run server_time_cmd

File examples/show_contract_specs.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+let contracts : Contract.Type.t Contract.t list = [
+  Contract.stock ~currency:`USD (Symbol.of_string "AAPL");
+  Contract.stock ~currency:`EUR (Symbol.of_string "BMW");
+
+  (* For current contracts check:
+     http://www.cmegroup.com/trading/equity-index/us-index/
+     e-mini-sandp500_product_calendar_futures.html
+  *)
+  Contract.futures
+    ~exchange:`GLOBEX
+    ~currency:`USD
+    ~expiry:(Date.create_exn ~y:2013 ~m:Month.Jun ~d:21)
+    (Symbol.of_string "ES");
+
+  (* For current contracts check: http://finance.yahoo.com/q/op?s=GOOG *)
+  Contract.option
+    ~exchange:`CBOE
+    ~currency:`USD
+    ~option_right:`Call
+    ~expiry:(Date.create_exn ~y:2013 ~m:Month.Jun ~d:21)
+    ~strike:(Price.of_float 850.)
+    (Symbol.of_string "GOOG");
+
+  Contract.forex
+    ~exchange:`IDEALPRO
+    ~currency:`JPY
+    (Symbol.of_string "USD");
+]
+
+let main_cmd =
+  Command.async_basic ~summary:"show contract specifications"
+    Command.Spec.(
+      empty
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+    )
+    (fun host port () ->
+      Tws.with_client ~host ~port
+        ~on_handler_error:(`Call (fun e ->
+          prerr_endline (Error.to_string_hum e);
+          shutdown 1))
+        (fun tws ->
+          Deferred.List.iter contracts ~f:(fun contract ->
+            Tws.contract_specs_exn tws ~contract
+            >>| fun con_specs ->
+            printf "===== [ %s ] =====\n%!"
+              (Contract.symbol contract |! Symbol.to_string);
+            printf "%s\n\n%!"
+              (Contract_specs.sexp_of_t con_specs |! Sexp.to_string_hum)))
+    )
+
+let () = Command.run main_cmd

File examples/submit_orders.ml

+open Core.Std
+open Async.Std
+open Ibx.Std
+
+(* NOTE: Before running this program multiple times under the same
+   TWS session, please deactivate the checkbox 'Download open orders on
+   connection'. In the IB Gateway this checkbox can be found under
+   Configure -> Settings -> API Settings.
+   Currently IBX cannot handle these open orders messages on connection.
+   However, this will be solved in later versions of the library. *)
+
+
+let submit_and_wait_for_fill tws ~timeout ~contract ~order =
+  let order_type = Order.Type.to_string (Order.order_type order) in
+  printf "Submit %s buy order for %d shares of %s\n%!"
+    order_type
+    (Order.quantity order)
+    (Contract.symbol contract |! Symbol.to_string);
+  Tws.submit_order_exn tws ~contract ~order
+  >>= fun (order_status, oid) ->
+  let wait_for_fill =
+    Pipe.iter_without_pushback order_status ~f:(fun status ->
+      begin
+        match Order_status.state status with
+        | `Filled ->
+          printf "%s buy order filled at %4.2f\n%!" order_type
+            (Price.to_float (Order_status.last_fill_price status));
+          Tws.cancel_order_status tws oid
+        | _ -> ()
+      end)
+  in
+  Clock.with_timeout timeout wait_for_fill >>| function
+  | `Timeout ->
+    printf "Timed out while waiting for fill of %s buy order\n%!" order_type;
+    Tws.cancel_order_status tws oid
+  | `Result () -> ()
+
+let main ~enable_logging ~host ~port ~timeout =
+  let symbol = Symbol.of_string "IBM" in
+  let ibm = Contract.stock ~exchange:`BATS ~currency:`USD symbol in
+  let num_shares = 100 in
+  Tws.with_client ~enable_logging ~host ~port
+    ~on_handler_error:(`Call (fun e ->
+      prerr_endline (Error.to_string_hum e);
+      shutdown 1))
+    (fun tws ->
+      Tws.quote_snapshot_exn tws ~contract:ibm
+      >>= fun snapshot ->
+      let ask_price = Quote_snapshot.ask_price snapshot in
+      printf "Last ask price %4.2f\n%!" (Price.to_float ask_price);
+      let buy_mkt = Order.buy_market ~quantity:num_shares in
+      let buy_lmt = Order.buy_limit  ~quantity:num_shares ask_price in
+      Deferred.all_unit [
+        submit_and_wait_for_fill tws ~timeout ~contract:ibm ~order:buy_mkt;
+        submit_and_wait_for_fill tws ~timeout ~contract:ibm ~order:buy_lmt;
+      ] >>= fun () ->
+      Tws.filter_executions_exn tws ~contract:ibm ~order_action:`Buy
+      >>= fun exec_reports ->
+      Pipe.iter_without_pushback exec_reports ~f:(fun exec_report ->
+        printf "Execution: \
+          exec_id=%s time=%s exchange=%s side=%s shares=%d price=%4.2f\n%!"
+          (Execution_report.exec_id exec_report |! Execution_id.to_string)
+          (Execution_report.time exec_report |! Time.to_string_trimmed)
+          (Execution_report.exchange exec_report |! Exchange.to_string)
+          (match Execution_report.side exec_report with
+          | `Purchase -> "purchase" | `Sale -> "sale")
+          (Execution_report.quantity exec_report)
+          (Execution_report.price exec_report |! Price.to_float))
+    )
+
+let timeout_arg () =
+  Command.Spec.(
+    flag "-timeout"
+      (optional_with_default (sec 5.) time_span)
+      ~doc:" timeout on fill (default 5s)"
+  )
+
+let main_cmd =
+  Command.async_basic ~summary:"submit market buy order"
+    Command.Spec.(
+      empty
+      +> Common.logging_flag ()
+      +> Common.host_arg ()
+      +> Common.port_arg ()
+      +> timeout_arg ()
+    )
+    (fun enable_logging host port timeout () ->
+      if enable_logging then Common.init_logger ();
+      main ~enable_logging ~host ~port ~timeout
+    )
+
+let () = Command.run main_cmd
+# OASIS_START
+# DO NOT EDIT (digest: cf08ee647baa3e881a1ee3a5cbe26ef4)
+version = "0.5.0"
+description =
+"IBX - Pure OCaml implementation of the Interactive Brokers TWS API"
+requires = "core async sexplib.syntax fieldslib.syntax threads str"
+archive(byte) = "ibx.cma"
+archive(byte, plugin) = "ibx.cma"
+archive(native) = "ibx.cmxa"
+archive(native, plugin) = "ibx.cmxs"
+exists_if = "ibx.cma"
+# OASIS_STOP
+

File lib/account_code.ml

+(* File: account_code.ml
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+open Core.Std
+open Tws_prot
+
+include String
+
+let val_type = Val_type.create to_string of_string
+
+let unpickler =
+  Unpickler.create ~name:"Account_code"
+    Unpickler.Spec.(value (required val_type) ~name:"account_code")
+    Fn.id

File lib/account_code.mli

+(* File: account_code.mli
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+open Core.Std
+open Tws_prot
+
+type t = private string
+include Identifiable.S with type t := t
+include Unpickable.S with type t := t
+
+val val_type : t Val_type.t

File lib/client_id.ml

+(* File: client_id.ml
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+open Core.Std
+open Tws_prot
+
+include Unique_id.Int63 (struct end)
+let val_type = Val_type.create to_string of_string

File lib/client_id.mli

+(* File: client_id.mli
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+open Core.Std
+open Tws_prot
+
+type t
+include Unique_id.Id with type t := t
+val val_type : t Val_type.t

File lib/client_intf.ml

+(* File: client_intf.ml
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+(** A signature for customized TWS clients *)
+
+open Core.Std
+open Async.Std
+open Response
+
+module type S = sig
+  module Query_id : Unique_id
+
+  type t
+
+  (** [with_client ~host ~on_handler_error handler] connects by default
+      to the IB Gateway (running on [host] under port 4001) and runs the
+      [handler] until an exception is thrown or until the returned Deferred
+      is determined.
+
+      [on_handler_error] determines what happens if the [handler] throws an
+      exception.
+
+      In order to connect to TWS, you need to supply 7496 as port number.
+  *)
+  val with_client
+    :  ?enable_logging:bool
+    -> ?client_id:Client_id.t
+    -> ?port:int
+    -> host:string
+    -> on_handler_error:[
+    | `Raise
+    | `Ignore
+    | `Call of (Error.t -> unit)
+    ]
+    -> (t -> unit Deferred.t)
+    -> unit Deferred.t
+
+  val is_connected : t -> bool
+
+  (* [state t] returns the state of the connection. *)
+  val state : t -> [ `Disconnected | `Connecting | `Connected ]
+
+  (** [set_server_log_level level] sets the log entry detail [level] of TWS
+      when processing API requests. *)
+  val set_server_log_level
+    :  t
+    -> level:[
+    | `System
+    | `Error
+    | `Warning
+    | `Information
+    | `Detail
+    ]
+    -> unit
+
+  val execution_reports : t -> Execution_report.t Stream.t
+
+  val commission_reports : t -> Commission_report.t Stream.t
+
+  val client_id : t -> Client_id.t
+
+  val server_version : t -> int option
+
+  val connection_time : t -> Time.t option
+
+  val account_code : t -> Account_code.t option
+
+end

File lib/config.ml

+(* File: config.ml
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+let client_version = 57
+let server_version = 67

File lib/contract.ml

+(* File: contract.ml
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+open Core.Std
+
+include struct
+  open Raw_contract
+  module Id   = Id
+  module Type = Type
+end
+
+type 'a t = Raw_contract.t constraint 'a = [< Type.t] with sexp
+
+let to_raw = Fn.id
+let of_raw = Fn.id
+
+let ( = ) t1 t2 = Raw_contract.(=) (to_raw t1) (to_raw t2)
+
+let id t = t.Raw_contract.contract_id
+let symbol t = t.Raw_contract.symbol
+let exchange t = t.Raw_contract.exchange
+let listing_exchange t = t.Raw_contract.listing_exchange
+let currency t = t.Raw_contract.currency
+let local_symbol t = t.Raw_contract.local_symbol
+
+let security_id t =
+  Option.map t.Raw_contract.security_id_type ~f:(function
+    | `ISIN  -> `ISIN  (Option.value_exn t.Raw_contract.security_id)
+    | `CUSIP -> `CUSIP (Option.value_exn t.Raw_contract.security_id)
+    | `SEDOL -> `SEDOL (Option.value_exn t.Raw_contract.security_id)
+    | `RIC   -> `RIC   (Option.value_exn t.Raw_contract.security_id))
+
+let option_right t = Option.value_exn t.Raw_contract.option_right
+let strike t = Option.value_exn t.Raw_contract.strike
+let expiry t = Option.value_exn t.Raw_contract.expiry
+let multiplier t = Option.value_exn t.Raw_contract.multiplier
+let include_expired t = t.Raw_contract.include_expired
+let combo_legs t = t.Raw_contract.combo_legs
+
+let split_security_id = function
+  | None -> None, None
+  | Some sec_id ->
+    match sec_id with
+    | `ISIN  x -> (Some `ISIN , Some x)
+    | `RIC   x -> (Some `RIC  , Some x)
+    | `CUSIP x -> (Some `CUSIP, Some x)
+    | `SEDOL x -> (Some `SEDOL, Some x)
+
+let stock ?id ?listing_exchange ?local_symbol ?security_id
+    ?exchange ~currency symbol =
+  let security_id_type, security_id = split_security_id security_id in
+  of_raw (
+    Raw_contract.create
+      ?id
+      ?listing_exchange
+      ?local_symbol
+      ?security_id_type
+      ?security_id
+      ?exchange
+      ~currency
+      ~contract_type:"STK"
+      symbol
+  )
+
+let futures ?id ?multiplier ?listing_exchange ?local_symbol ?security_id
+    ?include_expired ?exchange ~currency ~expiry symbol =
+  let security_id_type, security_id = split_security_id security_id in
+  of_raw (
+    Raw_contract.create
+      ?id
+      ?multiplier
+      ?listing_exchange
+      ?local_symbol
+      ?security_id_type
+      ?security_id
+      ?include_expired
+      ?exchange
+      ~currency
+      ~contract_type:"FUT"
+      ~expiry
+      symbol
+  )
+
+let option ?id ?multiplier ?listing_exchange ?local_symbol ?security_id
+    ?exchange ~currency ~option_right ~expiry ~strike symbol =
+  let security_id_type, security_id = split_security_id security_id in
+  of_raw (
+    Raw_contract.create
+      ?id
+      ?multiplier
+      ?listing_exchange
+      ?local_symbol
+      ?security_id_type
+      ?security_id
+      ?exchange
+      ~currency
+      ~contract_type:"OPT"
+      ~expiry
+      ~strike
+      ~option_right
+      symbol
+  )
+
+let forex ?id ?listing_exchange ?local_symbol ?security_id
+    ?(exchange=`IDEALPRO) ~currency symbol =
+  let security_id_type, security_id = split_security_id security_id in
+  of_raw (
+    Raw_contract.create
+      ?id
+      ?listing_exchange
+      ?local_symbol
+      ?security_id_type
+      ?security_id
+      ~exchange
+      ~currency
+      ~contract_type:"CASH"
+      symbol
+  )

File lib/contract.mli

+(* File: contract.mli
+
+   IBX - Pure OCaml implementation of the Interactive Brokers TWS API
+
+   Copyright (C) 2013-  Oliver Gu
+   email: gu.oliver@yahoo.com
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*)
+
+open Core.Std
+
+module Id : sig
+  type t = Raw_contract.Id.t with sexp
+  include Unique_id.Id with type t := t
+end
+
+module Type : sig
+  type t = [ `Stock | `Futures | `Option | `Forex ] with sexp
+end
+
+type 'a t
+constraint 'a = [< Type.t ] with sexp
+
+include Raw_contract_intf.S
+  with type raw := Raw_contract.t
+  with type 'a t := 'a t
+
+val id           : 'a t -> Id.t option
+val symbol       : 'a t -> Symbol.t
+val exchange     : 'a t -> Exchange.t
+val listing_exchange : 'a t -> Exchange.t option
+val currency     : 'a t -> Currency.t
+val local_symbol : 'a t -> Symbol.t option
+val security_id  : 'a t -> [ `ISIN  of string
+                           | `RIC   of string
+                           | `CUSIP of string
+                           | `SEDOL of string ] option
+
+val strike       : [ `Option ] t -> Price.t
+val option_right : [ `Option ] t -> [ `Call | `Put ]
+val expiry       : [ `Option | `Futures ] t -> Date.t
+val multiplier   : [ `Option | `Futures ] t -> string