xoh-xapi
Version:
X Open Hub API
663 lines (662 loc) • 27.3 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ws_1 = __importDefault(require("ws"));
const Streamer_1 = __importDefault(require("./Streamer"));
const helpers_1 = require("./helpers");
class Xapi {
/**
* Main Object for API communication
* @constructor
*/
constructor(args) {
/**
* Used to start session with the server
* @param {Function} onReady - Function to run when everything is ready
* @param {Function} onError - Function to run when errors happen during initialization with Error object carrying the message
*/
this.onReady = (onReady, onError) => {
if (this.loginStatus) {
onReady();
}
else {
this.webSocket.onopen = () => {
this.login().then((data) => {
//login success
let response = JSON.parse(data);
if (response.status === true) {
onReady();
}
else {
onError(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//error in login process
onError(error);
});
};
this.webSocket.onerror = (e) => {
this.loginStatus = false;
onError("Websocket error");
};
this.webSocket.onclose = (e) => {
this.loginStatus = false;
onError(new Error("Communication to the server was closed"));
};
}
};
/**
* Used to initiate connection to the server separately other than using onReady
*/
this.init = () => {
return (new Promise((resolved, rejected) => {
if (this.loginStatus) {
resolved(true);
}
else {
this.webSocket.onopen = () => {
this.login().then((data) => {
//login success
let response = JSON.parse(data);
if (response.status === true) {
resolved(true);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//error in login process
rejected(error);
});
};
this.webSocket.onerror = (e) => {
this.loginStatus = false;
rejected("Websocket Error");
};
this.webSocket.onclose = (e) => {
this.loginStatus = false;
rejected(new Error("Communication to the server was closed"));
};
}
}));
};
/**
* Used for login to the trading server
*/
this.login = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "login",
arguments: {
"userId": this.accountId,
"password": this.password
}
});
request.send().then((data) => {
//fulfilled
let response = JSON.parse(data);
if (response.status === true) {
this.streamSessionId = response.streamSessionId;
this.loginStatus = true;
this.streamer = new Streamer_1.default({
streamSessionId: this.streamSessionId,
host: this.hostStream,
candlesTrigger: this.getChartLastRequest,
candlesTrigger2: this.getChartRangeRequest,
});
//ping after every 30 secs to keep connection alive
this.pingTimerId = setInterval(() => __awaiter(this, void 0, void 0, function* () {
yield this.ping(); //can be set to stream version of ping
}), 10000);
resolved(data);
}
else {
rejected(new Error("Cannot Login to the server"));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
/**
* Logs out the user/client
*/
this.logOut = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "logout"
});
request.send().then((data) => {
//fulfilled
//clear the ping timer if set
if (!(this.pingTimerId === undefined)) {
clearInterval(this.pingTimerId);
}
resolved(true);
}, (error) => {
//failed
rejected(error);
});
}));
};
/**
* Returns array of all symbols available for the user
*/
this.getAllSymbols = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getAllSymbols"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
/**
* Returns calendar with market events
*/
this.getCalendar = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getCalendar"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
/**
* Returns chart info, from start date to the current time.
*/
this.getChartLastRequest = (info) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getChartLastRequest",
arguments: {
info,
}
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData.rateInfos); //skipped digits from response.returnData.digits
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getChartRangeRequest = (info) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getChartRangeRequest",
arguments: {
info,
}
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData.rateInfos); //skipped digits from response.returnData.digits
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getCommissionDef = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getCommissionDef",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getCurrentUserData = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getCurrentUserData"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getIbsHistory = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getIbsHistory",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getMarginLevel = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getMarginLevel"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getMarginTrade = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getMarginTrade",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getNews = (args) => {
return (new Promise((resolved, rejected) => {
args.end = (args.end === undefined) ? 0 : args.end;
let request = new helpers_1.Request(this.webSocket, {
command: "getNews",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getProfitCalculation = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getProfitCalculation",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getServerTime = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getServerTime"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getStepRules = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getStepRules"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getSymbol = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getSymbol",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getTickPrices = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getTickPrices",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData.quotations);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getTradeRecords = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getTradeRecords",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getTrades = (args) => {
return (new Promise((resolved, rejected) => {
args.openedOnly = (args.openedOnly === undefined) ? false : args.openedOnly;
let request = new helpers_1.Request(this.webSocket, {
command: "getTrades",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getTradesHistory = (args) => {
return (new Promise((resolved, rejected) => {
args.end = (args.end === undefined) ? 0 : args.end;
let request = new helpers_1.Request(this.webSocket, {
command: "getTradesHistory",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getTradingHours = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getTradingHours",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.getVersion = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "getVersion"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.ping = () => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "ping"
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(true);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.tradeTransaction = (info) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "tradeTransaction",
arguments: {
tradeTransInfo: info,
}
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData); //orderId
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
this.tradeTransactionStatus = (args) => {
return (new Promise((resolved, rejected) => {
let request = new helpers_1.Request(this.webSocket, {
command: "tradeTransactionStatus",
arguments: args,
});
request.send().then((data) => {
let response = JSON.parse(data);
if (response.status === true) {
resolved(response.returnData);
}
else {
rejected(new Error(response.errorCode + ": " + response.errorDescr));
}
}, (error) => {
//failed
rejected(error);
});
}));
};
let { password, accountId, type = 'demo', broker = 'xtb', } = args;
this.password = password;
this.accountId = accountId;
this.type = (type === 'demo' || type === 'real') ? type : 'demo';
this.broker = (broker === 'xoh' || broker === 'xtb') ? broker : 'xtb';
this.loginStatus = false;
//set host url
if (this.broker === 'xoh') {
if (this.type === 'demo') {
this.host = "wss://ws.xapi.pro/demo";
this.hostStream = "wss://ws.xapi.pro/demoStream";
}
else {
this.host = "wss://ws.xapi.pro/real";
this.hostStream = "wss://ws.xapi.pro/realStream";
}
}
else {
if (this.type === 'demo') {
this.host = "wss://ws.xtb.com/demo";
this.hostStream = "wss://ws.xtb.com/demoStream";
}
else {
this.host = "wss://ws.xtb.com/real";
this.hostStream = "wss://ws.xtb.com/realStream";
}
}
//set websocket
if (typeof process === 'object' &&
typeof process.versions === 'object' &&
typeof process.versions.node !== 'undefined') {
this.webSocket = new ws_1.default(this.host);
}
else {
this.webSocket = new WebSocket(this.host);
}
}
}
exports.default = Xapi;