ib-client
Version:
Interactive Brokers API client library for Node.js
1,380 lines (1,196 loc) • 64.2 kB
JavaScript
"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports["default"] = void 0;var _lodash = require("lodash");
var _constants = require("./constants");
var _BufferParser = _interopRequireDefault(require("./BufferParser"));function _interopRequireDefault(obj) {return obj && obj.__esModule ? obj : { "default": obj };}function _classCallCheck(instance, Constructor) {if (!(instance instanceof Constructor)) {throw new TypeError("Cannot call a class as a function");}}function _defineProperties(target, props) {for (var i = 0; i < props.length; i++) {var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);}}function _createClass(Constructor, protoProps, staticProps) {if (protoProps) _defineProperties(Constructor.prototype, protoProps);if (staticProps) _defineProperties(Constructor, staticProps);return Constructor;}var
MessageDecoder = /*#__PURE__*/function () {
function MessageDecoder() {_classCallCheck(this, MessageDecoder);
this._serverVersion = _constants.SERVER_VERSION;
}_createClass(MessageDecoder, [{ key: "setServerVersion", value: function setServerVersion(
version) {
this._serverVersion = version;
} }, { key: "decodeMessage", value: function decodeMessage(
data) {var _this = this;
var buffer = new _BufferParser["default"](data);
return buffer.process(function (err, methodName) {
if (err) throw err;
if (methodName && typeof _this['_' + methodName] === 'function')
return _this['_' + methodName](buffer);else
throw new Error('Unknown broker API response: ' + methodName);
});
} }, { key: "decodeServerVersion", value: function decodeServerVersion(
data) {
var buffer = new _BufferParser["default"](data);
buffer.readLengthHeader();
var serverVersion = buffer.readInt();
var connectionTime = buffer.readString();
return { serverVersion: serverVersion, connectionTime: connectionTime };
} }, { key: "_HISTORICAL_TICKS_LAST", value: function _HISTORICAL_TICKS_LAST(
buffer) {
var reqId = buffer.readInt();
var tickCount = buffer.readInt();
var ticks = [];
for (var i = 0; i < tickCount; i++) {
var time = buffer.readString();
var mask = buffer.readInt();
var tickAttribLast = {};
tickAttribLast.pastLimit = (mask & 1 << 0) !== 0;
tickAttribLast.unreported = (mask & 1 << 1) !== 0;
var price = buffer.readFloat();
var size = buffer.readInt();
var exchange = buffer.readString();
var specialConditions = buffer.readString();
ticks.push({ time: time, tickAttribLast: tickAttribLast, price: price, size: size, exchange: exchange, specialConditions: specialConditions });
}
var done = buffer.readBool();
return { message: 'historicalTicksLast', params: [reqId, ticks, done] };
} }, { key: "_HISTORICAL_TICKS_BID_ASK", value: function _HISTORICAL_TICKS_BID_ASK(
buffer) {
var reqId = buffer.readInt();
var tickCount = buffer.readInt();
var ticks = [];
for (var i = 0; i < tickCount; i++) {
var time = buffer.readString();
var mask = buffer.readInt();
var tickAttribBidAsk = {};
tickAttribBidAsk.askPastHigh = (mask & 1 << 0) !== 0;
tickAttribBidAsk.bidPastLow = (mask & 1 << 1) !== 0;
var priceBid = buffer.readFloat();
var priceAsk = buffer.readFloat();
var sizeBid = buffer.readInt();
var sizeAsk = buffer.readInt();
ticks.push({ time: time, tickAttribBidAsk: tickAttribBidAsk, priceBid: priceBid, priceAsk: priceAsk, sizeBid: sizeBid, sizeAsk: sizeAsk });
}
var done = buffer.readBool();
return { message: 'historicalTicksBidAsk', params: [reqId, ticks, done] };
} }, { key: "_HISTORICAL_TICKS", value: function _HISTORICAL_TICKS(
buffer) {
var reqId = buffer.readInt(),
tickCount = buffer.readInt();
var ticks = [];
for (var i = 0; i < tickCount; i++) {
var time = buffer.readString();
buffer.readInt(); //for consistency
var price = buffer.readFloat();
var size = buffer.readInt();
ticks.push({ time: time, price: price, size: size });
}
var done = buffer.readBool();
return { message: 'historicalTicks', params: [reqId, ticks, done] };
} }, { key: "_MARKET_RULE", value: function _MARKET_RULE(
buffer) {
var marketRuleId = buffer.readInt();
var priceIncrements = [];
var nPriceIncrements = buffer.readInt();
if (nPriceIncrements > 0) {
for (var i = 0; i < nPriceIncrements; i++) {
priceIncrements.push({
lowEdge: buffer.readFloat(),
increment: buffer.readFloat() });
}
} else {
priceIncrements = new PriceIncrement[0]();
}
return { message: 'marketRule', params: [marketRuleId, priceIncrements] };
} }, { key: "_REROUTE_MKT_DEPTH_REQ", value: function _REROUTE_MKT_DEPTH_REQ(
buffer) {
var reqId = buffer.readInt();
var conId = buffer.readInt();
var exchange = buffer.readString();
return { message: 'rerouteMktDepthReq', params: [reqId, conId, exchange] };
} }, { key: "_REROUTE_MKT_DATA_REQ", value: function _REROUTE_MKT_DATA_REQ(
buffer) {
var reqId = buffer.readInt();
var conId = buffer.readInt();
var exchange = buffer.readString();
return { message: 'rerouteMktDataReq', params: [reqId, conId, exchange] };
} }, { key: "_HISTORICAL_DATA_UPDATE", value: function _HISTORICAL_DATA_UPDATE(
buffer) {
var reqId = buffer.readInt();
var barCount = buffer.readInt();
var date = buffer.readString();
var open = buffer.readFloat();
var close = buffer.readFloat();
var high = buffer.readFloat();
var low = buffer.readFloat();
var WAP = buffer.readFloat();
var volume = buffer.readString();
return {
message: 'historicalDataUpdate',
params: [reqId, new Bar(date, open, high, low, close, volume, barCount, WAP)] };
} }, { key: "_PNL_SINGLE", value: function _PNL_SINGLE(
buffer) {
var reqId = buffer.readInt();
var pos = buffer.readInt();
var dailyPnL = buffer.readFloat();
var unrealizedPnL = Number.MAX_VALUE;
var realizedPnL = Number.MAX_VALUE;
if (this._serverVersion >= _constants.MIN_SERVER_VER.UNREALIZED_PNL) {
unrealizedPnL = buffer.readFloat();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.REALIZED_PNL) {
realizedPnL = buffer.readFloat();
}
var value = buffer.readFloat();
return {
message: 'pnlSingle',
params: [reqId, pos, dailyPnL, unrealizedPnL, realizedPnL, value] };
} }, { key: "_PNL", value: function _PNL(
buffer) {
var reqId = buffer.readInt();
var dailyPnL = buffer.readFloat();
var unrealizedPnL = Number.MAX_VALUE;
var realizedPnL = Number.MAX_VALUE;
if (this._serverVersion >= _constants.MIN_SERVER_VER.UNREALIZED_PNL) {
unrealizedPnL = buffer.readFloat();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.REALIZED_PNL) {
realizedPnL = buffer.readFloat();
}
return { message: 'pnl', params: [reqId, dailyPnL, unrealizedPnL, realizedPnL] };
} }, { key: "_HISTOGRAM_DATA", value: function _HISTOGRAM_DATA(
buffer) {
var reqId = buffer.readInt();
var n = buffer.readInt();
var items = [];
for (var i = 0; i < n; i++) {
items.push({ price: buffer.readFloat(), size: buffer.readInt() });
}
return { message: 'histogramData', params: [reqId, items] };
} }, { key: "_HISTORICAL_NEWS_END", value: function _HISTORICAL_NEWS_END(
buffer) {
var requestId = buffer.readInt();
var hasMore = buffer.readBool();
return { message: 'historicalNewsEnd', params: [requestId, hasMore] };
} }, { key: "_HISTORICAL_NEWS", value: function _HISTORICAL_NEWS(
buffer) {
var requestId = buffer.readInt();
var time = buffer.readString();
var providerCode = buffer.readString();
var articleId = buffer.readString();
var headline = buffer.readString();
return {
message: 'historicalNews',
params: [requestId, time, providerCode, articleId, headline] };
} }, { key: "_NEWS_ARTICLE", value: function _NEWS_ARTICLE(
buffer) {
var requestId = buffer.readInt();
var articleType = buffer.readInt();
var articleText = buffer.readString();
return { message: 'newsArticle', params: [requestId, articleType, articleText] };
} }, { key: "_NEWS_PROVIDERS", value: function _NEWS_PROVIDERS(
buffer) {
var newsProviders = [];
var nNewsProviders = buffer.readInt();
if (nNewsProviders > 0) {
for (var i = 0; i < nNewsProviders; i++) {
newsProviders.push({ code: buffer.readString(), name: buffer.readString() });
}
}
return { message: 'newsProviders', params: [newsProviders] };
} }, { key: "_TICK_NEWS", value: function _TICK_NEWS(
buffer) {
var tickerId = buffer.readInt();
var timeStamp = buffer.readString();
var providerCode = buffer.readString();
var articleId = buffer.readString();
var headline = buffer.readString();
var extraData = buffer.readString();
return {
message: 'tickNews',
params: [tickerId, timeStamp, providerCode, articleId, headline, extraData] };
} }, { key: "_HEAD_TIMESTAMP", value: function _HEAD_TIMESTAMP(
buffer) {
var reqId = buffer.readInt();
var headTimestamp = buffer.readString();
return { message: 'headTimestamp', params: [reqId, headTimestamp] };
} }, { key: "_MKT_DEPTH_EXCHANGES", value: function _MKT_DEPTH_EXCHANGES(
buffer) {
var depthMktDataDescriptions = [];
var nDepthMktDataDescriptions = buffer.readInt();
if (nDepthMktDataDescriptions > 0) {
for (var i = 0; i < nDepthMktDataDescriptions; i++) {
if (this._serverVersion >= _constants.MIN_SERVER_VER.SERVICE_DATA_TYPE) {
depthMktDataDescriptions.push({
exchange: buffer.readString(),
secType: buffer.rereadStringad(),
listingExch: buffer.readString(),
serviceDataType: buffer.readString(),
aggGroup: buffer.readIntMax() });
} else {
depthMktDataDescriptions.push({
exchange: buffer.readString(),
secType: buffer.readString(),
listingExch: '',
serviceDataType: buffer.readBool() ? 'Deep2' : 'Deep',
aggGroup: Number.MAX_VALUE });
}
}
}
return { message: 'mktDepthExchanges', params: [depthMktDataDescriptions] };
} }, { key: "_SYMBOL_SAMPLES", value: function _SYMBOL_SAMPLES(
buffer) {
var reqId = buffer.readInt();
var contractDescriptions = [];
var nContractDescriptions = buffer.readInt();
if (nContractDescriptions > 0) {
for (var i = 0; i < nContractDescriptions; i++) {
// read contract fields
var contract = {};
contract.conid = buffer.readInt();
contract.symbol = buffer.readString();
contract.secType = buffer.readString();
contract.primaryExch = buffer.readString();
contract.currency = buffer.readString();
// read derivative sec types list
var derivativeSecTypes = [];
var nDerivativeSecTypes = buffer.readInt();
if (nDerivativeSecTypes > 0) {
for (var j = 0; j < nDerivativeSecTypes; j++) {
derivativeSecTypes.push(buffer.readString());
}
}
var contractDescription = { contract: contract, derivativeSecTypes: derivativeSecTypes };
contractDescriptions.push(contractDescription);
}
}
return { message: 'symbolSamples', params: [reqId, contractDescriptions] };
} }, { key: "_FAMILY_CODES", value: function _FAMILY_CODES(
buffer) {
var familyCodes = [];
var nFamilyCodes = buffer.readInt();
if (nFamilyCodes > 0) {
for (var i = 0; i < nFamilyCodes; i++) {
familyCodes.push({ accountId: buffer.readString(), familyCode: buffer.readString() });
}
}
return { message: 'familyCodes', params: [familyCodes] };
} }, { key: "_SOFT_DOLLAR_TIERS", value: function _SOFT_DOLLAR_TIERS(
buffer) {
var reqId = buffer.readInt();
var nTiers = buffer.readInt();
var tiers = [];
for (var i = 0; i < nTiers; i++) {
tiers.push({
name: buffer.readString(),
value: buffer.readString(),
displayName: buffer.readString() });
}
return { message: 'softDollarTiers', params: [reqId, tiers] };
} }, { key: "_SECURITY_DEFINITION_OPTION_PARAMETER_END", value: function _SECURITY_DEFINITION_OPTION_PARAMETER_END(
buffer) {
var reqId = buffer.readInt();
return { message: 'securityDefinitionOptionParameterEnd', params: [reqId] };
} }, { key: "_SECURITY_DEFINITION_OPTION_PARAMETER", value: function _SECURITY_DEFINITION_OPTION_PARAMETER(
buffer) {
var reqId = buffer.readInt();
var exchange = buffer.readString();
var underlyingConId = buffer.readInt();
var tradingClass = buffer.readString();
var multiplier = buffer.readString();
var expirationsSize = buffer.readInt();
var expirations = [];
var strikes = [];
for (var i = 0; i < expirationsSize; i++) {
expirations.push(buffer.readString());
}
var strikesSize = buffer.readInt();
for (var _i = 0; _i < strikesSize; _i++) {
strikes.push(buffer.readFloat());
}
return {
message: 'securityDefinitionOptionParameter',
params: [reqId, exchange, underlyingConId, tradingClass, multiplier, expirations, strikes] };
} }, { key: "_VERIFY_AND_AUTH_COMPLETED", value: function _VERIFY_AND_AUTH_COMPLETED(
buffer) {
var version = buffer.readInt();
var isSuccessfulStr = buffer.readString();
var isSuccessful = isSuccessfulStr === 'true';
var errorText = buffer.readString();
return { message: 'verifyAndAuthCompleted', params: [isSuccessful, errorText] };
} }, { key: "_VERIFY_AND_AUTH_MESSAGE_API", value: function _VERIFY_AND_AUTH_MESSAGE_API(
buffer) {
var version = buffer.readInt();
var apiData = buffer.readString();
var xyzChallenge = buffer.readString();
return { message: 'verifyAndAuthMessageAPI', params: [apiData, xyzChallenge] };
} }, { key: "_DISPLAY_GROUP_UPDATED", value: function _DISPLAY_GROUP_UPDATED(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
var contractInfo = buffer.readString();
return { message: 'displayGroupUpdated', params: [reqId, contractInfo] };
} }, { key: "_DISPLAY_GROUP_LIST", value: function _DISPLAY_GROUP_LIST(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
var groups = buffer.readString();
return { message: 'displayGroupList', params: [reqId, groups] };
} }, { key: "_VERIFY_COMPLETED", value: function _VERIFY_COMPLETED(
buffer) {
var version = buffer.readInt();
var isSuccessfulStr = buffer.readString();
var isSuccessful = 'true'.equals(isSuccessfulStr);
var errorText = buffer.readString();
return { message: 'verifyCompleted', params: [isSuccessful, errorText] };
} }, { key: "_VERIFY_MESSAGE_API", value: function _VERIFY_MESSAGE_API(
buffer) {
var version = buffer.readInt();
var apiData = buffer.readString();
return { message: 'verifyMessageAPI', params: [apiData] };
} }, { key: "_COMMISSION_REPORT", value: function _COMMISSION_REPORT(
buffer) {
var version = buffer.readInt();
var commissionReport = {};
commissionReport.execId = buffer.readString();
commissionReport.commission = buffer.readFloat();
commissionReport.currency = buffer.readString();
commissionReport.realizedPNL = buffer.readFloat();
commissionReport["yield"] = buffer.readFloat();
commissionReport.yieldRedemptionDate = buffer.readInt();
return { message: 'commissionReport', params: [commissionReport] };
} }, { key: "_MARKET_DATA_TYPE", value: function _MARKET_DATA_TYPE(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
var marketDataType = buffer.readInt();
return { message: 'marketDataType', params: [reqId, marketDataType] };
} }, { key: "_TICK_SNAPSHOT_END", value: function _TICK_SNAPSHOT_END(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
return { message: 'tickSnapshotEnd', params: [reqId] };
} }, { key: "_DELTA_NEUTRAL_VALIDATION", value: function _DELTA_NEUTRAL_VALIDATION(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
var deltaNeutralContract = {};
deltaNeutralContract.conId = buffer.readInt();
deltaNeutralContract.delta = buffer.readFloat();
underdeltaNeutralContractComp.price = buffer.readFloat();
return { message: 'deltaNeutralValidation', params: [reqId, deltaNeutralContract] };
} }, { key: "_EXECUTION_DATA_END", value: function _EXECUTION_DATA_END(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
return { message: 'execDetailsEnd', params: [reqId] };
} }, { key: "_ACCT_DOWNLOAD_END", value: function _ACCT_DOWNLOAD_END(
buffer) {
var version = buffer.readInt();
var accountName = buffer.readString();
return { message: 'accountDownloadEnd', params: [accountName] };
} }, { key: "_OPEN_ORDER_END", value: function _OPEN_ORDER_END(
buffer) {
var version = buffer.readInt();
return { message: 'openOrderEnd' };
} }, { key: "_CONTRACT_DATA_END", value: function _CONTRACT_DATA_END(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
return { message: 'contractDetailsEnd', params: [reqId] };
} }, { key: "_FUNDAMENTAL_DATA", value: function _FUNDAMENTAL_DATA(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
var data = buffer.readString();
return { message: 'fundamentalData', params: [reqId, data] };
} }, { key: "_REAL_TIME_BARS", value: function _REAL_TIME_BARS(
buffer) {
var version = buffer.readInt();
var reqId = buffer.readInt();
var time = buffer.readString();
var open = buffer.readFloat();
var high = buffer.readFloat();
var low = buffer.readFloat();
var close = buffer.readFloat();
var volume = buffer.readInt();
var wap = buffer.readFloat();
var count = buffer.readInt();
return {
message: 'realtimeBar',
params: [reqId, time, open, high, low, close, volume, wap, count] };
} }, { key: "_CURRENT_TIME", value: function _CURRENT_TIME(
buffer) {
var version = buffer.readInt();
var time = buffer.readString();
return { message: 'currentTime', params: [time] };
} }, { key: "_SCANNER_PARAMETERS", value: function _SCANNER_PARAMETERS(
buffer) {
var version = buffer.readInt();
var xml = buffer.readString();
return { message: 'scannerParameters', params: [xml] };
} }, { key: "_HISTORICAL_DATA", value: function _HISTORICAL_DATA(
buffer) {
var messages = [];
var version =
this._serverVersion < _constants.MIN_SERVER_VER.SYNT_REALTIME_BARS ? buffer.readInt() : Number.MAX_VALUE;
var reqId = buffer.readInt();
var completedIndicator = 'finished';
var startDateStr;
var endDateStr;
if (version >= 2) {
startDateStr = buffer.readString();
endDateStr = buffer.readString();
completedIndicator += '-' + startDateStr + '-' + endDateStr;
}
var itemCount = buffer.readInt();
var date;
var open;
var high;
var low;
var close;
var volume;
var WAP;
var barCount;
while (itemCount--) {
date = buffer.readString();
open = buffer.readFloat();
high = buffer.readFloat();
low = buffer.readFloat();
close = buffer.readFloat();
volume =
this._serverVersion < _constants.MIN_SERVER_VER.SYNT_REALTIME_BARS ?
buffer.readInt() :
buffer.readString();
WAP = buffer.readFloat();
if (this._serverVersion < _constants.MIN_SERVER_VER.SYNT_REALTIME_BARS) {
/*let hasGaps = */buffer.readString();
}
barCount = -1;
if (version >= 3) {
barCount = buffer.readInt();
}
messages.push({
message: 'historicalData',
params: [reqId, { date: date, open: open, high: high, low: low, close: close, volume: volume, barCount: barCount, WAP: WAP }] });
}
// send end of dataset marker
messages.push({ message: 'historicalDataEnd', params: [reqId, startDateStr, endDateStr] });
return messages;
} }, { key: "_RECEIVE_FA", value: function _RECEIVE_FA(
buffer) {
var version = buffer.readInt();
var faDataType = buffer.readInt();
var xml = buffer.readString();
return { message: 'receiveFA', params: [faDataType, xml] };
} }, { key: "_MANAGED_ACCTS", value: function _MANAGED_ACCTS(
buffer) {
var version = buffer.readInt();
var accountsList = buffer.readString();
return { message: 'managedAccounts', params: [accountsList] };
} }, { key: "_NEWS_BULLETINS", value: function _NEWS_BULLETINS(
buffer) {
var version = buffer.readInt();
var newsMsgId = buffer.readInt();
var newsMsgType = buffer.readInt();
var newsMessage = buffer.readString();
var originatingExch = buffer.readString();
return {
message: 'updateNewsBulletin',
params: [newsMsgId, newsMsgType, newsMessage, originatingExch] };
} }, { key: "_MARKET_DEPTH_L2", value: function _MARKET_DEPTH_L2(
buffer) {
var version = buffer.readInt();
var id = buffer.readInt();
var position = buffer.readInt();
var marketMaker = buffer.readString();
var operation = buffer.readInt();
var side = buffer.readInt();
var price = buffer.readFloat();
var size = buffer.readInt();
var isSmartDepth = this._serverVersion >= _constants.MIN_SERVER_VER.SMART_DEPTH ? buffer.readBool() : false;
return {
message: 'updateMktDepthL2',
params: [id, position, marketMaker, operation, side, price, size, isSmartDepth] };
} }, { key: "_MARKET_DEPTH", value: function _MARKET_DEPTH(
buffer) {
var version = buffer.readInt();
var id = buffer.readInt();
var position = buffer.readInt();
var operation = buffer.readInt();
var side = buffer.readInt();
var price = buffer.readFloat();
var size = buffer.readInt();
return { message: 'updateMktDepth', params: [id, position, operation, side, price, size] };
} }, { key: "_EXECUTION_DATA", value: function _EXECUTION_DATA(
buffer) {
var version =
this._serverVersion < _constants.MIN_SERVER_VER.LAST_LIQUIDITY ? buffer.readInt() : this._serverVersion;
var reqId = -1;
if (version >= 7) {
reqId = buffer.readInt();
}
var orderId = buffer.readInt();
// read contract fields
var contract = {};
if (version >= 5) {
contract.conId = buffer.readInt();
}
contract.symbol = buffer.readString();
contract.secType = buffer.readString();
contract.expiry = buffer.readString();
contract.strike = buffer.readFloat();
contract.right = buffer.readString();
if (version >= 9) {
contract.multiplier = buffer.readString();
}
contract.exchange = buffer.readString();
contract.currency = buffer.readString();
contract.localSymbol = buffer.readString();
if (version >= 10) {
contract.tradingClass = buffer.readString();
}
var exec = {};
exec.orderId = orderId;
exec.execId = buffer.readString();
exec.time = buffer.readString();
exec.acctNumber = buffer.readString();
exec.exchange = buffer.readString();
exec.side = buffer.readString();
exec.shares =
this._serverVersion >= _constants.MIN_SERVER_VER.FRACTIONAL_POSITIONS ?
buffer.readFloat() :
buffer.readInt();
exec.price = buffer.readFloat();
if (version >= 2) {
exec.permId = buffer.readInt();
}
if (version >= 3) {
exec.clientId = buffer.readInt();
}
if (version >= 4) {
exec.liquidation = buffer.readInt();
}
if (version >= 6) {
exec.cumQty = buffer.readFloat();
exec.avgPrice = buffer.readFloat();
}
if (version >= 8) {
exec.orderRef = buffer.readString();
}
if (version >= 9) {
exec.evRule = buffer.readString();
exec.evMultiplier = buffer.readFloat();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.MODELS_SUPPORT) {
exec.modelCode = buffer.readString();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.LAST_LIQUIDITY) {
exec.lastLiquidity = buffer.readInt();
}
return { message: 'execDetails', params: [reqId, contract, exec] };
} }, { key: "_BOND_CONTRACT_DATA", value: function _BOND_CONTRACT_DATA(
buffer) {
var version = buffer.readInt();
var reqId = -1;
if (version >= 3) {
reqId = buffer.readInt();
}
var contract = {
summary: {} };
contract.summary.symbol = buffer.readString();
contract.summary.secType = buffer.readString();
contract.cusip = buffer.readString();
contract.coupon = buffer.readFloat();
contract.maturity = buffer.readString();
contract.issueDate = buffer.readString();
contract.ratings = buffer.readString();
contract.bondType = buffer.readString();
contract.couponType = buffer.readString();
contract.convertible = buffer.readBool();
contract.callable = buffer.readBool();
contract.putable = buffer.readBool();
contract.descAppend = buffer.readString();
contract.summary.exchange = buffer.readString();
contract.summary.currency = buffer.readString();
contract.marketName = buffer.readString();
contract.summary.tradingClass = buffer.readString();
contract.summary.conId = buffer.readInt();
contract.minTick = buffer.readFloat();
if (this._serverVersion >= _constants.MIN_SERVER_VER.MD_SIZE_MULTIPLIER) {
contract.mdSizeMultiplier = buffer.readInt();
}
contract.orderTypes = buffer.readString();
contract.validExchanges = buffer.readString();
if (version >= 2) {
contract.nextOptionDate = buffer.readString();
contract.nextOptionType = buffer.readString();
contract.nextOptionPartial = buffer.readBool();
contract.notes = buffer.readString();
}
if (version >= 4) {
contract.longName = buffer.readString();
}
if (version >= 6) {
contract.evRule = buffer.readString();
contract.evMultiplier = buffer.readFloat();
}
var secIdListCount;
var tagValue;
if (version >= 5) {
secIdListCount = buffer.readInt();
if (secIdListCount > 0) {
contract.secIdList = [];
while (secIdListCount--) {
tagValue = {};
tagValue.tag = buffer.readString();
tagValue.value = buffer.readString();
contract.secIdList.push(tagValue);
}
}
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.AGG_GROUP) {
contract.aggGroup = buffer.readInt();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.MARKET_RULES) {
contract.marketRuleIds = buffer.readString();
}
return { message: 'bondContractDetails', params: [reqId, contract] };
} }, { key: "_CONTRACT_DATA", value: function _CONTRACT_DATA(
buffer) {
var version = buffer.readInt();
var reqId = -1;
if (version >= 3) {
reqId = buffer.readInt();
}
var contract = {
summary: {} };
contract.summary.symbol = buffer.readString();
contract.summary.secType = buffer.readString();
contract.summary.expiry = buffer.readString();
contract.summary.strike = buffer.readFloat();
contract.summary.right = buffer.readString();
contract.summary.exchange = buffer.readString();
contract.summary.currency = buffer.readString();
contract.summary.localSymbol = buffer.readString();
contract.marketName = buffer.readString();
contract.summary.tradingClass = buffer.readString();
contract.summary.conId = buffer.readInt();
contract.minTick = buffer.readFloat();
if (this._serverVersion >= _constants.MIN_SERVER_VER.MD_SIZE_MULTIPLIER) {
contract.mdSizeMultiplier = buffer.readInt();
}
contract.summary.multiplier = buffer.readString();
contract.orderTypes = buffer.readString();
contract.validExchanges = buffer.readString();
if (version >= 2) {
contract.priceMagnifier = buffer.readInt();
}
if (version >= 4) {
contract.underConId = buffer.readInt();
}
if (version >= 5) {
contract.longName = buffer.readString();
contract.summary.primaryExch = buffer.readString();
}
if (version >= 6) {
contract.contractMonth = buffer.readString();
contract.industry = buffer.readString();
contract.category = buffer.readString();
contract.subcategory = buffer.readString();
contract.timeZoneId = buffer.readString();
contract.tradingHours = buffer.readString();
contract.liquidHours = buffer.readString();
}
if (version >= 8) {
contract.evRule = buffer.readString();
contract.evMultiplier = buffer.readFloat();
}
var secIdListCount;
var tagValue;
if (version >= 7) {
secIdListCount = buffer.readInt();
if (secIdListCount > 0) {
contract.secIdList = [];
for (var i = 0; i < secIdListCount; ++i) {
tagValue = {};
tagValue.tag = buffer.readString();
tagValue.value = buffer.readString();
contract.secIdList.push(tagValue);
}
}
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.AGG_GROUP) {
contract.aggGroup = buffer.readInt();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.UNDERLYING_INFO) {
contract.underSymbol = buffer.readString();
contract.underSecType = buffer.readString();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.MARKET_RULES) {
contract.marketRuleIds = buffer.readString();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.REAL_EXPIRATION_DATE) {
contract.realExpirationDate = buffer.readString();
}
return { message: 'contractDetails', params: [reqId, contract] };
} }, { key: "_SCANNER_DATA", value: function _SCANNER_DATA(
buffer) {
var messages = [];
var version = buffer.readInt();
var tickerId = buffer.readInt();
var numberOfElements = buffer.readInt();
for (var ctr = 0; ctr < numberOfElements; ctr++) {
var contract = {
summary: {} };
var rank = buffer.readInt();
if (version >= 3) {
contract.summary.conId = buffer.readInt();
}
contract.summary.symbol = buffer.readString();
contract.summary.secType = buffer.readString();
contract.summary.expiry = buffer.readString();
contract.summary.strike = buffer.readFloat();
contract.summary.right = buffer.readString();
contract.summary.exchange = buffer.readString();
contract.summary.currency = buffer.readString();
contract.summary.localSymbol = buffer.readString();
contract.marketName = buffer.readString();
contract.summary.tradingClass = buffer.readString();
var distance = buffer.readString();
var benchmark = buffer.readString();
var projection = buffer.readString();
var legsStr = null;
if (version >= 2) {
legsStr = buffer.readString();
}
messages.push({
message: 'scannerData',
params: [tickerId, rank, contract, distance, benchmark, projection, legsStr] });
}
messages.push({ message: 'scannerDataEnd', params: [tickerId] });
return messages;
} }, { key: "_NEXT_VALID_ID", value: function _NEXT_VALID_ID(
buffer) {
var version = buffer.readInt();
var orderId = buffer.readInt();
return { message: 'nextValidId', params: [orderId] };
} }, { key: "_OPEN_ORDER", value: function _OPEN_ORDER(
buffer) {
// read version
var version =
this._serverVersion < _constants.MIN_SERVER_VER.ORDER_CONTAINER ? buffer.readInt() : this._serverVersion;
// read order id
var order = {};
order.orderId = buffer.readInt();
// read contract fields
var contract = {};
if (version >= 17) {
contract.conId = buffer.readInt();
}
contract.symbol = buffer.readString();
contract.secType = buffer.readString();
contract.expiry = buffer.readString();
contract.strike = buffer.readFloat();
contract.right = buffer.readString();
if (version >= 32) {
contract.multiplier = buffer.readString();
}
contract.exchange = buffer.readString();
contract.currency = buffer.readString();
if (version >= 2) {
contract.localSymbol = buffer.readString();
}
if (version >= 32) {
contract.tradingClass = buffer.readString();
}
// read order fields
order.action = buffer.readString();
order.totalQuantity =
this._serverVersion < _constants.MIN_SERVER_VER.FRACTIONAL_POSITIONS ?
buffer.readFloat() :
buffer.readInt();
order.orderType = buffer.readString();
if (version < 29) {
order.lmtPrice = buffer.readFloat();
} else {
order.lmtPrice = buffer.readFloatMax();
}
if (version < 30) {
order.auxPrice = buffer.readFloat();
} else {
order.auxPrice = buffer.readFloatMax();
}
order.tif = buffer.readString();
order.ocaGroup = buffer.readString();
order.account = buffer.readString();
order.openClose = buffer.readString();
order.origin = buffer.readString();
order.orderRef = buffer.readString();
if (version >= 3) {
order.clientId = buffer.readInt();
}
if (version >= 4) {
order.permId = buffer.readInt();
if (version < 18) {
// will never happen
/* order.ignoreRth = */
buffer.readBool();
} else {
order.outsideRth = buffer.readBool();
}
order.hidden = buffer.readBool();
order.discretionaryAmt = buffer.readFloat();
}
if (version >= 5) {
order.goodAfterTime = buffer.readString();
}
if (version >= 6) {
// skip deprecated sharesAllocation field
buffer.readString();
}
if (version >= 7) {
order.faGroup = buffer.readString();
order.faMethod = buffer.readString();
order.faPercentage = buffer.readString();
order.faProfile = buffer.readString();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.MODELS_SUPPORT) {
order.modelCode = buffer.readString();
}
if (version >= 8) {
order.goodTillDate = buffer.readString();
}
if (version >= 9) {
order.rule80A = buffer.readString();
order.percentOffset = buffer.readFloatMax();
order.settlingFirm = buffer.readString();
order.shortSaleSlot = buffer.readInt();
order.designatedLocation = buffer.readString();
if (this._serverVersion === 51) {
buffer.readInt(); // exemptCode
} else if (version >= 23) {
order.exemptCode = buffer.readInt();
}
order.auctionStrategy = buffer.readInt();
order.startingPrice = buffer.readFloatMax();
order.stockRefPrice = buffer.readFloatMax();
order.delta = buffer.readFloatMax();
order.stockRangeLower = buffer.readFloatMax();
order.stockRangeUpper = buffer.readFloatMax();
order.displaySize = buffer.readInt();
if (version < 18) {
// will never happen
/* order.rthOnly = */
buffer.readBool();
}
order.blockOrder = buffer.readBool();
order.sweepToFill = buffer.readBool();
order.allOrNone = buffer.readBool();
order.minQty = buffer.readIntMax();
order.ocaType = buffer.readInt();
order.eTradeOnly = buffer.readBool();
order.firmQuoteOnly = buffer.readBool();
order.nbboPriceCap = buffer.readFloatMax();
}
if (version >= 10) {
order.parentId = buffer.readInt();
order.triggerMethod = buffer.readInt();
}
var receivedInt;
if (version >= 11) {
order.volatility = buffer.readFloatMax();
order.volatilityType = buffer.readInt();
if (version === 11) {
receivedInt = buffer.readInt();
order.deltaNeutralOrderType = receivedInt === 0 ? 'NONE' : 'MKT';
} else {
// version 12 and up
order.deltaNeutralOrderType = buffer.readString();
order.deltaNeutralAuxPrice = buffer.readFloatMax();
if (version >= 27 && !(0, _lodash.isEmpty)(order.deltaNeutralOrderType)) {
order.deltaNeutralConId = buffer.readInt();
order.deltaNeutralSettlingFirm = buffer.readString();
order.deltaNeutralClearingAccount = buffer.readString();
order.deltaNeutralClearingIntent = buffer.readString();
}
if (version >= 31 && !(0, _lodash.isEmpty)(order.deltaNeutralOrderType)) {
order.deltaNeutralOpenClose = buffer.readString();
order.deltaNeutralShortSale = buffer.readBool();
order.deltaNeutralShortSaleSlot = buffer.readInt();
order.deltaNeutralDesignatedLocation = buffer.readString();
}
}
order.continuousUpdate = buffer.readInt();
if (this._serverVersion === 26) {
order.stockRangeLower = buffer.readFloat();
order.stockRangeUpper = buffer.readFloat();
}
order.referencePriceType = buffer.readInt();
}
if (version >= 13) {
order.trailStopPrice = buffer.readFloatMax();
}
if (version >= 30) {
order.trailingPercent = buffer.readFloatMax();
}
if (version >= 14) {
order.basisPoints = buffer.readFloatMax();
order.basisPointsType = buffer.readIntMax();
contract.comboLegsDescrip = buffer.readString();
}
var comboLeg;
var comboLegsCount;
var orderComboLeg;
var orderComboLegsCount;
if (version >= 29) {
comboLegsCount = buffer.readInt();
if (comboLegsCount > 0) {
contract.comboLegs = [];
for (var i = 0; i < comboLegsCount; ++i) {
comboLeg = {};
comboLeg.conId = buffer.readInt();
comboLeg.ratio = buffer.readInt();
comboLeg.action = buffer.readString();
comboLeg.exchange = buffer.readString();
comboLeg.openClose = buffer.readInt();
comboLeg.shortSaleSlot = buffer.readInt();
comboLeg.designatedLocation = buffer.readString();
comboLeg.exemptCode = buffer.readInt();
contract.comboLegs.push(comboLeg);
}
}
orderComboLegsCount = buffer.readInt();
if (orderComboLegsCount > 0) {
order.orderComboLegs = [];
for (var _i2 = 0; _i2 < orderComboLegsCount; ++_i2) {
orderComboLeg = {};
order.price = buffer.readFloatMax();
order.orderComboLegs.push(orderComboLeg);
}
}
}
var smartComboRoutingParamsCount;
var tagValue;
if (version >= 26) {
smartComboRoutingParamsCount = buffer.readInt();
if (smartComboRoutingParamsCount > 0) {
order.smartComboRoutingParams = [];
for (var _i3 = 0; _i3 < smartComboRoutingParamsCount; ++_i3) {
tagValue = {};
tagValue.tag = buffer.readString();
tagValue.value = buffer.readString();
order.smartComboRoutingParams.push(tagValue);
}
}
}
if (version >= 15) {
if (version >= 20) {
order.scaleInitLevelSize = buffer.readIntMax();
order.scaleSubsLevelSize = buffer.readIntMax();
} else {
var notSuppScaleNumComponents = buffer.readIntMax();
order.scaleInitLevelSize = buffer.readIntMax();
}
order.scalePriceIncrement = buffer.readFloatMax();
}
if (
version >= 28 &&
order.scalePriceIncrement > 0.0 &&
order.scalePriceIncrement !== Number.MAX_VALUE)
{
order.scalePriceAdjustValue = buffer.readFloatMax();
order.scalePriceAdjustInterval = buffer.readIntMax();
order.scaleProfitOffset = buffer.readFloatMax();
order.scaleAutoReset = buffer.readBool();
order.scaleInitPosition = buffer.readIntMax();
order.scaleInitFillQty = buffer.readIntMax();
order.scaleRandomPercent = buffer.readBool();
}
if (version >= 24) {
order.hedgeType = buffer.readString();
if (!(0, _lodash.isEmpty)(order.hedgeType)) {
order.hedgeParam = buffer.readString();
}
}
if (version >= 25) {
order.optOutSmartRouting = buffer.readBool();
}
if (version >= 19) {
order.clearingAccount = buffer.readString();
order.clearingIntent = buffer.readString();
}
if (version >= 22) {
order.notHeld = buffer.readBool();
}
var underComp;
if (version >= 20) {
if (buffer.readBool()) {
deltaNeutralContract = {};
deltaNeutralContract.conId = buffer.readInt();
deltaNeutralContract.delta = buffer.readFloat();
deltaNeutralContract.price = buffer.readFloat();
contract.deltaNeutralContract = deltaNeutralContract;
}
}
var algoParamsCount;
if (version >= 21) {
order.algoStrategy = buffer.readString();
if (!(0, _lodash.isEmpty)(order.algoStrategy)) {
algoParamsCount = buffer.readInt();
if (algoParamsCount > 0) {
order.algoParams = [];
for (var _i4 = 0; _i4 < algoParamsCount; ++_i4) {
tagValue = {};
tagValue.tag = buffer.readString();
tagValue.value = buffer.readString();
order.algoParams.push(tagValue);
}
}
}
}
if (version >= 33) {
order.solicited = buffer.readBool();
}
var orderState = {};
if (version >= 16) {
order.whatIf = buffer.readBool();
orderState.status = buffer.readString();
if (this._serverVersion >= _constants.MIN_SERVER_VER.WHAT_IF_EXT_FIELDS) {
orderState.initMarginBefore = buffer.readString();
orderState.maintMarginBefore = buffer.readString();
orderState.equityWithLoanBefore = buffer.readString();
orderState.initMarginChange = buffer.readString();
orderState.maintMarginChange = buffer.readString();
orderState.equityWithLoanChange = buffer.readString();
}
orderState.initMargin = buffer.readString();
orderState.maintMargin = buffer.readString();
orderState.equityWithLoan = buffer.readString();
orderState.commission = buffer.readFloatMax();
orderState.minCommission = buffer.readFloatMax();
orderState.maxCommission = buffer.readFloatMax();
orderState.commissionCurrency = buffer.readString();
orderState.warningText = buffer.readString();
}
if (version >= 34) {
order.randomizeSize = buffer.readBool();
order.randomizePrice = buffer.readBool();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.PEGGED_TO_BENCHMARK) {
if (order.orderType === _constants.ORDER_TYPE.PEG_BENCH) {
order.referenceContractId = buffer.readInt();
order.isPeggedChangeAmountDecrease = buffer.readBool();
order.peggedChangeAmount = buffer.readFloat();
order.referenceChangeAmount = buffer.readFloat();
order.referenceExchangeId = buffer.readString();
}
var nConditions = buffer.readInt();
if (nConditions > 0) {
order.conditions = [];
for (var _i5 = 0; _i5 < nConditions; _i5++) {
order.conditions.push(buffer.readInt());
}
order.conditionsIgnoreRth = buffer.readBool();
order.conditionsCancelOrder = buffer.readBool();
}
order.adjustedOrderType = _constants.ORDER_TYPE[buffer.readString()];
order.triggerPrice = buffer.readFloatMax();
order.trailStopPrice = buffer.readFloatMax();
order.lmtPriceOffset = buffer.readFloatMax();
order.adjustedStopPrice = buffer.readFloatMax();
order.adjustedStopLimitPrice = buffer.readFloatMax();
order.adjustedTrailingAmount = buffer.readFloatMax();
order.adjustableTrailingUnit = buffer.readInt();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.SOFT_DOLLAR_TIER) {
order.softDollarTier = {
name: buffer.readString(),
value: buffer.readString(),
displayName: buffer.readString() };
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.CASH_QTY) {
order.cashQty = buffer.readFloatMax();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.AUTO_PRICE_FOR_HEDGE) {
order.dontUseAutoPriceForHedge = buffer.readBool();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.ORDER_CONTAINER) {
order.isOmsContainer = buffer.readBool();
}
if (this._serverVersion >= _constants.MIN_SERVER_VER.D_PEG_ORDERS) {
order.discretionaryUpToLimitPrice = buffer.readBool();
}
return { message: 'openOrder', params: [order.orderId, contract, order, orderState] };
} }, { key: "_ERR_MSG", value: function _ERR_MSG(
buffer) {
var errorCode;
var errorMsg;
var id;
var version = buffer.readInt();
if (version < 2) {
errorMsg = buffer.readString();
return { message: 'error', params: [errorMsg] };
} else {
id = buffer.readInt();
errorCode = buffer.readInt();
errorMsg = buffer.readString();
return { message: 'error', params: [id, errorCode, errorMsg] };
}
} }, { key: "_ACCT_UPDATE_TIME", value: function _ACCT_UPDATE_TIME(
buffer) {
var version = buffer.readInt();
var timeStamp = buffer.readString();
return { message: 'updateAccountTime', params: [timeStamp] };
} }, { key: "_PORTFOLIO_VALUE", value: function _PORTFOLIO_VALUE(
buffer) {
var version = buffer.readInt();
var contract = {};
if (version >= 6) {
contract.conId = buffer.readInt();
}
contract.symbol = buffer.readString();
contract.secType = buffer.readString();
contract.expiry = buffer.readString();
contract.strike = buffer.readFloat();
contract.right = buffer.readString();
if (version >= 7) {
contract.multiplier = buffer.readString();
contract.primaryExch = buffer.readString();
}
contract.currency = buffer.readString();
if (version >= 2) {
contract.localSymbol = buffer.readString();
}
if (version >= 8) {
contract.tradingClass = buffer.readString();
}
var position =
this._serverVersion >= _constants.MIN_SERVER_VER.FRACTIONAL_POSITIONS ?
buffer.readFloat() :
buffer.readInt();
var marketPrice = buffer.readFloat();
var marketValue = buffer.readFloat();
var averageCost = 0.0;
var unrealizedPNL = 0.0;
var realizedPNL = 0.0;
if (version >= 3) {
averageCost = buffer.readFloat();
unrealizedPNL = buffer.readFloat();
realizedPNL = buffer.readFloat();
}
var accountName = null;
if (version >= 4) {
accountName = buffer.readString();
}
if (version === 6 && this._serverVersion === 39) {
contract.primaryExch = buffer.readString();
}
return {
message: 'updatePortfolio',
params: [
contract,
position,
marketPrice,
marketValue,
averageCost,
unrealizedPNL,
realizedPNL,
accountName] };
} }, { key: "_ACCT_VALUE", value: function _ACCT_VALUE(
buffer) {
var version = buffer.readInt();
var key = buffer.readString();
var value = buffer.readString();
var currency = buffer.readString();
var accountName = null;
if (version >= 2) {
accountName = buffer.readStri