[
  {
    "path": ".coveragerc",
    "content": "# .coveragerc to control coverage.py\n[run]\nbranch = True\nsource = tdclient\n# omit = bad_file.py\n\n[paths]\nsource =\n    src/\n    */site-packages/\n\n[report]\n# Regexes for lines to exclude from consideration\nexclude_lines =\n    # Have to re-enable the standard pragma\n    pragma: no cover\n\n    # Don't complain about missing debug-only code:\n    def __repr__\n    if self\\.debug\n\n    # Don't complain if tests don't hit defensive assertion code:\n    raise AssertionError\n    raise NotImplementedError\n\n    # Don't complain if non-runnable code isn't run:\n    if 0:\n    if __name__ == .__main__.:\n"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# Contributing\n\nThis document describes how you can contribute to Twelve Data API. Please read it carefully.\n\n**Table of Contents**\n\n* [What contributions are accepted](#what-contributions-are-accepted)\n* [Pull upstream changes into your fork regularly](#pull-upstream-changes-into-your-fork-regularly)\n* [How to get your pull request accepted](#how-to-get-your-pull-request-accepted)\n  * [Keep your pull requests limited to a single issue](#keep-your-pull-requests-limited-to-a-single-issue)\n    * [Squash your commits to a single commit](#squash-your-commits-to-a-single-commit)\n  * [Don't mix code changes with whitespace cleanup](#dont-mix-code-changes-with-whitespace-cleanup)\n  * [Keep your code simple!](#keep-your-code-simple)\n  * [Test your changes!](#test-your-changes)\n  * [Write a good commit message](#write-a-good-commit-message)\n\n## What contributions are accepted\n\nWe highly appreciate your contributions in the matter of fixing bugs, optimizing and new feature implementations for the Twelve Data API source code and its documentation. In case of fixing the existing user experience please push to your fork and [submit a pull request][pr].\n\nWait for us. We try to review your pull requests as fast as possible.\nIf we find issues with your pull request, we may suggest some changes and improvements.\n\n## Pull upstream changes into your fork regularly\n\nTwelve Data API is advancing quickly. It is therefore critical that you pull upstream changes into your fork on a regular basis. Nothing is worse than putting in a days of hard work into a pull request only to have it rejected because it has diverged too far from upstream.\n\nTo pull in upstream changes:\n\n    git remote add upstream https://github.com/twelvedata/twelvedata-python.git\n    git fetch upstream master\n\nCheck the log to be sure that you actually want the changes, before merging:\n\n    git log upstream/master\n\nThen rebase your changes on the latest commits in the `master` branch:\n\n    git rebase upstream/master\n\nAfter that, you have to force push your commits:\n\n    git push --force\n\nFor more info, see [GitHub Help][help_fork_repo].\n\n## How to get your pull request accepted\n\nWe want to improve Twelve Data API with your contributions. But we also want to provide a stable experience for our users and the community. Follow these rules and you should succeed without a problem!\n\n### Keep your pull requests limited to a single issue\n\nPull requests should be as small/atomic as possible. Some examples:\n\n* If you are making spelling corrections in the docs, don't modify other files.\n* If you are adding new functions don't '*cleanup*' unrelated functions. That cleanup belongs in another pull request.\n\n#### Squash your commits to a single commit\n\nTo keep the history of the project clean, you should make one commit per pull request.\nIf you already have multiple commits, you can add the commits together (squash them) with the following commands in Git Bash:\n\n1. Open `Git Bash` (or `Git Shell`)\n2. Enter following command to squash the recent {N} commits: `git reset --soft HEAD~{N} && git commit` (replace `{N}` with the number of commits you want to squash)\n3. Press <kbd>i</kbd> to get into Insert-mode\n4. Enter the commit message of the new commit\n5. After adding the message, press <kbd>ESC</kbd> to get out of the Insert-mode\n6. Write `:wq` and press <kbd>Enter</kbd> to save the new message or write `:q!` to discard your changes\n7. Enter `git push --force` to push the new commit to the remote repository\n\nFor example, if you want to squash the last 5 commits, use `git reset --soft HEAD~5 && git commit`\n\n### Don't mix code changes with whitespace cleanup\n\nIf you change two lines of code and correct 200 lines of whitespace issues in a file the diff on that pull request is functionally unreadable and will be **rejected**. Whitespace cleanups need to be in their own pull request.\n\n### Keep your code simple!\n\nPlease keep your code as clean and straightforward as possible.\nFurthermore, the pixel shortage is over. We want to see:\n\n* `opacity` instead of `o`\n* `placeholder` instead of `ph`\n* `myFunctionThatDoesThings()` instead of `mftdt()`\n\n### Test your changes!\n\nBefore you submit a pull request, please test your changes. Verify that Twelve Data API still works and your changes don't cause other issue or crashes.\n\n### Write a good commit message\n\n* Explain why you make the changes. [More infos about a good commit message.][commit_message]\n\n* If you fix an issue with your commit, please close the issue by [adding one of the keywords and the issue number][closing-issues-via-commit-messages] to your commit message.\n\n  For example: `Fix #545`\n\n[//]: # (LINKS)\n[help_fork_repo]: https://help.github.com/articles/fork-a-repo/\n[commit_message]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html\n[pr]: https://github.com/twelvedata/twelvedata-python/compare\n[closing-issues-via-commit-messages]: https://help.github.com/articles/closing-issues-via-commit-messages/\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Report errors or unexpected behavior.\ntitle: \"[Bug]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.md",
    "content": "---\nname: Feature request\nabout: Suggest an idea.\ntitle: \"[Feature Request]\"\nlabels: ''\nassignees: ''\n\n---\n\n**Is your feature request related to a problem? Please describe.**\nA clear and concise description of what the problem is. Ex. I'm always frustrated when [...]\n\n**Describe the solution you'd like**\nA clear and concise description of what you want to happen.\n\n**Describe alternatives you've considered**\nA clear and concise description of any alternative solutions or features you've considered.\n\n**Additional context**\nAdd any other context or screenshots about the feature request here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.md",
    "content": "---\nname: Question\nabout: Ask a question.\ntitle: \"[Question]\"\nlabels: ''\nassignees: ''\n\n---\n\n\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n- package-ecosystem: pip\n  directory: \"/\"\n  schedule:\n    interval: daily\n  open-pull-requests-limit: 10\n  ignore:\n  - dependency-name: bleach\n    versions:\n    - 3.3.0\n"
  },
  {
    "path": ".gitignore",
    "content": "# Temporary and binary files\n*~\n*.py[cod]\n*.so\n*.cfg\n!.isort.cfg\n!setup.cfg\n*.orig\n*.log\n*.pot\n__pycache__/*\n.cache/*\n.*.swp\n*/.ipynb_checkpoints/*\n\n# Project files\n.ropeproject\n.project\n.pydevproject\n.settings\n.idea\n.vscode\ntags\nsrc/twelvedata/_version.py\n\n# Package files\n*.egg\n*.eggs/\n.installed.cfg\n*.egg-info\n\n# Unittest and coverage\nhtmlcov/*\n.coverage\n.tox\njunit.xml\ncoverage.xml\n.pytest_cache/\nself_test/\n\n# Build and docs folder/files\nbuild/*\ndist/*\nsdist/*\ndocs/api/*\ndocs/_rst/*\ndocs/_build/*\ncover/*\nMANIFEST\n\n# Per-project virtualenvs\n.venv*/\n"
  },
  {
    "path": ".travis.yml",
    "content": "dist: xenial\nlanguage: python\ncache: pip\npython:\n  - \"3.6\"\n  - \"3.7\"\ninstall:\n  - pip install pipenv\n  - pipenv install\n  - pip install pytest-cov\nscript:\n  - pytest\n"
  },
  {
    "path": "AUTHORS.rst",
    "content": "============\nContributors\n============\n"
  },
  {
    "path": "CHANGELOG.rst",
    "content": "=========\nChangelog\n=========\n\nVersion 0.1\n===========\n\n- Initial commit\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of age, body\nsize, disability, ethnicity, sex characteristics, gender identity and expression,\nlevel of experience, education, socio-economic status, nationality, personal\nappearance, race, religion, or sexual identity and orientation.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy towards other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\n advances\n* Trolling, insulting/derogatory comments, and personal or political attacks\n* Public or private harassment\n* Publishing others' private information, such as a physical or electronic\n address, without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\n professional setting\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned to this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project e-mail\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the project team at info@twelvedata.com. All\ncomplaints will be reviewed and investigated and will result in a response that\nis deemed necessary and appropriate to the circumstances. The project team is\nobligated to maintain confidentiality with regard to the reporter of an incident.\nFurther details of specific enforcement policies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,\navailable at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html\n\n[homepage]: https://www.contributor-covenant.org\n\nFor answers to common questions about this code of conduct, see\nhttps://www.contributor-covenant.org/faq\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2019 twelvedata\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Pipfile",
    "content": "[packages]\ntwelvedata = {path = \"./\",extras = [\"pandas\", \"matplotlib\", \"plotly\", \"websocket-client\", \"mplfinance\"],editable = true}\n\n[dev-packages]\njupyter = \"*\"\ntwine = \"*\"\n\n[pipenv]\nallow_prereleases = true\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\"><img src=\"https://res.cloudinary.com/dnz8pwg9r/image/upload/v1579110518/logo-python_pgvee0.png\" width=\"400\"></p>\n\n<p align=\"center\">\n<a href=\"https://travis-ci.org/twelvedata/twelvedata-python\"><img src=\"https://travis-ci.org/twelvedata/twelvedata-python.svg?branch=master\" alt=\"Build Status\"></a>\n<a href=\"https://github.com/twelvedata/twelvedata-python/issues\"><img src=\"https://img.shields.io/github/issues/twelvedata/twelvedata-python\" alt=\"Open Issues\"></a>\n<a href=\"https://github.com/twelvedata/twelvedata-python/releases\"><img src=\"https://badge.fury.io/py/twelvedata.svg\" alt=\"Latest Stable Version\"></a>\n<a href=\"https://github.com/twelvedata/twelvedata-python/blob/master/LICENSE.txt\"><img src=\"https://img.shields.io/badge/License-MIT-blue.svg\" alt=\"License\"></a>\n</p>\n\n# Twelve Data Python Client for financial API & WebSocket\n\nOfficial python library for [Twelve Data](https://twelvedata.com). This package supports all main features of the service:\n\n* Get stock, forex, cryptocurrency, ETF, and index OHLC time series.\n* Companies' profiles, financials, and much more fundamentals data.\n* Get over 100+ technical indicators.\n* Output data as: `json`, `csv`, `pandas`\n* Full support for static and dynamic charts.\n* Real-time WebSocket data stream.\n\n**API key** is required. If you don't have it yet, get it by signing up [here](https://twelvedata.com/pricing).\n\n## Installation\n\nUse the package manager [pip](https://pip.pypa.io/en/stable/) to install Twelve Data API library (without optional dependencies):\n\n```bash\npip install twelvedata\n```\n\nOr install with pandas support:\n\n```bash\npip install twelvedata[pandas]\n```\n\nOr install with pandas, matplotlib, plotly, and websocket support:\n\n```\npip install twelvedata[pandas,matplotlib,plotly,websocket-client]\n```\n\n## Usage\n\n* [Core data](#Time-series)\n* [Fundamentals](#Fundamentals)\n* [Technical indicators](#Technical-indicators)\n* [Batch requests](#Batch-requests)\n* [Charts](#Charts)\n* [WebSocket](#Websocket)\n* [Advanced](#Advanced)\n\n##### Supported parameters\n\n| Parameter  | Description                                                  | Type   | Required |\n| ---------- | :----------------------------------------------------------- | ------ | -------- |\n| symbol     | stock ticker (e.g. AAPL, MSFT); <br />physical currency pair (e.g. EUR/USD, CNY/JPY);<br />digital currency pair (BTC/USD, XRP/ETH) | string | yes      |\n| interval   | time frame: 1min, 5min, 15min, 30min, 45min, 1h, 2h, 4h, 8h, 1day, 1week, 1month | string | yes      |\n| apikey     | your personal API Key, if you don't have one - get it [here](https://twelvedata.com/pricing) | string | yes      |\n| exchange   | if symbol is traded in multiple exchanges specify the desired one, valid for both stocks and cryptocurrencies | string | no       |\n| mic_code   | Market Identifier Code (MIC) under ISO 10383 standard, valid for stocks | string | no       |\n| country    | if symbol is traded in multiple countries specify the desired one, valid for stocks | string | no       |\n| outputsize | number of data points to retrieve                            | int    | no       |\n| timezone   | timezone at which output datetime will be displayed, supports: `UTC`, `Exchange` or according to IANA Time Zone Database | string | no       |\n| start_date | start date and time of sampling period, accepts `yyyy-MM-dd` or `yyyy-MM-dd hh:mm:ss` format | string | no       |\n| end_date   | end date and time of sampling period, accepts `yyyy-MM-dd` or `yyyy-MM-dd hh:mm:ss` format | string | no       |\n| order      | sorting order of the time series output, supports `desc` or `asc`  | string | no       |\n| date       | Could be the exact date, e.g. `2021-10-27`, or in human language `today` or `yesterday` | string | no       |\n\nThe basis for all methods is the `TDClient` object that takes the required `apikey` parameter.\n\n### Time series\n\n* `TDClient.time_series()` accepts all common parameters. Time series may be converted to several formats:\n  * `ts.as_json()` - will return JSON array\n  * `ts.as_csv()` - will return CSV with header\n  * `ts.as_pandas()` - will return pandas.DataFrame\n  * `ts.as_url()` - will return list of URLs used\n\n```python\nfrom twelvedata import TDClient\n\n# Initialize client - apikey parameter is requiered\ntd = TDClient(apikey=\"YOUR_API_KEY_HERE\")\n\n# Construct the necessary time series\nts = td.time_series(\n    symbol=\"AAPL\",\n    interval=\"1min\",\n    outputsize=10,\n    timezone=\"America/New_York\",\n)\n\n# Returns pandas.DataFrame\nts.as_pandas()\n```\n\nOther core data endpoints:\n* Exchange rate - `TDClient.exchange_rate(symbol)`\n* Currency conversion - `TDClient.currency_conversion(symbol, amount)`\n* Quote - `TDClient.quote()` takes parameters as `.time_series()`\n* Real-time price - `TDClient.price()` takes parameters as `.time_series()`\n* End of day price - `TDClient.eod()` takes parameters as `.time_series()`\n\n### Fundamentals\n\nAll fundamentals are supported across global markets. Refer to API documentation [here](https://twelvedata.com/docs#fundamentals) and find out which countries support which fundamentals by visiting [this](https://support.twelvedata.com/en/articles/5621131-fundamentals-coverage) page.\n\n* `.get_logo(symbol, exchange, country, type)`\n* `.get_profile(symbol, exchange, country, type)`\n* `.get_dividends(symbol, exchange, country, type)`\n* `.get_splits(symbol, exchange, country, type)`\n* `.get_earnings(symbol, exchange, country, type, period, outputsize, start_date, end_date)`\n* `.get_earnings_calendar(symbol, exchange, country, period, start_date, end_date)`\n* `.get_ipo_calendar(symbol, exchange, country, start_date, end_date)`\n* `.get_statistics(symbol, exchange, country, type)`\n* `.get_insider_transactions(symbol, exchange, country, type)`\n* `.get_income_statement(symbol, exchange, country, type, period, start_date, end_date)`\n* `.get_balance_sheet(symbol, exchange, country, type, period, start_date, end_date)`\n* `.get_cash_flow(symbol, exchange, country, type, period, start_date, end_date)`\n* `.get_key_executives(symbol, exchange, country, type)`\n* `.get_institutional_holders(symbol, exchange, country, type)`\n* `.get_fund_holders(symbol, exchange, country, type)`\n\nOnly JSON format is supported accessible via `.as_json()`\n\n```python\nfrom twelvedata import TDClient\n\ntd = TDClient(apikey=\"YOUR_API_KEY_HERE\")\n\n# Get last dividends for AAPL\ndividends = td.get_dividends(\n    symbol=\"AAPL\",\n).as_json()\n```\n\n### Technical indicators\n\nThis Python library supports all indicators implemented by Twelve Data. Full list of 100+ technical indicators   may be found in [API documentation](https://twelvedata.com/docs).\n\n* Technical indicators are part of `TDClient.time_series()` object.\n* It shares the universal format `TDClient.time_series().with_{Technical Indicator Name}`, e.g. `.with_bbands()`, `.with_percent_b()`, `.with_macd()`\n* Indicator object accepts all parameters according to its specification in [API documentation](https://twelvedata.com/docs), e.g. `.with_bbands()` accepts: `series_type`, `time_period`, `sd`, `ma_type`. If parameter is not provided it will be set to default value.\n* Indicators may be used in arbitrary order and conjugated, e.g. `TDClient.time_series().with_aroon().with_adx().with_ema()`\n* By default, technical indicator will output with OHLC values. If you do not need OHLC, specify `TDClient.time_series().without_ohlc()`\n\n```python\nfrom twelvedata import TDClient\n\ntd = TDClient(apikey=\"YOUR_API_KEY_HERE\")\nts = td.time_series(\n    symbol=\"ETH/BTC\",\n    exchange=\"Huobi\",\n    interval=\"5min\",\n    outputsize=22,\n    timezone=\"America/New_York\",\n)\n\n# Returns: OHLC, BBANDS(close, 20, 2, EMA), PLUS_DI(9), WMA(20), WMA(40)\nts.with_bbands(ma_type=\"EMA\").with_plus_di().with_wma(time_period=20).with_wma(time_period=40).as_pandas()\n\n# Returns: STOCH(14, 1, 3, SMA, SMA), TSF(close, 9)\nts.without_ohlc().with_stoch().with_tsf().as_json()\n```\n\n### Batch requests\n\nWith batch requests up to 120 symbols might be returned per single API call. There are two options on how to do this:\n\n```python\n# 1. Pass instruments symbols as a string delimited by comma (,)\nts = td.time_series(\n    symbol=\"V, RY, AUD/CAD, BTC/USD:Huobi\"\n)\n\n# 2. Pass as a list of symbols \nts = td.time_series(\n    symbol=[\"V\", \"RY\", \"AUD/CAD\", \"BTC/USD:Huobi\"]\n)\n```\n\n**Important.** Batch requests are only supported with `.as_json()` and `.as_pandas()` formats.\n\nWith `.as_json()` the output will be a dictionary with passed symbols as keys. The value will be a tuple with quotes, just the same as with a single request.\n```python\nts = td.time_series(symbol='AAPL,MSFT', interval=\"1min\", outputsize=3)\ndf = ts.with_macd().with_macd(fast_period=10).with_stoch().as_json()\n\n{\n    \"AAPL\": ({'datetime': '2020-04-23 15:59:00', 'open': '275.23001', 'high': '275.25000', 'low': '274.92999', 'close': '275.01001', 'volume': '393317', 'macd_1': '-0.33538', 'macd_signal_1': '-0.24294', 'macd_hist_1': '-0.09244', 'macd_2': '-0.40894', 'macd_signal_2': '-0.29719', 'macd_hist_2': '-0.11175', 'slow_k': '4.52069', 'slow_d': '7.92871'}, {'datetime': '2020-04-23 15:58:00', 'open': '275.07001', 'high': '275.26999', 'low': '275.00000', 'close': '275.25000', 'volume': '177685', 'macd_1': '-0.31486', 'macd_signal_1': '-0.21983', 'macd_hist_1': '-0.09503', 'macd_2': '-0.38598', 'macd_signal_2': '-0.26925', 'macd_hist_2': '-0.11672', 'slow_k': '14.70578', 'slow_d': '6.82079'}, {'datetime': '2020-04-23 15:57:00', 'open': '275.07001', 'high': '275.16000', 'low': '275.00000', 'close': '275.07751', 'volume': '151169', 'macd_1': '-0.30852', 'macd_signal_1': '-0.19607', 'macd_hist_1': '-0.11245', 'macd_2': '-0.38293', 'macd_signal_2': '-0.24007', 'macd_hist_2': '-0.14286', 'slow_k': '4.55965', 'slow_d': '2.75237'}),\n    \"MSFT\": ({'datetime': '2020-04-23 15:59:00', 'open': '171.59000', 'high': '171.64000', 'low': '171.22000', 'close': '171.42000', 'volume': '477631', 'macd_1': '-0.12756', 'macd_signal_1': '-0.10878', 'macd_hist_1': '-0.01878', 'macd_2': '-0.15109', 'macd_signal_2': '-0.12915', 'macd_hist_2': '-0.02193', 'slow_k': '20.95244', 'slow_d': '26.34919'}, {'datetime': '2020-04-23 15:58:00', 'open': '171.41000', 'high': '171.61000', 'low': '171.33501', 'close': '171.61000', 'volume': '209594', 'macd_1': '-0.12440', 'macd_signal_1': '-0.10408', 'macd_hist_1': '-0.02032', 'macd_2': '-0.14786', 'macd_signal_2': '-0.12367', 'macd_hist_2': '-0.02419', 'slow_k': '39.04785', 'slow_d': '23.80945'}, {'datetime': '2020-04-23 15:57:00', 'open': '171.34500', 'high': '171.48000', 'low': '171.25999', 'close': '171.39999', 'volume': '142450', 'macd_1': '-0.13791', 'macd_signal_1': '-0.09900', 'macd_hist_1': '-0.03891', 'macd_2': '-0.16800', 'macd_signal_2': '-0.11762', 'macd_hist_2': '-0.05037', 'slow_k': '19.04727', 'slow_d': '14.92063'})\n}\n\n```\n\nWith `.as_pandas()` the output will be a 3D DataFrame with MultiIndex for (symbol, datetime).\n```python\nts = td.time_series(symbol='AAPL,MSFT', interval=\"1min\", outputsize=3)\ndf = ts.with_macd().with_macd(fast_period=10).with_stoch().as_pandas()\n\n#                                open       high  ...    slow_k    slow_d\n# AAPL 2020-04-23 15:59:00  275.23001  275.25000  ...   4.52069   7.92871\n#      2020-04-23 15:58:00  275.07001  275.26999  ...  14.70578   6.82079\n#      2020-04-23 15:57:00  275.07001  275.16000  ...   4.55965   2.75237\n# MSFT 2020-04-23 15:59:00  171.59000  171.64000  ...  20.95244  26.34919\n#      2020-04-23 15:58:00  171.41000  171.61000  ...  39.04785  23.80945\n#      2020-04-23 15:57:00  171.34500  171.48000  ...  19.04727  14.92063\n# \n# [6 rows x 13 columns]\n\ndf.loc['AAPL']\n\n#                           open       high  ...    slow_k   slow_d\n# 2020-04-23 15:59:00  275.23001  275.25000  ...   4.52069  7.92871\n# 2020-04-23 15:58:00  275.07001  275.26999  ...  14.70578  6.82079\n# 2020-04-23 15:57:00  275.07001  275.16000  ...   4.55965  2.75237\n# \n# [3 rows x 13 columns]\n\ndf.columns\n\n# Index(['open', 'high', 'low', 'close', 'volume', 'macd1', 'macd_signal1',\n#        'macd_hist1', 'macd2', 'macd_signal2', 'macd_hist2', 'slow_k',\n#        'slow_d'],\n#       dtype='object')\n```\n\n\n### Charts\n\n* [Static](#Static)\n* [Interactive](#Interactive)\n\nCharts support OHLC, technical indicators and custom bars.\n\n#### Static\n\nStatic charts are based on `matplotlib` library and require `mplfinance` package to be installed.\n\n![static chart example](https://res.cloudinary.com/dnz8pwg9r/image/upload/v1601394338/matplotlib_chart.png)\n\n* Use `.as_pyplot_figure()`\n\n```python\nfrom twelvedata import TDClient\n\ntd = TDClient(apikey=\"YOUR_API_KEY_HERE\")\nts = td.time_series(\n    symbol=\"MSFT\",\n    outputsize=75,\n    interval=\"1day\",\n)\n\n# 1. Returns OHLCV chart\nts.as_pyplot_figure()\n\n# 2. Returns OHLCV + BBANDS(close, 20, 2, SMA) + %B(close, 20, 2 SMA) + STOCH(14, 3, 3, SMA, SMA)\nts.with_bbands().with_percent_b().with_stoch(slow_k_period=3).as_pyplot_figure()\n```\n\n#### Interactive\n\nInteractive charts are built on top of `plotly` library.\n\n![interactive chart example](https://res.cloudinary.com/dnz8pwg9r/image/upload/v1599349681/plotly-chart.gif)\n\n* Use `.as_plotly_figure().show()`\n\n```python\nfrom twelvedata import TDClient\n\ntd = TDClient(apikey=\"YOUR_API_KEY_HERE\")\nts = td.time_series(\n    symbol=\"DNR\",\n    outputsize=50,\n    interval=\"1week\",\n)\n\n# 1. Returns OHLCV chart\nts.as_plotly_figure()\n\n# 2. Returns OHLCV + EMA(close, 7) + MAMA(close, 0.5, 0.05) + MOM(close, 9) + MACD(close, 12, 26, 9)\nts.with_ema(time_period=7).with_mama().with_mom().with_macd().as_plotly_figure().show()\n```\n\n### WebSocket\n\nWith the WebSocket, a duplex communication channel with the server is established.\n\nMake sure to have `websocket_client` package [installed](https://pypi.org/project/websocket_client/).\n\n![websocket example](https://res.cloudinary.com/dnz8pwg9r/image/upload/v1599349899/ws-example.gif)\n\n#### Features\n* Real-time low latency stream of financial quotes.\n* You might subscribe to stocks, forex, and crypto.\n\n#### Example\n```python\nimport time\nfrom twelvedata import TDClient\n\n\nmessages_history = []\n\n\ndef on_event(e):\n    # do whatever is needed with data\n    print(e)\n    messages_history.append(e)\n\n\ntd = TDClient(apikey=\"YOUR_API_KEY_HERE\")\nws = td.websocket(symbols=\"BTC/USD\", on_event=on_event)\nws.subscribe(['ETH/BTC', 'AAPL'])\nws.connect()\nwhile True:\n    print('messages received: ', len(messages_history))\n    ws.heartbeat()\n    time.sleep(10)\n```\n\nParameters accepted by the `.websocket()` object:\n* **symbols** list of symbols to subscribe\n* **on_event** function that invokes when event from server is received\n* **logger** instance of logger, otherwise set to default\n* **max_queue_size** maximum size of queue, default `12000`\n* **log_level** accepts `debug` or `info`, otherwise not set\n\nApplicable methods on `.websocket()` object:\n* `ws.subscribe([list of symbols])`: get data from the symbols passed\n* `ws.unsubscribe([list of symbols])`: stop receiving data from the symbols passed\n* `ws.reset()`: unsubscribe from all symbols\n* `ws.connect()`: establish connection with WebSocket server\n* `ws.disconnect()`: close connection with WebSocket server\n* `ws.heartbeat()`: send heartbeat to server\n\n**Important**. Do not forget that WebSockets are only available for Twelve Data users on the [Pro plan](https://twelvedata.com/pricing) and above. Checkout the trial [here](https://support.twelvedata.com/en/articles/5335783-trial).\n\n### Advanced\n\n#### Custom endpoint\nThis method is used to request unrepresented endpoints on this package, but which are available at Twelve Data.\n\n```python\nendpoint = td.custom_endpoint(\n    name=\"quote\",\n    symbol=\"AAPL\",\n)\nendpoint.as_json()\n```\n\nThe only required parameter is `name` which should be identical to the endpoint used at Twelve Data. All others can be custom and will vary according to the method.\n\n#### Debugging\nWhen the method doesn't return the desired data or throws an error, it might be helpful to understand and analyze the API query behind it.\nAdd `.as_url()` to any method or chain of methods, and it will return the list of used URLs.\n\n```python\nts = td.time_series(\n    symbol=\"AAPL\",\n    interval=\"1min\",\n    outputsize=10,\n    timezone=\"America/New_York\",\n).with_bbands().with_ema()\n\nts.as_url()\n# ['https://api.twelvedata.com/time_series?symbol=AAPL&interval=1min&outputsize=10&dp=5&timezone=America/New_York&order=desc&prepost=false&format=JSON&apikey=demo', \n# 'https://api.twelvedata.com/bbands?symbol=AAPL&interval=1min&series_type=close&time_period=20&sd=2&ma_type=SMA&outputsize=10&dp=5&timezone=America/New_York&order=desc&prepost=false&format=JSON&apikey=demo', \n# 'https://api.twelvedata.com/ema?symbol=AAPL&interval=1min&series_type=close&time_period=9&outputsize=10&dp=5&timezone=America/New_York&order=desc&prepost=false&format=JSON&apikey=demo']\n\n```\n\n#### API usage\nThis method gives an overview of the current API credits consumption.\n\n```python\napi = td.api_usage()\n```\n\n## Support\n\nVisit our official website [contact page](https://twelvedata.com/contact) or [support center](https://support.twelvedata.com/).\n\n## Announcements\n\nFollow us for announcements and updates about this library.\n* [Twitter](https://twitter.com/TwelveData)\n* [Telegram](https://t.me/twelvedata)\n\n## Roadmap\n\n- [x] Fundamentals \n- [x] WebSocket\n- [x] Batch requests\n- [x] Custom plots coloring\n- [x] Interactive charts (plotly)\n- [x] Static charts (matplotlib)\n- [x] Pandas support\n\n## Contributing\n\n1. Clone repo and create a new branch: `$ git checkout https://github.com/twelvedata/twelvedata -b name_for_new_branch`.\n2. Make changes and test.\n3. Submit Pull Request with comprehensive description of changes.\n\n## License\n\nThis package is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\nAUTODOCDIR    = api\nAUTODOCBUILD  = sphinx-apidoc\nPROJECT       = twelvedata\nMODULEDIR     = ../src/twelvedata\n\n# User-friendly check for sphinx-build\nifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $?), 1)\n$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)\nendif\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext doc-requirements\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  latexpdfja to make LaTeX files and run them through platex/dvipdfmx\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  xml        to make Docutils-native XML files\"\n\t@echo \"  pseudoxml  to make pseudoxml-XML files for display purposes\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\trm -rf $(BUILDDIR)/* $(AUTODOCDIR)\n\n$(AUTODOCDIR): $(MODULEDIR)\n\tmkdir -p $@\n\t$(AUTODOCBUILD) -f -o $@ $^\n\ndoc-requirements: $(AUTODOCDIR)\n\nhtml: doc-requirements\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml: doc-requirements\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml: doc-requirements\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle: doc-requirements\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson: doc-requirements\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp: doc-requirements\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp: doc-requirements\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/$(PROJECT).qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/$(PROJECT).qhc\"\n\ndevhelp: doc-requirements\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $HOME/.local/share/devhelp/$(PROJECT)\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $HOME/.local/share/devhelp/$(PROJEC)\"\n\t@echo \"# devhelp\"\n\nepub: doc-requirements\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\npatch-latex:\n\tfind _build/latex -iname \"*.tex\" | xargs -- \\\n\t\tsed -i'' 's~includegraphics{~includegraphics\\[keepaspectratio,max size={\\\\textwidth}{\\\\textheight}\\]{~g'\n\nlatex: doc-requirements\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t$(MAKE) patch-latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf: doc-requirements\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t$(MAKE) patch-latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\nlatexpdfja: doc-requirements\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through platex and dvipdfmx...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext: doc-requirements\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman: doc-requirements\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\ntexinfo: doc-requirements\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\ninfo: doc-requirements\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\ngettext: doc-requirements\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\nchanges: doc-requirements\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck: doc-requirements\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest: doc-requirements\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n\nxml: doc-requirements\n\t$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml\n\t@echo\n\t@echo \"Build finished. The XML files are in $(BUILDDIR)/xml.\"\n\npseudoxml: doc-requirements\n\t$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml\n\t@echo\n\t@echo \"Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml.\"\n"
  },
  {
    "path": "docs/_static/.gitignore",
    "content": "# Empty directory\n"
  },
  {
    "path": "docs/authors.rst",
    "content": ".. _authors:\n.. include:: ../AUTHORS.rst\n"
  },
  {
    "path": "docs/changelog.rst",
    "content": ".. _changes:\n.. include:: ../CHANGELOG.rst\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# This file is execfile()d with the current directory set to its containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\nimport os\nimport sys\nimport inspect\nimport shutil\n\n__location__ = os.path.join(os.getcwd(), os.path.dirname(\n    inspect.getfile(inspect.currentframe())))\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\nsys.path.insert(0, os.path.join(__location__, '../src'))\n\n# -- Run sphinx-apidoc ------------------------------------------------------\n# This hack is necessary since RTD does not issue `sphinx-apidoc` before running\n# `sphinx-build -b html . _build/html`. See Issue:\n# https://github.com/rtfd/readthedocs.org/issues/1139\n# DON'T FORGET: Check the box \"Install your project inside a virtualenv using\n# setup.py install\" in the RTD Advanced Settings.\n# Additionally it helps us to avoid running apidoc manually\n\ntry:  # for Sphinx >= 1.7\n    from sphinx.ext import apidoc\nexcept ImportError:\n    from sphinx import apidoc\n\noutput_dir = os.path.join(__location__, \"api\")\nmodule_dir = os.path.join(__location__, \"../src/twelvedata\")\ntry:\n    shutil.rmtree(output_dir)\nexcept FileNotFoundError:\n    pass\n\ntry:\n    import sphinx\n    from pkg_resources import parse_version\n\n    cmd_line_template = \"sphinx-apidoc -f -o {outputdir} {moduledir}\"\n    cmd_line = cmd_line_template.format(outputdir=output_dir, moduledir=module_dir)\n\n    args = cmd_line.split(\" \")\n    if parse_version(sphinx.__version__) >= parse_version('1.7'):\n        args = args[1:]\n\n    apidoc.main(args)\nexcept Exception as e:\n    print(\"Running `sphinx-apidoc` failed!\\n{}\".format(e))\n\n# -- General configuration -----------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n# needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be extensions\n# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.\nextensions = ['sphinx.ext.autodoc', 'sphinx.ext.intersphinx', 'sphinx.ext.todo',\n              'sphinx.ext.autosummary', 'sphinx.ext.viewcode', 'sphinx.ext.coverage',\n              'sphinx.ext.doctest', 'sphinx.ext.ifconfig', 'sphinx.ext.mathjax',\n              'sphinx.ext.napoleon']\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix of source filenames.\nsource_suffix = '.rst'\n\n# The encoding of source files.\n# source_encoding = 'utf-8-sig'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# General information about the project.\nproject = u'twelvedata'\ncopyright = u'2019, twelvedata'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = ''  # Is set by calling `setup.py docs`\n# The full version, including alpha/beta/rc tags.\nrelease = ''  # Is set by calling `setup.py docs`\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n# language = None\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n# today = ''\n# Else, today_fmt is used as the format for a strftime call.\n# today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\nexclude_patterns = ['_build']\n\n# The reST default role (used for this markup: `text`) to use for all documents.\n# default_role = None\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n# add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n# add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n# show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# A list of ignored prefixes for module index sorting.\n# modindex_common_prefix = []\n\n# If true, keep warnings as \"system message\" paragraphs in the built documents.\n# keep_warnings = False\n\n\n# -- Options for HTML output ---------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = 'alabaster'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\nhtml_theme_options = {\n    'sidebar_width': '300px',\n    'page_width': '1200px'\n}\n\n# Add any paths that contain custom themes here, relative to this directory.\n# html_theme_path = []\n\n# The name for this set of Sphinx documents.  If None, it defaults to\n# \"<project> v<release> documentation\".\ntry:\n    from twelvedata import __version__ as version\nexcept ImportError:\n    pass\nelse:\n    release = version\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n# html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n# html_logo = \"\"\n\n# The name of an image file (within the static path) to use as favicon of the\n# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n# html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,\n# using the given strftime format.\n# html_last_updated_fmt = '%b %d, %Y'\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n# html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\n# html_sidebars = {}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n# html_additional_pages = {}\n\n# If false, no module index is generated.\n# html_domain_indices = True\n\n# If false, no index is generated.\n# html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n# html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n# html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n# html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n# html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n# html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n# html_file_suffix = None\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'twelvedata-doc'\n\n\n# -- Options for LaTeX output --------------------------------------------------\n\nlatex_elements = {\n# The paper size ('letterpaper' or 'a4paper').\n# 'papersize': 'letterpaper',\n\n# The font size ('10pt', '11pt' or '12pt').\n# 'pointsize': '10pt',\n\n# Additional stuff for the LaTeX preamble.\n# 'preamble': '',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title, author, documentclass [howto/manual]).\nlatex_documents = [\n  ('index', 'user_guide.tex', u'twelvedata Documentation',\n   u'gtors', 'manual'),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n# latex_logo = \"\"\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n# latex_use_parts = False\n\n# If true, show page references after internal links.\n# latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n# latex_show_urls = False\n\n# Documents to append as an appendix to all manuals.\n# latex_appendices = []\n\n# If false, no module index is generated.\n# latex_domain_indices = True\n\n# -- External mapping ------------------------------------------------------------\npython_version = '.'.join(map(str, sys.version_info[0:2]))\nintersphinx_mapping = {\n    'sphinx': ('http://www.sphinx-doc.org/en/stable', None),\n    'python': ('https://docs.python.org/' + python_version, None),\n    'matplotlib': ('https://matplotlib.org', None),\n    'numpy': ('https://docs.scipy.org/doc/numpy', None),\n    'sklearn': ('http://scikit-learn.org/stable', None),\n    'pandas': ('http://pandas.pydata.org/pandas-docs/stable', None),\n    'scipy': ('https://docs.scipy.org/doc/scipy/reference', None),\n}\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. include:: ../README.rst\n\n\nContents\n========\n\n.. toctree::\n   :maxdepth: 2\n\n   License <license>\n   Authors <authors>\n   Changelog <changelog>\n   Module Reference <api/modules>\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n"
  },
  {
    "path": "docs/license.rst",
    "content": ".. _license:\n\n=======\nLicense\n=======\n\n.. include:: ../LICENSE.txt\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[build-system]\nrequires = [\"setuptools>=45,<75\", \"wheel\", \"setuptools-scm[toml]>=6.2\"]\nbuild-backend = \"setuptools.build_meta\"\n\n[tool.setuptools_scm]\nwrite_to = \"src/twelvedata/_version.py\"\n"
  },
  {
    "path": "requirements.txt",
    "content": "pytimeparse\nrequests\nsetuptools"
  },
  {
    "path": "setup.cfg",
    "content": "# This file is used to configure your project.\n# Read more about the various options under:\n# http://setuptools.readthedocs.io/en/latest/setuptools.html#configuring-setup-using-setup-cfg-files\n\n[metadata]\nname = twelvedata\ndescription = Python client for Twelve Data\nauthor = Twelve Data\nauthor_email = info@twelvedata.com\nlicense = MIT\nurl = https://github.com/twelvedata/twelvedata-python\nlong_description = file: README.md\nlong_description_content_type = text/markdown\n\nplatforms = any\nclassifiers =\n    Development Status :: 4 - Beta\n    Programming Language :: Python\n\n[options]\nzip_safe = False\npackages = find:\ninclude_package_data = True\npackage_dir =\n    =src\ninstall_requires =\n    pytimeparse>=1.1,<2\n    requests>=2.22,<3\npython_requires = >=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*\n\n[options.packages.find]\nwhere = src\nexclude =\n    tests\n\n[options.extras_require]\npandas =\n    pandas>=0.24,<0.25;python_version<\"3\"\n    pandas>=0.24;python_version>=\"3\"\nmatplotlib =\n    matplotlib>=2.2,<3;python_version<\"3\"\n    matplotlib>=2.2;python_version>=\"3\"\nplotly =\n    plotly>=4.2.1\nwebsocket =\n    websocket-client>=1.2.1\nmplfinance =\n    mplfinance>=0.12\n\n\ntesting =\n    pytest\n    pytest-cov\n\n[options.entry_points]\n# Add here console scripts like:\n# console_scripts =\n#     script_name = twelvedata.module:function\n# For example:\n# console_scripts =\n#     fibonacci = twelvedata.skeleton:run\n# And any other entry points, for example:\n# pyscaffold.cli =\n#     awesome = pyscaffoldext.awesome.extension:AwesomeExtension\n\n[test]\n# py.test options when running `python setup.py test`\n# addopts = --verbose\nextras = True\n\n[tool:pytest]\n# Options for py.test:\n# Specify command line options as you would do when invoking py.test directly.\n# e.g. --cov-report html (or xml) for html/xml output or --junitxml junit.xml\n# in order to write a coverage file that can be read by Jenkins.\naddopts =\n    --cov twelvedata --cov-report term-missing\n    --verbose\nnorecursedirs =\n    dist\n    build\n    .tox\ntestpaths = tests\n\n[aliases]\nbuild = bdist_wheel\nrelease = build upload\n\n[bdist_wheel]\n\n[build_sphinx]\nsource_dir = docs\nbuild_dir = docs/_build\n\n[devpi:upload]\n# Options for the devpi: PyPI server and packaging tool\n# VCS export must be deactivated since we are using setuptools-scm\nno-vcs = 1\nformats = bdist_wheel\n\n[flake8]\n# Some sane defaults for the code style checker flake8\nexclude =\n    .tox\n    build\n    dist\n    .eggs\n    docs/conf.py\n"
  },
  {
    "path": "setup.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\"\"\"\n    Setup file for twelvedata.\n    Use setup.cfg to configure your project.\n\"\"\"\nfrom setuptools import setup\n\nif __name__ == \"__main__\":\n    setup()\n"
  },
  {
    "path": "src/twelvedata/__init__.py",
    "content": "# -*- coding: utf-8 -*-\nfrom .client import TDClient\n\ntry:\n    from ._version import version as __version__\nexcept ImportError:\n    try:\n        import importlib.metadata\n        __version__ = importlib.metadata.version(__name__)\n    except Exception:\n        __version__ = \"unknown\"\n"
  },
  {
    "path": "src/twelvedata/client.py",
    "content": "from .context import Context\nfrom .endpoints import (\n    CustomEndpoint,\n    StocksListEndpoint,\n    StockExchangesListEndpoint,\n    ForexPairsListEndpoint,\n    ETFListEndpoint,\n    IndicesListEndpoint,\n    FundsListEndpoint,\n    BondsListEndpoint,\n    CommoditiesListEndpoint,\n    ExchangesListEndpoint,\n    CryptocurrenciesListEndpoint,\n    CryptocurrencyExchangesListEndpoint,\n    TechnicalIndicatorsListEndpoint,\n    SymbolSearchEndpoint,\n    EarliestTimestampEndpoint,\n    ExchangeRateEndpoint,\n    CurrencyConversionEndpoint,\n    QuoteEndpoint,\n    PriceEndpoint,\n    EODEndpoint,\n    LogoEndpoint,\n    ProfileEndpoint,\n    DividendsEndpoint,\n    DividendsCalendarEndpoint,\n    SplitsEndpoint,\n    SplitsCalendarEndpoint,\n    EarningsEndpoint,\n    EarningsCalendarEndpoint,\n    IPOCalendarEndpoint,\n    StatisticsEndpoint,\n    InsiderTransactionsEndpoint,\n    IncomeStatementEndpoint,\n    BalanceSheetEndpoint,\n    CashFlowEndpoint,\n    OptionsExpirationEndpoint,\n    OptionsChainEndpoint,\n    KeyExecutivesEndpoint,\n    InstitutionalHoldersEndpoint,\n    FundHoldersEndpoint,\n    APIUsageEndpoint,\n    MarketStateEndpoint,\n)\nfrom .http_client import DefaultHttpClient\nfrom .time_series import TimeSeries\nfrom .utils import patch_endpoints_meta\nfrom .websocket import TDWebSocket\n\n\nclass TDClient:\n    def __init__(self, apikey, http_client=None, base_url=None, self_heal_time_s=None, **defaults):\n        self.ctx = Context()\n        self.ctx.apikey = apikey\n        self.ctx.self_heal_time_s = self_heal_time_s\n        self.ctx.base_url = base_url or \"https://api.twelvedata.com\"\n        self.ctx.http_client = http_client or DefaultHttpClient(self.ctx.base_url)\n        self.ctx.defaults = defaults\n\n        patch_endpoints_meta(self.ctx)\n\n    def websocket(self, **defaults):\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return TDWebSocket(ctx)\n\n    def custom_endpoint(self, **defaults):\n        \"\"\"\n        Creates request builder for custom endpoint\n\n        This method can request any GET endpoint available at Twelve Data\n        with a custom set of parameters\n\n        :returns: request builder instance\n        :rtype: CustomEndpointRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return CustomEndpoint(ctx, **ctx.defaults)\n\n    def get_stocks_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Stocks List\n\n        This API call return array of symbols available at twelvedata API.\n        This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: StocksListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return StocksListEndpoint(ctx, **ctx.defaults)\n\n    def get_stock_exchanges_list(self):\n        \"\"\"\n        Creates request builder for Stock Exchanges List\n\n        This API call return array of stock exchanges available at twelvedata\n        API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: StockExchangesListRequestBuilder\n        \"\"\"\n        return StockExchangesListEndpoint(ctx=self.ctx)\n\n    def get_forex_pairs_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Forex Pairs List\n\n        This API call return array of forex pairs available at twelvedata API.\n        This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: ForexPairsListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return ForexPairsListEndpoint(ctx, **ctx.defaults)\n\n    def get_cryptocurrencies_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Cryptocurrencies List\n\n        This API call return array of cryptocurrency pairs available at\n        twelvedata API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: CryptocurrenciesListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return CryptocurrenciesListEndpoint(ctx, **ctx.defaults)\n\n    def get_etf_list(self, **defaults):\n        \"\"\"\n        Creates request builder for ETF List\n\n        This API call return array of ETFs available at Twelve Data API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: ETFListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return ETFListEndpoint(ctx, **ctx.defaults)\n\n    def get_indices_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Indices List\n\n        This API call return array of indices available at Twelve Data API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: IndicesListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return IndicesListEndpoint(ctx, **ctx.defaults)\n\n    def get_funds_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Funds List\n\n        This API call return array of funds available at Twelve Data API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: FundsListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return FundsListEndpoint(ctx, **ctx.defaults)\n\n    def get_bonds_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Bonds List\n\n        This API call return array of bonds available at Twelve Data API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: BondsListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return BondsListEndpoint(ctx, **ctx.defaults)\n    \n    def get_commodities_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Commodities List\n\n        This API call return array of commodities available at Twelve Data API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: CommoditiesListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return CommoditiesListEndpoint(ctx, **ctx.defaults)\n\n    def get_exchanges_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Exchanges List\n\n        This API call return array of stock, ETF or index exchanges available at Twelve Data API.\n        This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: ExchangesListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return ExchangesListEndpoint(ctx, **ctx.defaults)\n\n    def get_cryptocurrency_exchanges_list(self, **defaults):\n        \"\"\"\n        Creates request builder for Cryptocurrency Exchanges List\n\n        This API call return array of cryptocurrency exchanges available at\n        twelvedata API. This list is daily updated.\n\n        :returns: request builder instance\n        :rtype: CryptocurrencyExchangesListRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return CryptocurrencyExchangesListEndpoint(ctx, **ctx.defaults)\n\n    def get_technical_indicators_list(self):\n        \"\"\"\n        Creates request builder for Technical Indicators List\n\n        This API call return array of objects with available technical indicators. This endpoint might be used to build\n        an abstract interface to make more convenient API calls from the application.\n\n        :returns: request builder instance\n        :rtype: TechnicalIndicatorsListRequestBuilder\n        \"\"\"\n        return TechnicalIndicatorsListEndpoint(ctx=self.ctx)\n\n    def symbol_search(self, **defaults):\n        \"\"\"\n        Creates request builder for Symbol Search\n\n        This method helps to find the best matching symbol. It can be used as the base for custom lookups.\n        The response is returned in descending order, with the most relevant instrument at the beginning.\n\n        :returns: request builder instance\n        :rtype: SymbolSearchRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return SymbolSearchEndpoint(ctx, **ctx.defaults)\n\n    def get_earliest_timestamp(self, **defaults):\n        \"\"\"\n        Creates request builder for Earliest Timestamp\n\n        This method returns the first available DateTime for a given instrument at the specific interval.\n\n        :returns: request builder instance\n        :rtype: EarliestTimestampRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return EarliestTimestampEndpoint(ctx, **ctx.defaults)\n\n    def get_market_state(self, **defaults):\n        \"\"\"\n        Creates request builder for Market State\n\n        Check the state of all available exchanges, time to open, and time to close. Returns all available stock exchanges by default.\n\n        :returns: request builder instance\n        :rtype: MarketStateRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return MarketStateEndpoint(ctx, **ctx.defaults)\n\n    def time_series(self, **defaults):\n        \"\"\"\n        Creates factory for time series requests.\n\n        :returns: request factory instance\n        :rtype: TimeSeries\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return TimeSeries(ctx)\n\n    def exchange_rate(self, **defaults):\n        \"\"\"\n        Creates factory for exchange rate requests.\n\n        :returns: request factory instance\n        :rtype: ExchangeRate\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return ExchangeRateEndpoint(ctx, **ctx.defaults)\n\n    def currency_conversion(self, **defaults):\n        \"\"\"\n        Creates factory for exchange rate requests.\n\n        :returns: request factory instance\n        :rtype: CurrencyConversion\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return CurrencyConversionEndpoint(ctx, **ctx.defaults)\n\n    def quote(self, **defaults):\n        \"\"\"\n        Creates factory for exchange rate requests.\n\n        :returns: request factory instance\n        :rtype: Quote\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return QuoteEndpoint(ctx, **ctx.defaults)\n\n    def price(self, **defaults):\n        \"\"\"\n        Creates factory for exchange rate requests.\n\n        :returns: request factory instance\n        :rtype: Price\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return PriceEndpoint(ctx, **ctx.defaults)\n\n    def eod(self, **defaults):\n        \"\"\"\n        Creates factory for exchange rate requests.\n\n        :returns: request factory instance\n        :rtype: EOD\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return EODEndpoint(ctx, **ctx.defaults)\n\n    def get_logo(self, **defaults):\n        \"\"\"\n        Creates request builder for Logo\n\n        Returns logo of the company.\n\n        :returns: request builder instance\n        :rtype: LogoRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return LogoEndpoint(ctx, **ctx.defaults)\n\n    def get_profile(self, **defaults):\n        \"\"\"\n        Creates request builder for Profile\n\n        Returns general information about the company.\n\n        :returns: request builder instance\n        :rtype: ProfileRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return ProfileEndpoint(ctx, **ctx.defaults)\n\n    def get_dividends(self, **defaults):\n        \"\"\"\n        Creates request builder for Dividends\n\n        Returns the amount of dividends paid out for the last 10+ years.\n\n        :returns: request builder instance\n        :rtype: DividendsRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return DividendsEndpoint(ctx, **ctx.defaults)\n\n    def get_dividends_calendar(self, **defaults):\n        \"\"\"\n        Creates request builder for Dividends Calendar\n\n        Returns the dividend data as a calendar for a given date range. To call custom period, use start_date and end_date parameters.\n\n        :returns: request builder instance\n        :rtype: DividendsCalendarRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return DividendsCalendarEndpoint(ctx, **ctx.defaults)\n\n    def get_splits(self, **defaults):\n        \"\"\"\n        Creates request builder for Splits\n\n        Returns the date and the split factor of shares of the company for the last 10+ years.\n\n        :returns: request builder instance\n        :rtype: SplitsRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return SplitsEndpoint(ctx, **ctx.defaults)\n\n    def get_splits_calendar(self, **defaults):\n        \"\"\"\n        Creates request builder for Splits Calendar\n\n        Returns split data as a calendar for a given date range. To call custom period, use start_date and end_date parameters.\n\n        :returns: request builder instance\n        :rtype: SplitsCalendarRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return SplitsCalendarEndpoint(ctx, **ctx.defaults)\n\n    def get_earnings(self, **defaults):\n        \"\"\"\n        Creates request builder for Earnings\n\n        This API call returns earnings data for a given company, including EPS estimate and EPS actual.\n        Earnings are available for complete company history.\n\n        :returns: request builder instance\n        :rtype: EarningsRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return EarningsEndpoint(ctx, **ctx.defaults)\n\n    def get_earnings_calendar(self, **defaults):\n        \"\"\"\n        Creates request builder for Earnings Calendar\n\n        This API method returns earning data as a calendar for a given date range. By default today's earning is returned.\n        To call custom period, use start_date and end_date parameters.\n\n        :returns: request builder instance\n        :rtype: EarningsCalendarRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return EarningsCalendarEndpoint(ctx, **ctx.defaults)\n\n    def get_ipo_calendar(self, **defaults):\n        \"\"\"\n        Creates request builder for IPO Calendar\n\n        This endpoint returns past, today, or upcoming IPOs.\n\n        :returns: request builder instance\n        :rtype: IPOCalendarRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return IPOCalendarEndpoint(ctx, **ctx.defaults)\n\n    def get_statistics(self, **defaults):\n        \"\"\"\n        Creates request builder for Statistics\n\n        Returns current overview of company’s main statistics including valuation metrics and financials.\n\n        :returns: request builder instance\n        :rtype: StatisticsRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return StatisticsEndpoint(ctx, **ctx.defaults)\n\n    def get_insider_transactions(self, **defaults):\n        \"\"\"\n        Creates request builder for Insider Transactions\n\n        Returns trading information performed by insiders.\n\n        :returns: request builder instance\n        :rtype: InsiderTransactionsRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return InsiderTransactionsEndpoint(ctx, **ctx.defaults)\n\n    def get_income_statement(self, **defaults):\n        \"\"\"\n        Creates request builder for Income Statement\n\n        Returns complete income statement of a company and shows the company’s revenues and expenses\n        during a period (annual or quarter).\n\n        :returns: request builder instance\n        :rtype: IncomeStatementRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return IncomeStatementEndpoint(ctx, **ctx.defaults)\n\n    def get_balance_sheet(self, **defaults):\n        \"\"\"\n        Creates request builder for Balance Sheet\n\n        Returns complete balance sheet of a company showing the summary of assets, liabilities, and\n        shareholders’ equity.\n\n        :returns: request builder instance\n        :rtype: BalanceSheetRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return BalanceSheetEndpoint(ctx, **ctx.defaults)\n\n    def get_cash_flow(self, **defaults):\n        \"\"\"\n        Creates request builder for Cash Flow\n\n        Returns complete cash flow of a company showing net the amount of cash and cash equivalents\n        being transferred into and out of a business.\n\n        :returns: request builder instance\n        :rtype: CashFlowRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return CashFlowEndpoint(ctx, **ctx.defaults)\n\n    def get_options_expiration(self, **defaults):\n        \"\"\"\n        Creates request builder for Options Expiration\n\n        Return the expiration dates of an option contract.\n\n        :returns: request builder instance\n        :rtype: OptionsExpirationRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return OptionsExpirationEndpoint(ctx, **ctx.defaults)\n\n    def get_options_chain(self, **defaults):\n        \"\"\"\n        Creates request builder for Options Chain\n\n        Returns a listing of all available options contracts for given security. It shows all listed puts,\n        calls, their expiration, strike prices, and pricing information for a single underlying asset\n        within a given maturity period.\n\n        :returns: request builder instance\n        :rtype: OptionsChainRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return OptionsChainEndpoint(ctx, **ctx.defaults)\n\n    def get_key_executives(self, **defaults):\n        \"\"\"\n        Creates request builder for Key Executives\n\n        Returns individuals at the highest level of management of an organization.\n\n        :returns: request builder instance\n        :rtype: KeyExecutivesRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return KeyExecutivesEndpoint(ctx, **ctx.defaults)\n\n    def get_institutional_holders(self, **defaults):\n        \"\"\"\n        Creates request builder for Institutional Holders\n\n        Returns the amount of the company’s available stock owned by institutions (pension funds,\n        insurance companies, investment firms, private foundations, endowments, or other large\n        entities that manage funds on behalf of others).\n\n        :returns: request builder instance\n        :rtype: InstitutionalHoldersRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return InstitutionalHoldersEndpoint(ctx, **ctx.defaults)\n\n    def get_fund_holders(self, **defaults):\n        \"\"\"\n        Creates request builder for Fund Holders\n\n        Returns the amount of the company’s available stock owned by mutual fund holders.\n\n        :returns: request builder instance\n        :rtype: FundHoldersRequestBuilder\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return FundHoldersEndpoint(ctx, **ctx.defaults)\n\n    def api_usage(self, **defaults):\n        \"\"\"\n        Creates request builder for API usage\n\n        This endpoint will provide information on the current usage of Twelve Data API.\n\n        :returns: request builder instance\n        :rtype: APIUsage\n        \"\"\"\n        ctx = Context.from_context(self.ctx)\n        ctx.defaults.update(defaults)\n        return APIUsageEndpoint(ctx, **ctx.defaults)\n"
  },
  {
    "path": "src/twelvedata/context.py",
    "content": "# coding: utf-8\n\n\nclass Context:\n    \"\"\"\n    Context which used by all request builders\n\n    :ivar http_client: Default HTTP client\n    :ivar apikey: API key for access to the Twelvedata API\n    :ivar base_url: Base URL for Twelvedata API\n    :ivar defaults: Default parameters that will be used by request builders.\n    :ivar self_heal_time_s: time in seconds for retrying\n    \"\"\"\n\n    http_client = None\n    apikey = None\n    base_url = None\n    defaults = None\n    self_heal_time_s = None\n\n    @classmethod\n    def from_context(cls, ctx):\n        \"\"\"\n        Creates copy of specified Context\n        \"\"\"\n        instance = cls()\n        instance.http_client = ctx.http_client\n        instance.apikey = ctx.apikey\n        instance.base_url = ctx.base_url\n        instance.self_heal_time_s = ctx.self_heal_time_s\n        instance.defaults = dict(ctx.defaults or {})\n        return instance\n"
  },
  {
    "path": "src/twelvedata/endpoints.py",
    "content": "import itertools\nfrom .mixins import AsMixin\n\n\n__all__ = (\n    \"ADOSCEndpoint\",\n    \"ADEndpoint\",\n    \"ADXREndpoint\",\n    \"ADXEndpoint\",\n    \"APIUsageEndpoint\",\n    \"APOEndpoint\",\n    \"AROONOSCEndpoint\",\n    \"AROONEndpoint\",\n    \"ATREndpoint\",\n    \"AVGPRICEEndpoint\",\n    \"BBANDSEndpoint\",\n    \"BETAEndpoint\",\n    \"BOPEndpoint\",\n    \"BondsListEndpoint\",\n    \"CCIEndpoint\",\n    \"CEILEndpoint\",\n    \"CMOEndpoint\",\n    \"COPPOCKEndpoint\",\n    \"CommoditiesListEndpoint\",\n    \"CryptocurrenciesListEndpoint\",\n    \"CryptocurrencyExchangesListEndpoint\",\n    \"CurrencyConversionEndpoint\",\n    \"DEMAEndpoint\",\n    \"DividendsCalendarEndpoint\",\n    \"DXEndpoint\",\n    \"EarliestTimestampEndpoint\",\n    \"EarningsCalendarEndpoint\",\n    \"EarningsEndpoint\",\n    \"EMAEndpoint\",\n    \"EODEndpoint\",\n    \"ETFListEndpoint\",\n    \"ExchangeRateEndpoint\",\n    \"ExchangesListEndpoint\",\n    \"EXPEndpoint\",\n    \"FLOOREndpoint\",\n    \"ForexPairsListEndpoint\",\n    \"FundsListEndpoint\",\n    \"HEIKINASHICANDLESEndpoint\",\n    \"HLC3Endpoint\",\n    \"HT_DCPERIODEndpoint\",\n    \"HT_DCPHASEEndpoint\",\n    \"HT_PHASOREndpoint\",\n    \"HT_SINEEndpoint\",\n    \"HT_TRENDLINEEndpoint\",\n    \"HT_TRENDMODEEndpoint\",\n    \"ICHIMOKUEndpoint\",\n    \"IndicesListEndpoint\",\n    \"KAMAEndpoint\",\n    \"KELTNEREndpoint\",\n    \"KSTEndpoint\",\n    \"LINEARREGANGLEEndpoint\",\n    \"LINEARREGINTERCEPTEndpoint\",\n    \"LINEARREGEndpoint\",\n    \"LINEARREGSLOPEEndpoint\",\n    \"LNEndpoint\",\n    \"LOG10Endpoint\",\n    \"MACDEndpoint\",\n    \"MACDSlopeEndpoint\",\n    \"MACDEXTEndpoint\",\n    \"MAMAEndpoint\",\n    \"MAEndpoint\",\n    \"MAXINDEXEndpoint\",\n    \"MAXEndpoint\",\n    \"MarketStateEndpoint\",\n    \"McGinleyDynamicEndpoint\",\n    \"MEDPRICEEndpoint\",\n    \"MFIEndpoint\",\n    \"MIDPOINTEndpoint\",\n    \"MIDPRICEEndpoint\",\n    \"MININDEXEndpoint\",\n    \"MINMAXINDEXEndpoint\",\n    \"MINMAXEndpoint\",\n    \"MINEndpoint\",\n    \"MINUS_DIEndpoint\",\n    \"MINUS_DMEndpoint\",\n    \"MOMEndpoint\",\n    \"NATREndpoint\",\n    \"OBVEndpoint\",\n    \"PLUS_DIEndpoint\",\n    \"PLUS_DMEndpoint\",\n    \"PPOEndpoint\",\n    \"PercentBEndpoint\",\n    \"PivotPointsHLEndpoint\",\n    \"PriceEndpoint\",\n    \"QuoteEndpoint\",\n    \"ROCPEndpoint\",\n    \"ROCR100Endpoint\",\n    \"ROCREndpoint\",\n    \"ROCEndpoint\",\n    \"RSIEndpoint\",\n    \"RVOLEndpoint\",\n    \"SAREndpoint\",\n    \"SMAEndpoint\",\n    \"SQRTEndpoint\",\n    \"STDDEVEndpoint\",\n    \"STOCHFEndpoint\",\n    \"STOCHRSIEndpoint\",\n    \"STOCHEndpoint\",\n    \"SplitsCalendarEndpoint\",\n    \"SymbolSearchEndpoint\",\n    \"StockExchangesListEndpoint\",\n    \"StocksListEndpoint\",\n    \"SuperTrendEndpoint\",\n    \"T3MAEndpoint\",\n    \"TEMAEndpoint\",\n    \"TRANGEEndpoint\",\n    \"TRIMAEndpoint\",\n    \"TSFEndpoint\",\n    \"TYPPRICEEndpoint\",\n    \"TechIndicatorsMetaEndpoint\",\n    \"TimeSeriesEndpoint\",\n    \"ULTOSCEndpoint\",\n    \"VAREndpoint\",\n    \"VWAPEndpoint\",\n    \"WCLPRICEEndpoint\",\n    \"WILLREndpoint\",\n    \"WMAEndpoint\",\n)\n\n\ndef purify_symbol(symbol):\n    return \"\".join(symbol.split()).strip(',')\n\n\ndef get_symbol(symbol) -> (str, bool):\n    if isinstance(symbol, str):\n        purified_symbol = purify_symbol(symbol)\n        if ',' in symbol and len(purified_symbol.split(',')) > 1:\n            return purified_symbol, True\n        return purified_symbol, False\n    elif isinstance(symbol, list) or isinstance(symbol, tuple):\n        if len(symbol) == 1:\n            return symbol[0], False\n        elif len(symbol) > 1:\n            return ','.join(symbol), True\n    else:\n        raise TypeError('The type of argument \"symbol\" can be only: str, list, tuple')\n\n\ndef build_url(base, endpoint, params):\n    query_params = '&'.join(['{}={}'.format(k, v) for k, v in params.items()])\n    return '{}{}?{}'.format(base, endpoint, query_params)\n\n\nclass Endpoint(object):\n    # This flag indicates that the current endpoint is a price chart\n    is_price = False\n\n    # This flag indicates that the current endpoint is a technical indicator\n    is_indicator = False\n\n    # This flag indicates that the chart should be drawn on the price chart\n    is_overlay = False\n\n    # This flag indicates that the current request is a batch request\n    is_batch = False\n\n    # Colors for chart\n    colormap = {}\n\n    # The fill between lines\n    fill_area = {}\n\n    def render_matplotlib(self, **kwargs):\n        import matplotlib.dates as mdates\n        from .renders import RENDERS_MAPPING, RenderContext\n\n        df = kwargs.pop('df', None)\n        if df is None:\n            df = self.as_pandas()\n        df = df.iloc[::-1]\n        df.reset_index(level=0, inplace=True)\n        df.set_index(\"datetime\", inplace=True)\n\n        ctx = RenderContext()\n        ctx.colormap = self.colormap\n        ctx.fill_area = self.fill_area\n        ctx.interval_minutes = kwargs.pop(\"interval_minutes\", 1)\n        ctx.postfix = kwargs.pop(\"postfix\", \"\")\n\n        for render in RENDERS_MAPPING[self.__class__]:\n            render.render_matplotlib(ctx, df, **kwargs)\n\n    def render_plotly(self, **kwargs):\n        from .renders import RENDERS_MAPPING, RenderContext\n\n        ctx = RenderContext()\n        ctx.colormap = self.colormap\n        ctx.fill_area = self.fill_area\n        ctx.fig = kwargs.pop(\"fig\", None)\n        ctx.interval_minutes = kwargs.pop(\"interval_minutes\", 1)\n        ctx.postfix = kwargs.pop(\"postfix\", \"\")\n\n        df = kwargs.pop('df', None)\n        if df is None:\n            df = self.as_pandas()\n        return tuple(\n            itertools.chain(\n                *(\n                    render.render_plotly(ctx, df, **kwargs)\n                    for render in RENDERS_MAPPING[self.__class__]\n                )\n            )\n        )\n\n\nclass CustomEndpoint(AsMixin, Endpoint):\n    _name = \"custom_endpoint\"\n\n    def __init__(\n            self,\n            ctx,\n            name,\n            **kwargs\n    ):\n        self.ctx = ctx\n        self.name = name\n        self.params = kwargs\n\n    def execute(self, format=\"JSON\", debug=False):\n        self.params[\"format\"] = format\n        self.params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/\" + self.name\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, self.params)\n        return self.ctx.http_client.get(endpoint, params=self.params)\n\n\nclass TimeSeriesEndpoint(AsMixin, Endpoint):\n    _name = \"time_series\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        date=None,\n        mic_code=None,\n        previous_close=None,\n        adjust=None,\n    ):\n        self.is_price = True\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.date = date\n        self.mic_code = mic_code\n        self.previous_close = previous_close\n        self.adjust = adjust\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.date is not None:\n            params[\"date\"] = self.date\n        if self.previous_close is not None:\n            params[\"previous_close\"] = self.previous_close\n        if self.adjust is not None:\n            params[\"adjust\"] = self.adjust\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/time_series\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ExchangeRateEndpoint(AsMixin, Endpoint):\n    _name = \"exchange_rate\"\n\n    def __init__(self,\n                 ctx,\n                 symbol,\n                 date=None,\n                 dp=None,\n                 timezone=None\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.date = date\n        self.dp = dp\n        self.timezone = timezone\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.date is not None:\n            params[\"date\"] = self.date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/exchange_rate\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CurrencyConversionEndpoint(AsMixin, Endpoint):\n    _name = \"currency_conversion\"\n\n    def __init__(self,\n                 ctx,\n                 symbol,\n                 amount=None,\n                 date=None,\n                 dp=None,\n                 timezone=None\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.amount = amount\n        self.date = date\n        self.dp = dp\n        self.timezone = timezone\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.amount is not None:\n            params[\"amount\"] = self.amount\n        if self.date is not None:\n            params[\"date\"] = self.date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/currency_conversion\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass QuoteEndpoint(AsMixin, Endpoint):\n    _name = \"quote\"\n\n    def __init__(self,\n                 ctx,\n                 symbol,\n                 interval=\"1day\",\n                 exchange=None,\n                 country=None,\n                 volume_time_period=None,\n                 type=None,\n                 dp=5,\n                 timezone=\"Exchange\",\n                 prepost=\"false\",\n                 mic_code=None,\n                 eod=None,\n                 rolling_period=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.volume_time_period = volume_time_period\n        self.type = type\n        self.dp = dp\n        self.timezone = timezone\n        self.prepost = prepost\n        self.mic_code = mic_code\n        self.eod = eod\n        self.rolling_period = rolling_period\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n            # Batch mode is not supported for this endpoint\n            self.is_batch = False\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.volume_time_period is not None:\n            params[\"volume_time_period\"] = self.volume_time_period\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.eod is not None:\n            params[\"eod\"] = self.eod\n        if self.rolling_period is not None:\n            params[\"rolling_period\"] = self.rolling_period\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/quote\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass PriceEndpoint(AsMixin, Endpoint):\n    _name = \"price\"\n\n    def __init__(self,\n                 ctx,\n                 symbol,\n                 exchange=None,\n                 country=None,\n                 type=None,\n                 dp=5,\n                 prepost=\"false\",\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.dp = dp\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/price\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass EODEndpoint(AsMixin, Endpoint):\n    _name = \"eod\"\n\n    def __init__(self,\n                 ctx,\n                 symbol,\n                 exchange=None,\n                 country=None,\n                 type=None,\n                 dp=5,\n                 prepost=\"false\",\n                 mic_code=None,\n                 date=None,\n                 ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.dp = dp\n        self.prepost = prepost\n        self.mic_code = mic_code\n        self.date = date\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.date is not None:\n            params[\"date\"] = self.date\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/eod\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TechIndicatorsMetaEndpoint(AsMixin, Endpoint):\n    _name = \"technical_indicators\"\n\n    def __init__(self, ctx):\n        self.ctx = ctx\n\n    def execute(self, format=\"JSON\", debug=False):\n        params = {}\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/technical_indicators\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass StocksListEndpoint(AsMixin, Endpoint):\n    _name = \"stocks\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 type=None,\n                 mic_code=None,\n                 show_plan=None,\n                 include_delisted=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.mic_code = mic_code\n        self.show_plan = show_plan\n        self.include_delisted = include_delisted\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n        if self.include_delisted is not None:\n            params[\"include_delisted\"] = self.include_delisted\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/stocks\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass StockExchangesListEndpoint(AsMixin, Endpoint):\n    _name = \"stock_exchanges\"\n\n    def __init__(self, ctx):\n        self.ctx = ctx\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/stock_exchanges\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ForexPairsListEndpoint(AsMixin, Endpoint):\n    _name = \"forex_pairs\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 currency_base=None,\n                 currency_quote=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.currency_base = currency_base\n        self.currency_quote = currency_quote\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.currency_base is not None:\n            params[\"currency_base\"] = self.currency_base\n        if self.currency_quote is not None:\n            params[\"currency_quote\"] = self.currency_quote\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/forex_pairs\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CryptocurrenciesListEndpoint(AsMixin, Endpoint):\n    _name = \"cryptocurrencies\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 currency_base=None,\n                 currency_quote=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.currency_base = currency_base\n        self.currency_quote = currency_quote\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.currency_base is not None:\n            params[\"currency_base\"] = self.currency_base\n        if self.currency_quote is not None:\n            params[\"currency_quote\"] = self.currency_quote\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/cryptocurrencies\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ETFListEndpoint(AsMixin, Endpoint):\n    _name = \"etf\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n                 show_plan=None,\n                 include_delisted=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.show_plan = show_plan\n        self.include_delisted = include_delisted\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n        if self.include_delisted is not None:\n            params[\"include_delisted\"] = self.include_delisted\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/etf\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass IndicesListEndpoint(AsMixin, Endpoint):\n    _name = \"indices\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n                 show_plan=None,\n                 include_delisted=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.show_plan = show_plan\n        self.include_delisted = include_delisted\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n        if self.include_delisted is not None:\n            params[\"include_delisted\"] = self.include_delisted\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/indices\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass FundsListEndpoint(AsMixin, Endpoint):\n    _name = \"funds\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 type=None,\n                 show_plan=None,\n                 include_delisted=None,\n                 page=None,\n                 outputsize=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.show_plan = show_plan\n        self.include_delisted = include_delisted\n        self.page = page\n        self.outputsize = outputsize\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n        if self.include_delisted is not None:\n            params[\"include_delisted\"] = self.include_delisted\n        if self.page is not None:\n            params[\"page\"] = self.page\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/funds\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass BondsListEndpoint(AsMixin, Endpoint):\n    _name = \"bonds\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 type=None,\n                 show_plan=None,\n                 include_delisted=None,\n                 page=None,\n                 outputsize=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.show_plan = show_plan\n        self.include_delisted = include_delisted\n        self.page = page\n        self.outputsize = outputsize\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n        if self.include_delisted is not None:\n            params[\"include_delisted\"] = self.include_delisted\n        if self.page is not None:\n            params[\"page\"] = self.page\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/bonds\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\nclass CommoditiesListEndpoint(AsMixin, Endpoint):\n    _name = \"commodities\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 category=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.category = category\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.category is not None:\n            params[\"category\"] = self.category\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/commodities\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ExchangesListEndpoint(AsMixin, Endpoint):\n    _name = \"exchanges\"\n\n    def __init__(self,\n                 ctx,\n                 name=None,\n                 code=None,\n                 country=None,\n                 type=None,\n                 show_plan=None,\n    ):\n        self.ctx = ctx\n        self.name = name\n        self.code = code\n        self.country = country\n        self.type = type\n        self.show_plan = show_plan\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.name is not None:\n            params[\"name\"] = self.name\n        if self.code is not None:\n            params[\"code\"] = self.code\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/exchanges\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CryptocurrencyExchangesListEndpoint(AsMixin, Endpoint):\n    _name = \"cryptocurrency_exchanges\"\n\n    def __init__(self, ctx):\n        self.ctx = ctx\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/cryptocurrency_exchanges\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TechnicalIndicatorsListEndpoint(AsMixin, Endpoint):\n    _name = \"technical_indicators\"\n\n    def __init__(self, ctx):\n        self.ctx = ctx\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/technical_indicators\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SymbolSearchEndpoint(AsMixin, Endpoint):\n    _name = \"symbol_search\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 outputsize=None,\n                 show_plan=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.outputsize = outputsize\n        self.show_plan = show_plan\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.show_plan is not None:\n            params[\"show_plan\"] = self.show_plan\n\n        params[\"format\"] = \"JSON\"\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/symbol_search\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass EarliestTimestampEndpoint(AsMixin, Endpoint):\n    _name = \"earliest_timestamp\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 interval=None,\n                 exchange=None,\n                 mic_code=None,\n                 timezone=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.mic_code = mic_code\n        self.timezone = timezone\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/earliest_timestamp\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MarketStateEndpoint(AsMixin, Endpoint):\n    _name = \"market_state\"\n\n    def __init__(self,\n                 ctx,\n                 exchange=None,\n                 code=None,\n                 country=None,\n    ):\n        self.ctx = ctx\n        self.exchange = exchange\n        self.code = code\n        self.country = country\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.code is not None:\n            params[\"code\"] = self.code\n        if self.country is not None:\n            params[\"country\"] = self.country\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/market_state\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LogoEndpoint(AsMixin, Endpoint):\n    _name = \"logo\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"logo\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/logo\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ProfileEndpoint(AsMixin, Endpoint):\n    _name = \"profile\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"profile\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/profile\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass DividendsEndpoint(AsMixin, Endpoint):\n    _name = \"dividends\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 range=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.range = range\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"dividends\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.range is not None:\n            params[\"range\"] = self.range\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/dividends\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass DividendsCalendarEndpoint(AsMixin, Endpoint):\n    _name = \"dividends_calendar\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"dividends_calendar\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/dividends_calendar\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SplitsEndpoint(AsMixin, Endpoint):\n    _name = \"splits\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 range=None,\n                 start_date=None,\n                 end_date=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.range = range\n        self.start_date = start_date\n        self.end_date = end_date\n        self.method = \"splits\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.range is not None:\n            params[\"range\"] = self.range\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/splits\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SplitsCalendarEndpoint(AsMixin, Endpoint):\n    _name = \"splits_calendar\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"splits_calendar\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/splits_calendar\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass EarningsEndpoint(AsMixin, Endpoint):\n    _name = \"earnings\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 period=None,\n                 outputsize=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n                 dp=None,\n                 type=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.period = period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.dp = dp\n        self.type = type\n        self.method = \"earnings\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.period is not None:\n            params[\"period\"] = self.period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.type is not None:\n            params[\"type\"] = self.type\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/earnings\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass EarningsCalendarEndpoint(AsMixin, Endpoint):\n    _name = \"earnings_calendar\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 period=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.period = period\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"earnings_calendar\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.period is not None:\n            params[\"period\"] = self.period\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/earnings_calendar\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass IPOCalendarEndpoint(AsMixin, Endpoint):\n    _name = \"ipo_calendar\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 start_date=None,\n                 end_date=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.start_date = start_date\n        self.end_date = end_date\n        self.method = \"ipo_calendar\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ipo_calendar\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass StatisticsEndpoint(AsMixin, Endpoint):\n    _name = \"statistics\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"statistics\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/statistics\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass InsiderTransactionsEndpoint(AsMixin, Endpoint):\n    _name = \"insider_transactions\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"insider_transactions\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/insider_transactions\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass IncomeStatementEndpoint(AsMixin, Endpoint):\n    _name = \"income_statement\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 period=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.period = period\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"income_statement\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.period is not None:\n            params[\"period\"] = self.period\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/income_statement\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass BalanceSheetEndpoint(AsMixin, Endpoint):\n    _name = \"balance_sheet\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 period=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.period = period\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"balance_sheet\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.period is not None:\n            params[\"period\"] = self.period\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/balance_sheet\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CashFlowEndpoint(AsMixin, Endpoint):\n    _name = \"cash_flow\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 period=None,\n                 start_date=None,\n                 end_date=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.period = period\n        self.start_date = start_date\n        self.end_date = end_date\n        self.mic_code = mic_code\n        self.method = \"cash_flow\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.period is not None:\n            params[\"period\"] = self.period\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/cash_flow\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass OptionsExpirationEndpoint(AsMixin, Endpoint):\n    _name = \"options_expiration\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"options_expiration\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/options/expiration\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass OptionsChainEndpoint(AsMixin, Endpoint):\n    _name = \"options_chain\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 expiration_date=None,\n                 option_id=None,\n                 side=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.expiration_date = expiration_date\n        self.option_id = option_id\n        self.side = side\n        self.mic_code = mic_code\n        self.method = \"options_chain\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.expiration_date is not None:\n            params[\"expiration_date\"] = self.expiration_date\n        if self.option_id is not None:\n            params[\"option_id\"] = self.option_id\n        if self.side is not None:\n            params[\"side\"] = self.side\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/options/chain\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass KeyExecutivesEndpoint(AsMixin, Endpoint):\n    _name = \"key_executives\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"key_executives\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/key_executives\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass InstitutionalHoldersEndpoint(AsMixin, Endpoint):\n    _name = \"institutional_holders\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"institutional_holders\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/institutional_holders\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass FundHoldersEndpoint(AsMixin, Endpoint):\n    _name = \"fund_holders\"\n\n    def __init__(self,\n                 ctx,\n                 symbol=None,\n                 exchange=None,\n                 country=None,\n                 mic_code=None,\n    ):\n        self.ctx = ctx\n        self.symbol = symbol\n        self.exchange = exchange\n        self.country = country\n        self.mic_code = mic_code\n        self.method = \"fund_holders\"\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"] = self.symbol\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/fund_holders\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass APIUsageEndpoint(AsMixin, Endpoint):\n    _name = \"api_usage\"\n\n    def __init__(self, ctx):\n        self.ctx = ctx\n\n    def execute(self, format=\"JSON\", debug=False):\n        params = {}\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/api_usage\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ADEndpoint(AsMixin, Endpoint):\n    _name = \"ad\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ad\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ad\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ADOSCEndpoint(AsMixin, Endpoint):\n    _name = \"adosc\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        fast_period=12,\n        slow_period=26,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"adosc\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.fast_period = fast_period\n        self.slow_period = slow_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.fast_period is not None:\n            params[\"fast_period\"] = self.fast_period\n        if self.slow_period is not None:\n            params[\"slow_period\"] = self.slow_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/adosc\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ADXEndpoint(AsMixin, Endpoint):\n    _name = \"adx\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"adx\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/adx\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ADXREndpoint(AsMixin, Endpoint):\n    _name = \"adxr\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"adxr\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/adxr\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass APOEndpoint(AsMixin, Endpoint):\n    _name = \"apo\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=9,\n        fast_period=12,\n        slow_period=26,\n        ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"apo\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.fast_period = fast_period\n        self.slow_period = slow_period\n        self.ma_type = ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.fast_period is not None:\n            params[\"fast_period\"] = self.fast_period\n        if self.slow_period is not None:\n            params[\"slow_period\"] = self.slow_period\n        if self.ma_type is not None:\n            params[\"ma_type\"] = self.ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/apo\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass AROONEndpoint(AsMixin, Endpoint):\n    _name = \"aroon\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"aroon\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/aroon\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass AROONOSCEndpoint(AsMixin, Endpoint):\n    _name = \"aroonosc\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"aroonosc\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/aroonosc\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ATREndpoint(AsMixin, Endpoint):\n    _name = \"atr\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"atr\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/atr\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass AVGPRICEEndpoint(AsMixin, Endpoint):\n    _name = \"avgprice\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"avgprice\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/avgprice\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass BBANDSEndpoint(AsMixin, Endpoint):\n    _name = \"bbands\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=20,\n        sd=\"2\",\n        ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"bbands\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.sd = sd\n        self.ma_type = ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.sd is not None:\n            params[\"sd\"] = self.sd\n        if self.ma_type is not None:\n            params[\"ma_type\"] = self.ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/bbands\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass BETAEndpoint(AsMixin, Endpoint):\n    _name = \"beta\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type_1=\"open\",\n        series_type_2=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"beta\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type_1 = series_type_1\n        self.series_type_2 = series_type_2\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type_1 is not None:\n            params[\"series_type_1\"] = self.series_type_1\n        if self.series_type_2 is not None:\n            params[\"series_type_2\"] = self.series_type_2\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/beta\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass PercentBEndpoint(AsMixin, Endpoint):\n    _name = \"percent_b\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=20,\n        sd=\"2\",\n        ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"percent_b\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.sd = sd\n        self.ma_type = ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.sd is not None:\n            params[\"sd\"] = self.sd\n        if self.ma_type is not None:\n            params[\"ma_type\"] = self.ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/percent_b\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass PivotPointsHLEndpoint(AsMixin, Endpoint):\n    _name = \"pivot_points_hl\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=10,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"pivot_points_hl\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/pivot_points_hl\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass BOPEndpoint(AsMixin, Endpoint):\n    _name = \"bop\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"bop\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/bop\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CCIEndpoint(AsMixin, Endpoint):\n    _name = \"cci\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=20,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"cci\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/cci\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CEILEndpoint(AsMixin, Endpoint):\n    _name = \"ceil\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ceil\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ceil\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CMOEndpoint(AsMixin, Endpoint):\n    _name = \"cmo\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"cmo\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/cmo\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass COPPOCKEndpoint(AsMixin, Endpoint):\n    _name = \"coppock\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        long_roc_period=14,\n        short_roc_period=11,\n        wma_period=0,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"cmo\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.long_roc_period = long_roc_period\n        self.short_roc_period = short_roc_period\n        self.wma_period = wma_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.long_roc_period is not None:\n            params[\"long_roc_period\"] = self.long_roc_period\n        if self.short_roc_period is not None:\n            params[\"short_roc_period\"] = self.short_roc_period\n        if self.wma_period is not None:\n            params[\"wma_period\"] = self.wma_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/coppock\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass CEILEndpoint(AsMixin, Endpoint):\n    _name = \"ceil\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ceil\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ceil\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass DEMAEndpoint(AsMixin, Endpoint):\n    _name = \"dema\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"dema\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/dema\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass DXEndpoint(AsMixin, Endpoint):\n    _name = \"dx\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"dx\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/dx\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass EMAEndpoint(AsMixin, Endpoint):\n    _name = \"ema\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ema\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ema\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass EXPEndpoint(AsMixin, Endpoint):\n    _name = \"exp\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"exp\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/exp\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass FLOOREndpoint(AsMixin, Endpoint):\n    _name = \"floor\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"floor\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/floor\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HEIKINASHICANDLESEndpoint(AsMixin, Endpoint):\n    _name = \"heikinashicandles\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_price = True\n        self.meta_name = \"heikinashicandles\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/heikinashicandles\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HLC3Endpoint(AsMixin, Endpoint):\n    _name = \"hlc3\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_price = True\n        self.meta_name = \"hlc3\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/hlc3\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HT_DCPERIODEndpoint(AsMixin, Endpoint):\n    _name = \"ht_dcperiod\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ht_dcperiod\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ht_dcperiod\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HT_DCPHASEEndpoint(AsMixin, Endpoint):\n    _name = \"ht_dcphase\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ht_dcphase\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ht_dcphase\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HT_PHASOREndpoint(AsMixin, Endpoint):\n    _name = \"ht_phasor\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ht_phasor\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ht_phasor\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HT_SINEEndpoint(AsMixin, Endpoint):\n    _name = \"ht_sine\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ht_sine\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ht_sine\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HT_TRENDLINEEndpoint(AsMixin, Endpoint):\n    _name = \"ht_trendline\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ht_trendline\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ht_trendline\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass HT_TRENDMODEEndpoint(AsMixin, Endpoint):\n    _name = \"ht_trendmode\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ht_trendmode\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ht_trendmode\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ICHIMOKUEndpoint(AsMixin, Endpoint):\n    _name = \"ichimoku\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        conversion_line_period=9,\n        base_line_period=26,\n        leading_span_b_period=52,\n        lagging_span_period=26,\n        include_ahead_span_period=True,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"vwap\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.conversion_line_period = conversion_line_period\n        self.base_line_period = base_line_period\n        self.leading_span_b_period = leading_span_b_period\n        self.lagging_span_period = lagging_span_period\n        self.include_ahead_span_period = include_ahead_span_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.conversion_line_period is not None:\n            params[\"conversion_line_period\"] = self.conversion_line_period\n        if self.base_line_period is not None:\n            params[\"base_line_period\"] = self.base_line_period\n        if self.leading_span_b_period is not None:\n            params[\"leading_span_b_period\"] = self.leading_span_b_period\n        if self.lagging_span_period is not None:\n            params[\"lagging_span_period\"] = self.lagging_span_period\n        if self.include_ahead_span_period is not None:\n            params[\"include_ahead_span_period\"] = self.include_ahead_span_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ichimoku\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass KAMAEndpoint(AsMixin, Endpoint):\n    _name = \"kama\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"kama\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/kama\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass KELTNEREndpoint(AsMixin, Endpoint):\n    _name = \"keltner\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=20,\n        atr_time_period=10,\n        multiplier=2,\n        ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"keltner\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.atr_time_period = atr_time_period\n        self.multiplier = multiplier\n        self.ma_type = ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.atr_time_period is not None:\n            params[\"atr_time_period\"] = self.atr_time_period\n        if self.multiplier is not None:\n            params[\"multiplier\"] = self.multiplier\n        if self.ma_type is not None:\n            params[\"ma_type\"] = self.ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/keltner\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass KSTEndpoint(AsMixin, Endpoint):\n    _name = \"kst\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        roc_period_1=10,\n        roc_period_2=15,\n        roc_period_3=20,\n        roc_period_4=30,\n        signal_period=9,\n        sma_period_1=10,\n        sma_period_2=10,\n        sma_period_3=10,\n        sma_period_4=15,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"kst\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.roc_period_1 = roc_period_1\n        self.roc_period_2 = roc_period_2\n        self.roc_period_3 = roc_period_3\n        self.roc_period_4 = roc_period_4\n        self.signal_period = signal_period\n        self.sma_period_1 = sma_period_1\n        self.sma_period_2 = sma_period_2\n        self.sma_period_3 = sma_period_3\n        self.sma_period_4 = sma_period_4\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.roc_period_1 is not None:\n            params[\"roc_period_1\"] = self.roc_period_1\n        if self.roc_period_2 is not None:\n            params[\"roc_period_2\"] = self.roc_period_2\n        if self.roc_period_3 is not None:\n            params[\"roc_period_3\"] = self.roc_period_3\n        if self.roc_period_4 is not None:\n            params[\"roc_period_4\"] = self.roc_period_4\n        if self.signal_period is not None:\n            params[\"signal_period\"] = self.signal_period\n        if self.sma_period_1 is not None:\n            params[\"sma_period_1\"] = self.sma_period_1\n        if self.sma_period_2 is not None:\n            params[\"sma_period_2\"] = self.sma_period_2\n        if self.sma_period_3 is not None:\n            params[\"sma_period_3\"] = self.sma_period_3\n        if self.sma_period_4 is not None:\n            params[\"sma_period_4\"] = self.sma_period_4\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/kst\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LINEARREGEndpoint(AsMixin, Endpoint):\n    _name = \"linearreg\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"linearreg\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/linearreg\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LINEARREGANGLEEndpoint(AsMixin, Endpoint):\n    _name = \"linearregangle\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"linearregangle\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/linearregangle\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LINEARREGINTERCEPTEndpoint(AsMixin, Endpoint):\n    _name = \"linearregintercept\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"linearregintercept\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/linearregintercept\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LINEARREGSLOPEEndpoint(AsMixin, Endpoint):\n    _name = \"linearregslope\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"linearregslope\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/linearregslope\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LNEndpoint(AsMixin, Endpoint):\n    _name = \"ln\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ln\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ln\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass LOG10Endpoint(AsMixin, Endpoint):\n    _name = \"log10\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"log10\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/log10\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MAEndpoint(AsMixin, Endpoint):\n    _name = \"ma\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ma\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.ma_type = ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.ma_type is not None:\n            params[\"ma_type\"] = self.ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ma\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MACDEndpoint(AsMixin, Endpoint):\n    _name = \"macd\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        fast_period=12,\n        slow_period=26,\n        signal_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"macd\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.fast_period = fast_period\n        self.slow_period = slow_period\n        self.signal_period = signal_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.fast_period is not None:\n            params[\"fast_period\"] = self.fast_period\n        if self.slow_period is not None:\n            params[\"slow_period\"] = self.slow_period\n        if self.signal_period is not None:\n            params[\"signal_period\"] = self.signal_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/macd\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MACDSlopeEndpoint(AsMixin, Endpoint):\n    _name = \"macd_slope\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        fast_period=12,\n        slow_period=26,\n        signal_period=9,\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"macd_slope\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.fast_period = fast_period\n        self.slow_period = slow_period\n        self.signal_period = signal_period\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.fast_period is not None:\n            params[\"fast_period\"] = self.fast_period\n        if self.slow_period is not None:\n            params[\"slow_period\"] = self.slow_period\n        if self.signal_period is not None:\n            params[\"signal_period\"] = self.signal_period\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/macd_slope\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MACDEXTEndpoint(AsMixin, Endpoint):\n    _name = \"macdext\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        fast_period=12,\n        fast_ma_type=\"SMA\",\n        slow_period=26,\n        slow_ma_type=\"SMA\",\n        signal_period=9,\n        signal_ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"macdext\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.fast_period = fast_period\n        self.fast_ma_type = fast_ma_type\n        self.slow_period = slow_period\n        self.slow_ma_type = slow_ma_type\n        self.signal_period = signal_period\n        self.signal_ma_type = signal_ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.fast_period is not None:\n            params[\"fast_period\"] = self.fast_period\n        if self.fast_ma_type is not None:\n            params[\"fast_ma_type\"] = self.fast_ma_type\n        if self.slow_period is not None:\n            params[\"slow_period\"] = self.slow_period\n        if self.slow_ma_type is not None:\n            params[\"slow_ma_type\"] = self.slow_ma_type\n        if self.signal_period is not None:\n            params[\"signal_period\"] = self.signal_period\n        if self.signal_ma_type is not None:\n            params[\"signal_ma_type\"] = self.signal_ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/macdext\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MAMAEndpoint(AsMixin, Endpoint):\n    _name = \"mama\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        fast_limit=\"0.5\",\n        slow_limit=\"0.05\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"mama\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.fast_limit = fast_limit\n        self.slow_limit = slow_limit\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.fast_limit is not None:\n            params[\"fast_limit\"] = self.fast_limit\n        if self.slow_limit is not None:\n            params[\"slow_limit\"] = self.slow_limit\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/mama\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MAXEndpoint(AsMixin, Endpoint):\n    _name = \"max\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"max\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/max\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MAXINDEXEndpoint(AsMixin, Endpoint):\n    _name = \"maxindex\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"maxindex\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/maxindex\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass McGinleyDynamicEndpoint(AsMixin, Endpoint):\n    _name = \"mcginley_dynamic\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"mcginley_dynamic\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/mcginley_dynamic\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MEDPRICEEndpoint(AsMixin, Endpoint):\n    _name = \"medprice\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"medprice\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/medprice\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MFIEndpoint(AsMixin, Endpoint):\n    _name = \"mfi\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"mfi\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/mfi\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MIDPOINTEndpoint(AsMixin, Endpoint):\n    _name = \"midpoint\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"midpoint\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/midpoint\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MIDPRICEEndpoint(AsMixin, Endpoint):\n    _name = \"midprice\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"midprice\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/midprice\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MINEndpoint(AsMixin, Endpoint):\n    _name = \"min\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"min\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/min\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MININDEXEndpoint(AsMixin, Endpoint):\n    _name = \"minindex\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"minindex\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/minindex\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MINMAXEndpoint(AsMixin, Endpoint):\n    _name = \"minmax\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"minmax\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/minmax\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MINMAXINDEXEndpoint(AsMixin, Endpoint):\n    _name = \"minmaxindex\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"minmaxindex\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/minmaxindex\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MINUS_DIEndpoint(AsMixin, Endpoint):\n    _name = \"minus_di\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"minus_di\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/minus_di\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MINUS_DMEndpoint(AsMixin, Endpoint):\n    _name = \"minus_dm\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"minus_dm\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/minus_dm\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass MOMEndpoint(AsMixin, Endpoint):\n    _name = \"mom\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"mom\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/mom\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass NATREndpoint(AsMixin, Endpoint):\n    _name = \"natr\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"natr\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/natr\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass OBVEndpoint(AsMixin, Endpoint):\n    _name = \"obv\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"obv\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/obv\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass PLUS_DIEndpoint(AsMixin, Endpoint):\n    _name = \"plus_di\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"plus_di\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/plus_di\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass PLUS_DMEndpoint(AsMixin, Endpoint):\n    _name = \"plus_dm\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"plus_dm\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/plus_dm\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass PPOEndpoint(AsMixin, Endpoint):\n    _name = \"ppo\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        fast_period=10,\n        slow_period=21,\n        ma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ppo\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.fast_period = fast_period\n        self.slow_period = slow_period\n        self.ma_type = ma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.fast_period is not None:\n            params[\"fast_period\"] = self.fast_period\n        if self.slow_period is not None:\n            params[\"slow_period\"] = self.slow_period\n        if self.ma_type is not None:\n            params[\"ma_type\"] = self.ma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ppo\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ROCEndpoint(AsMixin, Endpoint):\n    _name = \"roc\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"roc\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/roc\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ROCPEndpoint(AsMixin, Endpoint):\n    _name = \"rocp\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"rocp\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/rocp\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ROCREndpoint(AsMixin, Endpoint):\n    _name = \"rocr\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"rocr\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/rocr\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ROCR100Endpoint(AsMixin, Endpoint):\n    _name = \"rocr100\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"rocr100\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/rocr100\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass RSIEndpoint(AsMixin, Endpoint):\n    _name = \"rsi\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"rsi\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/rsi\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass RVOLEndpoint(AsMixin, Endpoint):\n    _name = \"rvol\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"rvol\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/rvol\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SAREndpoint(AsMixin, Endpoint):\n    _name = \"sar\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        acceleration=\"0.02\",\n        maximum=\"0.2\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"sar\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.acceleration = acceleration\n        self.maximum = maximum\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.acceleration is not None:\n            params[\"acceleration\"] = self.acceleration\n        if self.maximum is not None:\n            params[\"maximum\"] = self.maximum\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/sar\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SMAEndpoint(AsMixin, Endpoint):\n    _name = \"sma\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"sma\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/sma\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SQRTEndpoint(AsMixin, Endpoint):\n    _name = \"sqrt\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"sqrt\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/sqrt\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass STDDEVEndpoint(AsMixin, Endpoint):\n    _name = \"stddev\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        sd=\"2\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"stddev\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.sd = sd\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.sd is not None:\n            params[\"sd\"] = self.sd\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/stddev\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass STOCHEndpoint(AsMixin, Endpoint):\n    _name = \"stoch\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        fast_k_period=14,\n        slow_k_period=1,\n        slow_d_period=3,\n        slow_kma_type=\"SMA\",\n        slow_dma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"stoch\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.fast_k_period = fast_k_period\n        self.slow_k_period = slow_k_period\n        self.slow_d_period = slow_d_period\n        self.slow_kma_type = slow_kma_type\n        self.slow_dma_type = slow_dma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.fast_k_period is not None:\n            params[\"fast_k_period\"] = self.fast_k_period\n        if self.slow_k_period is not None:\n            params[\"slow_k_period\"] = self.slow_k_period\n        if self.slow_d_period is not None:\n            params[\"slow_d_period\"] = self.slow_d_period\n        if self.slow_kma_type is not None:\n            params[\"slow_kma_type\"] = self.slow_kma_type\n        if self.slow_dma_type is not None:\n            params[\"slow_dma_type\"] = self.slow_dma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/stoch\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass STOCHFEndpoint(AsMixin, Endpoint):\n    _name = \"stochf\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        fast_k_period=14,\n        fast_d_period=3,\n        fast_dma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"stochf\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.fast_k_period = fast_k_period\n        self.fast_d_period = fast_d_period\n        self.fast_dma_type = fast_dma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.fast_k_period is not None:\n            params[\"fast_k_period\"] = self.fast_k_period\n        if self.fast_d_period is not None:\n            params[\"fast_d_period\"] = self.fast_d_period\n        if self.fast_dma_type is not None:\n            params[\"fast_dma_type\"] = self.fast_dma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/stochf\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass STOCHRSIEndpoint(AsMixin, Endpoint):\n    _name = \"stochrsi\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=14,\n        fast_k_period=3,\n        fast_d_period=3,\n        fast_dma_type=\"SMA\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"stochrsi\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.fast_k_period = fast_k_period\n        self.fast_d_period = fast_d_period\n        self.fast_dma_type = fast_dma_type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.fast_k_period is not None:\n            params[\"fast_k_period\"] = self.fast_k_period\n        if self.fast_d_period is not None:\n            params[\"fast_d_period\"] = self.fast_d_period\n        if self.fast_dma_type is not None:\n            params[\"fast_dma_type\"] = self.fast_dma_type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/stochrsi\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass SuperTrendEndpoint(AsMixin, Endpoint):\n    _name = \"supertrend\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        multiplier=3,\n        period=10,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"supertrend\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.multiplier = multiplier\n        self.period = period\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.multiplier is not None:\n            params[\"multiplier\"] = self.multiplier\n        if self.period is not None:\n            params[\"period\"] = self.period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/supertrend\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass T3MAEndpoint(AsMixin, Endpoint):\n    _name = \"t3ma\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        v_factor=\"0.7\",\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"t3ma\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.v_factor = v_factor\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.v_factor is not None:\n            params[\"v_factor\"] = self.v_factor\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/t3ma\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TEMAEndpoint(AsMixin, Endpoint):\n    _name = \"tema\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"tema\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/tema\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TRANGEEndpoint(AsMixin, Endpoint):\n    _name = \"trange\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"trange\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/trange\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TRIMAEndpoint(AsMixin, Endpoint):\n    _name = \"trima\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"trima\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/trima\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TSFEndpoint(AsMixin, Endpoint):\n    _name = \"tsf\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"tsf\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/tsf\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass TYPPRICEEndpoint(AsMixin, Endpoint):\n    _name = \"typprice\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"typprice\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/typprice\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass ULTOSCEndpoint(AsMixin, Endpoint):\n    _name = \"ultosc\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period_1=7,\n        time_period_2=14,\n        time_period_3=28,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"ultosc\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period_1 = time_period_1\n        self.time_period_2 = time_period_2\n        self.time_period_3 = time_period_3\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period_1 is not None:\n            params[\"time_period_1\"] = self.time_period_1\n        if self.time_period_2 is not None:\n            params[\"time_period_2\"] = self.time_period_2\n        if self.time_period_3 is not None:\n            params[\"time_period_3\"] = self.time_period_3\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/ultosc\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass VAREndpoint(AsMixin, Endpoint):\n    _name = \"var\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"var\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/var\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass VWAPEndpoint(AsMixin, Endpoint):\n    _name = \"vwap\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"vwap\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/vwap\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass WCLPRICEEndpoint(AsMixin, Endpoint):\n    _name = \"wclprice\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"wclprice\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/wclprice\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass WILLREndpoint(AsMixin, Endpoint):\n    _name = \"willr\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        time_period=14,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"willr\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/willr\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n\n\nclass WMAEndpoint(AsMixin, Endpoint):\n    _name = \"wma\"\n\n    def __init__(\n        self,\n        ctx,\n        symbol,\n        interval,\n        exchange=None,\n        country=None,\n        type=None,\n        series_type=\"close\",\n        time_period=9,\n        outputsize=30,\n        start_date=None,\n        end_date=None,\n        dp=5,\n        timezone=\"Exchange\",\n        order=\"desc\",\n        prepost=\"false\",\n        mic_code=None,\n    ):\n        self.is_indicator = True\n        self.meta_name = \"wma\"\n        self.ctx = ctx\n        self.symbol = symbol\n        self.interval = interval\n        self.exchange = exchange\n        self.country = country\n        self.type = type\n        self.series_type = series_type\n        self.time_period = time_period\n        self.outputsize = outputsize\n        self.start_date = start_date\n        self.end_date = end_date\n        self.dp = dp\n        self.timezone = timezone\n        self.order = order\n        self.prepost = prepost\n        self.mic_code = mic_code\n\n    def execute(self, format=\"JSON\", debug=False):\n\n        params = {}\n        if self.symbol is not None:\n            params[\"symbol\"], self.is_batch = get_symbol(self.symbol)\n        if self.interval is not None:\n            params[\"interval\"] = self.interval\n        if self.exchange is not None:\n            params[\"exchange\"] = self.exchange\n        if self.country is not None:\n            params[\"country\"] = self.country\n        if self.type is not None:\n            params[\"type\"] = self.type\n        if self.series_type is not None:\n            params[\"series_type\"] = self.series_type\n        if self.time_period is not None:\n            params[\"time_period\"] = self.time_period\n        if self.outputsize is not None:\n            params[\"outputsize\"] = self.outputsize\n        if self.start_date is not None:\n            params[\"start_date\"] = self.start_date\n        if self.end_date is not None:\n            params[\"end_date\"] = self.end_date\n        if self.dp is not None:\n            params[\"dp\"] = self.dp\n        if self.timezone is not None:\n            params[\"timezone\"] = self.timezone\n        if self.order is not None:\n            params[\"order\"] = self.order\n        if self.prepost is not None:\n            params[\"prepost\"] = self.prepost\n        if self.mic_code is not None:\n            params[\"mic_code\"] = self.mic_code\n\n        params[\"format\"] = format\n        params[\"apikey\"] = self.ctx.apikey\n        endpoint = \"/wma\"\n\n        if debug:\n            return build_url(self.ctx.base_url, endpoint, params)\n        return self.ctx.http_client.get(endpoint, params=params)\n"
  },
  {
    "path": "src/twelvedata/exceptions.py",
    "content": "# coding: utf-8\n\n__all__ = (\n    \"TwelveDataError\",\n    \"BadRequestError\",\n    \"InternalServerError\",\n    \"InvalidApiKeyError\",\n)\n\n\nclass TwelveDataError(RuntimeError):\n    pass\n\n\nclass BadRequestError(TwelveDataError):\n    pass\n\n\nclass InternalServerError(TwelveDataError):\n    pass\n\n\nclass InvalidApiKeyError(TwelveDataError):\n    pass\n"
  },
  {
    "path": "src/twelvedata/http_client.py",
    "content": "# coding: utf-8\n\nfrom requests import Session\nfrom json import JSONDecodeError\n\nfrom .exceptions import (\n    BadRequestError,\n    InternalServerError,\n    InvalidApiKeyError,\n    TwelveDataError,\n)\n\n__all__ = (\"DefaultHttpClient\",)\n\n\nclass DefaultHttpClient(object):\n    def __init__(self, base_url):\n        self.base_url = base_url\n        self.session = Session()\n\n    def get(self, relative_url, *args, **kwargs):\n\n        # For the sake of monitoring, we add a \"source\" parameter\n        params = kwargs.get(\"params\", {})\n        params[\"source\"] = \"python\"\n        kwargs[\"params\"] = params\n\n        resp = self.session.get(\"{}{}\".format(self.base_url, relative_url), timeout=30, *args, **kwargs)\n        if ('Is_batch' in resp.headers and resp.headers['Is_batch'] == 'true') or \\\n                ('Content-Type' in resp.headers and resp.headers['Content-Type'] == 'text/csv'):\n            return resp\n\n        if not resp.ok:\n            self._raise_error(resp.status_code, resp.text)\n\n        json_resp = resp.json()\n        if 'status' not in json_resp:\n            return resp\n\n        status = json_resp['status']\n        if status == 'error':\n            error_code = json_resp['code']\n        else:\n            return resp\n\n        try:\n            message = json_resp[\"message\"]\n        except ValueError:\n            message = resp.text\n\n        self._raise_error(error_code, message)\n\n    @staticmethod\n    def _raise_error(error_code, message):\n        if error_code == 401:\n            raise InvalidApiKeyError(message)\n\n        if error_code == 400:\n            raise BadRequestError(message)\n\n        if error_code >= 500:\n            raise InternalServerError(message)\n\n        raise TwelveDataError(message)\n"
  },
  {
    "path": "src/twelvedata/mixins.py",
    "content": "# coding: utf-8\n\nimport csv\nfrom .utils import convert_collection_to_pandas, convert_collection_to_pandas_multi_index, convert_pandas_to_plotly\n\n\n__all__ = (\"AsJsonMixin\", \"AsCsvMixin\", \"AsPandasMixin\", \"AsUrlMixin\", \"AsMixin\")\n\n\nclass AsJsonMixin(object):\n    def as_json(self):\n        resp = self.execute(format=\"JSON\")\n        json = resp.json()\n        if hasattr(self, 'is_batch') and self.is_batch:\n            return json\n        if isinstance(json, dict) and json.get(\"status\") == \"ok\":\n            if 'result' in json and isinstance(json['result'], dict) and 'list' in json['result'] \\\n                    and isinstance(json['result']['list'], list):\n                return json['result']['list']\n            return json.get(\"data\") or json.get(\"values\") or json.get(\"earnings\") or []\n        return json\n\n    def as_raw_json(self):\n        resp = self.execute(format=\"JSON\")\n        return resp.text\n\n\nclass AsCsvMixin(object):\n    def as_csv(self, **kwargs):\n        resp = self.execute(format=\"CSV\")\n        lines = resp.text.strip().split(\"\\n\")\n        delimiter = \",\" if \",\" in lines[0] else \";\"\n        kwargs[\"delimiter\"] = kwargs.get(\"delimiter\", delimiter)\n        return tuple(map(tuple, csv.reader(lines, **kwargs)))\n\n    def as_raw_csv(self):\n        resp = self.execute(format=\"CSV\")\n        return resp.text\n\n\nclass AsPandasMixin(object):\n    def as_pandas(self, **kwargs):\n        import pandas as pd\n\n        assert hasattr(self, \"as_json\")\n\n        data = self.as_json()\n        if hasattr(self, \"is_batch\") and self.is_batch:\n            df = convert_collection_to_pandas_multi_index(data)\n        elif hasattr(self, \"method\") and self.method == \"earnings\":\n            df = self.create_basic_df(data, pd, index_column=\"date\", **kwargs)\n        elif hasattr(self, \"method\") and self.method == \"earnings_calendar\":\n            modified_data = []\n            for date, row in data.items():\n                for earning in row:\n                    earning[\"date\"] = date\n                    modified_data.append(earning)\n\n            df = self.create_basic_df(modified_data, pd, index_column=\"date\", **kwargs)\n        else:\n            df = self.create_basic_df(data, pd, **kwargs)\n\n        return df\n\n    @staticmethod\n    def create_basic_df(data, pd, index_column=\"datetime\", **kwargs):\n        df = convert_collection_to_pandas(data, **kwargs)\n        df = df.set_index(index_column)\n        df.index = pd.to_datetime(df.index)\n\n        for col in df.columns:\n            try:\n                df[col] = pd.to_numeric(df[col])\n            except (ValueError, TypeError):\n                df[col] = df[col]\n        return df\n\n\nclass AsUrlMixin(object):\n    def as_url(self, **kwargs):\n        return self.execute(debug=True)\n\n\nclass AsMixin(AsJsonMixin, AsCsvMixin, AsPandasMixin, AsUrlMixin, object):\n    pass\n"
  },
  {
    "path": "src/twelvedata/renders.py",
    "content": "# coding: utf-8\n\nfrom .endpoints import *\n\nVOL_CHART_HEIGHT = 0.15\nCANDLE_WIDTH = 0.0002\nBAR_WIDTH = 0.0002\nCOLOR_UP = \"#26a69a\"\nCOLOR_DOWN = \"#ef5350\"\n\n\nclass RenderContext(object):\n    fig = None\n    interval_minutes = 1\n    fill_area = None\n    colormap = {}\n    postfix = \"\"\n\n\nclass ChartRender(object):\n    def render(self, backend, df, **kwargs):\n        getattr(self, \"render_{}\".format(backend))(df, **kwargs)\n\n    def _slice(self, df):\n        if getattr(self, \"cols\", None):\n            df = df.loc[:, self.cols]\n        return df\n\n    def _label(self, ctx, col):\n        return \"{}{}\".format(col, ctx.postfix)\n\n\nclass CandlestickRender(ChartRender):\n    def __init__(self, opens, highs, lows, closes, volume=None):\n        self.volume = volume\n        self.ohlc = (opens, highs, lows, closes)\n\n    def render_plotly(self, ctx, df, **kwargs):\n        import plotly.graph_objects as go\n\n        fig = ctx.fig\n        (opens, highs, lows, closes) = self.ohlc\n\n        data = [\n            go.Candlestick(\n                x=df.index,\n                open=df[opens],\n                high=df[highs],\n                low=df[lows],\n                close=df[closes],\n                increasing=go.candlestick.Increasing(\n                    line=go.candlestick.increasing.Line(color=COLOR_UP)\n                ),\n                decreasing=go.candlestick.Decreasing(\n                    line=go.candlestick.decreasing.Line(color=COLOR_DOWN)\n                ),\n                name=\"Price\",\n            )\n        ]\n\n        if self.volume and self.volume in df:\n            volume_colors = [\n                COLOR_UP if i != 0 and df[closes][i] > df[opens][i] else COLOR_DOWN\n                for i in range(len(df[closes]))\n            ]\n\n            # Visually separate the price chart from the volume chart\n            ymin = min(\n                df[opens].min(), df[highs].min(), df[lows].min(), df[closes].min()\n            )\n            ymax = max(\n                df[opens].max(), df[highs].max(), df[lows].max(), df[closes].max()\n            )\n            fig.layout[\"yaxis\"].range = [ymin - (ymax - ymin) * VOL_CHART_HEIGHT, ymax]\n\n            data.append(\n                go.Bar(\n                    x=df.index,\n                    y=df[self.volume],\n                    marker=go.bar.Marker(color=volume_colors),\n                    name=\"Volume\",\n                    yaxis=\"y666\",\n                )\n            )\n\n            y_scaler = 1.0 / VOL_CHART_HEIGHT\n\n            fig.layout[\"yaxis666\"] = go.layout.YAxis(\n                range=[0, df[self.volume].max() * y_scaler],\n                overlaying=\"y1\",\n                anchor=\"x1\",\n                showgrid=False,\n                showticklabels=False,\n            )\n\n        return data\n\n    def render_matplotlib(self, ctx, df, ax, **kwargs):\n        import mplfinance as mpf\n        import pandas as pd\n\n        df.index = pd.to_datetime(df.index)\n        if self.volume and self.volume in df:\n            mc = mpf.make_marketcolors(up=COLOR_UP, down=COLOR_DOWN,\n                                       edge='inherit',\n                                       wick='black',\n                                       ohlc='i',\n                                       volume='in')\n            s = mpf.make_mpf_style(marketcolors=mc)\n            mpf.plot(df, type='candle', volume=True, style=s)\n        else:\n            mc = mpf.make_marketcolors(up=COLOR_UP, down=COLOR_DOWN,\n                                       edge='inherit',\n                                       wick='black',\n                                       ohlc='i')\n            s = mpf.make_mpf_style(marketcolors=mc)\n            mpf.plot(df, type='candle', volume=False, style=s)\n\n\nclass LineRender(ChartRender):\n    def __init__(self, *cols):\n        self.cols = cols\n\n    def render_plotly(self, ctx, df, **kwargs):\n        import plotly.graph_objects as go\n\n        df = self._slice(df)\n        return [\n            go.Scatter(\n                x=df.index,\n                y=df[col],\n                name=self._label(ctx, col),\n                line={\"color\": ctx.colormap.get(col)},\n            )\n            for col in df.columns\n        ]\n\n    def render_matplotlib(self, ctx, df, ax, **kwargs):\n        kwargs.pop(\"candle_width\", None)\n        df = self._slice(df)\n        for col in df.columns:\n            df[col].plot(\n                ax=ax,\n                color=ctx.colormap.get(col),\n                label=self._label(ctx, col),\n                **kwargs\n            )\n\n\nclass PointsRender(ChartRender):\n    def __init__(self, *cols):\n        self.cols = cols\n\n    def render_plotly(self, ctx, df, **kwargs):\n        import plotly.graph_objects as go\n\n        df = self._slice(df)\n        return [\n            go.Scatter(\n                x=df.index,\n                y=df[col],\n                name=self._label(ctx, col),\n                mode=\"markers\",\n                marker={\"color\": ctx.colormap.get(col)},\n            )\n            for col in df.columns\n        ]\n\n    def render_matplotlib(self, ctx, df, ax, **kwargs):\n\n        df = self._slice(df)\n        for col in df.columns:\n            tmp_df = df.loc[:, [col]].reset_index()\n            tmp_df.plot.scatter(\n                x=df.index.name,\n                y=col,\n                ax=ax,\n                color=ctx.colormap.get(col),\n                label=self._label(ctx, col),\n                **kwargs\n            )\n\n\nclass HistogramRender(ChartRender):\n    def __init__(self, col):\n        self.cols = (col,)\n\n    def render_plotly(self, ctx, df, **kwargs):\n        import plotly.graph_objects as go\n\n        df = self._slice(df)\n        return [\n            go.Bar(\n                x=df.index,\n                y=df[col],\n                name=self._label(ctx, col),\n                marker={\"color\": ctx.colormap.get(col)},\n            )\n            for col in df.columns\n        ]\n\n    def render_matplotlib(self, ctx, df, ax, **kwargs):\n        df = self._slice(df)\n        col = self.cols[0]\n        ax.bar(\n            df.index,\n            df[col],\n            align=\"center\",\n            width=BAR_WIDTH * ctx.interval_minutes,\n            color=ctx.colormap.get(col),\n            label=self._label(ctx, col),\n        )\n\n\nclass FillAreaRender(ChartRender):\n    def _prepare_bound(self, df, bound):\n        if isinstance(bound, (int, float)):\n            bound = [bound] * len(df)\n        elif bound in df:\n            bound = df[bound]\n        else:\n            bound = None\n        return bound\n\n    def _extract_variables(self, df, fill_area):\n        color = fill_area.get(\"color\")\n        opacity = fill_area.get(\"transparency\")\n\n        lower = fill_area.get(\"lower_bound\")\n        lower = self._prepare_bound(df, lower)\n\n        upper = fill_area.get(\"upper_bound\")\n        upper = self._prepare_bound(df, upper)\n\n        return (color, lower, upper, opacity)\n\n    def render_plotly(self, ctx, df, **kwargs):\n        import plotly.graph_objs as go\n\n        if not ctx.fill_area:\n            return ()\n\n        color, lower, upper, opacity = self._extract_variables(df, ctx.fill_area)\n        if not (color and lower is not None and upper is not None and opacity):\n            return ()\n\n        trace0 = go.Scatter(\n            x=df.index,\n            y=lower,\n            fill=None,\n            mode=\"lines\",\n            opacity=opacity,\n            showlegend=False,\n            line={\"color\": color, \"width\": 0},\n        )\n\n        trace1 = go.Scatter(\n            x=df.index,\n            y=upper,\n            fill=\"tonexty\",\n            mode=\"lines\",\n            opacity=opacity,\n            showlegend=False,\n            line={\"color\": color, \"width\": 0},\n        )\n\n        return (trace0, trace1)\n\n    def render_matplotlib(self, ctx, df, ax, **kwargs):\n        import matplotlib.pyplot as plt\n\n        if not ctx.fill_area:\n            return\n\n        color, lower, upper, alpha = self._extract_variables(df, ctx.fill_area)\n        if not (color and lower is not None and upper is not None and alpha):\n            return\n\n        ax.fill_between(df.index, lower, upper, facecolor=color, alpha=alpha)\n\n\nLR = LineRender()\n\nFAR = FillAreaRender()\n\n\nRENDER_BY_NAME = {\n    \"candle\": CandlestickRender,\n    \"points\": PointsRender,\n    \"histogram\": HistogramRender,\n    \"line\": LineRender,\n}\n\n\nRENDERS_MAPPING = {\n    ADOSCEndpoint: [LR],\n    ADEndpoint: [LR],\n    ADXREndpoint: [LR],\n    ADXEndpoint: [LR],\n    APOEndpoint: [LR],\n    AROONOSCEndpoint: [LR],\n    AROONEndpoint: [LR],\n    ATREndpoint: [LR],\n    AVGPRICEEndpoint: [LR],\n    BBANDSEndpoint: [LR, FAR],\n    BETAEndpoint: [LR],\n    BOPEndpoint: [LR],\n    CCIEndpoint: [LR, FAR],\n    CEILEndpoint: [LR],\n    CMOEndpoint: [LR],\n    COPPOCKEndpoint: [LR],\n    DEMAEndpoint: [LR],\n    DXEndpoint: [LR],\n    EMAEndpoint: [LR],\n    EXPEndpoint: [LR],\n    FLOOREndpoint: [LR],\n    HEIKINASHICANDLESEndpoint: [\n        CandlestickRender(\"heikinopens\", \"heikinhighs\", \"heikinlows\", \"heikincloses\")\n    ],\n    HLC3Endpoint: [LR],\n    HT_DCPERIODEndpoint: [LR],\n    HT_DCPHASEEndpoint: [LR],\n    HT_PHASOREndpoint: [LR],\n    HT_SINEEndpoint: [LR],\n    HT_TRENDLINEEndpoint: [LR],\n    HT_TRENDMODEEndpoint: [LR],\n    ICHIMOKUEndpoint: [LR],\n    KAMAEndpoint: [LR],\n    KELTNEREndpoint: [LR],\n    KSTEndpoint: [LR],\n    LINEARREGANGLEEndpoint: [LR],\n    LINEARREGINTERCEPTEndpoint: [LR],\n    LINEARREGEndpoint: [LR],\n    LINEARREGSLOPEEndpoint: [LR],\n    LNEndpoint: [LR],\n    LOG10Endpoint: [LR],\n    MACDEndpoint: [LineRender(\"macd\", \"macd_signal\"), HistogramRender(\"macd_hist\"), ],\n    MACDSlopeEndpoint: [LR],\n    MACDEXTEndpoint: [LR],\n    MAMAEndpoint: [LR],\n    MAEndpoint: [LR],\n    MAXINDEXEndpoint: [LR],\n    MAXEndpoint: [LR],\n    McGinleyDynamicEndpoint: [LR],\n    MEDPRICEEndpoint: [LR],\n    MFIEndpoint: [LR],\n    MIDPOINTEndpoint: [LR],\n    MIDPRICEEndpoint: [LR],\n    MININDEXEndpoint: [LR],\n    MINMAXINDEXEndpoint: [LR],\n    MINMAXEndpoint: [LR],\n    MINEndpoint: [LR],\n    MINUS_DIEndpoint: [LR],\n    MINUS_DMEndpoint: [LR],\n    MOMEndpoint: [LR],\n    NATREndpoint: [LR],\n    OBVEndpoint: [LR],\n    PLUS_DIEndpoint: [LR],\n    PLUS_DMEndpoint: [LR],\n    PPOEndpoint: [LR],\n    PercentBEndpoint: [LR, FAR],\n    PivotPointsHLEndpoint: [PointsRender(\"pivot_point_h\", \"pivot_point_l\")],\n    ROCPEndpoint: [LR],\n    ROCR100Endpoint: [LR],\n    ROCREndpoint: [LR],\n    ROCEndpoint: [LR],\n    RSIEndpoint: [LR, FAR],\n    RVOLEndpoint: [LR],\n    SAREndpoint: [PointsRender(\"sar\")],\n    SMAEndpoint: [LR],\n    SQRTEndpoint: [LR],\n    STDDEVEndpoint: [LR],\n    STOCHFEndpoint: [LR, FAR],\n    STOCHRSIEndpoint: [LR, FAR],\n    STOCHEndpoint: [LR, FAR],\n    SuperTrendEndpoint: [LR],\n    T3MAEndpoint: [LR],\n    TEMAEndpoint: [LR],\n    TRANGEEndpoint: [LR],\n    TRIMAEndpoint: [LR],\n    TSFEndpoint: [LR],\n    TYPPRICEEndpoint: [LR],\n    TimeSeriesEndpoint: [CandlestickRender(\"open\", \"high\", \"low\", \"close\", \"volume\")],\n    ULTOSCEndpoint: [LR],\n    VAREndpoint: [LR],\n    VWAPEndpoint: [LR],\n    WCLPRICEEndpoint: [LR],\n    WILLREndpoint: [LR, FAR],\n    WMAEndpoint: [LR],\n}\n"
  },
  {
    "path": "src/twelvedata/time_series.py",
    "content": "# coding: utf-8\n\nimport time\nimport pytimeparse\nimport re\nimport itertools\nfrom collections import OrderedDict, Counter\n\nfrom .endpoints import *\nfrom .utils import apply_context_defaults, force_use_kwargs, parse_interval_in_minutes\n\n__all__ = (\"TimeSeries\",)\n\n\nclass TimeSeries(object):\n    def __init__(\n            self, ctx, endpoints=(), price_endpoint=None, price_endpoint_enabled=True\n    ):\n        self.ctx = ctx\n        self.price_endpoint_enabled = price_endpoint_enabled\n        self.price_endpoint = price_endpoint or TimeSeriesEndpoint(\n            self.ctx, **self.ctx.defaults\n        )\n        self.endpoints = endpoints\n\n    def clone(self):\n        return TimeSeries(\n            ctx=self.ctx,\n            endpoints=self.endpoints,\n            price_endpoint=self.price_endpoint,\n            price_endpoint_enabled=self.price_endpoint_enabled,\n        )\n\n    def as_json(self):\n        out = OrderedDict()\n        is_batch = False\n        postfixes = self._generate_postfixes()\n\n        error_symbols = []\n        if self.price_endpoint_enabled:\n            time_series_json = self.price_endpoint.as_json()\n            is_batch = self.price_endpoint.is_batch\n            for row_symbol in time_series_json:\n                if self.price_endpoint.is_batch:\n                    values = OrderedDict()\n                    if time_series_json[row_symbol]['status'] == 'error':\n                        error_symbols.append(row_symbol)\n                        continue\n                    for v in time_series_json[row_symbol]['values']:\n                        values.setdefault(v[\"datetime\"], {}).update(v)\n                    out[row_symbol] = values\n                else:\n                    out.setdefault(row_symbol[\"datetime\"], {}).update(row_symbol)\n\n        for ep in self.endpoints:\n            postfix = str(next(postfixes[ep.__class__]))\n            indicator_json = ep.as_json()\n            for row in indicator_json:\n                if ep.is_batch:\n                    if row.upper() in error_symbols:\n                        continue\n                    values = out[row]\n                    for v in indicator_json[row]['values']:\n                        if postfix:\n                            v = {\n                                (k if k == \"datetime\" else \"{}_{}\".format(k, postfix)): v\n                                for k, v in v.items()\n                            }\n                        values.setdefault(v[\"datetime\"], {}).update(v)\n                    out[row] = values\n                else:\n                    if postfix:\n                        row = {\n                            (k if k == \"datetime\" else \"{}_{}\".format(k, postfix)): v\n                            for k, v in row.items()\n                        }\n                    out.setdefault(row[\"datetime\"], {}).update(row)\n\n        if is_batch:\n            for k, v in out.items():\n                out[k] = tuple(v.values())\n            return dict(out)\n\n        return tuple(out.values())\n\n    def as_csv(self, **kwargs):\n        out = OrderedDict()\n        postfixes = self._generate_postfixes()\n\n        if self.price_endpoint_enabled:\n            for row in self.price_endpoint.as_csv():\n                out.setdefault(row[0], []).extend(row)\n\n        for ep in self.endpoints:\n            postfix = str(next(postfixes[ep.__class__]))\n\n            for row in ep.as_csv(**kwargs):\n                if row[0] == \"datetime\":\n                    row = [\"{}{}\".format(header, postfix) for header in row[1:]]\n                    row.insert(0, \"datetime\")\n                if not out:\n                    out.setdefault(row[0], []).extend(row)\n                else:\n                    out.setdefault(row[0], []).extend(row[1:])\n\n        return tuple(out.values())\n\n    def as_pandas(self, **kwargs):\n        import pandas\n\n        postfixes = self._generate_postfixes()\n\n        if self.price_endpoint_enabled:\n            df = self.price_endpoint.as_pandas()\n        else:\n            df = None\n\n        for ep in self.endpoints:\n            tmp_df = ep.as_pandas(**kwargs)\n            tmp_df = tmp_df.add_suffix(str(next(postfixes[ep.__class__])))\n\n            if df is None:\n                df = tmp_df\n                continue\n\n            df = pandas.merge(\n                df, tmp_df, how=\"left\", left_index=True, right_index=True\n            )\n\n        return df\n\n    def as_url(self, **kwargs):\n        urls = list()\n        if self.price_endpoint_enabled:\n            urls.append(self.price_endpoint.as_url())\n        for ep in self.endpoints:\n            urls.append(ep.as_url())\n        return urls\n\n    def _has_overlays(self):\n        return any(ep.is_overlay for ep in self.endpoints)\n\n    def _count_subplots(self):\n        \"\"\"Count how many charts should be displayed\"\"\"\n        if self.price_endpoint_enabled or self._has_overlays():\n            subplots_count = 1\n        else:\n            subplots_count = 0\n\n        for ep in self.endpoints:\n            subplots_count += ep.is_indicator and not ep.is_overlay\n        return subplots_count\n\n    def _chart_title(self):\n        return \"{} - {}\".format(\n            self.ctx.defaults.get(\"symbol\").upper(), self.ctx.defaults.get(\"interval\")\n        )\n\n    def _generate_postfixes(self):\n        # If user specified multiple same endpoints we should add postfixes\n        postfixes = {}\n        empty = itertools.cycle((\"\",))\n\n        for cls, n in Counter(ep.__class__ for ep in self.endpoints).items():\n            if n > 1:\n                postfixes[cls] = itertools.count(1)\n            else:\n                postfixes[cls] = empty\n\n        return postfixes\n\n    def as_pyplot_figure(self, figsize=(16, 8), candle_width=0.0002, df=None):\n        import matplotlib.dates as mdates\n        import matplotlib.pyplot as plt\n        import matplotlib.ticker as mticker\n        from pandas.plotting import register_matplotlib_converters\n\n        register_matplotlib_converters()\n\n        plt.rcParams[\"figure.figsize\"] = figsize\n        subplots_count = self._count_subplots()\n\n        def mark_xaxis_as_date(x):\n            x.xaxis_date()\n            x.xaxis.set_major_formatter(mdates.DateFormatter(\"%Y-%m-%d %H:%M\"))\n            x.xaxis.set_major_locator(mticker.MaxNLocator(10))\n            for label in x.xaxis.get_ticklabels():\n                label.set_rotation(45)\n            x.grid(True)\n\n        # All subplots should be %25 from height of main plot\n        if self.price_endpoint_enabled:\n            gridspec = {\n                \"width_ratios\": [1],\n                \"height_ratios\": [4] + ([1] * (subplots_count - 1)),\n            }\n        else:\n            gridspec = {\"width_ratios\": [1], \"height_ratios\": [1] * subplots_count}\n\n        # Create multiple plots with shared X-axis\n        fig, axs = plt.subplots(subplots_count, 1, sharex=True, gridspec_kw=gridspec)\n        fig.suptitle(self._chart_title(), x=0.44, y=0.95)\n        ax_iter = iter((axs,)) if subplots_count == 1 else iter(axs)\n\n        # Binding a width of the candles to the interval, otherwise\n        # the candles will be too thin\n        interval = self.ctx.defaults.get(\"interval\", \"1min\")\n        interval_minutes = parse_interval_in_minutes(interval) or 1\n\n        # Render price chart first\n        price_ax = None\n        if self.price_endpoint_enabled:\n            price_ax = next(ax_iter)\n            self.price_endpoint.render_matplotlib(\n                ax=price_ax,\n                candle_width=candle_width,\n                interval_minutes=interval_minutes,\n                df=df,\n            )\n            price_ax.yaxis.tick_right()\n            price_ax.yaxis.set_label_position(\"right\")\n            mark_xaxis_as_date(price_ax)\n        elif self._has_overlays():\n            price_ax = next(ax_iter)\n\n        # Render tech indicators\n        # postfixes = self._generate_postfixes()\n        # for ep in self.endpoints:\n        #     if ep.is_overlay:\n        #         ax = price_ax\n        #     else:\n        #         ax = next(ax_iter)\n        #         ax.margins(0.25)\n        #\n        #     ax.yaxis.tick_right()\n        #     ax.yaxis.set_label_position(\"right\")\n        #\n        #     postfix = next(postfixes[ep.__class__])\n        #     ep.render_matplotlib(\n        #         ax=ax, interval_minutes=interval_minutes, postfix=postfix\n        #     )\n        #\n        #     if not ep.is_overlay:\n        #         mark_xaxis_as_date(ax)\n        #\n        #     ax.legend(loc=\"upper left\")\n\n        plt.subplots_adjust(wspace=0, hspace=0, left=0.1, right=0.8)\n        plt.xlabel(\"Time\")\n\n        return fig\n\n    def show_pyplot(self, figsize=(20, 10), candle_width=0.002):\n        import matplotlib as mpl\n        import matplotlib.pyplot as plt\n\n        mpl.use(\"WebAgg\")\n        self.as_pyplot_figure(figsize=figsize, candle_width=candle_width)\n        plt.show()\n\n    def as_plotly_figure(self, df=None):\n        from plotly.subplots import make_subplots\n        import plotly.graph_objs as go\n\n        subplots_count = self._count_subplots()\n\n        # All subplots should have %25 height from the main plot\n        if self.price_endpoint_enabled:\n            row_width = [1]\n            row_width.extend([0.25] * (subplots_count - 1))\n        else:\n            row_width = [1] * subplots_count\n\n        fig = make_subplots(\n            rows=subplots_count,\n            cols=1,\n            shared_xaxes=True,\n            vertical_spacing=0,\n            row_width=row_width[::-1],\n        )\n\n        # Draw main plot\n        if self.price_endpoint_enabled:\n            price_traces = self.price_endpoint.render_plotly(fig=fig, df=df)\n            fig.add_trace(price_traces[0], 1, 1)\n\n            for trace in price_traces[1:]:\n                fig.add_trace(trace)\n\n        # Draw other subplots\n        postfixes = self._generate_postfixes()\n\n        overlay_endpoints = (ep for ep in self.endpoints if ep.is_overlay)\n        for ep in overlay_endpoints:\n            postfix = next(postfixes[ep.__class__])\n            for ep_trace in ep.render_plotly(postfix=postfix, df=df):\n                fig.add_trace(ep_trace)\n\n        if self.price_endpoint_enabled or self._has_overlays():\n            start_index = 2\n        else:\n            start_index = 1\n\n        separate_endpoints = (ep for ep in self.endpoints if not ep.is_overlay)\n        for idx, ep in enumerate(separate_endpoints, start=start_index):\n            postfix = next(postfixes[ep.__class__])\n            for ep_trace in ep.render_plotly(postfix=postfix):\n                fig.add_trace(ep_trace, idx, 1)\n\n        # Move all ticks on Y-axis to the right\n        for yaxis in (fig.layout[attr] for attr in fig.layout if attr[:5] == \"yaxis\"):\n            yaxis.side = \"right\"\n            yaxis.mirror = \"allticks\"\n\n        # Set title and remove rangeslider\n        fig.update(\n            layout_title={\n                \"text\": self._chart_title(),\n                \"x\": 0.5,\n                \"xanchor\": \"center\",\n                \"y\": 0.9,\n                \"yanchor\": \"top\",\n            },\n            layout_xaxis_rangeslider_visible=False,\n        )\n\n        return fig\n\n    def show_plotly(self):\n        fig = self.as_plotly_figure()\n        fig.show()\n\n    def _with_endpoint(self, ep):\n        ts = self.clone()\n        ts.endpoints += (ep,)\n        return ts\n\n    def _with_price_endpoint(self, ep):\n        ts = self.clone()\n        ts.price_endpoint = ep\n        return ts\n\n    def without_ohlc(self):\n        \"\"\"\n        Disable price data/chart\n        \"\"\"\n        ts = self.clone()\n        ts.price_endpoint_enabled = False\n        return ts\n\n    def with_ohlc(self):\n        \"\"\"\n        Enable price data/chart\n        \"\"\"\n        ts = self.clone()\n        ts.price_endpoint_enabled = True\n        return ts\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ad(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of AD to chart builder\n\n        Chaikin A/D Line(AD) calculates Advance/Decline of an asset. This\n        indicator belongs to the group of Volume Indicators.\n\n        This API call returns meta and time series values of AD. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Name of instrument you want to request\n            For preffered stocks use dot(.) delimiterE.g. BRK.A or BRK.B will be\n            correct\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ADEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_adosc(\n            self,\n            exchange=None,\n            country=None,\n            fast_period=12,\n            slow_period=26,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ADOSC to chart builder\n\n        Chaikin A/D Oscillator(ADOSC) is an indicator of indicator which has\n        an idea to find relationship between increasing and deacreasing volume\n        with price fluctuations. The Chaikin Oscillator measures the momentum\n        of the Accumulation/Distribution Line(ADL) using two Exponential\n        Moving Averages of varying length to the line(MACD).\n\n        This API call returns meta and time series values of ADOSC. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Name of instrument you want to request\n            For preffered stocks use dot(.) delimiter.\n            E.g. BRK.A or BRK.B will be correct\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n            otherwise is ignored. Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param fast_period: Number of periods for fast moving average.\n            Must be at least 1\n        :param slow_period: Number of periods for slow moving average.\n            Must be at least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ADOSCEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            fast_period=fast_period,\n            slow_period=slow_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_adx(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ADX to chart builder\n\n        Average Directional Movement Index(ADX) is used to decide if the price\n        trend is strong.\n\n        This API call returns meta and time series values of ADX. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency. E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ADXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_adxr(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ADXR to chart builder\n\n        Average Directional Movement Index Rating(ADXR) is a smoothed version\n        of ADX indicator. ADXR quantifies momentum change in the ADX.\n\n        This API call returns meta and time series values of ADXR. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency. E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ADXREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_apo(\n            self,\n            exchange=None,\n            country=None,\n            time_period=9,\n            fast_period=\"12\",\n            slow_period=\"26\",\n            ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of APO to chart builder\n\n        Absolute Price Oscillator(APO) calculates the difference between two\n        price moving averages.\n\n        This API call returns meta and time series values of APO. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency. E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param fast_period: Number of periods for fast moving average. Must\n        be at least 1\n        :param slow_period: Number of periods for slow moving average. Must\n        be at least 1\n        :param ma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = APOEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            fast_period=fast_period,\n            slow_period=slow_period,\n            ma_type=ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_aroon(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of AROON to chart builder\n\n        Aroon Indicator(AROON) is used to identify if the price is trending.\n        It can also spot beginning of new trend and it's strength.\n\n        This API call returns meta and time series values of AROON. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = AROONEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_aroonosc(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of AROONOSC to chart builder\n\n        Aroon Oscillator(AROONOSC) uses classic Aroon(Aroon Up and Aroon down)\n        to measure the strength of persisting trend and it's chances to\n        persist.\n\n        This API call returns meta and time series values of AROONOSC. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = AROONOSCEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_atr(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ATR to chart builder\n\n        Average True Range(ATR) is used to measure market volatility by\n        decomposing all asset prices over specified time period.\n\n        This API call returns meta and time series values of ATR. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ATREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_avgprice(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of AVGPRICE to chart builder\n\n        Average Price(AVGPRICE) uses formula: (open + high + low + close) / 4.\n\n        This API call returns meta and time series values of AVGPRICE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = AVGPRICEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_bbands(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=20,\n            sd=\"2\",\n            ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of BBANDS to chart builder\n\n        Bollinger Bands(BBANDS) are volatility bands located above and below a\n        moving average. Volatility size parameter depends on standard\n        deviation.\n\n        This API call returns meta and time series values of BBANDS. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param sd: Number of standard deviations. Must be at least 1\n        :param ma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = BBANDSEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            sd=sd,\n            ma_type=ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_beta(\n            self,\n            exchange=None,\n            country=None,\n            series_type_1=\"open\",\n            series_type_2=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of BETA to chart builder\n\n        Statistic Beta function.\n\n        This API call returns meta and time series values of BBANDS. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type_1: Price type used as the first part of technical indicator\n        :param series_type_2: Price type used as the second part of technical indicator\n        :param time_period: Number of periods to average over. Takes values in the range from 1 to 800\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = BETAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type_1=series_type_1,\n            series_type_2=series_type_2,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_percent_b(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=20,\n            sd=\"2\",\n            ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Creates request builder for %B\n\n        %B Indicator(%B) measures position of an asset price relative to upper\n        and lower Bollinger Bands.\n\n        This API call returns meta and time series values of %B. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param sd: Number of standard deviations. Must be at least 1\n        :param ma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = PercentBEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            sd=sd,\n            ma_type=ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_pivot_points_hl(\n            self,\n            exchange=None,\n            country=None,\n            time_period=10,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Creates request builder for Pivot Points (High/Low)\n\n        Pivot Points (High/Low) (PIVOT_POINTS_HL) are typically used to foresee potential price reversals.\n\n        This API call returns meta and time series values of PIVOT_POINTS_HL. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time descending updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = PivotPointsHLEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_bop(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of BOP to chart builder\n\n        Balance Of Power(BOP) measures relative strength between buyers and\n        sellers by assessing the ability of move price to an extreme level.\n\n        This API call returns meta and time series values of BOP. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = BOPEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_cci(\n            self,\n            exchange=None,\n            country=None,\n            time_period=20,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of CCI to chart builder\n\n        Commodity Channel Index(CCI) is a universal indicator that can help to\n        identify new trend and assess current critical conditions.\n\n        This API call returns meta and time series values of CCI. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = CCIEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ceil(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of CEIL to chart builder\n\n        Vector CEIL(CEIL) transform input data with mathematical ceil\n        function.\n\n        This API call returns meta and time series values of CEIL. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = CEILEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_cmo(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of CMO to chart builder\n\n        Chande Momentum Oscillator(CMO) is used to show overbought and\n        oversold conditions.\n\n        This API call returns meta and time series values of CMO. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = CMOEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_coppock(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            long_roc_period=14,\n            short_roc_period=11,\n            wma_period=10,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of COPPOCK to chart builder\n\n        Coppock Curve(COPPOCK) is usually used to detect long-term trend changes, typically on monthly charts.\n\n        This API call returns meta and time series values of CMO. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param long_roc_period: Number of periods for long term rate of change. Takes values in the range from 1 to 500\n        :param short_roc_period: Number of periods for short term rate of change. Takes values in the range from 1 to 500\n        :param wma_period: Number of periods for weighted moving average. Takes values in the range from 1 to 500\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = COPPOCKEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            long_roc_period=long_roc_period,\n            short_roc_period=short_roc_period,\n            wma_period=wma_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ceil(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of CEIL to chart builder\n\n        Vector CEIL(CEIL) transform input data with mathematical ceil\n        function.\n\n        This API call returns meta and time series values of CEIL. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = CEILEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_dema(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of DEMA to chart builder\n\n        Double Exponential Moving Average(DEMA) it used to eliminate lag. It\n        does this by taking two Exponential Moving Averages(EMA)).\n\n        This API call returns meta and time series values of DEMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = DEMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_dx(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of DX to chart builder\n\n        Directional Movement Index(DX) identifies in which direction the price\n        is moving.\n\n        This API call returns meta and time series values of DX. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = DXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ema(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of EMA to chart builder\n\n        Exponential Moving Average(EMA) it places greater importance on recent\n        data points than the normal Moving Average(MA).\n\n        This API call returns meta and time series values of EMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = EMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_exp(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of EXP to chart builder\n\n        Exponential(EXP) transform input data with mathematical exponent\n        function.\n\n        This API call returns meta and time series values of EXP. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = EXPEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_floor(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of FLOOR to chart builder\n\n        Vector FLOOR(FLOOR) transform input data with mathematical floor\n        function.\n\n        This API call returns meta and time series values of FLOOR. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = FLOOREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_heikinashicandles(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HEIKINASHICANDLES to chart builder\n\n        Heikin-Ashi Candles(HEIKINASHICANDLES) translating from Japanese it\n        means \"average bar\". It can be used detect market trends and predict\n        future price fluctuations..\n\n        This API call returns meta and time series values of\n        HEIKINASHICANDLES. Meta object consists of general information about\n        requested technical indicator. Time series is the array of objects\n        ordered by time desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HEIKINASHICANDLESEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_price_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_hlc3(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HLC3 to chart builder\n\n        High, Low, Close Average(HLC3) gives alternative candlesticks patter.\n        Every element is defined as follows: (high + low + close) / 3.\n\n        This API call returns meta and time series values of HLC3. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HLC3Endpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_price_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ht_dcperiod(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HT_DCPERIOD to chart builder\n\n        Hilbert Transform Dominant Cycle Period(HT_DCPERIOD) is part of\n        Hilbert Transforms concepts. You can reed more about it in the Rocket\n        Science for Traders book by John F. Ehlers.\n\n        This API call returns meta and time series values of HT_DCPERIOD. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HT_DCPERIODEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ht_dcphase(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HT_DCPHASE to chart builder\n\n        Hilbert Transform Dominant Cycle Phase(HT_DCPHASE) is part of Hilbert\n        Transforms concepts. You can reed more about it in the Rocket Science\n        for Traders book by John F. Ehlers.\n\n        This API call returns meta and time series values of HT_DCPHASE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HT_DCPHASEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ht_phasor(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HT_PHASOR to chart builder\n\n        Hilbert Transform Phasor Components(HT_PHASOR) is part of Hilbert\n        Transforms concepts. You can reed more about it in the Rocket Science\n        for Traders book by John F. Ehlers.\n\n        This API call returns meta and time series values of HT_PHASOR. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HT_PHASOREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ht_sine(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HT_SINE to chart builder\n\n        Hilbert Transform SineWave(HT_SINE) is part of Hilbert Transforms\n        concepts. You can reed more about it in the Rocket Science for Traders\n        book by John F. Ehlers.\n\n        This API call returns meta and time series values of HT_SINE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HT_SINEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ht_trendline(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HT_TRENDLINE to chart builder\n\n        Hilbert Transform Instantaneous Trendline(HT_TRENDLINE) comes from the\n        concept of Digital Signal Processing (DSP). It creates complex signals\n        from the simple chart data. You can reed more about it in the Rocket\n        Science for Traders book by John F. Ehlers.\n\n        This API call returns meta and time series values of HT_TRENDLINE.\n        Meta object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HT_TRENDLINEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ht_trendmode(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of HT_TRENDMODE to chart builder\n\n        Hilbert Transform Trend vs Cycle Mode(HT_TRENDMODE) is part of Hilbert\n        Transforms concepts. You can reed more about it in the Rocket Science\n        for Traders book by John F. Ehlers.\n\n        This API call returns meta and time series values of HT_TRENDMODE.\n        Meta object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = HT_TRENDMODEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ichimoku(\n            self,\n            exchange=None,\n            country=None,\n            conversion_line_period=9,\n            base_line_period=26,\n            leading_span_b_period=52,\n            lagging_span_period=26,\n            include_ahead_span_period=True,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ICHIMOKU to chart builder\n\n        Ichimoku Kinkō Hyō(ICHIMOKU) is a group of technical indicators that shows trend direction, momentum,\n        and support & resistance levels. Overall it tends to improve the accuracy of forecasts.\n\n        This API call returns meta and time series values of HT_TRENDLINE.\n        Meta object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param conversion_line_period: Takes values in the range from 1 to 800\n        :param base_line_period: Takes values in the range from 1 to 800\n        :param leading_span_b_period: Takes values in the range from 1 to 800\n        :param lagging_span_period: Takes values in the range from 1 to 800\n        :param include_ahead_span_period: Specifies if the span values ahead the current moment should be returned\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ICHIMOKUEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            conversion_line_period=conversion_line_period,\n            base_line_period=base_line_period,\n            leading_span_b_period=leading_span_b_period,\n            lagging_span_period=lagging_span_period,\n            include_ahead_span_period=include_ahead_span_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_kama(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of KAMA to chart builder\n\n        Kaufman's Adaptive Moving Average(KAMA) is a type of Moving\n        Average(MA) that incorporates market noise and volatility.\n\n        This API call returns meta and time series values of KAMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = KAMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_keltner(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=20,\n            atr_time_period=10,\n            multiplier=2,\n            ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of KELTNER to chart builder\n\n        Keltner Channels(KELTNER) is a volatility indicator used to spot trend changes and accelerations.\n\n        This API call returns meta and time series values of KELTNER. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at least 1\n        :param atr_time_period: Takes values in the range from 1 to 800\n        :param multiplier: Multiplier is the number by which the range is shifted\n        :param ma_type: Type of Moving Average to be used\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = KELTNEREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            atr_time_period=atr_time_period,\n            multiplier=multiplier,\n            ma_type=ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_kst(\n            self,\n            exchange=None,\n            country=None,\n            roc_period_1=10,\n            roc_period_2=15,\n            roc_period_3=20,\n            roc_period_4=30,\n            signal_period=9,\n            sma_period_1=10,\n            sma_period_2=10,\n            sma_period_3=10,\n            sma_period_4=15,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of KST to chart builder\n\n        Know Sure Thing(KST) calculates price momentum for four distinct price cycles(ROC).\n\n        This API call returns meta and time series values of KST. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param roc_period_1:\n        :param roc_period_2:\n        :param roc_period_3:\n        :param roc_period_4:\n        :param signal_period:\n        :param sma_period_1:\n        :param sma_period_2:\n        :param sma_period_3:\n        :param sma_period_4:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = KSTEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            roc_period_1=roc_period_1,\n            roc_period_2=roc_period_2,\n            roc_period_3=roc_period_3,\n            roc_period_4=roc_period_4,\n            signal_period=signal_period,\n            sma_period_1=sma_period_1,\n            sma_period_2=sma_period_2,\n            sma_period_3=sma_period_3,\n            sma_period_4=sma_period_4,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_linearreg(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of LINEARREG to chart builder\n\n        Linear Regression(LINEARREG) is used to determine trend direction by a\n        straight line.\n\n        This API call returns meta and time series values of LINEARREG. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = LINEARREGEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_linearregangle(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of LINEARREGANGLE to chart builder\n\n        Linear Regression Angle(LINEARREGANGLE) calculates the angle of the\n        linear regression trendline.\n\n        This API call returns meta and time series values of LINEARREGANGLE.\n        Meta object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = LINEARREGANGLEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_linearregintercept(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of LINEARREGINTERCEPT to chart builder\n\n        Linear Regression Intercept(LINEARREGINTERCEPT) calculates the\n        intercept for the linear regression trendline for each data point.\n\n        This API call returns meta and time series values of\n        LINEARREGINTERCEPT. Meta object consists of general information about\n        requested technical indicator. Time series is the array of objects\n        ordered by time desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = LINEARREGINTERCEPTEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_linearregslope(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of LINEARREGSLOPE to chart builder\n\n        Linear Regression Slope(LINEARREGSLOPE) calculates the slope for the\n        linear regression trendline for each data point.\n\n        This API call returns meta and time series values of LINEARREGSLOPE.\n        Meta object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = LINEARREGSLOPEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ln(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of LN to chart builder\n\n        Natural Logarithm to the base of constant e(LN) transforms all data\n        points with natural logarithm.\n\n        This API call returns meta and time series values of LN. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = LNEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_log10(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of LOG10 to chart builder\n\n        Logarithm to base 10(LOG10) transforms all data points with logarithm\n        to base 10.\n\n        This API call returns meta and time series values of LOG10. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = LOG10Endpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ma(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MA to chart builder\n\n        Moving Average(MA) is used to smooth out price fluctuations and get\n        rid of market noise.\n\n        This API call returns meta and time series values of MA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param ma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            ma_type=ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_macd(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            fast_period=\"12\",\n            slow_period=\"26\",\n            signal_period=\"9\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MACD to chart builder\n\n        Moving Average Convergence Divergence(MACD) is a trend following\n        momentum indicator which works by subtracting the longer moving\n        average from the shorter one. MACD has an unstable period ~ 100.\n\n        This API call returns meta and time series values of MACD. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param fast_period: Number of periods for fast moving average. Must\n        be at least 1\n        :param slow_period: Number of periods for slow moving average. Must\n        be at least 1\n        :param signal_period: Number of periods to be plotted on MACD line.\n        Must be at least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MACDEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            fast_period=fast_period,\n            slow_period=slow_period,\n            signal_period=signal_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_macd_slope(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            fast_period=\"12\",\n            slow_period=\"26\",\n            signal_period=\"9\",\n            time_period=\"9\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MACD_SLOPE to chart builder\n\n        Moving Average Convergence Divergence Regression Slope(MACD_SLOPE) shows\n        slopes of macd line, signal line, and histogram. A negative and rising slope\n        shows improvement within a downtrend. A positive and falling slope shows\n        deterioration within an uptrend. MACD has an unstable period of ~ 100.\n\n        This API call returns meta and time series values of MACD SLOPE. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param fast_period: Number of periods for fast moving average. Must\n        be at least 1\n        :param slow_period: Number of periods for slow moving average. Must\n        be at least 1\n        :param signal_period: Number of periods to be plotted on MACD line.\n        Must be at least 1\n        :param time_period: Number of periods to average over. Takes values in the range from 1 to 800.\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MACDSlopeEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            fast_period=fast_period,\n            slow_period=slow_period,\n            signal_period=signal_period,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_macdext(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            fast_period=\"12\",\n            fast_ma_type=\"SMA\",\n            slow_period=\"26\",\n            slow_ma_type=\"SMA\",\n            signal_period=\"9\",\n            signal_ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MACDEXT to chart builder\n\n        Moving Average Convergence Divergence Extended(MACDEXT) gives greater\n        control over MACD input parameters. MACDEXT has an unstable period ~\n        100.\n\n        This API call returns meta and time series values of MACDEXT. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param fast_period: Number of periods for fast moving average. Must\n        be at least 1\n        :param fast_ma_type:\n        :param slow_period: Number of periods for slow moving average. Must\n        be at least 1\n        :param slow_ma_type:\n        :param signal_period: Number of periods to be plotted on MACD line.\n        Must be at least 1\n        :param signal_ma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MACDEXTEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            fast_period=fast_period,\n            fast_ma_type=fast_ma_type,\n            slow_period=slow_period,\n            slow_ma_type=slow_ma_type,\n            signal_period=signal_period,\n            signal_ma_type=signal_ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_mama(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            fast_limit=\"0.5\",\n            slow_limit=\"0.05\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MAMA to chart builder\n\n        MESA Adaptive Moving Average(MAMA) adapts to price fluctuations based\n        on the rate of change of Hilbert Transform Discriminator. More about\n        MAMA can be read here.\n\n        This API call returns meta and time series values of MAMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param fast_limit:\n        :param slow_limit:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MAMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            fast_limit=fast_limit,\n            slow_limit=slow_limit,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_max(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MAX to chart builder\n\n        Highest value over period(MAX).\n\n        This API call returns meta and time series values of MAX. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MAXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_maxindex(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MAXINDEX to chart builder\n\n        Index of highest value over period(MAXINDEX).\n\n        This API call returns meta and time series values of MAXINDEX. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MAXINDEXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_mcginley_dynamic(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MCGINLEY_DYNAMIC to chart builder\n\n        McGinley Dynamic(MCGINLEY_DYNAMIC) keeps all the benefits from the moving averages but adds an adjustment to market speed.\n\n        This API call returns meta and time series values of MCGINLEY_DYNAMIC. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = McGinleyDynamicEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_medprice(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MEDPRICE to chart builder\n\n        Median Price(MEDPRICE).\n\n        This API call returns meta and time series values of MEDPRICE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MEDPRICEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_mfi(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MFI to chart builder\n\n        Money Flow Index(MFI) is used to identify overbought and oversold levels in an asset. In some cases,\n        it can be used to detect divergences, which might be a sign of upcoming trend changes.\n\n        This API call returns \"meta\" and \"time_series\" values of MFI. \"meta\" object consist of general information\n        about the requested technical indicator. \"time_series\" is the array of objects ordered by time\n        descending updated in real-time.\n\n        :param symbol: Name of instrument you want to request\n            For preffered stocks use dot(.) delimiter. E.g. BRK.A or BRK.B will be correct\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MFIEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_midpoint(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MIDPOINT to chart builder\n\n        MidPoint over period(MIDPOINT) is calculated as: (highest value +\n        lowest value) / 2.\n\n        This API call returns meta and time series values of MIDPOINT. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MIDPOINTEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_midprice(\n            self,\n            exchange=None,\n            country=None,\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MIDPRICE to chart builder\n\n        Midpoint Price over period(MIDPRICE) is calculated as: (highest high +\n        lowest low) / 2.\n\n        This API call returns meta and time series values of MIDPRICE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MIDPRICEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_min(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MIN to chart builder\n\n        Lowest value over period(MIN).\n\n        This API call returns meta and time series values of MIN. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MINEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_minindex(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MININDEX to chart builder\n\n        Index of lowest value over period(MININDEX).\n\n        This API call returns meta and time series values of MININDEX. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MININDEXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_minmax(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MINMAX to chart builder\n\n        Lowest and highest values over period(MINMAX).\n\n        This API call returns meta and time series values of MINMAX. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MINMAXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_minmaxindex(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MINMAXINDEX to chart builder\n\n        Indexes of lowest and highest values over period(MINMAXINDEX).\n\n        This API call returns meta and time series values of MINMAXINDEX. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MINMAXINDEXEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_minus_di(\n            self,\n            exchange=None,\n            country=None,\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MINUS_DI to chart builder\n\n        Minus Directional Indicator(MINUS_DI) is a component of the Average\n        Directional Index(ADX) and it measures the existence of downtrend.\n\n        This API call returns meta and time series values of MINUS_DI. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MINUS_DIEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_minus_dm(\n            self,\n            exchange=None,\n            country=None,\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MINUS_DM to chart builder\n\n        Minus Directional Movement(MINUS_DM) is calculated as: Previous Low -\n        Low.\n\n        This API call returns meta and time series values of MINUS_DM. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MINUS_DMEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_mom(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of MOM to chart builder\n\n        Momentum(MOM) compares current price with the previous price N\n        timeperiods ago.\n\n        This API call returns meta and time series values of MOM. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = MOMEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_natr(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of NATR to chart builder\n\n        Normalized Average True Range(NATR) is used to compare and analyze\n        across different price levels due to its normalized quality, which\n        might be more effective than the original ATR.\n\n        This API call returns meta and time series values of NATR. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = NATREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_obv(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of OBV to chart builder\n\n        On Balance Volume(OBV) is a momentum indicator which uses volume flow\n        to forecast upcoming price changes.\n\n        This API call returns meta and time series values of OBV. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Name of instrument you want to request\n        For preffered stocks use dot(.) delimiterE.g. BRK.A or BRK.B will be\n        correct\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = OBVEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_plus_di(\n            self,\n            exchange=None,\n            country=None,\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of PLUS_DI to chart builder\n\n        Plus Directional Indicator(PLUS_DI) is a component of the Average\n        Directional Index(ADX) and it measures the existence of uptrend.\n\n        This API call returns meta and time series values of PLUS_DI. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = PLUS_DIEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_plus_dm(\n            self,\n            exchange=None,\n            country=None,\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of PLUS_DM to chart builder\n\n        Plus Directional Movement(PLUS_DM) is calculated as: High - Previous\n        High.\n\n        This API call returns meta and time series values of PLUS_DM. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = PLUS_DMEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ppo(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            fast_period=\"10\",\n            slow_period=\"21\",\n            ma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of PPO to chart builder\n\n        Percentage Price Oscillator(PPO) shows relationship between two Moving\n        Averages(MA) as a percentage.\n\n        This API call returns meta and time series values of PPO. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param fast_period: Number of periods for fast moving average. Must\n        be at least 1\n        :param slow_period: Number of periods for slow moving average. Must\n        be at least 1\n        :param ma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = PPOEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            fast_period=fast_period,\n            slow_period=slow_period,\n            ma_type=ma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_roc(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ROC to chart builder\n\n        Rate of change(ROC) calculates rate of change between current price\n        and price n timeperiods ago. Formula: ((price / prevPrice) - 1) * 100.\n\n        This API call returns meta and time series values of ROC. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ROCEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_rocp(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ROCP to chart builder\n\n        Rate of change percentage(ROCP) calculates rate of change in % between\n        current price and price n timeperiods ago. Formula: (price -\n        prevPrice) / prevPrice.\n\n        This API call returns meta and time series values of ROCP. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ROCPEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_rocr(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ROCR to chart builder\n\n        Rate of change ratio(ROCR) calculates ratio between current price and\n        price n timeperiods ago. Formula: (price / prevPrice).\n\n        This API call returns meta and time series values of ROCR. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ROCREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_rocr100(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ROCR100 to chart builder\n\n        Rate of change ratio 100 scale(ROCR100) calculates ratio with 100\n        scale between current price and price n timeperiods ago. Formula:\n        (price / prevPrice) * 100.\n\n        This API call returns meta and time series values of ROCR100. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ROCR100Endpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_rsi(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of RSI to chart builder\n\n        Relative Strength Index(RSI) is a momentum indicator which calculates\n        the magnitude of a price changes to assess the overbought and oversold\n        conditions in the price of an asset.\n\n        This API call returns meta and time series values of RSI. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = RSIEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_rvol(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of RVOL to chart builder\n\n        Relative Volume Indicator(RVOL) shows how the current trading volume\n        is compared to past volume over a given period.\n\n        This API call returns meta and time series values of RVOL. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = RVOLEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_sar(\n            self,\n            acceleration=\"0.02\",\n            maximum=\"0.2\",\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of SAR to chart builder\n\n        Parabolic SAR(SAR) is used to identify and spot upcoming asset\n        momentum.\n\n        This API call returns meta and time series values of SAR. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param acceleration:\n        :param maximum:\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = SAREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            acceleration=acceleration,\n            maximum=maximum,\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_sma(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of SMA to chart builder\n\n        Simple Moving Average(SMA) is an arithmetic moving average calculated\n        by adding latest closing prices and them dividing them by number of\n        time periods.\n\n        This API call returns meta and time series values of SMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = SMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_sqrt(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of SQRT to chart builder\n\n        Square Root(SQRT) transform input data with square root.\n\n        This API call returns meta and time series values of SQRT. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = SQRTEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_stddev(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            sd=\"2\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of STDDEV to chart builder\n\n        Standard Deviation(STDDEV) is used to measure volatility. Might be\n        important when assessing risks.\n\n        This API call returns meta and time series values of STDDEV. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param sd: Number of standard deviations. Must be at least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = STDDEVEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            sd=sd,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_stoch(\n            self,\n            exchange=None,\n            country=None,\n            fast_k_period=\"14\",\n            slow_k_period=\"1\",\n            slow_d_period=\"3\",\n            slow_kma_type=\"SMA\",\n            slow_dma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of STOCH to chart builder\n\n        Stochastic Oscillator(STOCH) is used to decide if the price trend is\n        strong.\n\n        This API call returns meta and time series values of STOCH. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param fast_k_period:\n        :param slow_k_period:\n        :param slow_d_period:\n        :param slow_kma_type:\n        :param slow_dma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = STOCHEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            fast_k_period=fast_k_period,\n            slow_k_period=slow_k_period,\n            slow_d_period=slow_d_period,\n            slow_kma_type=slow_kma_type,\n            slow_dma_type=slow_dma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_stochf(\n            self,\n            exchange=None,\n            country=None,\n            fast_k_period=\"14\",\n            fast_d_period=\"3\",\n            fast_dma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of STOCHF to chart builder\n\n        Stochastic Fast(STOCHF) is more sensitive to price changes, therefore\n        it changes direction more quickly.\n\n        This API call returns meta and time series values of STOCHF. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param fast_k_period:\n        :param fast_d_period:\n        :param fast_dma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = STOCHFEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            fast_k_period=fast_k_period,\n            fast_d_period=fast_d_period,\n            fast_dma_type=fast_dma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_stochrsi(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=14,\n            fast_k_period=\"3\",\n            fast_d_period=\"3\",\n            fast_dma_type=\"SMA\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of STOCHRSI to chart builder\n\n        Stochastic RSI(STOCHRSI) this indicator takes advantages of both\n        indicators STOCH and RSI. It is used to determine level of overbought\n        and oversold as well as current market trend of an asset.\n\n        This API call returns meta and time series values of STOCHRSI. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param fast_k_period:\n        :param fast_d_period:\n        :param fast_dma_type:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = STOCHRSIEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            fast_k_period=fast_k_period,\n            fast_d_period=fast_d_period,\n            fast_dma_type=fast_dma_type,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_supertrend(\n            self,\n            exchange=None,\n            country=None,\n            multiplier=3,\n            period=10,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of SuperTrend to chart builder\n\n        SuperTrend Indicator(SUPERTREND) is mostly used on intraday timeframes to detect\n        the price upward or downward direction in the trending market.\n\n        This API call returns meta and time series values of SuperTrend. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param multiplier: Multiplier is the number by which the range is multiplied\n        :param period: Period of the ATR indicator\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = SuperTrendEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            multiplier=multiplier,\n            period=period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_t3ma(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            v_factor=\"0.7\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of T3MA to chart builder\n\n        T3MA(T3MA).\n\n        This API call returns meta and time series values of T3MA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param v_factor:\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = T3MAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            v_factor=v_factor,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_tema(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of TEMA to chart builder\n\n        Triple Exponential Moving Average(TEMA) it smooths out price\n        fluctuations, making it more trend detection more transparent without\n        the lag.\n\n        This API call returns meta and time series values of TEMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = TEMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_trange(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of TRANGE to chart builder\n\n        True Range(TRANGE) usually is used as the base when calculating other\n        indicators. TRANGE determines the normal trading range of an asset.\n\n        This API call returns meta and time series values of TRANGE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = TRANGEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_trima(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of TRIMA to chart builder\n\n        Triangular Moving Average(TRIMA) it smooths out price fluctuations,\n        but places more weight on the prices in middle of the time period.\n\n        This API call returns meta and time series values of TRIMA. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = TRIMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_tsf(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of TSF to chart builder\n\n        Time Series Forecast(TSF) calculates trend based on last points of\n        multiple regression trendlines.\n\n        This API call returns meta and time series values of TSF. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = TSFEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_typprice(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of TYPPRICE to chart builder\n\n        Typical Price(TYPPRICE).\n\n        This API call returns meta and time series values of TYPPRICE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = TYPPRICEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_ultosc(\n            self,\n            exchange=None,\n            country=None,\n            time_period_1=\"7\",\n            time_period_2=\"14\",\n            time_period_3=\"28\",\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of ULTOSC to chart builder\n\n        Ultimate Oscillator(ULTOSC) takes into account three different time\n        periods to enhance quality of overbought and oversold signals.\n\n        This API call returns meta and time series values of ULTOSC. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period_1: Number of periods to average over. Must be at\n        least 1\n        :param time_period_2: Number of periods to average over. Must be at\n        least 1\n        :param time_period_3: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = ULTOSCEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period_1=time_period_1,\n            time_period_2=time_period_2,\n            time_period_3=time_period_3,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_var(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of VAR to chart builder\n\n        Variance(VAR) calculates the spread between data points to determine\n        how far are they from the mean.\n\n        This API call returns meta and time series values of VAR. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n        calculated\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = VAREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_vwap(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of VWAP to chart builder\n\n        Volume Weighted Average Price(VWAP) is commonly used as a trading benchmark\n        that gives an average price at which the instrument has been trading during the day.\n\n        This API call returns meta and time series values of VWAP. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = VWAPEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_wclprice(\n            self,\n            exchange=None,\n            country=None,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of WCLPRICE to chart builder\n\n        Weighted Close Price(WCLPRICE) usually is used as the base for other\n        indicators for smoothness. Formula: (high + low + close * 2) / 4.\n\n        This API call returns meta and time series values of WCLPRICE. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n                Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n                Country where instrument is traded\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n                Exchange for local exchange time2. UTC for datetime at\n                universal UTC standard3. Timezone name according to IANA Time\n                Zone Database. E.g. America/New_York, Asia/Singapore. Full\n                list of timezones can be found here.Take note that IANA\n                Timezone name is case-sensitive.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = WCLPRICEEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_willr(\n            self,\n            exchange=None,\n            country=None,\n            time_period=14,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of WILLR to chart builder\n\n        Williams %R(WILLR) calculates overbought and oversold levels. It can\n        also be used to find entry and exit signals.\n\n        This API call returns meta and time series values of WILLR. Meta\n        object consists of general information about requested technical\n        indicator. Time series is the array of objects ordered by time\n        desceding updated realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param time_period: Number of periods to average over. Must be at\n        least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = WILLREndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n\n    @force_use_kwargs\n    @apply_context_defaults\n    def with_wma(\n            self,\n            exchange=None,\n            country=None,\n            series_type=\"close\",\n            time_period=9,\n            outputsize=30,\n            start_date=None,\n            end_date=None,\n            dp=5,\n            timezone=\"Exchange\",\n            prepost=\"false\",\n            mic_code=None,\n    ):\n        \"\"\"\n        Add request builder of WMA to chart builder\n\n        Weighted Moving Average(WMA) it smooths out price fluctuations, it\n        puts more weight on recent data points and less on past.\n\n        This API call returns meta and time series values of WMA. Meta object\n        consists of general information about requested technical indicator.\n        Time series is the array of objects ordered by time desceding updated\n        realtime.\n\n        :param symbol: Instrument symbol, can be any stock, forex or\n            cryptocurrency E.g. AAPL, EUR/USD, ETH/BTC, ...\n        :param interval: Interval between two consecutive points in time series\n        :param exchange: Only is applicable to stocks and cryptocurrencies\n        otherwise is ignored\n            Exchange where instrument is traded\n        :param country: Only is applicable to stocks otherwise is ignored\n            Country where instrument is traded\n        :param series_type: Price type on which technical indicator is\n            calculated\n        :param time_period: Number of periods to average over. Must be at\n            least 1\n        :param outputsize: Number of last datapoints to retrieve\n        :param start_date: Start date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param end_date: End date of selection, accepts \"yyyy-MM-dd hh:mm:ss\" and \"yyyy-MM-dd\" formats\n        :param dp: Specifies number of decimal places for floating values\n        :param timezone: Timezone at which output datetime will be displayed\n            Exchange for local exchange time2. UTC for datetime at universal\n            UTC standard3. Timezone name according to IANA Time Zone\n            Database. E.g. America/New_York, Asia/Singapore. Full list of\n            timezones can be found here.Take note that IANA Timezone name is\n            case-sensitive.\n        :param prepost: Available at the 1min, 5min, 15min, and 30min intervals for all US equities.\n        :param mic_code: Mic code value for filter.\n\n        :returns: chart builder\n        :rtype: ChartEndpoint\n        \"\"\"\n        ep = WMAEndpoint(\n            ctx=self.ctx,\n            symbol=self.ctx.defaults[\"symbol\"],\n            interval=self.ctx.defaults[\"interval\"],\n            exchange=exchange,\n            country=country,\n            series_type=series_type,\n            time_period=time_period,\n            outputsize=outputsize,\n            start_date=start_date,\n            end_date=end_date,\n            dp=dp,\n            timezone=timezone,\n            prepost=prepost,\n            mic_code=mic_code,\n        )\n        return self._with_endpoint(ep)\n"
  },
  {
    "path": "src/twelvedata/utils.py",
    "content": "# coding: utf-8\n\nimport inspect\nimport operator\nimport functools\nimport textwrap\nimport pytimeparse\n\nfrom .exceptions import BadRequestError\n\n\ndef patch_endpoints_meta(ctx):\n    \"\"\"\n    Loads technical indicators metadata from the remote source \n    and patches endpoint classes according to the loaded metadata.\n    \"\"\"\n    from . import endpoints\n\n    if hasattr(patch_endpoints_meta, \"patched\"):\n        return\n\n    meta_ep = endpoints.TechIndicatorsMetaEndpoint(ctx)\n    all_meta = meta_ep.as_json()\n\n    for ep in (getattr(endpoints, attr) for attr in endpoints.__all__):\n        meta = all_meta.get(ep._name)\n\n        if meta is None:\n            continue\n        else:\n            ep.is_indicator = True\n\n        if \"overlay\" in meta:\n            ep.is_overlay = meta[\"overlay\"]\n\n        if \"output_values\" in meta:\n            ep.colormap = {\n                k: v[\"default_color\"]\n                for k, v in meta[\"output_values\"].items()\n                if \"default_color\" in v\n            }\n\n        if \"tinting\" in meta:\n            fill_area = meta[\"tinting\"].get(\"area\") or {}\n            ep.fill_area = fill_area\n\n    setattr(patch_endpoints_meta, \"patched\", True)\n\n\ndef force_use_kwargs(func):\n    @functools.wraps(func)\n    def wrapper(self, *args, **kwargs):\n        if args:\n            raise RuntimeError(\"Use kwargs only, please\")\n        return func(self, **kwargs)\n\n    return wrapper\n\n\ndef apply_context_defaults(func):\n    @functools.wraps(func)\n    def wrapper(self, *args, **kwargs):\n        func_args = inspect.getargs(func.__code__).args\n        func_args.remove(\"self\")\n\n        _kwargs = {k: v for k, v in self.ctx.defaults.items() if k in func_args}\n        _kwargs.update(kwargs)\n        return func(self, *args, **_kwargs)\n\n    return wrapper\n\n\ndef convert_pandas_to_plotly(df, **kwargs):\n    \"\"\"\n    Converts pandas DataFrame to plotly figure\n\n    :param df: pandas DataFrame\n    \"\"\"\n    try:\n        import plotly.graph_objs as go\n    except ImportError:\n        raise ImportError(\n            textwrap.dedent(\n                \"\"\"\n                    No module named 'plotly'. You can install it with follow command:\n\n                    > pip install twelvedata[pandas, plotly] \n\n                    or \n\n                    > pip install plotly\n                \"\"\"\n            ).strip()\n        )\n\n    traces = [\n        go.Scatter(x=df.index, y=df[col], mode=\"lines\", name=col) for col in df.columns\n    ]\n\n    return go.Figure(traces)\n\n\ndef add_null_obj_values(obj, columns) -> dict:\n    for col in columns:\n        if col not in obj:\n            obj[col] = None\n    return obj\n\n\ndef convert_collection_to_pandas(val, indexing_type=None):\n    \"\"\"\n    Converts list/dict to DataFrame\n\n    :param val: list or dict\n    :returns: pandas DataFrame\n    \"\"\"\n    try:\n        import pandas\n    except ImportError:\n        raise ImportError(\n            textwrap.dedent(\n                \"\"\"\n                    No module named 'pandas'. You can install it with follow command:\n\n                    > pip install twelvedata[pandas] \n\n                    or \n\n                    > pip install pandas\n                \"\"\"\n            ).strip()\n        )\n\n    if isinstance(val, (list, tuple)):\n        if len(val) == 0:\n            return pandas.DataFrame()\n        else:\n            columns_beg = tuple(val[0].keys())\n            columns_end = tuple(val[-1].keys())\n            get_row = operator.itemgetter(*columns_end)\n            data = [get_row(add_null_obj_values(obj, columns_end)) if\n                    columns_beg != columns_end else\n                    get_row(obj) for obj in val]\n            return pandas.DataFrame(data, columns=columns_end)\n    elif isinstance(val, dict):\n        try:\n            return pandas.DataFrame.from_dict(val, orient=\"index\", dtype=\"float\")\n        except ValueError:\n            return pandas.DataFrame.from_dict(\n                {'data_key': val}, orient=\"index\", dtype=\"object\"\n            )\n    else:\n        raise ValueError(\"Expected list, tuple or dict, but {} found\".format(type(val)))\n\n\ndef convert_collection_to_pandas_multi_index(val):\n    try:\n        import pandas\n    except ImportError:\n        raise ImportError(\n            textwrap.dedent(\n                \"\"\"\n                    No module named 'pandas'. You can install it with follow command:\n\n                    > pip install twelvedata[pandas] \n\n                    or \n\n                    > pip install pandas\n                \"\"\"\n            ).strip()\n        )\n\n    columns = ()\n    for symbol, data in val.items():\n        if data['status'] == 'error':\n            raise BadRequestError(data['message'])\n        keys = list(data['values'][-1].keys())[1:]\n        if len(keys) > len(columns):\n            columns = keys\n\n    arr = []\n    multi_index = []\n\n    for symbol, data in val.items():\n        if 'values' in data:\n            values = data['values']\n            for quote in values:\n                candle = tuple(quote.values())\n                multi_index.append((symbol, candle[0]))\n                arr.append(candle[1:])\n\n    idx = pandas.MultiIndex.from_tuples(multi_index)\n\n    return pandas.DataFrame(arr, index=idx, columns=columns)\n\n\ndef parse_interval_in_minutes(interval):\n    \"\"\"\n    Parses the interval and tries to return its value as minutes.\n\n    :param interval: string such as 1min, 5min, 10h, 12week and etc.\n    :returns: int or None\n    \"\"\"\n\n    # Pytimeparse can't handle months, so we replace 1 month with 5 weeks. \n    # The value is not exact, but it is quite acceptable for our needs\n    if 'month' in interval:\n        tmp = interval.replace('month', '').strip()\n        if tmp.isnumeric():\n            interval = \"{}week\".format(5 * int(tmp))\n\n    secs = pytimeparse.parse(interval)\n\n    if secs is not None:\n        return secs / 60\n    else:\n        return None\n"
  },
  {
    "path": "src/twelvedata/websocket.py",
    "content": "import time\nimport threading\nimport json\nimport logging\nimport queue\n\nMAX_QUEUE_SIZE = 12000\n\n\nclass TDWebSocket:\n    def __init__(self, ctx):\n        self.apikey = ctx.apikey\n        self.self_heal_time_s = 1 if ctx.self_heal_time_s is None else ctx.self_heal_time_s\n        self.defaults = ctx.defaults\n\n        self.ws = None\n        self.ready = False\n        self.event_receiver = None\n        self.event_handler = None\n        self.last_queue_warning_time = 0\n        self.subscribed_symbols = set()\n\n        self.logger = self.set_default_logger()\n        self.symbols = self.set_default_symbols()\n        self.events = self.set_default_events_queue()\n        self.on_event = self.set_default_event_function()\n\n        self.url = \"wss://ws.twelvedata.com/v1/quotes/price?apikey={}\".format(self.apikey)\n\n        EventHandler(self).start()\n\n    def set_default_logger(self):\n        if \"logger\" in self.defaults:\n            return self.defaults[\"logger\"]\n\n        formatter = logging.Formatter(\"%(asctime)s - %(name)s - %(levelname)s - %(message)s\")\n        handler = logging.StreamHandler()\n        handler.setFormatter(formatter)\n        logger = logging.getLogger(\"ws-twelvedata\")\n        if \"log_level\" in self.defaults:\n            log_level = self.defaults[\"log_level\"]\n            if log_level == \"debug\":\n                logger.setLevel(logging.DEBUG)\n            elif log_level == \"info\":\n                logger.setLevel(logging.INFO)\n            else:\n                logger.setLevel(logging.NOTSET)\n        logger.addHandler(handler)\n        return logger\n\n    def set_default_symbols(self):\n        if \"symbols\" in self.defaults:\n            if isinstance(self.defaults[\"symbols\"], str):\n                return {self.defaults[\"symbols\"].upper()}\n            return set(self.normalize_symbols(self.defaults[\"symbols\"]))\n        return set()\n\n    def set_default_events_queue(self):\n        if \"max_queue_size\" in self.defaults:\n            return queue.Queue(maxsize=self.defaults[\"max_queue_size\"])\n        return queue.Queue(maxsize=MAX_QUEUE_SIZE)\n\n    def set_default_event_function(self):\n        if \"on_event\" in self.defaults:\n            if not callable(self.defaults[\"on_event\"]):\n                raise ValueError(\"Parameter 'on_event' must be a function\")\n            else:\n                return self.defaults[\"on_event\"]\n        return None\n\n    def connect(self):\n        self.logger.info(\"Connecting...\")\n        self.ready = False\n        self.subscribed_symbols = set()\n\n        if self.ws:\n            self.ws.close()\n            time.sleep(1)\n\n        while True:\n            try:\n                self.refresh_websocket()\n                break\n            except Exception as e:\n                self.logger.error(\"Cannot connect: {}. Retrying...\".format(e))\n                time.sleep(self.self_heal_time_s)\n\n    def disconnect(self):\n        self.ready = False\n        self.subscribed_symbols = set()\n\n        if self.ws:\n            self.ws.close()\n            time.sleep(1)\n\n    def keep_alive(self):\n        self.logger.info('Method keep_alive is deprecated, use heartbeat method instead')\n        self.heartbeat()\n\n    def heartbeat(self):\n        if not self.ready:\n            return\n\n        try:\n            self.ws.send('{\"action\": \"heartbeat\"}')\n        except Exception as e:\n            self.logger.error(\"Error calling heartbeat method: {}\".format(e))\n\n    def refresh_websocket(self):\n        self.event_receiver = EventReceiver(self)\n        self.event_receiver.start()\n\n    def self_heal(self):\n        time.sleep(self.self_heal_time_s)\n        self.connect()\n\n    def on_connect(self):\n        self.ready = True\n        self.update_subscription_symbols()\n\n    def on_queue_full(self):\n        if time.time() - self.last_queue_warning_time > 1:\n            self.logger.error(\"Event queue is full. New events are not added.\")\n            self.last_queue_warning_time = time.time()\n\n    def subscribe(self, symbols):\n        if isinstance(symbols, str):\n            symbols = [symbols.upper()]\n        else:\n            symbols = self.normalize_symbols(symbols)\n\n        self.symbols = self.symbols | set(symbols)\n        self.update_subscription_symbols()\n\n    def unsubscribe(self, symbols):\n        if isinstance(symbols, str):\n            symbols = [symbols.upper()]\n        else:\n            symbols = self.normalize_symbols(symbols)\n\n        self.symbols = self.symbols - set(symbols)\n        self.update_subscription_symbols()\n\n    def reset(self):\n        self.symbols = set()\n        self.subscribed_symbols = set()\n        self.ws.send('{\"action\": \"reset\"}')\n\n    def update_subscription_symbols(self):\n        if not self.ready:\n            return\n\n        # Subscribe\n        new_symbols = self.symbols - self.subscribed_symbols\n        if len(new_symbols) > 0:\n            self.logger.debug(\"New symbols: {}\".format(new_symbols))\n            ev = self.subscribe_event(new_symbols)\n            self.ws.send(json.dumps(ev))\n\n        # Unsubscribe\n        remove_symbols = self.subscribed_symbols - self.symbols\n        if len(remove_symbols) > 0:\n            self.logger.debug(\"Removed symbols: {}\".format(remove_symbols))\n            ev = self.unsubscribe_event(remove_symbols)\n            self.ws.send(json.dumps(ev))\n\n        self.subscribed_symbols = self.symbols.copy()\n        self.logger.debug(\"Current symbols: {}\".format(self.subscribed_symbols))\n\n    @staticmethod\n    def normalize_symbols(s):\n        return set([el.upper() for el in s])\n\n    @staticmethod\n    def subscribe_event(symbols):\n        return {\n            \"action\": \"subscribe\",\n            \"params\": {\n                \"symbols\": \",\".join(list(symbols))\n            }\n        }\n\n    @staticmethod\n    def unsubscribe_event(symbols):\n        return {\n            \"action\": \"unsubscribe\",\n            \"params\": {\n                \"symbols\": \",\".join(list(symbols))\n            }\n        }\n\n\nclass EventReceiver(threading.Thread):\n    def __init__(self, client, ping_interval=15, ping_timeout=10):\n        threading.Thread.__init__(self)\n        self.daemon = True\n        self.client = client\n        self.enabled = True\n        self.ping_interval = ping_interval\n        self.ping_timeout = ping_timeout\n\n    def run(self):\n        import websocket\n        self.client.ws = websocket.WebSocketApp(\n            self.client.url,\n            on_open=self.on_open,\n            on_close=self.on_close,\n            on_message=self.on_message,\n            on_error=self.on_error\n        )\n\n        self.client.logger.debug(\"EventReceiver ready\")\n        self.client.ws.run_forever(\n            ping_interval=self.ping_interval,\n            ping_timeout=self.ping_timeout,\n            ping_payload='ping',\n        )\n        self.client.logger.debug(\"EventReceiver exiting\")\n\n    def on_open(self, _):\n        self.client.logger.info(\"TDWebSocket opened!\")\n        self.client.on_connect()\n\n    def on_close(self, _, close_status_code, close_msg):\n        self.client.logger.info(\n            \"TDWebSocket closed! Close status code: {0}, close message: {1}\".format(close_status_code, close_msg)\n        )\n\n    def on_error(self, _, error):\n        self.client.logger.error(\"TDWebSocket ERROR: {}\".format(error))\n        self.client.self_heal()\n\n    def on_message(self, _, message):\n        event = json.loads(message)\n        self.client.logger.debug(\"Received event: {}\".format(event))\n\n        try:\n            self.client.events.put_nowait(event)\n        except queue.Full:\n            self.client.on_queue_full()\n\n\nclass EventHandler(threading.Thread):\n    def __init__(self, client):\n        threading.Thread.__init__(self)\n        self.daemon = True\n        self.client = client\n\n    def run(self):\n        self.client.logger.debug(\"EventHandler ready\")\n        while True:\n            data = self.client.events.get()\n            if callable(self.client.on_event):\n                try:\n                    self.client.on_event(data)\n                except Exception as e:\n                    self.client.logger.error(e)\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "#!/usr/bin/env python\n# coding: utf-8\n"
  },
  {
    "path": "tests/test_client.py",
    "content": "#!/usr/bin/env python\n# coding: utf-8\n\nimport json\nimport pytest\nfrom requests import Response\nfrom unittest.mock import patch, MagicMock, PropertyMock\n\nfrom matplotlib import pyplot as plt\nfrom twelvedata import TDClient\nfrom twelvedata.http_client import DefaultHttpClient\nfrom twelvedata.exceptions import (\n    BadRequestError,\n    InternalServerError,\n    InvalidApiKeyError,\n    TwelveDataError,\n)\n\n\n_cache = {}\n\n\nAPI_URL = 'https://api.twelvedata.com'\n\n\nclass CachedHttpClient(DefaultHttpClient, object):\n    def get(self, *args, **kwargs):\n        global _cache\n\n        h = \"{}{}\".format(args, kwargs)\n\n        if h in _cache:\n            return _cache[h]\n        else:\n            resp = super(CachedHttpClient, self).get(*args, **kwargs)\n            _cache[h] = resp\n            return resp\n\n\ndef _fake_resp(status_code):\n    resp = Response()\n    resp.status_code = status_code\n    return resp\n\n\ndef _fake_json_resp(json_content):\n    resp = MagicMock(spec=Response)\n    type(resp).ok = PropertyMock(return_value=True)\n    resp.json = MagicMock(return_value=json_content)\n    type(resp).headers = PropertyMock(return_value={})\n    resp.status_code = 200\n    return resp\n\n\ndef _init_client():\n    return TDClient(\n        \"demo\",\n        http_client=CachedHttpClient(API_URL),\n    )\n\n\ndef _init_ts():\n    td = _init_client()\n    return td.time_series(symbol=\"AAPL\", interval=\"1min\", outputsize=1)\n\n\ndef _init_batch_ts(symbols):\n    td = _init_client()\n    return td.time_series(symbol=symbols, interval=\"1min\", outputsize=1)\n\n\ndef test_get_stocks_list():\n    td = _init_client()\n    td.get_stocks_list(exchange='NASDAQ').as_json()\n    td.get_stocks_list(exchange='NASDAQ').as_csv()\n    td.get_stocks_list(exchange='NASDAQ').as_url()\n\n\ndef test_get_stock_exchanges_list():\n    td = _init_client()\n    td.get_stock_exchanges_list().as_json()\n    td.get_stock_exchanges_list().as_csv()\n    td.get_stock_exchanges_list().as_url()\n\n\ndef test_get_forex_pairs_list():\n    td = _init_client()\n    td.get_forex_pairs_list().as_json()\n    td.get_forex_pairs_list().as_csv()\n    td.get_forex_pairs_list().as_url()\n\n\ndef test_get_cryptocurrencies_list():\n    td = _init_client()\n    td.get_cryptocurrencies_list().as_json()\n    td.get_cryptocurrencies_list().as_csv()\n    td.get_cryptocurrencies_list().as_url()\n\n\ndef test_get_funds_list():\n    td = _init_client()\n    params = {'outputsize': 10, 'page': 0}\n    l = td.get_funds_list(**params).as_json()\n    assert len(l) > 0\n    td.get_funds_list(**params).as_csv()\n    td.get_funds_list(**params).as_url()\n\n\ndef test_get_bonds_list():\n    td = _init_client()\n    l = td.get_bonds_list().as_json()\n    assert len(l) > 0\n    td.get_bonds_list().as_csv()\n    td.get_bonds_list().as_url()\n\ndef test_get_etf_list():\n    td = _init_client()\n    td.get_etf_list().as_json()\n    td.get_etf_list().as_csv()\n    td.get_etf_list().as_url()\n\n\ndef test_get_indices_list():\n    td = _init_client()\n    td.get_indices_list().as_json()\n    td.get_indices_list().as_csv()\n    td.get_indices_list().as_url()\n\n\ndef test_get_technical_indicators_list():\n    td = _init_client()\n    td.get_technical_indicators_list().as_json()\n    td.get_technical_indicators_list().as_url()\n\n\ndef test_get_exchanges_list():\n    td = _init_client()\n    td.get_exchanges_list().as_json()\n    td.get_exchanges_list().as_csv()\n    td.get_exchanges_list().as_url()\n\n\ndef test_symbol_search():\n    td = _init_client()\n    td.symbol_search().as_json()\n    td.symbol_search().as_url()\n\n\ndef test_earliest_timestamp():\n    td = _init_client()\n    td.get_earliest_timestamp(symbol=\"AAPL\", interval=\"1day\").as_json()\n    td.get_earliest_timestamp(symbol=\"AAPL\", interval=\"1day\").as_url()\n\n\ndef test_market_state():\n    td = _init_client()\n    td.get_market_state().as_json()\n    td.get_market_state().as_url()\n\n\ndef test_exchange_rate():\n    td = _init_client()\n    td.exchange_rate(symbol=\"EUR/USD\").as_json()\n    td.exchange_rate(symbol=\"EUR/USD\").as_url()\n\n\ndef test_currency_conversion():\n    td = _init_client()\n    td.currency_conversion(symbol=\"EUR/USD\", amount=100).as_json()\n    td.currency_conversion(symbol=\"EUR/USD\", amount=100).as_url()\n\n\ndef test_quote():\n    td = _init_client()\n    td.quote(symbol=\"AAPL\").as_json()\n    td.quote(symbol=\"AAPL\").as_url()\n\n\ndef test_price():\n    td = _init_client()\n    td.price(symbol=\"AAPL\").as_json()\n    td.price(symbol=\"AAPL\").as_url()\n\n\ndef test_eod():\n    td = _init_client()\n    td.eod(symbol=\"AAPL\").as_json()\n    td.eod(symbol=\"AAPL\").as_url()\n\n\ndef test_api_usage():\n    td = _init_client()\n    td.api_usage().as_json()\n    td.api_usage().as_url()\n\n\ndef test_logo():\n    td = _init_client()\n    td.get_logo(symbol=\"AAPL\").as_json()\n    td.get_logo(symbol=\"AAPL\").as_url()\n\n\ndef test_profile():\n    td = _init_client()\n    td.get_profile(symbol=\"AAPL\").as_json()\n    td.get_profile(symbol=\"AAPL\").as_url()\n\n\ndef test_dividends():\n    td = _init_client()\n    td.get_dividends(symbol=\"AAPL\").as_json()\n    td.get_dividends(symbol=\"AAPL\").as_url()\n\n\ndef test_dividends_calendar():\n    td = _init_client()\n    td.get_dividends_calendar(symbol=\"AAPL\").as_json()\n    td.get_dividends_calendar(symbol=\"AAPL\").as_url()\n\n\ndef test_splits():\n    td = _init_client()\n    td.get_splits(symbol=\"AAPL\").as_json()\n    td.get_splits(symbol=\"AAPL\").as_url()\n\n\ndef test_splits_calendar():\n    td = _init_client()\n    td.get_splits_calendar(symbol=\"AAPL\").as_json()\n    td.get_splits_calendar(symbol=\"AAPL\").as_url()\n\n\ndef test_earnings():\n    td = _init_client()\n    td.get_earnings(symbol=\"AAPL\").as_json()\n    td.get_earnings(symbol=\"AAPL\").as_url()\n\n\ndef test_statistics():\n    td = _init_client()\n    td.get_statistics(symbol=\"AAPL\").as_json()\n    td.get_statistics(symbol=\"AAPL\").as_url()\n\n\ndef test_insider_transactions():\n    td = _init_client()\n    td.get_insider_transactions(symbol=\"AAPL\").as_json()\n    td.get_insider_transactions(symbol=\"AAPL\").as_url()\n\n\ndef test_income_statement():\n    td = _init_client()\n    td.get_income_statement(symbol=\"AAPL\").as_json()\n    td.get_income_statement(symbol=\"AAPL\").as_url()\n\n\ndef test_balance_sheet():\n    td = _init_client()\n    td.get_balance_sheet(symbol=\"AAPL\").as_json()\n    td.get_balance_sheet(symbol=\"AAPL\").as_url()\n\n\ndef test_cash_flow():\n    td = _init_client()\n    td.get_cash_flow(symbol=\"AAPL\").as_json()\n    td.get_cash_flow(symbol=\"AAPL\").as_url()\n\n\ndef test_options_expiration():\n    td = _init_client()\n    td.get_options_expiration(symbol=\"AAPL\").as_json()\n    td.get_options_expiration(symbol=\"AAPL\").as_url()\n\n\ndef test_options_chain():\n    td = _init_client()\n    expiration_date = td.get_options_expiration(symbol=\"AAPL\").as_json()['dates'][0]\n    td.get_options_chain(symbol=\"AAPL\", expiration_date=expiration_date).as_json()\n    td.get_options_chain(symbol=\"AAPL\", expiration_date=expiration_date).as_url()\n\n\ndef test_key_executives():\n    td = _init_client()\n    td.get_key_executives(symbol=\"AAPL\").as_json()\n    td.get_key_executives(symbol=\"AAPL\").as_url()\n\n\ndef test_institutional_holders():\n    td = _init_client()\n    td.get_institutional_holders(symbol=\"AAPL\").as_json()\n    td.get_institutional_holders(symbol=\"AAPL\").as_url()\n\n\ndef test_fund_holders():\n    td = _init_client()\n    td.get_fund_holders(symbol=\"AAPL\").as_json()\n    td.get_fund_holders(symbol=\"AAPL\").as_url()\n\n\ndef test_time_series():\n    ts = _init_ts()\n    ts.as_json()\n    ts.as_csv()\n    df = ts.as_pandas()\n    ts.as_plotly_figure()\n    ts.as_plotly_figure(df=df)\n    ts.as_url()\n    plt.close()\n\n\ndef test_time_series_get_ad():\n    ts = _init_ts()\n    ts.with_ad().as_json()\n    ts.with_ad().as_csv()\n    df = ts.with_ad().as_pandas()\n    ts.with_ad().as_plotly_figure()\n    ts.with_ad().as_plotly_figure(df=df)\n    ts.with_ad().as_url()\n    plt.close()\n\n\ndef test_time_series_get_adosc():\n    ts = _init_ts()\n    ts.with_adosc().as_json()\n    ts.with_adosc().as_csv()\n    ts.with_adosc().as_pandas()\n    ts.with_adosc().as_plotly_figure()\n    ts.with_adosc().as_url()\n    plt.close()\n\n\ndef test_time_series_get_adx():\n    ts = _init_ts()\n    ts.with_adx().as_json()\n    ts.with_adx().as_csv()\n    ts.with_adx().as_pandas()\n    ts.with_adx().as_plotly_figure()\n    ts.with_adx().as_url()\n    plt.close()\n\n\ndef test_time_series_get_adxr():\n    ts = _init_ts()\n    ts.with_adxr().as_json()\n    ts.with_adxr().as_csv()\n    ts.with_adxr().as_pandas()\n    ts.with_adxr().as_plotly_figure()\n    ts.with_adxr().as_url()\n    plt.close()\n\n\ndef test_time_series_get_apo():\n    ts = _init_ts()\n    ts.with_apo().as_json()\n    ts.with_apo().as_csv()\n    ts.with_apo().as_pandas()\n    ts.with_apo().as_plotly_figure()\n    ts.with_apo().as_url()\n    plt.close()\n\n\ndef test_time_series_get_aroon():\n    ts = _init_ts()\n    ts.with_aroon().as_json()\n    ts.with_aroon().as_csv()\n    ts.with_aroon().as_pandas()\n    ts.with_aroon().as_plotly_figure()\n    ts.with_aroon().as_url()\n    plt.close()\n\n\ndef test_time_series_get_aroonosc():\n    ts = _init_ts()\n    ts.with_aroonosc().as_json()\n    ts.with_aroonosc().as_csv()\n    ts.with_aroonosc().as_pandas()\n    ts.with_aroonosc().as_plotly_figure()\n    ts.with_aroonosc().as_url()\n    plt.close()\n\n\ndef test_time_series_get_atr():\n    ts = _init_ts()\n    ts.with_atr().as_json()\n    ts.with_atr().as_csv()\n    ts.with_atr().as_pandas()\n    ts.with_atr().as_plotly_figure()\n    ts.with_atr().as_url()\n    plt.close()\n\n\ndef test_time_series_get_avgprice():\n    ts = _init_ts()\n    ts.with_avgprice().as_json()\n    ts.with_avgprice().as_csv()\n    ts.with_avgprice().as_pandas()\n    ts.with_avgprice().as_plotly_figure()\n    ts.with_avgprice().as_url()\n    plt.close()\n\n\ndef test_time_series_get_bbands():\n    ts = _init_ts()\n    ts.with_bbands().as_json()\n    ts.with_bbands().as_csv()\n    ts.with_bbands().as_pandas()\n    ts.with_bbands().as_plotly_figure()\n    ts.with_bbands().as_url()\n    plt.close()\n\n\ndef test_time_series_get_beta():\n    ts = _init_ts()\n    ts.with_beta().as_json()\n    ts.with_beta().as_pandas()\n    ts.with_beta().as_plotly_figure()\n    ts.with_beta().as_url()\n    plt.close()\n\n\ndef test_time_series_get_percent_b():\n    ts = _init_ts()\n    ts.with_percent_b().as_json()\n    ts.with_percent_b().as_csv()\n    ts.with_percent_b().as_pandas()\n    ts.with_percent_b().as_plotly_figure()\n    ts.with_percent_b().as_url()\n    plt.close()\n\n\ndef test_time_series_get_bop():\n    ts = _init_ts()\n    ts.with_bop().as_json()\n    ts.with_bop().as_csv()\n    ts.with_bop().as_pandas()\n    ts.with_bop().as_plotly_figure()\n    ts.with_bop().as_url()\n    plt.close()\n\n\ndef test_time_series_get_cci():\n    ts = _init_ts()\n    ts.with_cci().as_json()\n    ts.with_cci().as_csv()\n    ts.with_cci().as_pandas()\n    ts.with_cci().as_plotly_figure()\n    ts.with_cci().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ceil():\n    ts = _init_ts()\n    ts.with_ceil().as_json()\n    ts.with_ceil().as_csv()\n    ts.with_ceil().as_pandas()\n    ts.with_ceil().as_plotly_figure()\n    ts.with_ceil().as_url()\n    plt.close()\n\n\ndef test_time_series_get_cmo():\n    ts = _init_ts()\n    ts.with_cmo().as_json()\n    ts.with_cmo().as_csv()\n    ts.with_cmo().as_pandas()\n    ts.with_cmo().as_plotly_figure()\n    ts.with_cmo().as_url()\n    plt.close()\n\n\ndef test_time_series_get_coppock():\n    ts = _init_ts()\n    ts.with_coppock().as_json()\n    ts.with_coppock().as_csv()\n    ts.with_coppock().as_pandas()\n    ts.with_coppock().as_plotly_figure()\n    ts.with_coppock().as_url()\n    plt.close()\n\n\ndef test_time_series_get_dema():\n    ts = _init_ts()\n    ts.with_dema().as_json()\n    ts.with_dema().as_csv()\n    ts.with_dema().as_pandas()\n    ts.with_dema().as_plotly_figure()\n    ts.with_dema().as_url()\n    plt.close()\n\n\ndef test_time_series_get_dx():\n    ts = _init_ts()\n    ts.with_dx().as_json()\n    ts.with_dx().as_csv()\n    ts.with_dx().as_pandas()\n    ts.with_dx().as_plotly_figure()\n    ts.with_dx().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ema():\n    ts = _init_ts()\n    ts.with_ema().as_json()\n    ts.with_ema().as_csv()\n    ts.with_ema().as_pandas()\n    ts.with_ema().as_plotly_figure()\n    ts.with_ema().as_url()\n    plt.close()\n\n\ndef test_time_series_get_exp():\n    ts = _init_ts()\n    ts.with_exp().as_json()\n    ts.with_exp().as_csv()\n    ts.with_exp().as_pandas()\n    ts.with_exp().as_plotly_figure()\n    ts.with_exp().as_url()\n    plt.close()\n\n\ndef test_time_series_get_floor():\n    ts = _init_ts()\n    ts.with_floor().as_json()\n    ts.with_floor().as_csv()\n    ts.with_floor().as_pandas()\n    ts.with_floor().as_plotly_figure()\n    ts.with_floor().as_url()\n    plt.close()\n\n\ndef test_time_series_get_heikinashicandles():\n    ts = _init_ts()\n    ts.with_heikinashicandles().as_json()\n    ts.with_heikinashicandles().as_csv()\n    ts.with_heikinashicandles().as_pandas()\n    ts.with_heikinashicandles().as_plotly_figure()\n    ts.with_heikinashicandles().as_url()\n    plt.close()\n\n\ndef test_time_series_get_hlc3():\n    ts = _init_ts()\n    ts.with_hlc3().as_json()\n    ts.with_hlc3().as_csv()\n    ts.with_hlc3().as_pandas()\n    ts.with_hlc3().as_plotly_figure()\n    ts.with_hlc3().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ht_dcperiod():\n    ts = _init_ts()\n    ts.with_ht_dcperiod().as_json()\n    ts.with_ht_dcperiod().as_csv()\n    ts.with_ht_dcperiod().as_pandas()\n    ts.with_ht_dcperiod().as_plotly_figure()\n    ts.with_ht_dcperiod().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ht_dcphase():\n    ts = _init_ts()\n    ts.with_ht_dcphase().as_json()\n    ts.with_ht_dcphase().as_csv()\n    ts.with_ht_dcphase().as_pandas()\n    ts.with_ht_dcphase().as_plotly_figure()\n    ts.with_ht_dcphase().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ht_phasor():\n    ts = _init_ts()\n    ts.with_ht_phasor().as_json()\n    ts.with_ht_phasor().as_csv()\n    ts.with_ht_phasor().as_pandas()\n    ts.with_ht_phasor().as_plotly_figure()\n    ts.with_ht_phasor().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ht_sine():\n    ts = _init_ts()\n    ts.with_ht_sine().as_json()\n    ts.with_ht_sine().as_csv()\n    ts.with_ht_sine().as_pandas()\n    ts.with_ht_sine().as_plotly_figure()\n    ts.with_ht_sine().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ht_trendline():\n    ts = _init_ts()\n    ts.with_ht_trendline().as_json()\n    ts.with_ht_trendline().as_csv()\n    ts.with_ht_trendline().as_pandas()\n    ts.with_ht_trendline().as_plotly_figure()\n    ts.with_ht_trendline().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ht_trendmode():\n    ts = _init_ts()\n    ts.with_ht_trendmode().as_json()\n    ts.with_ht_trendmode().as_csv()\n    ts.with_ht_trendmode().as_pandas()\n    ts.with_ht_trendmode().as_plotly_figure()\n    ts.with_ht_trendmode().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ichimoku():\n    ts = _init_ts()\n    ts.with_ichimoku().as_json()\n    ts.with_ichimoku().as_csv()\n    ts.with_ichimoku().as_pandas()\n    ts.with_ichimoku().as_plotly_figure()\n    ts.with_ichimoku().as_url()\n    plt.close()\n\n\ndef test_time_series_get_kama():\n    ts = _init_ts()\n    ts.with_kama().as_json()\n    ts.with_kama().as_csv()\n    ts.with_kama().as_pandas()\n    ts.with_kama().as_plotly_figure()\n    ts.with_kama().as_url()\n    plt.close()\n\n\ndef test_time_series_get_keltner():\n    ts = _init_ts()\n    ts.with_keltner().as_json()\n    ts.with_keltner().as_csv()\n    ts.with_keltner().as_pandas()\n    ts.with_keltner().as_plotly_figure()\n    ts.with_keltner().as_url()\n    plt.close()\n\n\ndef test_time_series_get_kst():\n    ts = _init_ts()\n    ts.with_kst().as_json()\n    ts.with_kst().as_csv()\n    ts.with_kst().as_pandas()\n    ts.with_kst().as_plotly_figure()\n    ts.with_kst().as_url()\n    plt.close()\n\n\ndef test_time_series_get_linearreg():\n    ts = _init_ts()\n    ts.with_linearreg().as_json()\n    ts.with_linearreg().as_csv()\n    ts.with_linearreg().as_pandas()\n    ts.with_linearreg().as_plotly_figure()\n    ts.with_linearreg().as_url()\n    plt.close()\n\n\ndef test_time_series_get_linearregangle():\n    ts = _init_ts()\n    ts.with_linearregangle().as_json()\n    ts.with_linearregangle().as_csv()\n    ts.with_linearregangle().as_pandas()\n    ts.with_linearregangle().as_plotly_figure()\n    ts.with_linearregangle().as_url()\n    plt.close()\n\n\ndef test_time_series_get_linearregintercept():\n    ts = _init_ts()\n    ts.with_linearregintercept().as_json()\n    ts.with_linearregintercept().as_csv()\n    ts.with_linearregintercept().as_pandas()\n    ts.with_linearregintercept().as_plotly_figure()\n    ts.with_linearregintercept().as_url()\n    plt.close()\n\n\ndef test_time_series_get_linearregslope():\n    ts = _init_ts()\n    ts.with_linearregslope().as_json()\n    ts.with_linearregslope().as_csv()\n    ts.with_linearregslope().as_pandas()\n    ts.with_linearregslope().as_plotly_figure()\n    ts.with_linearregslope().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ln():\n    ts = _init_ts()\n    ts.with_ln().as_json()\n    ts.with_ln().as_csv()\n    ts.with_ln().as_pandas()\n    ts.with_ln().as_plotly_figure()\n    ts.with_ln().as_url()\n    plt.close()\n\n\ndef test_time_series_get_log10():\n    ts = _init_ts()\n    ts.with_log10().as_json()\n    ts.with_log10().as_csv()\n    ts.with_log10().as_pandas()\n    ts.with_log10().as_plotly_figure()\n    ts.with_log10().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ma():\n    ts = _init_ts()\n    ts.with_ma().as_json()\n    ts.with_ma().as_csv()\n    ts.with_ma().as_pandas()\n    ts.with_ma().as_plotly_figure()\n    ts.with_ma().as_url()\n    plt.close()\n\n\ndef test_time_series_get_macd():\n    ts = _init_ts()\n    ts.with_macd().as_json()\n    ts.with_macd().as_csv()\n    ts.with_macd().as_pandas()\n    ts.with_macd().as_plotly_figure()\n    ts.with_macd().as_url()\n    plt.close()\n\n\ndef test_time_series_get_macdext():\n    ts = _init_ts()\n    ts.with_macdext().as_json()\n    ts.with_macdext().as_csv()\n    ts.with_macdext().as_pandas()\n    ts.with_macdext().as_plotly_figure()\n    ts.with_macdext().as_url()\n    plt.close()\n\n\ndef test_time_series_get_mama():\n    ts = _init_ts()\n    ts.with_mama().as_json()\n    ts.with_mama().as_csv()\n    ts.with_mama().as_pandas()\n    ts.with_mama().as_plotly_figure()\n    ts.with_mama().as_url()\n    plt.close()\n\n\ndef test_time_series_get_max():\n    ts = _init_ts()\n    ts.with_max().as_json()\n    ts.with_max().as_csv()\n    ts.with_max().as_pandas()\n    ts.with_max().as_plotly_figure()\n    ts.with_max().as_url()\n    plt.close()\n\n\ndef test_time_series_get_maxindex():\n    ts = _init_ts()\n    ts.with_maxindex().as_json()\n    ts.with_maxindex().as_csv()\n    ts.with_maxindex().as_pandas()\n    ts.with_maxindex().as_plotly_figure()\n    ts.with_maxindex().as_url()\n    plt.close()\n\n\ndef test_time_series_get_mcginley_dynamic():\n    ts = _init_ts()\n    ts.with_mcginley_dynamic().as_json()\n    ts.with_mcginley_dynamic().as_csv()\n    ts.with_mcginley_dynamic().as_pandas()\n    ts.with_mcginley_dynamic().as_plotly_figure()\n    ts.with_mcginley_dynamic().as_url()\n    plt.close()\n\n\ndef test_time_series_get_medprice():\n    ts = _init_ts()\n    ts.with_medprice().as_json()\n    ts.with_medprice().as_csv()\n    ts.with_medprice().as_pandas()\n    ts.with_medprice().as_plotly_figure()\n    ts.with_medprice().as_url()\n    plt.close()\n\n\ndef test_time_series_get_mfi():\n    ts = _init_ts()\n    ts.with_mfi().as_json()\n    ts.with_mfi().as_csv()\n    ts.with_mfi().as_pandas()\n    ts.with_mfi().as_plotly_figure()\n    ts.with_mfi().as_url()\n    plt.close()\n\n\ndef test_time_series_get_midpoint():\n    ts = _init_ts()\n    ts.with_midpoint().as_json()\n    ts.with_midpoint().as_csv()\n    ts.with_midpoint().as_pandas()\n    ts.with_midpoint().as_plotly_figure()\n    ts.with_midpoint().as_url()\n    plt.close()\n\n\ndef test_time_series_get_midprice():\n    ts = _init_ts()\n    ts.with_midprice().as_json()\n    ts.with_midprice().as_csv()\n    ts.with_midprice().as_pandas()\n    ts.with_midprice().as_plotly_figure()\n    ts.with_midprice().as_url()\n    plt.close()\n\n\ndef test_time_series_get_min():\n    ts = _init_ts()\n    ts.with_min().as_json()\n    ts.with_min().as_csv()\n    ts.with_min().as_pandas()\n    ts.with_min().as_plotly_figure()\n    ts.with_min().as_url()\n    plt.close()\n\n\ndef test_time_series_get_minindex():\n    ts = _init_ts()\n    ts.with_minindex().as_json()\n    ts.with_minindex().as_csv()\n    ts.with_minindex().as_pandas()\n    ts.with_minindex().as_plotly_figure()\n    ts.with_minindex().as_url()\n    plt.close()\n\n\ndef test_time_series_get_minmax():\n    ts = _init_ts()\n    ts.with_minmax().as_json()\n    ts.with_minmax().as_csv()\n    ts.with_minmax().as_pandas()\n    ts.with_minmax().as_plotly_figure()\n    ts.with_minmax().as_url()\n    plt.close()\n\n\ndef test_time_series_get_minmaxindex():\n    ts = _init_ts()\n    ts.with_minmaxindex().as_json()\n    ts.with_minmaxindex().as_csv()\n    ts.with_minmaxindex().as_pandas()\n    ts.with_minmaxindex().as_plotly_figure()\n    ts.with_minmaxindex().as_url()\n    plt.close()\n\n\ndef test_time_series_get_minus_di():\n    ts = _init_ts()\n    ts.with_minus_di().as_json()\n    ts.with_minus_di().as_csv()\n    ts.with_minus_di().as_pandas()\n    ts.with_minus_di().as_plotly_figure()\n    ts.with_minus_di().as_url()\n    plt.close()\n\n\ndef test_time_series_get_minus_dm():\n    ts = _init_ts()\n    ts.with_minus_dm().as_json()\n    ts.with_minus_dm().as_csv()\n    ts.with_minus_dm().as_pandas()\n    ts.with_minus_dm().as_plotly_figure()\n    ts.with_minus_dm().as_url()\n    plt.close()\n\n\ndef test_time_series_get_mom():\n    ts = _init_ts()\n    ts.with_mom().as_json()\n    ts.with_mom().as_csv()\n    ts.with_mom().as_pandas()\n    ts.with_mom().as_plotly_figure()\n    ts.with_mom().as_url()\n    plt.close()\n\n\ndef test_time_series_get_natr():\n    ts = _init_ts()\n    ts.with_natr().as_json()\n    ts.with_natr().as_csv()\n    ts.with_natr().as_pandas()\n    ts.with_natr().as_plotly_figure()\n    ts.with_natr().as_url()\n    plt.close()\n\n\ndef test_time_series_get_obv():\n    ts = _init_ts()\n    ts.with_obv().as_json()\n    ts.with_obv().as_csv()\n    ts.with_obv().as_pandas()\n    ts.with_obv().as_plotly_figure()\n    ts.with_obv().as_url()\n    plt.close()\n\n\ndef test_time_series_get_plus_di():\n    ts = _init_ts()\n    ts.with_plus_di().as_json()\n    ts.with_plus_di().as_csv()\n    ts.with_plus_di().as_pandas()\n    ts.with_plus_di().as_plotly_figure()\n    ts.with_plus_di().as_url()\n    plt.close()\n\n\ndef test_time_series_get_plus_dm():\n    ts = _init_ts()\n    ts.with_plus_dm().as_json()\n    ts.with_plus_dm().as_csv()\n    ts.with_plus_dm().as_pandas()\n    ts.with_plus_dm().as_plotly_figure()\n    ts.with_plus_dm().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ppo():\n    ts = _init_ts()\n    ts.with_ppo().as_json()\n    ts.with_ppo().as_csv()\n    ts.with_ppo().as_pandas()\n    ts.with_ppo().as_plotly_figure()\n    ts.with_ppo().as_url()\n    plt.close()\n\n\ndef test_time_series_get_roc():\n    ts = _init_ts()\n    ts.with_roc().as_json()\n    ts.with_roc().as_csv()\n    ts.with_roc().as_pandas()\n    ts.with_roc().as_plotly_figure()\n    ts.with_roc().as_url()\n    plt.close()\n\n\ndef test_time_series_get_rocp():\n    ts = _init_ts()\n    ts.with_rocp().as_json()\n    ts.with_rocp().as_csv()\n    ts.with_rocp().as_pandas()\n    ts.with_rocp().as_plotly_figure()\n    ts.with_rocp().as_url()\n    plt.close()\n\n\ndef test_time_series_get_rocr():\n    ts = _init_ts()\n    ts.with_rocr().as_json()\n    ts.with_rocr().as_csv()\n    ts.with_rocr().as_pandas()\n    ts.with_rocr().as_plotly_figure()\n    ts.with_rocr().as_url()\n    plt.close()\n\n\ndef test_time_series_get_rocr100():\n    ts = _init_ts()\n    ts.with_rocr100().as_json()\n    ts.with_rocr100().as_csv()\n    ts.with_rocr100().as_pandas()\n    ts.with_rocr100().as_plotly_figure()\n    ts.with_rocr100().as_url()\n    plt.close()\n\n\ndef test_time_series_get_rsi():\n    ts = _init_ts()\n    ts.with_rsi().as_json()\n    ts.with_rsi().as_csv()\n    ts.with_rsi().as_pandas()\n    ts.with_rsi().as_plotly_figure()\n    ts.with_rsi().as_url()\n    plt.close()\n\n\ndef test_time_series_get_sar():\n    ts = _init_ts()\n    ts.with_sar().as_json()\n    ts.with_sar().as_csv()\n    ts.with_sar().as_pandas()\n    ts.with_sar().as_plotly_figure()\n    ts.with_sar().as_url()\n    plt.close()\n\n\ndef test_time_series_get_sma():\n    ts = _init_ts()\n    ts.with_sma().as_json()\n    ts.with_sma().as_csv()\n    ts.with_sma().as_pandas()\n    ts.with_sma().as_plotly_figure()\n    ts.with_sma().as_url()\n    plt.close()\n\n\ndef test_time_series_get_sqrt():\n    ts = _init_ts()\n    ts.with_sqrt().as_json()\n    ts.with_sqrt().as_csv()\n    ts.with_sqrt().as_pandas()\n    ts.with_sqrt().as_plotly_figure()\n    ts.with_sqrt().as_url()\n    plt.close()\n\n\ndef test_time_series_get_stddev():\n    ts = _init_ts()\n    ts.with_stddev().as_json()\n    ts.with_stddev().as_csv()\n    ts.with_stddev().as_pandas()\n    ts.with_stddev().as_plotly_figure()\n    ts.with_stddev().as_url()\n    plt.close()\n\n\ndef test_time_series_get_stoch():\n    ts = _init_ts()\n    ts.with_stoch().as_json()\n    ts.with_stoch().as_csv()\n    ts.with_stoch().as_pandas()\n    ts.with_stoch().as_plotly_figure()\n    ts.with_stoch().as_url()\n    plt.close()\n\n\ndef test_time_series_get_stochf():\n    ts = _init_ts()\n    ts.with_stochf().as_json()\n    ts.with_stochf().as_csv()\n    ts.with_stochf().as_pandas()\n    ts.with_stochf().as_plotly_figure()\n    ts.with_stochf().as_url()\n    plt.close()\n\n\ndef test_time_series_get_stochrsi():\n    ts = _init_ts()\n    ts.with_stochrsi().as_json()\n    ts.with_stochrsi().as_csv()\n    ts.with_stochrsi().as_pandas()\n    ts.with_stochrsi().as_plotly_figure()\n    ts.with_stochrsi().as_url()\n    plt.close()\n\n\ndef test_time_series_get_supertrend():\n    ts = _init_ts()\n    ts.with_supertrend().as_json()\n    ts.with_supertrend().as_csv()\n    ts.with_supertrend().as_pandas()\n    ts.with_supertrend().as_plotly_figure()\n    ts.with_supertrend().as_url()\n    plt.close()\n\n\ndef test_time_series_get_t3ma():\n    ts = _init_ts()\n    ts.with_t3ma().as_json()\n    ts.with_t3ma().as_csv()\n    ts.with_t3ma().as_pandas()\n    ts.with_t3ma().as_plotly_figure()\n    ts.with_t3ma().as_url()\n    plt.close()\n\n\ndef test_time_series_get_tema():\n    ts = _init_ts()\n    ts.with_tema().as_json()\n    ts.with_tema().as_csv()\n    ts.with_tema().as_pandas()\n    ts.with_tema().as_plotly_figure()\n    ts.with_tema().as_url()\n    plt.close()\n\n\ndef test_time_series_get_trange():\n    ts = _init_ts()\n    ts.with_trange().as_json()\n    ts.with_trange().as_csv()\n    ts.with_trange().as_pandas()\n    ts.with_trange().as_plotly_figure()\n    ts.with_trange().as_url()\n    plt.close()\n\n\ndef test_time_series_get_trima():\n    ts = _init_ts()\n    ts.with_trima().as_json()\n    ts.with_trima().as_csv()\n    ts.with_trima().as_pandas()\n    ts.with_trima().as_plotly_figure()\n    ts.with_trima().as_url()\n    plt.close()\n\n\ndef test_time_series_get_tsf():\n    ts = _init_ts()\n    ts.with_tsf().as_json()\n    ts.with_tsf().as_csv()\n    ts.with_tsf().as_pandas()\n    ts.with_tsf().as_plotly_figure()\n    ts.with_tsf().as_url()\n    plt.close()\n\n\ndef test_time_series_get_typprice():\n    ts = _init_ts()\n    ts.with_typprice().as_json()\n    ts.with_typprice().as_csv()\n    ts.with_typprice().as_pandas()\n    ts.with_typprice().as_plotly_figure()\n    ts.with_typprice().as_url()\n    plt.close()\n\n\ndef test_time_series_get_ultosc():\n    ts = _init_ts()\n    ts.with_ultosc().as_json()\n    ts.with_ultosc().as_csv()\n    ts.with_ultosc().as_pandas()\n    ts.with_ultosc().as_plotly_figure()\n    ts.with_ultosc().as_url()\n    plt.close()\n\n\ndef test_time_series_get_var():\n    ts = _init_ts()\n    ts.with_var().as_json()\n    ts.with_var().as_csv()\n    ts.with_var().as_pandas()\n    ts.with_var().as_plotly_figure()\n    ts.with_var().as_url()\n    plt.close()\n\n\ndef test_time_series_get_vwap():\n    ts = _init_ts()\n    ts.with_vwap().as_json()\n    ts.with_vwap().as_csv()\n    ts.with_vwap().as_pandas()\n    ts.with_vwap().as_plotly_figure()\n    ts.with_vwap().as_url()\n    plt.close()\n\n\ndef test_time_series_get_wclprice():\n    ts = _init_ts()\n    ts.with_wclprice().as_json()\n    ts.with_wclprice().as_csv()\n    ts.with_wclprice().as_pandas()\n    ts.with_wclprice().as_plotly_figure()\n    ts.with_wclprice().as_url()\n    plt.close()\n\n\ndef test_time_series_get_willr():\n    ts = _init_ts()\n    ts.with_willr().as_json()\n    ts.with_willr().as_csv()\n    ts.with_willr().as_pandas()\n    ts.with_willr().as_plotly_figure()\n    ts.with_willr().as_url()\n    plt.close()\n\n\ndef test_time_series_get_wma():\n    ts = _init_ts()\n    ts.with_wma().as_json()\n    ts.with_wma().as_csv()\n    ts.with_wma().as_pandas()\n    ts.with_wma().as_plotly_figure()\n    ts.with_wma().as_url()\n    plt.close()\n\n\ndef _init_chart():\n    td = _init_client()\n    return (\n        td.time_series(symbol=\"AAPL\", interval=\"1min\")\n        .with_ad()\n        .with_adosc()\n        .with_adx()\n        .with_adxr()\n        .with_apo()\n        .with_aroon()\n        .with_aroonosc()\n        .with_atr()\n        .with_avgprice()\n        .with_bbands()\n        .with_beta()\n        .with_percent_b()\n        .with_bop()\n        .with_cci()\n        .with_ceil()\n        .with_cmo()\n        .with_coppock()\n        .with_ceil()\n        .with_dema()\n        .with_dx()\n        .with_ema()\n        .with_exp()\n        .with_floor()\n        .with_heikinashicandles()\n        .with_hlc3()\n        .with_ht_dcperiod()\n        .with_ht_dcphase()\n        .with_ht_phasor()\n        .with_ht_sine()\n        .with_ht_trendline()\n        .with_ht_trendmode()\n        .with_ichimoku()\n        .with_kama()\n        .with_keltner()\n        .with_kst()\n        .with_linearreg()\n        .with_linearregangle()\n        .with_linearregintercept()\n        .with_linearregslope()\n        .with_ln()\n        .with_log10()\n        .with_ma()\n        .with_macd()\n        .with_macdext()\n        .with_mama()\n        .with_max()\n        .with_maxindex()\n        .with_mcginley_dynamic()\n        .with_medprice()\n        .with_midpoint()\n        .with_midprice()\n        .with_min()\n        .with_minindex()\n        .with_minmax()\n        .with_minmaxindex()\n        .with_minus_di()\n        .with_minus_dm()\n        .with_mom()\n        .with_natr()\n        .with_obv()\n        .with_plus_di()\n        .with_plus_dm()\n        .with_ppo()\n        .with_roc()\n        .with_rocp()\n        .with_rocr()\n        .with_rocr100()\n        .with_rsi()\n        .with_sar()\n        .with_sma()\n        .with_sqrt()\n        .with_stddev()\n        .with_stoch()\n        .with_stochf()\n        .with_stochrsi()\n        .with_supertrend()\n        .with_t3ma()\n        .with_tema()\n        .with_trange()\n        .with_trima()\n        .with_tsf()\n        .with_typprice()\n        .with_ultosc()\n        .with_var()\n        .with_vwap()\n        .with_wclprice()\n        .with_willr()\n        .with_wma()\n    )\n\n\ndef test_chart_json():\n    chart = _init_chart()\n    chart.as_json()\n\n\ndef test_chart_csv():\n    chart = _init_chart()\n    chart.as_csv()\n\n\ndef test_chart_pandas():\n    chart = _init_chart()\n    chart.as_pandas()\n\n\ndef test_chart_url():\n    chart = _init_chart()\n    chart.as_url()\n\n\n# def test_chart_plot():\n#     chart = _init_chart()\n#     chart.as_plotly_figure()\n    # plt.close()\n\n\ndef test_string_batch():\n    batch_ts = _init_batch_ts('AAPL,QQQ,IXIC,EUR/USD,BTC/USD,')\n    batch_ts.with_macd().with_stoch().as_json()\n    batch_ts.with_ema().with_bbands().as_pandas()\n    batch_ts.with_ema().with_bbands().as_url()\n\n\ndef test_list_batch():\n    batch_ts = _init_batch_ts(['AAPL', 'QQQ', 'IXIC', 'EUR/USD', 'BTC/USD'])\n    batch_ts.with_macd().with_stoch().as_json()\n    batch_ts.with_ema().with_bbands().as_pandas()\n    batch_ts.with_ema().with_bbands().as_url()\n\n\ndef test_tuple_batch():\n    batch_ts = _init_batch_ts(('AAPL', 'QQQ', 'IXIC', 'EUR/USD', 'BTC/USD'))\n    batch_ts.with_macd().with_stoch().as_json()\n    batch_ts.with_ema().with_bbands().as_pandas()\n    batch_ts.with_ema().with_bbands().as_url()\n\n\ndef test_tuple_batch_one_symbol():\n    batch_ts = _init_batch_ts(('AAPL',))\n    batch_ts.with_macd().with_stoch().as_json()\n    batch_ts.with_ema().with_bbands().as_pandas()\n    batch_ts.with_ema().with_bbands().as_url()\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_resp(500))\ndef test_http_internal_server_error_response(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(InternalServerError):\n        http_client.get('/fake_url')\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_json_resp(\n    json.loads('{\"status\": \"error\", \"code\": 500, \"message\": \"error message\"}')),\n)\ndef test_http_internal_server_error_response_in_json(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(InternalServerError) as err:\n        http_client.get('/fake_url')\n        assert str(err) == 'error message'\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_resp(400))\ndef test_http_bad_request_error_response(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(BadRequestError):\n        http_client.get('/fake_url')\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_json_resp(\n    json.loads('{\"status\": \"error\", \"code\": 400, \"message\": \"error message\"}')),\n       )\ndef test_http_bad_request_error_response_in_json(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(BadRequestError) as err:\n        http_client.get('/fake_url')\n        assert str(err) == 'error message'\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_resp(401))\ndef test_http_invalid_api_key_response(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(InvalidApiKeyError):\n        http_client.get('/fake_url')\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_json_resp(\n    json.loads('{\"status\": \"error\", \"code\": 401, \"message\": \"error message\"}')),\n       )\ndef test_http_invalid_api_key_response_in_json(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(InvalidApiKeyError) as err:\n        http_client.get('/fake_url')\n        assert str(err) == 'error message'\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_resp(520))\ndef test_http_other_invalid_response(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(TwelveDataError):\n        http_client.get('/fake_url')\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n\n\n@patch('twelvedata.http_client.Session.get', return_value=_fake_json_resp(\n    json.loads('{\"status\": \"error\", \"code\": 520, \"message\": \"error message\"}')),\n       )\ndef test_http_other_invalid_response_in_json(mock_get):\n    http_client = DefaultHttpClient(API_URL)\n    with pytest.raises(TwelveDataError) as err:\n        http_client.get('/fake_url')\n        assert str(err) == 'error message'\n    mock_get.assert_called_once_with(API_URL + '/fake_url', timeout=30, params={'source': 'python'})\n"
  }
]