lightweight-charts-python
lightweight-charts-python copied to clipboard
[BUG] Trens lines plotted differently on lower timeframe
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
possible fix - https://github.com/louisnw01/lightweight-charts-python/issues/498#issuecomment-2642779469