UNPKG

ib-client

Version:

Interactive Brokers API client library for Node.js

1,380 lines (1,196 loc) 64.2 kB
"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