Files

170 lines
6.8 KiB
JavaScript

async function waitForVariable(variableName, timeout = 5000) {
const startTime = Date.now();
while (typeof window[variableName] === 'undefined') {
if (Date.now() - startTime > timeout) {
throw new Error(`Variable '${variableName}' not defined within ${timeout}ms`);
}
await new Promise(resolve => setTimeout(resolve, 100));
}
console.log(`Variable '${variableName}' is now defined.`);
}
async function update_tv(data_list, lookback_max_points) {
data_list.forEach(function (item, index) {
// console.log(item, index);
window.charts_arr[index].data.push({ time: item.timestamp, value: item.value });
window.charts_arr[index].series.update({ time: item.timestamp, value: item.value });
if (window.charts_arr[index].series.data().length > lookback_max_points) {
window.charts_arr[index].series.setData(window.charts_arr[index].series.data().slice(-lookback_max_points));
};
});
// midPriceLine.applyOptions({
// price: data_dict.mid_px,
// color: '#c78228',
// lineWidth: 3,
// lineStyle: LightweightCharts.LineStyle.Dashed,
// axisLabelVisible: true,
// });
window.chart.timeScale().scrollToRealTime();
window.chart.timeScale().fitContent();
const currentRange = window.chart.timeScale().getVisibleLogicalRange();
window.chart.timeScale().setVisibleLogicalRange(currentRange);
};
async function create_tv(charts_list, create_chart_options) {
const container = document.getElementById('tv');
if (create_chart_options.crosshair == 'NORMAL') {
create_chart_options.crosshair = { mode: LightweightCharts.CrosshairMode.Normal }
};
window.chart = LightweightCharts.createChart(container, create_chart_options);
window.charts_arr = [];
charts_list.forEach(function (item, index) {
// console.log(item, index);
charts_dict = {};
if ((Array.isArray(item.autoscaleInfoProvider) && item.autoscaleInfoProvider.length !== 0)) {
item.options.autoscaleInfoProvider = () => ({
priceRange: {
minValue: item.autoscaleInfoProvider[0],
maxValue: item.autoscaleInfoProvider[1]
}
})
};
if (item.type == "AREA" ) {
charts_dict.series = chart.addSeries(LightweightCharts.AreaSeries, item.options);
} else {
charts_dict.series = chart.addSeries(LightweightCharts.LineSeries, item.options);
};
charts_dict.data = [];
charts_dict.series.setData(charts_dict.data);
window.charts_arr.push(charts_dict);
});
window.chart.timeScale().fitContent();
// Handle responsiveness: Resize chart when container size changes
const resizeObserver = new ResizeObserver(entries => {{
for (let entry of entries) {{
window.chart.applyOptions({
width: entry.contentRect.width,
height: entry.contentRect.height
});
}}
}});
resizeObserver.observe(container);
console.log("TV Created!")
// window.midPriceLine_Config = {
// price: 0,
// color: '#c78228',
// lineWidth: 3,
// lineStyle: LightweightCharts.LineStyle.Dashed,
// axisLabelVisible: false,
// };
// window.midPriceLine = window.lineSeries.createPriceLine(midPriceLine_Config);
// Create and style the tooltip html element
// const container = document.getElementById('tv');
// window.toolTipWidth = 200;
// const toolTip = document.createElement('div');
// toolTip.style = `width: ${window.toolTipWidth}px; height: 100%; position: absolute; display: none; padding: 8px; box-sizing: border-box; font-size: 12px; text-align: left; z-index: 1000; top: 12px; left: 12px; pointer-events: none; border-radius: 4px 4px 0px 0px; border-bottom: none; box-shadow: 0 2px 5px 0 rgba(117, 134, 150, 0.45);font-family: -apple-system, BlinkMacSystemFont, 'Trebuchet MS', Roboto, Ubuntu, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;`;
// toolTip.style.background = `rgba(${'0, 0, 0'}, 0.25)`;
// toolTip.style.color = 'white';
// toolTip.style.borderColor = 'rgba( 239, 83, 80, 1)';
// container.appendChild(toolTip);
// // update tooltip
// window.chart.subscribeCrosshairMove(async param => {
// if (
// param.point === undefined ||
// !param.time ||
// param.point.x < 0 ||
// param.point.x > container.clientWidth ||
// param.point.y < 0 ||
// param.point.y > container.clientHeight
// ) {
// toolTip.style.display = 'none';
// } else {
// // toolTip.style.height = '100%';
// toolTip.style.alignContent = 'center';
// const dateStr = new Date(param.time*1000).toISOString();
// let data = await param.seriesData.get(window.lineSeries);
// if (data === undefined) {
// data = {}
// data.value = 0
// console.log('data is UNDEFINED, SETTING TO 0')
// };
// let data_b = await param.seriesData.get(window.lineSeries_b);
// if (data_b === undefined) {
// data_b = {}
// data_b.value = 0
// console.log('data is UNDEFINED, SETTING TO 0')
// };
// const value_px = data.value
// const value_px_b = window.data_b.value
// const value_px_c = window.data_c.value
// // const value_px_tgt = window.data_tgt.value
// toolTip.style.display = 'block';
// // <div style="color: ${'rgba( 239, 83, 80, 1)'}">
// // Atwater Trading
// // </div>
// toolTip.innerHTML = `
// <div style="font-size: 24px; margin: 4px 0px; color: ${'white'}">
// Chainlink: ${Math.round(100 * value_px) / 100}
// Binance: ${Math.round(100 * value_px_b) / 100}
// </div>
// <div style="color: ${'white'}">
// ${dateStr}
// </div>
// `;
// let left = param.point.x; // relative to timeScale
// const timeScaleWidth = chart.timeScale().width();
// const priceScaleWidth = chart.priceScale('left').width();
// const halfTooltipWidth = toolTipWidth / 2;
// left += priceScaleWidth - halfTooltipWidth;
// left = Math.min(left, priceScaleWidth + timeScaleWidth - toolTipWidth);
// left = Math.max(left, priceScaleWidth);
// toolTip.style.left = left + 'px';
// toolTip.style.top = 0 + 'px';
// }
// });
};