UNPKG

metaapi.cloud-copyfactory-sdk

Version:

Javascript SDK for SDK for CopyFactory trade copying API. Can copy trades both between MetaTrader 5 (MT5) and MetaTrader 4 (MT4). (https://metaapi.cloud)

104 lines (103 loc) 12.6 kB
import randomstring from 'randomstring'; let StrategySignalClient = class StrategySignalClient { /** * Generates random signal id * @return {String} signal id */ generateSignalId() { return randomstring.generate(8); } /** * CopyFactory external signal update payload * @typedef {Object} CopyFactoryExternalSignalUpdate * @property {String} symbol trade symbol * @property {String} type trade type (one of POSITION_TYPE_BUY, POSITION_TYPE_SELL, ORDER_TYPE_BUY_LIMIT, ORDER_TYPE_SELL_LIMIT, * ORDER_TYPE_BUY_STOP, ORDER_TYPE_SELL_STOP) * @property {Date} time time the signal was emitted at * @property {Date} [updateTime] last time of the signal update * @property {Number} volume volume traded * @property {Number} [magic] expert advisor id * @property {Number} [stopLoss] stop loss price * @property {Number} [takeProfit] take profit price * @property {Number} [openPrice] pending order open price */ /** * CopyFactory external signal * @typedef {CopyFactoryExternalSignalUpdate} CopyFactoryExternalSignal * @property {String} id external signal id */ /** * CopyFactory external signal remove payload * @typedef {Object} CopyFactoryExternalSignalRemove * @property {Date} time the time signal was removed (closed) at */ /** * Returns active external signals of a strategy. Requires access to * copyfactory-api:rest:public:external-signals:getSignals method which is included into reader role. * Requires access to strategy, account resources. * @param {String} strategyId strategy id * @returns {Promise<Array<CopyFactoryExternalSignal>>} */ getExternalSignals() { const opts = { url: `/users/current/strategies/${this._strategyId}/external-signals`, method: 'GET', headers: { 'auth-token': this._domainClient.token }, json: true }; return this._domainClient.requestSignal(opts, this._host, this._accountId); } /** * Updates external signal for a strategy or creates it if it does not exist. See * https://metaapi.cloud/docs/copyfactory/restApi/api/trading/updateExternalSignal/ * @param {String} signalId external signal id (should be 8 alphanumerical symbols) * @param {CopyFactoryExternalSignalUpdate} signal signal update payload * @return {Promise} promise which resolves when the external signal is updated */ updateExternalSignal(signalId, signal) { const opts = { url: `/users/current/strategies/${this._strategyId}/external-signals/${signalId}`, method: 'PUT', headers: { 'auth-token': this._domainClient.token }, data: signal, json: true }; return this._domainClient.requestSignal(opts, this._host, this._accountId); } /** * CopyFactory external signal remove payload * @typedef {Object} CopyFactoryExternalSignalRemove * @property {Date} time the time signal was removed (closed) at */ /** * Removes (closes) external signal for a strategy. See * https://metaapi.cloud/docs/copyfactory/restApi/api/trading/removeExternalSignal/ * @param {String} signalId external signal id * @param {CopyFactoryExternalSignalRemove} signal signal removal payload * @return {Promise} promise which resolves when the external signal is removed */ removeExternalSignal(signalId, signal) { const opts = { url: `/users/current/strategies/${this._strategyId}/external-signals/${signalId}/remove`, method: 'POST', headers: { 'auth-token': this._domainClient.token }, data: signal, json: true }; return this._domainClient.requestSignal(opts, this._host, this._accountId); } /** * Constructs CopyFactory strategy signal client instance * @param {string} accountId strategy provider id * @param {string} strategyId strategy id * @param {Object} host host data * @param {DomainClient} domainClient domain client */ constructor(accountId, strategyId, host, domainClient){ this._accountId = accountId; this._strategyId = strategyId; this._domainClient = domainClient; this._host = host; } }; /** * CopyFactory client for strategy signal requests */ export { StrategySignalClient as default }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmFuZG9tc3RyaW5nIGZyb20gJ3JhbmRvbXN0cmluZyc7XG5cbi8qKlxuICogQ29weUZhY3RvcnkgY2xpZW50IGZvciBzdHJhdGVneSBzaWduYWwgcmVxdWVzdHNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RyYXRlZ3lTaWduYWxDbGllbnQge1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIENvcHlGYWN0b3J5IHN0cmF0ZWd5IHNpZ25hbCBjbGllbnQgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFjY291bnRJZCBzdHJhdGVneSBwcm92aWRlciBpZFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyYXRlZ3lJZCBzdHJhdGVneSBpZFxuICAgKiBAcGFyYW0ge09iamVjdH0gaG9zdCBob3N0IGRhdGFcbiAgICogQHBhcmFtIHtEb21haW5DbGllbnR9IGRvbWFpbkNsaWVudCBkb21haW4gY2xpZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcihhY2NvdW50SWQsIHN0cmF0ZWd5SWQsIGhvc3QsIGRvbWFpbkNsaWVudCkge1xuICAgIHRoaXMuX2FjY291bnRJZCA9IGFjY291bnRJZDtcbiAgICB0aGlzLl9zdHJhdGVneUlkID0gc3RyYXRlZ3lJZDtcbiAgICB0aGlzLl9kb21haW5DbGllbnQgPSBkb21haW5DbGllbnQ7XG4gICAgdGhpcy5faG9zdCA9IGhvc3Q7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHJhbmRvbSBzaWduYWwgaWRcbiAgICogQHJldHVybiB7U3RyaW5nfSBzaWduYWwgaWRcbiAgICovXG4gIGdlbmVyYXRlU2lnbmFsSWQoKSB7XG4gICAgcmV0dXJuIHJhbmRvbXN0cmluZy5nZW5lcmF0ZSg4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5RmFjdG9yeSBleHRlcm5hbCBzaWduYWwgdXBkYXRlIHBheWxvYWRcbiAgICogQHR5cGVkZWYge09iamVjdH0gQ29weUZhY3RvcnlFeHRlcm5hbFNpZ25hbFVwZGF0ZVxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gc3ltYm9sIHRyYWRlIHN5bWJvbFxuICAgKiBAcHJvcGVydHkge1N0cmluZ30gdHlwZSB0cmFkZSB0eXBlIChvbmUgb2YgUE9TSVRJT05fVFlQRV9CVVksIFBPU0lUSU9OX1RZUEVfU0VMTCwgT1JERVJfVFlQRV9CVVlfTElNSVQsIE9SREVSX1RZUEVfU0VMTF9MSU1JVCwgXG4gICAqIE9SREVSX1RZUEVfQlVZX1NUT1AsIE9SREVSX1RZUEVfU0VMTF9TVE9QKVxuICAgKiBAcHJvcGVydHkge0RhdGV9IHRpbWUgdGltZSB0aGUgc2lnbmFsIHdhcyBlbWl0dGVkIGF0XG4gICAqIEBwcm9wZXJ0eSB7RGF0ZX0gW3VwZGF0ZVRpbWVdIGxhc3QgdGltZSBvZiB0aGUgc2lnbmFsIHVwZGF0ZVxuICAgKiBAcHJvcGVydHkge051bWJlcn0gdm9sdW1lIHZvbHVtZSB0cmFkZWRcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFttYWdpY10gZXhwZXJ0IGFkdmlzb3IgaWRcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtzdG9wTG9zc10gc3RvcCBsb3NzIHByaWNlXG4gICAqIEBwcm9wZXJ0eSB7TnVtYmVyfSBbdGFrZVByb2ZpdF0gdGFrZSBwcm9maXQgcHJpY2VcbiAgICogQHByb3BlcnR5IHtOdW1iZXJ9IFtvcGVuUHJpY2VdIHBlbmRpbmcgb3JkZXIgb3BlbiBwcmljZVxuICAgKi9cblxuICAvKipcbiAgICogQ29weUZhY3RvcnkgZXh0ZXJuYWwgc2lnbmFsXG4gICAqIEB0eXBlZGVmIHtDb3B5RmFjdG9yeUV4dGVybmFsU2lnbmFsVXBkYXRlfSBDb3B5RmFjdG9yeUV4dGVybmFsU2lnbmFsXG4gICAqIEBwcm9wZXJ0eSB7U3RyaW5nfSBpZCBleHRlcm5hbCBzaWduYWwgaWRcbiAgICovXG5cbiAgLyoqXG4gICAqIENvcHlGYWN0b3J5IGV4dGVybmFsIHNpZ25hbCByZW1vdmUgcGF5bG9hZFxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDb3B5RmFjdG9yeUV4dGVybmFsU2lnbmFsUmVtb3ZlXG4gICAqIEBwcm9wZXJ0eSB7RGF0ZX0gdGltZSB0aGUgdGltZSBzaWduYWwgd2FzIHJlbW92ZWQgKGNsb3NlZCkgYXRcbiAgICovXG5cbiAgLyoqXG4gICAqIFJldHVybnMgYWN0aXZlIGV4dGVybmFsIHNpZ25hbHMgb2YgYSBzdHJhdGVneS4gUmVxdWlyZXMgYWNjZXNzIHRvXG4gICAqIGNvcHlmYWN0b3J5LWFwaTpyZXN0OnB1YmxpYzpleHRlcm5hbC1zaWduYWxzOmdldFNpZ25hbHMgbWV0aG9kIHdoaWNoIGlzIGluY2x1ZGVkIGludG8gcmVhZGVyIHJvbGUuXG4gICAqIFJlcXVpcmVzIGFjY2VzcyB0byBzdHJhdGVneSwgYWNjb3VudCByZXNvdXJjZXMuXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzdHJhdGVneUlkIHN0cmF0ZWd5IGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFycmF5PENvcHlGYWN0b3J5RXh0ZXJuYWxTaWduYWw+Pn1cbiAgICovXG4gIGdldEV4dGVybmFsU2lnbmFscygpIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgL3VzZXJzL2N1cnJlbnQvc3RyYXRlZ2llcy8ke3RoaXMuX3N0cmF0ZWd5SWR9L2V4dGVybmFsLXNpZ25hbHNgLFxuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl9kb21haW5DbGllbnQudG9rZW5cbiAgICAgIH0sXG4gICAgICBqc29uOiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9kb21haW5DbGllbnQucmVxdWVzdFNpZ25hbChvcHRzLCB0aGlzLl9ob3N0LCB0aGlzLl9hY2NvdW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgZXh0ZXJuYWwgc2lnbmFsIGZvciBhIHN0cmF0ZWd5IG9yIGNyZWF0ZXMgaXQgaWYgaXQgZG9lcyBub3QgZXhpc3QuIFNlZVxuICAgKiBodHRwczovL21ldGFhcGkuY2xvdWQvZG9jcy9jb3B5ZmFjdG9yeS9yZXN0QXBpL2FwaS90cmFkaW5nL3VwZGF0ZUV4dGVybmFsU2lnbmFsL1xuICAgKiBAcGFyYW0ge1N0cmluZ30gc2lnbmFsSWQgZXh0ZXJuYWwgc2lnbmFsIGlkIChzaG91bGQgYmUgOCBhbHBoYW51bWVyaWNhbCBzeW1ib2xzKVxuICAgKiBAcGFyYW0ge0NvcHlGYWN0b3J5RXh0ZXJuYWxTaWduYWxVcGRhdGV9IHNpZ25hbCBzaWduYWwgdXBkYXRlIHBheWxvYWRcbiAgICogQHJldHVybiB7UHJvbWlzZX0gcHJvbWlzZSB3aGljaCByZXNvbHZlcyB3aGVuIHRoZSBleHRlcm5hbCBzaWduYWwgaXMgdXBkYXRlZFxuICAgKi9cbiAgdXBkYXRlRXh0ZXJuYWxTaWduYWwoc2lnbmFsSWQsIHNpZ25hbCkge1xuICAgIGNvbnN0IG9wdHMgPSB7XG4gICAgICB1cmw6IGAvdXNlcnMvY3VycmVudC9zdHJhdGVnaWVzLyR7dGhpcy5fc3RyYXRlZ3lJZH0vZXh0ZXJuYWwtc2lnbmFscy8ke3NpZ25hbElkfWAsXG4gICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnYXV0aC10b2tlbic6IHRoaXMuX2RvbWFpbkNsaWVudC50b2tlblxuICAgICAgfSxcbiAgICAgIGRhdGE6IHNpZ25hbCxcbiAgICAgIGpzb246IHRydWVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9kb21haW5DbGllbnQucmVxdWVzdFNpZ25hbChvcHRzLCB0aGlzLl9ob3N0LCB0aGlzLl9hY2NvdW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHlGYWN0b3J5IGV4dGVybmFsIHNpZ25hbCByZW1vdmUgcGF5bG9hZFxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBDb3B5RmFjdG9yeUV4dGVybmFsU2lnbmFsUmVtb3ZlXG4gICAqIEBwcm9wZXJ0eSB7RGF0ZX0gdGltZSB0aGUgdGltZSBzaWduYWwgd2FzIHJlbW92ZWQgKGNsb3NlZCkgYXRcbiAgICovXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgKGNsb3NlcykgZXh0ZXJuYWwgc2lnbmFsIGZvciBhIHN0cmF0ZWd5LiBTZWVcbiAgICogaHR0cHM6Ly9tZXRhYXBpLmNsb3VkL2RvY3MvY29weWZhY3RvcnkvcmVzdEFwaS9hcGkvdHJhZGluZy9yZW1vdmVFeHRlcm5hbFNpZ25hbC9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHNpZ25hbElkIGV4dGVybmFsIHNpZ25hbCBpZFxuICAgKiBAcGFyYW0ge0NvcHlGYWN0b3J5RXh0ZXJuYWxTaWduYWxSZW1vdmV9IHNpZ25hbCBzaWduYWwgcmVtb3ZhbCBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZXJuYWwgc2lnbmFsIGlzIHJlbW92ZWRcbiAgICovXG4gIHJlbW92ZUV4dGVybmFsU2lnbmFsKHNpZ25hbElkLCBzaWduYWwpIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgL3VzZXJzL2N1cnJlbnQvc3RyYXRlZ2llcy8ke3RoaXMuX3N0cmF0ZWd5SWR9L2V4dGVybmFsLXNpZ25hbHMvJHtzaWduYWxJZH0vcmVtb3ZlYCxcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnYXV0aC10b2tlbic6IHRoaXMuX2RvbWFpbkNsaWVudC50b2tlblxuICAgICAgfSxcbiAgICAgIGRhdGE6IHNpZ25hbCxcbiAgICAgIGpzb246IHRydWVcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLl9kb21haW5DbGllbnQucmVxdWVzdFNpZ25hbChvcHRzLCB0aGlzLl9ob3N0LCB0aGlzLl9hY2NvdW50SWQpO1xuICB9XG5cbn0iXSwibmFtZXMiOlsicmFuZG9tc3RyaW5nIiwiU3RyYXRlZ3lTaWduYWxDbGllbnQiLCJnZW5lcmF0ZVNpZ25hbElkIiwiZ2VuZXJhdGUiLCJnZXRFeHRlcm5hbFNpZ25hbHMiLCJvcHRzIiwidXJsIiwiX3N0cmF0ZWd5SWQiLCJtZXRob2QiLCJoZWFkZXJzIiwiX2RvbWFpbkNsaWVudCIsInRva2VuIiwianNvbiIsInJlcXVlc3RTaWduYWwiLCJfaG9zdCIsIl9hY2NvdW50SWQiLCJ1cGRhdGVFeHRlcm5hbFNpZ25hbCIsInNpZ25hbElkIiwic2lnbmFsIiwiZGF0YSIsInJlbW92ZUV4dGVybmFsU2lnbmFsIiwiY29uc3RydWN0b3IiLCJhY2NvdW50SWQiLCJzdHJhdGVneUlkIiwiaG9zdCIsImRvbWFpbkNsaWVudCJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0Esa0JBQWtCLGVBQWU7QUFLekIsSUFBQSxBQUFNQyx1QkFBTixNQUFNQTtJQWdCbkI7OztHQUdDLEdBQ0RDLG1CQUFtQjtRQUNqQixPQUFPRixhQUFhRyxRQUFRLENBQUM7SUFDL0I7SUFFQTs7Ozs7Ozs7Ozs7OztHQWFDLEdBRUQ7Ozs7R0FJQyxHQUVEOzs7O0dBSUMsR0FFRDs7Ozs7O0dBTUMsR0FDREMscUJBQXFCO1FBQ25CLE1BQU1DLE9BQU87WUFDWEMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQ0MsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1lBQ3JFQyxRQUFRO1lBQ1JDLFNBQVM7Z0JBQ1AsY0FBYyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0MsS0FBSztZQUN4QztZQUNBQyxNQUFNLElBQUk7UUFDWjtRQUVBLE9BQU8sSUFBSSxDQUFDRixhQUFhLENBQUNHLGFBQWEsQ0FBQ1IsTUFBTSxJQUFJLENBQUNTLEtBQUssRUFBRSxJQUFJLENBQUNDLFVBQVU7SUFDM0U7SUFFQTs7Ozs7O0dBTUMsR0FDREMscUJBQXFCQyxRQUFRLEVBQUVDLE1BQU0sRUFBRTtRQUNyQyxNQUFNYixPQUFPO1lBQ1hDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUNDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRVUsU0FBUyxDQUFDO1lBQ2pGVCxRQUFRO1lBQ1JDLFNBQVM7Z0JBQ1AsY0FBYyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0MsS0FBSztZQUN4QztZQUNBUSxNQUFNRDtZQUNOTixNQUFNLElBQUk7UUFDWjtRQUNBLE9BQU8sSUFBSSxDQUFDRixhQUFhLENBQUNHLGFBQWEsQ0FBQ1IsTUFBTSxJQUFJLENBQUNTLEtBQUssRUFBRSxJQUFJLENBQUNDLFVBQVU7SUFDM0U7SUFFQTs7OztHQUlDLEdBRUQ7Ozs7OztHQU1DLEdBQ0RLLHFCQUFxQkgsUUFBUSxFQUFFQyxNQUFNLEVBQUU7UUFDckMsTUFBTWIsT0FBTztZQUNYQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDQyxXQUFXLENBQUMsa0JBQWtCLEVBQUVVLFNBQVMsT0FBTyxDQUFDO1lBQ3hGVCxRQUFRO1lBQ1JDLFNBQVM7Z0JBQ1AsY0FBYyxJQUFJLENBQUNDLGFBQWEsQ0FBQ0MsS0FBSztZQUN4QztZQUNBUSxNQUFNRDtZQUNOTixNQUFNLElBQUk7UUFDWjtRQUNBLE9BQU8sSUFBSSxDQUFDRixhQUFhLENBQUNHLGFBQWEsQ0FBQ1IsTUFBTSxJQUFJLENBQUNTLEtBQUssRUFBRSxJQUFJLENBQUNDLFVBQVU7SUFDM0U7SUFqSEE7Ozs7OztHQU1DLEdBQ0RNLFlBQVlDLFNBQVMsRUFBRUMsVUFBVSxFQUFFQyxJQUFJLEVBQUVDLFlBQVksQ0FBRTtRQUNyRCxJQUFJLENBQUNWLFVBQVUsR0FBR087UUFDbEIsSUFBSSxDQUFDZixXQUFXLEdBQUdnQjtRQUNuQixJQUFJLENBQUNiLGFBQWEsR0FBR2U7UUFDckIsSUFBSSxDQUFDWCxLQUFLLEdBQUdVO0lBQ2Y7QUF1R0Y7QUF4SEE7O0NBRUMsR0FDRCxTQUFxQnZCLGtDQXFIcEIifQ==