metaapi.cloud-sdk
Version:
SDK for MetaApi, a professional cloud forex API which includes MetaTrader REST API and MetaTrader websocket API. Supports both MetaTrader 5 (MT5) and MetaTrader 4 (MT4). CopyFactory copy trading API included. (https://metaapi.cloud)
184 lines (183 loc) • 18.2 kB
JavaScript
/* jscs:disable */ /* eslint-disable */ "use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "default", {
enumerable: true,
get: function() {
return _default;
}
});
function createNewNode_(key) {
return {
key: key,
weight: 1,
height: 0,
left: null,
right: null
};
}
var comparer_ = function(a, b) {
if (a < b) return -1;
if (a > b) return 1;
return 0;
};
function height_(p) {
return p ? p.height : 0;
}
function weight_(p) {
return p ? p.weight : 0;
}
function bFactor_(p) {
return height_(p.right) - height_(p.left);
}
function countHeightAndWeight_(p) {
var hl = height_(p.left);
var hr = height_(p.right);
p.height = (hl > hr ? hl : hr) + 1;
var wl = weight_(p.left);
var wr = weight_(p.right);
p.weight = wl + wr + 1;
}
function rotateRight_(p) {
var q = p.left;
p.left = q.right;
q.right = p;
countHeightAndWeight_(p);
countHeightAndWeight_(q);
return q;
}
function rotateLeft_(q) {
var p = q.right;
q.right = p.left;
p.left = q;
countHeightAndWeight_(q);
countHeightAndWeight_(p);
return p;
}
function balance_(p) {
countHeightAndWeight_(p);
if (bFactor_(p) === 2) {
if (bFactor_(p.right) < 0) p.right = rotateRight_(p.right);
return rotateLeft_(p);
}
if (bFactor_(p) === -2) {
if (bFactor_(p.left) > 0) p.left = rotateLeft_(p.left);
return rotateRight_(p);
}
return p;
}
function count_(p, k) {
return upperBound_(p, k) - lowerBound_(p, k);
}
function at_(p, k) {
if (!p) return null;
var wl = weight_(p.left);
if (wl <= k && k < wl + 1) return p.key;
else if (k < wl) return at_(p.left, k);
else return at_(p.right, k - wl - 1);
}
function getMinimum_(p) {
if (!p) return null;
return p.left ? getMinimum_(p.left) : p;
}
function getMaximum_(p) {
if (!p) return null;
return p.right ? getMaximum_(p.right) : p;
}
function removeMinimun_(p) {
if (!p.left) return p.right;
p.left = removeMinimun_(p.left);
return balance_(p);
}
function toArray_(p) {
var arr = [];
if (p.left) arr = arr.concat(toArray_(p.left));
arr.push(p.key);
if (p.right) arr = arr.concat(toArray_(p.right));
return arr;
}
var AVLTree = function(comparer) {
if (!comparer) comparer = comparer_;
var AVL = {
root: null,
comparer_: comparer,
size: function() {
return weight_(AVL.root);
},
min: function() {
var p = getMinimum_(AVL.root);
if (p) return p.key;
return null;
},
max: function() {
var p = getMaximum_(AVL.root);
if (p) return p.key;
return null;
},
lowerBound: function(k) {
return AVL.lowerBound_(AVL.root, k);
},
lowerBound_ (p, k) {
if (!p) return 0;
var cmp = AVL.comparer_(k, p.key);
if (cmp <= 0) return AVL.lowerBound_(p.left, k);
else if (cmp > 0) return weight_(p.left) + AVL.lowerBound_(p.right, k) + 1;
},
upperBound: function(k) {
return AVL.upperBound_(AVL.root, k);
},
upperBound_ (p, k) {
if (!p) return 0;
var cmp = AVL.comparer_(k, p.key);
if (cmp < 0) return AVL.upperBound_(p.left, k);
else if (cmp >= 0) return weight_(p.left) + AVL.upperBound_(p.right, k) + 1;
},
count: function(k) {
return count_(AVL.root, k);
},
at: function(k) {
return at_(AVL.root, k);
},
insert: function(k) {
AVL.root = AVL.insert_(AVL.root, k);
},
insert_ (p, k) {
if (!p) return createNewNode_(k);
var cmp = AVL.comparer_(k, p.key);
if (cmp < 0) p.left = AVL.insert_(p.left, k);
else if (cmp >= 0) p.right = AVL.insert_(p.right, k);
return balance_(p);
},
remove: function(k) {
AVL.root = AVL.remove_(AVL.root, k);
},
remove_ (p, k) {
if (!p) return null;
var cmp = AVL.comparer_(k, p.key);
if (cmp < 0) p.left = AVL.remove_(p.left, k);
else if (cmp > 0) p.right = AVL.remove_(p.right, k);
else {
var q = p.left;
var r = p.right;
if (!r) return q;
var min = getMinimum_(r);
min.right = removeMinimun_(r);
min.left = q;
return balance_(min);
}
return balance_(p);
},
removeAt: function(k) {
var val = AVL.at(k);
AVL.root = AVL.remove_(AVL.root, val);
},
toArray: function() {
if (AVL.root === null) return [];
return toArray_(AVL.root);
}
};
return AVL;
};
const _default = AVLTree;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIjxhbm9uPiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBqc2NzOmRpc2FibGUgKi9cbi8qIGVzbGludC1kaXNhYmxlICovXG5cbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gY3JlYXRlTmV3Tm9kZV8oa2V5KSB7XG4gIHJldHVybiB7XG4gICAga2V5OiBrZXksXG4gICAgd2VpZ2h0OiAxLFxuICAgIGhlaWdodDogMCxcbiAgICBsZWZ0OiBudWxsLFxuICAgIHJpZ2h0OiBudWxsXG4gIH07XG59XG5cbnZhciBjb21wYXJlcl8gPSBmdW5jdGlvbihhLCBiKSB7XG4gIGlmIChhIDwgYikgcmV0dXJuIC0xO1xuICBpZiAoYSA+IGIpIHJldHVybiAxO1xuICByZXR1cm4gMDtcbn1cblxuZnVuY3Rpb24gaGVpZ2h0XyhwKSB7XG4gIHJldHVybiBwID8gcC5oZWlnaHQgOiAwO1xufVxuXG5mdW5jdGlvbiB3ZWlnaHRfKHApIHtcbiAgcmV0dXJuIHAgPyBwLndlaWdodCA6IDA7XG59XG5cbmZ1bmN0aW9uIGJGYWN0b3JfKHApIHtcbiAgcmV0dXJuIGhlaWdodF8ocC5yaWdodCkgLSBoZWlnaHRfKHAubGVmdCk7XG59XG5cbmZ1bmN0aW9uIGNvdW50SGVpZ2h0QW5kV2VpZ2h0XyhwKSB7XG4gIHZhciBobCA9IGhlaWdodF8ocC5sZWZ0KTtcbiAgdmFyIGhyID0gaGVpZ2h0XyhwLnJpZ2h0KTtcbiAgcC5oZWlnaHQgPSAoaGwgPiBociA/IGhsIDogaHIpICsgMTtcblxuICB2YXIgd2wgPSB3ZWlnaHRfKHAubGVmdCk7XG4gIHZhciB3ciA9IHdlaWdodF8ocC5yaWdodCk7XG4gIHAud2VpZ2h0ID0gd2wgKyB3ciArIDE7XG59XG5cbmZ1bmN0aW9uIHJvdGF0ZVJpZ2h0XyhwKSB7XG4gIHZhciBxID0gcC5sZWZ0O1xuICBwLmxlZnQgPSBxLnJpZ2h0O1xuICBxLnJpZ2h0ID0gcDtcbiAgY291bnRIZWlnaHRBbmRXZWlnaHRfKHApO1xuICBjb3VudEhlaWdodEFuZFdlaWdodF8ocSk7XG4gIHJldHVybiBxO1xufVxuXG5mdW5jdGlvbiByb3RhdGVMZWZ0XyhxKSB7XG4gIHZhciBwID0gcS5yaWdodDtcbiAgcS5yaWdodCA9IHAubGVmdDtcbiAgcC5sZWZ0ID0gcTtcbiAgY291bnRIZWlnaHRBbmRXZWlnaHRfKHEpO1xuICBjb3VudEhlaWdodEFuZFdlaWdodF8ocCk7XG4gIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiBiYWxhbmNlXyhwKSB7XG4gIGNvdW50SGVpZ2h0QW5kV2VpZ2h0XyhwKTtcbiAgaWYgKGJGYWN0b3JfKHApID09PSAyKSB7XG4gICAgaWYgKGJGYWN0b3JfKHAucmlnaHQpIDwgMClcbiAgICAgIHAucmlnaHQgPSByb3RhdGVSaWdodF8ocC5yaWdodCk7XG4gICAgcmV0dXJuIHJvdGF0ZUxlZnRfKHApO1xuICB9XG4gIGlmIChiRmFjdG9yXyhwKSA9PT0gLTIpIHtcbiAgICBpZiAoYkZhY3Rvcl8ocC5sZWZ0KSA+IDApXG4gICAgICBwLmxlZnQgPSByb3RhdGVMZWZ0XyhwLmxlZnQpO1xuICAgIHJldHVybiByb3RhdGVSaWdodF8ocCk7XG4gIH1cbiAgcmV0dXJuIHA7XG59XG5cbmZ1bmN0aW9uIGNvdW50XyhwLCBrKSB7XG4gIHJldHVybiB1cHBlckJvdW5kXyhwLCBrKSAtIGxvd2VyQm91bmRfKHAsIGspO1xufVxuXG5mdW5jdGlvbiBhdF8ocCwgaykge1xuICBpZiAoIXApIHJldHVybiBudWxsO1xuICB2YXIgd2wgPSB3ZWlnaHRfKHAubGVmdCk7XG4gIGlmICh3bCA8PSBrICYmIGsgPCB3bCArIDEpIHJldHVybiBwLmtleTtcbiAgZWxzZSBpZiAoayA8IHdsKSByZXR1cm4gYXRfKHAubGVmdCwgayk7XG4gIGVsc2UgcmV0dXJuIGF0XyhwLnJpZ2h0LCBrIC0gd2wgLSAxKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWluaW11bV8ocCkge1xuICBpZiAoIXApIHJldHVybiBudWxsO1xuICByZXR1cm4gcC5sZWZ0ID8gZ2V0TWluaW11bV8ocC5sZWZ0KSA6IHA7XG59XG5cbmZ1bmN0aW9uIGdldE1heGltdW1fKHApIHtcbiAgaWYgKCFwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHAucmlnaHQgPyBnZXRNYXhpbXVtXyhwLnJpZ2h0KSA6IHA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZU1pbmltdW5fKHApIHtcbiAgaWYgKCFwLmxlZnQpIHJldHVybiBwLnJpZ2h0O1xuICBwLmxlZnQgPSByZW1vdmVNaW5pbXVuXyhwLmxlZnQpO1xuICByZXR1cm4gYmFsYW5jZV8ocCk7XG59XG5cbmZ1bmN0aW9uIHRvQXJyYXlfKHApIHtcbiAgdmFyIGFyciA9IFtdO1xuICBpZiAocC5sZWZ0KSBhcnIgPSBhcnIuY29uY2F0KHRvQXJyYXlfKHAubGVmdCkpO1xuICBhcnIucHVzaChwLmtleSk7XG4gIGlmIChwLnJpZ2h0KSBhcnIgPSBhcnIuY29uY2F0KHRvQXJyYXlfKHAucmlnaHQpKTtcbiAgcmV0dXJuIGFycjtcbn1cblxudmFyIEFWTFRyZWUgPSBmdW5jdGlvbihjb21wYXJlcikge1xuICBpZiAoIWNvbXBhcmVyKSBjb21wYXJlciA9IGNvbXBhcmVyXztcbiAgdmFyIEFWTCA9IHtcbiAgICByb290OiBudWxsLFxuICAgIGNvbXBhcmVyXzogY29tcGFyZXIsXG5cbiAgICBzaXplOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB3ZWlnaHRfKEFWTC5yb290KTtcbiAgICB9LFxuXG4gICAgbWluOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwID0gZ2V0TWluaW11bV8oQVZMLnJvb3QpO1xuICAgICAgaWYgKHApIHJldHVybiBwLmtleTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG5cbiAgICBtYXg6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHAgPSBnZXRNYXhpbXVtXyhBVkwucm9vdCk7XG4gICAgICBpZiAocCkgcmV0dXJuIHAua2V5O1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIGxvd2VyQm91bmQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgIHJldHVybiBBVkwubG93ZXJCb3VuZF8oQVZMLnJvb3QsIGspO1xuICAgIH0sXG4gICAgbG93ZXJCb3VuZF8ocCwgaykge1xuICAgICAgaWYgKCFwKSByZXR1cm4gMDtcbiAgICAgIHZhciBjbXAgPSBBVkwuY29tcGFyZXJfKGssIHAua2V5KTtcblxuICAgICAgaWYgKGNtcCA8PSAwKSByZXR1cm4gQVZMLmxvd2VyQm91bmRfKHAubGVmdCwgayk7XG4gICAgICBlbHNlIGlmIChjbXAgPiAwKSByZXR1cm4gd2VpZ2h0XyhwLmxlZnQpICsgQVZMLmxvd2VyQm91bmRfKHAucmlnaHQsIGspICsgMTtcbiAgICB9LFxuXG4gICAgdXBwZXJCb3VuZDogZnVuY3Rpb24oaykge1xuICAgICAgcmV0dXJuIEFWTC51cHBlckJvdW5kXyhBVkwucm9vdCwgayk7XG4gICAgfSxcblxuICAgIHVwcGVyQm91bmRfKHAsIGspIHtcbiAgICAgIGlmICghcCkgcmV0dXJuIDA7XG4gICAgICB2YXIgY21wID0gQVZMLmNvbXBhcmVyXyhrLCBwLmtleSk7XG5cbiAgICAgIGlmIChjbXAgPCAwKSByZXR1cm4gQVZMLnVwcGVyQm91bmRfKHAubGVmdCwgayk7XG4gICAgICBlbHNlIGlmIChjbXAgPj0gMCkgcmV0dXJuIHdlaWdodF8ocC5sZWZ0KSArIEFWTC51cHBlckJvdW5kXyhwLnJpZ2h0LCBrKSArIDE7XG4gICAgfSxcblxuICAgIGNvdW50OiBmdW5jdGlvbihrKSB7XG4gICAgICByZXR1cm4gY291bnRfKEFWTC5yb290LCBrKTtcbiAgICB9LFxuXG4gICAgYXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgIHJldHVybiBhdF8oQVZMLnJvb3QsIGspO1xuICAgIH0sXG5cbiAgICBpbnNlcnQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgIEFWTC5yb290ID0gQVZMLmluc2VydF8oQVZMLnJvb3QsIGspO1xuICAgIH0sXG5cbiAgICBpbnNlcnRfKHAsIGspIHtcbiAgICAgIGlmICghcCkgcmV0dXJuIGNyZWF0ZU5ld05vZGVfKGspO1xuICAgICAgdmFyIGNtcCA9IEFWTC5jb21wYXJlcl8oaywgcC5rZXkpO1xuXG4gICAgICBpZiAoY21wIDwgMCkgcC5sZWZ0ID0gQVZMLmluc2VydF8ocC5sZWZ0LCBrKTtcbiAgICAgIGVsc2UgaWYgKGNtcCA+PSAwKSBwLnJpZ2h0ID0gQVZMLmluc2VydF8ocC5yaWdodCwgayk7XG4gICAgICByZXR1cm4gYmFsYW5jZV8ocCk7XG4gICAgfSxcblxuICAgIHJlbW92ZTogZnVuY3Rpb24oaykge1xuICAgICAgQVZMLnJvb3QgPSBBVkwucmVtb3ZlXyhBVkwucm9vdCwgayk7XG4gICAgfSxcblxuICAgIHJlbW92ZV8ocCwgaykge1xuICAgICAgaWYgKCFwKSByZXR1cm4gbnVsbDtcbiAgICAgIHZhciBjbXAgPSBBVkwuY29tcGFyZXJfKGssIHAua2V5KTtcblxuICAgICAgaWYgKGNtcCA8IDApIHAubGVmdCA9IEFWTC5yZW1vdmVfKHAubGVmdCwgayk7XG4gICAgICBlbHNlIGlmIChjbXAgPiAwKSBwLnJpZ2h0ID0gQVZMLnJlbW92ZV8ocC5yaWdodCwgayk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIHEgPSBwLmxlZnQ7XG4gICAgICAgIHZhciByID0gcC5yaWdodDtcbiAgICAgICAgaWYgKCFyKSByZXR1cm4gcTtcblxuICAgICAgICB2YXIgbWluID0gZ2V0TWluaW11bV8ocik7XG4gICAgICAgIG1pbi5yaWdodCA9IHJlbW92ZU1pbmltdW5fKHIpO1xuICAgICAgICBtaW4ubGVmdCA9IHE7XG4gICAgICAgIHJldHVybiBiYWxhbmNlXyhtaW4pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJhbGFuY2VfKHApO1xuICAgIH0sXG5cbiAgICByZW1vdmVBdDogZnVuY3Rpb24oaykge1xuICAgICAgdmFyIHZhbCA9IEFWTC5hdChrKTtcbiAgICAgIEFWTC5yb290ID0gQVZMLnJlbW92ZV8oQVZMLnJvb3QsIHZhbCk7XG4gICAgfSxcblxuICAgIHRvQXJyYXk6IGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKEFWTC5yb290ID09PSBudWxsKSByZXR1cm4gW107XG4gICAgICByZXR1cm4gdG9BcnJheV8oQVZMLnJvb3QpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gQVZMO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBVkxUcmVlO1xuIl0sIm5hbWVzIjpbImNyZWF0ZU5ld05vZGVfIiwia2V5Iiwid2VpZ2h0IiwiaGVpZ2h0IiwibGVmdCIsInJpZ2h0IiwiY29tcGFyZXJfIiwiYSIsImIiLCJoZWlnaHRfIiwicCIsIndlaWdodF8iLCJiRmFjdG9yXyIsImNvdW50SGVpZ2h0QW5kV2VpZ2h0XyIsImhsIiwiaHIiLCJ3bCIsIndyIiwicm90YXRlUmlnaHRfIiwicSIsInJvdGF0ZUxlZnRfIiwiYmFsYW5jZV8iLCJjb3VudF8iLCJrIiwidXBwZXJCb3VuZF8iLCJsb3dlckJvdW5kXyIsImF0XyIsImdldE1pbmltdW1fIiwiZ2V0TWF4aW11bV8iLCJyZW1vdmVNaW5pbXVuXyIsInRvQXJyYXlfIiwiYXJyIiwiY29uY2F0IiwicHVzaCIsIkFWTFRyZWUiLCJjb21wYXJlciIsIkFWTCIsInJvb3QiLCJzaXplIiwibWluIiwibWF4IiwibG93ZXJCb3VuZCIsImNtcCIsInVwcGVyQm91bmQiLCJjb3VudCIsImF0IiwiaW5zZXJ0IiwiaW5zZXJ0XyIsInJlbW92ZSIsInJlbW92ZV8iLCJyIiwicmVtb3ZlQXQiLCJ2YWwiLCJ0b0FycmF5Il0sIm1hcHBpbmdzIjoiQUFBQSxnQkFBZ0IsR0FDaEIsa0JBQWtCLEdBRWxCOzs7OytCQW1OQTs7O2VBQUE7OztBQWpOQSxTQUFTQSxlQUFlQyxHQUFHO0lBQ3pCLE9BQU87UUFDTEEsS0FBS0E7UUFDTEMsUUFBUTtRQUNSQyxRQUFRO1FBQ1JDLE1BQU07UUFDTkMsT0FBTztJQUNUO0FBQ0Y7QUFFQSxJQUFJQyxZQUFZLFNBQVNDLENBQUMsRUFBRUMsQ0FBQztJQUMzQixJQUFJRCxJQUFJQyxHQUFHLE9BQU8sQ0FBQztJQUNuQixJQUFJRCxJQUFJQyxHQUFHLE9BQU87SUFDbEIsT0FBTztBQUNUO0FB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