Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

mainSeries.priceScale().applyOptions({ autoScale: true }) ignores horizontal lines on the chart when scaling? #1587

Closed
0x33dm opened this issue May 9, 2024 · 4 comments

Comments

@0x33dm
Copy link

0x33dm commented May 9, 2024

Lightweight Charts™ Version:

4.1.4

Steps/code to reproduce:

I'm loading a chart with 2 years worth of 1D candles sticks, for that reason I would like to avoid calling chart.timeScale().fitContent() as this would make all candles very small in the screen, specially considering I only have about 700x400 pixels space on my UI.

When I apply the option autoScale: true on the priceScale() the scale of the candles and the alignment of the candles is perfect!

The problem arises when I try to add 2 stop lines, one called "soft liquidation" and "hard liquidation".

I expected priceScale() to take those 2 lines in consideration and potentially scale the vertical axis ( prices ) enough to see the lines on the chart.

Ideally ,if the user only drags the chart horizontally I would like both lines to always be visible, at least until the user changes the vertical scale by clicking and dragging vertically the price axis.

Unfortunately, that doesn't happen and if the "stop lines" are too far away from the price they end up not being displayed so it's very easy to miss them.

Is there a way to get autoScale on the priceScale() to take those lines in consideration?

Have an example sandbox ( apologies for the commented code, I forked this basic example and didn't finish cleaning it ) https://codesandbox.io/p/sandbox/kind-framework-zdcsdt?file=%2Fsrc%2Findex.js

Thank You!

@SlicedSilver
Copy link
Contributor

This is the intended behaviour. However you can use the autoscaleInfoProvider (which is part of the series options) to override the autoscale behaviour, such as adjusting the min and max values so they always include the prices of 20000 and 30000.

@0x33dm
Copy link
Author

0x33dm commented May 9, 2024

This is the intended behaviour. However you can use the autoscaleInfoProvider (which is part of the series options) to override the autoscale behaviour, such as adjusting the min and max values so they always include the prices of 20000 and 30000.

I quite like the default behaviour where the user scrolling horizonally automatically adjusts the price scale automatically based on the min and max value of the candles.

I believe if i would have to provide an "autoscaleInfoProvider" i would have to recalculate the min and max everytime the user scrolls horizontally and then try to emulate the default behaviour myself?

Also, on the default behaviour if the user then changes the priceScale manually ( by dragging vertically ) the chart stops automatically adjusting.

I would like to achieve the same thing without having to re-invent the default behaviour if that makes sense?

Is there a workaround, for instance adding an "area" or a "line" fully transparent between those two lines so the default behaviour would be still the same but instead of considering the lowest of the candles and the highest of the candles it would be considering the lowest of the line/area to the max of the candles until the user changes the price scale manually ?

@SlicedSilver
Copy link
Contributor

Is there a workaround, for instance adding an "area" or a "line" fully transparent between those two lines so the default behaviour would be still the same but instead of considering the lowest of the candles and the highest of the candles it would be considering the lowest of the line/area to the max of the candles until the user changes the price scale manually ?

Yes that would work.

But it would also be simple to do this:

const additionalLines = [20000, 30000];

candleSeries.applyOptions({
    autoscaleInfoProvider: (originalRange) => {
        const res = original();
        res.priceRange.minValue = Math.min(res.priceRange.minValue, Math.min(additionalLines));
        res.priceRange.maxValue = Math.max(res.priceRange.maxValue, Math.max(additionalLines));
        return res;
    },
})

@0x33dm
Copy link
Author

0x33dm commented May 13, 2024

candleSeries.applyOptions({
    autoscaleInfoProvider: (originalRange) => {
        const res = original();
        res.priceRange.minValue = Math.min(res.priceRange.minValue, Math.min(additionalLines));
        res.priceRange.maxValue = Math.max(res.priceRange.maxValue, Math.max(additionalLines));
        return res;
    },
})

this works as expected!

thank you!

@0x33dm 0x33dm closed this as completed May 13, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants