Skip to main content

Python framework for TradingView's Lightweight Charts JavaScript library.

Project description

lightweight-charts-python

PyPi Release Made with Python License Documentation

cover

lightweight-charts-python aims to provide a simple and pythonic way to access and implement TradingView's Lightweight Charts.

Installation

pip install lightweight-charts
  • White screen? Having issues with pywebview? Click here.

Features

  1. Simple and easy to use.
  2. Blocking or non-blocking GUI.
  3. Streamlined for live data, with methods for updating directly from tick data.
  4. Multi-Pane Charts using the SubChart.
  5. The Toolbox, allowing for trendlines, rays and horizontal lines to be drawn directly onto charts.
  6. Callbacks allowing for timeframe (1min, 5min, 30min etc.) selectors, searching, and more.
  7. Direct integration of market data through Polygon.io's market data API.

Supports: Jupyter Notebooks, PyQt, wxPython, Streamlit, and asyncio.

PartTimeLarry: Interactive Brokers API and TradingView Charts in Python


1. Display data from a csv:

import pandas as pd
from lightweight_charts import Chart


if __name__ == '__main__':
    
    chart = Chart()
    
    # Columns: | time | open | high | low | close | volume (if volume is enabled) |
    df = pd.read_csv('ohlcv.csv')
    chart.set(df)
    
    chart.show(block=True)

setting_data image


2. Updating bars in real-time:

import pandas as pd
from time import sleep
from lightweight_charts import Chart

if __name__ == '__main__':

    chart = Chart()

    df1 = pd.read_csv('ohlcv.csv')
    df2 = pd.read_csv('next_ohlcv.csv')

    chart.set(df1)

    chart.show()

    last_close = df1.iloc[-1]
    
    for i, series in df2.iterrows():
        chart.update(series)

        if series['close'] > 20 and last_close < 20:
            chart.marker(text='The price crossed $20!')
            
        last_close = series['close']
        sleep(0.1)

live data gif


3. Updating bars from tick data in real-time:

import pandas as pd
from time import sleep
from lightweight_charts import Chart


if __name__ == '__main__':
    
    df1 = pd.read_csv('ohlc.csv')
    
    # Columns: | time | price | volume (if volume is enabled) |
    df2 = pd.read_csv('ticks.csv')
    
    chart = Chart(volume_enabled=False)
    
    chart.set(df1)
    
    chart.show()
    
    for i, tick in df2.iterrows():
        chart.update_from_tick(tick)
            
        sleep(0.3)

tick data gif


4. Line Indicators:

import pandas as pd
from lightweight_charts import Chart


def calculate_sma(data: pd.DataFrame, period: int = 50):
   def avg(d: pd.DataFrame):
      return d['close'].mean()

   result = []
   for i in range(period - 1, len(data)):
      val = avg(data.iloc[i - period + 1:i])
      result.append({'time': data.iloc[i]['date'], f'SMA {period}': val})
   return pd.DataFrame(result)


if __name__ == '__main__':
   chart = Chart()
   chart.legend(visible=True)
   
   df = pd.read_csv('ohlcv.csv')
   chart.set(df)

   line = chart.create_line()
   sma_data = calculate_sma(df, period=50)
   line.set(sma_data, name='SMA 50')

   chart.show(block=True)

line indicators image


5. Styling:

import pandas as pd
from lightweight_charts import Chart


if __name__ == '__main__':
    
    chart = Chart(debug=True)

    df = pd.read_csv('ohlcv.csv')

    chart.layout(background_color='#090008', text_color='#FFFFFF', font_size=16,
                 font_family='Helvetica')

    chart.candle_style(up_color='#00ff55', down_color='#ed4807',
                       border_up_color='#FFFFFF', border_down_color='#FFFFFF',
                       wick_up_color='#FFFFFF', wick_down_color='#FFFFFF')

    chart.volume_config(up_color='#00ff55', down_color='#ed4807')

    chart.watermark('1D', color='rgba(180, 180, 240, 0.7)')

    chart.crosshair(mode='normal', vert_color='#FFFFFF', vert_style='dotted',
                    horz_color='#FFFFFF', horz_style='dotted')

    chart.legend(visible=True, font_size=14)

    chart.set(df)

    chart.show(block=True)

styling image


6. Callbacks:

import asyncio
import pandas as pd

from lightweight_charts import Chart


def get_bar_data(symbol, timeframe):
    if symbol not in ('AAPL', 'GOOGL', 'TSLA'):
        print(f'No data for "{symbol}"')
        return pd.DataFrame()
    return pd.read_csv(f'bar_data/{symbol}_{timeframe}.csv')


class API:
    def __init__(self):
        self.chart = None  # Changes after each callback.

    async def on_search(self, searched_string):  # Called when the user searches.
        new_data = get_bar_data(searched_string, self.chart.topbar['timeframe'].value)
        if new_data.empty:
            return
        self.chart.topbar['corner'].set(searched_string)
        self.chart.set(new_data)

    async def on_timeframe_selection(self):  # Called when the user changes the timeframe.
        new_data = get_bar_data(self.chart.topbar['corner'].value, self.chart.topbar['timeframe'].value)
        if new_data.empty:
            return
        self.chart.set(new_data)
            
    async def on_horizontal_line_move(self, line_id, price):
        print(f'Horizontal line moved to: {price}')


async def main():
    api = API()

    chart = Chart(api=api, topbar=True, searchbox=True, toolbox=True)
    chart.legend(True)

    chart.topbar.textbox('corner', 'TSLA')
    chart.topbar.switcher('timeframe', api.on_timeframe_selection, '1min', '5min', '30min', default='5min')

    df = get_bar_data('TSLA', '5min')
    chart.set(df)
    
    chart.horizontal_line(200, interactive=True)

    await chart.show_async(block=True)


if __name__ == '__main__':
    asyncio.run(main())

callbacks gif


Documentation

Inquiries: shaders_worker_0e@icloud.com


This package is an independent creation and has not been endorsed, sponsored, or approved by TradingView. The author of this package does not have any official relationship with TradingView, and the package does not represent the views or opinions of TradingView.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lightweight_charts-1.0.14.3.tar.gz (88.7 kB view details)

Uploaded Source

Built Distribution

lightweight_charts-1.0.14.3-py3-none-any.whl (90.2 kB view details)

Uploaded Python 3

File details

Details for the file lightweight_charts-1.0.14.3.tar.gz.

File metadata

  • Download URL: lightweight_charts-1.0.14.3.tar.gz
  • Upload date:
  • Size: 88.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.10.2

File hashes

Hashes for lightweight_charts-1.0.14.3.tar.gz
Algorithm Hash digest
SHA256 9b50bf02f85eaec3ccbdbc9546f149e40a9856f570e98e8bd56801f2b5bfa894
MD5 02b8b84023f7e0158f90c2fbd3b7eec7
BLAKE2b-256 aa095e8c3f424e331fcaa78b1b585404844f35130dd0315fc97a6c47776a8a01

See more details on using hashes here.

File details

Details for the file lightweight_charts-1.0.14.3-py3-none-any.whl.

File metadata

File hashes

Hashes for lightweight_charts-1.0.14.3-py3-none-any.whl
Algorithm Hash digest
SHA256 91d85bd77c5cf73279f9662572e9f8cba6bf3cc543d3260848d9f30a6276d87d
MD5 0cf07c9f2bdb698e6afd85c968550518
BLAKE2b-256 8f0dce8e823c907ab0195d4e443ce0e464e593e91a3b68fc55802f02e835161f

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page