xts-interactive-api
Version:
The official JS client library for the Symphony Fintech Trading API's
957 lines (914 loc) • 25.5 kB
JavaScript
var config = require('./config/app/config.json'),
settings = require('./config/app/settings.json'),
request = require('./request'),
logger = require('./logger'),
CustomError = require('./customError');
module.exports = class XTSInteractive {
/**
* Constructs an XTSInteractive instance to enable data transfer via restful API's.
*
* @constructor
*
* @param {String} url
* url parameter is used to connect to the particular server.
*
*/
constructor(url) {
this.url =
url === undefined ? config.url + '/interactive' : url + '/interactive';
this.responseTypes = { success: 'success', failure: 'failure' };
logger.init();
this.isLoggedIn = false;
}
/**
* set the token value by providing the token in the input
*
* @param {string} token
* token parameter will be generated after successful login and will be used in other private API's
*
*/
set token(token) {
this._token = token;
}
/**
* Returns the token generated after successful logIn
*
*
* @return
* the value of token generated after successful logIn
*/
get token() {
return this._token;
}
/**
* set the userID value by providing the userID in the input
*
* @param {string} userID
* userID for the particular user
*/
set userID(userID) {
this._userID = userID;
}
/**
* Returns userID for the particular user
*
*
* @return
* the userID for the particular user
*/
get userID() {
return this._userID;
}
/**
* set the source value by providing the source in the input
*
* @param {string} source
* source used by the particular user
*/
set source(source) {
this._source = source;
}
/**
* Returns source used by the particular user
*
*
* @return
* the userID used by the particular user
*/
get source() {
return this._source;
}
/**
* set the url value by providing the url in the input
*
* @param {string} url
* url parameter is used to connect to the particular server.
*/
set url(url) {
this._url = url;
}
/**
* Returns url used to connect to the particular server.
*
*
* @return
* the url used to connect to the particular server.
*/
get url() {
return this._url;
}
/**
* set the enums value obtained after successful LogIn.
*
* @param {Object} enums
* sets the enums value obtained after successful LogIn.
*/
set enums(enums) {
this._enums = enums;
}
/**
* Returns enums value obtained after successful LogIn.
*
* @return
* enums value obtained after successful LogIn.
*/
get enums() {
return this._enums;
}
/**
* LogIn API of the application provides functionality of logIn into the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.secretKey
* secret key that after generate application on dashboard
*
* @param {string} reqObject.appKey
* app key that after generate application on dashboard
*
* @param {string} reqObject.source
* source used by the particular user.
*
*/
async logIn(reqObject) {
try {
var response = await request.processRequest(
'POST',
this.url + settings.restApi.session,
{},
reqObject
);
this.enums = response.result.enums;
this.clientCodes = response.result.clientCodes;
this.exchangeSegmentArray = response.result.exchangeSegmentArray;
this.token = response.result.token;
this.userID = response.result.userID;
this.isInvestorClient = response.result.isInvestorClient;
this.isOneTouchUser = response.result.isOneTouchUser;
this.isLoggedIn = true;
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* Logout API of the application provides functionality of logOut from the application
*
*/
async logOut() {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'DELETE',
this.url + settings.restApi.session,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* getProfile API of the application provides functionality of getting profile details from the application
*
*/
async getProfile(reqObject) {
try {
await this.checkLoggedIn();
let response = null;
if (reqObject == null) {
response = await request.processRequest(
'GET',
this.url + settings.restApi.profile,
{ authorization: this.token },
null
);
} else {
response = await request.processRequest(
'GET',
this.url +
settings.restApi.profile +
'?clientID=' +
reqObject.clientID,
{ authorization: this.token },
null
);
}
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* getBalance API of the application provides functionality of getting balance details from the application
*
*/
async getBalance(reqObject) {
try {
let response = null;
await this.checkLoggedIn();
if (reqObject == null)
response = await request.processRequest(
'GET',
this.url + settings.restApi.balance,
{ authorization: this.token },
null
);
else
response = await request.processRequest(
'GET',
this.url +
settings.restApi.balance +
'?clientID=' +
reqObject.clientID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* getHoldings API of the application provides functionality of getting holding details from the application
*
*/
async getHoldings(reqObject) {
try {
let response = null;
await this.checkLoggedIn();
if (reqObject == null)
response = await request.processRequest(
'GET',
this.url + settings.restApi.holding,
{ authorization: this.token },
null
);
else
response = await request.processRequest(
'GET',
this.url +
settings.restApi.holding +
'?clientID=' +
reqObject.clientID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* getPositions API of the application provides functionality of getting postion details from the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.dayOrNet
* dayOrNet parameter for getting the day or Net positions respectively
*/
async getPositions(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'GET',
this.url +
settings.restApi.position +
'?dayOrNet=' +
reqObject.dayOrNet +
'&clientID=' +
reqObject.clientID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* positionConversion API of the application provides functionality of converting position details in the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.appOrderID
* appOrderID of the particular order
*
* @param {string} reqObject.executionID
* executionID of the particular order
*
* @param {string} reqObject.oldProductType
* oldProductType of the particular order
*
* @param {string} reqObject.newProductType
* newProductType of the particular order
*
*/
async positionConversion(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'PUT',
this.url + settings.restApi.convert,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
// {
// "exchangeSegment":"NSECM",
// "exchangeInstrumentID" :22,
// "productType":"NRML",
// "squreoffMode":"DayWise",
// "positionSquareOffQuantityType" : "ExactQty",
// "squareOffQtyValue":5
// }
/**
* squareOff API of the application provides functionality of squaringOff the order in the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.exchangeSegment
* exchangeSegment of the instrument used for placing the order
*
* @param {number} reqObject.exchangeInstrumentID
* exchangeInstrumentID of the instrument used for placing the order
*
* @param {string} reqObject.productType
* productType of the particular order
*
* @param {number} reqObject.squareoffMode
* squreoffMode used for the particular order.
*
* @param {string} reqObject.positionSquareOffQuantityType
* squreoffMode used for the particular order.
*
* @param {number} reqObject.squareOffQtyValue
* squreoffMode used for the particular order.
*
*
*/
// async squareOff(reqObject) {
// try {
// await this.checkLoggedIn();
// let response = await request.processRequest(
// 'PUT',
// this.url + settings.restApi.squareoff,
// { authorization: this.token },
// reqObject
// );
// return response;
// } catch (error) {
// let customError = new CustomError(
// error.message,
// error.stack,
// error.statusCode
// );
// return customError;
// }
// }
// {
// "exchangeSegment":"NSECM",
// "exchangeInstrumentID":22,
// "productType":"MIS",
// "orderType":"LIMIT",
// "orderSide":"BUY",
// "timeInForce":"DAY",
// "disclosedQuantity":0,
// "orderQuantity":20,
// "limitPrice":1500.00,
// "stopPrice":1600.00,
// "orderUniqueIdentifier":"454845"
// }
/**
* placeOrder API of the application provides functionality of placing the order in the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.exchangeSegment
* exchangeSegment of the instrument used for placing the order
*
* @param {number} reqObject.exchangeInstrumentID
* exchangeInstrumentID of the instrument used for placing the order
*
* @param {string} reqObject.productType
* productType of the particular order
*
* @param {string} reqObject.orderType
* orderType of the particular order.
*
* @param {string} reqObject.orderSide
* orderSide of the particular order.
*
* @param {string} reqObject.timeInForce
* timeInForce of the particular order.
*
* @param {number} reqObject.disclosedQuantity
* disclosedQuantity of the particular order.
*
* @param {number} reqObject.orderQuantity
* orderQuantity of the particular order.
*
* @param {number} reqObject.limitPrice
* limitPrice of the particular order.
*
* @param {number} reqObject.stopPrice
* stopPrice of the particular order.
*
* @param {string} reqObject.orderUniqueIdentifier
* orderUniqueIdentifier of the particular order.
*/
async placeOrder(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'POST',
this.url + settings.restApi.orders,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
// {
// "appOrderID" :1991237756,
// "modifiedProductType" :"NRML",
// "modifiedOrderType" :"LIMIT",
// "modifiedOrderQuantity" :100,
// "modifiedDisclosedQuantity":0,
// "modifiedLimitPrice" :300,
// "modifiedStopPrice":300,
// "modifiedTimeInForce":"DAY",
// "modifiedOrderExpiryDate":"Feb 18 2019 15:15:00",
// "orderUniqueIdentifier":"5656"
// }
/**
* modify order API of the application provides functionality of modifing the order in the application
*
* @param {Object} reqObject request object.
*
* @param {number} reqObject.appOrderID
* appOrderID of the particular order
*
* @param {string} reqObject.modifiedProductType
* modifiedProductType of the particular order
*
* @param {string} reqObject.modifiedOrderType
* modifiedOrderType of the particular order
*
* @param {number} reqObject.modifiedOrderQuantity
* modifiedOrderQuantity of the particular order.
*
* @param {number} reqObject.modifiedDisclosedQuantity
* modifiedDisclosedQuantity of the particular order.
*
* @param {number} reqObject.modifiedLimitPrice
* modifiedLimitPrice of the particular order.
*
* @param {number} reqObject.modifiedStopPrice
* modifiedStopPrice of the particular order.
*
* @param {string} reqObject.modifiedTimeInForce
* modifiedTimeInForce of the particular order.
*
* @param {string} reqObject.orderUniqueIdentifier
* orderUniqueIdentifier of the particular order.
*/
async modifyOrder(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'PUT',
this.url + settings.restApi.orders,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
//?appOrderID=1828071433&orderUniqueIdentifier=155151
/**
* cancel order API of the application provides functionality of canceling the order in the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.appOrderID
* appOrderID of the particular order
*
* @param {string} reqObject.orderUniqueIdentifier
* orderUniqueIdentifier of the particular order.
*/
async cancelOrder(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'DELETE',
this.url +
settings.restApi.orders +
'?appOrderID=' +
reqObject.appOrderID +
'&orderUniqueIdentifier=' +
reqObject.orderUniqueIdentifier +
'&clientID=' +
reqObject.clientID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
// {
// "exchangeSegment": "NSECM",
// "exchangeInstrumentID": 22,
// "orderSide": "BUY",
// "orderQuantity": 2,
// "disclosedQuantity": 2,
// "limitPrice": 2054,
// "stopPrice": 2054,
// "orderUniqueIdentifier":"454845"
// }
/**
* placeCoverOrder API of the application provides functionality of placing the cover order in the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.exchangeSegment
* exchangeSegment of the instrument used for placing the order
*
* @param {number} reqObject.exchangeInstrumentID
* exchangeInstrumentID of the instrument used for placing the order
*
* @param {string} reqObject.orderSide
* orderSide of the particular order.
*
* @param {number} reqObject.orderQuantity
* orderQuantity of the particular order.
*
* @param {number} reqObject.disclosedQuantity
* disclosedQuantity of the particular order.
*
* @param {number} reqObject.limitPrice
* limitPrice of the particular order.
*
* @param {number} reqObject.stopPrice
* stopPrice of the particular order.
*
* @param {string} reqObject.orderUniqueIdentifier
* orderUniqueIdentifier of the particular order.
*
*/
async placeCoverOrder(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'POST',
this.url + settings.restApi.cover,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
// {
// "appOrderID": "2426016103"
// }
/**
* exitCoverOrder API of the application provides functionality of exiting the cover order in the application
*
* @param {Object} reqObject request object.
*
* @param {string} reqObject.appOrderID
* appOrderID of the particular order
*
*/
async exitCoverOrder(reqObject) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'PUT',
this.url + settings.restApi.cover,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* getOrderBook API of the application provides functionality of getting the list of orders present in the orderBook
*
*/
async getOrderBook(reqObject) {
try {
await this.checkLoggedIn();
let response = null;
response = await request.processRequest(
'GET',
this.url + settings.restApi.orders,
{ authorization: this.token },
null
);
// to get order history
// to get order book
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* getTradeBook API of the application provides functionality of getting the list of orders present in the orderBook
*
*/
async getTradeBook(reqObject) {
try {
await this.checkLoggedIn();
let response = null;
if (reqObject == null)
response = await request.processRequest(
'GET',
this.url + settings.restApi.trade,
{ authorization: this.token },
null
);
else
response = await request.processRequest(
'GET',
this.url + settings.restApi.trade + '?clientID=' + reqObject.clientID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
//?appOrderID=344566
/**
* getOrderHistory API of the application provides functionality of getting the order history in the application
*
* @param {string} appOrderID
* appOrderID of the particular order
*
*/
async getOrderHistory(appOrderID) {
try {
await this.checkLoggedIn();
let response = await request.processRequest(
'GET',
this.url + settings.restApi.orders + '?appOrderID=' + appOrderID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* get Enums APIs of the application provides functionality of get enums separately
*
*/
async getEnums(reqObject) {
try {
let response = null;
response = await request.processRequest(
'GET',
this.url + settings.restApi.enums + '?userID=' + reqObject.userID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
async bracketOrder(reqObject) {
try {
let response = null;
response = await request.processRequest(
'POST',
this.url + settings.restApi.bracketOrder,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
async cancelBracketOrder(reqObject) {
try {
let response = null;
response = await request.processRequest(
'DELETE',
this.url +
settings.restApi.bracketOrder +
'?boEntryOrderId=' +
reqObject.boEntryOrderId,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
async modifyBracketOrder(reqObject) {
try {
let response = null;
response = await request.processRequest(
'PUT',
this.url + settings.restApi.bracketOrder,
{ authorization: this.token },
reqObject
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* get exchange Message APIs of the application provides functionality of exchange brodcast,news message
*
*/
async exchangeMessage(reqObject) {
try {
let response = null;
response = await request.processRequest(
'GET',
this.url +
settings.restApi.message +
'?exchangeSegment=' +
reqObject.exchangeSegment,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
/**
* get exchange status APIs of the application provides functionality of status of exchange
*
*/
async exchangeStatus(reqObject) {
try {
let response = null;
response = await request.processRequest(
'GET',
this.url + settings.restApi.status + '?userID=' + reqObject.userID,
{ authorization: this.token },
null
);
return response;
} catch (error) {
let customError = new CustomError(
error.message,
error.stack,
error.statusCode
);
return customError;
}
}
//add exchange status APIs
async checkLoggedIn() {
if (this.isLoggedIn) {
return true;
} else {
throw {
message: 'Login is Required',
stack: 'login is mandatory',
statusCode: 404,
};
}
}
async checkClientCodes(reqObject) {
if (this.isInvestorClient) {
return true;
} else {
if (reqObject == null || reqObject.clientID == undefined) {
throw {
message: 'ClientCode is Required',
stack: 'clientCode is mandatory',
statusCode: 404,
};
} else {
return true;
}
}
}
};