Copy disabled (too large)
Download .txt
Showing preview only (48,021K chars total). Download the full file to get everything.
Repository: matplotlib/mplfinance
Branch: master
Commit: 493811dac9a2
Files: 256
Total size: 45.8 MB
Directory structure:
gitextract_k_37povc/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── ask-a-question.md
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── feedback.md
│ └── workflows/
│ ├── mplfinance_checks.yml
│ ├── pubPyPI.yml
│ └── pubTestPyPI.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── RELEASE_NOTES.md
├── TODO.md
├── archive.tox.ini
├── archive.travis.yml
├── doc/
│ ├── Makefile
│ ├── README
│ ├── make.bat
│ └── source/
│ ├── conf.py
│ ├── examples.rst
│ ├── index.rst
│ ├── modules.rst
│ └── mpl_finance.rst
├── examples/
│ ├── .gitignore
│ ├── addplot.ipynb
│ ├── addplot_legends.ipynb
│ ├── data/
│ │ ├── SP500_20191106_IDayBollinger.csv
│ │ ├── SP500_NOV2019_Hist.csv
│ │ ├── SP500_NOV2019_IDay.csv
│ │ ├── SP500_NOV2019_IDayRVol.csv
│ │ ├── SPY_20110701_20120630_Bollinger.csv
│ │ ├── jpyusd_barchartdotcom.csv
│ │ ├── yahoofinance-AAPL-20040819-20180120.csv
│ │ ├── yahoofinance-GOOG-20040819-20180120.csv
│ │ ├── yahoofinance-INTC-19950101-20040412.csv
│ │ ├── yahoofinance-SPY-20080101-20180101.csv
│ │ └── yahoofinance-SPY-20200901-20210113.csv
│ ├── external_axes.ipynb
│ ├── fill_between.ipynb
│ ├── hollow_and_filled_candles.ipynb
│ ├── indicators/
│ │ ├── alphatrend.ipynb
│ │ ├── awesome_oscillator.ipynb
│ │ ├── donchian_channel.ipynb
│ │ ├── golden_cross.ipynb
│ │ ├── ichimoku_cloud.ipynb
│ │ ├── macd.py
│ │ ├── macd_histogram_gradient.ipynb
│ │ ├── mpf_rsi_demo.py
│ │ ├── parabolic_sar.ipynb
│ │ ├── rsi.py
│ │ └── supertrend.ipynb
│ ├── marketcolor_overrides.ipynb
│ ├── mpf_animation_demo1.py
│ ├── mpf_animation_demo2.py
│ ├── mpf_animation_growingcandle.py
│ ├── mpf_animation_macd.py
│ ├── mpf_demo.py
│ ├── mpf_demo_autoclose.py
│ ├── mpf_demo_axlabelsize.py
│ ├── original_flavor/
│ │ ├── date_demo1.py
│ │ ├── date_demo2.py
│ │ ├── finance_demo.py
│ │ ├── finance_demo_newapi.py
│ │ ├── finance_work2.py
│ │ ├── longshort.py
│ │ └── plot_day_summary_oclh_demo.py
│ ├── panels.ipynb
│ ├── plot_customizations.ipynb
│ ├── price-movement_plots.ipynb
│ ├── resample10years.ipynb
│ ├── savefig.ipynb
│ ├── scratch_pad/
│ │ ├── Axes.scatter.ipynb
│ │ ├── addplot_build_panels_testing.ipynb
│ │ ├── addplot_nan_testing.ipynb
│ │ ├── addplot_ohlc_rawtest.ipynb
│ │ ├── animation/
│ │ │ ├── genvol.py
│ │ │ ├── mpf_anim_iday_gif.py
│ │ │ ├── mpf_anim_idaymacd_gif.py
│ │ │ ├── mpf_animation_demo1mod.py
│ │ │ └── mpf_animation_demo2mod.py
│ │ ├── bar_width_issues.ipynb
│ │ ├── check_use_cases.ipynb
│ │ ├── combine_sparse_data.ipynb
│ │ ├── date_to_iloc_extrapolation.ipynb
│ │ ├── dev_alines.ipynb
│ │ ├── dev_ext_axes_nightclouds_issue.ipynb
│ │ ├── dev_ext_axes_subclass.ipynb
│ │ ├── dev_external_axes.ipynb
│ │ ├── dev_fill_between.ipynb
│ │ ├── dev_hlines.ipynb
│ │ ├── dev_scale_padding.ipynb
│ │ ├── dev_tlines.ipynb
│ │ ├── dev_vlines.ipynb
│ │ ├── external_axes_stacking.ipynb
│ │ ├── figsubplot_tests.ipynb
│ │ ├── find.valid.backends.py
│ │ ├── fmtr.py
│ │ ├── fontscale.ipynb
│ │ ├── gridcolor_override_broken_for_charles.ipynb
│ │ ├── hollow_and_filled_images.py
│ │ ├── hollow_candle_experiments.ipynb
│ │ ├── invisible_axes.ipynb
│ │ ├── iss466_pr471.py
│ │ ├── issue#97_charles.ipynb
│ │ ├── issue266_white_to_grey.py
│ │ ├── issue296.a.py
│ │ ├── issue296.b.py
│ │ ├── issue296.py
│ │ ├── issue_184_alines.ipynb
│ │ ├── issues/
│ │ │ ├── Issue101_data.csv
│ │ │ ├── Issue101_xaxis_not_showing.ipynb
│ │ │ ├── Issue133_bad_display_single_candle.ipynb
│ │ │ ├── Issue156_title_ruins_tight_layout.ipynb
│ │ │ ├── Issue26_bug_fix_volume_bar_widths.ipynb
│ │ │ ├── Issue28_debug_zero_volume_crash.ipynb
│ │ │ ├── Issue77_test.ipynb
│ │ │ ├── Issue79.ipynb
│ │ │ ├── Issue82_case_insensitive_columns.ipynb
│ │ │ ├── issue#142.ipynb
│ │ │ ├── issue#142_data.csv
│ │ │ ├── issue#241_loop_all_styles.ipynb
│ │ │ ├── issue079_percent_change.ipynb
│ │ │ ├── issue145.py
│ │ │ ├── issue171_widths.ipynb
│ │ │ ├── issue193.py
│ │ │ ├── issue236.df.scratchdata
│ │ │ ├── issue236_timezone_bug.ipynb
│ │ │ ├── issue26_data.pkl
│ │ │ ├── issue282/
│ │ │ │ ├── agri.xlsx
│ │ │ │ └── dm_export_20000101_20201026.csv
│ │ │ ├── issue282_addplot.ipynb
│ │ │ ├── issue333_generic_plotting.ipynb
│ │ │ ├── issue436.py
│ │ │ ├── issue438.py
│ │ │ ├── issue568.csv
│ │ │ ├── issue568_pnf_calcs.ipynb
│ │ │ ├── issue77_eurusd.csv
│ │ │ ├── issue94.ipynb
│ │ │ ├── major_ticks_issue074.ipynb
│ │ │ ├── savefig_bugIssue141.ipynb
│ │ │ ├── so68871906.py
│ │ │ ├── stackoverflow.questions.60982755.csv
│ │ │ ├── stackoverflow60982755.ipynb
│ │ │ └── ticks_issue_573.ipynb
│ │ ├── lines.dill
│ │ ├── macd_and_widths.ipynb
│ │ ├── macd_color_issue594.ipynb
│ │ ├── mav_cross_issue518.ipynb
│ │ ├── mpl.zorderaxes.ipynb
│ │ ├── mpl.zorderbar.py
│ │ ├── multicursor.py
│ │ ├── multicursor_macd.py
│ │ ├── multicursor_macd_ginput.py
│ │ ├── multicursor_macd_ginput_save.py
│ │ ├── np.float32.ipynb
│ │ ├── pandas_resample_test.ipynb
│ │ ├── panels_ylim_width_alpha_yside.ipynb
│ │ ├── pdmerge_addplot.ipynb
│ │ ├── pnf_reversal.ipynb
│ │ ├── pr451_test.py
│ │ ├── pr451_testing.ipynb
│ │ ├── pr451data.csv
│ │ ├── presentation_fin_demo.py
│ │ ├── presentation_fin_demo_newapi.py
│ │ ├── price-movement_ret_calc_vals.ipynb
│ │ ├── rcParams.ipynb
│ │ ├── rcpars.py
│ │ ├── readme_width_experiments.ipynb
│ │ ├── run.valid.ibackends.py
│ │ ├── scatter_multiple_markers.ipynb
│ │ ├── simple_matplotlib.py
│ │ ├── so75737197.ipynb
│ │ ├── so75737197_data.csv
│ │ ├── so76486448_hover.py
│ │ ├── stackoverflow.65487952.ipynb
│ │ ├── stash_plotting.yscale.py
│ │ ├── static_image_subplots.ipynb
│ │ ├── test_addplot_bar.ipynb
│ │ ├── test_df.rolling.ipynb
│ │ ├── test_maddplot.py
│ │ ├── test_plot_image_comparison.ipynb
│ │ ├── time_to_plot_line_vs_bar.py
│ │ ├── too_much_data.py
│ │ ├── tplot.py
│ │ ├── trend_line_extrapolation.ipynb
│ │ ├── volume_and_ohlc_same_panel.ipynb
│ │ ├── widths_so75526312.ipynb
│ │ └── xlim_scenarios.ipynb
│ ├── simple_2curve_animation.py
│ ├── simple_multianimation.py
│ ├── styles.ipynb
│ ├── using_lines.ipynb
│ ├── widths.ipynb
│ └── yscale.ipynb
├── markdown/
│ ├── animation.md
│ ├── customization_and_styles.md
│ └── subplots.md
├── pytest.ini
├── readme.ipynb
├── scripts/
│ ├── check_version.py
│ ├── check_version.sh
│ ├── mplrcputils.py
│ ├── rcparams
│ └── version_update_check.py
├── setup.py
├── src/
│ └── mplfinance/
│ ├── __init__.py
│ ├── _arg_validators.py
│ ├── _helpers.py
│ ├── _kwarg_help.py
│ ├── _mpf_warnings.py
│ ├── _mplrcputils.py
│ ├── _mplwraps.py
│ ├── _panels.py
│ ├── _styledata/
│ │ ├── __init__.py
│ │ ├── binance.py
│ │ ├── binancedark.py
│ │ ├── blueskies.py
│ │ ├── brasil.py
│ │ ├── charles.py
│ │ ├── checkers.py
│ │ ├── classic.py
│ │ ├── default.py
│ │ ├── ibd.py
│ │ ├── kenan.py
│ │ ├── mike.py
│ │ ├── nightclouds.py
│ │ ├── sas.py
│ │ ├── starsandstripes.py
│ │ ├── tradingview.py
│ │ └── yahoo.py
│ ├── _styles.py
│ ├── _utils.py
│ ├── _version.py
│ ├── _widths.py
│ ├── original_flavor.py
│ └── plotting.py
└── tests/
├── conftest.py
├── original_flavor/
│ ├── test_date_demo1.py
│ ├── test_date_demo2.py
│ ├── test_finance_demo.py
│ ├── test_finance_work2.py
│ ├── test_longshort.py
│ └── test_plot_day_summary_oclh_demo.py
├── test_addplot.py
├── test_alines.py
├── test_ema.py
├── test_exceptions.py
├── test_fill_between.py
├── test_hlines.py
├── test_images/
│ └── placeholder
├── test_kwarg_help.py
├── test_pnf.py
├── test_renko.py
└── test_vlines.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/ISSUE_TEMPLATE/ask-a-question.md
================================================
---
name: Ask a Question
about: Question about usage, project priorities, or anything else related to mplfinance.
title: ''
labels: 'question'
assignees: ''
---
Ask anything you want about mplfinance usage, project philosophy and/or priorities, or anything else related to mplfinance.
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: 'Bug Report:'
labels: 'bug'
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Smartphone (please complete the following information):**
- Device: [e.g. iPhone6]
- OS: [e.g. iOS8.1]
- Browser [e.g. stock browser, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: 'Feature Request:'
labels: 'enhancement'
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/ISSUE_TEMPLATE/feedback.md
================================================
---
name: Feedback
about: What do you think of mplfinance? Pros? Cons? Thoughts?
title: 'Comment:'
labels: 'feedback'
assignees: ''
---
What do you think of mplfinance? Pros? Cons? Thoughts?
Thank you for taking the time to provide feedback. Much appreciated!
================================================
FILE: .github/workflows/mplfinance_checks.yml
================================================
name: mplfinance Checks
on: [ workflow_dispatch, pull_request ]
jobs:
Regression_Tests:
runs-on: ubuntu-20.04
strategy:
matrix:
python-version: ['3.8', '3.9', '3.10' ]
steps:
- name: Preliminary Information
run: |
echo "The job was automatically triggered by a ${{ github.event_name }} event."
echo "This job is now running on a ${{ runner.os }} server hosted by GitHub!"
echo "The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
echo " "
echo "github.ref = ${{ github.ref }}"
echo "github.sha = ${{ github.sha }}"
echo "github.event.pull_request.head.ref = ${{ github.event.pull_request.head.ref }}"
echo "github.event.pull_request.head.sha = ${{ github.event.pull_request.head.sha }}"
echo "github.event.pull_request.base.ref = ${{ github.event.pull_request.base.ref }}"
echo "github.event.pull_request.base.sha = ${{ github.event.pull_request.base.sha }}"
echo " "
- name: Check out repository code
uses: actions/checkout@v2
- run: echo "The ${{ github.repository }} repository has been cloned to the runner."
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
- name: Install My Package
run: pip install .
- name: Run Pytest
run: python -m pytest
- run: echo "This job's status is ${{ job.status }}."
Pull_Request_Updates_Version:
runs-on: ubuntu-20.04
if: github.event_name == 'pull_request'
steps:
- name: Check out repository code
uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: '3.10'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install packaging
- name: Fetch base and head on PR
if: ${{ github.event.pull_request.base.sha }}
run: |
git fetch origin master ${{ github.event.pull_request.base.sha }}
git fetch origin master ${{ github.event.pull_request.head.sha }}
- name: Check that Pull Request includes updating the Version
run: |
git show ${{ github.event.pull_request.base.sha }}:src/mplfinance/_version.py > scripts/tv0.py
git show ${{ github.sha }}:src/mplfinance/_version.py > scripts/tv1.py
python scripts/version_update_check.py tv0 tv1
================================================
FILE: .github/workflows/pubPyPI.yml
================================================
name: Upload Mplfinance to PyPI
on:
workflow_dispatch:
inputs:
tag:
description: 'version tag to deploy'
required: true
type: string
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
with:
ref: ${{ github.event.inputs.tag }}
- name: Display Coded Version
#run: git show ${{ github.sha }}:src/mplfinance/_version.py
run: egrep 'version_info .*=' src/mplfinance/_version.py
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build
run: |
python setup.py sdist bdist_wheel
ls -l dist/*
- name: Publish distribution to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: twine upload dist/*
================================================
FILE: .github/workflows/pubTestPyPI.yml
================================================
name: Upload Mplfinance to TestPyPI
on:
workflow_dispatch:
inputs:
tag:
description: 'version tag to deploy'
required: true
type: string
jobs:
build_and_deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v3
with:
ref: ${{ github.event.inputs.tag }}
- name: Display Coded Version
#run: git show ${{ github.sha }}:src/mplfinance/_version.py
run: egrep 'version_info .*=' src/mplfinance/_version.py
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build
run: |
python setup.py sdist bdist_wheel
ls -l dist/*
- name: Publish distribution to Test PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.TEST_PYPI_API_TOKEN }}
run: twine upload --repository-url https://test.pypi.org/legacy/ dist/*
================================================
FILE: .gitignore
================================================
doc/build
doc/examples
_as_gen
__pycache__
*.pyc
*.egg-info
.tox/
.cache/
*.code-workspace
*.ipynb_checkpoints/
================================================
FILE: CODE_OF_CONDUCT.md
================================================
#### All typical collaboration codes of conduct apply:
### Treat people fairly, with respect, and overall [be a mensch](https://www.google.com/search?q=mensch).
================================================
FILE: CONTRIBUTING.md
================================================
## Contributing Basics
- Contributing can be as simple as **asking questions**, participating in discussions, suggesting enhancements, etc. **All of these are valuable!** There are many ways to contribute. We also very much appreciate when you share the creative things you've done *using* mplfinance (both code and plot images). And, of course, writing code for mplfinance is also a great way to contribute. Thank you.
- All of the usual/typical open source contribution guidelines apply (see for example, **[Matplotlib Contributing](https://matplotlib.org/stable/devel/contributing.html)** and **[Open Source Guide to Contributing](https://opensource.guide/how-to-contribute/)**). Therefore, here, on this page, we will mention just a few items that we may be particular about in **mplfinance**.
---
## Fork Clone Workflow
- The standard workflow for contributing on GitHub is called **Fork/Clone**. For those who may not be familiar, here is a brief summary and some reference links.
- *We assume you are familiar with **git** basics: `git clone`, `git commit`, etc*.
- Note: a "Fork" is just a `git clone` *that is created on, and that lives on, GitHub.com*. You create a fork using the **Fork** button on GitHub: This allows GitHub to track the relationship between the original github repository, and your Fork. (In that sense a "fork" is slightly more than just a plain "clone", but only as much as GitHub.com adds some tracking and other minor features to make integration easier).
- The basic workflow is:
1. Create a **Fork** of the mplfinance repository. (See references below for details.) The fork will exist under *your* github account.
2. **Clone** *your* Fork to your local machine (`git clone`).
3. Work on your cloned copy of the repository, `git commit` the changes, and then **`git push`** them *to your GitHub fork*.
4. When you are satisfied with the code in your fork then, **on the GitHub page for your fork, *open a Pull Request (PR)***. A Pull Request effectively asks for the changes in your fork be pulled into the main mplfinance repository. The PR provides, on github, a place to see the changes, and to post comments and discussion about them.
5. After code review, if you are asked by a maintainer to make additional changes, you do *not* have to re-enter another Pull Request (as long as the original PR is still open). Rather, make the changes in your local clone, and simply `git push` them to your fork again. The changes will automatically flow into the open Pull Request.
6. When done, the maintainer of the repository will merge the changes from your fork into the mplfinance repository. The PR will automatically be closed. (Your fork, however, will continue to exist, and can be used again for additional Pull Requests in the future; See GitHub documentation for how to keep your Fork up to date).
- Some References:
- GitHub documentation:
- **https://docs.github.com/en/get-started/quickstart/contributing-to-projects**
- and some user gists:
- https://gist.github.com/Chaser324/ce0505fbed06b947d962
- https://gist.github.com/rjdmoore/ed014fba0ee2c7e75060ccd01b726cb8
---
## Coding Standards
- I am not super strict about adhearing to every aspect of PEP 8, *nor am I lenient*. I tend to walk the middle of the road: If something is a good and common, then it should be adheared to.
- Here are a few items that I (perhaps uniquely) tend to care about in particular:
- If you write code, please don't use tabs; rather use spaces.
- If you work on a pre-existing code file, please try to more-or-less emulate the style that already exists in that file.
- If you add a significant feature --that is, a feature for which explaining its usage takes more than just a few sentences-- please also create a "tutorial notebook" for that feature. **[For examples of tutorial notebooks, please see the jupyter notebooks in the examples folder.](https://github.com/matplotlib/mplfinance/tree/master/examples)**
- If you add a significant feature, please also create a regression test file **[in the tests folder](https://github.com/matplotlib/mplfinance/tree/master/tests)**, similar to the other regression tests that are there. *Often, the simplest way to do this is to take a few of the examples from the feature's "tutorial notebook"* (see previous point).
================================================
FILE: LICENSE
================================================
License agreement for mplfinance
=================================
1. This LICENSE AGREEMENT is between the Matplotlib Development Team
("MDT"), and the Individual or Organization ("Licensee") accessing and
otherwise using matplotlib software in source or binary form and its
associated documentation.
2. Subject to the terms and conditions of this License Agreement, MDT
hereby grants Licensee a nonexclusive, royalty-free, world-wide license
to reproduce, analyze, test, perform and/or display publicly, prepare
derivative works, distribute, and otherwise use matplotlib
alone or in any derivative version, provided, however, that MDT's
License Agreement and MDT's notice of copyright, i.e., "Copyright (c)
2012- Matplotlib Development Team; All Rights Reserved" are retained in
matplotlib alone or in any derivative version prepared by
Licensee.
3. In the event Licensee prepares a derivative work that is based on or
incorporates matplotlib or any part thereof, and wants to
make the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to matplotlib .
4. MDT is making matplotlib available to Licensee on an "AS
IS" basis. MDT MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, MDT MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF MATPLOTLIB
WILL NOT INFRINGE ANY THIRD PARTY RIGHTS.
5. MDT SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF MATPLOTLIB
FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR
LOSS AS A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING
MATPLOTLIB , OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF
THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between MDT and
Licensee. This License Agreement does not grant permission to use MDT
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.
8. By copying, installing or otherwise using matplotlib ,
Licensee agrees to be bound by the terms and conditions of this License
Agreement.
================================================
FILE: MANIFEST.in
================================================
include LICENSE
================================================
FILE: README.md
================================================
[](https://github.com/matplotlib/mplfinance/actions/workflows/mplfinance_checks.yml)
# mplfinance
matplotlib utilities for the visualization, and visual analysis, of financial data
## Installation
```bash
pip install --upgrade mplfinance
```
- mplfinance requires [matplotlib](https://pypi.org/project/matplotlib/) and [pandas](https://pypi.org/project/pandas/)
---
## <a name="announcements"></a>**⇾ [Latest Release Information](https://github.com/matplotlib/mplfinance/releases) ⇽**
#### <a name="announcements"></a> ⇾ **[Older Release Information](https://github.com/matplotlib/mplfinance/blob/master/RELEASE_NOTES.md)**
---
## <a name="tutorials"></a>Contents and Tutorials
- **[The New API](https://github.com/matplotlib/mplfinance#newapi)**
- **[Tutorials](https://github.com/matplotlib/mplfinance#tutorials)**
- **[Basic Usage](https://github.com/matplotlib/mplfinance#usage)**
- **[Customizing the Appearance of Plots](https://github.com/matplotlib/mplfinance/blob/master/markdown/customization_and_styles.md)**
- **[Adding Your Own Technical Studies to Plots](https://github.com/matplotlib/mplfinance/blob/master/examples/addplot.ipynb)**
- **[Subplots: Multiple Plots on a Single Figure](https://github.com/matplotlib/mplfinance/blob/master/markdown/subplots.md)**
- **[Fill Between: Filling Plots with Color](https://github.com/matplotlib/mplfinance/blob/master/examples/fill_between.ipynb)**
- **[Price-Movement Plots (Renko, P&F, etc)](https://github.com/matplotlib/mplfinance/blob/master/examples/price-movement_plots.ipynb)**
- **[Trends, Support, Resistance, and Trading Lines](https://github.com/matplotlib/mplfinance/blob/master/examples/using_lines.ipynb)**
- **[Coloring Individual Candlesticks](https://github.com/matplotlib/mplfinance/blob/master/examples/marketcolor_overrides.ipynb)** (New: December 2021)
- **[Saving the Plot to a File](https://github.com/matplotlib/mplfinance/blob/master/examples/savefig.ipynb)**
- **[Animation/Updating your plots in realtime](https://github.com/matplotlib/mplfinance/blob/master/markdown/animation.md)**
- **⇾ [Latest Release Info](https://github.com/matplotlib/mplfinance/releases) ⇽**
- **[Older Release Info](https://github.com/matplotlib/mplfinance/blob/master/RELEASE_NOTES.md)**
- **[Some Background History About This Package](https://github.com/matplotlib/mplfinance#history)**
- **[Old API Availability](https://github.com/matplotlib/mplfinance#oldapi)**
---
## <a name="newapi"></a>The New API
This repository, `matplotlib/mplfinance`, contains a new **matplotlib finance** API that makes it easier to create financial plots. It interfaces nicely with **Pandas** DataFrames.
*More importantly, **the new API automatically does the extra matplotlib work that the user previously had to do "manually" with the old API.*** (The old API is still available within this package; see below).
The conventional way to import the new API is as follows:
```python
import mplfinance as mpf
```
The most common usage is then to call
```python
mpf.plot(data)
```
where `data` is a `Pandas DataFrame` object containing Open, High, Low and Close data, with a Pandas `DatetimeIndex`.
Details on how to call the new API can be found below under **[Basic Usage](https://github.com/matplotlib/mplfinance#usage)**, as well as in the jupyter notebooks in the **[examples](https://github.com/matplotlib/mplfinance/blob/master/examples/)** folder.
I am very interested to hear from you regarding what you think of the new `mplfinance`, plus any suggestions you may have for improvement. You can reach me at **dgoldfarb.github@gmail.com** or, if you prefer, provide feedback or a ask question on our **[issues page.](https://github.com/matplotlib/mplfinance/issues/new/choose)**
---
## <a name="usage"></a>Basic Usage
Start with a Pandas DataFrame containing OHLC data. For example,
```python
import pandas as pd
daily = pd.read_csv('examples/data/SP500_NOV2019_Hist.csv',index_col=0,parse_dates=True)
daily.index.name = 'Date'
daily.shape
daily.head(3)
daily.tail(3)
```
(20, 5)
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Open</th>
<th>High</th>
<th>Low</th>
<th>Close</th>
<th>Volume</th>
</tr>
<tr>
<th>Date</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>2019-11-01</th>
<td>3050.72</td>
<td>3066.95</td>
<td>3050.72</td>
<td>3066.91</td>
<td>510301237</td>
</tr>
<tr>
<th>2019-11-04</th>
<td>3078.96</td>
<td>3085.20</td>
<td>3074.87</td>
<td>3078.27</td>
<td>524848878</td>
</tr>
<tr>
<th>2019-11-05</th>
<td>3080.80</td>
<td>3083.95</td>
<td>3072.15</td>
<td>3074.62</td>
<td>585634570</td>
</tr>
</tbody>
</table>
...
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Open</th>
<th>High</th>
<th>Low</th>
<th>Close</th>
<th>Volume</th>
</tr>
<tr>
<th>Date</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>2019-11-26</th>
<td>3134.85</td>
<td>3142.69</td>
<td>3131.00</td>
<td>3140.52</td>
<td>986041660</td>
</tr>
<tr>
<th>2019-11-27</th>
<td>3145.49</td>
<td>3154.26</td>
<td>3143.41</td>
<td>3153.63</td>
<td>421853938</td>
</tr>
<tr>
<th>2019-11-29</th>
<td>3147.18</td>
<td>3150.30</td>
<td>3139.34</td>
<td>3140.98</td>
<td>286602291</td>
</tr>
</tbody>
</table>
<br>
After importing mplfinance, plotting OHLC data is as simple as calling `mpf.plot()` on the dataframe
```python
import mplfinance as mpf
mpf.plot(daily)
```

<br>
The default plot type, as you can see above, is `'ohlc'`. Other plot types can be specified with the keyword argument `type`, for example, `type='candle'`, `type='line'`, `type='renko'`, or `type='pnf'`
```python
mpf.plot(daily,type='candle')
```

```python
mpf.plot(daily,type='line')
```

```python
year = pd.read_csv('examples/data/SPY_20110701_20120630_Bollinger.csv',index_col=0,parse_dates=True)
year.index.name = 'Date'
mpf.plot(year,type='renko')
```

```python
mpf.plot(year,type='pnf')
```

---
<br>
We can also plot moving averages with the `mav` keyword
- use a scalar for a single moving average
- use a tuple or list of integers for multiple moving averages
```python
mpf.plot(daily,type='ohlc',mav=4)
```

```python
mpf.plot(daily,type='candle',mav=(3,6,9))
```

---
We can also display `Volume`
```python
mpf.plot(daily,type='candle',mav=(3,6,9),volume=True)
```

Notice, in the above chart, there are no gaps along the x-coordinate, even though there are days on which there was no trading. ***Non-trading days are simply not shown*** (since there are no prices for those days).
- However, sometimes people like to see these gaps, so that they can tell, with a quick glance, where the weekends and holidays fall.
- Non-trading days can be displayed with the **`show_nontrading`** keyword.
- Note that for these purposes **non-trading** intervals are those that ***are not represented in the data at all***. (There are simply no rows for those dates or datetimes). This is because, when data is retrieved from an exchange or other market data source, that data typically will *not* include rows for non-trading days (weekends and holidays for example). Thus ...
- **`show_nontrading=True`** will display all dates (all time intervals) between the first time stamp and the last time stamp in the data (regardless of whether rows exist for those dates or datetimes).
- **`show_nontrading=False`** (the default value) will show ***only*** dates (or datetimes) that have actual rows in the data. (This means that if there are rows in your DataFrame that exist but contain only **`NaN`** values, these rows *will still appear* on the plot even if **`show_nontrading=False`**)
- For example, in the chart below, you can easily see weekends, as well as a gap at Thursday, November 28th for the U.S. Thanksgiving holiday.
```python
mpf.plot(daily,type='candle',mav=(3,6,9),volume=True,show_nontrading=True)
```

---
We can also plot intraday data:
```python
intraday = pd.read_csv('examples/data/SP500_NOV2019_IDay.csv',index_col=0,parse_dates=True)
intraday = intraday.drop('Volume',axis=1) # Volume is zero anyway for this intraday data set
intraday.index.name = 'Date'
intraday.shape
intraday.head(3)
intraday.tail(3)
```
(1563, 4)
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Open</th>
<th>Close</th>
<th>High</th>
<th>Low</th>
</tr>
<tr>
<th>Date</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>2019-11-05 09:30:00</th>
<td>3080.80</td>
<td>3080.49</td>
<td>3081.47</td>
<td>3080.30</td>
</tr>
<tr>
<th>2019-11-05 09:31:00</th>
<td>3080.33</td>
<td>3079.36</td>
<td>3080.33</td>
<td>3079.15</td>
</tr>
<tr>
<th>2019-11-05 09:32:00</th>
<td>3079.43</td>
<td>3079.68</td>
<td>3080.46</td>
<td>3079.43</td>
</tr>
</tbody>
</table>
...
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Open</th>
<th>Close</th>
<th>High</th>
<th>Low</th>
</tr>
<tr>
<th>Date</th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>2019-11-08 15:57:00</th>
<td>3090.73</td>
<td>3090.70</td>
<td>3091.02</td>
<td>3090.52</td>
</tr>
<tr>
<th>2019-11-08 15:58:00</th>
<td>3090.73</td>
<td>3091.04</td>
<td>3091.13</td>
<td>3090.58</td>
</tr>
<tr>
<th>2019-11-08 15:59:00</th>
<td>3091.16</td>
<td>3092.91</td>
<td>3092.91</td>
<td>3090.96</td>
</tr>
</tbody>
</table>
The above dataframe contains Open,High,Low,Close data at 1 minute intervals for the S&P 500 stock index for November 5, 6, 7 and 8, 2019. Let's look at the last hour of trading on November 6th, with a 7 minute and 12 minute moving average.
```python
iday = intraday.loc['2019-11-06 15:00':'2019-11-06 16:00',:]
mpf.plot(iday,type='candle',mav=(7,12))
```

The "time-interpretation" of the `mav` integers depends on the frequency of the data, because the mav integers are the *number of data points* used in the Moving Average (not the number of days or minutes, etc). Notice above that for intraday data the x-axis automatically displays TIME *instead of* date. Below we see that if the intraday data spans into two (or more) trading days the x-axis automatically displays *BOTH* TIME and DATE
```python
iday = intraday.loc['2019-11-05':'2019-11-06',:]
mpf.plot(iday,type='candle')
```

---
In the plot below, we see what an intraday plot looks like when we **display non-trading time periods** with **`show_nontrading=True`** for intraday data spanning into two or more days.
```python
mpf.plot(iday,type='candle',show_nontrading=True)
```

---
Below: 4 days of intraday data with `show_nontrading=True`
```python
mpf.plot(intraday,type='ohlc',show_nontrading=True)
```

---
Below: the same 4 days of intraday data with `show_nontrading` defaulted to `False`.
```python
mpf.plot(intraday,type='line')
```

---
Below: Daily data spanning across a year boundary automatically adds the *YEAR* to the DATE format
```python
df = pd.read_csv('examples/data/yahoofinance-SPY-20080101-20180101.csv',index_col=0,parse_dates=True)
df.shape
df.head(3)
df.tail(3)
```
(2519, 6)
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Open</th>
<th>High</th>
<th>Low</th>
<th>Close</th>
<th>Adj Close</th>
<th>Volume</th>
</tr>
<tr>
<th>Date</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>2007-12-31</th>
<td>147.100006</td>
<td>147.610001</td>
<td>146.059998</td>
<td>146.210007</td>
<td>118.624741</td>
<td>108126800</td>
</tr>
<tr>
<th>2008-01-02</th>
<td>146.529999</td>
<td>146.990005</td>
<td>143.880005</td>
<td>144.929993</td>
<td>117.586205</td>
<td>204935600</td>
</tr>
<tr>
<th>2008-01-03</th>
<td>144.910004</td>
<td>145.490005</td>
<td>144.070007</td>
<td>144.860001</td>
<td>117.529449</td>
<td>125133300</td>
</tr>
</tbody>
</table>
...
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Open</th>
<th>High</th>
<th>Low</th>
<th>Close</th>
<th>Adj Close</th>
<th>Volume</th>
</tr>
<tr>
<th>Date</th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>2017-12-27</th>
<td>267.380005</td>
<td>267.730011</td>
<td>267.010010</td>
<td>267.320007</td>
<td>267.320007</td>
<td>57751000</td>
</tr>
<tr>
<th>2017-12-28</th>
<td>267.890015</td>
<td>267.920013</td>
<td>267.450012</td>
<td>267.869995</td>
<td>267.869995</td>
<td>45116100</td>
</tr>
<tr>
<th>2017-12-29</th>
<td>268.529999</td>
<td>268.549988</td>
<td>266.640015</td>
<td>266.859985</td>
<td>266.859985</td>
<td>96007400</td>
</tr>
</tbody>
</table>
```python
mpf.plot(df[700:850],type='bars',volume=True,mav=(20,40))
```

For more examples of using mplfinance, please see the jupyter notebooks in the **[`examples`](https://github.com/matplotlib/mplfinance/blob/master/examples/)** directory.
---
## <a name="history"></a>Some History
My name is Daniel Goldfarb. In November 2019, I became the maintainer of `matplotlib/mpl-finance`. That module is being deprecated in favor of the current `matplotlib/mplfinance`. The old `mpl-finance` consisted of code extracted from the deprecated `matplotlib.finance` module along with a few examples of usage. It has been mostly un-maintained for the past three years.
It is my intention to archive the `matplotlib/mpl-finance` repository soon, and direct everyone to `matplotlib/mplfinance`. The main reason for the rename is to avoid confusion with the hyphen and the underscore: As it was, `mpl-finance` was *installed with the hyphen, but imported with an underscore `mpl_finance`.* Going forward it will be a simple matter of both installing and importing `mplfinance`.
---
## <a name="oldapi"></a>Old API availability
**With this new ` mplfinance ` package installed, in addition to the new API, users can still access the old API**.<br> The old API may be removed someday, but for the foreseeable future we will keep it ... at least until we are very confident that users of the old API can accomplish the same things with the new API.
To access the old API with the new ` mplfinance ` package installed, change the old import statements
**from:**
```python
from mpl_finance import <method>
```
**to:**
```python
from mplfinance.original_flavor import <method>
```
where `<method>` indicates the method you want to import, for example:
```python
from mplfinance.original_flavor import candlestick_ohlc
```
================================================
FILE: RELEASE_NOTES.md
================================================
####
---
### <a name="v0.12.7a17"></a>v0.12.7a17 released 2021-04-23
- <a name="v0.12.7a17"></a>v0.12.7a17 merged 2021-04-22
- max panels to 32 (up from 10) ([Issue #377](https://github.com/matplotlib/mplfinance/issues/377))
- <a name="v0.12.7a16"></a>v0.12.7a16 merged 2021-04-22
- New plot type **`step`** for step/staircase lines in `mpf.make_addplot()` (Thank you [@pankaj3009](https://github.com/pankaj3009))
- <a name="v0.12.7a15"></a>v0.12.7a15 merged 2021-04-22
- Add **`reversal`** parameter to Point and Figure charts. (Thank you [Caleb Coffin](https://github.com/coffincw), for coding up [Issue 368](https://github.com/matplotlib/mplfinance/issues/368))
- <a name="v0.12.7a14"></a>v0.12.7a14 merged 2021-04-18<br>
<a name="v0.12.7a13"></a>v0.12.7a13 merged 2021-04-18
- Allow **`os.PathLike`** (**`pathlib.Path`**) objects in **`savefig`** (Thank you [Matt Stancliff](https://github.com/mattsta))
### <a name="v0.12.7a12"></a>v0.12.7a12 released 2021-04-09
- <a name="v0.12.7a12"></a>v0.12.7a12 merged 2021-04-08
- Fixed kwarg **`return_calculated_values`**
- It was *not* returning all values for `type='pnf'` (point and figure).
- See **[stackoverflow 66991998](https://stackoverflow.com/questions/66991998/)** for more information.
- <a name="v0.12.7a11"></a>v0.12.7a11 merged 2021-03-26
- Prior to this version, **`xlim`** kwarg accepted only float or int:
- float as matplotlib date; (only when `show_nontrading=True`)
- int or float as dataframe row number; (only when `show_nontrading=False`)
- **`xlim`** kwarg now *also* accepts
- date or datetime **string**
- date or datetime **object** (`datetime.datetime` or `pandas.Timestamp`)
---
### <a name="v0.12.7a10"></a>v0.12.7a10 released 2021-03-15
- <a name="v0.12.7a10"></a>v0.12.7a10 merged 2021-03-15
- Add warning when user tries to plot "too much data" which includes reference to documentation
- Add [**documentation on "Too Much Data"**](https://github.com/matplotlib/mplfinance/wiki/Plotting-Too-Much-Data).
- <a name="v0.12.7a9"></a>v0.12.7a9 merged 2021-03-01
- new kwarg **`fontscale`** to scale font sizes on plot.
- fix bug in `mpf.make_mpf_style()`
- was only an issue when kwargs `base_mpf_style` and `rc` are used at the same time; see comments in code for more detail.
- <a name="v0.12.7a9"></a>v0.12.7a9 merged 2021-02-27
- fix `check_version.sh` to always fetch latest version of `pip`.
- See https://travis-ci.community/t/pandas-version-advanced-starting-in-jan-2021-numpy-is-now-incompatible/11214
- <a name="v0.12.7a8"></a>v0.12.7a8 merged 2021-02-23
- support `yscale` kwarg. (See also [**`yscale.ipynb`**](https://github.com/matplotlib/mplfinance/blob/master/examples/yscale.ipynb), and [issue 21](https://github.com/matplotlib/mplfinance/issues/21)).
---
### <a name="v0.12.7a7"></a>v0.12.7a7 released 2021-02-22
- Support [**`type=hollow_and_filled` candles**](https://github.com/matplotlib/mplfinance/blob/master/examples/hollow_and_filled_candles.ipynb). (Thank you [Kenan Arik](https://github.com/KenanHArik))
- Add example to show [10 years of daily data and how resampling affects candlesticks](https://github.com/matplotlib/mplfinance/blob/master/examples/resample10years.ipynb). (See also [issue 307](https://github.com/matplotlib/mplfinance/issues/307))
- new function: **`mpf.write_style_file(style,filename)`** allows users to save their custom mpf styles.
- support alias names for plot types. <br>(for example "candle" is the same as "candlestick", and "hollow" is the same as "hollow_and_filled").
- new styles: "**ibd**" and "**kenan**".
- kwarg `scale_widths_adjustment` now supports `volume_linewidth`, `ohlc_linewidth`, and `candle_linewidth`. <br>(see also [widths notebook/tutorial](https://github.com/matplotlib/mplfinance/blob/master/examples/widths.ipynb))
---
### <a name="v0.12.7a5"></a>v0.12.7a5 released 2021-01-23
- Add `style_name` kwarg to `mpf.make_mpf_style()`
- Add `vcdopcod` kwarg to `mpf.make_marketcolors()` (volume color depends on price change-on-day).
---
### <a name="v0.12.7a4"></a>v0.12.7a4 released 2020-12-22
- fix [timezone bug](https://github.com/matplotlib/mplfinance/issues/236).
- set kwarg `tz_localize=False` for legacy timezone behavior
- <a name="v0.12.7a3"></a>v0.12.7a3 merged 2020-12-21
- calculate volume exponent ( more efficient than extra call to `draw()`)
- support `volume_exponent` kwarg to allow user to manually choose volume exponent.
- add version information to pytest logs
- <a name="v0.12.7a2"></a>v0.12.7a2 merged 2020-10-21
- Add "[growing candle animation](https://github.com/matplotlib/mplfinance/blob/master/examples/mpf_animation_growingcandle.py)" to examples.
- Bug fix for [issue #279](https://github.com/matplotlib/mplfinance/issues/279) `Mpf_Figure.subplots()` not working (always raising exception).
- <a name="v0.12.7a1"></a>v0.12.7a1 merged 2020-08-16
- Support passing `dict` for kwarg `title=` (instead of just string) to allow modification of title font and all other kwargs available to matplotlib's [`Figure.suptitle()`](https://matplotlib.org/3.3.4/api/_as_gen/matplotlib.figure.Figure.html#matplotlib.figure.Figure.suptitle): The dict must include `title=<string>`. Then just add whatever `Figure.suptitle()` kwargs to the dict that is passed to mplfinance's kwarg `title=`. [Thank you Teddy Rowan](https://github.com/matplotlib/mplfinance/pull/237)
---
### <a name="v0.12.7a0"></a>v0.12.7a0 released 2020-08-09
#### Enhancements
- [**External Axes Mode**](https://github.com/matplotlib/mplfinance/blob/master/markdown/subplots.md#external-axes-method)
- [Issue #114: Display multiple plots in a row](https://github.com/matplotlib/mplfinance/issues/114).
- [Issue #209: Allow plotting on the existing AXIS](https://github.com/matplotlib/mplfinance/issues/209).
- [**Animation Support**](https://github.com/matplotlib/mplfinance/blob/master/markdown/animation.md#animation-support-in-mplfinance):
- [Issue #25: Support animation/live updating of OHLCV data plots](https://github.com/matplotlib/mplfinance/issues/25).
---
### <a name="v0.12.6a3"></a>v0.12.6a3 released 2020-06-28
- accept lower case column names in dataframe (i.e. 'close' is the same as 'Close') ([Issue #197](https://github.com/matplotlib/mplfinance/issues/197))
---
### <a name="v0.12.6a2"></a>v0.12.6a2 released 2020-06-28
- `tight_layout` now supports adjusting Figure borders (padding) around plot. ([Issue #196](https://github.com/matplotlib/mplfinance/issues/196))
---
### <a name="v0.12.6a1"></a>v0.12.6a1 released 2020-06-25
- `make_mpf_style()` may set `y_on_right=None`: prevent crash by treating `None` the same as `False`. ([Issue #190](https://github.com/matplotlib/mplfinance/issues/190))
---
### <a name="v0.12.6a0"></a>v0.12.6a0 released 2020-06-24
#### Enhancements
- **`make_addplot()`** enhancements:
- **support `type=` ` ohlc ` and ` candle ` (issue [#168](https://github.com/matplotlib/mplfinance/issues/168))**
- support ` mav ` kwarg
- support `y_on_right` kwarg
- support `ylim` kwarg
- expand impact of `width` and `alpha` kwargs (originally affected only `make_addplot(data,type='bar')` plots).
- use `alpha` also on `scatter` plots.
- use `width` and `alpha` also on `line` plots (issue [#185](https://github.com/matplotlib/mplfinance/issues/185))
- improve default line-widths algorithm
- rename `set_ylim` kwarg to `ylim` to be consistent with `ylabel` kwarg.
- deprecate `set_ylim_panelB` (use `ylim` in `make_addplot()` instead).
#### Bug fixes
- `axisoff` and `tight_layout` should be independent of each other (issue [#180](https://github.com/matplotlib/mplfinance/issues/180))
- fix Spyder console block/hang when _not inline_ call `mpf.plot()`. (issues [#151](https://github.com/matplotlib/mplfinance/issues/151) and [#183](https://github.com/matplotlib/mplfinance/issues/183))
- fix incorrect linestyles character for dotted (issue [#186](https://github.com/matplotlib/mplfinance/issues/186))
---
### <a name="v0.12.5a3"></a>v0.12.5a3 released 2020-06-16
#### Enhancements
- improvements to width adjustment algorithm (issue [#174](https://github.com/matplotlib/mplfinance/issues/174))
- automatic width adjustment now also adjusts `mav` lines widths. (issue [#171](https://github.com/matplotlib/mplfinance/issues/171))
---
### <a name="v0.12.5a2"></a>v0.12.5a2 released 2020-06-08
#### Enhancements
- Support setting `ylabel` in `make_addplot()` (Thank you [Andy Sum](https://github.com/AndySum) for coding.)
- Add `saxbelow` kwarg to `set_axisbelow()`, defaults to `True` so grid lines do not show through candles, etc.
#### Buf Fixes
- fix `tight_layout` issue [#156](https://github.com/matplotlib/mplfinance/issues/156) (`tight_layout` not affecting Figure Title; Thank you [Markus Schulze](https://github.com/fxhuhn) for pointing this out.)
---
### <a name="v0.12.5a1"></a>v0.12.5a1 released 2020-06-07
#### Enhancements
- **[Subplots: Create up to 10 "panels"](https://github.com/matplotlib/mplfinance/blob/master/markdown/subplots.md)**
- Can modify relative sizes of panels
- Can modify which is "main" panel
- Can modify which is "volume" panel
- addplot can plot to any panel
- MACD example
- support bar charts in make_addplot (`type=` 'line', 'scatter', or 'bar')
- make_addplot scatter now supports *sequence of markers* and sequence of colors<br>(Thank you [Elan Ernest](https://github.com/ImportanceOfBeingErnest) for posting the [sequence of markers solution here](https://github.com/matplotlib/matplotlib/issues/11155#issuecomment-385939618))
- ability to custom format date/time labels ( ` datetime_format= `) (Thank you [Cam McLean](https://github.com/cammclean182))
- ability to rotate date/time labels (` xrotation= `)
- ability to turn axis off (`axisoff=True`) (Thank you [Will Whitty](https://github.com/tavurth) for testing, code review, and contributing code changes)
- support ` tight_layout=True `
- support ` fill_between= `
- new algorithm for adjustment of candle widths, line widths, volume widths, ohlc tick widths **default change** (Thank you [Charles](https://github.com/char101) for your help).
- ability to scale the algorithm (up or down)
- ability to override the algorithm (i.e. set width and linewidth of volume bars, candles, ohlc bars. (iss num 81))
- close plot when not needed to stay open **default change**
- fixes "20 open plots" warning
- removed code to close plots from regression tests: no longer needed
- support NaNs in data to indicate missing data (also fix bug related to min/max and mav when NaNs in data) **default change** (Thank you [Charles](https://github.com/char101) for your help)
- allows display low liquidity
- remove support for -1 meaning missing data. -1 is now considered valid data.
- Travis check to ensure each Pull Request has a new version (Thank you [Aaron Soellinger](https://github.com/free-soellingeraj))
- remove rcParams context: modifications made by mplfinance are now availabile after calling mplfinance. **default change**
#### Bug Fixes
- fix bug displaying a single candle
- fix bug "StatisticsError" when only a single data point
- fix poor choice of default color for ` type=line ` chart **default change**
- fix `savefig` Figure Facecolor bug
- fix ohlc bars color in "blueskies" style **default change**
---
---
### v0.12.4a0 released 2020-05-01
- regression tests for new API
- **[Renko plots](https://github.com/matplotlib/mplfinance/blob/master/examples/price-movement_plots.ipynb)** [(issue #11)](https://github.com/matplotlib/mplfinance/issues/11) (Thank you [Caleb Coffin @coffincw](https://github.com/coffincw))
- **`style='binance'`** (Thank you [@akgna](https://github.com/akgnah))
- return Figure and Axes (**`return_fig=True`**) ([issue #46](https://github.com/matplotlib/mplfinance/issues/46))
- check that inputs are all float, and rename IPython.display.Iamge to avoid confusion with PIL.Image
- ability to **`return_calculated_values=True`** ([issue #63](https://github.com/matplotlib/mplfinance/issues/63)) (Thank you [@WHug0](https://github.com/WHug0))
- **[Point and Figure (`type='pnf'`) plots.](https://github.com/matplotlib/mplfinance/blob/master/examples/price-movement_plots.ipynb)** (Thank you [Caleb Coffin @coffincw](https://github.com/coffincw))
- custom column names (Thank you [@borgstrom](https://github.com/borgstrom))
- **`set_ylim`** and **`set_ylim_panelB`** kwargs
- **`hlines`**, **`vlines`**, **`alines`**, **`tlines`** **[Trend, Support, Resistance, and Trading/Signal lines](https://github.com/matplotlib/mplfinance/blob/master/examples/using_lines.ipynb)**
- (Thank you [Aaron Soellinger @free-soellingeraj](https://github.com/free-soellingeraj) for writing regression tests for this.)
---
- **v0.12.3a3 released 2020-03-04**
- `linecolor` kwarg for line plots (Thank you [Caleb Coffin @coffincw](https://github.com/coffincw))
- implement save figure to in-memory buffer (Thank you [Caleb Coffin @coffincw](https://github.com/coffincw))
---
- **v0.12.3a2 released 2020-02-21**
- implement custom markers (issue#30) (Thank you [Amir Atashin @amiaty](https://github.com/amiaty))
- fix minor issue with chart `type` validator (Thank you [Amir Atashin @amiaty](https://github.com/amiaty))
- add internal functions: `_bypass_kwarg_validation()` and `_kwarg_not_implemented()`
---
- **v0.12.3a1 Released 2020-02-16**
- fix issue#28: math.log crash on zero in data
- remove "Implemented" field from kwarg dicts
- yahoo style show colors for `ohlc bars`
---
- **v0.12.3a0 Released 2020-02-12**
- kwarg `block=False` for non-blocking call to `mpf.plot()`
- customize aspect ratio, figure title, y-labels
- customize colors and other `style` aspects of plot
- `no_xgaps` now defaults to True: use `show_nontrading=True` to set no_xgaps to false
- secondary y-axis available to `make_addplot()`
- bug fix for volume widths
---
- **v0.12.0a3 Released 2020-01-16**
- Increase mav limit from 3 to 7 different mavs
---
- **v0.12.0a2 Released 2020-01-14**
- Ability to save plot to a file (pdf, svg, png, jpg, ...)
---
- **v0.12.0a1 Released 2020-01-09**
- Ability to plot arbitrary user data (in addition to basic OHLCV data).
- both line and scatter plots available.
- optionally plot on either the "main" or "lower" (aka "volume") axis.
---
- **v0.11.x Released 2019-12-20**
- Basic Plotting from Pandas DataFrame of OHLC bars and candlesticks.
- optional display of volume
- optional display of (up to 3 different) moving averages.
- old API still available by importing from "mplfinance/original_flavor"
---
- **v0.10.x Released 2016-09-08**
- Old mpl-finance API set up as its own package<br>(i.e. removed from the matplotlib package).
================================================
FILE: TODO.md
================================================
# Wish List - TODO - To Prioritize
- pass in Figure and Axes enhancement
- clean up code for easier maintenance
- how use configuration file
- auto-pull updates for config file. possible?
- collect anonymous data on feature usage
- wrappers for technical studies.
- documentation (replace old `https://matplotlib.org/api/finance_api.html`)
- make code more efficient (ex: tlines reconstructing data frame).
- **daily plot slower than intraday ???**
- add kwarg to print all kwargs information (kwarg and short description).
- fill the 'Description' fields in the kwarg dicts of these functions: `egrep -i 'def .*valid.*kwarg' *.py`
================================================
FILE: archive.tox.ini
================================================
# Tox (http://tox.testrun.org/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.
[tox]
envlist = py36, py37, py38
[pytest]
python_files = tests/*
[testenv]
deps =
matplotlib
numpy
pandas
pytest
setenv =
# don't use interactive backend for matplotlib in e2e tests
MPLBACKEND = agg
commands =
pytest
================================================
FILE: archive.travis.yml
================================================
dist: xenial
sudo: false
language: python
matrix:
include:
- python: 3.6
- python: 3.7
- python: 3.8
install:
- pip install tox-travis
script:
- tox
- /bin/bash scripts/check_version.sh $TRAVIS_PULL_REQUEST
================================================
FILE: doc/Makefile
================================================
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
.PHONY: help
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " epub3 to make an epub3"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
@echo " dummy to check syntax errors of document sources"
.PHONY: clean
clean:
rm -rf $(BUILDDIR)/*
.PHONY: html
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
.PHONY: dirhtml
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
.PHONY: singlehtml
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
.PHONY: pickle
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
.PHONY: json
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
.PHONY: htmlhelp
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
.PHONY: qthelp
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/mpl_finance.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/mpl_finance.qhc"
.PHONY: applehelp
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
.PHONY: devhelp
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/mpl_finance"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/mpl_finance"
@echo "# devhelp"
.PHONY: epub
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
.PHONY: epub3
epub3:
$(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3
@echo
@echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3."
.PHONY: latex
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
.PHONY: latexpdf
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: latexpdfja
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
.PHONY: text
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
.PHONY: man
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
.PHONY: texinfo
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
.PHONY: info
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
.PHONY: gettext
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
.PHONY: changes
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
.PHONY: linkcheck
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
.PHONY: doctest
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
.PHONY: coverage
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
.PHONY: xml
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
.PHONY: pseudoxml
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
.PHONY: dummy
dummy:
$(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy
@echo
@echo "Build finished. Dummy builder generates no files."
================================================
FILE: doc/README
================================================
The module documentation is generated with Sphinx.
Run "make html" to generate HTML. Then view build/index.html.
================================================
FILE: doc/make.bat
================================================
@ECHO OFF
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set BUILDDIR=build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source
set I18NSPHINXOPTS=%SPHINXOPTS% source
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. singlehtml to make a single large HTML file
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. devhelp to make HTML files and a Devhelp project
echo. epub to make an epub
echo. epub3 to make an epub3
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. text to make text files
echo. man to make manual pages
echo. texinfo to make Texinfo files
echo. gettext to make PO message catalogs
echo. changes to make an overview over all changed/added/deprecated items
echo. xml to make Docutils-native XML files
echo. pseudoxml to make pseudoxml-XML files for display purposes
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
echo. coverage to run coverage check of the documentation if enabled
echo. dummy to check syntax errors of document sources
goto end
)
if "%1" == "clean" (
for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
del /q /s %BUILDDIR%\*
goto end
)
REM Check if sphinx-build is available and fallback to Python version if any
%SPHINXBUILD% 1>NUL 2>NUL
if errorlevel 9009 goto sphinx_python
goto sphinx_ok
:sphinx_python
set SPHINXBUILD=python -m sphinx.__init__
%SPHINXBUILD% 2> nul
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.http://sphinx-doc.org/
exit /b 1
)
:sphinx_ok
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
goto end
)
if "%1" == "singlehtml" (
%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
echo.^> qcollectiongenerator %BUILDDIR%\qthelp\mpl_finance.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile %BUILDDIR%\qthelp\mpl_finance.ghc
goto end
)
if "%1" == "devhelp" (
%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
if errorlevel 1 exit /b 1
echo.
echo.Build finished.
goto end
)
if "%1" == "epub" (
%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub file is in %BUILDDIR%/epub.
goto end
)
if "%1" == "epub3" (
%SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The epub3 file is in %BUILDDIR%/epub3.
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
if errorlevel 1 exit /b 1
echo.
echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdf" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf
cd %~dp0
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "latexpdfja" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
cd %BUILDDIR%/latex
make all-pdf-ja
cd %~dp0
echo.
echo.Build finished; the PDF files are in %BUILDDIR%/latex.
goto end
)
if "%1" == "text" (
%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The text files are in %BUILDDIR%/text.
goto end
)
if "%1" == "man" (
%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The manual pages are in %BUILDDIR%/man.
goto end
)
if "%1" == "texinfo" (
%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
goto end
)
if "%1" == "gettext" (
%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
if errorlevel 1 exit /b 1
echo.
echo.The overview file is in %BUILDDIR%/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
if errorlevel 1 exit /b 1
echo.
echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
if errorlevel 1 exit /b 1
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
goto end
)
if "%1" == "coverage" (
%SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
if errorlevel 1 exit /b 1
echo.
echo.Testing of coverage in the sources finished, look at the ^
results in %BUILDDIR%/coverage/python.txt.
goto end
)
if "%1" == "xml" (
%SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The XML files are in %BUILDDIR%/xml.
goto end
)
if "%1" == "pseudoxml" (
%SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
if errorlevel 1 exit /b 1
echo.
echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
goto end
)
if "%1" == "dummy" (
%SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy
if errorlevel 1 exit /b 1
echo.
echo.Build finished. Dummy builder generates no files.
goto end
)
:end
================================================
FILE: doc/source/conf.py
================================================
# -*- coding: utf-8 -*-
#
# mpl_finance documentation build configuration file, created by
# sphinx-quickstart on Sat Jan 7 14:48:13 2017.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import os
# import sys
# sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#
# needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.autodoc', 'numpydoc', 'sphinx.ext.intersphinx',
'sphinx.ext.autosummary', 'matplotlib.sphinxext.plot_directive',
]
autosummary_generate = True
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
#
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#
# source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'mpl_finance'
copyright = u'2018, Matplotlib Developers'
author = u'Matplotlib Developers'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = u'0.10.0'
# The full version, including alpha/beta/rc tags.
release = u'0.10.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#
# today = ''
#
# Else, today_fmt is used as the format for a strftime call.
#
# today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This patterns also effect to html_static_path and html_extra_path
exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all
# documents.
#
# default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#
# add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#
# add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#
# show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
# modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
# keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
#
# html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#
# html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
# html_theme_path = []
# The name for this set of Sphinx documents.
# "<project> v<release> documentation" by default.
#
# html_title = u'mpl_finance v0.10.0'
# A shorter title for the navigation bar. Default is the same as html_title.
#
# html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#
# html_logo = None
# The name of an image file (relative to this directory) to use as a favicon of
# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#
# html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = []
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#
# html_extra_path = []
# If not None, a 'Last updated on:' timestamp is inserted at every page
# bottom, using the given strftime format.
# The empty string is equivalent to '%b %d, %Y'.
#
# html_last_updated_fmt = None
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#
# html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#
# html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#
# html_additional_pages = {}
# If false, no module index is generated.
#
# html_domain_indices = True
# If false, no index is generated.
#
# html_use_index = True
# If true, the index is split into individual pages for each letter.
#
# html_split_index = False
# If true, links to the reST sources are added to the pages.
#
# html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#
# html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#
# html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#
# html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
# html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh'
#
# html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# 'ja' uses this config value.
# 'zh' user can custom change `jieba` dictionary path.
#
# html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#
# html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'mpl_financedoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#
# 'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#
# 'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#
# 'preamble': '',
# Latex figure (float) alignment
#
# 'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'mpl_finance.tex', u'mpl\\_finance Documentation',
u'Matplotlib Developers', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#
# latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#
# latex_use_parts = False
# If true, show page references after internal links.
#
# latex_show_pagerefs = False
# If true, show URL addresses after external links.
#
# latex_show_urls = False
# Documents to append as an appendix to all manuals.
#
# latex_appendices = []
# It false, will not define \strong, \code, itleref, \crossref ... but only
# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added
# packages.
#
# latex_keep_old_macro_names = True
# If false, no module index is generated.
#
# latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'mpl_finance', u'mpl_finance Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#
# man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'mpl_finance', u'mpl_finance Documentation',
author, 'mpl_finance', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#
# texinfo_appendices = []
# If false, no module index is generated.
#
# texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#
# texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#
# texinfo_no_detailmenu = False
intersphinx_mapping = {
'python': ('https://docs.python.org/3/', None),
'numpy': ('https://docs.scipy.org/doc/numpy/', None),
'scipy': ('https://docs.scipy.org/doc/scipy/reference/', None),
'pandas': ('http://pandas.pydata.org/pandas-docs/stable', None)
}
================================================
FILE: doc/source/examples.rst
================================================
Examples
========
.. plot:: ../../examples/date_demo1.py
:include-source:
.. plot:: ../../examples/date_demo2.py
:include-source:
.. plot:: ../../examples/finance_demo.py
:include-source:
.. plot:: ../../examples/finance_work2.py
:include-source:
.. plot:: ../../examples/longshort.py
:include-source:
.. plot:: ../../examples/plot_day_summary_oclh_demo.py
:include-source:
================================================
FILE: doc/source/index.rst
================================================
.. mpl_finance documentation master file, created by
sphinx-quickstart on Sat Jan 7 14:48:13 2017.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
mpl_finance: financial helpers for matplotlib
=============================================
A collection of functions for analyzing and plotting financial data
in combination with matplotlib.
.. toctree::
:maxdepth: 2
examples
modules
This module has been extracted from the core Matplotlib code base
unchanged. Now that this code is separate from the core it can pick
up dependencies, like :mod:`pandas` or :mod:`scipy` and expose a more
powerful API to the user.
We are looking for a finance domain-expert to lead this effort!
* :ref:`genindex`
* :ref:`search`
================================================
FILE: doc/source/modules.rst
================================================
mpl_finance
===========
.. toctree::
:maxdepth: 4
mpl_finance
================================================
FILE: doc/source/mpl_finance.rst
================================================
mpl_finance module
==================
.. automodule:: mpl_finance
:no-members:
Daily Summary
-------------
.. autosummary::
:toctree: _as_gen
:nosignatures:
plot_day_summary_oclh
plot_day_summary_ohlc
plot_day_summary2_ochl
plot_day_summary2_ohlc
Candlesticks
------------
.. autosummary::
:toctree: _as_gen
:nosignatures:
candlestick_ochl
candlestick_ohlc
candlestick2_ochl
candlestick2_ohlc
Volume Overlay
--------------
.. autosummary::
:toctree: _as_gen
:nosignatures:
volume_overlay
volume_overlay2
volume_overlay3
Other
-----
.. autosummary::
:toctree: _as_gen
:nosignatures:
index_bar
================================================
FILE: examples/.gitignore
================================================
*.png
*.jpg
================================================
FILE: examples/addplot.ipynb
================================================
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# This allows multiple outputs from a single jupyter notebook cell:\n",
"from IPython.core.interactiveshell import InteractiveShell\n",
"InteractiveShell.ast_node_interactivity = \"all\""
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'1.5.2'"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%matplotlib inline\n",
"import pandas as pd\n",
"pd.__version__ # for the record"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"<a name=\"addplot\"></a>\n",
"# Adding plots to the basic mplfinance plot()\n",
"\n",
"Sometimes you may want to plot additional data within the same figure as the basic OHLC or Candlestick plot. For example, you may want to add the results of a technical study, or some additional market data. \n",
"\n",
"This is done by passing information into the call to `mplfinance.plot()` using the `addplot` (\"additional plot\") keyword.\n",
"\n",
"The `addplot` keyword expects a `dict`. The dict must contain the key `'data':` whose value is the actual additional data to be plotted. This additional data may be a `list`, `numpy.ndarray`, `pandas.Series`, or `pandas.DataFrame`. If it is a DataFrame, then *all* columns in that dataframe will be plotted. \n",
"\n",
"The rest of the `addplot` dict contains various keywords and their values that are used to configure the additional plot in relation to the basic OHLCV plot, as can be seen in the examples below.\n",
"\n",
"It is *strongly* recommended that the caller construct the `addplot` dict using the helper function `mplfinance.make_addplot()` (see examples below). This helper function:\n",
"- simplifies the syntax for specifying additional plots\n",
"- ensures that the dict contains default values for all possible configurable keywords\n",
"- does some basic checking on the keyword values to ensure they are of the correct types.\n",
"\n",
"The `addplot` keyword can also accept a `list` of `dict`s, as one possible way of plotting multiple additional data sets on top of the basic OHLCV data. See specific details in the the examples below."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## `addplot` examples:\n",
"\n",
"Let's start with an example data set that includes Bollinger Band data, in addition to the basic OHLCV data:"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"(252, 9)"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" <th>UpperB</th>\n",
" <th>LowerB</th>\n",
" <th>PercentB</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2011-07-01</th>\n",
" <td>132.089996</td>\n",
" <td>134.100006</td>\n",
" <td>131.779999</td>\n",
" <td>133.919998</td>\n",
" <td>117.161659</td>\n",
" <td>202385700</td>\n",
" <td>132.373927</td>\n",
" <td>125.316073</td>\n",
" <td>1.219057</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2011-07-05</th>\n",
" <td>133.779999</td>\n",
" <td>134.080002</td>\n",
" <td>133.389999</td>\n",
" <td>133.809998</td>\n",
" <td>117.065437</td>\n",
" <td>165936000</td>\n",
" <td>133.254297</td>\n",
" <td>124.912703</td>\n",
" <td>1.066618</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2011-07-06</th>\n",
" <td>133.490005</td>\n",
" <td>134.139999</td>\n",
" <td>133.110001</td>\n",
" <td>133.970001</td>\n",
" <td>117.205429</td>\n",
" <td>143331600</td>\n",
" <td>134.040915</td>\n",
" <td>124.627085</td>\n",
" <td>0.992467</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Open High Low Close Adj Close \\\n",
"Date \n",
"2011-07-01 132.089996 134.100006 131.779999 133.919998 117.161659 \n",
"2011-07-05 133.779999 134.080002 133.389999 133.809998 117.065437 \n",
"2011-07-06 133.490005 134.139999 133.110001 133.970001 117.205429 \n",
"\n",
" Volume UpperB LowerB PercentB \n",
"Date \n",
"2011-07-01 202385700 132.373927 125.316073 1.219057 \n",
"2011-07-05 165936000 133.254297 124.912703 1.066618 \n",
"2011-07-06 143331600 134.040915 124.627085 0.992467 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Adj Close</th>\n",
" <th>Volume</th>\n",
" <th>UpperB</th>\n",
" <th>LowerB</th>\n",
" <th>PercentB</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2012-06-27</th>\n",
" <td>132.419998</td>\n",
" <td>133.429993</td>\n",
" <td>131.970001</td>\n",
" <td>133.169998</td>\n",
" <td>118.980804</td>\n",
" <td>108088000</td>\n",
" <td>136.447962</td>\n",
" <td>128.140042</td>\n",
" <td>0.605441</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-06-28</th>\n",
" <td>132.289993</td>\n",
" <td>132.990005</td>\n",
" <td>131.279999</td>\n",
" <td>132.789993</td>\n",
" <td>118.641281</td>\n",
" <td>169242100</td>\n",
" <td>136.500761</td>\n",
" <td>128.219241</td>\n",
" <td>0.551922</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2012-06-29</th>\n",
" <td>135.199997</td>\n",
" <td>136.270004</td>\n",
" <td>134.850006</td>\n",
" <td>136.100006</td>\n",
" <td>121.598610</td>\n",
" <td>212250900</td>\n",
" <td>136.721010</td>\n",
" <td>128.792993</td>\n",
" <td>0.921670</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Open High Low Close Adj Close \\\n",
"Date \n",
"2012-06-27 132.419998 133.429993 131.970001 133.169998 118.980804 \n",
"2012-06-28 132.289993 132.990005 131.279999 132.789993 118.641281 \n",
"2012-06-29 135.199997 136.270004 134.850006 136.100006 121.598610 \n",
"\n",
" Volume UpperB LowerB PercentB \n",
"Date \n",
"2012-06-27 108088000 136.447962 128.140042 0.605441 \n",
"2012-06-28 169242100 136.500761 128.219241 0.551922 \n",
"2012-06-29 212250900 136.721010 128.792993 0.921670 "
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('data/SPY_20110701_20120630_Bollinger.csv',index_col=0,parse_dates=True)\n",
"df.shape\n",
"df.head(3)\n",
"df.tail(3)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"#### Using this dataframe, we can of course plot a basic ohlc or candlestick plot:\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'0.12.9b7'"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 800x575 with 4 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import mplfinance as mpf\n",
"mpf.__version__\n",
"mpf.plot(df,volume=True)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"Let's say we want to plot the Lower Bollinger band along with the basic OHLCV plot. \n",
"\n",
"We use `make_addplot()` to create the addplot dict, and pass that into the plot() function:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
gitextract_k_37povc/
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── ask-a-question.md
│ │ ├── bug_report.md
│ │ ├── feature_request.md
│ │ └── feedback.md
│ └── workflows/
│ ├── mplfinance_checks.yml
│ ├── pubPyPI.yml
│ └── pubTestPyPI.yml
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── MANIFEST.in
├── README.md
├── RELEASE_NOTES.md
├── TODO.md
├── archive.tox.ini
├── archive.travis.yml
├── doc/
│ ├── Makefile
│ ├── README
│ ├── make.bat
│ └── source/
│ ├── conf.py
│ ├── examples.rst
│ ├── index.rst
│ ├── modules.rst
│ └── mpl_finance.rst
├── examples/
│ ├── .gitignore
│ ├── addplot.ipynb
│ ├── addplot_legends.ipynb
│ ├── data/
│ │ ├── SP500_20191106_IDayBollinger.csv
│ │ ├── SP500_NOV2019_Hist.csv
│ │ ├── SP500_NOV2019_IDay.csv
│ │ ├── SP500_NOV2019_IDayRVol.csv
│ │ ├── SPY_20110701_20120630_Bollinger.csv
│ │ ├── jpyusd_barchartdotcom.csv
│ │ ├── yahoofinance-AAPL-20040819-20180120.csv
│ │ ├── yahoofinance-GOOG-20040819-20180120.csv
│ │ ├── yahoofinance-INTC-19950101-20040412.csv
│ │ ├── yahoofinance-SPY-20080101-20180101.csv
│ │ └── yahoofinance-SPY-20200901-20210113.csv
│ ├── external_axes.ipynb
│ ├── fill_between.ipynb
│ ├── hollow_and_filled_candles.ipynb
│ ├── indicators/
│ │ ├── alphatrend.ipynb
│ │ ├── awesome_oscillator.ipynb
│ │ ├── donchian_channel.ipynb
│ │ ├── golden_cross.ipynb
│ │ ├── ichimoku_cloud.ipynb
│ │ ├── macd.py
│ │ ├── macd_histogram_gradient.ipynb
│ │ ├── mpf_rsi_demo.py
│ │ ├── parabolic_sar.ipynb
│ │ ├── rsi.py
│ │ └── supertrend.ipynb
│ ├── marketcolor_overrides.ipynb
│ ├── mpf_animation_demo1.py
│ ├── mpf_animation_demo2.py
│ ├── mpf_animation_growingcandle.py
│ ├── mpf_animation_macd.py
│ ├── mpf_demo.py
│ ├── mpf_demo_autoclose.py
│ ├── mpf_demo_axlabelsize.py
│ ├── original_flavor/
│ │ ├── date_demo1.py
│ │ ├── date_demo2.py
│ │ ├── finance_demo.py
│ │ ├── finance_demo_newapi.py
│ │ ├── finance_work2.py
│ │ ├── longshort.py
│ │ └── plot_day_summary_oclh_demo.py
│ ├── panels.ipynb
│ ├── plot_customizations.ipynb
│ ├── price-movement_plots.ipynb
│ ├── resample10years.ipynb
│ ├── savefig.ipynb
│ ├── scratch_pad/
│ │ ├── Axes.scatter.ipynb
│ │ ├── addplot_build_panels_testing.ipynb
│ │ ├── addplot_nan_testing.ipynb
│ │ ├── addplot_ohlc_rawtest.ipynb
│ │ ├── animation/
│ │ │ ├── genvol.py
│ │ │ ├── mpf_anim_iday_gif.py
│ │ │ ├── mpf_anim_idaymacd_gif.py
│ │ │ ├── mpf_animation_demo1mod.py
│ │ │ └── mpf_animation_demo2mod.py
│ │ ├── bar_width_issues.ipynb
│ │ ├── check_use_cases.ipynb
│ │ ├── combine_sparse_data.ipynb
│ │ ├── date_to_iloc_extrapolation.ipynb
│ │ ├── dev_alines.ipynb
│ │ ├── dev_ext_axes_nightclouds_issue.ipynb
│ │ ├── dev_ext_axes_subclass.ipynb
│ │ ├── dev_external_axes.ipynb
│ │ ├── dev_fill_between.ipynb
│ │ ├── dev_hlines.ipynb
│ │ ├── dev_scale_padding.ipynb
│ │ ├── dev_tlines.ipynb
│ │ ├── dev_vlines.ipynb
│ │ ├── external_axes_stacking.ipynb
│ │ ├── figsubplot_tests.ipynb
│ │ ├── find.valid.backends.py
│ │ ├── fmtr.py
│ │ ├── fontscale.ipynb
│ │ ├── gridcolor_override_broken_for_charles.ipynb
│ │ ├── hollow_and_filled_images.py
│ │ ├── hollow_candle_experiments.ipynb
│ │ ├── invisible_axes.ipynb
│ │ ├── iss466_pr471.py
│ │ ├── issue#97_charles.ipynb
│ │ ├── issue266_white_to_grey.py
│ │ ├── issue296.a.py
│ │ ├── issue296.b.py
│ │ ├── issue296.py
│ │ ├── issue_184_alines.ipynb
│ │ ├── issues/
│ │ │ ├── Issue101_data.csv
│ │ │ ├── Issue101_xaxis_not_showing.ipynb
│ │ │ ├── Issue133_bad_display_single_candle.ipynb
│ │ │ ├── Issue156_title_ruins_tight_layout.ipynb
│ │ │ ├── Issue26_bug_fix_volume_bar_widths.ipynb
│ │ │ ├── Issue28_debug_zero_volume_crash.ipynb
│ │ │ ├── Issue77_test.ipynb
│ │ │ ├── Issue79.ipynb
│ │ │ ├── Issue82_case_insensitive_columns.ipynb
│ │ │ ├── issue#142.ipynb
│ │ │ ├── issue#142_data.csv
│ │ │ ├── issue#241_loop_all_styles.ipynb
│ │ │ ├── issue079_percent_change.ipynb
│ │ │ ├── issue145.py
│ │ │ ├── issue171_widths.ipynb
│ │ │ ├── issue193.py
│ │ │ ├── issue236.df.scratchdata
│ │ │ ├── issue236_timezone_bug.ipynb
│ │ │ ├── issue26_data.pkl
│ │ │ ├── issue282/
│ │ │ │ ├── agri.xlsx
│ │ │ │ └── dm_export_20000101_20201026.csv
│ │ │ ├── issue282_addplot.ipynb
│ │ │ ├── issue333_generic_plotting.ipynb
│ │ │ ├── issue436.py
│ │ │ ├── issue438.py
│ │ │ ├── issue568.csv
│ │ │ ├── issue568_pnf_calcs.ipynb
│ │ │ ├── issue77_eurusd.csv
│ │ │ ├── issue94.ipynb
│ │ │ ├── major_ticks_issue074.ipynb
│ │ │ ├── savefig_bugIssue141.ipynb
│ │ │ ├── so68871906.py
│ │ │ ├── stackoverflow.questions.60982755.csv
│ │ │ ├── stackoverflow60982755.ipynb
│ │ │ └── ticks_issue_573.ipynb
│ │ ├── lines.dill
│ │ ├── macd_and_widths.ipynb
│ │ ├── macd_color_issue594.ipynb
│ │ ├── mav_cross_issue518.ipynb
│ │ ├── mpl.zorderaxes.ipynb
│ │ ├── mpl.zorderbar.py
│ │ ├── multicursor.py
│ │ ├── multicursor_macd.py
│ │ ├── multicursor_macd_ginput.py
│ │ ├── multicursor_macd_ginput_save.py
│ │ ├── np.float32.ipynb
│ │ ├── pandas_resample_test.ipynb
│ │ ├── panels_ylim_width_alpha_yside.ipynb
│ │ ├── pdmerge_addplot.ipynb
│ │ ├── pnf_reversal.ipynb
│ │ ├── pr451_test.py
│ │ ├── pr451_testing.ipynb
│ │ ├── pr451data.csv
│ │ ├── presentation_fin_demo.py
│ │ ├── presentation_fin_demo_newapi.py
│ │ ├── price-movement_ret_calc_vals.ipynb
│ │ ├── rcParams.ipynb
│ │ ├── rcpars.py
│ │ ├── readme_width_experiments.ipynb
│ │ ├── run.valid.ibackends.py
│ │ ├── scatter_multiple_markers.ipynb
│ │ ├── simple_matplotlib.py
│ │ ├── so75737197.ipynb
│ │ ├── so75737197_data.csv
│ │ ├── so76486448_hover.py
│ │ ├── stackoverflow.65487952.ipynb
│ │ ├── stash_plotting.yscale.py
│ │ ├── static_image_subplots.ipynb
│ │ ├── test_addplot_bar.ipynb
│ │ ├── test_df.rolling.ipynb
│ │ ├── test_maddplot.py
│ │ ├── test_plot_image_comparison.ipynb
│ │ ├── time_to_plot_line_vs_bar.py
│ │ ├── too_much_data.py
│ │ ├── tplot.py
│ │ ├── trend_line_extrapolation.ipynb
│ │ ├── volume_and_ohlc_same_panel.ipynb
│ │ ├── widths_so75526312.ipynb
│ │ └── xlim_scenarios.ipynb
│ ├── simple_2curve_animation.py
│ ├── simple_multianimation.py
│ ├── styles.ipynb
│ ├── using_lines.ipynb
│ ├── widths.ipynb
│ └── yscale.ipynb
├── markdown/
│ ├── animation.md
│ ├── customization_and_styles.md
│ └── subplots.md
├── pytest.ini
├── readme.ipynb
├── scripts/
│ ├── check_version.py
│ ├── check_version.sh
│ ├── mplrcputils.py
│ ├── rcparams
│ └── version_update_check.py
├── setup.py
├── src/
│ └── mplfinance/
│ ├── __init__.py
│ ├── _arg_validators.py
│ ├── _helpers.py
│ ├── _kwarg_help.py
│ ├── _mpf_warnings.py
│ ├── _mplrcputils.py
│ ├── _mplwraps.py
│ ├── _panels.py
│ ├── _styledata/
│ │ ├── __init__.py
│ │ ├── binance.py
│ │ ├── binancedark.py
│ │ ├── blueskies.py
│ │ ├── brasil.py
│ │ ├── charles.py
│ │ ├── checkers.py
│ │ ├── classic.py
│ │ ├── default.py
│ │ ├── ibd.py
│ │ ├── kenan.py
│ │ ├── mike.py
│ │ ├── nightclouds.py
│ │ ├── sas.py
│ │ ├── starsandstripes.py
│ │ ├── tradingview.py
│ │ └── yahoo.py
│ ├── _styles.py
│ ├── _utils.py
│ ├── _version.py
│ ├── _widths.py
│ ├── original_flavor.py
│ └── plotting.py
└── tests/
├── conftest.py
├── original_flavor/
│ ├── test_date_demo1.py
│ ├── test_date_demo2.py
│ ├── test_finance_demo.py
│ ├── test_finance_work2.py
│ ├── test_longshort.py
│ └── test_plot_day_summary_oclh_demo.py
├── test_addplot.py
├── test_alines.py
├── test_ema.py
├── test_exceptions.py
├── test_fill_between.py
├── test_hlines.py
├── test_images/
│ └── placeholder
├── test_kwarg_help.py
├── test_pnf.py
├── test_renko.py
└── test_vlines.py
SYMBOL INDEX (273 symbols across 56 files)
FILE: examples/indicators/rsi.py
function relative_strength (line 2) | def relative_strength(prices, n=14):
FILE: examples/mpf_animation_demo1.py
function animate (line 22) | def animate(ival):
FILE: examples/mpf_animation_demo2.py
function animate (line 31) | def animate(ival):
FILE: examples/mpf_animation_growingcandle.py
class RealTimeAPI (line 42) | class RealTimeAPI():
method __init__ (line 43) | def __init__(self):
method fetch_next (line 49) | def fetch_next(self):
method initial_fetch (line 56) | def initial_fetch(self):
function animate (line 77) | def animate(ival):
FILE: examples/mpf_animation_macd.py
function animate (line 63) | def animate(ival):
FILE: examples/original_flavor/date_demo1.py
function price (line 45) | def price(x):
FILE: examples/original_flavor/finance_work2.py
function moving_average (line 19) | def moving_average(x, n, type='simple'):
function relative_strength (line 39) | def relative_strength(prices, n=14):
function moving_average_convergence (line 73) | def moving_average_convergence(x, nslow=26, nfast=12):
class MyLocator (line 196) | class MyLocator(mticker.MaxNLocator):
method __init__ (line 197) | def __init__(self, *args, **kwargs):
method __call__ (line 200) | def __call__(self, *args, **kwargs):
FILE: examples/scratch_pad/animation/genvol.py
function gen_vol (line 4) | def gen_vol( numpoints, totalvol ):
FILE: examples/scratch_pad/animation/mpf_anim_iday_gif.py
class RealTimeAPI (line 42) | class RealTimeAPI():
method __init__ (line 43) | def __init__(self):
method fetch_next (line 49) | def fetch_next(self):
method initial_fetch (line 56) | def initial_fetch(self):
function animate (line 77) | def animate(ival):
FILE: examples/scratch_pad/animation/mpf_anim_idaymacd_gif.py
class RealTimeAPI (line 25) | class RealTimeAPI():
method __init__ (line 26) | def __init__(self):
method fetch_next (line 32) | def fetch_next(self):
method initial_fetch (line 39) | def initial_fetch(self,num):
function animate (line 90) | def animate(ival):
FILE: examples/scratch_pad/animation/mpf_animation_demo1mod.py
function animate (line 22) | def animate(ival):
FILE: examples/scratch_pad/animation/mpf_animation_demo2mod.py
function animate (line 31) | def animate(ival):
FILE: examples/scratch_pad/find.valid.backends.py
function is_backend_module (line 10) | def is_backend_module(fname):
function backend_fname_formatter (line 14) | def backend_fname_formatter(fname):
FILE: examples/scratch_pad/fmtr.py
function make_left_formatter (line 31) | def make_left_formatter(maxwidth):
function df_wrapcols (line 46) | def df_wrapcols(df,wrap_columns=None):
FILE: examples/scratch_pad/issue296.py
function animate (line 25) | def animate(ival):
FILE: examples/scratch_pad/issues/issue436.py
function limit (line 15) | def limit():
function dataframe (line 26) | def dataframe():
function chart (line 43) | def chart():
FILE: examples/scratch_pad/issues/so68871906.py
function tValLinR (line 14) | def tValLinR(close):
function getBinsFromTrend (line 30) | def getBinsFromTrend(molecule, close, span):
FILE: examples/scratch_pad/multicursor_macd_ginput.py
function on_close (line 56) | def on_close(event):
FILE: examples/scratch_pad/multicursor_macd_ginput_save.py
function on_close (line 65) | def on_close(event):
FILE: examples/scratch_pad/so76486448_hover.py
function hover_annotations (line 70) | def hover_annotations(data):
FILE: examples/scratch_pad/stash_plotting.yscale.py
function with_rc_context (line 47) | def with_rc_context(func):
function _warn_no_xgaps_deprecated (line 58) | def _warn_no_xgaps_deprecated(value):
function _valid_plot_kwargs (line 69) | def _valid_plot_kwargs():
function plot (line 213) | def plot( data, **kwargs ):
function _valid_addplot_kwargs (line 647) | def _valid_addplot_kwargs():
function make_addplot (line 695) | def make_addplot(data, **kwargs):
FILE: examples/scratch_pad/test_maddplot.py
function test_addplot01 (line 27) | def test_addplot01(bolldata):
function test_addplot02 (line 49) | def test_addplot02(bolldata):
function percentB_aboveone (line 71) | def percentB_aboveone(percentB,price):
function percentB_belowzero (line 83) | def percentB_belowzero(percentB,price):
function test_addplot03 (line 95) | def test_addplot03(bolldata):
function test_addplot04 (line 127) | def test_addplot04(bolldata):
function test_addplot05 (line 160) | def test_addplot05(bolldata):
function test_addplot06 (line 196) | def test_addplot06(bolldata):
function test_addplot07 (line 234) | def test_addplot07(bolldata):
function test_addplot08 (line 256) | def test_addplot08(bolldata):
function percentB_aboveone (line 278) | def percentB_aboveone(percentB,price):
function percentB_belowzero (line 290) | def percentB_belowzero(percentB,price):
function test_addplot09 (line 302) | def test_addplot09(bolldata):
function test_addplot10 (line 334) | def test_addplot10(bolldata):
function test_addplot11 (line 367) | def test_addplot11(bolldata):
function test_addplot12 (line 403) | def test_addplot12(bolldata):
function test_addplot13 (line 440) | def test_addplot13(bolldata):
function test_addplot14 (line 462) | def test_addplot14(bolldata):
function percentB_aboveone (line 484) | def percentB_aboveone(percentB,price):
function percentB_belowzero (line 496) | def percentB_belowzero(percentB,price):
function test_addplot15 (line 508) | def test_addplot15(bolldata):
function test_addplot16 (line 540) | def test_addplot16(bolldata):
function test_addplot17 (line 573) | def test_addplot17(bolldata):
function test_addplot18 (line 609) | def test_addplot18(bolldata):
function test_addplot19 (line 645) | def test_addplot19(bolldata):
function test_addplot20 (line 667) | def test_addplot20(bolldata):
function percentB_aboveone (line 689) | def percentB_aboveone(percentB,price):
function percentB_belowzero (line 701) | def percentB_belowzero(percentB,price):
function test_addplot21 (line 713) | def test_addplot21(bolldata):
function test_addplot22 (line 745) | def test_addplot22(bolldata):
function test_addplot23 (line 778) | def test_addplot23(bolldata):
function test_addplot24 (line 814) | def test_addplot24(bolldata):
FILE: examples/scratch_pad/time_to_plot_line_vs_bar.py
function pbar (line 5) | def pbar():
function pline (line 12) | def pline():
FILE: examples/simple_2curve_animation.py
function animate (line 17) | def animate(i):
FILE: examples/simple_multianimation.py
function animate1 (line 17) | def animate1(i):
function animate2 (line 21) | def animate2(i):
FILE: scripts/check_version.py
function compare_versions (line 5) | def compare_versions(v_str1, v_str2):
FILE: scripts/mplrcputils.py
function rcParams_to_df (line 14) | def rcParams_to_df(rcp,name=None):
function compare_styles (line 27) | def compare_styles(s1,s2):
function main (line 42) | def main():
FILE: src/mplfinance/_arg_validators.py
function _check_and_prepare_data (line 11) | def _check_and_prepare_data(data, config):
function _label_validator (line 99) | def _label_validator(label_value):
function _get_valid_plot_types (line 111) | def _get_valid_plot_types(plottype=None):
function _mav_validator (line 133) | def _mav_validator(mav_value):
function _hlines_validator (line 174) | def _hlines_validator(value):
function _is_datelike (line 183) | def _is_datelike(value):
function _xlim_validator (line 194) | def _xlim_validator(value):
function _vlines_validator (line 199) | def _vlines_validator(value):
function _alines_validator (line 212) | def _alines_validator(value, returnStandardizedValue=False):
function _tlines_validator (line 262) | def _tlines_validator(value):
function _bypass_kwarg_validation (line 287) | def _bypass_kwarg_validation(value):
function _kwarg_not_implemented (line 296) | def _kwarg_not_implemented(value):
function _validate_vkwargs_dict (line 304) | def _validate_vkwargs_dict(vkwargs):
function _process_kwargs (line 322) | def _process_kwargs(kwargs, vkwargs):
function _valid_panel_id (line 361) | def _valid_panel_id(panid):
function _scale_padding_validator (line 364) | def _scale_padding_validator(value):
function _yscale_validator (line 379) | def _yscale_validator(value):
function _is_marketcolor_object (line 397) | def _is_marketcolor_object(obj):
function _mco_validator (line 403) | def _mco_validator(value): # marketcolor overrides validator
function _check_for_external_axes (line 416) | def _check_for_external_axes(config):
function _valid_fb_dict (line 466) | def _valid_fb_dict(value):
function _fill_between_validator (line 471) | def _fill_between_validator(value):
FILE: src/mplfinance/_helpers.py
function _adjust_color_brightness (line 13) | def _adjust_color_brightness(color,amount=0.5):
function _determine_format_string (line 41) | def _determine_format_string( dates, datetime_format=None ):
function _list_of_dict (line 67) | def _list_of_dict(x):
function _num_or_seq_of_num (line 73) | def _num_or_seq_of_num(value):
function roundTime (line 79) | def roundTime(dt=None, roundTo=60):
function _is_uint8_rgb_or_rgba (line 91) | def _is_uint8_rgb_or_rgba(tup):
function _mpf_is_color_like (line 107) | def _mpf_is_color_like(c):
function _mpf_to_rgba (line 116) | def _mpf_to_rgba(c, alpha=None):
FILE: src/mplfinance/_kwarg_help.py
function df_wrapcols (line 5) | def df_wrapcols(df,wrap_columns=None):
function make_left_formatter (line 45) | def make_left_formatter(maxwidth):
function kwarg_help (line 60) | def kwarg_help( func_name=None, kwarg_names=None, sort=False ):
FILE: src/mplfinance/_mplrcputils.py
function rcParams_to_df (line 14) | def rcParams_to_df(rcp,name=None):
function compare_styles (line 27) | def compare_styles(s1,s2):
function main (line 42) | def main():
FILE: src/mplfinance/_mplwraps.py
function _check_for_and_apply_style (line 34) | def _check_for_and_apply_style(kwargs):
function figure (line 56) | def figure(*args,**kwargs):
class Mpf_Figure (line 65) | class Mpf_Figure(mplfigure.Figure):
method add_subplot (line 67) | def add_subplot(self,*args,**kwargs):
method add_axes (line 78) | def add_axes(self,*args,**kwargs):
method subplot (line 89) | def subplot(self,*args,**kwargs):
method subplots (line 103) | def subplots(self,*args,**kwargs):
FILE: src/mplfinance/_panels.py
function _build_panels (line 5) | def _build_panels( figure, config ):
function _set_ticks_on_bottom_panel_only (line 221) | def _set_ticks_on_bottom_panel_only(panels,formatter,rotation=45,xlabel=...
FILE: src/mplfinance/_styledata/__init__.py
function _validate_style (line 29) | def _validate_style(style):
FILE: src/mplfinance/_styles.py
function _get_mpfstyle (line 11) | def _get_mpfstyle(style):
function _apply_mpfstyle (line 19) | def _apply_mpfstyle(style):
function _valid_make_mpf_style_kwargs (line 68) | def _valid_make_mpf_style_kwargs():
function available_styles (line 135) | def available_styles():
function make_mpf_style (line 138) | def make_mpf_style( **kwargs ):
function _valid_mpf_color_spec (line 180) | def _valid_mpf_color_spec(value):
function _valid_mpf_style (line 189) | def _valid_mpf_style(value):
function _valid_make_marketcolors_kwargs (line 217) | def _valid_make_marketcolors_kwargs():
function make_marketcolors (line 282) | def make_marketcolors(**kwargs):
function write_style_file (line 360) | def write_style_file(style,filename):
FILE: src/mplfinance/_utils.py
function _check_input (line 24) | def _check_input(opens, closes, highs, lows):
function _check_and_convert_xlim_configuration (line 68) | def _check_and_convert_xlim_configuration(data, config):
function _construct_mpf_collections (line 90) | def _construct_mpf_collections(ptype,dates,xdates,opens,highs,lows,close...
function _calculate_atr (line 116) | def _calculate_atr(atr_length, highs, lows, closes):
function combine_adjacent (line 136) | def combine_adjacent(arr):
function coalesce_volume_dates (line 161) | def coalesce_volume_dates(in_volumes, in_dates, indexes):
function _updown_colors (line 181) | def _updown_colors(upcolor,downcolor,opens,closes,use_prev_close=False):
function _make_updown_color_list (line 197) | def _make_updown_color_list(key,marketcolors,opens,closes,overrides=None):
function _updownhollow_colors (line 213) | def _updownhollow_colors(upcolor,downcolor,hollowcolor,opens,closes):
function _date_to_iloc (line 223) | def _date_to_iloc(dtseries,date):
function _date_to_iloc_linear (line 247) | def _date_to_iloc_linear(dtseries,date,trace=False):
function _date_to_iloc_5_7ths (line 274) | def _date_to_iloc_5_7ths(dtseries,date,direction,trace=False):
function _date_to_iloc_extrapolate (line 290) | def _date_to_iloc_extrapolate(dtseries,date):
function _date_to_mdate (line 338) | def _date_to_mdate(date):
function _convert_segment_dates (line 349) | def _convert_segment_dates(segments,dtindex):
function _valid_renko_kwargs (line 375) | def _valid_renko_kwargs():
function _valid_pnf_kwargs (line 405) | def _valid_pnf_kwargs():
function _valid_lines_kwargs (line 470) | def _valid_lines_kwargs():
function _construct_ohlc_collections (line 562) | def _construct_ohlc_collections(dates, opens, highs, lows, closes, marke...
function _construct_candlestick_collections (line 637) | def _construct_candlestick_collections(dates, opens, highs, lows, closes...
function _construct_hollow_candlestick_collections (line 717) | def _construct_hollow_candlestick_collections(dates, opens, highs, lows,...
function _construct_renko_collections (line 803) | def _construct_renko_collections(dates, highs, lows, volumes, config_ren...
function _construct_aline_collections (line 966) | def _construct_aline_collections(alines, dtix=None):
function _construct_hline_collections (line 1018) | def _construct_hline_collections(hlines,minx,maxx):
function _construct_vline_collections (line 1076) | def _construct_vline_collections(vlines,dtix,miny,maxy):
function _construct_tline_collections (line 1140) | def _construct_tline_collections(tlines, dtix, dates, opens, highs, lows...
class IntegerIndexDateTimeFormatter (line 1251) | class IntegerIndexDateTimeFormatter(Formatter):
method __init__ (line 1265) | def __init__(self, dates, fmt='%b %d, %H:%M'):
method __call__ (line 1270) | def __call__(self, x, pos=0):
function _mscatter (line 1286) | def _mscatter(x,y,ax=None, m=None, **kw):
function _pnf_calculator (line 1304) | def _pnf_calculator(indf,boxsize,reverse=3,method='hilo'):
function _construct_pnf_scatter (line 1419) | def _construct_pnf_scatter(ax,ptype,dates,xdates,opens,highs,lows,closes...
FILE: src/mplfinance/_widths.py
function _get_widths_df (line 4) | def _get_widths_df():
function _valid_scale_width_kwargs (line 33) | def _valid_scale_width_kwargs():
function _valid_update_width_kwargs (line 69) | def _valid_update_width_kwargs():
function _scale_width_config (line 105) | def _scale_width_config(scale,width_config):
function _determine_width_config (line 121) | def _determine_width_config( xdates, config ):
function _dfinterpolate (line 173) | def _dfinterpolate(df,key,column):
FILE: src/mplfinance/original_flavor.py
function plot_day_summary_oclh (line 19) | def plot_day_summary_oclh(ax, quotes, ticksize=3,
function plot_day_summary_ohlc (line 52) | def plot_day_summary_ohlc(ax, quotes, ticksize=3,
function _plot_day_summary (line 85) | def _plot_day_summary(ax, quotes, ticksize=3,
function candlestick_ochl (line 161) | def candlestick_ochl(ax, quotes, width=0.2, colorup='k', colordown='r',
function candlestick_ohlc (line 200) | def candlestick_ohlc(ax, quotes, width=0.2, colorup='k', colordown='r',
function _candlestick (line 239) | def _candlestick(ax, quotes, width=0.2, colorup='k', colordown='r',
function _check_input (line 319) | def _check_input(opens, closes, highs, lows, miss=-1):
function plot_day_summary2_ochl (line 376) | def plot_day_summary2_ochl(ax, opens, closes, highs, lows, ticksize=4,
function plot_day_summary2_ohlc (line 411) | def plot_day_summary2_ohlc(ax, opens, highs, lows, closes, ticksize=4,
function candlestick2_ochl (line 514) | def candlestick2_ochl(ax, opens, closes, highs, lows, width=4,
function candlestick2_ohlc (line 555) | def candlestick2_ohlc(ax, opens, highs, lows, closes, width=4,
function volume_overlay (line 642) | def volume_overlay(ax, opens, closes, volumes,
function volume_overlay2 (line 703) | def volume_overlay2(ax, closes, volumes,
function volume_overlay3 (line 743) | def volume_overlay3(ax, quotes,
function index_bar (line 823) | def index_bar(ax, vals,
FILE: src/mplfinance/plotting.py
function with_rc_context (line 57) | def with_rc_context(func):
function _warn_no_xgaps_deprecated (line 68) | def _warn_no_xgaps_deprecated(value):
function _warn_set_ylim_deprecated (line 78) | def _warn_set_ylim_deprecated(value):
function _valid_plot_kwargs (line 88) | def _valid_plot_kwargs():
function plot (line 402) | def plot( data, **kwargs ):
function _adjust_figsize (line 998) | def _adjust_figsize(fig,config):
function _adjust_fontsize (line 1016) | def _adjust_fontsize(config):
function _addplot_collections (line 1047) | def _addplot_collections(panid,panels,apdict,xdates,config):
function _addplot_columns (line 1102) | def _addplot_columns(panid,panels,ydata,apdict,xdates,config,colcount):
function _addplot_apply_supplements (line 1167) | def _addplot_apply_supplements(ax,apdict,xdates):
function _set_ylabels_side (line 1201) | def _set_ylabels_side(ax_pri,ax_sec,primary_on_right):
function _plot_mav (line 1217) | def _plot_mav(ax,config,xdates,prices,apmav=None,apwidth=None):
function _plot_ema (line 1250) | def _plot_ema(ax,config,xdates,prices,apmav=None,apwidth=None):
function _auto_secondary_y (line 1285) | def _auto_secondary_y( panels, panid, ylo, yhi ):
function _valid_addplot_kwargs (line 1301) | def _valid_addplot_kwargs():
function make_addplot (line 1422) | def make_addplot(data, **kwargs):
FILE: tests/conftest.py
function bolldata (line 22) | def bolldata():
FILE: tests/original_flavor/test_date_demo1.py
function test_date_demo1 (line 24) | def test_date_demo1():
FILE: tests/original_flavor/test_date_demo2.py
function test_date_demo2 (line 16) | def test_date_demo2():
FILE: tests/original_flavor/test_finance_demo.py
function test_finance_demo (line 14) | def test_finance_demo():
FILE: tests/original_flavor/test_finance_work2.py
function test_finance_work2 (line 12) | def test_finance_work2():
FILE: tests/original_flavor/test_longshort.py
function test_longshort (line 17) | def test_longshort():
FILE: tests/original_flavor/test_plot_day_summary_oclh_demo.py
function test_plot_day_summary_oclh_demo (line 15) | def test_plot_day_summary_oclh_demo():
FILE: tests/test_addplot.py
function test_addplot01 (line 27) | def test_addplot01(bolldata):
function test_addplot02 (line 48) | def test_addplot02(bolldata):
function percentB_aboveone (line 69) | def percentB_aboveone(percentB,price):
function percentB_belowzero (line 81) | def percentB_belowzero(percentB,price):
function test_addplot03 (line 93) | def test_addplot03(bolldata):
function test_addplot04 (line 124) | def test_addplot04(bolldata):
function test_addplot05 (line 156) | def test_addplot05(bolldata):
function test_addplot06 (line 191) | def test_addplot06(bolldata):
function test_addplot07 (line 226) | def test_addplot07(bolldata):
function test_addplot08 (line 247) | def test_addplot08(bolldata):
function test_addplot09 (line 282) | def test_addplot09(bolldata):
function test_addplot10 (line 307) | def test_addplot10(bolldata):
function test_addplot11 (line 332) | def test_addplot11(bolldata):
function test_addplot12 (line 357) | def test_addplot12(bolldata):
FILE: tests/test_alines.py
function test_alines01 (line 28) | def test_alines01(bolldata):
FILE: tests/test_ema.py
function get_ema_data (line 29) | def get_ema_data():
function create_ema_image (line 37) | def create_ema_image(tname):
function test_ema01 (line 60) | def test_ema01():
function test_ema02 (line 79) | def test_ema02():
function test_ema03 (line 100) | def test_ema03():
FILE: tests/test_exceptions.py
function test_dataframe_typeErr (line 14) | def test_dataframe_typeErr():
function test_kwarg_not_implemented (line 25) | def test_kwarg_not_implemented(bolldata):
function test_unrecognized_kwarg (line 31) | def test_unrecognized_kwarg(bolldata):
function test_kwarg_validation_error (line 37) | def test_kwarg_validation_error(bolldata):
function test_pmove_addplot (line 62) | def test_pmove_addplot(bolldata):
function test_figratio_bounds (line 74) | def test_figratio_bounds(bolldata):
function test_reversal_box_size_bounds (line 85) | def test_reversal_box_size_bounds(bolldata):
FILE: tests/test_fill_between.py
function _get_data_subset (line 29) | def _get_data_subset(bolldata,scaled_down=False):
function _get_file_names (line 39) | def _get_file_names(id):
function _report_file_sizes (line 45) | def _report_file_sizes(tname,rname):
function test_fill_between01 (line 52) | def test_fill_between01(bolldata):
function test_fill_between02 (line 68) | def test_fill_between02(bolldata):
function test_fill_between03 (line 84) | def test_fill_between03(bolldata):
function test_fill_between04 (line 102) | def test_fill_between04(bolldata):
function test_fill_between05 (line 131) | def test_fill_between05(bolldata):
function test_fill_between06 (line 151) | def test_fill_between06(bolldata):
FILE: tests/test_hlines.py
function test_hlines01 (line 27) | def test_hlines01(bolldata):
function test_hlines02 (line 48) | def test_hlines02(bolldata):
FILE: tests/test_kwarg_help.py
function test_kwarg_help (line 9) | def test_kwarg_help():
FILE: tests/test_pnf.py
function test_pnf01 (line 27) | def test_pnf01(bolldata):
function test_pnf02 (line 49) | def test_pnf02(bolldata):
function test_pnf03 (line 71) | def test_pnf03(bolldata):
function test_pnf04 (line 92) | def test_pnf04(bolldata):
function test_pnf05 (line 113) | def test_pnf05(bolldata):
FILE: tests/test_renko.py
function test_renko01 (line 27) | def test_renko01(bolldata):
function test_renko02 (line 49) | def test_renko02(bolldata):
function test_renko03 (line 71) | def test_renko03(bolldata):
function test_renko04 (line 92) | def test_renko04(bolldata):
function test_renkovalues (line 113) | def test_renkovalues(bolldata):
FILE: tests/test_vlines.py
function test_vlines01 (line 27) | def test_vlines01(bolldata):
function test_vlines02 (line 48) | def test_vlines02(bolldata):
function test_vlines03 (line 69) | def test_vlines03(bolldata):
Copy disabled (too large)
Download .json
Condensed preview — 256 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (48,546K chars).
[
{
"path": ".github/ISSUE_TEMPLATE/ask-a-question.md",
"chars": 287,
"preview": "---\nname: Ask a Question\nabout: Question about usage, project priorities, or anything else related to mplfinance.\ntitle:"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.md",
"chars": 848,
"preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: 'Bug Report:'\nlabels: 'bug'\nassignees: ''\n\n---\n\n**"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 622,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\ntitle: 'Feature Request:'\nlabels: 'enhancement'\nassign"
},
{
"path": ".github/ISSUE_TEMPLATE/feedback.md",
"chars": 267,
"preview": "---\nname: Feedback\nabout: What do you think of mplfinance? Pros? Cons? Thoughts?\ntitle: 'Comment:'\nlabels: 'feedback'\n"
},
{
"path": ".github/workflows/mplfinance_checks.yml",
"chars": 2830,
"preview": "name: mplfinance Checks\non: [ workflow_dispatch, pull_request ]\njobs:\n Regression_Tests:\n runs-on: ubuntu-20.04\n "
},
{
"path": ".github/workflows/pubPyPI.yml",
"chars": 1028,
"preview": "name: Upload Mplfinance to PyPI\n\non:\n workflow_dispatch:\n inputs:\n tag:\n description: 'version tag to de"
},
{
"path": ".github/workflows/pubTestPyPI.yml",
"chars": 1089,
"preview": "name: Upload Mplfinance to TestPyPI\n\non:\n workflow_dispatch:\n inputs:\n tag:\n description: 'version tag t"
},
{
"path": ".gitignore",
"chars": 112,
"preview": "doc/build\ndoc/examples\n_as_gen\n__pycache__\n*.pyc\n*.egg-info\n.tox/\n.cache/\n*.code-workspace\n*.ipynb_checkpoints/\n"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 163,
"preview": "\n#### All typical collaboration codes of conduct apply:\n\n### Treat people fairly, with respect, and overall [be a mensch"
},
{
"path": "CONTRIBUTING.md",
"chars": 4357,
"preview": "## Contributing Basics\n\n- Contributing can be as simple as **asking questions**, participating in discussions, suggestin"
},
{
"path": "LICENSE",
"chars": 2380,
"preview": "License agreement for mplfinance\n=================================\n\n1. This LICENSE AGREEMENT is between the Matplotlib "
},
{
"path": "MANIFEST.in",
"chars": 16,
"preview": "include LICENSE\n"
},
{
"path": "README.md",
"chars": 17606,
"preview": "[ is a tool for running tests\n# in multiple virtualenvs. This configuration file will run "
},
{
"path": "archive.travis.yml",
"chars": 228,
"preview": "dist: xenial\nsudo: false\nlanguage: python\nmatrix:\n include:\n - python: 3.6\n - python: 3.7\n - python: 3.8\ninsta"
},
{
"path": "doc/Makefile",
"chars": 7635,
"preview": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS =\nSPHINXBUILD "
},
{
"path": "doc/README",
"chars": 115,
"preview": "The module documentation is generated with Sphinx.\n\nRun \"make html\" to generate HTML. Then view build/index.html.\n\n"
},
{
"path": "doc/make.bat",
"chars": 7751,
"preview": "@ECHO OFF\r\n\r\nREM Command file for Sphinx documentation\r\n\r\nif \"%SPHINXBUILD%\" == \"\" (\r\n\tset SPHINXBUILD=sphinx-build\r\n)\r\n"
},
{
"path": "doc/source/conf.py",
"chars": 10242,
"preview": "# -*- coding: utf-8 -*-\n#\n# mpl_finance documentation build configuration file, created by\n# sphinx-quickstart on Sat Ja"
},
{
"path": "doc/source/examples.rst",
"chars": 398,
"preview": "Examples\n========\n\n.. plot:: ../../examples/date_demo1.py\n :include-source:\n\n.. plot:: ../../examples/date_demo2.py\n "
},
{
"path": "doc/source/index.rst",
"chars": 803,
"preview": ".. mpl_finance documentation master file, created by\n sphinx-quickstart on Sat Jan 7 14:48:13 2017.\n You can adapt "
},
{
"path": "doc/source/modules.rst",
"chars": 70,
"preview": "mpl_finance\n===========\n\n.. toctree::\n :maxdepth: 4\n\n mpl_finance\n"
},
{
"path": "doc/source/mpl_finance.rst",
"chars": 675,
"preview": "mpl_finance module\n==================\n\n.. automodule:: mpl_finance\n :no-members:\n\n\nDaily Summary\n-------------\n\n.. au"
},
{
"path": "examples/.gitignore",
"chars": 12,
"preview": "*.png\n*.jpg\n"
},
{
"path": "examples/addplot.ipynb",
"chars": 1646284,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/addplot_legends.ipynb",
"chars": 531913,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/data/SP500_20191106_IDayBollinger.csv",
"chars": 33851,
"preview": "Date,Open,Close,High,Low,Upper,Lower\n2019-11-06 09:30:00,3075.1,3074.12,3075.91,3073.9,,\n2019-11-06 09:31:00,3074.02,307"
},
{
"path": "examples/data/SP500_NOV2019_Hist.csv",
"chars": 1097,
"preview": "Date,Open,High,Low,Close,Volume\r\n11/1/2019,3050.72,3066.95,3050.72,3066.91,510301237\r\n11/4/2019,3078.96,3085.2,3074.87,3"
},
{
"path": "examples/data/SP500_NOV2019_IDay.csv",
"chars": 78853,
"preview": "Date,Open,Close,High,Low,Volume\r\n11/5/2019 9:30,3080.8,3080.49,3081.47,3080.3,0\r\n11/5/2019 9:31,3080.33,3079.36,3080.33,"
},
{
"path": "examples/data/SP500_NOV2019_IDayRVol.csv",
"chars": 92731,
"preview": "Date,Open,Close,High,Low,Volume\n2019-11-05 09:30:00,3080.8,3080.49,3081.47,3080.3,2209795\n2019-11-05 09:31:00,3080.33,30"
},
{
"path": "examples/data/SPY_20110701_20120630_Bollinger.csv",
"chars": 35001,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume,UpperB,LowerB,PercentB\n2011-07-01,132.08999599999999,134.100006,131.779999,133"
},
{
"path": "examples/data/jpyusd_barchartdotcom.csv",
"chars": 33235,
"preview": "Time,Open,High,Low,Last,Change,Volume\r\n3/11/2020,0.009469,0.009596,0.009467,0.009582,0.000113,1769\r\n3/10/2020,0.009763,0"
},
{
"path": "examples/data/yahoofinance-AAPL-20040819-20180120.csv",
"chars": 239788,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2004-08-19,2.250714,2.275714,2.168571,2.193571,1.966391,97230000\n2004-08-20,2."
},
{
"path": "examples/data/yahoofinance-GOOG-20040819-20180120.csv",
"chars": 250345,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2004-08-19,49.676899,51.693783,47.669952,49.845802,49.845802,44994500\n2004-08-"
},
{
"path": "examples/data/yahoofinance-INTC-19950101-20040412.csv",
"chars": 161639,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n1995-01-03,3.976563,4.000975,3.937500,3.984375,2.669861,41721600\n1995-01-04,4."
},
{
"path": "examples/data/yahoofinance-SPY-20080101-20180101.csv",
"chars": 189400,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2007-12-31,147.100006,147.610001,146.059998,146.210007,118.624741,108126800\n20"
},
{
"path": "examples/data/yahoofinance-SPY-20200901-20210113.csv",
"chars": 6953,
"preview": "Date,Open,High,Low,Close,Adj Close,Volume\n2020-09-01,350.209991,352.709991,349.239990,352.600006,349.703522,54999300\n202"
},
{
"path": "examples/external_axes.ipynb",
"chars": 625655,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# How to use"
},
{
"path": "examples/fill_between.ipynb",
"chars": 646540,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Using kwa"
},
{
"path": "examples/hollow_and_filled_candles.ipynb",
"chars": 1230251,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# HOLLOW and"
},
{
"path": "examples/indicators/alphatrend.ipynb",
"chars": 99346,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"4be427e3\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/awesome_oscillator.ipynb",
"chars": 92699,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"132f5806\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/donchian_channel.ipynb",
"chars": 153894,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"0d12a808\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/golden_cross.ipynb",
"chars": 131519,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"d8eefcaf\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/ichimoku_cloud.ipynb",
"chars": 198402,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"3e0fb278\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/macd.py",
"chars": 1444,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\nimport matplotlib.dates as mdates\n\nidf = pd.read_csv('../data/SPY_20110701"
},
{
"path": "examples/indicators/macd_histogram_gradient.ipynb",
"chars": 130714,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"30e3a660\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/mpf_rsi_demo.py",
"chars": 902,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\ninfile = '../data/yahoofinance-SPY-20200901-20210113.csv'\n\ndf = pd.read_cs"
},
{
"path": "examples/indicators/parabolic_sar.ipynb",
"chars": 122184,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"959a247a\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/indicators/rsi.py",
"chars": 887,
"preview": "import numpy as np\ndef relative_strength(prices, n=14):\n \"\"\"\n compute the n period relative strength indicator\n "
},
{
"path": "examples/indicators/supertrend.ipynb",
"chars": 135335,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"id\": \"b282572e\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\"
},
{
"path": "examples/marketcolor_overrides.ipynb",
"chars": 268501,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/mpf_animation_demo1.py",
"chars": 1094,
"preview": "'''\nThis file contains a simple animation demo using mplfinance \"external axes mode\".\n\nNote that presently mplfinance do"
},
{
"path": "examples/mpf_animation_demo2.py",
"chars": 1544,
"preview": "'''\nThis file contains a simple animation demo using mplfinance \"external axes mode\".\n\nIn this example, instead of creat"
},
{
"path": "examples/mpf_animation_growingcandle.py",
"chars": 3603,
"preview": "'''\nThis file contains a animation demo using mplfinance demonstating resampling\nof the data and re-displaying the most "
},
{
"path": "examples/mpf_animation_macd.py",
"chars": 3199,
"preview": "'''\nThis file contains a animation demo using mplfinance \"external axes mode\",\nin which animate both the display of cand"
},
{
"path": "examples/mpf_demo.py",
"chars": 532,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\ninfile = 'data/yahoofinance-SPY-20200901-20210113.csv'\n\ndf = pd.read_csv(i"
},
{
"path": "examples/mpf_demo_autoclose.py",
"chars": 464,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\nimport time\nimport matplotlib.pyplot as plt\n\ninfile = 'data/yahoofinance-S"
},
{
"path": "examples/mpf_demo_axlabelsize.py",
"chars": 943,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\ninfile = 'data/yahoofinance-SPY-20200901-20210113.csv'\n\ndf = pd.read_csv(i"
},
{
"path": "examples/original_flavor/date_demo1.py",
"chars": 1534,
"preview": "\"\"\"\nShow how to make date plots in matplotlib using date tick locators and\nformatters. See major_minor_demo1.py for mor"
},
{
"path": "examples/original_flavor/date_demo2.py",
"chars": 1324,
"preview": "\"\"\"\nShow how to make date plots in matplotlib using date tick locators and\nformatters. See major_minor_demo1.py for mor"
},
{
"path": "examples/original_flavor/finance_demo.py",
"chars": 1556,
"preview": "import datetime\n\nimport matplotlib.dates as mdates\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom pandas.plott"
},
{
"path": "examples/original_flavor/finance_demo_newapi.py",
"chars": 504,
"preview": "import pandas as pd\nfrom pandas.plotting import register_matplotlib_converters\nregister_matplotlib_converters()\nimport o"
},
{
"path": "examples/original_flavor/finance_work2.py",
"chars": 6425,
"preview": "import matplotlib.dates as mdates\nimport matplotlib.font_manager as font_manager\nimport matplotlib.pyplot as plt\nimport "
},
{
"path": "examples/original_flavor/longshort.py",
"chars": 1617,
"preview": "\"\"\"\nIllustrate the rec array utility funcitons by loading prices from a\ncsv file, computing the daily returns, appending"
},
{
"path": "examples/original_flavor/plot_day_summary_oclh_demo.py",
"chars": 1276,
"preview": "\"\"\"\nShow how to use plot_day_summary_oclh function\n\"\"\"\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom pandas.p"
},
{
"path": "examples/panels.ipynb",
"chars": 792114,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinance"
},
{
"path": "examples/plot_customizations.ipynb",
"chars": 576366,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/price-movement_plots.ipynb",
"chars": 1055972,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/resample10years.ipynb",
"chars": 363049,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Resampling"
},
{
"path": "examples/savefig.ipynb",
"chars": 253203,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/Axes.scatter.ipynb",
"chars": 59743,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/addplot_build_panels_testing.ipynb",
"chars": 680113,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/addplot_nan_testing.ipynb",
"chars": 214907,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/addplot_ohlc_rawtest.ipynb",
"chars": 1216675,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/animation/genvol.py",
"chars": 507,
"preview": "\nimport random\n\ndef gen_vol( numpoints, totalvol ):\n rlist = []\n for jj in range(0,num):\n r = 0\n for"
},
{
"path": "examples/scratch_pad/animation/mpf_anim_iday_gif.py",
"chars": 3705,
"preview": "'''\nThis file contains a animation demo using mplfinance demonstating resampling\nof the data and re-displaying the most "
},
{
"path": "examples/scratch_pad/animation/mpf_anim_idaymacd_gif.py",
"chars": 4266,
"preview": "'''\nThis file contains a animation demo using mplfinance \"external axes mode\",\nin which animate both the display of cand"
},
{
"path": "examples/scratch_pad/animation/mpf_animation_demo1mod.py",
"chars": 1097,
"preview": "'''\nThis file contains a simple animation demo using mplfinance \"external axes mode\".\n\nNote that presently mplfinance do"
},
{
"path": "examples/scratch_pad/animation/mpf_animation_demo2mod.py",
"chars": 1548,
"preview": "'''\nThis file contains a simple animation demo using mplfinance \"external axes mode\".\n\nIn this example, instead of creat"
},
{
"path": "examples/scratch_pad/bar_width_issues.ipynb",
"chars": 34618,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/check_use_cases.ipynb",
"chars": 80141,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/combine_sparse_data.ipynb",
"chars": 129097,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/date_to_iloc_extrapolation.ipynb",
"chars": 791223,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Date to i"
},
{
"path": "examples/scratch_pad/dev_alines.ipynb",
"chars": 1610996,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_ext_axes_nightclouds_issue.ipynb",
"chars": 66723,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_ext_axes_subclass.ipynb",
"chars": 48765,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_external_axes.ipynb",
"chars": 646003,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_fill_between.ipynb",
"chars": 1397199,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_hlines.ipynb",
"chars": 917485,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_scale_padding.ipynb",
"chars": 61347,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 4,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_tlines.ipynb",
"chars": 563524,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/dev_vlines.ipynb",
"chars": 1281671,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/external_axes_stacking.ipynb",
"chars": 641193,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/figsubplot_tests.ipynb",
"chars": 90141,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/find.valid.backends.py",
"chars": 1631,
"preview": "from __future__ import print_function, division, absolute_import\nfrom pylab import *\nimport time\n\nimport matplotlib.back"
},
{
"path": "examples/scratch_pad/fmtr.py",
"chars": 3320,
"preview": "####################################################################\n#\n# https://stackoverflow.com/questions/25777037/ho"
},
{
"path": "examples/scratch_pad/fontscale.ipynb",
"chars": 198145,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mpf.plot "
},
{
"path": "examples/scratch_pad/gridcolor_override_broken_for_charles.ipynb",
"chars": 76550,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/hollow_and_filled_images.py",
"chars": 3814,
"preview": "#!/bin/env python\n\nimport pandas as pd\nimport mplfinance as mpf\n\nDates = ['2019-11-06', '2019-11-07', '2019-11-08',"
},
{
"path": "examples/scratch_pad/hollow_candle_experiments.ipynb",
"chars": 553989,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/invisible_axes.ipynb",
"chars": 99748,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"# Demo notebook for [I"
},
{
"path": "examples/scratch_pad/iss466_pr471.py",
"chars": 686,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\naapldf = pd.read_csv('../data/yahoofinance-AAPL-20040819-20180120.csv',in"
},
{
"path": "examples/scratch_pad/issue#97_charles.ipynb",
"chars": 56924,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issue266_white_to_grey.py",
"chars": 569,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\ndf = pd.read_csv('data/SPY_20110701_20120630_Bollinger.csv',index_col=0,pa"
},
{
"path": "examples/scratch_pad/issue296.a.py",
"chars": 1471,
"preview": "import pandas as pd\nimport mplfinance as mpf\nimport matplotlib\nimport numpy as np\n\nprint(matplotlib.__version__)\nprint(m"
},
{
"path": "examples/scratch_pad/issue296.b.py",
"chars": 757,
"preview": "import pandas as pd\nimport matplotlib\nprint(matplotlib.__version__)\nprint(matplotlib.get_backend())\n\nimport matplotlib.p"
},
{
"path": "examples/scratch_pad/issue296.py",
"chars": 1299,
"preview": "import pandas as pd\nimport mplfinance as mpf\nimport matplotlib.animation as animation\nimport tkinter\nfrom matplotlib.bac"
},
{
"path": "examples/scratch_pad/issue_184_alines.ipynb",
"chars": 97883,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/Issue101_data.csv",
"chars": 7839,
"preview": "date,open,high,low,close,adjusted close,volume,dividend amount,split coefficient\n2020-04-17,156.9600,157.3300,147.7400,1"
},
{
"path": "examples/scratch_pad/issues/Issue101_xaxis_not_showing.ipynb",
"chars": 125399,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/Issue133_bad_display_single_candle.ipynb",
"chars": 32801,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Issue#133"
},
{
"path": "examples/scratch_pad/issues/Issue156_title_ruins_tight_layout.ipynb",
"chars": 348760,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Issue#156"
},
{
"path": "examples/scratch_pad/issues/Issue26_bug_fix_volume_bar_widths.ipynb",
"chars": 47608,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/Issue28_debug_zero_volume_crash.ipynb",
"chars": 114473,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/scratch_pad/issues/Issue77_test.ipynb",
"chars": 92041,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\":"
},
{
"path": "examples/scratch_pad/issues/Issue79.ipynb",
"chars": 140593,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/Issue82_case_insensitive_columns.ipynb",
"chars": 61635,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/scratch_pad/issues/issue#142.ipynb",
"chars": 182836,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue#142_data.csv",
"chars": 2843,
"preview": "Date,Open,High,Low,Close,Volume\n2020-05-19 09:00:00,2.11e-05,2.118e-05,2.106e-05,2.113e-05,324959.0\n2020-05-19 10:00:00,"
},
{
"path": "examples/scratch_pad/issues/issue#241_loop_all_styles.ipynb",
"chars": 1327793,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue079_percent_change.ipynb",
"chars": 112568,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue145.py",
"chars": 773,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\nprint('\\nmpf.__version__=',mpf.__version__,'\\n')\n\nfilename = '../../data/S"
},
{
"path": "examples/scratch_pad/issues/issue171_widths.ipynb",
"chars": 1243323,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Widths of "
},
{
"path": "examples/scratch_pad/issues/issue193.py",
"chars": 1530,
"preview": "import pandas as pd\nimport mplfinance as mpf\n\nprint('\\nmpf.__version__=',mpf.__version__,'\\n')\n\nfilename = '../../data/S"
},
{
"path": "examples/scratch_pad/issues/issue236.df.scratchdata",
"chars": 388,
"preview": "Date,Open,High,Low,Close,Volume,vwap\n2020-08-11 04:00:00-04:00,336.93,337.13,336.93,337.05,15800.0,337.0059\n2020-08-11 0"
},
{
"path": "examples/scratch_pad/issues/issue236_timezone_bug.ipynb",
"chars": 75066,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue282/dm_export_20000101_20201026.csv",
"chars": 126389,
"preview": "MapDate,AreaOfInterest,None,D0,D1,D2,D3,D4,ValidStart,ValidEnd,StatisticFormatID\r\n20201020,TOTAL,\"1,526,225.72\",\"650,614"
},
{
"path": "examples/scratch_pad/issues/issue282_addplot.ipynb",
"chars": 400416,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue333_generic_plotting.ipynb",
"chars": 337770,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue436.py",
"chars": 1739,
"preview": "from select import select\nfrom datetime import datetime\n\nimport time\nimport pandas as pd\nimport mplfinance as mpf\nimport"
},
{
"path": "examples/scratch_pad/issues/issue438.py",
"chars": 520,
"preview": "import mplfinance as mpf\nimport pandas as pd\n\n#daily = pd.read_csv('/Users/jsb/Desktop/mplfinance-master/examples/data/S"
},
{
"path": "examples/scratch_pad/issues/issue568.csv",
"chars": 10836,
"preview": "Date,Open,High,Low,Close,Volume\r\n3-Jan-22,17625.70,17625.70,17625.70,17625.70,16181\r\n4-Jan-22,17805.25,17805.25,17805.25"
},
{
"path": "examples/scratch_pad/issues/issue568_pnf_calcs.ipynb",
"chars": 366358,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/issue77_eurusd.csv",
"chars": 5206480,
"preview": "Gmt time,Open,High,Low,Close,Volume\r\n02.04.2018 00:00:00.000,1.23127,1.23147,1.23116,1.23126,578.6999999999999\r\n02.04.20"
},
{
"path": "examples/scratch_pad/issues/issue94.ipynb",
"chars": 3812,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/major_ticks_issue074.ipynb",
"chars": 118659,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Intraday ("
},
{
"path": "examples/scratch_pad/issues/savefig_bugIssue141.ipynb",
"chars": 230781,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/so68871906.py",
"chars": 4251,
"preview": "### !pip install yfinance\n### !pip install mplfinance\nimport yfinance as yf\nimport mplfinance as mpf\nimport numpy as"
},
{
"path": "examples/scratch_pad/issues/stackoverflow.questions.60982755.csv",
"chars": 1620,
"preview": "Date , Open, High, Low, Close, Volume\n2020-02-27 01:51:00+00:00, 167761.49, 1"
},
{
"path": "examples/scratch_pad/issues/stackoverflow60982755.ipynb",
"chars": 34915,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 2,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/issues/ticks_issue_573.ipynb",
"chars": 159567,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Intraday ("
},
{
"path": "examples/scratch_pad/macd_and_widths.ipynb",
"chars": 758470,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/macd_color_issue594.ipynb",
"chars": 174809,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Shading re"
},
{
"path": "examples/scratch_pad/mav_cross_issue518.ipynb",
"chars": 187952,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/mpl.zorderaxes.ipynb",
"chars": 39079,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Experimen"
},
{
"path": "examples/scratch_pad/mpl.zorderbar.py",
"chars": 502,
"preview": "import matplotlib.pyplot as plt\n\nfig = plt.figure()\n\nfig.patch.set_alpha(0.0)\n\nax0 = fig.add_axes( [0.1,0.1,0.8,0.8] )\na"
},
{
"path": "examples/scratch_pad/multicursor.py",
"chars": 398,
"preview": "import numpy as np\nimport matplotlib.pyplot as plt\nfrom matplotlib.widgets import MultiCursor\n\nprint('1')\nt = np.arange("
},
{
"path": "examples/scratch_pad/multicursor_macd.py",
"chars": 1110,
"preview": "import pandas as pd\nimport mplfinance as mpf\nfrom matplotlib.widgets import MultiCursor\n\nidf = pd.read_csv('../data/SPY_"
},
{
"path": "examples/scratch_pad/multicursor_macd_ginput.py",
"chars": 3197,
"preview": "import pandas as pd\nimport mplfinance as mpf\nfrom matplotlib.widgets import MultiCursor\nfrom matplotlib.collections impo"
},
{
"path": "examples/scratch_pad/multicursor_macd_ginput_save.py",
"chars": 3720,
"preview": "import pandas as pd\nimport mplfinance as mpf\nimport dill\nimport os\nfrom matplotlib.widgets import MultiCursor\n\n# read th"
},
{
"path": "examples/scratch_pad/np.float32.ipynb",
"chars": 37606,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"## This not"
},
{
"path": "examples/scratch_pad/pandas_resample_test.ipynb",
"chars": 163924,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"# mplfinance\\n\",\n "
},
{
"path": "examples/scratch_pad/panels_ylim_width_alpha_yside.ipynb",
"chars": 969141,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/pdmerge_addplot.ipynb",
"chars": 64505,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/pnf_reversal.ipynb",
"chars": 2015508,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/scratch_pad/pr451_test.py",
"chars": 1479,
"preview": "import pandas as pd\nimport mplfinance as mpf\nimport ast \n\ndf = pd.read_csv('pr451data.csv',index_col=0,parse_dates=True)"
},
{
"path": "examples/scratch_pad/pr451_testing.ipynb",
"chars": 95173,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"\\n\",\n \"##"
},
{
"path": "examples/scratch_pad/pr451data.csv",
"chars": 4957,
"preview": "Date,Open,Close,High,Low,Date,Volume\n2019-09-01,29,20,29,20,2019-09-01,10787\n2019-09-02,29,31,33,23,2019-09-02,17215\n201"
},
{
"path": "examples/scratch_pad/presentation_fin_demo.py",
"chars": 920,
"preview": "import os.path\nimport matplotlib.dates as mdates\nimport matplotlib.pyplot as plt\nimport pandas as pd\n\nfrom mplfinance.or"
},
{
"path": "examples/scratch_pad/presentation_fin_demo_newapi.py",
"chars": 410,
"preview": "import os.path\nimport pandas as pd\nimport mplfinance as mpf\n\ndate1 = \"2004-2-1\"\ndate2 = \"2004-4-12\"\ninfile = os.path.joi"
},
{
"path": "examples/scratch_pad/price-movement_ret_calc_vals.ipynb",
"chars": 410680,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/scratch_pad/rcParams.ipynb",
"chars": 49130,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/rcpars.py",
"chars": 718,
"preview": "# This allows multiple outputs from a single jupyter notebook cell:\nimport pandas as pd\nimport mplfinance as mpf\n\ndaily "
},
{
"path": "examples/scratch_pad/readme_width_experiments.ipynb",
"chars": 684383,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/run.valid.ibackends.py",
"chars": 1410,
"preview": "import matplotlib.pyplot as plt\nimport matplotlib as mpl\nfrom pylab import *\n\n## ===================================="
},
{
"path": "examples/scratch_pad/scatter_multiple_markers.ipynb",
"chars": 109901,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/simple_matplotlib.py",
"chars": 218,
"preview": "import matplotlib.pyplot as plt\nimport random\n\nfig = plt.figure(figsize=(6,6))\nax = fig.add_axes([0.1,0.1,0.8,0.8])\nx = "
},
{
"path": "examples/scratch_pad/so75737197.ipynb",
"chars": 426653,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Draw circl"
},
{
"path": "examples/scratch_pad/so75737197_data.csv",
"chars": 3266,
"preview": "Index,Start Date,Open Price,High Price,Low Price,Close Price,Volume,End Date\n0,2023-03-12 18:30:00,3.996,4.038,3.988,4.0"
},
{
"path": "examples/scratch_pad/so76486448_hover.py",
"chars": 3608,
"preview": "import yfinance as yf\nimport mplfinance as mpf\nimport matplotlib.pyplot as plt\nimport matplotlib.patches as mpatches\nimp"
},
{
"path": "examples/scratch_pad/stackoverflow.65487952.ipynb",
"chars": 59950,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/stash_plotting.yscale.py",
"chars": 32271,
"preview": "import matplotlib.dates as mdates\nimport matplotlib.pyplot as plt\nimport matplotlib.colors as mcolors\nimport pandas as "
},
{
"path": "examples/scratch_pad/static_image_subplots.ipynb",
"chars": 149181,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinance"
},
{
"path": "examples/scratch_pad/test_addplot_bar.ipynb",
"chars": 180032,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/test_df.rolling.ipynb",
"chars": 308843,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "examples/scratch_pad/test_maddplot.py",
"chars": 26619,
"preview": "import os\nimport os.path\nimport glob\nimport mplfinance as mpf\nimport matplotlib.pyplot as plt\nfrom matplotlib.t"
},
{
"path": "examples/scratch_pad/test_plot_image_comparison.ipynb",
"chars": 224498,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 6,\n \"metadata\": {},\n \"outputs\": [\n {\n \"data\":"
},
{
"path": "examples/scratch_pad/time_to_plot_line_vs_bar.py",
"chars": 638,
"preview": "import matplotlib.pyplot as plt\nimport timeit\nimport random\n\ndef pbar():\n fig = plt.figure(figsize=(5,2))\n ax = fi"
},
{
"path": "examples/scratch_pad/too_much_data.py",
"chars": 473,
"preview": "import glob\nimport mplfinance as mpf\nimport pandas as pd\n\n\ndf = pd.read_csv('../data/yahoofinance-GOOG-20040819-20180120"
},
{
"path": "examples/scratch_pad/tplot.py",
"chars": 1035,
"preview": "import pandas as pd\ndaily = pd.read_csv('../data/SP500_NOV2019_Hist.csv',index_col=0,parse_dates=True)\ndaily.head(3)\n\n# "
},
{
"path": "examples/scratch_pad/trend_line_extrapolation.ipynb",
"chars": 834324,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Trend Lin"
},
{
"path": "examples/scratch_pad/volume_and_ohlc_same_panel.ipynb",
"chars": 509913,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"### Volume a"
},
{
"path": "examples/scratch_pad/widths_so75526312.ipynb",
"chars": 1537886,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Widths of "
},
{
"path": "examples/scratch_pad/xlim_scenarios.ipynb",
"chars": 514160,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# `xlim` sc"
},
{
"path": "examples/simple_2curve_animation.py",
"chars": 741,
"preview": "\"\"\"\nA simple example of TWO curves from one func animation\n\"\"\"\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport"
},
{
"path": "examples/simple_multianimation.py",
"chars": 706,
"preview": "\"\"\"\nA simple example of TWO animated plots\n\"\"\"\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport matplotlib.anim"
},
{
"path": "examples/styles.ipynb",
"chars": 1102162,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Mplfinanc"
},
{
"path": "examples/using_lines.ipynb",
"chars": 724364,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# mplfinanc"
},
{
"path": "examples/widths.ipynb",
"chars": 1451825,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"---\\n\",\n \"\\n\",\n \"# Widths of "
},
{
"path": "examples/yscale.ipynb",
"chars": 454053,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "markdown/animation.md",
"chars": 1655,
"preview": "### Animation Support in mplfinance\n\n* **Real-time updates** to mplfinance plots are accomplished through the technique "
},
{
"path": "markdown/customization_and_styles.md",
"chars": 1062,
"preview": "---\n\n# Customizing the Appearance of Your Plots\n\n---\n\n### Use [` mplfinance styles `](https://github.com/matplotlib/mplf"
},
{
"path": "markdown/subplots.md",
"chars": 4122,
"preview": "---\n\n# Subplots in mplfinance\n#### \"Subplots\" is the matplotlib term for making **multiple plots** on the same figure.\n\n"
},
{
"path": "pytest.ini",
"chars": 32,
"preview": "[pytest]\npython_files = tests/*\n"
},
{
"path": "readme.ipynb",
"chars": 468859,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"code\",\n \"execution_count\": 1,\n \"metadata\": {},\n \"outputs\": [],\n \"source\": [\n "
},
{
"path": "scripts/check_version.py",
"chars": 982,
"preview": "import argparse\nfrom packaging import version\n\n\ndef compare_versions(v_str1, v_str2):\n \"\"\"\n Compares two version s"
},
{
"path": "scripts/check_version.sh",
"chars": 974,
"preview": "#!/bin/bash\n# Run this script test.sh from project root directory containing setup.py\n\nset -ev\n\npr_branch=$1\nif [ \"${pr_"
}
]
// ... and 56 more files (download for full content)
About this extraction
This page contains the full source code of the matplotlib/mplfinance GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 256 files (45.8 MB), approximately 12.0M tokens, and a symbol index with 273 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.