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.5 kB
JavaScript
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. 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+Pn1cbiAgICovXG4gIGdldEV4dGVybmFsU2lnbmFscygpIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgL3VzZXJzL2N1cnJlbnQvc3RyYXRlZ2llcy8ke3RoaXMuX3N0cmF0ZWd5SWR9L2V4dGVybmFsLXNpZ25hbHNgLFxuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl9kb21haW5DbGllbnQudG9rZW5cbiAgICAgIH0sXG4gICAgICBqc29uOiB0cnVlXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLl9kb21haW5DbGllbnQucmVxdWVzdFNpZ25hbChvcHRzLCB0aGlzLl9ob3N0LCB0aGlzLl9hY2NvdW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgZXh0ZXJuYWwgc2lnbmFsIGZvciBhIHN0cmF0ZWd5LiBTZWVcbiAgICogaHR0cHM6Ly9tZXRhYXBpLmNsb3VkL2RvY3MvY29weWZhY3RvcnkvcmVzdEFwaS9hcGkvdHJhZGluZy91cGRhdGVFeHRlcm5hbFNpZ25hbC9cbiAgICogQHBhcmFtIHtTdHJpbmd9IHNpZ25hbElkIGV4dGVybmFsIHNpZ25hbCBpZCAoc2hvdWxkIGJlIDggYWxwaGFudW1lcmljYWwgc3ltYm9scylcbiAgICogQHBhcmFtIHtDb3B5RmFjdG9yeUV4dGVybmFsU2lnbmFsVXBkYXRlfSBzaWduYWwgc2lnbmFsIHVwZGF0ZSBwYXlsb2FkXG4gICAqIEByZXR1cm4ge1Byb21pc2V9IHByb21pc2Ugd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZXJuYWwgc2lnbmFsIGlzIHVwZGF0ZWRcbiAgICovXG4gIHVwZGF0ZUV4dGVybmFsU2lnbmFsKHNpZ25hbElkLCBzaWduYWwpIHtcbiAgICBjb25zdCBvcHRzID0ge1xuICAgICAgdXJsOiBgL3VzZXJzL2N1cnJlbnQvc3RyYXRlZ2llcy8ke3RoaXMuX3N0cmF0ZWd5SWR9L2V4dGVybmFsLXNpZ25hbHMvJHtzaWduYWxJZH1gLFxuICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl9kb21haW5DbGllbnQudG9rZW5cbiAgICAgIH0sXG4gICAgICBkYXRhOiBzaWduYWwsXG4gICAgICBqc29uOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluQ2xpZW50LnJlcXVlc3RTaWduYWwob3B0cywgdGhpcy5faG9zdCwgdGhpcy5fYWNjb3VudElkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5RmFjdG9yeSBleHRlcm5hbCBzaWduYWwgcmVtb3ZlIHBheWxvYWRcbiAgICogQHR5cGVkZWYge09iamVjdH0gQ29weUZhY3RvcnlFeHRlcm5hbFNpZ25hbFJlbW92ZVxuICAgKiBAcHJvcGVydHkge0RhdGV9IHRpbWUgdGhlIHRpbWUgc2lnbmFsIHdhcyByZW1vdmVkIChjbG9zZWQpIGF0XG4gICAqL1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIChjbG9zZXMpIGV4dGVybmFsIHNpZ25hbCBmb3IgYSBzdHJhdGVneS4gU2VlXG4gICAqIGh0dHBzOi8vbWV0YWFwaS5jbG91ZC9kb2NzL2NvcHlmYWN0b3J5L3Jlc3RBcGkvYXBpL3RyYWRpbmcvcmVtb3ZlRXh0ZXJuYWxTaWduYWwvXG4gICAqIEBwYXJhbSB7U3RyaW5nfSBzaWduYWxJZCBleHRlcm5hbCBzaWduYWwgaWRcbiAgICogQHBhcmFtIHtDb3B5RmFjdG9yeUV4dGVybmFsU2lnbmFsUmVtb3ZlfSBzaWduYWwgc2lnbmFsIHJlbW92YWwgcGF5bG9hZFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfSBwcm9taXNlIHdoaWNoIHJlc29sdmVzIHdoZW4gdGhlIGV4dGVybmFsIHNpZ25hbCBpcyByZW1vdmVkXG4gICAqL1xuICByZW1vdmVFeHRlcm5hbFNpZ25hbChzaWduYWxJZCwgc2lnbmFsKSB7XG4gICAgY29uc3Qgb3B0cyA9IHtcbiAgICAgIHVybDogYC91c2Vycy9jdXJyZW50L3N0cmF0ZWdpZXMvJHt0aGlzLl9zdHJhdGVneUlkfS9leHRlcm5hbC1zaWduYWxzLyR7c2lnbmFsSWR9L3JlbW92ZWAsXG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgJ2F1dGgtdG9rZW4nOiB0aGlzLl9kb21haW5DbGllbnQudG9rZW5cbiAgICAgIH0sXG4gICAgICBkYXRhOiBzaWduYWwsXG4gICAgICBqc29uOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5fZG9tYWluQ2xpZW50LnJlcXVlc3RTaWduYWwob3B0cywgdGhpcy5faG9zdCwgdGhpcy5fYWNjb3VudElkKTtcbiAgfVxuXG59Il0sIm5hbWVzIjpbInJhbmRvbXN0cmluZyIsIlN0cmF0ZWd5U2lnbmFsQ2xpZW50IiwiZ2VuZXJhdGVTaWduYWxJZCIsImdlbmVyYXRlIiwiZ2V0RXh0ZXJuYWxTaWduYWxzIiwib3B0cyIsInVybCIsIl9zdHJhdGVneUlkIiwibWV0aG9kIiwiaGVhZGVycyIsIl9kb21haW5DbGllbnQiLCJ0b2tlbiIsImpzb24iLCJyZXF1ZXN0U2lnbmFsIiwiX2hvc3QiLCJfYWNjb3VudElkIiwidXBkYXRlRXh0ZXJuYWxTaWduYWwiLCJzaWduYWxJZCIsInNpZ25hbCIsImRhdGEiLCJyZW1vdmVFeHRlcm5hbFNpZ25hbCIsImNvbnN0cnVjdG9yIiwiYWNjb3VudElkIiwic3RyYXRlZ3lJZCIsImhvc3QiLCJkb21haW5DbGllbnQiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLGtCQUFrQixlQUFlO0FBS3pCLElBQUEsQUFBTUMsdUJBQU4sTUFBTUE7SUFnQm5COzs7R0FHQyxHQUNEQyxtQkFBbUI7UUFDakIsT0FBT0YsYUFBYUcsUUFBUSxDQUFDO0lBQy9CO0lBRUE7Ozs7Ozs7Ozs7Ozs7R0FhQyxHQUVEOzs7O0dBSUMsR0FFRDs7OztHQUlDLEdBRUQ7Ozs7OztHQU1DLEdBQ0RDLHFCQUFxQjtRQUNuQixNQUFNQyxPQUFPO1lBQ1hDLEtBQUssQ0FBQywwQkFBMEIsRUFBRSxJQUFJLENBQUNDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQztZQUNyRUMsUUFBUTtZQUNSQyxTQUFTO2dCQUNQLGNBQWMsSUFBSSxDQUFDQyxhQUFhLENBQUNDLEtBQUs7WUFDeEM7WUFDQUMsTUFBTSxJQUFJO1FBQ1o7UUFFQSxPQUFPLElBQUksQ0FBQ0YsYUFBYSxDQUFDRyxhQUFhLENBQUNSLE1BQU0sSUFBSSxDQUFDUyxLQUFLLEVBQUUsSUFBSSxDQUFDQyxVQUFVO0lBQzNFO0lBRUE7Ozs7OztHQU1DLEdBQ0RDLHFCQUFxQkMsUUFBUSxFQUFFQyxNQUFNLEVBQUU7UUFDckMsTUFBTWIsT0FBTztZQUNYQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsSUFBSSxDQUFDQyxXQUFXLENBQUMsa0JBQWtCLEVBQUVVLFNBQVMsQ0FBQztZQUNqRlQsUUFBUTtZQUNSQyxTQUFTO2dCQUNQLGNBQWMsSUFBSSxDQUFDQyxhQUFhLENBQUNDLEtBQUs7WUFDeEM7WUFDQVEsTUFBTUQ7WUFDTk4sTUFBTSxJQUFJO1FBQ1o7UUFDQSxPQUFPLElBQUksQ0FBQ0YsYUFBYSxDQUFDRyxhQUFhLENBQUNSLE1BQU0sSUFBSSxDQUFDUyxLQUFLLEVBQUUsSUFBSSxDQUFDQyxVQUFVO0lBQzNFO0lBRUE7Ozs7R0FJQyxHQUVEOzs7Ozs7R0FNQyxHQUNESyxxQkFBcUJILFFBQVEsRUFBRUMsTUFBTSxFQUFFO1FBQ3JDLE1BQU1iLE9BQU87WUFDWEMsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQ0MsV0FBVyxDQUFDLGtCQUFrQixFQUFFVSxTQUFTLE9BQU8sQ0FBQztZQUN4RlQsUUFBUTtZQUNSQyxTQUFTO2dCQUNQLGNBQWMsSUFBSSxDQUFDQyxhQUFhLENBQUNDLEtBQUs7WUFDeEM7WUFDQVEsTUFBTUQ7WUFDTk4sTUFBTSxJQUFJO1FBQ1o7UUFDQSxPQUFPLElBQUksQ0FBQ0YsYUFBYSxDQUFDRyxhQUFhLENBQUNSLE1BQU0sSUFBSSxDQUFDUyxLQUFLLEVBQUUsSUFBSSxDQUFDQyxVQUFVO0lBQzNFO0lBakhBOzs7Ozs7R0FNQyxHQUNETSxZQUFZQyxTQUFTLEVBQUVDLFVBQVUsRUFBRUMsSUFBSSxFQUFFQyxZQUFZLENBQUU7UUFDckQsSUFBSSxDQUFDVixVQUFVLEdBQUdPO1FBQ2xCLElBQUksQ0FBQ2YsV0FBVyxHQUFHZ0I7UUFDbkIsSUFBSSxDQUFDYixhQUFhLEdBQUdlO1FBQ3JCLElBQUksQ0FBQ1gsS0FBSyxHQUFHVTtJQUNmO0FBdUdGO0FBeEhBOztDQUVDLEdBQ0QsU0FBcUJ2QixrQ0FxSHBCIn0=