function series() {
  var out = []
  var v = 100
  for (var i = 0; i < 60; i++) {
    v += 2 + Math.sin(i / 5) * 3
    out.push([i, Math.round(v)])
  }
  return out
}

var options = {
  series: [{ name: 'Price', data: series() }],
  chart: {
    id: 'price',
    type: 'area',
    height: 380,
    fontFamily: 'Helvetica, Arial, sans-serif',
    animations: { enabled: false },
    measure: { enabled: true, pinOnRelease: true },
    toolbar: { show: true, autoSelected: 'measure' },
    zoom: { enabled: true, type: 'x' },
  },
  stroke: { width: 2, curve: 'straight' },
  dataLabels: { enabled: false },
  title: { text: 'Price (measure any move)', align: 'left' },
  xaxis: { type: 'numeric', title: { text: 'Session' } },
  yaxis: { title: { text: 'Price' }, decimalsInFloat: 0 },
}

var chart = new ApexCharts(document.querySelector('#chart'), options)
chart.render()

// The ruler tool is pre-selected via toolbar.autoSelected: 'measure', so the
// plot is already armed on load -- just drag. The toolbar icon toggles it (and
// the 'm' key still works); no custom wiring needed here.
var readout = document.getElementById('mz-readout')

document.getElementById('mz-clear').addEventListener('click', function () {
  chart.clearMeasures()
})

chart.addEventListener('measured', function (c, o) {
  readout.textContent =
    'dx=' +
    Number(o.dx).toFixed(2) +
    '  dy=' +
    Number(o.dy).toFixed(2) +
    '  (' +
    (o.percentChange >= 0 ? '+' : '') +
    Number(o.percentChange).toFixed(1) +
    '%)'
})
Measure Ruler - JavaScript Interactivity | ApexCharts.js | ApexCharts.js