Interactive candlestick chart plotting with PyQt6 — drop-in replacement for mplfinance with rich interactivity.
- 📈 Candlestick, OHLC bar, line, and hollow-candle chart types
- 📊 Optional volume subplot
- 🔍 Mouse-wheel zoom and click-drag pan
- 🎯 Crosshair cursor with live OHLC / volume readout
- 📐 Moving average overlays (
mavparameter) - 🎨 Built-in styles (
default,charles,mike,yahoo,classic,nightclouds) - 🖼️
make_addplot()for overlaying custom data (line, scatter & segments) - 🔀
make_segments()for overlapping broken-line overlays (e.g. Knoxville Divergence) - 💾
savefig()support (PNG / JPG / BMP) - 🔁
returnfigmode for embedding in your own PyQt6 application - 🔴
live_plot()for animated / live-updating charts - ✅ mplfinance-compatible function signatures
The recommended way to install wickly:
pip install wicklyClone the repository and install with pip:
git clone https://github.com/ShreyanshDarshan/wickly.git
cd wickly
pip install .Or in editable/development mode (includes pytest and build):
pip install -e ".[dev]"import pandas as pd
import wickly
# DataFrame must have a DatetimeIndex and columns: Open, High, Low, Close (and optionally Volume)
df = pd.read_csv("your_data.csv", index_col=0, parse_dates=True)
# Candlestick chart with volume and moving averages — same API as mplfinance
wickly.plot(df, type='candle', volume=True, mav=(10, 20), style='yahoo', title='My Chart')Full API reference, quickstart guide, and examples are available at wickly.readthedocs.io.
Contributions are welcome — bug reports, feature requests, documentation improvements, and pull requests all appreciated.
git clone https://github.com/ShreyanshDarshan/wickly.git
cd wicklyCreate and activate a dedicated environment (conda shown; plain venv works too):
conda create -n wickly python=3.11
conda activate wickly
pip install -e ".[dev,docs]"wickly/
├── src/wickly/ # Package source
│ ├── __init__.py # Public API surface
│ ├── plotting.py # Top-level plot() function
│ ├── chart_widget.py # PyQt6 CandlestickWidget
│ ├── addplot.py # make_addplot() & make_segments() helpers
│ ├── styles.py # Built-in styles & make_style()
│ └── _utils.py # Data validation utilities
├── tests/ # pytest test suite
├── docs/ # Sphinx documentation source
├── examples/ # Runnable example scripts
├── pyproject.toml # Project metadata & dependencies
└── .readthedocs.yaml # Read the Docs configuration
pytest tests/ -vAll 41 tests should pass. Add new tests under tests/ for any code you contribute.
# HTML output → docs/_build/html/index.html
python -m sphinx -b html docs docs/_build/html
# Open in the default browser (Windows)
start docs/_build/html/index.html
# Open in the default browser (macOS / Linux)
open docs/_build/html/index.htmlBuild must succeed with zero warnings (-W flag):
python -m sphinx -b html docs docs/_build/html -Wpython examples/basic_candle.py # Basic candlestick + volume + MAs
python examples/chart_types.py # All four chart types in sequence
python examples/addplot_overlay.py # Bollinger Bands & scatter signals
python examples/live_chart.py # Live / animated chart demo- Add an entry to
_BUILTIN_STYLESinsrc/wickly/styles.pyfollowing the existing key schema. - Add the style name to
TestAvailableStyles.test_all_builtins_presentintests/test_styles.py. - Document it in the styles table in
docs/styles.rst.
- Format with black (
pip install black; black src/ tests/). - Type-annotate all public functions.
- Write NumPy-style docstrings — they are picked up by Sphinx autodoc.
- Branch off
main:git checkout -b feat/my-feature - Make your changes, add tests, update docs.
- Ensure
pytest tests/ -vis all green andsphinx -Wbuilds cleanly. - Open a PR against
mainwith a clear description of what changed and why.
MIT

