Interactive Brokers API addon for Node.js
descriptionInteractive Brokers API addon for Node.js
owners dchem
last changeMonday, September 16, 2019 07:26 +0000
size1.5 MB
stats274 commits and 0 tags in 6 years, 2 months metrics
repository url
URL
https://gitlord.com/r/~dchem/node-ibapi-addon.git
R
Git
GitHub
2019-09-16 dchem
Fix gyp binding for Windows
4c43ee diff | tree
2019-09-16 dchem
Merged #21 "Installation fails"
931bd8 diff | tree
2019-09-16 dchem
Fix build errors on Windows
4d2692 diff | tree
2019-07-02 dchem
Merged #20 "Installation fails"
888a7b diff | tree
2019-07-02 Jae Yang
Fix build error on nodejs 10.16.0
edff13 diff | tree
2018-08-01 dchem
Update readme
07c548 diff | tree
2018-08-01 dchem
Merged #19 "CVE-2016-10593 - Insecure code download"
ead269 diff | tree
2018-08-01 dchem
Fix preinstall script to use https
c00dd7 diff | tree
2017-10-21 dchem
Release 2.5.5
756ad5 diff | tree
2017-10-21 dchem
Merged #17 "Installation fails on OS X"
e2bf2a diff | tree
2017-10-21 dchem
Fix OS X installation
fb1eda diff | tree
2017-06-15 dchem
Release 2.5.4
674ffd diff | tree
2017-06-15 dchem
Merged #16 "jsonifyExecution does not convert modelCode"
479569 diff | tree
2017-06-15 dchem
Add modelCode to jsonifyExecution
6a173d diff | tree
2017-06-15 dchem
Fix missing jsonifier entry in tickEFP
b300d8 diff | tree
2017-06-15 dchem
Merged #15 "Change expiry to LastTradingDay"
4c2727 diff | tree
more commits...
2019-09-16 develop dchem Fix gyp binding for Windows log | tree | raw
2019-09-16 ticket/21 dchem Fix build errors on Windows log | tree | raw
2019-07-02 ticket/20 Jae Yang Fix build error on nodejs 10.16.0 log | tree | raw
2018-08-01 master dchem Merge branch 'develop' log | tree | raw
2018-08-01 ticket/19 dchem Fix preinstall script to use https log | tree | raw
all branches...
README.md

node-ibapi-addon

Interactive Brokers API addon for Node.js compatible with IB API 9.72

This addon uses the latest stable Interactive Brokers POSIX C++ API.

Author: Jae Yang - dchem

Important

Note:

The inbound messages' are in the order it was received. Also, the outbound
messages are rate limited to 50 msg/sec as IB requires it.
Default behavior is that if your outbound rate is greater than that the
51st message will be handled in the next second.

If you would like to see the jsdoc of this project, just run it on ibapi.js
file.

WARNING:

  • Server messageId has changed from svrError to error

Change Notes:

  • YYYY-MM-DD - SEMVER - Notes
  • 2019-09-19 - 2.6.2 - Fix build error in nodejs 10.16.0 LTS for Windows
  • 2019-07-01 - 2.6.0 - Fix build error in nodejs 10.16.0 LTS
  • 2018-08-01 - 2.5.6 - Fix CVE-2016-10593
  • 2017-10-21 - 2.5.5 - Fix OS X installation
  • 2017-06-14 - 2.5.4 - Supports API 9.72
  • 2015-11-21 - 2.4.0 - Fixes server error message handling
  • 2015-06-27 - 2.3.3 - Fixes build (removes sourceforge)
  • 2015-06-09 - 2.3.1 - Swapped over to SEMVER, older download should
    use OldVer.
  • 2015-03-01 - 2.3.0 - Node 0.12 & io.js 1.4.2 build compatible.
    Code cleanup and updated examples.
  • 2015-01-07 - 2.2.0 - More CPU efficient
  • 2014-12-29 - 2.1.0 - Uses event handlers instead of event emitters
  • 2014-11-12 - 1.23.0 - Includes lib into the package itself
  • 2014-09-10 - 1.21.0 - Supports API 9.71
  • 2014-09-09 - 1.19.0 - Adds order.js and placeOrder can use order obj
  • 2014-04-22 - 1.17.0 - Compatibility fix for API 9.70
  • 2014-03-17 - 1.13.0 - Smoother installation to multiple OSes
  • 2014-01-17 - 1.0.0 - all EWrapper events bound in ibapi.js
  • 2013-09-02 - 0.0.0 - Initial commit

