You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
3.4 KiB
97 lines
3.4 KiB
'use strict';
|
|
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
/**
|
|
* 数据更新器
|
|
* 通过更新器触发datafeeds的getBars实时更新图表数据
|
|
*/
|
|
var dataUpdater = function () {
|
|
function dataUpdater(datafeeds) {
|
|
_classCallCheck(this, dataUpdater);
|
|
|
|
this.subscribers = {};
|
|
this.requestsPending = 0;
|
|
this.historyProvider = datafeeds;
|
|
}
|
|
|
|
dataUpdater.prototype.subscribeBars = function subscribeBars(symbolInfo, resolution, newDataCallback, listenerGuid) {
|
|
this.subscribers[listenerGuid] = {
|
|
lastBarTime: null,
|
|
listener: newDataCallback,
|
|
resolution: resolution,
|
|
symbolInfo: symbolInfo
|
|
};
|
|
};
|
|
|
|
dataUpdater.prototype.unsubscribeBars = function unsubscribeBars(listenerGuid) {
|
|
delete this.subscribers[listenerGuid];
|
|
};
|
|
|
|
dataUpdater.prototype.updateData = function updateData() {
|
|
var _this = this;
|
|
|
|
if (this.requestsPending) return;
|
|
this.requestsPending = 0;
|
|
for (var listenerGuid in this.subscribers) {
|
|
this.requestsPending++;
|
|
this.updateDataForSubscriber(listenerGuid).then(function () {
|
|
return _this.requestsPending--;
|
|
}).catch(function () {
|
|
return _this.requestsPending--;
|
|
});
|
|
}
|
|
};
|
|
|
|
dataUpdater.prototype.updateDataForSubscriber = function updateDataForSubscriber(listenerGuid) {
|
|
var _this2 = this;
|
|
|
|
return new Promise(function (resolve, reject) {
|
|
var subscriptionRecord = _this2.subscribers[listenerGuid];
|
|
var rangeEndTime = parseInt((Date.now() / 1000).toString());
|
|
var rangeStartTime = rangeEndTime - _this2.periodLengthSeconds(subscriptionRecord.resolution, 10);
|
|
_this2.historyProvider.getBars(subscriptionRecord.symbolInfo, subscriptionRecord.resolution, rangeStartTime, rangeEndTime, function (bars) {
|
|
_this2.onSubscriberDataReceived(listenerGuid, bars);
|
|
resolve();
|
|
}, function () {
|
|
reject();
|
|
});
|
|
});
|
|
};
|
|
|
|
dataUpdater.prototype.onSubscriberDataReceived = function onSubscriberDataReceived(listenerGuid, bars) {
|
|
if (!this.subscribers.hasOwnProperty(listenerGuid)) return;
|
|
if (!bars.length) return;
|
|
var lastBar = bars[bars.length - 1];
|
|
var subscriptionRecord = this.subscribers[listenerGuid];
|
|
if (subscriptionRecord.lastBarTime !== null && lastBar.time < subscriptionRecord.lastBarTime) return;
|
|
var isNewBar = subscriptionRecord.lastBarTime !== null && lastBar.time > subscriptionRecord.lastBarTime;
|
|
if (isNewBar) {
|
|
if (bars.length < 2) {
|
|
throw new Error('Not enough bars in history for proper pulse update. Need at least 2.');
|
|
}
|
|
var previousBar = bars[bars.length - 2];
|
|
subscriptionRecord.listener(previousBar);
|
|
}
|
|
|
|
subscriptionRecord.lastBarTime = lastBar.time;
|
|
subscriptionRecord.listener(lastBar);
|
|
};
|
|
|
|
dataUpdater.prototype.periodLengthSeconds = function periodLengthSeconds(resolution, requiredPeriodsCount) {
|
|
var daysCount = 0;
|
|
if (resolution === 'D' || resolution === '1D') {
|
|
daysCount = requiredPeriodsCount;
|
|
} else if (resolution === 'M' || resolution === '1M') {
|
|
daysCount = 31 * requiredPeriodsCount;
|
|
} else if (resolution === 'W' || resolution === '1W') {
|
|
daysCount = 7 * requiredPeriodsCount;
|
|
} else {
|
|
daysCount = requiredPeriodsCount * parseInt(resolution) / (24 * 60);
|
|
}
|
|
return daysCount * 24 * 60 * 60;
|
|
};
|
|
|
|
return dataUpdater;
|
|
}();
|