lightweight-charts-python icon indicating copy to clipboard operation
lightweight-charts-python copied to clipboard

[BUG] Trens lines plotted differently on lower timeframe

Open snussik opened this issue 1 year ago • 1 comments

Expected Behavior

Switching timeframes shouldn't change trend_line start & end points on this test data BTC_USDT_10d_5m.csv BTC_USDT_10d_15m.csv

(need to be placed in ./tests/data/)

Current Behaviour

While switching timeframes trend_line plots with wrong start & end points

Reproducible Example

import warnings
from dataclasses import dataclass

import pandas as pd
from lightweight_charts import Chart
from pandas.errors import SettingWithCopyWarning

warnings.filterwarnings("ignore", category=FutureWarning)
warnings.filterwarnings("ignore", category=UserWarning)
warnings.filterwarnings("ignore", category=SettingWithCopyWarning)

## INPUT DATA


test_data = [
    {
        "start_time": "2022-12-31 23:45:00+00:00",
        "start_value": 16546.9,
        "end_time": "2023-01-01 01:45:00+00:00",
        "end_value": 16546.9,
        "width": 1,
        "style": "solid",
        "line_color": "rgba(255, 204, 225, 1)",
    }
]


DATAFRAME = "BTC_USDT_10d_5m.csv"
DATAFRAME = "BTC_USDT_10d_15m.csv"


@dataclass
class Data:
    path: str
    tickers: list[str]
    file_ext: str


data = Data(
    path="./tests/data/",
    tickers=["BTC_USDT_10d_15m", "BTC_USDT_10d_5m"],
    file_ext="csv",
)


class Drawer:
    def __init__(self, df: pd.DataFrame, chart: Chart):
        self.df = df
        self.chart = chart

    def add_line(self, line_data: pd.DataFrame, name: str, cfg: dict | None = None):
        self.chart.create_line(name=name).set(line_data)

    def add_trend_line(self, line_data: dict):
        self.chart.trend_line(**line_data)

    def add_trend_line_bulk(self, lines: list[dict]):

        for line in lines:
            self.add_trend_line(line)


class ChartDrawerNew:
    def __init__(self, data: Data, toolbox=True, add_switcher=True):
        self.data = data
        self.chart = self.chart_init(data, toolbox)
        self.df = self.get_bar_data(self.get_tickers()[0])
        self.drawer = Drawer(self.df, self.chart)

    def chart_init(self, data: Data, toolbox=True, add_switcher=True):

        chart = Chart(toolbox=toolbox)
        if add_switcher:
            chart = self.add_switcher(chart)
        return chart

    def get_tickers(self):
        return self.data.tickers

    def add_switcher(self, chart: Chart):
        tickers = self.get_tickers()
        if len(tickers) > 0:
            chart.topbar.switcher(
                "timeframe",
                tuple(tickers),
                default=tickers[0],
                func=self.on_timeframe_selection,
            )
        return chart

    def on_timeframe_selection(self, chart: Chart):
        new_data = self.get_bar_data(chart.topbar["timeframe"].value)

        if new_data.empty:
            return

        chart.set(new_data, True)

    def get_bar_data(self, timeframe):
        df = pd.read_csv(
            f"{self.data.path}{timeframe}.{self.data.file_ext}", index_col=False
        )
        df.drop(columns=["Unnamed: 0"], inplace=True)
        return df


if __name__ == "__main__":

    chartObj = ChartDrawerNew(data)
    chart = chartObj.chart
    df = chartObj.df
    chart.set(df)

    print(test_data[0])
    chartObj.drawer.add_trend_line(test_data[0])

    chart.show(block=True)

Environment

- OS: macOS 13.2
- Library: 2.0.1

snussik avatar Dec 29 '24 12:12 snussik

possible fix - https://github.com/louisnw01/lightweight-charts-python/issues/498#issuecomment-2642779469

qrlik avatar Jul 04 '25 10:07 qrlik