Linux Installation:

  • Install Python 2.7
  • Install unzip
    sudo apt-get install unzip
  • npm install ibapi

Windows Installation

First step in Windows:

  • Install Microsoft Windows Build Tools, open windows commandline:
    npm install --global --production windows-build-tools

Install in Windows with POSIX library:

  • Install MinGW and MSYS
  • Install GCC library using MSYS
  • Install msys-unzip instead of unzip from mingw-msys
    mingw-get install msys-unzip
  • npm install ibapi

Install in Windows with Windows library:

Additional Windows trickery:

IMPORTANT: You do not need to do the following if installing windows-build-tools succeeded

For Windows with MSVS 2017:
npm install ibapi --msvs_version=2017

Alternatively, include GYP_MSVS_VERSION=2017 in environment variables for Windows.

OS X

  • Install xcode command line tools
  • Install homebrew
  • npm install ibapi

Installation from git repo:

  1. Install Python 2.7
  2. Make sure to have node-gyp installed node install -g node-gyp
  3. Run the preinstall.sh which does the following:
  • Download the latest stable IB API into /import
  • Copy the contents of IB API package's
    IBJts/source/CppClient/Shared into /import directory
  • Copy the contents of IB API package's
    IBJts/source/CppClient/src into /import directory
  • Add #define IB_USE_STD_STRING into the following files in /import directory:
    EClientSocketBase.cpp
    EPosixClientSocket.cpp
  • Downloads libjson 7.6.1
  1. node-gyp rebuild
  2. If build fails because you have VS2012, use node-gyp --msvs_version=2012 rebuild

Usage

  1. Set either IB Gateway or IB TWS to accept socket clients
  2. Require ibapi
  3. Create event handlers
  4. Register event handlers for messageIds
  5. Invoke connect()
  6. ...
  7. Profit!
// This file shows you one example of a barebones program that handles
//  server error messages.

// Required package name is 'ibapi' If you use your own project path,
//  just use require('ibapi') from your project root as you would 
//  normally do.
var addon = require('../ibapi'),
  messageIds = addon.messageIds,
  contract = addon.contract,
  order = addon.order;

// The api object handles the client methods. For details, refer to 
//  IB API documentation.
var api = new addon.NodeIbapi();

// Interactive Broker requires that you use orderId for every new order
//  inputted. The orderId is incremented everytime you submit an order.
//  Make sure you keep track of this.
var orderId = -1;

// Here we specify the event handlers.
//  Please follow this guideline for event handlers:
//  1. Add handlers to listen to messages
//  2. Each handler must have be a function (message) signature
var handleValidOrderId = function (message) {
  orderId = message.orderId;
  console.log('next order Id is ' + orderId);
};

var handleServerError = function (message) {
  console.log('Error: ' + message.id.toString() + '-' +
              message.errorCode.toString() + '-' +
              message.errorString.toString());
};

var handleClientError = function (message) {
  console.log('clientError');
  console.log(JSON.stringify(message));
};

var handleDisconnected = function (message) {
  console.log('disconnected');
  process.exit(1);
};

// After that, you must register the event handler with a messageId
//  For list of valid messageIds, see messageIds.js file.
api.handlers[messageIds.nextValidId] = handleValidOrderId;
api.handlers[messageIds.error] = handleServerError;
api.handlers[messageIds.clientError] = handleClientError;
api.handlers[messageIds.disconnected] = handleDisconnected;

// Connect to the TWS client or IB Gateway
var connected = api.connect('127.0.0.1', 7496, 0, false);

// Once connected, start processing incoming and outgoing messages
if (connected) {
  api.beginProcessing();
}

Included libraries

These are used as state stores and abstraction for IB API. You also have to
pass instance of the object, such as 'order' to some of the client request
functions.

Each of theese come with a constructor:
* order
* contract
* execution
* scannerSubscription
* contractDetails

Addon methods

  • beginProcessing(): Entry point - starts the message processing.
  • doAction(action): An action, custom function or API requests, can be
    bound to each events
  • placeSimpleOrder(): Simpler order input method.

IB API Client Methods

handler. This does not need to be called explicitly by the user

### IB API Client Requests
Following commands are used for requesting specific action through IB API:

.connect(host,port,clientId)
.disconnect()
.isConnected()
.serverVersion() // returns right away
.twsConnectionTime() // returns right away
.reqMktData(reqId, contract, genericTickType, snapShot)
.cancelMktData(reqId)
// placeOrder can take either
.placeOrder(orderId, contrct, order)
// or
.placeOrder(orderId, contract, action, quantity, orderType, price, auxPrice)
.cancelOrder(orderId)
.reqOpenOrders()
.reqAccountUpdates(subscribe, acctCode)
.reqExecutions(reqId, clientId, acctCode, time, symbol, secType, exchange, side)
.reqIds(num) // only accepts 1 for the time being (9.71)
.reqContractDetails(reqId, contract)
.reqMktDepth(tickerId, contract, numRows )
.cancelMktDepth(tickerId)
.reqNewsBulletins(allMsgs)
.cancelNewsBulletins()
.setServerLogLevel(level)
.reqAutoOpenOrders(bAutoBind)
.reqAllOpenOrders()
.reqManagedAccts()
.requestFA( ) // not yet implemented
.replaceFA( ) // not yet implemented
.reqHistoricalData(id, contract, endDateTime, durationStr, barSizeSetting, whatToShow, useRTH, formatDate)
.exerciseOptions(tickerId, contract, exerciseAction, exerciseQuantity, account, override )
.cancelHistoricalData(tickerId)
.reqRealtimeBars(tickerId, contract, barSize, whatToShow, useRTH)
.cancelRealTimeBars(tickerId)
.cancelScannerSubscription(tickerId)
.reqScannerParameters()
.reqScannerSubscription(tickerId, subscription)
.reqCurrentTime() // not implemented
.reqFundamentalData( reqId, contract, reportType )
.cancelFundamentalData(reqId)
.calculateImpliedVolatility( reqId, contract, optionPrice, underPrice )
.calculateOptionPrice( reqId, contract, volatility, underPrice )
.cancelCalculateImpliedVolatility(reqId)
.cancelCalculateOptionPrice(reqId)
.reqGlobalCancel()
.reqMarketDataType(marketDataType)
.reqPositions()
.cancelPositions()
.reqAccountSummary( reqId, groupName, tags )
.cancelAccountSummary(reqId)
.verifyRequest( apiName, apiVersion )
.verifyMessage( apiData )
.queryDisplayGroups( reqId )
.subscribeToGroupEvents( reqId, groupId )
.updateDisplayGroup( reqId, contractInfo )
.unsubscribeFromGroupEvents( reqId )
.reqPositionsMulti(reqId, account, modelCode)
.cancelPositionsMulti(reqId)
.reqAccountUpdatesMulti(reqId, account, modelCode, ledgerAndNLV)
.cancelAccountUpdatesMulti(reqId)
.reqSecDefOptParams(reqId, underlyingSymbol, futFopExchange, underlyingSecType, underlyingConId)
.reqSoftDollarTiers(reqId)
```

EWrapper Events

See messageIds.js
tickPrice tickSize tickOptionComputation tickGeneric tickString tickEFP orderStatus openOrder openOrderEnd clientError connectionClosed updateAccountValue updatePortfolio updateAccountTime accountDownloadEnd nextValidId contractDetails bondContractDetails contractDetailsEnd execDetails execDetailsEnd error updateMktDepth updateMktDepthL2 updateNewsBulletin managedAccounts receiveFA historicalData scannerParameters scannerData scannerDataEnd realtimeBar fundamentalData deltaNeutralValidation tickSnapshotEnd marketDataType commissionReport position positionEnd accountSummary accountSummaryEnd verifyMessageAPI verifyCompleted displayGroupList displayGroupUpdated nextValidId disconnected positionMulti positionMultiEnd accountUpdateMulti accountUpdateMultiEnd securityDefinitionOptionalParameter securityDefinitionOptionalParameterEnd softDollarTiers

Tests:

Uses mocha, so install it.

Issues:

License

Copyright (c) 2019 Jae Yang. See LICENSE file for license rights and limitations (MIT).

Why no github?

Because they are terrible.