diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 000000000..01718db57 --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1,3 @@ +service_name: travis-pro +repo_token: F6QyEab3wPS7COXdw8oPCVrU3ogNj44dm +parallel: true # if the CI is running your build in parallel \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE/bug_report.md similarity index 55% rename from .github/ISSUE_TEMPLATE.md rename to .github/ISSUE_TEMPLATE/bug_report.md index 363a3d44d..820398280 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,16 +1,26 @@ +--- +name: Bug report +about: Create a report to help us improve + +--- + ## Step 1: Have you search for this issue before posting it? -If you have discovered a bug in the bot, please [search our issue tracker](https://github.com/Trading-Bot/CryptoBot/issues?q=is%3Aissue). +If you have discovered a bug in the bot, please [search our issue tracker](https://github.com/Drakkar-Software/OctoBot/issues?q=is%3Aissue). If it hasn't been reported, please create a new issue. ## Step 2: Describe your environment - + * OS : [Windows, Ubuntu, Debian, Raspbian...] * Python Version: _____ (`python -V`) * Branch: Master | Dev * Last Commit ID: _____ (`git log --format="%H" -n 1`) ## Step 3: Describe the problem: -*Explain the problem you have encountered* +**Describe the bug** +A clear and concise description of what the bug is. + +**Expected behavior** +A clear and concise description of what you expected to happen. ### Steps to reproduce: @@ -24,7 +34,8 @@ If it hasn't been reported, please create a new issue. * What did you expect to happen? ### Relevant code exceptions or logs: - - ``` - // paste your log here - ``` \ No newline at end of file +If applicable, add screenshots to help explain your problem. + +``` +// paste your log here +``` diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..45b79f4db --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,18 @@ +--- +name: Feature request +about: Suggest an idea for this project + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +- Add any other context or screenshots about the feature request here. +- You can link a github gist to explain the feature diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3151e71c3..f5d9f4ab9 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,5 @@ Thank you for sending your pull request. -But first, have you included unit tests, and is your code PEP8 conformant? [More details](https://github.com/Trading-Bot/CryptoBot/blob/dev/CONTRIBUTING.md) +But first, have you included unit tests, and is your code PEP8 conformant? [More details](https://github.com/Drakkar-Software/OctoBot/blob/dev/CONTRIBUTING.md) ## Summary Explain in one sentence the goal of this PR diff --git a/.gitignore b/.gitignore index c8707b2fa..92fa12b78 100644 --- a/.gitignore +++ b/.gitignore @@ -104,10 +104,20 @@ ENV/ .mypy_cache/ # config -config.json +config/config.json -# modules +# evaluators /.gitmodules evaluator/.gitignore +**/Default/*.* **/Advanced/*.* +# Specific config +config/evaluator_config.json + +# Data +backtesting/collector/data/** + +logs/matrix_history\.data + +logs/OctoBot\.log\.* diff --git a/.travis.yml b/.travis.yml index 7b0f7865d..91689e7b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,13 +2,16 @@ sudo: enabled language: python python: - 3.6 -notifications: +notifications: slack: "cryptobotgroupe:vYDDCLRne52jPGVtN6cMiUkb" email: false install: - - ./docs/install/install-ta-lib.sh - - cp ./docs/install/config_test.json ./config/config.json - - python -m pip install -r requirements.txt -script: pytest tests/ + - sudo ./docs/install/linux_installer.sh + - pip3 install -r requirements.txt + - pip3 install -r dev_requirements.txt + - cp ./config/default_config.json ./config/config.json + - python3 start.py -p install all +script: + - pytest --cov-report term --cov=. tests/unit_tests/ diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..299e403ea --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at herklos.dev@protonmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b4bc08133..a2e8a8688 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contribute to CryptoBot +# Contribute to OctoBot Feel like our bot is missing a feature? We welcome your pull requests! Few pointers for contributions: diff --git a/Dockerfile b/Dockerfile index 946b41397..a7f6e1e61 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,11 +1,29 @@ -#Download base image ubuntu 16.04 -FROM ubuntu:16.04 +FROM python:3 -# Update Ubuntu Software repository +# Update Software repository RUN apt-get update +RUN apt install git -y -RUN bash ./docs/install/install-ta-lib.sh +# Set up dev environment +WORKDIR /bot +RUN git clone https://github.com/Drakkar-Software/OctoBot /bot/octobot +WORKDIR /bot/octobot +RUN git checkout dev -RUN cp ./docs/install/config_test.json ./config/config.json +# install dependencies +RUN bash ./docs/install/linux_installer.sh -RUN python3 -m pip install -r requirements.txt \ No newline at end of file +# configuration +RUN cp ./config/default_config.json ./config/config.json +RUN cp ./config/default_evaluator_config.json ./config/evaluator_config.json + +# python libs +RUN pip3 install -U setuptools +RUN pip3 install -r requirements.txt + +# install evaluators +RUN python start.py -p install all + +# entry point +ENTRYPOINT ["python"] +CMD ["start.py"] diff --git a/LICENSE b/LICENSE index 3ed2bb8fc..261eeb9e9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,21 +1,201 @@ -MIT License - -Copyright (c) 2018 Herklos - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 123012e57..6d74a3de3 100644 --- a/README.md +++ b/README.md @@ -1,120 +1,53 @@ -# CryptoBot [![Codacy Badge](https://api.codacy.com/project/badge/Grade/c83a127c42ba4a389ca86a92fba7c53c)](https://www.codacy.com/app/paul.bouquet/CryptoBot?utm_source=github.com&utm_medium=referral&utm_content=Trading-Bot/CryptoBot&utm_campaign=Badge_Grade) [![Build Status](https://api.travis-ci.org/Trading-Bot/CryptoBot.svg?branch=dev)](https://travis-ci.org/Trading-Bot/CryptoBot) +# OctoBot [0.1.0-beta](https://github.com/Drakkar-Software/OctoBot/tree/dev/docs/CHANGELOG.md) +[![Codacy Badge](https://api.codacy.com/project/badge/Grade/c83a127c42ba4a389ca86a92fba7c53c)](https://www.codacy.com/app/paul.bouquet/OctoBot?utm_source=github.com&utm_medium=referral&utm_content=Drakkar-Software/OctoBot&utm_campaign=Badge_Grade) [![Build Status](https://api.travis-ci.org/Drakkar-Software/OctoBot.svg?branch=dev)](https://travis-ci.org/Drakkar-Software/OctoBot) [![Coverage Status](https://coveralls.io/repos/github/Drakkar-Software/OctoBot/badge.svg?branch=dev)](https://coveralls.io/github/Drakkar-Software/OctoBot?branch=dev) [![Code Factor](https://www.codefactor.io/repository/github/Drakkar-Software/OctoBot/badge)](https://www.codefactor.io/repository/github/Drakkar-Software/OctoBot/overview/dev) [![Build Status](https://semaphoreci.com/api/v1/herklos/octobot/branches/dev/shields_badge.svg)](https://semaphoreci.com/herklos/octobot) [![Codefresh build status]( https://g.codefresh.io/api/badges/build?repoOwner=Drakkar-Software&repoName=OctoBot&branch=dev&pipelineName=OctoBot&accountName=herklos_marketplace&type=cf-1)]( https://g.codefresh.io/repositories/Drakkar-Software/OctoBot/builds?filter=trigger:build;branch:dev;service:5b06a377435197b088b1757a~OctoBot) +

+Octobot Logo +

-#### Version 0.0.8-alpha ([changelog](https://github.com/Trading-Bot/CryptoBot/tree/master/docs/CHANGELOG.md)) +![Web Interface](../assets/web-interface.gif) +## Description +Octobot is a powerful fully modular open-source cryptocurrency trading robot. -## Disclaimer -This software is for educational purposes only. Do not risk money which -you are afraid to lose. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHORS -AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR TRADING RESULTS. +This repository contains all the features of the bot (trading tools, interfaces, services, ...) without any modules (Octobot's tentacles). -Always start by running a trading bot in simulation mode and do not engage money -before you understand how it works and what profit/loss you should -expect. +To install tentacles, you just have to use the [integrated tentacle manager](https://github.com/Drakkar-Software/OctoBot/wiki/Tentacle-Manager) +and your OctoBot is ready ! -We strongly recommend you to have coding and Python knowledge. Do not -hesitate to read the source code and understand the mechanism of this bot. +## Your Octobot +![Telegram Interface](../assets/telegram-interface.png) +[![Twitter Interface](../assets/twitter-interface.png)](https://twitter.com/HerklosBotCrypt) -Moreover, we are in the **alpha** phase so you should not expect the bot to be stable. +OctoBot is highly customizable using its configuration and tentacles system. You can therefore build your own bot using the infinite [configuration](https://github.com/Drakkar-Software/OctoBot/wiki/Configuration) possibilities. -## Demo -See live demo [here](https://twitter.com/HerklosBotCrypt) +Octobot's main feature is **evolution** : you can [install](https://github.com/Drakkar-Software/OctoBot/wiki/Tentacle-Manager), +[modify](https://github.com/Drakkar-Software/OctoBot/wiki/Customize-your-OctoBot) and even [create](https://github.com/Drakkar-Software/OctoBot/wiki/Customize-your-OctoBot) any tentacle you want to build your ideal cryptocurrency trading robot. You can even share your OctoBot evolutions ! -## Install -See [installation wiki page](https://github.com/Trading-Bot/CryptoBot/wiki/Installation) -``` -git clone https://github.com/Trading-Bot/CryptoBot -cd CryptoBot -pip install -r requirements.txt -``` +## Exchanges +[![Binance](../assets/binance-logo.png)](https://www.binance.com) +[![Bitfinex](../assets/bitfinex-logo.png)](https://www.bitfinex.com) +[![Bittrex](../assets/bittrex-logo.png)](https://bittrex.com) -## Configuration -Create a **config.json** file in the **config folder** with the following example : -``` -Rename config/default_config.json to config/config.json -``` +Octobot supports many [exchanges](https://github.com/Drakkar-Software/OctoBot/wiki/Exchanges#octobot-official-supported-exchanges) thanks to the [ccxt library](https://github.com/ccxt/ccxt). +To activate trading on an exchange, just configure OctoBot with your api keys as described [on the wiki](https://github.com/Drakkar-Software/OctoBot/wiki/Exchanges). -### More configuration -See [Configuration Wiki](https://github.com/Herklos-Bots/CryptoBot/wiki/Configuration) -``` -"crypto_currencies": { - "Bitcoin": { - "pairs" : ["BTC/USDT"] - } -} -``` -See [Exchanges Wiki](https://github.com/Herklos-Bots/CryptoBot/wiki/Exchanges) -``` -"exchanges": { - "binance": { - "api-key": "", - "api-secret": "" - } -} -``` -See [Notifications Wiki](https://github.com/Herklos-Bots/CryptoBot/wiki/Notifications) -``` -"notification":{ - "enabled": true, - "type": [1, 2] -} -``` -See [Trader Wiki](https://github.com/Herklos-Bots/CryptoBot/wiki/Trader) -``` -"trader":{ - "enabled": false, - "risk": 0.5 -} -``` -See [Simulator Wiki](https://github.com/Herklos-Bots/CryptoBot/wiki/Simulator) -``` -"simulator":{ - "enabled": true, - "risk": 0.5, - "starting_portfolio": { - "BTC": 10, - "USDT": 1000 - } -} -``` -See [Services Wiki](https://github.com/Herklos-Bots/CryptoBot/wiki/Services) -``` -"services": {} -``` - -## Usage -``` -python main.py -``` -## Customize you CryptoBot ! -### Adding implementations of any evaluator +## Installation +OctoBot's installation is **very simple**... because **very documented** ! -To add another implementation of an existing evaluator, 3 simple steps: -1. Create a class **inheriting** the evaluator to improve -2. Store it in the evaluator's ```Advanced``` folder (in ```CryptoBot/evaluator/evaluator_type/Advanced```). -3. In this ```Advanced``` folder, create or update the ```__init__.py``` file to add the following line: -```python -from .file_containing_new_implementation_name.py import * -``` -### Adding implementations of any analysis tool +Just follow the [installation wiki page](https://github.com/Drakkar-Software/OctoBot/wiki/Installation) and it's done ! -To add another implementation of an existing analysis tool, 3 simple steps: -1. Create a class inheriting the analyser to improve -2. Store it in the ```Advanced``` folder (in ```CryptoBot/evaluator/Util/Advanced```). -3. In this ```Advanced``` folder, create or update the ```__init__.py``` file to add the following line: -```python -from .file_containing_new_implementation_name.py import * -``` +## Usage +After the installation have a look at the +[usage wiki page](https://github.com/Drakkar-Software/OctoBot/wiki/Usage) to know all the features of the OctoBot. -More information and examples on the [wiki](https://github.com/Trading-Bot/CryptoBot/wiki/Customize-your-CryptoBot) +## Roadmap +[![Roadmap](../assets/roadmap.svg)](https://github.com/Drakkar-Software/OctoBot/tree/assets/roadmap.png) -## Testing -Use *pytest* command in the root folder : -``` -pytest -``` +## Disclaimer +Do not risk money which you are afraid to lose. USE THE SOFTWARE AT YOUR OWN RISK. THE AUTHORS +AND ALL AFFILIATES ASSUME NO RESPONSIBILITY FOR YOUR TRADING RESULTS. -## Changelog -See [changelog file](https://github.com/Trading-Bot/CryptoBot/tree/master/docs/CHANGELOG.md) +Always start by running a trading bot in simulation mode and do not engage money +before you understand how it works and what profit/loss you should +expect. -## More -For more details see the [project wiki](https://github.com/Herklos-Bots/CryptoBot/wiki). +Do not hesitate to read the source code and understand the mechanism of this bot. diff --git a/backtesting/__init__.py b/backtesting/__init__.py new file mode 100644 index 000000000..217693a8b --- /dev/null +++ b/backtesting/__init__.py @@ -0,0 +1,10 @@ +bot_instance = None + + +def __init__(bot): + global bot_instance + bot_instance = bot + + +def get_bot(): + return bot_instance diff --git a/trading/backtesting/__init__.py b/backtesting/analyser/__init__.py similarity index 100% rename from trading/backtesting/__init__.py rename to backtesting/analyser/__init__.py diff --git a/backtesting/backtesting.py b/backtesting/backtesting.py new file mode 100644 index 000000000..b12865bfb --- /dev/null +++ b/backtesting/backtesting.py @@ -0,0 +1,58 @@ +import logging +import time + +from backtesting import get_bot +from config.cst import * + + +class Backtesting: + def __init__(self, config, exchange_simulator): + self.config = config + self.begin_time = time.time() + self.time_delta = 0 + self.exchange_simulator = exchange_simulator + self.logger = logging.getLogger(self.__class__.__name__) + + def end(self): + self.logger.warning("Current backtesting version has a 2% precision error rate.") + + for symbol in self.exchange_simulator.get_symbols(): + self.report(symbol) + + # make sure to wait the end of threads process + time.sleep(3) + raise Exception("End of simulation in {0} sec".format(time.time() - self.begin_time)) + + def report(self, symbol): + market_data = self.exchange_simulator.get_data()[symbol][self.exchange_simulator.MIN_ENABLED_TIME_FRAME.value] + + self.time_delta = self.begin_time - market_data[0][PriceIndexes.IND_PRICE_TIME.value] / 1000 + + # profitability + total_profitability = 0 + for trader in get_bot().get_exchange_trader_simulators().values(): + _, profitability, _ = trader.get_trades_manager().get_profitability() + total_profitability += profitability + + # vs market + market_delta = self.get_market_delta(market_data) + + # log + self.logger.info( + "Profitability : Market {0}% | Crypto bot {1}%".format(market_delta * 100, total_profitability)) + + @staticmethod + def get_market_delta(market_data): + market_begin = market_data[0][PriceIndexes.IND_PRICE_CLOSE.value] + market_end = market_data[-1][PriceIndexes.IND_PRICE_CLOSE.value] + + if market_begin and market_end and market_begin > 0: + market_delta = market_end / market_begin - 1 if market_end >= market_begin else market_end / market_begin - 1 + else: + market_delta = 0 + + return market_delta + + @staticmethod + def enabled(config): + return CONFIG_BACKTESTING in config and config[CONFIG_BACKTESTING][CONFIG_ENABLED_OPTION] diff --git a/backtesting/collector/__init__.py b/backtesting/collector/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/backtesting/collector/data/.keep b/backtesting/collector/data/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/backtesting/collector/data_collector.py b/backtesting/collector/data_collector.py new file mode 100644 index 000000000..68e48a6b2 --- /dev/null +++ b/backtesting/collector/data_collector.py @@ -0,0 +1,46 @@ +import logging + +import ccxt + +from backtesting.collector.exchange_collector import ExchangeDataCollector +from config.cst import * +from trading.exchanges.exchange_manager import ExchangeManager + + +class DataCollector: + def __init__(self, config): + self.config = config + self.logger = logging.getLogger(self.__class__.__name__) + + self.exchange_data_collectors_threads = [] + self.logger.info("Create data collectors...") + + self.create_exchange_data_collectors() + + def create_exchange_data_collectors(self): + available_exchanges = ccxt.exchanges + for exchange_class_string in self.config[CONFIG_EXCHANGES]: + if exchange_class_string in available_exchanges: + exchange_type = getattr(ccxt, exchange_class_string) + + exchange_manager = ExchangeManager(self.config, exchange_type, is_simulated=False) + exchange_inst = exchange_manager.get_exchange() + + exchange_data_collector = ExchangeDataCollector(self.config, exchange_inst) + + if len(exchange_data_collector.get_symbols()) == 0 or len(exchange_data_collector.time_frames) == 0: + self.logger.warning("{0} exchange not started (not enough symbols or timeframes)" + .format(exchange_class_string)) + else: + exchange_data_collector.start() + self.exchange_data_collectors_threads.append(exchange_data_collector) + else: + self.logger.error("{0} exchange not found".format(exchange_class_string)) + + def stop(self): + for data_collector in self.exchange_data_collectors_threads: + data_collector.stop() + + def join(self): + for data_collector in self.exchange_data_collectors_threads: + data_collector.join() diff --git a/backtesting/collector/data_parser.py b/backtesting/collector/data_parser.py new file mode 100644 index 000000000..8b59f19eb --- /dev/null +++ b/backtesting/collector/data_parser.py @@ -0,0 +1,16 @@ +import json +import os + +from config.cst import CONFIG_DATA_COLLECTOR_PATH + + +class DataCollectorParser: + @staticmethod + def parse(file): + if os.path.isfile(CONFIG_DATA_COLLECTOR_PATH + file): + with open(CONFIG_DATA_COLLECTOR_PATH + file) as file_to_parse: + file_content = json.loads(file_to_parse.read()) + else: + with open(file) as file_to_parse: + file_content = json.loads(file_to_parse.read()) + return file_content diff --git a/backtesting/collector/exchange_collector.py b/backtesting/collector/exchange_collector.py new file mode 100644 index 000000000..cf1645610 --- /dev/null +++ b/backtesting/collector/exchange_collector.py @@ -0,0 +1,114 @@ +import json +import logging +import os +import threading +import time + +from config.cst import * +from tools.symbol_util import merge_currencies + + +class ExchangeDataCollector(threading.Thread): + Exchange_Data_Collector_File_Ext = ".data" + + def __init__(self, config, exchange): + super().__init__() + self.config = config + self.exchange = exchange + self.symbols = self.exchange.get_exchange_manager().get_traded_pairs() + self.keep_running = True + self.file = None + self._data_updated = False + + self.file_names = {} + self.file_contents = {} + self.time_frame_update = {} + + self.time_frames = [] + for time_frame in TimeFrames: + if self.exchange.get_exchange_manager().time_frame_exists(time_frame.value): + self.time_frames.append(time_frame) + + self.logger = logging.getLogger(self.__class__.__name__) + + def get_symbols(self): + return self.symbols + + def get_time_frames(self): + return self.time_frames + + def stop(self): + self.keep_running = False + + def _set_file_name(self, symbol): + return "{0}_{1}_{2}{3}".format(self.exchange.get_name(), + symbol.replace("/", "_"), + time.strftime("%Y%m%d_%H%M%S"), + self.Exchange_Data_Collector_File_Ext) + + @staticmethod + def get_file_name(file_name): + data = os.path.basename(file_name).split("_") + try: + exchange_name = data[0] + symbol = merge_currencies(data[1], data[2]) + timestamp = data[3] + data[4].replace(ExchangeDataCollector.Exchange_Data_Collector_File_Ext, "") + except KeyError: + exchange_name = None + symbol = None + timestamp = None + + return exchange_name, symbol, timestamp + + def _prepare_files(self): + for symbol in self.symbols: + self.file_contents[symbol] = {} + self.time_frame_update[symbol] = {} + self.file_names[symbol] = self._set_file_name(symbol) + for time_frame in self.time_frames: + self.file_contents[symbol][time_frame.value] = None + + def _prepare(self): + self.logger.info("{0} prepare...".format(self.exchange.get_name())) + self._prepare_files() + for symbol in self.symbols: + for time_frame in self.time_frames: + # write all available data for this time frame + self.file_contents[symbol][time_frame.value] = self.exchange.get_symbol_prices(symbol, + time_frame, + limit=None, + data_frame=False) + self.time_frame_update[symbol][time_frame] = time.time() + self._update_file(symbol) + + def _update_file(self, symbol): + with open(CONFIG_DATA_COLLECTOR_PATH + self.file_names[symbol], 'w') as json_file: + json.dump(self.file_contents[symbol], json_file) + + def run(self): + self._prepare() + self.logger.info("{0} updating...".format(self.exchange.get_name())) + while self.keep_running: + now = time.time() + + for symbol in self.symbols: + for time_frame in self.time_frames: + if now - self.time_frame_update[symbol][time_frame] \ + >= TimeFramesMinutes[time_frame] * MINUTE_TO_SECONDS: + result_df = self.exchange.get_symbol_prices(symbol, + time_frame, + limit=1, + data_frame=False)[0] + + self.file_contents[symbol][time_frame.value].append(result_df) + self._data_updated = True + self.time_frame_update[symbol][time_frame] = now + self.logger.info( + "{0} ({2}) on {1} updated".format(symbol, self.exchange.get_name(), time_frame)) + + if self._data_updated: + self._update_file(symbol) + self._data_updated = False + + final_sleep = DATA_COLLECTOR_REFRESHER_TIME - (time.time() - now) + time.sleep(final_sleep if final_sleep >= 0 else 0) diff --git a/bot.py b/bot.py deleted file mode 100644 index 53cae7064..000000000 --- a/bot.py +++ /dev/null @@ -1,202 +0,0 @@ -import logging -import sys -import traceback -from logging.config import fileConfig - -import ccxt - -from config.config import load_config -from config.cst import * -from evaluator.Util.advanced_manager import AdvancedManager -from evaluator.evaluator_creator import EvaluatorCreator -from evaluator.evaluator_threads_manager import EvaluatorThreadsManager -from evaluator.symbol_evaluator import SymbolEvaluator -from interfaces.web.app import WebApp -from tools import Notification -from tools.performance_analyser import PerformanceAnalyser -from trading import Exchange -from trading.trader.trader import Trader -from trading.trader.trader_simulator import TraderSimulator -from services import ServiceCreator - -"""Main CryptoBot class: -- Create all indicators and thread for each cryptocurrencies in config """ - - -class Crypto_Bot: - """ - Constructor : - - Load configs - """ - def __init__(self): - # Logger - fileConfig('config/logging_config.ini') - self.logger = logging.getLogger(self.__class__.__name__) - sys.excepthook = self._log_uncaught_exceptions - - # Version - self.logger.info("Version : {0}".format(VERSION)) - - # Config - self.logger.info("Load config file...") - self.config = load_config() - - # Advanced - AdvancedManager.create_class_list(self.config) - - # Interfaces - self.web_app = WebApp(self.config) - if self.web_app.enabled(): - self.web_app.start() - - # Debug tools - self.performance_analyser = None - if CONFIG_DEBUG_OPTION_PERF in self.config and self.config[CONFIG_DEBUG_OPTION_PERF]: - self.performance_analyser = PerformanceAnalyser() - - # TODO : CONFIG TEMP LOCATION - self.time_frames = [TimeFrames.THIRTY_MINUTES, TimeFrames.ONE_HOUR, TimeFrames.FOUR_HOURS, TimeFrames.ONE_DAY] - - # Add services to self.config[CONFIG_CATEGORY_SERVICES] - ServiceCreator.create_services(self.config) - - # Notifier - self.config[CONFIG_NOTIFICATION_INSTANCE] = Notification(self.config) - - # Notify starting - self.config[CONFIG_NOTIFICATION_INSTANCE].notify_with_all(NOTIFICATION_STARTING_MESSAGE) - - self.symbols_threads_manager = [] - self.exchange_traders = {} - self.exchange_trader_simulators = {} - self.exchanges_list = {} - self.symbol_evaluator_list = [] - self.dispatchers_list = [] - - def create_exchange_traders(self): - available_exchanges = ccxt.exchanges - for exchange_class_string in self.config[CONFIG_EXCHANGES]: - if exchange_class_string in available_exchanges: - exchange_type = getattr(ccxt, exchange_class_string) - - exchange_inst = Exchange(self.config, exchange_type) - - # create trader instance for this exchange - exchange_trader = Trader(self.config, exchange_inst) - exchange_trader_simulator = TraderSimulator(self.config, exchange_inst) - - self.exchanges_list[exchange_inst.get_name()] = exchange_inst - self.exchange_traders[exchange_inst.get_name()] = exchange_trader - self.exchange_trader_simulators[exchange_inst.get_name()] = exchange_trader_simulator - else: - self.logger.error("{0} exchange not found".format(exchange_class_string)) - - def create_evaluation_threads(self): - self.logger.info("Evaluation threads creation...") - - # create dispatchers - self.dispatchers_list = EvaluatorCreator.create_dispatchers(self.config) - - # create Social and TA evaluators - for crypto_currency, crypto_currency_data in self.config[CONFIG_CRYPTO_CURRENCIES].items(): - - # create symbol evaluator - symbol_evaluator = SymbolEvaluator(self.config, crypto_currency, self.dispatchers_list) - symbol_evaluator.set_traders(self.exchange_traders) - symbol_evaluator.set_trader_simulators(self.exchange_trader_simulators) - self.symbol_evaluator_list.append(symbol_evaluator) - - # create TA evaluators - for symbol in crypto_currency_data[CONFIG_CRYPTO_PAIRS]: - - for exchange in self.exchanges_list.values(): - if exchange.enabled(): - - # Verify that symbol exists on this exchange - if exchange.symbol_exists(symbol): - self._create_symbol_threads_managers(symbol, - exchange, - symbol_evaluator) - - # notify that exchange doesn't support this symbol - else: - self.logger.warning("{0} doesn't support {1}".format(exchange.get_name(), symbol)) - - def _create_symbol_threads_managers(self, symbol, exchange, symbol_evaluator): - # Create real time TA evaluators - real_time_ta_eval_list = EvaluatorCreator.create_real_time_ta_evals(self.config, - exchange, - symbol) - for time_frame in self.time_frames: - if exchange.time_frame_exists(time_frame.value): - self.symbols_threads_manager.append(EvaluatorThreadsManager(self.config, - symbol, - time_frame, - symbol_evaluator, - exchange, - real_time_ta_eval_list)) - - def start_threads(self): - if self.performance_analyser: - self.performance_analyser.start() - - for symbol_evaluator in self.symbol_evaluator_list: - symbol_evaluator.start_threads() - - for manager in self.symbols_threads_manager: - manager.start_threads() - - for thread in self.dispatchers_list: - thread.start() - - self.logger.info("Evaluation threads started...") - - def join_threads(self): - for manager in self.symbols_threads_manager: - manager.join_threads() - - for symbol_evaluator in self.symbol_evaluator_list: - symbol_evaluator.join_threads() - - for trader in self.exchange_traders: - self.exchange_traders[trader].join_order_manager() - - for trader_simulator in self.exchange_trader_simulators: - self.exchange_trader_simulators[trader_simulator].join_order_manager() - - for thread in self.dispatchers_list: - thread.join() - - if self.performance_analyser: - self.performance_analyser.join() - - def stop_threads(self): - # Notify stopping - self.config[CONFIG_NOTIFICATION_INSTANCE].notify_with_all(NOTIFICATION_STOPPING_MESSAGE) - - self.logger.info("Stopping threads ...") - for manager in self.symbols_threads_manager: - manager.stop_threads() - - for symbol_evaluator in self.symbol_evaluator_list: - symbol_evaluator.stop_threads() - - for trader in self.exchange_traders: - self.exchange_traders[trader].stop_order_manager() - - for trader_simulator in self.exchange_trader_simulators: - self.exchange_trader_simulators[trader_simulator].stop_order_manager() - - for thread in self.dispatchers_list: - thread.stop() - - if self.performance_analyser: - self.performance_analyser.stop() - - if self.web_app.enabled(): - self.web_app.stop() - - @staticmethod - def _log_uncaught_exceptions(ex_cls, ex, tb): - logging.exception(''.join(traceback.format_tb(tb))) - logging.exception('{0}: {1}'.format(ex_cls, ex)) diff --git a/config/config.py b/config/config.py index adff800e7..df25f4981 100644 --- a/config/config.py +++ b/config/config.py @@ -3,10 +3,13 @@ from config.cst import CONFIG_FILE -def load_config(config_file=CONFIG_FILE): +def load_config(config_file=CONFIG_FILE, error=True): try: with open(config_file) as json_data_file: config = json.load(json_data_file) return config except Exception: - raise Exception("Error when load config") + if error: + raise Exception("Error when load config") + else: + return None diff --git a/config/cst.py b/config/cst.py index 9e9ff4bb2..f87630b30 100644 --- a/config/cst.py +++ b/config/cst.py @@ -1,84 +1,151 @@ from enum import Enum -VERSION = "0.0.8-alpha" +SHORT_VERSION = "0.1.0" +REV_VERSION = "0" +VERSION_DEV_PHASE = "beta" +VERSION = "{0}-{1}".format(SHORT_VERSION, VERSION_DEV_PHASE) +LONG_VERSION = "{0}_{1}-{2}".format(SHORT_VERSION, REV_VERSION, VERSION_DEV_PHASE) +ORIGIN_URL = "https://github.com/Drakkar-Software/OctoBot.git" + +MSECONDS_TO_SECONDS = 1000 MINUTE_TO_SECONDS = 60 -START_PENDING_EVAL_NOTE = "0" # force exception -INIT_EVAL_NOTE = 0 -START_EVAL_PERTINENCE = 1 -MAX_TA_EVAL_TIME_SECONDS = 0.03 +HOURS_TO_SECONDS = MINUTE_TO_SECONDS * 60 +HOURS_TO_MSECONDS = MSECONDS_TO_SECONDS * MINUTE_TO_SECONDS * MINUTE_TO_SECONDS +DAYS_TO_SECONDS = HOURS_TO_SECONDS * 24 -MARKET_SEPARATOR = "/" +CONFIG_GLOBAL_UTILS = "global_utils" +CONFIG_ENABLED_OPTION = "enabled" +CONFIG_SYMBOL = "symbol" +# Files CONFIG_FILE = "config/config.json" -CONFIG_GLOBAL_UTILS = "global_utils" +CONFIG_EVALUATOR_FILE = "config/evaluator_config.json" + +# Advanced CONFIG_ADVANCED_CLASSES = "advanced_classes" CONFIG_ADVANCED_INSTANCES = "advanced_instances" -SPECIFIC_CONFIG_PATH = "config/specific_evaluator_config/" -CONFIG_REFRESH_RATE = "refresh_rate_seconds" -CONFIG_TIME_FRAME = "time_frame" -CONFIG_FILE_EXT = ".json" -CONFIG_CRYPTO_CURRENCIES = "crypto_currencies" -CONFIG_CRYPTO_PAIRS = "pairs" -# notification -NOTIFICATION_STARTING_MESSAGE = "CryptoBot v{0} starting...".format(VERSION) -NOTIFICATION_STOPPING_MESSAGE = "CryptoBot v{0} stopping...".format(VERSION) +# Backtesting +CONFIG_BACKTESTING = "backtesting" +CONFIG_BACKTESTING_DATA_FILES = "files" + +# Data collector +CONFIG_DATA_COLLECTOR = "data_collector" +CONFIG_DATA_COLLECTOR_ZIPLINE = "zipline" +DATA_COLLECTOR_REFRESHER_TIME = MINUTE_TO_SECONDS +CONFIG_DATA_COLLECTOR_PATH = "backtesting/collector/data/" + +# Trading +CONFIG_EXCHANGES = "exchanges" +CONFIG_EXCHANGE_WEB_SOCKET = "web_socket" +CONFIG_EXCHANGE_KEY = "api-key" +CONFIG_EXCHANGE_SECRET = "api-secret" +CONFIG_TRADER = "trader" +CONFIG_SIMULATOR = "trader_simulator" +CONFIG_STARTING_PORTFOLIO = "starting_portfolio" +CONFIG_TRADER_RISK = "risk" +CONFIG_TRADER_RISK_MIN = 0.05 +CONFIG_TRADER_RISK_MAX = 1 +ORDER_REFRESHER_TIME = 15 +SIMULATOR_LAST_PRICES_TO_CHECK = 15 +ORDER_CREATION_LAST_TRADES_TO_USE = 10 +CONFIG_TRADER_REFERENCE_MARKET = "reference_market" +DEFAULT_REFERENCE_MARKET = "BTC" +MARKET_SEPARATOR = "/" +CURRENCY_DEFAULT_MAX_PRICE_DIGITS = 8 + +CONFIG_PORTFOLIO_INFO = "info" +CONFIG_PORTFOLIO_FREE = "free" +CONFIG_PORTFOLIO_USED = "used" +CONFIG_PORTFOLIO_TOTAL = "total" + +# Notification +CONFIG_NOTIFICATION_INSTANCE = "notifier" +CONFIG_CATEGORY_NOTIFICATION = "notification" +NOTIFICATION_STARTING_MESSAGE = "OctoBot v{0} starting...".format(LONG_VERSION) +NOTIFICATION_STOPPING_MESSAGE = "OctoBot v{0} stopping...".format(LONG_VERSION) +REAL_TRADER_STR = "[Real Trader] " +SIMULATOR_TRADER_STR = "[Simulator] " + +# DEBUG options +CONFIG_DEBUG_OPTION_PERF = "performance_analyser" +CONFIG_DEBUG_OPTION_PERF_REFRESH_TIME_MIN = 5 +CONFIG_DEBUG_OPTION = "DEBUG" + +# SERVICES +CONFIG_CATEGORY_SERVICES = "services" +CONFIG_SERVICE_INSTANCE = "service_instance" # gmail CONFIG_GMAIL = "gmail" +# telegram +CONFIG_TELEGRAM = "telegram" +CONFIG_TOKEN = "token" + +# web +CONFIG_WEB = "web" +CONFIG_WEB_IP = "ip" +CONFIG_WEB_PORT = "port" +DEFAULT_SERVER_IP = '0.0.0.0' +DEFAULT_SERVER_PORT = 5001 + # twitter CONFIG_TWITTERS_ACCOUNTS = "accounts" CONFIG_TWITTERS_HASHTAGS = "hashtags" CONFIG_TWITTER = "twitter" +CONFIG_REDDIT = "reddit" +CONFIG_REDDIT_SUBREDDITS = "subreddits" +CONFIG_REDDIT_ENTRY = "entry" +CONFIG_REDDIT_ENTRY_WEIGHT = "entry_weight" CONFIG_TWITTER_API_INSTANCE = "twitter_api_instance" -CONFIG_ADDITIONAL_RESOURCES = "additional_resources" CONFIG_TWEET = "tweet" CONFIG_TWEET_DESCRIPTION = "tweet_description" -# DEBUG -CONFIG_DEBUG_OPTION_PERF = "PERF" -CONFIG_DEBUG_OPTION_PERF_REFRESH_TIME_MIN = 5 -CONFIG_DEBUG_OPTION = "DEBUG" - -CONFIG_ENABLED_OPTION = "enabled" - -CONFIG_EXCHANGES = "exchanges" -CONFIG_TRADER = "trader" -CONFIG_SIMULATOR = "simulator" -CONFIG_STARTING_PORTFOLIO = "starting_portfolio" -CONFIG_NOTIFICATION_INSTANCE = "notifier" -CONFIG_CATEGORY_NOTIFICATION = "notification" -CONFIG_CATEGORY_SERVICES = "services" -CONFIG_SERVICE_INSTANCE = "service_instance" - -CONFIG_TRADER_RISK = "risk" -CONFIG_TRADER_RISK_MIN = 0.05 -CONFIG_TRADER_RISK_MAX = 1 +# Evaluator +CONFIG_EVALUATOR = "evaluator" +SPECIFIC_CONFIG_PATH = "config/specific_evaluator_config/" +START_PENDING_EVAL_NOTE = "0" # force exception +INIT_EVAL_NOTE = 0 +START_EVAL_PERTINENCE = 1 +MAX_TA_EVAL_TIME_SECONDS = 0.1 +DEFAULT_WEBSOCKET_REAL_TIME_EVALUATOR_REFRESH_RATE_SECONDS = 1 +DEFAULT_REST_REAL_TIME_EVALUATOR_REFRESH_RATE_SECONDS = 60 +CONFIG_REFRESH_RATE = "refresh_rate_seconds" +CONFIG_TIME_FRAME = "time_frame" +CONFIG_FILE_EXT = ".json" +CONFIG_CRYPTO_CURRENCIES = "crypto_currencies" +CONFIG_CRYPTO_PAIRS = "pairs" +# Socials SOCIAL_EVALUATOR_NOT_THREADED_UPDATE_RATE = 1 +# Stats STATS_EVALUATOR_HISTORY_TIME = "relevant_history_months" STATS_EVALUATOR_MAX_HISTORY_TIME = 3 -ORDER_REFRESHER_TIME = 5 -SIMULATOR_LAST_PRICES_TO_CHECK = 10 - -CONFIG_TRADER_REFERENCE_MARKET = "reference_market" -DEFAULT_REFERENCE_MARKET = "BTC" - +# Tools DIVERGENCE_USED_VALUE = 30 -# e-7 -MARKET_MIN_PORTFOLIO_CREATE_ORDER = 0.0000001 -CURRENCY_MIN_PORTFOLIO_CREATE_ORDER = 0.0000001 - - -class EvaluatorRisk(Enum): - LOW = 1 - MEDIUM = 2 - HIGH = 3 +# Interfaces +CONFIG_INTERFACES = "interfaces" +CONFIG_INTERFACES_WEB = "web" +CONFIG_INTERFACES_TELEGRAM = "telegram" + +# Tentacles (packages) +GITHUB = "github" +GITHUB_RAW_CONTENT_URL = "https://raw.githubusercontent.com" +GITHUB_BASE_URL = "https://github.com" +TENTACLES_PUBLIC_REPOSITORY = "Drakkar-Software/OctoBot-Tentacles" +TENTACLES_PUBLIC_LIST = "tentacles_list.json" +TENTACLES_DEFAULT_BRANCH = "master" +EVALUATOR_DEFAULT_FOLDER = "Default" +EVALUATOR_ADVANCED_FOLDER = "Advanced" +CONFIG_TENTACLES_KEY = "tentacles" +TENTACLE_DESCRIPTION = "tentacle_description" +TENTACLE_DESCRIPTION_LOCALISATION = "localisation" +TENTACLE_DESCRIPTION_IS_URL = "is_url" class EvaluatorMatrixTypes(Enum): @@ -110,6 +177,15 @@ class PriceStrings(Enum): STR_PRICE_VOL = "vol" +class PriceIndexes(Enum): + IND_PRICE_TIME = 0 + IND_PRICE_OPEN = 1 + IND_PRICE_HIGH = 2 + IND_PRICE_LOW = 3 + IND_PRICE_CLOSE = 4 + IND_PRICE_VOL = 5 + + class TimeFrames(Enum): ONE_MINUTE = "1m" THREE_MINUTES = "3m" @@ -127,6 +203,9 @@ class TimeFrames(Enum): ONE_MONTH = "1M" +MIN_EVAL_TIME_FRAME = TimeFrames.FIVE_MINUTES + + TimeFramesMinutes = { TimeFrames.ONE_MINUTE: 1, TimeFrames.THREE_MINUTES: 3, @@ -162,15 +241,21 @@ class TimeFrames(Enum): TimeFrames.ONE_MONTH: 5, } +IMAGE_ENDINGS = ["png", "jpg", "jpeg", "gif", "jfif", "tiff", "bmp", "ppm", "pgm", "pbm", "pnm", "webp", "hdr", "heif", + "bat", "bpg", "svg", "cgm"] + class TradeOrderSide(Enum): - BUY = 1 - SELL = 2 + BUY = "buy" + SELL = "sell" class OrderStatus(Enum): - FILLED = 1 - PENDING = 2 + FILLED = "closed" + OPEN = "open" + PARTIALLY_FILLED = "partially_filled" + CANCELED = "canceled" + CLOSED = "closed" class TraderOrderType(Enum): @@ -229,3 +314,26 @@ class ExchangeConstantsTickersInfoColumns(Enum): FIRST_ID = "firstId" LAST_ID = "lastId" COUNT = "count" + + +class ExchangeConstantsMarketStatusColumns(Enum): + SYMBOL = "symbol" + ID = "id" + CURRENCY = "base" + MARKET = "quote" + ACTIVE = "active" + PRECISION = "precision" # number of decimal digits "after the dot" + PRECISION_PRICE = "price" + PRECISION_AMOUNT = "amount" + PRECISION_COST = "cost" + LIMITS = "limits" # value limits when placing orders on this market + LIMITS_AMOUNT = "amount" + LIMITS_AMOUNT_MIN = "min" # order amount should be > min + LIMITS_AMOUNT_MAX = "max" # order amount should be < max + LIMITS_PRICE = "price" # same min/max limits for the price of the order + LIMITS_PRICE_MIN = "min" # order price should be > min + LIMITS_PRICE_MAX = "max" # order price should be < max + LIMITS_COST = "cost" # same limits for order cost = price * amount + LIMITS_COST_MIN = "min" # order cost should be > min + LIMITS_COST_MAX = "max" # order cost should be < max + INFO = "info" diff --git a/config/default_config.json b/config/default_config.json index 907b59f51..314b6a51e 100644 --- a/config/default_config.json +++ b/config/default_config.json @@ -1,24 +1,22 @@ { + "time_frame": ["30m", "1h", "2h", "4h", "1d"], "crypto_currencies":{ "Bitcoin": { "pairs" : ["BTC/USDT"] } }, "exchanges": { - "binance": { - "api-key": "", - "api-secret": "" - } }, "services": {}, "notification":{ - "enabled": false + "enabled": false, + "type": [] }, "trader":{ "enabled": false, "risk": 0.5 }, - "simulator":{ + "trader_simulator":{ "enabled": true, "risk": 0.5, "starting_portfolio": { @@ -26,4 +24,4 @@ "USDT": 1000 } } -} \ No newline at end of file +} diff --git a/config/default_evaluator_config.json b/config/default_evaluator_config.json new file mode 100644 index 000000000..2fe586658 --- /dev/null +++ b/config/default_evaluator_config.json @@ -0,0 +1,20 @@ +{ + "RSIMomentumEvaluator": true, + "DoubleMovingAverageTrendEvaluator": true, + "BBMomentumEvaluator": true, + "MACDMomentumEvaluator": true, + "CandlePatternMomentumEvaluator": false, + "ADXMomentumEvaluator": true, + + + "InstantFluctuationsEvaluator": true, + + + "TwitterNewsEvaluator": true, + "RedditForumEvaluator": true, + "GoogleTrendStatsEvaluator": true, + + + "FullMixedStrategiesEvaluator": true, + "InstantSocialReactionMixedStrategiesEvaluator": false +} \ No newline at end of file diff --git a/config/logging_config.ini b/config/logging_config.ini index 95ff096ee..d9531e437 100644 --- a/config/logging_config.ini +++ b/config/logging_config.ini @@ -18,10 +18,10 @@ formatter=consoleFormatter args=(sys.stdout,) [handler_fileHandler] -class=FileHandler +class=handlers.RotatingFileHandler level=DEBUG formatter=fileFormatter -args=('logs/debug.log',) +args=('logs/OctoBot.log', 'a', 8000000, 20) [formatter_consoleFormatter] class=colorlog.ColoredFormatter diff --git a/config/specific_evaluator_config/GoogleTrendStatsEvaluator.json b/config/specific_evaluator_config/GoogleTrendStatsEvaluator.json index eb5e9f4f4..12aae59e4 100644 --- a/config/specific_evaluator_config/GoogleTrendStatsEvaluator.json +++ b/config/specific_evaluator_config/GoogleTrendStatsEvaluator.json @@ -1,4 +1,4 @@ { - "refresh_rate_seconds" : 3600, + "refresh_rate_seconds" : 86400, "relevant_history_months" : 3 -} \ No newline at end of file +} diff --git a/config/specific_evaluator_config/RedditForumEvaluator.json b/config/specific_evaluator_config/RedditForumEvaluator.json new file mode 100644 index 000000000..e50e112ac --- /dev/null +++ b/config/specific_evaluator_config/RedditForumEvaluator.json @@ -0,0 +1,14 @@ +{ + "subreddits" : { + "Bitcoin": ["Bitcoin"], + "Ethereum": ["ethereum"], + "NEO": ["NEO"], + "ICON": ["icon"], + "NANO": ["nanocurrency"], + "VeChain": ["Vechain"], + "Substratum": ["SubstratumNetwork"], + "Ethos": ["ethos_io"], + "Ontology": ["OntologyNetwork"], + "Binance Coin": [] + } +} diff --git a/config/specific_evaluator_config/TwitterNewsEvaluator.json b/config/specific_evaluator_config/TwitterNewsEvaluator.json index 56b138c3a..a4d9064e4 100644 --- a/config/specific_evaluator_config/TwitterNewsEvaluator.json +++ b/config/specific_evaluator_config/TwitterNewsEvaluator.json @@ -1,14 +1,14 @@ { - "refresh_rate_seconds" : 3600, - "relevant_history_months" : 3, "accounts" : { - "Bitcoin": ["GuillaGjum","RedditBTC","BTCFoundation"], - "Ethereum": ["ethereum"], - "Neo": ["NEO_Blockchain"] - }, - "hashtags" : { - "Bitcoin": ["bitcoin","btc","binance","kucoin","tether","bitfinex","bitmex","cryptopia","cryptocurrencies","blockchain"], - "Ethereum": ["Ethereum", "blockchain"], - "Neo": ["neo","blockchain"] + "Bitcoin": ["RedditBTC","BTCFoundation"], + "Ethereum": ["ethereum","VitalikButerin"], + "Neo": ["NEO_Blockchain","NEOnewstoday","NEO_council","neotogas","NEO_DevCon","RedditBTC","neonexchange","dahongfei"], + "ICON": ["helloiconworld "], + "NANO": ["nanocurrency"], + "VeChain": ["sunshinelu24","VechainThorCom","Vechain1"], + "Substratum": ["SubstratumNet"], + "Ethos": ["Ethos_io"], + "Ontology": ["OntologyNetwork"], + "Binance Coin": [] } -} \ No newline at end of file +} diff --git a/dev_requirements.txt b/dev_requirements.txt new file mode 100644 index 000000000..542fbe9dd --- /dev/null +++ b/dev_requirements.txt @@ -0,0 +1,4 @@ +pytest +pytest-pep8 +pytest-cov +coverage \ No newline at end of file diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 3cb41cc8f..d892e5093 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,4 +1,201 @@ -Changelog for 0.0.8 +Changelog for 0.1.0-beta +==================== +*Released date : June 1 2018* + +**Info** : +- Config : "packages" root key renamed to "tentacles" + +# Concerned issues : + #108 [RoadMap] format RoadMap into an attractive image + #109 [RoadMap] add RoadMap tracker on ReadMe.md + #136 [Tests] Improve trading tests coverage + #139 [Tests] Improve evaluator management tests coverage + #156 [Documentation] Add documentation for evaluator management classes + #163 [Exchanges Tests] implement web sockets for binance tests + #164 [ReadMe] make readme sexy ! + #174 Renaming CryptoBot to Octobot + #181 [Telegram] Pause and resume trading + #183 Can't create order when order already on exchange on bot start + #186 [Twitter Interface] Some notifications are not sent to Twitter website + +# New features : + - Telegram pause / resume trading + - Beautiful README and logo + - Create roadmap + - Improve tests coverage + +# Bug fix : + - Fix negative portfolio in simulation + +Changelog for 0.0.12-alpha +==================== +*Released date : May 26 2018* + +**Info** : +- Config : "data_collector" root key removed +- Backtesting : "file" root key changed to "files" as array +- Package Manager : need to perform `python3 start.py -p install all` to install evaluators + +# Concerned issues : + #84 [Environment] Create docker + #86 [CI] Implement third party + #139 [Tests] Improve evaluator management tests coverage + #144 [Bug] Investigate version 0.0.11 negative simulated portfolio + #145 [Datacollector] Implements multiple symbol + #146 [Backtesting] Implement multi symbols + #147 [Backtesting] Implement multi exchanges + #148 [Backtesting] Implement better order manager backtesting features + #151 [Services] log info message when started + #152 [Wiki] complete wiki version 1 + #153 [Beta Version] Prepare beta version + #154 [Exchanges] implement web sockets for binance exchange + #155 [TA] improve real time evaluator + #157 [Exchanges] manage websockets availability in exchange manager + #158 [Order management] implement order callback update for websockets additionnaly to poll updates + #159 added cyclic log file management + #160 [Real Trader] taking exchanges symbol and minimum trade requirements into account + #161 [Evaluators] Allows in run evaluator creation + #162 [Services] Allows in run service creation + #163 [Exchanges Tests] implement web sockets for binance tests + #165 Bump matplotlib from 2.0 to 2.2.2 + #166 [Tests] Features testing + #171 [Package Manager] Prototype + #172 [Telegram Interface] No response when ask profitability + #175 Add tests for order creation + #176 [Package manager] implement advanced evaluators + +# New features : + - Multi symbols / exchanges data collector + - Multi symbols backtesting + - Wiki completed + - Websocket management + - Exchange management + - Binance Websocket + - Cyclic logging + - Evaluator & Service restarting management + - Package Manager + - Windows installer + +# Bug fix : + - Improve code quality + - Fix exception in order update_status when backtesting + - Fix order fill bug in simulation + - Fix telegram no response on /profitability command + - Taking exchanges symbol and minimum trade requirements into account + + +Changelog for 0.0.11-alpha +==================== +*Released date : May 11 2018* + +**Info** : +- Config : "simulator" root key changed to "trader_simulator" + +**Warning** : +- Real trading is in pre-alpha version + +# Concerned issues : + #87 [Interface] Prototype telegram interface + #132 [Web]: add portfolio view + #133 [Backtesting] Implement report + #134 [Order Creation] Fix negative quantity + #135 [Simulation] Fix order and trades manager + #136 [Tests] Improve trading tests coverage + #138 [Trading] Implement real trades + #139 prepare evaluators tests + #140 [Trading] Implement real portfolio management + #141 [Trading] Implement real order management + #142 [Timeframe manager] Implementation + +# New features : + - Web interface improvements + - Telegram interface + - Telegram notifications + - Pretty Printer tool + - Eval note expiration management + - Beginning of real trading implementation + - Multiple new tests to improve code coverage + - TimeFrame Manager + +# Bug fix : + - Fixed trader simulation order creation + - [Order Creation] Fix negative quantity + +Changelog for 0.0.10-alpha +==================== +*Released date : May 5 2018* + +# Concerned issues : + #63 Calculate evaluator divergence note + #86 [CI] Implement third party + #117 auto adapt symbol configuration for backtesting + #119 TA test architecture + #120 [Backtesting] Test Zipline lib implementation + #121 added sudden pump data and described bank data + #122 added test_reaction_to_over_bought_then_dip to all TA + #123 added rise after over-sold test for all TA + #124 added flat trend tests on all TA + #125 [Notification] Double notification when an order linked is cancelled + #127 Add in price graph and out price graph indicator list plot + #126 [Order] Too much canceled orders when RealTime Evaluators are created + #128 [Notification] No notification of profitability + #129 [Web] Create web interface prototype + +# New features : + - Web interface prototype + - Full TA patterns tests + - Data Visualiser + - Performance Analyser + - Bot starter with options + - Multiple new tests to improve code coverage + +# Bug fix : + - Fix risk logic with market orders + - Fix notifications : only concerned symbol + - Fix default config + - Fix datavisualiser style + - Fix RedditEvaluator overriden method param names + - Fix portfolio profitability notification + + +Changelog for 0.0.9-alpha +==================== +*Released date : Apr 30 2018* + +# Concerned issues : + #20 added reddit service and started reddit dispatcher + #22 added webpage news retreiver + #47 backtesting + #76 data collector + #92 [Evaluators] Enable / disable with config file + #102 added advanced evaluator in dispatcher handler + #103 [Portfolio] Implement pytests last + #104 Exchange Manager + #105 fix cancel notification + #107 factorized refresher threads into one per symbol + #113 Fix portfolio bug management + +# New features : + - Backtesting + - Data Collector + - Data Collector Parser + - Exchange Manager + - New social evaluator (reddit, twitter posted media & websites) + - Tests implementation and coverage + +# Bug fix : + - Fix Portfolio management + - Fix critical bug on symbol evaluator + - Fix critical bug in order creation + - Fix trader join + - Fix tests + - Fix real time constants + - Fix new dependency raspberry install + - Fix realtime instant fluctuation evaluator pending note + - Fix notification style end order + - Fix portfolio concurrency access + +Changelog for 0.0.8-alpha ==================== *Released date : Apr 24 2018* @@ -25,7 +222,7 @@ Changelog for 0.0.8 - Fix portfolio profitability - Fix order cancel when state change -Changelog for 0.0.7 +Changelog for 0.0.7-alpha ==================== *Released date : Apr 21 2018* @@ -55,7 +252,7 @@ Changelog for 0.0.7 - Fix candle evaluator when no pattern is detected - Fix RealTime Evaluators creation -Changelog for 0.0.6 +Changelog for 0.0.6-alpha ==================== *Released date : Apr 16 2018* @@ -78,7 +275,7 @@ Changelog for 0.0.6 - Fix bollinger analyser -Changelog for 0.0.5 +Changelog for 0.0.5-alpha ==================== *Released date : Apr 12 2018* diff --git a/docs/backtesting/data/binance_BTC_USDT_20180428_121156.data b/docs/backtesting/data/binance_BTC_USDT_20180428_121156.data new file mode 100644 index 000000000..8d9443b68 --- /dev/null +++ b/docs/backtesting/data/binance_BTC_USDT_20180428_121156.data @@ -0,0 +1 @@ +{"1m": [[1524880320000, 9094.18, 9098.0, 9090.0, 9097.12, 29.20769], [1524880380000, 9095.0, 9097.99, 9085.0, 9089.02, 18.642948], [1524880440000, 9089.02, 9094.24, 9084.98, 9092.13, 42.738878], [1524880500000, 9090.01, 9095.46, 9085.0, 9092.61, 20.411073], [1524880560000, 9092.62, 9096.0, 9092.61, 9095.42, 6.362108], [1524880620000, 9096.0, 9107.0, 9095.42, 9105.08, 56.934633], [1524880680000, 9107.98, 9120.23, 9107.98, 9119.32, 43.661843], [1524880740000, 9120.23, 9126.81, 9118.0, 9126.81, 48.509827], [1524880800000, 9126.81, 9128.09, 9116.0, 9116.52, 63.183033], [1524880860000, 9116.0, 9121.74, 9116.0, 9116.01, 43.262053], [1524880920000, 9116.0, 9116.01, 9089.98, 9090.18, 28.994326], [1524880980000, 9099.09, 9111.85, 9090.17, 9111.83, 18.89067], [1524881040000, 9101.53, 9111.85, 9099.99, 9110.01, 22.678861], [1524881100000, 9110.01, 9111.85, 9110.0, 9111.01, 13.737443], [1524881160000, 9111.0, 9113.96, 9111.0, 9113.96, 17.780914], [1524881220000, 9113.96, 9124.99, 9112.0, 9123.0, 16.307828], [1524881280000, 9125.0, 9129.17, 9114.01, 9114.01, 34.254745], [1524881340000, 9115.0, 9129.0, 9100.32, 9123.95, 39.403439], [1524881400000, 9120.57, 9123.94, 9114.01, 9123.08, 5.539075], [1524881460000, 9123.08, 9129.0, 9120.0, 9121.84, 26.513747], [1524881520000, 9121.84, 9128.0, 9114.01, 9119.0, 11.919154], [1524881580000, 9118.99, 9119.94, 9110.0, 9115.0, 8.656376], [1524881640000, 9115.0, 9118.69, 9100.39, 9110.01, 18.162342], [1524881700000, 9108.0, 9115.0, 9100.39, 9114.99, 20.98832], [1524881760000, 9114.99, 9115.0, 9105.0, 9110.02, 34.413698], [1524881820000, 9110.03, 9111.42, 9075.19, 9088.03, 69.41519], [1524881880000, 9083.18, 9088.03, 9078.0, 9080.02, 25.158955], [1524881940000, 9080.02, 9091.59, 9075.19, 9085.0, 28.418703], [1524882000000, 9085.01, 9090.12, 9080.0, 9086.99, 15.730926], [1524882060000, 9086.99, 9100.0, 9080.06, 9090.39, 33.006884], [1524882120000, 9090.39, 9100.32, 9090.38, 9099.0, 28.472196], [1524882180000, 9099.0, 9118.48, 9099.0, 9111.01, 27.515375], [1524882240000, 9116.94, 9123.03, 9111.01, 9116.93, 21.112542], [1524882300000, 9117.99, 9117.99, 9100.33, 9103.01, 49.063182], [1524882360000, 9103.01, 9109.0, 9100.0, 9100.0, 23.551851], [1524882420000, 9100.0, 9115.94, 9100.0, 9101.0, 34.882035], [1524882480000, 9101.0, 9109.89, 9101.0, 9102.11, 8.591047], [1524882540000, 9102.11, 9106.1, 9100.33, 9100.33, 20.645743], [1524882600000, 9100.33, 9106.11, 9100.33, 9105.0, 12.726996], [1524882660000, 9105.0, 9107.44, 9102.0, 9103.01, 19.46195], [1524882720000, 9109.88, 9109.99, 9103.01, 9108.0, 17.171666], [1524882780000, 9108.99, 9110.49, 9105.21, 9106.32, 11.584391], [1524882840000, 9105.48, 9112.8, 9105.21, 9112.79, 11.825441], [1524882900000, 9112.79, 9116.58, 9105.25, 9105.25, 18.029042], [1524882960000, 9105.67, 9119.0, 9105.67, 9116.31, 5.315861], [1524883020000, 9114.11, 9116.31, 9108.0, 9108.0, 18.894472], [1524883080000, 9108.0, 9110.01, 9108.0, 9108.03, 9.273475], [1524883140000, 9108.04, 9110.01, 9108.01, 9108.06, 13.690748], [1524883200000, 9108.06, 9112.86, 9103.3, 9103.3, 14.554275], [1524883260000, 9105.0, 9105.0, 9100.33, 9101.99, 3.853307], [1524883320000, 9101.5, 9110.01, 9100.33, 9100.33, 11.11452], [1524883380000, 9100.33, 9100.34, 9090.0, 9090.11, 34.380085], [1524883440000, 9090.11, 9095.0, 9086.7, 9094.98, 12.092345], [1524883500000, 9094.99, 9094.99, 9086.9, 9086.9, 17.767146], [1524883560000, 9090.0, 9093.13, 9073.68, 9076.0, 20.871505], [1524883620000, 9075.99, 9084.68, 9073.68, 9083.0, 9.471618], [1524883680000, 9083.99, 9090.0, 9077.76, 9090.0, 10.421445], [1524883740000, 9089.99, 9093.13, 9073.7, 9084.72, 10.894499], [1524883800000, 9084.42, 9084.42, 9073.72, 9073.86, 10.157149], [1524883860000, 9073.86, 9086.99, 9073.68, 9073.68, 14.72462], [1524883920000, 9073.85, 9081.97, 9062.0, 9064.0, 59.816901], [1524883980000, 9064.0, 9079.4, 9055.0, 9066.24, 21.053692], [1524884040000, 9070.0, 9070.0, 9056.64, 9056.64, 11.638231], [1524884100000, 9056.64, 9066.21, 9050.0, 9056.0, 26.838529], [1524884160000, 9060.0, 9072.86, 9056.98, 9060.01, 16.631446], [1524884220000, 9065.91, 9070.03, 9055.63, 9064.17, 39.265481], [1524884280000, 9056.92, 9062.98, 9056.01, 9057.01, 9.669728], [1524884340000, 9057.01, 9062.0, 9053.47, 9055.78, 14.194841], [1524884400000, 9053.47, 9070.03, 9051.0, 9063.96, 7.399338], [1524884460000, 9070.03, 9077.55, 9063.99, 9068.84, 7.48082], [1524884520000, 9070.0, 9078.9, 9065.0, 9065.0, 6.940409], [1524884580000, 9074.51, 9075.0, 9065.01, 9073.62, 5.851091], [1524884640000, 9069.5, 9083.3, 9066.01, 9082.81, 9.249684], [1524884700000, 9082.8, 9082.92, 9075.76, 9080.0, 22.33925], [1524884760000, 9082.84, 9083.3, 9078.0, 9080.0, 18.159872], [1524884820000, 9080.01, 9083.3, 9080.01, 9083.3, 6.666073], [1524884880000, 9083.3, 9086.0, 9083.04, 9085.05, 8.930929], [1524884940000, 9085.0, 9085.05, 9083.3, 9085.0, 6.666931], [1524885000000, 9085.0, 9092.41, 9085.0, 9091.0, 28.213726], [1524885060000, 9091.0, 9100.0, 9090.01, 9098.38, 23.831208], [1524885120000, 9093.02, 9100.0, 9092.46, 9094.1, 9.057284], [1524885180000, 9094.1, 9099.0, 9092.46, 9092.46, 15.908904], [1524885240000, 9092.46, 9099.02, 9092.0, 9097.51, 15.883052], [1524885300000, 9096.28, 9097.51, 9093.0, 9096.51, 4.321044], [1524885360000, 9093.3, 9096.67, 9093.3, 9095.98, 9.076152], [1524885420000, 9095.98, 9096.53, 9093.69, 9096.51, 13.186262], [1524885480000, 9096.51, 9096.51, 9094.5, 9095.0, 15.555526], [1524885540000, 9095.45, 9096.52, 9094.5, 9095.1, 9.55621], [1524885600000, 9095.1, 9113.7, 9095.09, 9109.0, 32.455274], [1524885660000, 9109.0, 9116.31, 9101.98, 9110.46, 13.785083], [1524885720000, 9110.46, 9129.0, 9110.46, 9126.19, 29.990179], [1524885780000, 9126.19, 9146.99, 9121.0, 9121.26, 61.905931], [1524885840000, 9125.0, 9126.03, 9121.26, 9121.26, 16.854817], [1524885900000, 9121.26, 9126.03, 9120.0, 9124.77, 25.649231], [1524885960000, 9125.58, 9130.0, 9121.0, 9122.01, 21.977883], [1524886020000, 9124.99, 9130.26, 9122.01, 9123.01, 10.211102], [1524886080000, 9123.01, 9125.0, 9121.0, 9122.0, 7.966947], [1524886140000, 9122.0, 9124.0, 9110.46, 9112.27, 13.181924], [1524886200000, 9112.0, 9121.99, 9110.32, 9111.0, 10.553614], [1524886260000, 9111.01, 9115.0, 9110.0, 9110.33, 10.013344], [1524886320000, 9112.95, 9116.21, 9110.34, 9115.99, 5.867337], [1524886380000, 9114.01, 9128.49, 9114.01, 9128.49, 18.9355], [1524886440000, 9128.49, 9129.42, 9124.22, 9124.23, 12.959013], [1524886500000, 9124.23, 9130.0, 9124.22, 9124.23, 10.449614], [1524886560000, 9124.23, 9128.48, 9124.22, 9124.23, 8.212494], [1524886620000, 9124.23, 9127.22, 9109.49, 9110.13, 27.926238], [1524886680000, 9120.0, 9120.0, 9108.94, 9111.01, 6.999053], [1524886740000, 9113.12, 9115.24, 9111.0, 9115.23, 6.889685], [1524886800000, 9115.23, 9118.36, 9100.0, 9110.44, 22.717742], [1524886860000, 9110.44, 9124.0, 9110.43, 9120.0, 15.349473], [1524886920000, 9113.4, 9120.0, 9106.41, 9118.82, 7.339945], [1524886980000, 9119.95, 9119.95, 9111.05, 9112.08, 3.983764], [1524887040000, 9115.3, 9120.0, 9112.03, 9114.0, 5.344647], [1524887100000, 9114.0, 9119.94, 9114.0, 9115.25, 4.154397], [1524887160000, 9115.25, 9136.01, 9115.25, 9131.41, 26.121303], [1524887220000, 9131.65, 9133.98, 9125.01, 9132.57, 10.232922], [1524887280000, 9132.57, 9140.0, 9126.31, 9139.99, 14.004287], [1524887340000, 9139.99, 9140.0, 9137.6, 9137.61, 14.840915], [1524887400000, 9137.61, 9141.3, 9137.61, 9140.0, 16.881866], [1524887460000, 9140.0, 9146.0, 9138.88, 9145.01, 6.367835], [1524887520000, 9145.02, 9155.66, 9142.81, 9152.24, 59.053917], [1524887580000, 9155.64, 9180.75, 9145.07, 9162.24, 144.932174], [1524887640000, 9170.99, 9196.32, 9162.29, 9176.7, 45.197169], [1524887700000, 9176.7, 9181.66, 9152.44, 9158.0, 24.995997], [1524887760000, 9158.0, 9167.77, 9152.5, 9158.32, 16.674296], [1524887820000, 9167.0, 9170.0, 9158.29, 9158.38, 18.374381], [1524887880000, 9158.38, 9163.96, 9152.44, 9153.51, 24.391803], [1524887940000, 9153.5, 9157.87, 9152.48, 9155.0, 11.051808], [1524888000000, 9155.01, 9162.0, 9155.0, 9162.0, 10.508049], [1524888060000, 9157.0, 9165.0, 9155.0, 9157.07, 10.511765], [1524888120000, 9163.99, 9168.71, 9157.05, 9159.33, 23.593264], [1524888180000, 9157.93, 9163.76, 9157.05, 9161.0, 19.971825], [1524888240000, 9161.01, 9163.72, 9145.0, 9151.06, 42.615489], [1524888300000, 9151.06, 9151.06, 9137.72, 9137.75, 14.65276], [1524888360000, 9143.27, 9149.0, 9137.73, 9147.01, 25.820821], [1524888420000, 9147.01, 9151.11, 9147.01, 9150.99, 9.156525], [1524888480000, 9150.0, 9151.0, 9148.49, 9148.99, 12.132922], [1524888540000, 9148.0, 9149.0, 9140.0, 9140.97, 7.495421], [1524888600000, 9147.85, 9147.85, 9137.73, 9146.75, 13.030406], [1524888660000, 9146.69, 9149.99, 9140.19, 9140.46, 11.846179], [1524888720000, 9140.46, 9149.71, 9137.74, 9140.0, 7.401096], [1524888780000, 9140.0, 9149.69, 9137.76, 9140.0, 13.804253], [1524888840000, 9139.2, 9145.0, 9139.18, 9142.99, 8.53676], [1524888900000, 9142.99, 9145.47, 9130.01, 9130.95, 23.555771], [1524888960000, 9141.09, 9145.97, 9131.07, 9139.64, 7.141991], [1524889020000, 9139.64, 9145.0, 9139.64, 9141.1, 9.583477], [1524889080000, 9140.51, 9144.0, 9140.0, 9144.0, 16.055973], [1524889140000, 9143.94, 9144.0, 9140.0, 9140.56, 6.487454], [1524889200000, 9141.0, 9141.0, 9140.56, 9140.56, 6.323473], [1524889260000, 9140.28, 9144.0, 9139.79, 9141.0, 20.943643], [1524889320000, 9140.58, 9146.34, 9140.0, 9146.34, 12.606837], [1524889380000, 9146.34, 9150.0, 9143.51, 9150.0, 14.522949], [1524889440000, 9149.99, 9160.0, 9149.99, 9160.0, 20.035032], [1524889500000, 9159.99, 9162.34, 9153.0, 9153.58, 10.703659], [1524889560000, 9153.69, 9162.34, 9153.57, 9162.0, 12.205989], [1524889620000, 9160.0, 9162.0, 9153.59, 9157.55, 26.909187], [1524889680000, 9157.02, 9161.0, 9155.2, 9161.0, 9.362208], [1524889740000, 9160.0, 9161.0, 9155.24, 9160.95, 17.872412], [1524889800000, 9160.92, 9160.95, 9153.0, 9156.48, 11.642115], [1524889860000, 9153.03, 9158.0, 9151.36, 9152.02, 25.534766], [1524889920000, 9152.02, 9161.11, 9151.35, 9161.1, 24.173887], [1524889980000, 9157.0, 9161.11, 9139.78, 9144.99, 15.676753], [1524890040000, 9145.0, 9145.98, 9135.0, 9136.0, 9.869303], [1524890100000, 9143.98, 9150.58, 9131.0, 9144.15, 14.978063], [1524890160000, 9146.81, 9155.0, 9142.0, 9146.84, 10.899667], [1524890220000, 9150.0, 9151.14, 9146.82, 9146.89, 12.519239], [1524890280000, 9146.84, 9150.0, 9137.0, 9142.77, 15.593112], [1524890340000, 9144.36, 9151.0, 9142.81, 9149.8, 8.018637], [1524890400000, 9149.8, 9157.33, 9147.0, 9154.36, 13.036719], [1524890460000, 9157.34, 9165.47, 9155.66, 9165.15, 10.719954], [1524890520000, 9165.15, 9165.47, 9150.03, 9158.98, 12.931877], [1524890580000, 9154.49, 9158.96, 9150.03, 9150.04, 3.935643], [1524890640000, 9150.04, 9154.99, 9148.01, 9148.01, 6.420671], [1524890700000, 9148.01, 9158.0, 9146.0, 9157.0, 21.272533], [1524890760000, 9150.0, 9157.0, 9150.0, 9155.91, 5.868529], [1524890820000, 9155.0, 9156.95, 9150.03, 9150.04, 7.107126], [1524890880000, 9155.63, 9157.0, 9150.04, 9151.02, 6.654704], [1524890940000, 9152.9, 9154.77, 9144.36, 9148.05, 20.854348], [1524891000000, 9149.8, 9150.0, 9128.99, 9140.74, 18.895295], [1524891060000, 9140.53, 9140.53, 9125.0, 9129.8, 21.680638], [1524891120000, 9129.8, 9140.75, 9119.28, 9119.28, 10.945016], [1524891180000, 9119.29, 9125.0, 9116.0, 9119.99, 12.502371], [1524891240000, 9120.0, 9135.84, 9111.21, 9135.81, 14.011063], [1524891300000, 9135.74, 9140.79, 9121.03, 9140.79, 13.601457], [1524891360000, 9140.79, 9149.0, 9133.72, 9134.11, 7.501947], [1524891420000, 9140.0, 9144.99, 9134.01, 9139.45, 21.895268], [1524891480000, 9139.99, 9144.99, 9138.53, 9138.54, 10.610245], [1524891540000, 9140.0, 9145.0, 9138.53, 9138.53, 82.181794], [1524891600000, 9138.54, 9144.86, 9127.64, 9130.0, 25.433553], [1524891660000, 9130.0, 9157.1, 9130.0, 9157.1, 37.758952], [1524891720000, 9157.1, 9157.1, 9148.92, 9151.0, 11.390051], [1524891780000, 9154.6, 9154.6, 9145.0, 9145.0, 3.178034], [1524891840000, 9145.0, 9150.87, 9141.34, 9145.0, 6.161642], [1524891900000, 9144.0, 9148.07, 9142.0, 9144.01, 4.65975], [1524891960000, 9147.7, 9147.71, 9144.0, 9144.0, 3.760905], [1524892020000, 9144.01, 9160.28, 9144.01, 9160.28, 29.10883], [1524892080000, 9160.21, 9168.2, 9157.0, 9160.01, 43.39648], [1524892140000, 9160.02, 9168.09, 9160.0, 9168.09, 7.388921], [1524892200000, 9168.01, 9168.01, 9161.02, 9161.03, 5.964761], [1524892260000, 9161.04, 9168.01, 9161.02, 9167.06, 10.705886], [1524892320000, 9162.01, 9173.0, 9162.01, 9173.0, 29.814331], [1524892380000, 9173.0, 9184.8, 9172.03, 9177.78, 45.707892], [1524892440000, 9180.55, 9183.75, 9177.01, 9180.02, 4.468195], [1524892500000, 9180.02, 9188.5, 9178.1, 9181.67, 18.177088], [1524892560000, 9183.83, 9185.99, 9167.06, 9171.0, 11.890326], [1524892620000, 9173.0, 9174.0, 9171.0, 9172.01, 11.964617], [1524892680000, 9172.0, 9176.94, 9171.01, 9172.04, 9.633371], [1524892740000, 9174.49, 9176.93, 9171.0, 9172.05, 14.632832], [1524892800000, 9171.01, 9173.01, 9170.02, 9172.98, 16.325621], [1524892860000, 9172.98, 9173.0, 9170.0, 9172.98, 14.299663], [1524892920000, 9172.97, 9176.93, 9171.01, 9176.92, 10.368081], [1524892980000, 9176.91, 9176.93, 9173.0, 9175.26, 9.818305], [1524893040000, 9175.0, 9175.82, 9173.0, 9175.0, 5.077018], [1524893100000, 9175.0, 9177.78, 9173.05, 9175.1, 13.771533], [1524893160000, 9175.2, 9177.78, 9151.59, 9167.8, 39.860486], [1524893220000, 9167.8, 9167.8, 9151.73, 9151.73, 11.827633], [1524893280000, 9153.77, 9168.7, 9151.73, 9160.18, 8.242935], [1524893340000, 9160.18, 9164.19, 9151.45, 9157.1, 56.531984], [1524893400000, 9157.0, 9164.18, 9157.0, 9163.99, 21.869965], [1524893460000, 9161.19, 9163.75, 9144.01, 9153.78, 35.256017], [1524893520000, 9153.5, 9161.16, 9150.98, 9153.78, 11.247645], [1524893580000, 9154.3, 9161.89, 9152.0, 9157.0, 17.214401], [1524893640000, 9160.0, 9164.0, 9152.09, 9152.09, 15.569929], [1524893700000, 9153.77, 9163.57, 9150.51, 9153.82, 8.091377], [1524893760000, 9153.82, 9162.88, 9150.52, 9154.59, 11.877768], [1524893820000, 9151.01, 9160.0, 9141.3, 9141.3, 4.797086], [1524893880000, 9152.38, 9163.56, 9141.7, 9153.34, 9.445447], [1524893940000, 9162.86, 9163.54, 9153.37, 9162.85, 9.969235], [1524894000000, 9160.14, 9162.85, 9146.01, 9155.89, 13.840632], [1524894060000, 9155.87, 9159.96, 9141.3, 9150.0, 7.625787], [1524894120000, 9150.0, 9158.0, 9144.39, 9144.39, 18.989127], [1524894180000, 9150.0, 9158.0, 9147.2, 9153.5, 9.965716], [1524894240000, 9153.5, 9156.99, 9150.0, 9156.99, 4.838564], [1524894300000, 9150.02, 9157.0, 9150.01, 9150.01, 8.33521], [1524894360000, 9150.01, 9153.0, 9140.67, 9146.0, 7.045162], [1524894420000, 9148.09, 9150.0, 9144.48, 9148.61, 2.485056], [1524894480000, 9148.34, 9155.0, 9148.07, 9149.68, 8.862235], [1524894540000, 9149.68, 9155.0, 9148.08, 9153.33, 9.217288], [1524894600000, 9148.09, 9158.0, 9148.08, 9157.0, 12.034898], [1524894660000, 9157.04, 9160.01, 9157.0, 9159.87, 11.606115], [1524894720000, 9157.22, 9162.0, 9157.22, 9157.22, 10.053772], [1524894780000, 9160.18, 9160.19, 9157.06, 9157.06, 12.979205], [1524894840000, 9157.06, 9160.19, 9150.0, 9160.19, 11.172469], [1524894900000, 9160.19, 9163.78, 9160.0, 9160.2, 27.477981], [1524894960000, 9163.54, 9168.72, 9160.0, 9160.0, 23.518483], [1524895020000, 9162.0, 9166.51, 9152.0, 9158.73, 28.20967], [1524895080000, 9153.15, 9167.0, 9153.15, 9165.0, 26.473761], [1524895140000, 9166.51, 9169.0, 9161.0, 9164.49, 12.635646], [1524895200000, 9164.48, 9168.0, 9160.01, 9166.99, 10.716273], [1524895260000, 9166.97, 9171.79, 9160.2, 9167.0, 17.464059], [1524895320000, 9162.11, 9175.0, 9162.11, 9174.0, 14.267714], [1524895380000, 9174.01, 9175.0, 9163.73, 9164.01, 18.893037], [1524895440000, 9164.01, 9175.1, 9164.0, 9165.06, 9.132571], [1524895500000, 9165.06, 9175.53, 9165.06, 9175.01, 19.621863], [1524895560000, 9170.01, 9175.06, 9166.0, 9174.98, 28.122135], [1524895620000, 9172.03, 9174.98, 9169.01, 9174.85, 24.969758], [1524895680000, 9174.97, 9179.78, 9170.04, 9179.78, 40.983167], [1524895740000, 9179.0, 9198.61, 9175.0, 9175.0, 100.386187], [1524895800000, 9175.0, 9189.88, 9169.9, 9180.0, 32.950486], [1524895860000, 9177.17, 9196.1, 9177.17, 9185.86, 39.827072], [1524895920000, 9194.61, 9199.99, 9185.56, 9190.73, 22.891666], [1524895980000, 9190.73, 9199.99, 9182.46, 9182.69, 31.705204], [1524896040000, 9182.69, 9190.62, 9180.0, 9189.93, 22.660791], [1524896100000, 9189.93, 9190.0, 9182.52, 9187.59, 31.596065], [1524896160000, 9189.0, 9189.99, 9177.08, 9182.6, 36.043226], [1524896220000, 9180.3, 9187.0, 9177.08, 9187.0, 15.907732], [1524896280000, 9185.88, 9199.0, 9185.88, 9195.0, 8.429153], [1524896340000, 9195.01, 9200.0, 9195.01, 9196.01, 18.468903], [1524896400000, 9199.99, 9200.0, 9190.74, 9190.74, 38.707795], [1524896460000, 9194.72, 9195.0, 9181.0, 9181.0, 21.411635], [1524896520000, 9185.38, 9185.83, 9175.0, 9184.75, 14.183524], [1524896580000, 9184.68, 9185.0, 9170.0, 9178.0, 14.447119], [1524896640000, 9175.0, 9179.89, 9170.38, 9179.89, 12.590333], [1524896700000, 9179.79, 9183.0, 9176.0, 9183.0, 5.480308], [1524896760000, 9182.99, 9184.0, 9170.3, 9177.97, 13.84091], [1524896820000, 9182.61, 9182.61, 9170.02, 9170.03, 8.111331], [1524896880000, 9170.03, 9180.3, 9170.02, 9178.98, 4.297333], [1524896940000, 9175.32, 9185.13, 9174.78, 9184.0, 20.339934], [1524897000000, 9184.01, 9189.88, 9182.0, 9186.0, 9.416579], [1524897060000, 9188.88, 9188.94, 9175.0, 9182.29, 11.748176], [1524897120000, 9184.58, 9190.0, 9180.0, 9189.94, 8.540398], [1524897180000, 9189.84, 9198.03, 9189.84, 9198.03, 32.055175], [1524897240000, 9198.03, 9200.28, 9198.03, 9200.02, 40.060225], [1524897300000, 9200.12, 9200.77, 9191.89, 9200.72, 17.650355], [1524897360000, 9195.02, 9200.89, 9180.0, 9180.37, 24.026158], [1524897420000, 9186.01, 9194.54, 9180.0, 9180.0, 8.858097], [1524897480000, 9181.63, 9198.71, 9180.0, 9195.05, 18.384885], [1524897540000, 9195.04, 9197.11, 9180.72, 9182.0, 12.610938], [1524897600000, 9182.0, 9196.22, 9181.11, 9196.21, 24.245478], [1524897660000, 9196.21, 9200.3, 9188.65, 9195.0, 25.593872], [1524897720000, 9195.0, 9199.9, 9190.02, 9195.0, 25.399949], [1524897780000, 9195.0, 9199.99, 9190.05, 9199.99, 21.74651], [1524897840000, 9199.0, 9209.8, 9191.12, 9203.0, 45.779633], [1524897900000, 9203.0, 9209.8, 9200.0, 9203.02, 23.365827], [1524897960000, 9204.0, 9208.0, 9204.0, 9204.03, 19.738422], [1524898020000, 9204.04, 9211.74, 9204.0, 9205.0, 20.364006], [1524898080000, 9210.0, 9215.66, 9205.0, 9212.01, 13.899875], [1524898140000, 9212.0, 9215.66, 9212.0, 9215.0, 18.132992], [1524898200000, 9215.0, 9215.0, 9205.02, 9213.94, 27.350778], [1524898260000, 9206.73, 9213.75, 9190.81, 9195.22, 30.195045], [1524898320000, 9204.15, 9204.15, 9178.35, 9195.82, 39.949863], [1524898380000, 9193.44, 9199.0, 9181.89, 9193.0, 5.939644], [1524898440000, 9195.0, 9195.14, 9185.0, 9189.89, 15.339232], [1524898500000, 9187.0, 9189.86, 9175.0, 9175.0, 11.665177], [1524898560000, 9179.99, 9182.99, 9174.22, 9182.92, 22.588183], [1524898620000, 9178.98, 9182.92, 9175.0, 9175.0, 17.525565], [1524898680000, 9178.74, 9178.87, 9150.67, 9162.0, 41.123915], [1524898740000, 9159.02, 9180.36, 9159.02, 9163.03, 17.067539], [1524898800000, 9163.02, 9171.07, 9160.0, 9163.03, 7.903137], [1524898860000, 9168.0, 9170.72, 9162.9, 9163.02, 19.593633], [1524898920000, 9163.02, 9163.02, 9132.71, 9139.0, 37.31577], [1524898980000, 9138.99, 9153.14, 9133.66, 9142.0, 31.331064], [1524899040000, 9142.0, 9149.0, 9130.02, 9135.29, 44.068329], [1524899100000, 9136.0, 9136.01, 9131.28, 9135.01, 81.445142], [1524899160000, 9134.22, 9135.01, 9129.1, 9129.92, 24.732127], [1524899220000, 9129.92, 9135.01, 9128.13, 9135.01, 48.854017], [1524899280000, 9135.01, 9135.01, 9131.03, 9131.99, 14.135783], [1524899340000, 9131.04, 9133.0, 9128.0, 9132.98, 10.389048], [1524899400000, 9132.99, 9160.6, 9132.98, 9146.08, 40.32353], [1524899460000, 9146.1, 9155.23, 9142.02, 9151.99, 7.097705], [1524899520000, 9151.99, 9152.0, 9145.97, 9151.99, 17.102068], [1524899580000, 9151.99, 9155.99, 9146.0, 9155.99, 16.616679], [1524899640000, 9159.99, 9160.0, 9147.0, 9150.99, 7.336379], [1524899700000, 9151.0, 9157.85, 9147.18, 9150.46, 11.827381], [1524899760000, 9153.0, 9154.99, 9147.1, 9148.07, 6.361516], [1524899820000, 9147.1, 9150.0, 9146.0, 9150.0, 10.999999], [1524899880000, 9150.0, 9150.0, 9147.1, 9150.0, 12.852867], [1524899940000, 9150.0, 9150.0, 9147.74, 9147.74, 15.831034], [1524900000000, 9147.74, 9153.0, 9147.1, 9151.5, 9.983281], [1524900060000, 9151.1, 9159.0, 9151.0, 9154.04, 11.644442], [1524900120000, 9154.04, 9160.0, 9154.0, 9154.19, 9.461819], [1524900180000, 9154.19, 9161.01, 9154.19, 9160.99, 8.439433], [1524900240000, 9160.99, 9164.19, 9160.11, 9164.12, 12.10761], [1524900300000, 9164.18, 9165.0, 9155.98, 9155.99, 26.816337], [1524900360000, 9155.98, 9164.0, 9154.1, 9161.99, 10.339696], [1524900420000, 9157.0, 9161.99, 9155.93, 9156.02, 3.684383], [1524900480000, 9158.99, 9160.0, 9153.65, 9153.65, 10.185363], [1524900540000, 9154.08, 9154.08, 9153.6, 9153.67, 13.838143], [1524900600000, 9153.67, 9154.08, 9151.0, 9151.0, 9.326824], [1524900660000, 9151.0, 9152.73, 9126.01, 9132.01, 41.373918], [1524900720000, 9135.0, 9137.57, 9132.0, 9135.0, 17.196467], [1524900780000, 9134.59, 9145.0, 9133.0, 9137.65, 21.171597], [1524900840000, 9137.65, 9147.93, 9133.02, 9136.23, 37.821322], [1524900900000, 9140.53, 9144.97, 9133.04, 9136.15, 34.447236], [1524900960000, 9136.15, 9139.9, 9130.0, 9132.93, 14.574198], [1524901020000, 9132.93, 9135.0, 9117.58, 9123.33, 20.457075], [1524901080000, 9120.0, 9124.97, 9109.0, 9113.96, 53.879874], [1524901140000, 9119.98, 9128.0, 9108.99, 9125.0, 16.902655], [1524901200000, 9125.86, 9142.1, 9118.6, 9124.93, 43.62554], [1524901260000, 9135.22, 9135.25, 9124.92, 9135.25, 12.967262], [1524901320000, 9135.26, 9139.59, 9130.0, 9130.0, 7.404202], [1524901380000, 9130.0, 9134.99, 9124.92, 9130.0, 13.318739], [1524901440000, 9125.01, 9130.0, 9124.45, 9124.92, 9.536456], [1524901500000, 9129.81, 9129.81, 9111.72, 9118.6, 12.710251], [1524901560000, 9118.61, 9123.0, 9110.0, 9117.9, 30.629049], [1524901620000, 9117.0, 9122.96, 9110.02, 9119.95, 26.57151], [1524901680000, 9119.99, 9120.0, 9112.11, 9119.98, 23.253989], [1524901740000, 9116.46, 9129.0, 9116.46, 9125.03, 36.3188], [1524901800000, 9125.03, 9130.0, 9125.0, 9128.0, 18.302724], [1524901860000, 9128.0, 9134.9, 9125.04, 9130.05, 6.207821], [1524901920000, 9130.05, 9134.98, 9130.01, 9134.9, 16.138173], [1524901980000, 9134.89, 9137.65, 9134.19, 9134.99, 13.646724], [1524902040000, 9135.0, 9145.0, 9134.19, 9140.02, 22.843426], [1524902100000, 9140.02, 9140.02, 9127.62, 9127.62, 21.967406], [1524902160000, 9127.62, 9135.13, 9120.08, 9122.93, 14.386954], [1524902220000, 9122.94, 9134.47, 9122.94, 9126.2, 3.619771], [1524902280000, 9126.21, 9131.99, 9125.1, 9127.99, 10.175077], [1524902340000, 9125.1, 9130.0, 9118.7, 9126.22, 9.70806], [1524902400000, 9121.05, 9126.21, 9115.0, 9119.01, 18.83437], [1524902460000, 9119.98, 9124.89, 9110.33, 9112.55, 21.26476], [1524902520000, 9113.88, 9120.0, 9111.0, 9119.0, 5.211686], [1524902580000, 9115.03, 9118.0, 9106.1, 9114.89, 14.289394], [1524902640000, 9114.89, 9115.0, 9106.81, 9114.0, 12.831781], [1524902700000, 9114.0, 9114.93, 9102.0, 9102.49, 15.76316], [1524902760000, 9102.49, 9112.0, 9090.8, 9096.58, 92.550754], [1524902820000, 9100.01, 9107.0, 9085.0, 9085.17, 25.07308], [1524902880000, 9085.17, 9097.49, 9084.73, 9090.01, 15.131159], [1524902940000, 9094.21, 9096.0, 9086.34, 9095.98, 25.088172], [1524903000000, 9091.11, 9102.0, 9091.1, 9100.31, 11.802174], [1524903060000, 9100.32, 9100.32, 9083.03, 9083.05, 23.580642], [1524903120000, 9083.05, 9096.0, 9081.02, 9083.06, 19.474728], [1524903180000, 9091.98, 9092.0, 9083.01, 9090.0, 12.411338], [1524903240000, 9090.0, 9092.0, 9083.62, 9088.99, 25.971319], [1524903300000, 9089.0, 9100.0, 9085.02, 9092.0, 29.786101], [1524903360000, 9092.0, 9096.26, 9085.06, 9086.97, 11.903341], [1524903420000, 9086.97, 9100.31, 9086.96, 9099.21, 32.561712], [1524903480000, 9099.41, 9110.0, 9099.41, 9103.0, 10.660779], [1524903540000, 9103.01, 9110.0, 9103.01, 9106.64, 20.407206], [1524903600000, 9106.64, 9110.0, 9090.48, 9090.48, 23.81261], [1524903660000, 9091.53, 9099.0, 9090.49, 9098.0, 26.886532], [1524903720000, 9094.28, 9099.9, 9088.98, 9098.0, 36.664293], [1524903780000, 9094.99, 9098.0, 9092.0, 9097.98, 16.833058], [1524903840000, 9097.98, 9098.0, 9089.33, 9090.5, 20.307329], [1524903900000, 9090.5, 9094.99, 9090.5, 9094.0, 6.305896], [1524903960000, 9094.0, 9098.0, 9090.62, 9093.38, 13.309881], [1524904020000, 9097.99, 9097.99, 9090.63, 9092.02, 8.699278], [1524904080000, 9093.3, 9098.0, 9086.96, 9097.99, 17.433714], [1524904140000, 9095.0, 9098.0, 9088.96, 9090.0, 12.553804], [1524904200000, 9090.0, 9147.0, 9088.96, 9133.84, 61.044089], [1524904260000, 9140.78, 9159.0, 9130.07, 9148.27, 82.680805], [1524904320000, 9148.75, 9174.0, 9148.27, 9174.0, 30.836378], [1524904380000, 9171.34, 9210.0, 9171.3, 9209.93, 69.308281], [1524904440000, 9209.93, 9258.0, 9209.93, 9246.33, 184.591907], [1524904500000, 9246.33, 9285.25, 9246.3, 9285.0, 180.734145], [1524904560000, 9283.24, 9294.0, 9275.58, 9293.02, 94.699067], [1524904620000, 9294.0, 9298.72, 9275.57, 9279.99, 85.722201], [1524904680000, 9275.57, 9280.88, 9266.0, 9273.01, 73.633143], [1524904740000, 9273.01, 9279.0, 9265.42, 9271.06, 46.546167], [1524904800000, 9274.97, 9280.0, 9267.55, 9280.0, 33.081096], [1524904860000, 9280.0, 9322.31, 9276.46, 9310.01, 136.765936], [1524904920000, 9310.01, 9328.0, 9310.01, 9328.0, 82.845912], [1524904980000, 9322.76, 9330.0, 9300.0, 9301.02, 134.673062], [1524905040000, 9301.02, 9320.0, 9300.17, 9320.0, 57.677947], [1524905100000, 9315.0, 9325.0, 9310.04, 9313.0, 63.884951], [1524905160000, 9316.0, 9319.7, 9291.78, 9291.78, 122.209589], [1524905220000, 9290.0, 9297.5, 9276.82, 9283.89, 43.438007], [1524905280000, 9287.94, 9312.99, 9283.89, 9300.1, 56.41405], [1524905340000, 9300.12, 9310.08, 9294.73, 9294.76, 19.872333], [1524905400000, 9295.0, 9307.0, 9294.0, 9300.08, 24.242088], [1524905460000, 9300.08, 9303.03, 9285.0, 9290.0, 14.485662], [1524905520000, 9290.0, 9294.7, 9281.0, 9290.0, 30.787312], [1524905580000, 9290.0, 9293.99, 9283.57, 9284.05, 23.906592], [1524905640000, 9284.05, 9292.69, 9283.0, 9292.69, 32.984705], [1524905700000, 9293.98, 9300.08, 9285.39, 9300.06, 31.968803], [1524905760000, 9300.01, 9307.99, 9296.65, 9307.08, 29.071099], [1524905820000, 9307.08, 9312.91, 9305.0, 9309.99, 42.974733], [1524905880000, 9309.99, 9311.96, 9256.0, 9256.01, 143.199672], [1524905940000, 9256.01, 9268.49, 9190.0, 9217.48, 387.06959], [1524906000000, 9227.49, 9237.58, 9155.55, 9199.06, 189.052157], [1524906060000, 9217.03, 9250.0, 9178.0, 9231.86, 106.578592], [1524906120000, 9223.77, 9231.87, 9183.99, 9197.82, 63.969579], [1524906180000, 9200.0, 9217.99, 9190.0, 9214.22, 41.791566], [1524906240000, 9214.2, 9215.0, 9191.17, 9191.17, 48.583828], [1524906300000, 9191.17, 9198.89, 9183.99, 9189.2, 39.802638], [1524906360000, 9189.18, 9189.21, 9155.06, 9180.0, 55.456572], [1524906420000, 9180.0, 9192.7, 9174.49, 9185.0, 52.11393], [1524906480000, 9186.77, 9223.78, 9184.08, 9219.46, 57.855014], [1524906540000, 9219.46, 9223.78, 9200.0, 9223.65, 31.366282], [1524906600000, 9219.0, 9223.77, 9210.0, 9222.94, 20.706363], [1524906660000, 9218.02, 9222.0, 9210.52, 9219.0, 8.558388], [1524906720000, 9218.99, 9218.99, 9202.0, 9206.81, 20.131123], [1524906780000, 9210.5, 9212.0, 9200.0, 9200.0, 24.028838], [1524906840000, 9200.0, 9200.0, 9184.07, 9195.61, 20.415518], [1524906900000, 9195.6, 9207.12, 9191.79, 9202.75, 48.244251], [1524906960000, 9202.75, 9210.0, 9195.0, 9207.0, 10.020061], [1524907020000, 9207.0, 9207.36, 9182.0, 9182.0, 28.699181], [1524907080000, 9189.85, 9190.07, 9171.02, 9180.0, 37.176748], [1524907140000, 9171.05, 9195.89, 9171.03, 9195.87, 26.415381], [1524907200000, 9192.99, 9195.89, 9188.12, 9195.89, 7.479244], [1524907260000, 9195.89, 9206.83, 9195.89, 9201.99, 9.864965], [1524907320000, 9201.0, 9227.91, 9201.0, 9225.0, 64.644316], [1524907380000, 9227.91, 9231.87, 9215.82, 9215.82, 49.386222], [1524907440000, 9217.07, 9224.99, 9215.82, 9224.99, 7.754905], [1524907500000, 9223.02, 9227.98, 9221.0, 9227.98, 7.650984], [1524907560000, 9227.0, 9266.69, 9227.0, 9262.51, 51.565991], [1524907620000, 9257.0, 9280.35, 9241.0, 9270.15, 96.606695], [1524907680000, 9279.0, 9288.0, 9259.98, 9264.0, 33.08526], [1524907740000, 9264.0, 9279.99, 9256.01, 9276.13, 11.898551], [1524907800000, 9270.0, 9280.0, 9253.0, 9265.96, 97.878643], [1524907860000, 9265.89, 9266.0, 9253.0, 9255.79, 15.292248], [1524907920000, 9255.79, 9257.99, 9245.0, 9245.03, 10.912108], [1524907980000, 9245.03, 9251.47, 9245.02, 9247.42, 14.069335], [1524908040000, 9249.0, 9251.5, 9247.44, 9248.03, 14.715889], [1524908100000, 9248.03, 9248.36, 9240.0, 9242.01, 17.702285], [1524908160000, 9244.99, 9245.2, 9224.11, 9233.92, 34.967873], [1524908220000, 9233.92, 9269.15, 9225.31, 9269.15, 16.938182], [1524908280000, 9257.78, 9300.4, 9257.78, 9297.67, 163.330222], [1524908340000, 9276.19, 9293.65, 9260.0, 9279.0, 24.352667], [1524908400000, 9272.63, 9286.27, 9269.02, 9280.88, 26.322845], [1524908460000, 9280.11, 9285.0, 9280.0, 9280.01, 23.628367], [1524908520000, 9280.04, 9285.0, 9278.0, 9278.0, 30.323808], [1524908580000, 9280.1, 9280.1, 9269.03, 9273.99, 9.660972], [1524908640000, 9273.0, 9275.0, 9270.0, 9275.0, 17.700082], [1524908700000, 9275.0, 9280.0, 9270.12, 9280.0, 8.520378], [1524908760000, 9280.0, 9280.0, 9272.01, 9275.0, 22.239112], [1524908820000, 9276.29, 9280.06, 9275.0, 9278.73, 12.609659], [1524908880000, 9278.73, 9280.08, 9278.73, 9280.05, 6.646339], [1524908940000, 9280.03, 9280.06, 9274.99, 9276.85, 8.1703], [1524909000000, 9276.85, 9276.85, 9270.22, 9273.97, 9.195855], [1524909060000, 9271.12, 9274.99, 9271.11, 9274.99, 8.087431], [1524909120000, 9274.99, 9274.99, 9252.71, 9254.56, 36.61168], [1524909180000, 9254.56, 9264.95, 9242.07, 9264.95, 19.701796], [1524909240000, 9260.72, 9265.42, 9252.2, 9260.0, 7.118839], [1524909300000, 9256.05, 9265.42, 9256.05, 9257.14, 6.515954], [1524909360000, 9257.14, 9267.0, 9257.14, 9257.83, 10.279723], [1524909420000, 9262.18, 9270.0, 9257.81, 9270.0, 14.078611], [1524909480000, 9270.0, 9274.99, 9267.0, 9274.97, 7.568269], [1524909540000, 9274.96, 9275.0, 9270.34, 9273.0, 6.992468], [1524909600000, 9273.0, 9275.0, 9271.0, 9271.0, 9.499706], [1524909660000, 9271.96, 9275.0, 9270.0, 9273.94, 7.419038], [1524909720000, 9273.93, 9273.94, 9263.12, 9268.71, 7.503009], [1524909780000, 9268.71, 9269.01, 9265.43, 9266.0, 4.680454], [1524909840000, 9268.84, 9273.92, 9266.0, 9272.03, 7.242068], [1524909900000, 9272.05, 9279.95, 9272.04, 9273.0, 15.53934], [1524909960000, 9275.76, 9278.89, 9275.5, 9275.77, 6.121931], [1524910020000, 9276.02, 9307.0, 9275.77, 9307.0, 111.291589], [1524910080000, 9307.0, 9310.0, 9257.8, 9261.39, 175.669331], [1524910140000, 9262.05, 9294.99, 9262.05, 9286.96, 14.439159], [1524910200000, 9280.75, 9309.51, 9280.75, 9309.49, 20.011098], [1524910260000, 9309.51, 9309.51, 9270.0, 9284.35, 47.966059], [1524910380000, 9299.87, 9299.87, 9296.42, 9299.87, 0.897399], [1524910440000, 9266.08, 9276.99, 9253.65, 9266.85, 13.579068]], "3m": [[1524820320000, 9256.54, 9268.99, 9256.53, 9268.0, 17.965908], [1524820500000, 9261.0, 9275.0, 9260.34, 9274.99, 22.587311], [1524820680000, 9274.99, 9279.0, 9269.0, 9277.77, 27.156959], [1524820860000, 9278.38, 9279.88, 9255.13, 9259.11, 70.514853], [1524821040000, 9259.11, 9272.9, 9251.53, 9267.0, 38.15932], [1524821220000, 9268.94, 9274.99, 9260.0, 9265.0, 58.595767], [1524821400000, 9266.01, 9266.01, 9250.01, 9262.0, 56.010012], [1524821580000, 9262.0, 9274.97, 9257.13, 9273.25, 97.984047], [1524821760000, 9273.62, 9298.42, 9272.0, 9291.06, 136.4422], [1524821940000, 9292.83, 9347.48, 9292.83, 9347.46, 441.835535], [1524822120000, 9346.0, 9361.86, 9339.17, 9348.83, 219.312757], [1524822300000, 9345.0, 9356.0, 9326.81, 9353.72, 95.659175], [1524822480000, 9350.0, 9369.0, 9345.42, 9356.99, 177.619858], [1524822660000, 9356.99, 9366.99, 9351.01, 9364.99, 57.772932], [1524822840000, 9364.99, 9380.0, 9362.65, 9379.91, 105.883418], [1524823020000, 9379.91, 9387.48, 9351.01, 9369.0, 197.09654], [1524823200000, 9369.0, 9376.5, 9334.92, 9334.92, 116.732734], [1524823380000, 9339.88, 9344.99, 9328.05, 9335.02, 85.776468], [1524823560000, 9338.01, 9349.99, 9335.01, 9337.06, 69.922722], [1524823740000, 9337.05, 9350.67, 9337.0, 9350.44, 63.161018], [1524823920000, 9350.42, 9367.23, 9347.02, 9350.0, 59.870558], [1524824100000, 9350.0, 9362.0, 9340.0, 9357.79, 54.228579], [1524824280000, 9357.79, 9376.44, 9355.0, 9375.0, 85.016259], [1524824460000, 9375.0, 9380.0, 9343.0, 9343.0, 113.875959], [1524824640000, 9350.01, 9366.0, 9341.39, 9363.41, 102.475466], [1524824820000, 9364.86, 9375.82, 9363.36, 9368.99, 64.689521], [1524825000000, 9368.99, 9370.98, 9360.0, 9360.43, 65.57585], [1524825180000, 9360.43, 9363.0, 9352.17, 9358.0, 43.782768], [1524825360000, 9358.0, 9362.85, 9352.2, 9362.85, 56.02431], [1524825540000, 9362.85, 9387.48, 9362.85, 9382.0, 189.800147], [1524825720000, 9387.0, 9395.0, 9371.0, 9382.01, 144.384705], [1524825900000, 9382.01, 9382.1, 9365.96, 9372.03, 81.655206], [1524826080000, 9375.98, 9376.0, 9370.0, 9370.7, 58.361986], [1524826260000, 9370.71, 9372.98, 9355.0, 9360.03, 75.920873], [1524826440000, 9362.0, 9362.0, 9350.0, 9359.99, 43.471116], [1524826620000, 9359.99, 9372.0, 9351.22, 9365.0, 42.029951], [1524826800000, 9363.31, 9367.97, 9361.0, 9362.0, 29.529304], [1524826980000, 9361.99, 9365.0, 9335.93, 9344.02, 132.678762], [1524827160000, 9344.02, 9349.0, 9337.77, 9345.49, 49.160885], [1524827340000, 9344.0, 9352.03, 9340.2, 9341.98, 31.052667], [1524827520000, 9341.5, 9354.0, 9340.21, 9340.21, 40.056582], [1524827700000, 9340.22, 9340.22, 9290.03, 9325.0, 200.422239], [1524827880000, 9325.0, 9325.04, 9301.0, 9313.34, 116.090073], [1524828060000, 9319.89, 9326.0, 9312.2, 9325.0, 50.718729], [1524828240000, 9326.0, 9340.0, 9321.02, 9326.02, 36.874643], [1524828420000, 9331.0, 9345.52, 9321.0, 9345.52, 49.782262], [1524828600000, 9343.0, 9345.54, 9335.0, 9335.01, 78.864618], [1524828780000, 9340.0, 9340.0, 9325.03, 9325.03, 31.208146], [1524828960000, 9325.02, 9329.84, 9320.0, 9323.06, 24.731149], [1524829140000, 9325.01, 9334.97, 9312.21, 9319.0, 67.560604], [1524829320000, 9318.99, 9321.2, 9280.59, 9300.0, 108.894507], [1524829500000, 9305.0, 9309.09, 9297.2, 9307.9, 50.701482], [1524829680000, 9307.9, 9329.1, 9300.06, 9320.94, 41.39432], [1524829860000, 9320.94, 9335.18, 9320.94, 9326.0, 35.469982], [1524830040000, 9326.0, 9332.91, 9312.6, 9315.78, 60.475868], [1524830220000, 9316.0, 9320.91, 9305.05, 9309.0, 95.250001], [1524830400000, 9308.9, 9320.86, 9308.9, 9310.0, 71.940021], [1524830580000, 9310.0, 9339.0, 9310.0, 9332.54, 102.497348], [1524830760000, 9332.54, 9338.99, 9332.0, 9336.08, 64.478181], [1524830940000, 9332.9, 9351.0, 9332.89, 9350.49, 46.805781], [1524831120000, 9350.5, 9355.0, 9334.1, 9345.0, 41.604706], [1524831300000, 9342.0, 9349.97, 9341.17, 9349.97, 63.043365], [1524831480000, 9347.99, 9348.84, 9345.58, 9345.98, 42.132927], [1524831660000, 9345.98, 9346.0, 9332.01, 9332.9, 49.657427], [1524831840000, 9332.89, 9348.09, 9325.0, 9340.22, 47.102398], [1524832020000, 9340.23, 9349.99, 9340.23, 9349.9, 21.433876], [1524832200000, 9349.9, 9350.0, 9343.0, 9343.0, 65.370408], [1524832380000, 9343.01, 9347.01, 9330.0, 9340.04, 66.805453], [1524832560000, 9345.0, 9345.0, 9326.04, 9335.02, 48.094731], [1524832740000, 9336.53, 9343.0, 9330.01, 9343.0, 97.387798], [1524832920000, 9342.99, 9347.0, 9337.72, 9339.01, 55.217177], [1524833100000, 9339.01, 9347.73, 9327.01, 9336.0, 34.596278], [1524833280000, 9336.0, 9337.3, 9301.0, 9307.0, 81.581592], [1524833460000, 9307.0, 9307.0, 9275.0, 9280.0, 105.926872], [1524833640000, 9275.01, 9290.0, 9253.68, 9284.0, 160.186873], [1524833820000, 9284.0, 9291.48, 9281.91, 9290.07, 43.513576], [1524834000000, 9290.01, 9295.0, 9273.97, 9290.01, 73.095565], [1524834180000, 9293.0, 9318.62, 9290.0, 9300.02, 102.793253], [1524834360000, 9298.0, 9300.01, 9282.15, 9289.0, 85.070729], [1524834540000, 9285.01, 9295.64, 9265.51, 9265.51, 91.552856], [1524834720000, 9267.99, 9268.0, 9240.21, 9241.01, 144.536543], [1524834900000, 9241.01, 9265.99, 9241.01, 9260.52, 72.524353], [1524835080000, 9264.0, 9264.0, 9245.13, 9245.44, 49.827845], [1524835260000, 9245.26, 9249.98, 9150.1, 9214.82, 602.329619], [1524835440000, 9214.82, 9228.3, 9185.96, 9197.43, 244.386207], [1524835620000, 9193.48, 9209.96, 9190.0, 9190.01, 101.87155], [1524835800000, 9190.01, 9202.39, 9171.45, 9178.69, 126.213129], [1524835980000, 9178.0, 9199.95, 9155.46, 9189.8, 203.826822], [1524836160000, 9188.39, 9235.29, 9188.39, 9214.93, 147.674722], [1524836340000, 9206.05, 9218.0, 9205.04, 9215.01, 49.497703], [1524836520000, 9215.01, 9250.0, 9214.0, 9221.0, 115.555892], [1524836700000, 9220.99, 9230.0, 9215.0, 9229.0, 54.778977], [1524836880000, 9229.0, 9232.0, 9201.0, 9213.93, 112.585161], [1524837060000, 9201.5, 9228.81, 9199.99, 9216.26, 65.663044], [1524837240000, 9216.26, 9231.5, 9212.9, 9228.0, 39.067736], [1524837420000, 9225.0, 9228.0, 9212.92, 9225.0, 42.220619], [1524837600000, 9226.97, 9228.91, 9202.0, 9212.9, 32.568979], [1524837780000, 9206.0, 9216.0, 9204.0, 9209.99, 36.509131], [1524837960000, 9204.09, 9220.0, 9204.07, 9213.01, 43.474957], [1524838140000, 9216.0, 9245.99, 9213.02, 9230.5, 53.993018], [1524838320000, 9233.0, 9249.0, 9228.0, 9240.0, 52.906225], [1524838500000, 9239.99, 9242.0, 9230.0, 9241.92, 44.916272], [1524838680000, 9241.93, 9241.93, 9231.61, 9234.0, 52.614045], [1524838860000, 9234.0, 9270.36, 9231.61, 9264.34, 132.161129], [1524839040000, 9256.33, 9266.64, 9240.11, 9247.29, 84.037582], [1524839220000, 9247.29, 9266.65, 9240.0, 9260.15, 67.452543], [1524839400000, 9260.15, 9275.0, 9244.67, 9254.47, 71.115597], [1524839580000, 9253.17, 9254.47, 9234.25, 9242.7, 60.076551], [1524839760000, 9236.0, 9243.99, 9219.01, 9227.99, 64.89765], [1524839940000, 9228.0, 9249.87, 9220.49, 9241.24, 98.783849], [1524840120000, 9241.24, 9259.99, 9241.24, 9253.04, 55.913855], [1524840300000, 9253.11, 9271.37, 9253.04, 9266.01, 77.407825], [1524840480000, 9266.01, 9268.62, 9253.04, 9254.11, 71.232061], [1524840660000, 9254.11, 9268.61, 9250.0, 9260.0, 89.920267], [1524840840000, 9260.0, 9271.68, 9256.01, 9270.99, 74.372854], [1524841020000, 9271.68, 9290.0, 9270.99, 9288.88, 136.704285], [1524841200000, 9280.14, 9288.88, 9250.0, 9250.03, 91.547571], [1524841380000, 9260.29, 9265.35, 9250.02, 9256.0, 84.489888], [1524841560000, 9256.36, 9268.02, 9251.0, 9265.01, 37.741309], [1524841740000, 9260.0, 9264.01, 9250.2, 9260.0, 71.182635], [1524841920000, 9259.95, 9264.0, 9250.2, 9250.21, 39.051412], [1524842100000, 9250.21, 9264.99, 9237.01, 9245.01, 66.337788], [1524842280000, 9245.02, 9256.0, 9238.55, 9246.87, 91.507637], [1524842460000, 9246.87, 9247.9, 9213.85, 9227.2, 132.740215], [1524842640000, 9230.59, 9237.97, 9210.01, 9228.2, 130.658953], [1524842820000, 9223.33, 9247.36, 9223.33, 9235.0, 100.138943], [1524843000000, 9235.14, 9239.77, 9225.0, 9238.99, 73.381386], [1524843180000, 9238.99, 9245.55, 9236.8, 9241.93, 69.046593], [1524843360000, 9240.01, 9255.1, 9239.71, 9251.48, 57.310136], [1524843540000, 9251.48, 9260.0, 9242.05, 9246.02, 79.332256], [1524843720000, 9246.02, 9255.69, 9246.01, 9251.01, 46.827751], [1524843900000, 9251.01, 9255.69, 9249.99, 9254.73, 41.409231], [1524844080000, 9250.05, 9255.0, 9248.01, 9248.01, 26.559487], [1524844260000, 9248.01, 9250.0, 9240.01, 9242.36, 36.727917], [1524844440000, 9242.35, 9242.5, 9240.01, 9242.5, 34.40672], [1524844620000, 9242.4, 9250.57, 9240.97, 9241.21, 49.561342], [1524844800000, 9241.2, 9285.0, 9241.0, 9280.76, 117.292332], [1524844980000, 9280.76, 9293.0, 9269.0, 9290.14, 84.201974], [1524845160000, 9293.0, 9299.37, 9286.0, 9289.98, 101.056453], [1524845340000, 9294.0, 9297.51, 9282.0, 9294.08, 48.231775], [1524845520000, 9297.51, 9310.96, 9291.03, 9308.87, 139.284508], [1524845700000, 9306.0, 9315.0, 9291.01, 9313.0, 85.993788], [1524845880000, 9313.0, 9328.26, 9300.0, 9301.0, 151.906037], [1524846060000, 9305.0, 9308.32, 9280.0, 9289.99, 104.474608], [1524846240000, 9289.99, 9298.98, 9280.14, 9298.0, 50.097256], [1524846420000, 9298.39, 9298.4, 9293.12, 9297.0, 41.470481], [1524846600000, 9296.95, 9300.0, 9285.05, 9285.35, 58.167533], [1524846780000, 9285.35, 9298.57, 9285.05, 9290.5, 45.941882], [1524846960000, 9290.51, 9290.51, 9276.0, 9279.28, 42.544516], [1524847140000, 9279.28, 9281.97, 9269.0, 9281.97, 41.17794], [1524847320000, 9281.97, 9290.0, 9281.0, 9287.0, 48.609955], [1524847500000, 9290.0, 9294.44, 9285.0, 9290.0, 56.756996], [1524847680000, 9285.0, 9294.02, 9275.78, 9282.06, 33.356792], [1524847860000, 9275.87, 9293.95, 9275.87, 9290.7, 50.686255], [1524848040000, 9292.76, 9299.46, 9285.95, 9294.91, 40.068541], [1524848220000, 9295.13, 9299.99, 9280.0, 9282.1, 54.192479], [1524848400000, 9286.01, 9299.98, 9286.0, 9297.77, 45.197292], [1524848580000, 9297.77, 9297.81, 9295.99, 9295.99, 26.076214], [1524848760000, 9295.99, 9296.02, 9290.0, 9295.03, 27.326209], [1524848940000, 9295.03, 9295.03, 9289.0, 9290.0, 24.139946], [1524849120000, 9290.01, 9293.48, 9269.54, 9280.97, 52.264177], [1524849300000, 9280.97, 9281.5, 9266.0, 9272.99, 100.183547], [1524849480000, 9278.95, 9285.0, 9270.05, 9275.0, 26.919113], [1524849660000, 9275.0, 9292.0, 9272.98, 9291.59, 90.192369], [1524849840000, 9291.49, 9319.99, 9286.02, 9307.01, 62.294069], [1524850020000, 9307.03, 9318.58, 9300.48, 9301.33, 58.610436], [1524850200000, 9301.83, 9308.32, 9298.0, 9298.0, 95.716375], [1524850380000, 9298.0, 9316.0, 9293.0, 9301.82, 29.49499], [1524850560000, 9306.0, 9310.0, 9286.73, 9288.18, 88.044775], [1524850740000, 9288.18, 9299.0, 9282.99, 9297.0, 69.284531], [1524850920000, 9296.2, 9299.0, 9290.0, 9298.0, 63.998894], [1524851100000, 9294.99, 9303.15, 9290.02, 9294.99, 67.721018], [1524851280000, 9294.99, 9299.7, 9291.0, 9292.6, 52.545071], [1524851460000, 9292.6, 9299.0, 9292.52, 9295.22, 47.8328], [1524851640000, 9295.23, 9300.04, 9292.53, 9296.4, 45.05097], [1524851820000, 9296.0, 9305.0, 9290.1, 9290.1, 49.337286], [1524852000000, 9290.1, 9296.31, 9285.0, 9285.0, 51.179159], [1524852180000, 9285.01, 9295.0, 9240.0, 9271.97, 127.587276], [1524852360000, 9271.97, 9280.0, 9260.4, 9278.0, 50.621677], [1524852540000, 9278.0, 9280.0, 9271.06, 9272.0, 28.555642], [1524852720000, 9279.0, 9279.94, 9271.01, 9272.47, 21.805206], [1524852900000, 9272.47, 9282.0, 9272.46, 9280.64, 54.648958], [1524853080000, 9280.64, 9280.64, 9273.0, 9273.0, 63.70994], [1524853260000, 9273.0, 9278.18, 9230.0, 9255.0, 97.297323], [1524853440000, 9239.31, 9258.04, 9225.0, 9244.36, 65.619042], [1524853620000, 9249.0, 9262.0, 9237.69, 9244.93, 38.729004], [1524853800000, 9244.94, 9245.0, 9232.0, 9241.0, 42.380592], [1524853980000, 9238.0, 9243.0, 9220.0, 9223.14, 59.862367], [1524854160000, 9222.01, 9235.0, 9213.8, 9231.73, 64.39189], [1524854340000, 9231.73, 9253.0, 9228.0, 9247.05, 33.632148], [1524854520000, 9249.02, 9271.76, 9242.27, 9252.0, 37.500727], [1524854700000, 9252.0, 9268.99, 9252.0, 9252.07, 33.754603], [1524854880000, 9266.44, 9266.44, 9247.09, 9251.99, 24.376311], [1524855060000, 9251.06, 9251.99, 9240.28, 9245.85, 22.906916], [1524855240000, 9245.84, 9245.84, 9232.4, 9236.6, 34.667013], [1524855420000, 9236.6, 9236.8, 9230.0, 9230.89, 48.681348], [1524855600000, 9230.89, 9231.0, 9220.0, 9223.77, 45.352667], [1524855780000, 9223.77, 9236.4, 9223.76, 9236.4, 49.394287], [1524855960000, 9236.39, 9250.56, 9230.12, 9234.0, 59.029698], [1524856140000, 9230.12, 9236.39, 9222.08, 9225.0, 16.064171], [1524856320000, 9225.01, 9235.0, 9191.0, 9195.04, 152.411743], [1524856500000, 9195.02, 9210.0, 9188.0, 9198.0, 73.010014], [1524856680000, 9198.0, 9219.83, 9193.22, 9202.01, 40.017845], [1524856860000, 9202.01, 9205.0, 9182.5, 9184.24, 96.304923], [1524857040000, 9190.04, 9215.11, 9168.0, 9180.22, 101.067572], [1524857220000, 9185.96, 9200.0, 9175.03, 9190.0, 60.134796], [1524857400000, 9189.85, 9199.0, 9185.02, 9185.11, 45.860247], [1524857580000, 9190.0, 9190.0, 9171.11, 9174.01, 65.14765], [1524857760000, 9174.01, 9195.99, 9170.0, 9184.2, 88.4563], [1524857940000, 9184.19, 9210.0, 9181.07, 9199.99, 54.908563], [1524858120000, 9199.99, 9200.0, 9185.19, 9187.97, 27.362098], [1524858300000, 9185.19, 9190.0, 9171.62, 9174.99, 47.963205], [1524858480000, 9174.99, 9175.52, 9109.0, 9119.98, 367.694199], [1524858660000, 9115.41, 9151.99, 9092.0, 9115.0, 350.722059], [1524858840000, 9111.0, 9125.4, 9102.0, 9115.11, 144.400495], [1524859020000, 9120.0, 9120.0, 9075.01, 9089.0, 211.882908], [1524859200000, 9089.12, 9140.0, 9087.02, 9140.0, 145.995816], [1524859380000, 9132.0, 9153.99, 9126.29, 9142.67, 149.915286], [1524859560000, 9139.99, 9163.38, 9130.95, 9150.0, 76.251713], [1524859740000, 9153.58, 9154.0, 9131.15, 9135.7, 71.002633], [1524859920000, 9140.3, 9144.48, 9132.01, 9133.42, 42.488541], [1524860100000, 9133.42, 9133.42, 9101.0, 9114.97, 72.2149], [1524860280000, 9114.97, 9116.95, 9104.74, 9105.0, 37.643021], [1524860460000, 9105.0, 9114.99, 9096.0, 9100.0, 50.137835], [1524860640000, 9100.0, 9103.0, 9068.42, 9070.0, 177.297302], [1524860820000, 9068.42, 9110.0, 9054.01, 9090.55, 167.125788], [1524861000000, 9090.55, 9098.68, 9055.44, 9060.13, 95.466121], [1524861180000, 9060.14, 9077.0, 9055.0, 9056.22, 74.137342], [1524861360000, 9056.22, 9060.0, 9005.0, 9010.0, 352.701494], [1524861540000, 9010.0, 9022.0, 8960.0, 8961.17, 365.520908], [1524861720000, 8961.17, 8995.0, 8952.0, 8964.99, 334.444216], [1524861900000, 8955.02, 9019.0, 8952.0, 9010.63, 312.750403], [1524862080000, 9010.63, 9018.6, 8961.77, 8978.45, 155.545939], [1524862260000, 8978.45, 9020.0, 8978.45, 8989.92, 127.967408], [1524862440000, 8998.99, 8998.99, 8945.41, 8954.01, 159.428966], [1524862620000, 8954.0, 8984.98, 8940.0, 8970.0, 116.030476], [1524862800000, 8969.99, 8978.0, 8936.0, 8947.7, 145.62345], [1524862980000, 8941.26, 8950.0, 8909.83, 8937.9, 232.297481], [1524863160000, 8928.16, 8967.62, 8926.27, 8955.0, 100.247706], [1524863340000, 8955.0, 9000.0, 8955.0, 9000.0, 120.626183], [1524863520000, 9000.0, 9040.0, 8990.03, 9029.92, 198.373252], [1524863700000, 9024.99, 9053.0, 9020.2, 9040.0, 161.107212], [1524863880000, 9040.2, 9043.96, 9008.59, 9018.9, 116.03357], [1524864060000, 9018.9, 9033.07, 9016.98, 9030.0, 57.620415], [1524864240000, 9030.0, 9035.0, 9021.0, 9021.02, 77.767767], [1524864420000, 9021.02, 9029.0, 8980.0, 8991.0, 105.380504], [1524864600000, 8991.0, 8998.88, 8970.01, 8983.2, 59.730124], [1524864780000, 8984.94, 8998.85, 8980.0, 8991.89, 91.864868], [1524864960000, 8991.89, 9012.57, 8991.89, 9007.04, 50.568993], [1524865140000, 9005.0, 9019.96, 9000.8, 9011.98, 55.586177], [1524865320000, 9011.98, 9018.0, 8990.0, 8995.17, 35.761776], [1524865500000, 8995.17, 8995.17, 8976.05, 8989.93, 58.674216], [1524865680000, 8990.01, 9014.99, 8990.01, 9012.8, 34.628943], [1524865860000, 9014.99, 9042.09, 9013.02, 9025.0, 58.605159], [1524866040000, 9031.11, 9031.12, 9010.0, 9025.0, 45.926732], [1524866220000, 9024.99, 9029.64, 8966.44, 8975.35, 104.809126], [1524866400000, 8975.36, 9005.4, 8975.36, 9000.11, 83.712641], [1524866580000, 9000.13, 9015.0, 8991.9, 8991.92, 76.188776], [1524866760000, 8995.96, 9024.99, 8985.06, 9024.98, 43.594865], [1524866940000, 9024.99, 9043.86, 9024.98, 9040.72, 51.510171], [1524867120000, 9040.74, 9045.0, 9037.61, 9042.67, 45.392008], [1524867300000, 9042.01, 9045.0, 9030.0, 9032.05, 41.883403], [1524867480000, 9032.06, 9035.36, 9024.96, 9034.06, 35.326086], [1524867660000, 9033.99, 9035.38, 9025.57, 9034.95, 18.379881], [1524867840000, 9034.95, 9070.0, 9034.0, 9069.23, 81.194105], [1524868020000, 9069.97, 9073.77, 9060.2, 9071.0, 57.863568], [1524868200000, 9071.0, 9073.77, 9060.0, 9060.01, 60.371898], [1524868380000, 9062.0, 9072.99, 9060.01, 9072.98, 28.522452], [1524868560000, 9072.99, 9078.0, 9070.2, 9074.0, 47.561373], [1524868740000, 9072.02, 9093.09, 9071.18, 9071.47, 91.608396], [1524868920000, 9089.96, 9089.96, 9071.7, 9079.01, 45.202591], [1524869100000, 9085.0, 9085.0, 9051.02, 9060.1, 101.106308], [1524869280000, 9060.1, 9066.05, 9055.0, 9064.0, 36.715127], [1524869460000, 9064.93, 9066.0, 9058.0, 9061.0, 32.673291], [1524869640000, 9061.0, 9068.99, 9042.21, 9043.1, 61.983552], [1524869820000, 9043.08, 9049.0, 9030.01, 9031.0, 36.297484], [1524870000000, 9032.0, 9036.1, 9022.0, 9031.5, 98.299783], [1524870180000, 9030.02, 9037.0, 9025.01, 9037.0, 25.042572], [1524870360000, 9033.28, 9063.61, 9033.28, 9057.37, 56.814258], [1524870540000, 9063.61, 9073.93, 9057.4, 9067.0, 37.254511], [1524870720000, 9067.0, 9072.51, 9043.96, 9056.95, 41.147909], [1524870900000, 9058.99, 9059.0, 9038.0, 9042.94, 33.529981], [1524871080000, 9042.94, 9046.0, 9040.0, 9041.99, 19.387134], [1524871260000, 9040.01, 9045.0, 9040.01, 9044.9, 48.847825], [1524871440000, 9044.99, 9058.99, 9040.01, 9043.0, 23.863377], [1524871620000, 9042.0, 9044.0, 9034.99, 9038.0, 20.939963], [1524871800000, 9038.0, 9038.0, 8970.0, 8999.08, 166.40848], [1524871980000, 9004.83, 9004.83, 8970.1, 8976.97, 82.619744], [1524872160000, 8980.0, 8991.9, 8972.83, 8981.08, 27.002792], [1524872340000, 8981.08, 8996.53, 8981.07, 8991.0, 38.713176], [1524872520000, 8991.0, 8996.67, 8987.92, 8991.0, 77.558981], [1524872700000, 8990.99, 8996.0, 8981.25, 8987.99, 32.275564], [1524872880000, 8989.97, 8990.0, 8968.45, 8975.23, 47.981573], [1524873060000, 8975.02, 8976.99, 8911.01, 8920.0, 155.801824], [1524873240000, 8920.0, 8926.99, 8900.01, 8906.99, 107.746832], [1524873420000, 8900.01, 8929.79, 8889.0, 8915.35, 183.532672], [1524873600000, 8915.35, 8915.35, 8870.0, 8894.01, 224.501377], [1524873780000, 8895.0, 8900.98, 8871.06, 8889.36, 135.198736], [1524873960000, 8899.02, 8930.0, 8888.89, 8928.01, 98.390747], [1524874140000, 8928.01, 8932.8, 8900.0, 8903.98, 80.343379], [1524874320000, 8908.5, 8938.2, 8903.0, 8938.2, 90.694246], [1524874500000, 8938.2, 8947.65, 8916.14, 8926.44, 93.002032], [1524874680000, 8929.03, 8949.01, 8921.0, 8935.03, 97.088986], [1524874860000, 8935.02, 8978.46, 8930.0, 8978.46, 43.247936], [1524875040000, 8978.46, 8987.0, 8965.03, 8974.84, 84.292493], [1524875220000, 8965.02, 8982.72, 8961.71, 8976.98, 31.176037], [1524875400000, 8976.99, 9007.12, 8976.04, 8995.0, 73.267566], [1524875580000, 8995.01, 8997.8, 8976.98, 8985.79, 45.094274], [1524875760000, 8983.0, 9018.9, 8981.0, 9014.79, 61.135426], [1524875940000, 9015.0, 9045.0, 9009.01, 9033.04, 55.549837], [1524876120000, 9033.05, 9049.76, 9022.0, 9040.0, 57.409416], [1524876300000, 9040.0, 9040.09, 9007.2, 9012.82, 60.810408], [1524876480000, 9022.6, 9041.0, 9012.87, 9024.99, 240.42962], [1524876660000, 9024.99, 9027.73, 9018.0, 9020.0, 49.524857], [1524876840000, 9019.0, 9020.0, 8998.0, 9001.21, 64.060588], [1524877020000, 9001.21, 9010.12, 8988.99, 9010.11, 68.822359], [1524877200000, 9005.98, 9029.85, 9005.97, 9025.3, 58.380084], [1524877380000, 9022.8, 9029.85, 9000.0, 9006.64, 97.41693], [1524877560000, 9005.01, 9019.0, 9000.0, 9012.46, 44.839443], [1524877740000, 9012.46, 9019.0, 9012.44, 9018.99, 33.34601], [1524877920000, 9018.99, 9031.85, 9017.91, 9030.01, 58.612312], [1524878100000, 9030.01, 9037.43, 9024.0, 9036.0, 60.849697], [1524878280000, 9036.0, 9042.79, 9032.8, 9033.51, 55.679038], [1524878460000, 9033.51, 9036.21, 9012.45, 9025.54, 56.759371], [1524878640000, 9025.31, 9027.1, 9013.0, 9020.0, 22.856911], [1524878820000, 9020.0, 9035.99, 9015.5, 9035.0, 38.843381], [1524879000000, 9036.0, 9036.71, 9025.01, 9035.58, 16.60223], [1524879180000, 9035.98, 9063.9, 9029.22, 9060.0, 65.38396], [1524879360000, 9060.0, 9072.06, 9060.0, 9070.01, 67.463642], [1524879540000, 9070.01, 9092.54, 9070.0, 9087.84, 115.324786], [1524879720000, 9089.89, 9097.99, 9087.84, 9092.0, 79.63201], [1524879900000, 9095.93, 9095.94, 9075.0, 9089.99, 82.621944], [1524880080000, 9089.99, 9095.16, 9085.14, 9091.98, 66.407365], [1524880260000, 9094.2, 9098.0, 9085.0, 9089.02, 59.223972], [1524880440000, 9089.02, 9096.0, 9084.98, 9095.42, 69.512059], [1524880620000, 9096.0, 9126.81, 9095.42, 9126.81, 149.106303], [1524880800000, 9126.81, 9128.09, 9089.98, 9090.18, 135.439412], [1524880980000, 9099.09, 9111.85, 9090.17, 9111.01, 55.306974], [1524881160000, 9111.0, 9129.17, 9111.0, 9114.01, 68.343487], [1524881340000, 9115.0, 9129.0, 9100.32, 9121.84, 71.456261], [1524881520000, 9121.84, 9128.0, 9100.39, 9110.01, 38.737872], [1524881700000, 9108.0, 9115.0, 9075.19, 9088.03, 124.817208], [1524881880000, 9083.18, 9091.59, 9075.19, 9086.99, 69.308584], [1524882060000, 9086.99, 9118.48, 9080.06, 9111.01, 88.994455], [1524882240000, 9116.94, 9123.03, 9100.0, 9100.0, 93.727575], [1524882420000, 9100.0, 9115.94, 9100.0, 9100.33, 64.118825], [1524882600000, 9100.33, 9109.99, 9100.33, 9108.0, 49.360612], [1524882780000, 9108.99, 9116.58, 9105.21, 9105.25, 41.438874], [1524882960000, 9105.67, 9119.0, 9105.67, 9108.03, 33.483808], [1524883140000, 9108.04, 9112.86, 9100.33, 9101.99, 32.09833], [1524883320000, 9101.5, 9110.01, 9086.7, 9094.98, 57.58695], [1524883500000, 9094.99, 9094.99, 9073.68, 9083.0, 48.110269], [1524883680000, 9083.99, 9093.13, 9073.7, 9073.86, 31.473093], [1524883860000, 9073.86, 9086.99, 9055.0, 9066.24, 95.595213], [1524884040000, 9070.0, 9072.86, 9050.0, 9060.01, 55.108206], [1524884220000, 9065.91, 9070.03, 9053.47, 9055.78, 63.13005], [1524884400000, 9053.47, 9078.9, 9051.0, 9065.0, 21.820567], [1524884580000, 9074.51, 9083.3, 9065.01, 9080.0, 37.440025], [1524884760000, 9082.84, 9086.0, 9078.0, 9085.05, 33.756874], [1524884940000, 9085.0, 9100.0, 9083.3, 9098.38, 58.711865], [1524885120000, 9093.02, 9100.0, 9092.0, 9097.51, 40.84924], [1524885300000, 9096.28, 9097.51, 9093.0, 9096.51, 26.583458], [1524885480000, 9096.51, 9113.7, 9094.5, 9109.0, 57.56701], [1524885660000, 9109.0, 9146.99, 9101.98, 9121.26, 105.681193], [1524885840000, 9125.0, 9130.0, 9120.0, 9122.01, 64.481931], [1524886020000, 9124.99, 9130.26, 9110.46, 9112.27, 31.359973], [1524886200000, 9112.0, 9121.99, 9110.0, 9115.99, 26.434295], [1524886380000, 9114.01, 9130.0, 9114.01, 9124.23, 42.344127], [1524886560000, 9124.23, 9128.48, 9108.94, 9111.01, 43.137785], [1524886740000, 9113.12, 9124.0, 9100.0, 9120.0, 44.9569], [1524886920000, 9113.4, 9120.0, 9106.41, 9114.0, 16.668356], [1524887100000, 9114.0, 9136.01, 9114.0, 9132.57, 40.508622], [1524887280000, 9132.57, 9141.3, 9126.31, 9140.0, 45.727068], [1524887460000, 9140.0, 9180.75, 9138.88, 9162.24, 210.353926], [1524887640000, 9170.99, 9196.32, 9152.44, 9158.32, 86.867462], [1524887820000, 9167.0, 9170.0, 9152.44, 9155.0, 53.817992], [1524888000000, 9155.01, 9168.71, 9155.0, 9159.33, 44.613078], [1524888180000, 9157.93, 9163.76, 9137.72, 9137.75, 77.240074], [1524888360000, 9143.27, 9151.11, 9137.73, 9148.99, 47.110268], [1524888540000, 9148.0, 9149.99, 9137.73, 9140.46, 32.372006], [1524888720000, 9140.46, 9149.71, 9137.74, 9142.99, 29.742109], [1524888900000, 9142.99, 9145.97, 9130.01, 9141.1, 40.281239], [1524889080000, 9140.51, 9144.0, 9140.0, 9140.56, 28.8669], [1524889260000, 9140.28, 9150.0, 9139.79, 9150.0, 48.073429], [1524889440000, 9149.99, 9162.34, 9149.99, 9162.0, 42.94468], [1524889620000, 9160.0, 9162.0, 9153.59, 9160.95, 54.143807], [1524889800000, 9160.92, 9161.11, 9151.35, 9161.1, 61.350768], [1524889980000, 9157.0, 9161.11, 9131.0, 9144.15, 40.524119], [1524890160000, 9146.81, 9155.0, 9137.0, 9142.77, 39.012018], [1524890340000, 9144.36, 9165.47, 9142.81, 9165.15, 31.77531], [1524890520000, 9165.15, 9165.47, 9148.01, 9148.01, 23.288191], [1524890700000, 9148.01, 9158.0, 9146.0, 9150.04, 34.248188], [1524890880000, 9155.63, 9157.0, 9128.99, 9140.74, 46.404347], [1524891060000, 9140.53, 9140.75, 9116.0, 9119.99, 45.128025], [1524891240000, 9120.0, 9149.0, 9111.21, 9134.11, 35.114467], [1524891420000, 9140.0, 9145.0, 9134.01, 9138.53, 114.687307], [1524891600000, 9138.54, 9157.1, 9127.64, 9151.0, 74.582556], [1524891780000, 9154.6, 9154.6, 9141.34, 9144.01, 13.999426], [1524891960000, 9147.7, 9168.2, 9144.0, 9160.01, 76.266215], [1524892140000, 9160.02, 9168.09, 9160.0, 9167.06, 24.059568], [1524892320000, 9162.01, 9184.8, 9162.01, 9180.02, 79.990418], [1524892500000, 9180.02, 9188.5, 9167.06, 9172.01, 42.032031], [1524892680000, 9172.0, 9176.94, 9170.02, 9172.98, 40.591824], [1524892860000, 9172.98, 9176.93, 9170.0, 9175.26, 34.486049], [1524893040000, 9175.0, 9177.78, 9151.59, 9167.8, 58.709037], [1524893220000, 9167.8, 9168.7, 9151.45, 9157.1, 76.602552], [1524893400000, 9157.0, 9164.18, 9144.01, 9153.78, 68.373627], [1524893580000, 9154.3, 9164.0, 9150.51, 9153.82, 40.875707], [1524893760000, 9153.82, 9163.56, 9141.3, 9153.34, 26.120301], [1524893940000, 9162.86, 9163.54, 9141.3, 9150.0, 31.435654], [1524894120000, 9150.0, 9158.0, 9144.39, 9156.99, 33.793407], [1524894300000, 9150.02, 9157.0, 9140.67, 9148.61, 17.865428], [1524894480000, 9148.34, 9158.0, 9148.07, 9157.0, 30.114421], [1524894660000, 9157.04, 9162.0, 9157.0, 9157.06, 34.639092], [1524894840000, 9157.06, 9168.72, 9150.0, 9160.0, 62.168933], [1524895020000, 9162.0, 9169.0, 9152.0, 9164.49, 67.319077], [1524895200000, 9164.48, 9175.0, 9160.01, 9174.0, 42.448046], [1524895380000, 9174.01, 9175.53, 9163.73, 9175.01, 47.647471], [1524895560000, 9170.01, 9179.78, 9166.0, 9179.78, 94.07506], [1524895740000, 9179.0, 9198.61, 9169.9, 9185.86, 173.163745], [1524895920000, 9194.61, 9199.99, 9180.0, 9189.93, 77.257661], [1524896100000, 9189.93, 9190.0, 9177.08, 9187.0, 83.547023], [1524896280000, 9185.88, 9200.0, 9185.88, 9190.74, 65.605851], [1524896460000, 9194.72, 9195.0, 9170.0, 9178.0, 50.042278], [1524896640000, 9175.0, 9184.0, 9170.3, 9177.97, 31.911551], [1524896820000, 9182.61, 9185.13, 9170.02, 9184.0, 32.748598], [1524897000000, 9184.01, 9190.0, 9175.0, 9189.94, 29.705153], [1524897180000, 9189.84, 9200.77, 9189.84, 9200.72, 89.765755], [1524897360000, 9195.02, 9200.89, 9180.0, 9195.05, 51.26914], [1524897540000, 9195.04, 9200.3, 9180.72, 9195.0, 62.450288], [1524897720000, 9195.0, 9209.8, 9190.02, 9203.0, 92.926092], [1524897900000, 9203.0, 9211.74, 9200.0, 9205.0, 63.468255], [1524898080000, 9210.0, 9215.66, 9205.0, 9213.94, 59.383645], [1524898260000, 9206.73, 9213.75, 9178.35, 9193.0, 76.084552], [1524898440000, 9195.0, 9195.14, 9174.22, 9182.92, 49.592592], [1524898620000, 9178.98, 9182.92, 9150.67, 9163.03, 75.717019], [1524898800000, 9163.02, 9171.07, 9132.71, 9139.0, 64.81254], [1524898980000, 9138.99, 9153.14, 9130.02, 9135.01, 156.844535], [1524899160000, 9134.22, 9135.01, 9128.13, 9131.99, 87.721927], [1524899340000, 9131.04, 9160.6, 9128.0, 9151.99, 57.810283], [1524899520000, 9151.99, 9160.0, 9145.97, 9150.99, 41.055126], [1524899700000, 9151.0, 9157.85, 9146.0, 9150.0, 29.188896], [1524899880000, 9150.0, 9153.0, 9147.1, 9151.5, 38.667182], [1524900060000, 9151.1, 9161.01, 9151.0, 9160.99, 29.545694], [1524900240000, 9160.99, 9165.0, 9154.1, 9161.99, 49.263643], [1524900420000, 9157.0, 9161.99, 9153.6, 9153.67, 27.707889], [1524900600000, 9153.67, 9154.08, 9126.01, 9135.0, 67.897209], [1524900780000, 9134.59, 9147.93, 9133.0, 9136.15, 93.440155], [1524900960000, 9136.15, 9139.9, 9109.0, 9113.96, 88.911147], [1524901140000, 9119.98, 9142.1, 9108.99, 9135.25, 73.495457], [1524901320000, 9135.26, 9139.59, 9124.45, 9124.92, 30.259397], [1524901500000, 9129.81, 9129.81, 9110.0, 9119.95, 69.91081], [1524901680000, 9119.99, 9130.0, 9112.11, 9128.0, 77.875513], [1524901860000, 9128.0, 9137.65, 9125.04, 9134.99, 35.992718], [1524902040000, 9135.0, 9145.0, 9120.08, 9122.93, 59.197786], [1524902220000, 9122.94, 9134.47, 9118.7, 9126.22, 23.502908], [1524902400000, 9121.05, 9126.21, 9110.33, 9119.0, 45.310816], [1524902580000, 9115.03, 9118.0, 9102.0, 9102.49, 42.884335], [1524902760000, 9102.49, 9112.0, 9084.73, 9090.01, 132.754993], [1524902940000, 9094.21, 9102.0, 9083.03, 9083.05, 60.470988], [1524903120000, 9083.05, 9096.0, 9081.02, 9088.99, 57.857385], [1524903300000, 9089.0, 9100.31, 9085.02, 9099.21, 74.251154], [1524903480000, 9099.41, 9110.0, 9090.48, 9090.48, 54.880595], [1524903660000, 9091.53, 9099.9, 9088.98, 9097.98, 80.383883], [1524903840000, 9097.98, 9098.0, 9089.33, 9093.38, 39.923106], [1524904020000, 9097.99, 9098.0, 9086.96, 9090.0, 38.686796], [1524904200000, 9090.0, 9174.0, 9088.96, 9174.0, 174.561272], [1524904380000, 9171.34, 9285.25, 9171.3, 9285.0, 434.634333], [1524904560000, 9283.24, 9298.72, 9266.0, 9273.01, 254.054411], [1524904740000, 9273.01, 9322.31, 9265.42, 9310.01, 216.393199], [1524904920000, 9310.01, 9330.0, 9300.0, 9320.0, 275.196921], [1524905100000, 9315.0, 9325.0, 9276.82, 9283.89, 229.532547], [1524905280000, 9287.94, 9312.99, 9283.89, 9300.08, 100.528471], [1524905460000, 9300.08, 9303.03, 9281.0, 9284.05, 69.179566], [1524905640000, 9284.05, 9307.99, 9283.0, 9307.08, 94.024607], [1524905820000, 9307.08, 9312.91, 9190.0, 9217.48, 573.243995], [1524906000000, 9227.49, 9250.0, 9155.55, 9197.82, 359.600328], [1524906180000, 9200.0, 9217.99, 9183.99, 9189.2, 130.178032], [1524906360000, 9189.18, 9223.78, 9155.06, 9219.46, 165.425516], [1524906540000, 9219.46, 9223.78, 9200.0, 9219.0, 60.631033], [1524906720000, 9218.99, 9218.99, 9184.07, 9195.61, 64.575479], [1524906900000, 9195.6, 9210.0, 9182.0, 9182.0, 86.963493], [1524907080000, 9189.85, 9195.89, 9171.02, 9195.89, 71.071373], [1524907260000, 9195.89, 9231.87, 9195.89, 9215.82, 123.895503], [1524907440000, 9217.07, 9266.69, 9215.82, 9262.51, 66.97188], [1524907620000, 9257.0, 9288.0, 9241.0, 9276.13, 141.590506], [1524907800000, 9270.0, 9280.0, 9245.0, 9245.03, 124.082999], [1524907980000, 9245.03, 9251.5, 9240.0, 9242.01, 46.487509], [1524908160000, 9244.99, 9300.4, 9224.11, 9297.67, 215.236277], [1524908340000, 9276.19, 9293.65, 9260.0, 9280.01, 74.303879], [1524908520000, 9280.04, 9285.0, 9269.03, 9275.0, 57.684862], [1524908700000, 9275.0, 9280.06, 9270.12, 9278.73, 43.369149], [1524908880000, 9278.73, 9280.08, 9270.22, 9273.97, 24.012494], [1524909060000, 9271.12, 9274.99, 9242.07, 9264.95, 64.400907], [1524909240000, 9260.72, 9267.0, 9252.2, 9257.83, 23.914516], [1524909420000, 9262.18, 9275.0, 9257.81, 9273.0, 28.639348], [1524909600000, 9273.0, 9275.0, 9263.12, 9268.71, 24.421753], [1524909780000, 9268.71, 9279.95, 9265.43, 9273.0, 27.461862], [1524909960000, 9275.76, 9310.0, 9257.8, 9261.39, 293.082851], [1524910140000, 9262.05, 9309.51, 9262.05, 9284.35, 82.416316]], "5m": [[1524760500000, 8849.99, 8888.0, 8845.02, 8880.0, 129.512743], [1524760800000, 8883.8, 8894.0, 8855.0, 8876.99, 123.961977], [1524761100000, 8875.98, 8900.0, 8873.85, 8894.71, 110.855444], [1524761400000, 8894.99, 8896.0, 8875.02, 8884.59, 97.548219], [1524761700000, 8884.79, 8908.53, 8884.59, 8900.51, 134.469739], [1524762000000, 8899.0, 8902.42, 8875.0, 8879.98, 115.819683], [1524762300000, 8879.98, 8886.07, 8867.5, 8876.9, 83.479488], [1524762600000, 8876.9, 8890.0, 8872.63, 8884.89, 92.528381], [1524762900000, 8884.0, 8920.0, 8881.87, 8920.0, 79.03783], [1524763200000, 8918.95, 8925.0, 8880.0, 8898.76, 162.32123], [1524763500000, 8898.73, 8908.78, 8860.35, 8871.87, 84.93392], [1524763800000, 8875.0, 8898.92, 8865.0, 8888.91, 95.344983], [1524764100000, 8890.47, 8890.47, 8872.86, 8879.05, 62.663578], [1524764400000, 8879.05, 8880.0, 8846.0, 8854.0, 99.783039], [1524764700000, 8854.0, 8879.99, 8845.03, 8879.99, 83.266987], [1524765000000, 8875.0, 8889.13, 8861.0, 8870.01, 99.420139], [1524765300000, 8873.3, 8881.04, 8847.09, 8866.43, 63.197393], [1524765600000, 8866.43, 8876.29, 8857.9, 8868.45, 39.955016], [1524765900000, 8868.45, 8868.88, 8839.53, 8851.68, 54.858665], [1524766200000, 8851.07, 8869.74, 8851.04, 8869.0, 53.113307], [1524766500000, 8869.73, 8870.0, 8860.0, 8870.0, 46.098413], [1524766800000, 8869.99, 8909.0, 8867.01, 8893.0, 73.927972], [1524767100000, 8893.0, 8901.0, 8873.99, 8882.92, 100.470018], [1524767400000, 8882.92, 8893.9, 8870.0, 8890.99, 58.138337], [1524767700000, 8890.0, 8893.9, 8863.0, 8867.0, 51.122558], [1524768000000, 8867.0, 8874.98, 8852.0, 8860.84, 31.32591], [1524768300000, 8860.83, 8860.83, 8837.0, 8843.09, 95.672114], [1524768600000, 8847.97, 8859.46, 8837.0, 8840.52, 59.635915], [1524768900000, 8841.98, 8852.9, 8834.02, 8845.09, 45.22609], [1524769200000, 8845.1, 8868.85, 8844.0, 8854.99, 44.814308], [1524769500000, 8854.99, 8855.0, 8838.35, 8853.0, 61.13847], [1524769800000, 8852.99, 8869.99, 8845.0, 8865.85, 59.985308], [1524770100000, 8860.99, 8865.85, 8846.0, 8846.01, 49.647545], [1524770400000, 8849.53, 8862.0, 8846.0, 8850.07, 52.534943], [1524770700000, 8856.95, 8869.99, 8850.07, 8866.0, 100.729798], [1524771000000, 8866.0, 8870.0, 8860.0, 8869.99, 48.563642], [1524771300000, 8869.99, 8895.21, 8868.02, 8882.99, 63.578151], [1524771600000, 8877.07, 8885.0, 8865.0, 8876.0, 86.753097], [1524771900000, 8880.0, 8881.9, 8861.0, 8871.99, 29.343358], [1524772200000, 8871.99, 8878.82, 8865.01, 8878.15, 27.14235], [1524772500000, 8878.15, 8888.88, 8871.0, 8881.54, 36.133915], [1524772800000, 8880.0, 8893.36, 8880.0, 8892.0, 52.068753], [1524773100000, 8892.0, 9050.0, 8888.0, 9048.42, 662.35307], [1524773400000, 9040.43, 9087.0, 9032.45, 9073.99, 383.810985], [1524773700000, 9070.21, 9087.0, 9027.94, 9042.0, 301.359743], [1524774000000, 9043.07, 9097.0, 9041.99, 9096.1, 214.62135], [1524774300000, 9096.1, 9138.0, 9075.25, 9096.96, 402.787079], [1524774600000, 9104.96, 9124.88, 9076.0, 9076.2, 193.783823], [1524774900000, 9078.0, 9099.59, 9062.72, 9070.0, 162.972189], [1524775200000, 9069.18, 9109.0, 9067.02, 9106.26, 120.018059], [1524775500000, 9106.26, 9124.63, 9075.0, 9101.0, 211.214281], [1524775800000, 9101.01, 9137.4, 9099.99, 9109.0, 213.159817], [1524776100000, 9108.98, 9124.0, 9101.04, 9123.99, 86.645325], [1524776400000, 9123.99, 9133.99, 9111.11, 9132.0, 130.525699], [1524776700000, 9130.54, 9135.04, 9101.04, 9105.0, 135.259782], [1524777000000, 9105.0, 9114.99, 9090.0, 9105.0, 154.739433], [1524777300000, 9114.81, 9114.96, 9100.0, 9114.0, 64.06073], [1524777600000, 9110.0, 9138.0, 9105.99, 9134.03, 108.325612], [1524777900000, 9134.03, 9168.98, 9134.03, 9167.02, 172.564819], [1524778200000, 9167.02, 9169.9, 9138.0, 9152.78, 122.634961], [1524778500000, 9149.99, 9164.98, 9120.0, 9127.01, 238.538042], [1524778800000, 9132.94, 9132.94, 9066.02, 9122.0, 231.731446], [1524779100000, 9122.01, 9130.0, 9115.01, 9120.0, 63.996896], [1524779400000, 9119.99, 9120.0, 9078.02, 9082.02, 156.465517], [1524779700000, 9083.0, 9100.0, 9080.0, 9099.0, 86.328364], [1524780000000, 9100.0, 9120.0, 9096.01, 9119.0, 73.350722], [1524780300000, 9119.0, 9137.65, 9115.5, 9127.0, 152.81654], [1524780600000, 9127.01, 9141.99, 9120.0, 9135.17, 106.925352], [1524780900000, 9135.17, 9155.0, 9135.17, 9151.02, 110.696147], [1524781200000, 9150.99, 9169.99, 9150.99, 9169.01, 130.845381], [1524781500000, 9169.01, 9174.11, 9141.2, 9158.05, 136.174179], [1524781800000, 9156.72, 9158.05, 9131.0, 9134.99, 99.518816], [1524782100000, 9134.79, 9156.0, 9131.55, 9150.97, 124.364734], [1524782400000, 9150.97, 9171.0, 9147.03, 9171.0, 113.489857], [1524782700000, 9170.08, 9178.0, 9150.0, 9170.0, 161.213325], [1524783000000, 9170.0, 9235.0, 9168.97, 9225.71, 512.64291], [1524783300000, 9230.0, 9235.99, 9211.09, 9221.0, 245.622654], [1524783600000, 9221.0, 9288.0, 9217.72, 9256.28, 477.557972], [1524783900000, 9257.33, 9268.95, 9218.9, 9230.0, 233.665252], [1524784200000, 9230.0, 9258.19, 9215.01, 9225.0, 131.177354], [1524784500000, 9223.73, 9250.2, 9216.63, 9236.01, 127.616191], [1524784800000, 9238.97, 9241.68, 9190.0, 9195.41, 178.115034], [1524785100000, 9190.43, 9248.06, 9188.0, 9237.0, 208.748687], [1524785400000, 9237.0, 9269.99, 9236.99, 9256.3, 203.703296], [1524785700000, 9256.3, 9256.31, 9234.99, 9239.0, 90.791461], [1524786000000, 9240.0, 9263.24, 9230.01, 9258.99, 139.8284], [1524786300000, 9259.01, 9307.48, 9257.88, 9286.0, 306.613927], [1524786600000, 9287.69, 9289.0, 9260.0, 9268.0, 142.643961], [1524786900000, 9267.48, 9297.99, 9261.44, 9266.0, 149.007887], [1524787200000, 9267.03, 9297.0, 9257.0, 9266.78, 227.247075], [1524787500000, 9266.76, 9275.94, 9215.0, 9231.94, 242.496915], [1524787800000, 9231.94, 9245.92, 9216.0, 9226.61, 137.975458], [1524788100000, 9226.94, 9251.82, 9217.01, 9249.0, 125.377042], [1524788400000, 9248.99, 9284.77, 9240.39, 9242.0, 166.979104], [1524788700000, 9242.0, 9260.94, 9240.37, 9247.67, 87.436529], [1524789000000, 9249.01, 9249.5, 9230.06, 9237.97, 95.651249], [1524789300000, 9237.96, 9245.0, 9210.1, 9213.0, 98.200756], [1524789600000, 9213.0, 9213.0, 9177.0, 9210.0, 318.218943], [1524789900000, 9210.0, 9245.56, 9206.07, 9240.41, 96.202134], [1524790200000, 9240.0, 9240.0, 9229.0, 9233.97, 95.493403], [1524790500000, 9228.11, 9228.11, 9200.0, 9210.32, 117.953264], [1524790800000, 9210.29, 9261.0, 9210.21, 9252.29, 107.567648], [1524791100000, 9260.91, 9265.0, 9238.8, 9242.36, 150.016869], [1524791400000, 9242.36, 9248.33, 9229.09, 9242.32, 93.539777], [1524791700000, 9242.3, 9292.0, 9242.25, 9289.9, 191.797758], [1524792000000, 9285.01, 9290.0, 9260.01, 9270.64, 147.668334], [1524792300000, 9270.64, 9280.88, 9242.33, 9254.76, 121.97824], [1524792600000, 9250.0, 9265.04, 9250.0, 9252.01, 106.104622], [1524792900000, 9252.01, 9257.75, 9220.0, 9239.99, 94.607613], [1524793200000, 9239.99, 9270.0, 9239.99, 9255.0, 65.836641], [1524793500000, 9255.0, 9255.0, 9246.42, 9250.08, 81.787521], [1524793800000, 9250.09, 9252.0, 9214.0, 9228.27, 104.680519], [1524794100000, 9228.27, 9250.0, 9218.39, 9249.97, 89.86277], [1524794400000, 9240.0, 9257.98, 9239.64, 9251.04, 82.334538], [1524794700000, 9251.0, 9257.98, 9247.01, 9249.99, 79.374552], [1524795000000, 9249.02, 9259.99, 9239.66, 9251.01, 150.619092], [1524795300000, 9259.35, 9275.58, 9252.34, 9273.54, 149.550558], [1524795600000, 9273.65, 9282.0, 9265.0, 9268.07, 103.453623], [1524795900000, 9268.07, 9273.5, 9265.99, 9273.5, 49.206054], [1524796200000, 9272.32, 9277.0, 9265.6, 9266.04, 60.820051], [1524796500000, 9266.05, 9269.98, 9250.0, 9252.38, 89.13042], [1524796800000, 9252.38, 9259.99, 9237.0, 9249.0, 101.535796], [1524797100000, 9248.0, 9260.0, 9233.51, 9258.0, 96.422288], [1524797400000, 9258.0, 9260.0, 9249.99, 9259.96, 44.399873], [1524797700000, 9259.96, 9260.0, 9244.75, 9255.49, 49.548735], [1524798000000, 9255.5, 9258.0, 9232.3, 9232.63, 99.869894], [1524798300000, 9240.05, 9242.91, 9218.0, 9218.0, 131.116939], [1524798600000, 9218.0, 9233.6, 9213.25, 9220.02, 114.915528], [1524798900000, 9220.01, 9228.02, 9216.42, 9218.89, 59.818394], [1524799200000, 9218.89, 9224.98, 9216.42, 9224.05, 60.559213], [1524799500000, 9224.97, 9235.0, 9218.05, 9227.03, 83.358238], [1524799800000, 9227.03, 9232.06, 9210.93, 9212.01, 133.709651], [1524800100000, 9212.0, 9220.0, 9200.01, 9215.5, 168.392538], [1524800400000, 9215.5, 9216.0, 9130.1, 9161.45, 394.942802], [1524800700000, 9156.81, 9190.0, 9140.82, 9177.76, 243.244154], [1524801000000, 9177.0, 9200.0, 9167.89, 9174.48, 264.018689], [1524801300000, 9174.48, 9177.55, 9123.25, 9143.01, 296.086166], [1524801600000, 9143.01, 9149.32, 9104.88, 9125.42, 260.497988], [1524801900000, 9125.4, 9220.0, 9118.0, 9189.0, 255.968969], [1524802200000, 9189.0, 9190.0, 9162.76, 9173.32, 71.504378], [1524802500000, 9173.31, 9190.0, 9162.76, 9185.04, 104.152575], [1524802800000, 9185.04, 9200.0, 9181.51, 9198.0, 95.839297], [1524803100000, 9200.0, 9213.67, 9194.17, 9209.35, 110.820657], [1524803400000, 9209.35, 9211.0, 9175.6, 9178.97, 94.555597], [1524803700000, 9178.97, 9195.0, 9175.59, 9191.0, 55.056409], [1524804000000, 9188.55, 9230.0, 9186.64, 9224.0, 152.615689], [1524804300000, 9224.0, 9235.0, 9209.98, 9224.99, 149.665361], [1524804600000, 9213.82, 9227.41, 9203.08, 9218.0, 100.807295], [1524804900000, 9211.1, 9219.74, 9203.96, 9204.99, 53.35839], [1524805200000, 9205.0, 9213.0, 9188.0, 9200.0, 89.250511], [1524805500000, 9196.0, 9225.99, 9196.0, 9219.92, 77.715488], [1524805800000, 9219.93, 9229.59, 9203.03, 9203.04, 54.987886], [1524806100000, 9203.04, 9217.06, 9195.0, 9197.44, 70.8507], [1524806400000, 9195.92, 9200.73, 9189.8, 9194.96, 45.91781], [1524806700000, 9196.01, 9217.54, 9194.94, 9213.0, 60.638973], [1524807000000, 9217.54, 9229.0, 9196.0, 9201.01, 119.676041], [1524807300000, 9200.08, 9218.91, 9196.1, 9215.0, 71.641912], [1524807600000, 9215.01, 9218.91, 9200.0, 9210.0, 93.39838], [1524807900000, 9210.0, 9212.07, 9197.12, 9200.0, 89.598171], [1524808200000, 9200.0, 9204.07, 9180.0, 9181.0, 76.93283], [1524808500000, 9183.08, 9192.0, 9160.0, 9180.82, 104.590462], [1524808800000, 9184.99, 9199.9, 9176.99, 9191.91, 125.029089], [1524809100000, 9191.91, 9195.0, 9179.0, 9195.0, 93.307995], [1524809400000, 9194.23, 9220.33, 9194.23, 9210.1, 120.718172], [1524809700000, 9209.97, 9252.18, 9209.97, 9241.88, 407.752367], [1524810000000, 9240.01, 9262.98, 9232.0, 9238.75, 159.121306], [1524810300000, 9238.75, 9257.53, 9220.0, 9230.0, 123.092003], [1524810600000, 9230.0, 9249.0, 9230.0, 9240.93, 75.751813], [1524810900000, 9242.97, 9262.65, 9240.92, 9261.9, 88.419296], [1524811200000, 9261.03, 9265.7, 9226.0, 9229.96, 204.476528], [1524811500000, 9229.96, 9246.33, 9226.0, 9234.24, 78.37857], [1524811800000, 9235.18, 9249.0, 9232.16, 9239.93, 85.968744], [1524812100000, 9239.93, 9259.0, 9233.0, 9250.0, 91.650666], [1524812400000, 9249.99, 9250.0, 9233.0, 9239.99, 75.863], [1524812700000, 9239.99, 9239.99, 9229.0, 9229.0, 56.456352], [1524813000000, 9232.81, 9235.0, 9210.1, 9230.01, 93.794267], [1524813300000, 9225.02, 9232.74, 9215.1, 9229.01, 68.536904], [1524813600000, 9229.01, 9231.5, 9210.6, 9217.27, 100.683255], [1524813900000, 9210.6, 9217.31, 9188.0, 9188.0, 143.49334], [1524814200000, 9196.0, 9217.79, 9188.0, 9211.02, 78.52179], [1524814500000, 9213.95, 9226.0, 9206.0, 9215.6, 71.133841], [1524814800000, 9215.6, 9220.25, 9215.59, 9220.24, 62.125113], [1524815100000, 9220.25, 9230.0, 9220.01, 9225.0, 47.995324], [1524815400000, 9225.0, 9235.0, 9222.9, 9229.0, 89.13032], [1524815700000, 9228.01, 9250.0, 9227.02, 9240.97, 119.813698], [1524816000000, 9240.97, 9249.25, 9231.01, 9242.5, 69.056217], [1524816300000, 9242.49, 9296.0, 9239.59, 9289.86, 288.656321], [1524816600000, 9289.86, 9296.0, 9266.04, 9280.0, 195.827123], [1524816900000, 9280.0, 9280.87, 9271.21, 9275.0, 103.143388], [1524817200000, 9275.0, 9281.99, 9260.01, 9272.96, 116.357958], [1524817500000, 9272.96, 9279.36, 9256.0, 9271.0, 122.435509], [1524817800000, 9274.0, 9274.0, 9252.11, 9252.2, 85.700528], [1524818100000, 9252.25, 9260.99, 9252.0, 9259.11, 58.38907], [1524818400000, 9259.99, 9259.99, 9230.0, 9238.79, 91.327214], [1524818700000, 9238.79, 9249.0, 9230.0, 9247.99, 54.025965], [1524819000000, 9245.01, 9268.98, 9245.01, 9263.69, 71.048191], [1524819300000, 9263.69, 9269.88, 9244.55, 9260.0, 81.03938], [1524819600000, 9260.0, 9260.46, 9241.2, 9251.0, 54.184013], [1524819900000, 9250.86, 9268.78, 9248.41, 9255.0, 57.846958], [1524820200000, 9261.99, 9268.99, 9255.0, 9268.0, 40.183594], [1524820500000, 9261.0, 9277.65, 9260.34, 9270.1, 39.555674], [1524820800000, 9273.0, 9279.88, 9251.53, 9258.99, 100.44939], [1524821100000, 9259.99, 9274.99, 9258.98, 9265.0, 77.009146], [1524821400000, 9266.01, 9266.01, 9250.01, 9260.0, 83.219039], [1524821700000, 9260.0, 9340.0, 9260.0, 9336.99, 477.731075], [1524822000000, 9336.99, 9361.86, 9333.42, 9348.83, 390.634437], [1524822300000, 9345.0, 9368.0, 9326.81, 9360.0, 229.552875], [1524822600000, 9360.0, 9370.82, 9351.01, 9370.82, 129.246381], [1524822900000, 9370.81, 9387.48, 9351.01, 9369.0, 275.232667], [1524823200000, 9369.0, 9376.5, 9328.05, 9328.05, 162.364644], [1524823500000, 9330.23, 9349.99, 9328.06, 9338.0, 132.821868], [1524823800000, 9338.0, 9367.23, 9337.18, 9350.0, 100.276988], [1524824100000, 9350.0, 9370.0, 9340.0, 9369.91, 103.947456], [1524824400000, 9369.91, 9380.0, 9341.39, 9348.0, 175.441961], [1524824700000, 9350.0, 9375.82, 9347.4, 9368.99, 140.896367], [1524825000000, 9368.99, 9370.98, 9352.17, 9355.0, 94.570773], [1524825300000, 9354.18, 9368.0, 9352.19, 9365.0, 85.579199], [1524825600000, 9365.0, 9395.0, 9363.2, 9382.01, 319.417808], [1524825900000, 9382.01, 9382.1, 9365.96, 9370.65, 120.700513], [1524826200000, 9372.0, 9374.0, 9355.0, 9359.84, 110.887549], [1524826500000, 9357.74, 9372.0, 9350.0, 9365.0, 69.85107], [1524826800000, 9363.31, 9367.97, 9335.93, 9342.0, 146.086915], [1524827100000, 9342.0, 9352.03, 9337.77, 9344.0, 78.139554], [1524827400000, 9344.0, 9354.0, 9340.2, 9340.21, 58.251731], [1524827700000, 9340.22, 9340.22, 9290.03, 9316.0, 283.34875], [1524828000000, 9311.5, 9331.72, 9306.97, 9331.72, 94.91112], [1524828300000, 9325.7, 9345.52, 9321.0, 9345.52, 75.628076], [1524828600000, 9343.0, 9345.54, 9330.01, 9334.97, 98.755471], [1524828900000, 9334.97, 9334.97, 9320.0, 9327.99, 45.750598], [1524829200000, 9323.19, 9327.98, 9280.59, 9300.0, 166.752955], [1524829500000, 9305.0, 9310.0, 9297.2, 9309.0, 80.3153], [1524829800000, 9309.0, 9335.18, 9305.09, 9321.0, 66.865214], [1524830100000, 9321.49, 9323.01, 9305.05, 9309.0, 136.111139], [1524830400000, 9308.9, 9333.0, 9308.9, 9331.86, 142.225031], [1524830700000, 9332.9, 9339.0, 9326.03, 9337.01, 103.110212], [1524831000000, 9335.0, 9355.0, 9334.1, 9345.0, 81.990794], [1524831300000, 9342.0, 9349.97, 9341.17, 9348.09, 92.862618], [1524831600000, 9348.83, 9348.83, 9325.0, 9332.99, 88.388625], [1524831900000, 9332.99, 9349.99, 9332.99, 9349.9, 42.11875], [1524832200000, 9349.9, 9350.0, 9330.0, 9333.01, 110.780624], [1524832500000, 9340.0, 9345.0, 9326.04, 9335.02, 106.665888], [1524832800000, 9335.02, 9347.0, 9335.02, 9339.01, 115.429055], [1524833100000, 9339.01, 9347.73, 9317.79, 9320.0, 79.737629], [1524833400000, 9318.01, 9324.99, 9253.68, 9288.99, 248.340953], [1524833700000, 9281.79, 9291.48, 9273.94, 9290.07, 97.726609], [1524834000000, 9290.01, 9318.62, 9273.97, 9298.13, 122.731857], [1524834300000, 9298.13, 9310.72, 9280.0, 9281.37, 170.283163], [1524834600000, 9280.0, 9295.64, 9240.21, 9241.01, 204.033926], [1524834900000, 9241.01, 9265.99, 9241.01, 9252.01, 105.307808], [1524835200000, 9251.0, 9255.0, 9150.1, 9194.99, 726.211121], [1524835500000, 9187.19, 9220.0, 9186.15, 9190.01, 239.420645], [1524835800000, 9190.01, 9202.39, 9155.46, 9190.99, 306.559276], [1524836100000, 9189.99, 9235.29, 9181.0, 9207.1, 184.866383], [1524836400000, 9208.0, 9250.0, 9207.1, 9221.0, 151.342609], [1524836700000, 9220.99, 9230.0, 9215.0, 9229.23, 85.788417], [1524837000000, 9229.44, 9232.0, 9199.99, 9218.72, 161.514444], [1524837300000, 9224.98, 9231.5, 9212.92, 9225.0, 67.012676], [1524837600000, 9226.97, 9228.91, 9202.0, 9215.83, 52.827804], [1524837900000, 9215.47, 9229.0, 9204.01, 9219.99, 67.939979], [1524838200000, 9219.0, 9249.0, 9219.0, 9240.0, 98.684527], [1524838500000, 9239.99, 9242.0, 9230.0, 9235.38, 77.203002], [1524838800000, 9236.0, 9270.36, 9231.61, 9257.4, 181.106565], [1524839100000, 9260.0, 9266.65, 9240.0, 9260.15, 122.872004], [1524839400000, 9260.15, 9275.0, 9236.58, 9243.99, 118.552161], [1524839700000, 9243.98, 9244.0, 9219.01, 9220.6, 94.670888], [1524840000000, 9225.0, 9259.99, 9220.6, 9253.04, 137.564453], [1524840300000, 9253.11, 9271.37, 9253.04, 9263.96, 119.602532], [1524840600000, 9264.06, 9268.61, 9250.0, 9265.0, 144.085103], [1524840900000, 9265.0, 9290.0, 9260.01, 9288.88, 185.949657], [1524841200000, 9280.14, 9288.88, 9250.0, 9257.99, 158.696324], [1524841500000, 9256.0, 9268.02, 9250.2, 9259.94, 73.807592], [1524841800000, 9259.02, 9264.0, 9250.2, 9250.21, 91.508899], [1524842100000, 9250.21, 9264.99, 9237.01, 9248.11, 132.790625], [1524842400000, 9248.11, 9253.5, 9213.85, 9220.1, 199.342245], [1524842700000, 9220.0, 9247.36, 9210.01, 9235.0, 189.250666], [1524843000000, 9235.14, 9245.55, 9225.0, 9245.55, 115.549613], [1524843300000, 9245.54, 9260.0, 9239.71, 9255.68, 97.290195], [1524843600000, 9255.68, 9260.0, 9242.05, 9251.01, 113.058314], [1524843900000, 9251.01, 9255.69, 9249.99, 9250.35, 58.597382], [1524844200000, 9251.0, 9251.0, 9240.01, 9242.35, 63.980855], [1524844500000, 9240.02, 9250.57, 9240.01, 9241.21, 66.08646], [1524844800000, 9241.2, 9287.0, 9241.0, 9281.01, 166.531484], [1524845100000, 9283.99, 9299.37, 9281.0, 9290.0, 151.851976], [1524845400000, 9290.0, 9310.96, 9288.15, 9308.87, 171.683582], [1524845700000, 9306.0, 9328.26, 9291.01, 9323.75, 189.693177], [1524846000000, 9323.74, 9323.74, 9280.0, 9287.99, 174.213149], [1524846300000, 9287.99, 9298.98, 9287.0, 9297.0, 70.035844], [1524846600000, 9296.95, 9300.0, 9285.05, 9295.0, 81.619764], [1524846900000, 9295.0, 9298.57, 9269.0, 9279.26, 82.611593], [1524847200000, 9279.26, 9290.0, 9276.03, 9287.0, 72.210469], [1524847500000, 9290.0, 9294.44, 9283.0, 9285.99, 70.874618], [1524847800000, 9285.99, 9299.46, 9275.78, 9295.78, 81.172624], [1524848100000, 9295.78, 9299.99, 9280.0, 9282.1, 83.013821], [1524848400000, 9286.01, 9299.98, 9286.0, 9296.75, 66.179504], [1524848700000, 9296.74, 9297.0, 9290.0, 9294.99, 37.976429], [1524849000000, 9294.99, 9294.99, 9269.54, 9280.97, 70.847905], [1524849300000, 9280.97, 9285.0, 9266.0, 9280.0, 116.746282], [1524849600000, 9280.0, 9293.48, 9270.05, 9293.46, 113.404238], [1524849900000, 9293.47, 9319.99, 9293.0, 9301.33, 108.049014], [1524850200000, 9301.83, 9316.0, 9293.0, 9310.0, 120.941805], [1524850500000, 9306.01, 9310.0, 9282.99, 9282.99, 101.379306], [1524850800000, 9288.06, 9299.0, 9288.06, 9298.0, 124.218454], [1524851100000, 9294.99, 9303.15, 9290.02, 9293.53, 104.858125], [1524851400000, 9294.99, 9299.0, 9292.52, 9295.23, 71.265381], [1524851700000, 9295.23, 9305.0, 9290.1, 9290.1, 86.363639], [1524852000000, 9290.1, 9296.31, 9240.0, 9247.01, 158.371072], [1524852300000, 9252.95, 9280.0, 9249.0, 9275.0, 78.70798], [1524852600000, 9273.03, 9280.0, 9271.01, 9272.47, 42.669908], [1524852900000, 9272.47, 9282.0, 9272.46, 9278.42, 103.029266], [1524853200000, 9278.42, 9278.42, 9230.0, 9248.0, 132.100252], [1524853500000, 9248.0, 9262.0, 9225.0, 9244.93, 84.874749], [1524853800000, 9244.94, 9245.0, 9227.04, 9228.01, 72.198213], [1524854100000, 9228.01, 9245.0, 9213.8, 9243.96, 105.965098], [1524854400000, 9245.0, 9271.76, 9242.27, 9252.0, 59.604413], [1524854700000, 9252.0, 9268.99, 9252.0, 9252.01, 49.968391], [1524855000000, 9252.01, 9252.13, 9240.27, 9242.48, 38.244825], [1524855300000, 9240.28, 9242.5, 9230.0, 9230.89, 76.172975], [1524855600000, 9230.89, 9235.0, 9220.0, 9233.15, 86.352374], [1524855900000, 9233.38, 9250.56, 9226.0, 9227.0, 71.956221], [1524856200000, 9227.0, 9235.0, 9191.0, 9195.04, 163.943971], [1524856500000, 9195.02, 9219.83, 9188.0, 9204.11, 91.711628], [1524856800000, 9204.11, 9209.38, 9168.0, 9171.58, 152.272147], [1524857100000, 9179.25, 9215.11, 9170.94, 9190.0, 126.551375], [1524857400000, 9189.85, 9199.0, 9176.2, 9176.83, 79.900222], [1524857700000, 9185.0, 9196.22, 9170.0, 9190.01, 139.182029], [1524858000000, 9196.21, 9210.0, 9185.19, 9187.97, 62.652607], [1524858300000, 9185.19, 9190.0, 9157.01, 9157.01, 184.917031], [1524858600000, 9160.73, 9167.09, 9092.0, 9105.03, 632.035225], [1524858900000, 9105.03, 9125.4, 9075.01, 9089.0, 305.71061], [1524859200000, 9089.12, 9153.99, 9087.02, 9137.95, 269.377808], [1524859500000, 9130.01, 9163.38, 9127.12, 9136.43, 133.948809], [1524859800000, 9136.43, 9150.0, 9131.15, 9133.42, 82.327372], [1524860100000, 9133.42, 9133.42, 9101.0, 9105.0, 98.706543], [1524860400000, 9105.0, 9114.99, 9073.54, 9083.0, 124.1464], [1524860700000, 9073.67, 9110.0, 9054.01, 9090.55, 281.565903], [1524861000000, 9090.55, 9098.68, 9055.44, 9063.2, 148.877815], [1524861300000, 9069.92, 9069.99, 9005.0, 9011.0, 418.234429], [1524861600000, 9011.0, 9017.98, 8952.0, 8964.99, 655.157837], [1524861900000, 8955.02, 9019.0, 8952.0, 8976.99, 422.783762], [1524862200000, 8976.99, 9020.0, 8970.01, 8982.0, 203.528156], [1524862500000, 8982.0, 8987.92, 8940.0, 8970.0, 245.411274], [1524862800000, 8969.99, 8978.0, 8909.83, 8927.0, 325.097453], [1524863100000, 8927.0, 8987.0, 8922.27, 8979.6, 206.152679], [1524863400000, 8979.6, 9040.0, 8960.0, 9029.92, 265.91794], [1524863700000, 9024.99, 9053.0, 9010.01, 9015.04, 242.214586], [1524864000000, 9015.04, 9035.0, 9008.59, 9032.0, 108.508298], [1524864300000, 9032.0, 9032.0, 8980.0, 8991.0, 167.186584], [1524864600000, 8991.0, 8998.88, 8970.01, 8987.04, 109.505161], [1524864900000, 8988.0, 9015.33, 8987.03, 9014.98, 108.989248], [1524865200000, 9010.02, 9019.96, 8990.0, 8995.17, 75.017529], [1524865500000, 8995.17, 9004.02, 8976.05, 9004.01, 78.460328], [1524865800000, 9004.01, 9042.09, 9002.0, 9028.0, 89.67987], [1524866100000, 9026.5, 9029.64, 8966.44, 8975.35, 134.503978], [1524866400000, 8975.36, 9015.0, 8975.36, 9005.03, 143.708091], [1524866700000, 9002.2, 9040.76, 8985.06, 9030.0, 84.923131], [1524867000000, 9038.61, 9045.0, 9030.0, 9042.67, 71.767239], [1524867300000, 9042.01, 9045.0, 9024.96, 9033.61, 72.794173], [1524867600000, 9028.0, 9035.39, 9025.01, 9035.01, 35.01155], [1524867900000, 9035.01, 9073.77, 9035.01, 9071.0, 126.84132], [1524868200000, 9071.0, 9073.77, 9060.0, 9070.0, 77.519298], [1524868500000, 9071.0, 9078.0, 9066.01, 9075.0, 63.687313], [1524868800000, 9074.0, 9093.09, 9071.18, 9079.01, 132.060099], [1524869100000, 9085.0, 9085.0, 9051.02, 9064.96, 131.800654], [1524869400000, 9064.99, 9068.99, 9056.35, 9068.0, 55.68689], [1524869700000, 9068.99, 9068.99, 9030.01, 9031.0, 81.288218], [1524870000000, 9032.0, 9036.1, 9022.0, 9033.28, 114.693321], [1524870300000, 9033.28, 9064.97, 9032.01, 9063.6, 74.388156], [1524870600000, 9063.6, 9073.93, 9043.96, 9056.95, 69.477556], [1524870900000, 9058.99, 9059.0, 9038.0, 9040.0, 46.975833], [1524871200000, 9043.37, 9058.99, 9040.0, 9049.7, 64.342176], [1524871500000, 9050.49, 9058.97, 9034.99, 9038.0, 35.250271], [1524871800000, 9038.0, 9038.0, 8970.0, 8991.9, 199.180527], [1524872100000, 8990.99, 8991.9, 8970.1, 8982.99, 88.851302], [1524872400000, 8983.0, 8996.67, 8981.07, 8991.0, 104.271344], [1524872700000, 8990.99, 8996.0, 8968.45, 8979.82, 67.370601], [1524873000000, 8979.82, 8986.94, 8911.0, 8915.87, 197.311027], [1524873300000, 8923.62, 8929.79, 8889.0, 8915.35, 262.656837], [1524873600000, 8915.35, 8915.35, 8870.0, 8887.13, 302.432026], [1524873900000, 8895.66, 8932.8, 8884.0, 8913.97, 197.713596], [1524874200000, 8912.0, 8938.2, 8900.0, 8938.2, 128.982863], [1524874500000, 8938.2, 8949.01, 8916.14, 8943.04, 170.248259], [1524874800000, 8948.95, 8987.0, 8930.0, 8975.26, 96.324512], [1524875100000, 8980.0, 8982.72, 8961.71, 8976.98, 82.234713], [1524875400000, 8976.99, 9007.12, 8976.04, 8990.0, 104.88489], [1524875700000, 8989.99, 9033.82, 8981.0, 9033.82, 87.569231], [1524876000000, 9033.82, 9049.76, 9022.0, 9040.0, 100.002398], [1524876300000, 9040.0, 9041.0, 9007.2, 9040.0, 226.321606], [1524876600000, 9040.0, 9041.0, 8998.0, 9000.0, 148.634432], [1524876900000, 8999.8, 9011.02, 8988.99, 9010.11, 108.691794], [1524877200000, 9005.98, 9029.85, 9005.97, 9019.99, 123.034169], [1524877500000, 9019.0, 9019.0, 9000.0, 9017.07, 88.568039], [1524877800000, 9017.07, 9031.85, 9012.5, 9030.01, 80.992571], [1524878100000, 9030.01, 9038.08, 9024.0, 9038.08, 86.63113], [1524878400000, 9038.08, 9042.79, 9012.45, 9013.0, 98.37722], [1524878700000, 9020.5, 9035.99, 9013.01, 9035.0, 49.980048], [1524879000000, 9036.0, 9049.0, 9025.01, 9049.0, 36.898103], [1524879300000, 9049.0, 9078.64, 9042.8, 9075.2, 132.570753], [1524879600000, 9076.0, 9097.99, 9075.0, 9092.0, 174.937772], [1524879900000, 9095.93, 9095.94, 9075.0, 9090.0, 127.264184], [1524880200000, 9092.0, 9098.0, 9084.98, 9092.13, 123.727975], [1524880500000, 9090.01, 9126.81, 9085.0, 9126.81, 175.879484], [1524880800000, 9126.81, 9128.09, 9089.98, 9110.01, 177.008943], [1524881100000, 9110.01, 9129.17, 9100.32, 9123.95, 121.484369], [1524881400000, 9120.57, 9129.0, 9100.39, 9110.01, 70.790694], [1524881700000, 9108.0, 9115.0, 9075.19, 9085.0, 178.394866], [1524882000000, 9085.01, 9123.03, 9080.0, 9116.93, 125.837923], [1524882300000, 9117.99, 9117.99, 9100.0, 9100.33, 136.733858], [1524882600000, 9100.33, 9112.8, 9100.33, 9112.79, 72.770444], [1524882900000, 9112.79, 9119.0, 9105.25, 9108.06, 65.203598], [1524883200000, 9108.06, 9112.86, 9086.7, 9094.98, 75.994532], [1524883500000, 9094.99, 9094.99, 9073.68, 9084.72, 69.426213], [1524883800000, 9084.42, 9086.99, 9055.0, 9056.64, 117.390593], [1524884100000, 9056.64, 9072.86, 9050.0, 9055.78, 106.600025], [1524884400000, 9053.47, 9083.3, 9051.0, 9082.81, 36.921342], [1524884700000, 9082.8, 9086.0, 9075.76, 9085.0, 62.763055], [1524885000000, 9085.0, 9100.0, 9085.0, 9097.51, 92.894174], [1524885300000, 9096.28, 9097.51, 9093.0, 9095.1, 51.695194], [1524885600000, 9095.1, 9146.99, 9095.09, 9121.26, 154.991284], [1524885900000, 9121.26, 9130.26, 9110.46, 9112.27, 78.987087], [1524886200000, 9112.0, 9129.42, 9110.0, 9124.23, 58.328808], [1524886500000, 9124.23, 9130.0, 9108.94, 9115.23, 60.477084], [1524886800000, 9115.23, 9124.0, 9100.0, 9114.0, 54.735571], [1524887100000, 9114.0, 9140.0, 9114.0, 9137.61, 69.353824], [1524887400000, 9137.61, 9196.32, 9137.61, 9176.7, 272.432961], [1524887700000, 9176.7, 9181.66, 9152.44, 9155.0, 95.488285], [1524888000000, 9155.01, 9168.71, 9145.0, 9151.06, 107.200392], [1524888300000, 9151.06, 9151.11, 9137.72, 9140.97, 69.258449], [1524888600000, 9147.85, 9149.99, 9137.73, 9142.99, 54.618694], [1524888900000, 9142.99, 9145.97, 9130.01, 9140.56, 62.824666], [1524889200000, 9141.0, 9160.0, 9139.79, 9160.0, 74.431934], [1524889500000, 9159.99, 9162.34, 9153.0, 9160.95, 77.053455], [1524889800000, 9160.92, 9161.11, 9135.0, 9136.0, 86.896824], [1524890100000, 9143.98, 9155.0, 9131.0, 9149.8, 62.008718], [1524890400000, 9149.8, 9165.47, 9147.0, 9148.01, 47.044864], [1524890700000, 9148.01, 9158.0, 9144.36, 9148.05, 61.75724], [1524891000000, 9149.8, 9150.0, 9111.21, 9135.81, 78.034383], [1524891300000, 9135.74, 9149.0, 9121.03, 9138.53, 135.790711], [1524891600000, 9138.54, 9157.1, 9127.64, 9145.0, 83.922232], [1524891900000, 9144.0, 9168.2, 9142.0, 9168.09, 88.314886], [1524892200000, 9168.01, 9184.8, 9161.02, 9180.02, 96.661065], [1524892500000, 9180.02, 9188.5, 9167.06, 9172.05, 66.298234], [1524892800000, 9171.01, 9176.93, 9170.0, 9175.0, 55.888688], [1524893100000, 9175.0, 9177.78, 9151.45, 9157.1, 130.234571], [1524893400000, 9157.0, 9164.18, 9144.01, 9152.09, 101.157957], [1524893700000, 9153.77, 9163.57, 9141.3, 9162.85, 44.180913], [1524894000000, 9160.14, 9162.85, 9141.3, 9156.99, 55.259826], [1524894300000, 9150.02, 9157.0, 9140.67, 9153.33, 35.944951], [1524894600000, 9148.09, 9162.0, 9148.08, 9160.19, 57.846459], [1524894900000, 9160.19, 9169.0, 9152.0, 9164.49, 118.315541], [1524895200000, 9164.48, 9175.1, 9160.01, 9165.06, 70.473654], [1524895500000, 9165.06, 9198.61, 9165.06, 9175.0, 214.08311], [1524895800000, 9175.0, 9199.99, 9169.9, 9189.93, 150.035219], [1524896100000, 9189.93, 9200.0, 9177.08, 9196.01, 110.445079], [1524896400000, 9199.99, 9200.0, 9170.0, 9179.89, 101.340406], [1524896700000, 9179.79, 9185.13, 9170.02, 9184.0, 52.069816], [1524897000000, 9184.01, 9200.28, 9175.0, 9200.02, 101.820553], [1524897300000, 9200.12, 9200.89, 9180.0, 9182.0, 81.530433], [1524897600000, 9182.0, 9209.8, 9181.11, 9203.0, 142.765442], [1524897900000, 9203.0, 9215.66, 9200.0, 9215.0, 95.501122], [1524898200000, 9215.0, 9215.0, 9178.35, 9189.89, 118.774562], [1524898500000, 9187.0, 9189.86, 9150.67, 9163.03, 109.970379], [1524898800000, 9163.02, 9171.07, 9130.02, 9135.29, 140.211933], [1524899100000, 9136.0, 9136.01, 9128.0, 9132.98, 179.556117], [1524899400000, 9132.99, 9160.6, 9132.98, 9150.99, 88.476361], [1524899700000, 9151.0, 9157.85, 9146.0, 9147.74, 57.872797], [1524900000000, 9147.74, 9164.19, 9147.1, 9164.12, 51.636585], [1524900300000, 9164.18, 9165.0, 9153.6, 9153.67, 64.863922], [1524900600000, 9153.67, 9154.08, 9126.01, 9136.23, 126.890128], [1524900900000, 9140.53, 9144.97, 9108.99, 9125.0, 140.261038], [1524901200000, 9125.86, 9142.1, 9118.6, 9124.92, 86.852199], [1524901500000, 9129.81, 9129.81, 9110.0, 9125.03, 129.483599], [1524901800000, 9125.03, 9145.0, 9125.0, 9140.02, 77.138868], [1524902100000, 9140.02, 9140.02, 9118.7, 9126.22, 59.857268], [1524902400000, 9121.05, 9126.21, 9106.1, 9114.0, 72.431991], [1524902700000, 9114.0, 9114.93, 9084.73, 9095.98, 173.606325], [1524903000000, 9091.11, 9102.0, 9081.02, 9088.99, 93.240201], [1524903300000, 9089.0, 9110.0, 9085.02, 9106.64, 105.319139], [1524903600000, 9106.64, 9110.0, 9088.98, 9090.5, 124.503822], [1524903900000, 9090.5, 9098.0, 9086.96, 9090.0, 58.302573], [1524904200000, 9090.0, 9258.0, 9088.96, 9246.33, 428.46146], [1524904500000, 9246.33, 9298.72, 9246.3, 9271.06, 481.334723], [1524904800000, 9274.97, 9330.0, 9267.55, 9320.0, 445.043953], [1524905100000, 9315.0, 9325.0, 9276.82, 9294.76, 305.81893], [1524905400000, 9295.0, 9307.0, 9281.0, 9292.69, 126.406359], [1524905700000, 9293.98, 9312.91, 9190.0, 9217.48, 634.283897], [1524906000000, 9227.49, 9250.0, 9155.55, 9191.17, 449.975722], [1524906300000, 9191.17, 9223.78, 9155.06, 9223.65, 236.594436], [1524906600000, 9219.0, 9223.77, 9184.07, 9195.61, 93.84023], [1524906900000, 9195.6, 9210.0, 9171.02, 9195.87, 150.555622], [1524907200000, 9192.99, 9231.87, 9188.12, 9224.99, 139.129652], [1524907500000, 9223.02, 9288.0, 9221.0, 9276.13, 200.807481], [1524907800000, 9270.0, 9280.0, 9245.0, 9248.03, 152.868223], [1524908100000, 9248.03, 9300.4, 9224.11, 9279.0, 257.291229], [1524908400000, 9272.63, 9286.27, 9269.02, 9275.0, 107.636074], [1524908700000, 9275.0, 9280.08, 9270.12, 9276.85, 58.185788], [1524909000000, 9276.85, 9276.85, 9242.07, 9260.0, 80.715601], [1524909300000, 9256.05, 9275.0, 9256.05, 9273.0, 45.435025], [1524909600000, 9273.0, 9275.0, 9263.12, 9272.03, 36.344275], [1524909900000, 9272.05, 9310.0, 9257.8, 9286.96, 323.06135], [1524910200000, 9280.75, 9309.51, 9270.0, 9277.91, 67.99835]], "15m": [[1524460500000, 8842.34, 8850.0, 8830.0, 8841.0, 123.237625], [1524461400000, 8842.23, 8855.0, 8831.99, 8838.0, 137.309909], [1524462300000, 8837.99, 8883.0, 8836.99, 8879.0, 294.515866], [1524463200000, 8878.04, 8879.0, 8853.0, 8855.02, 230.79729], [1524464100000, 8856.01, 8870.7, 8855.01, 8870.0, 271.712256], [1524465000000, 8866.0, 8907.45, 8850.0, 8907.45, 401.787323], [1524465900000, 8907.45, 8929.0, 8874.67, 8899.0, 497.616777], [1524466800000, 8899.0, 8952.88, 8895.45, 8941.47, 531.385882], [1524467700000, 8941.47, 8970.01, 8927.58, 8950.95, 619.543843], [1524468600000, 8947.42, 8955.0, 8932.0, 8939.87, 395.229777], [1524469500000, 8939.83, 8950.0, 8918.31, 8942.39, 283.570789], [1524470400000, 8942.0, 8953.89, 8932.0, 8952.46, 336.264842], [1524471300000, 8949.04, 8957.04, 8936.01, 8940.01, 264.518463], [1524472200000, 8940.02, 8949.0, 8892.98, 8917.06, 366.373662], [1524473100000, 8917.06, 8933.4, 8894.5, 8900.31, 377.409799], [1524474000000, 8903.0, 8910.0, 8886.95, 8890.07, 322.018671], [1524474900000, 8900.55, 8901.0, 8831.0, 8864.2, 740.318666], [1524475800000, 8865.04, 8898.77, 8864.0, 8893.01, 294.631613], [1524476700000, 8893.01, 8914.57, 8890.04, 8905.0, 302.18871], [1524477600000, 8905.0, 8905.3, 8888.0, 8895.0, 275.6156], [1524478500000, 8892.83, 8920.0, 8874.71, 8911.79, 360.919111], [1524479400000, 8912.34, 8922.0, 8899.42, 8909.61, 237.043065], [1524480300000, 8905.35, 8914.87, 8885.6, 8889.0, 171.699895], [1524481200000, 8889.0, 8899.99, 8877.75, 8894.0, 205.959228], [1524482100000, 8889.05, 8897.59, 8882.99, 8888.0, 170.420994], [1524483000000, 8887.98, 8923.0, 8883.02, 8900.0, 342.142137], [1524483900000, 8903.0, 8915.0, 8892.73, 8910.02, 158.134765], [1524484800000, 8910.02, 8928.0, 8910.01, 8921.63, 249.781468], [1524485700000, 8921.63, 8985.0, 8921.63, 8960.01, 687.254851], [1524486600000, 8969.99, 8970.9, 8911.06, 8913.07, 421.985419], [1524487500000, 8913.07, 8940.74, 8897.75, 8940.74, 317.001614], [1524488400000, 8940.0, 8944.9, 8920.0, 8930.0, 186.408603], [1524489300000, 8936.91, 8936.91, 8900.0, 8929.19, 241.004209], [1524490200000, 8929.18, 8939.0, 8910.0, 8938.99, 212.800158], [1524491100000, 8938.99, 8945.0, 8922.27, 8929.0, 249.596928], [1524492000000, 8934.39, 8940.0, 8895.0, 8896.85, 264.113953], [1524492900000, 8896.85, 8927.27, 8895.0, 8900.0, 377.522036], [1524493800000, 8900.0, 8905.0, 8858.08, 8888.98, 522.599272], [1524494700000, 8891.0, 8932.69, 8888.0, 8919.0, 312.142738], [1524495600000, 8919.0, 8935.0, 8914.01, 8917.87, 292.675585], [1524496500000, 8918.01, 8919.98, 8901.0, 8903.92, 165.5797], [1524497400000, 8903.92, 8914.95, 8888.0, 8907.0, 281.496356], [1524498300000, 8906.08, 8916.0, 8888.0, 8898.0, 203.342507], [1524499200000, 8898.0, 8929.35, 8892.02, 8925.0, 286.283037], [1524500100000, 8925.99, 8936.0, 8920.0, 8930.0, 201.125634], [1524501000000, 8928.1, 8938.21, 8928.1, 8928.1, 250.209228], [1524501900000, 8928.1, 8930.92, 8907.5, 8911.54, 259.970895], [1524502800000, 8912.77, 8917.58, 8874.0, 8890.43, 306.585465], [1524503700000, 8894.99, 8899.98, 8861.42, 8878.55, 281.279808], [1524504600000, 8878.55, 8888.3, 8863.48, 8879.63, 232.730537], [1524505500000, 8872.0, 8887.67, 8870.0, 8886.0, 165.958222], [1524506400000, 8887.67, 8900.0, 8877.01, 8879.25, 173.874203], [1524507300000, 8879.5, 8900.0, 8878.2, 8898.2, 163.800897], [1524508200000, 8896.0, 8915.0, 8890.0, 8899.99, 169.16055], [1524509100000, 8899.99, 8908.37, 8892.4, 8893.99, 205.083605], [1524510000000, 8894.0, 8896.99, 8884.0, 8887.98, 196.554954], [1524510900000, 8887.98, 8900.0, 8870.0, 8878.0, 252.176402], [1524511800000, 8878.0, 8888.0, 8866.89, 8870.11, 197.152269], [1524512700000, 8870.11, 8872.0, 8800.6, 8847.37, 667.424359], [1524513600000, 8847.37, 8858.99, 8825.01, 8858.0, 246.344867], [1524514500000, 8858.0, 8880.0, 8851.0, 8868.0, 192.02854], [1524515400000, 8868.0, 8917.33, 8867.01, 8899.99, 231.847302], [1524516300000, 8899.99, 8928.0, 8892.28, 8924.11, 246.913109], [1524517200000, 8924.11, 8925.04, 8912.0, 8920.0, 166.19887], [1524518100000, 8920.0, 8924.87, 8912.0, 8924.31, 135.944266], [1524519000000, 8924.31, 8924.88, 8903.93, 8915.01, 154.875798], [1524519900000, 8915.02, 8926.76, 8909.0, 8922.0, 245.427785], [1524520800000, 8925.8, 8947.64, 8924.15, 8928.98, 446.538009], [1524521700000, 8926.95, 8933.55, 8916.48, 8930.0, 122.575638], [1524522600000, 8930.53, 8938.22, 8925.0, 8932.0, 146.164122], [1524523500000, 8932.0, 8932.0, 8909.59, 8920.02, 150.973289], [1524524400000, 8924.12, 8929.35, 8906.87, 8922.0, 169.655142], [1524525300000, 8922.0, 8931.96, 8890.21, 8899.0, 168.249094], [1524526200000, 8897.84, 8929.01, 8888.0, 8928.69, 166.845751], [1524527100000, 8928.69, 8949.98, 8924.0, 8934.01, 221.732389], [1524528000000, 8934.0, 8949.91, 8922.0, 8936.03, 263.333094], [1524528900000, 8936.04, 8975.0, 8936.03, 8974.95, 470.49302], [1524529800000, 8973.02, 9189.0, 8972.99, 9174.0, 2190.166077], [1524530700000, 9174.0, 9219.0, 9147.0, 9169.97, 1040.95026], [1524531600000, 9169.97, 9170.0, 9109.81, 9160.0, 691.494486], [1524532500000, 9159.99, 9167.98, 9139.0, 9167.98, 291.809587], [1524533400000, 9167.98, 9194.0, 9124.02, 9166.73, 478.125382], [1524534300000, 9169.0, 9189.9, 9156.54, 9186.0, 242.992328], [1524535200000, 9186.01, 9230.15, 9178.0, 9224.77, 555.920197], [1524536100000, 9224.77, 9229.0, 9177.0, 9177.01, 454.856822], [1524537000000, 9183.0, 9195.5, 9150.0, 9177.0, 463.544264], [1524537900000, 9176.46, 9200.01, 9156.01, 9189.86, 384.061398], [1524538800000, 9185.01, 9194.0, 9166.0, 9183.97, 263.109537], [1524539700000, 9184.12, 9200.0, 9177.0, 9194.98, 313.214909], [1524540600000, 9194.98, 9211.47, 9186.91, 9201.0, 513.226448], [1524541500000, 9201.0, 9209.77, 9191.87, 9192.47, 303.228916], [1524542400000, 9192.48, 9229.04, 9192.47, 9225.2, 408.301647], [1524543300000, 9225.2, 9225.45, 9190.0, 9220.0, 419.405152], [1524544200000, 9219.99, 9258.0, 9215.0, 9235.29, 500.18579], [1524545100000, 9235.3, 9279.98, 9233.02, 9266.3, 458.236483], [1524546000000, 9266.3, 9279.4, 9225.0, 9250.0, 368.36475], [1524546900000, 9249.96, 9256.01, 9214.0, 9224.82, 368.660192], [1524547800000, 9222.0, 9284.0, 9220.0, 9262.98, 461.496341], [1524548700000, 9263.01, 9300.0, 9263.0, 9271.11, 476.933326], [1524549600000, 9271.14, 9278.81, 9251.65, 9271.0, 269.233548], [1524550500000, 9276.0, 9276.9, 9235.01, 9236.0, 304.76478], [1524551400000, 9242.53, 9250.0, 9225.0, 9245.02, 295.321485], [1524552300000, 9245.04, 9257.99, 9221.01, 9227.37, 311.604416], [1524553200000, 9235.0, 9243.27, 9177.0, 9196.01, 782.022154], [1524554100000, 9196.01, 9243.0, 9196.0, 9225.0, 282.399662], [1524555000000, 9225.0, 9235.64, 9208.0, 9235.17, 187.060165], [1524555900000, 9235.64, 9238.68, 9208.0, 9216.0, 248.377353], [1524556800000, 9217.98, 9249.0, 9216.0, 9238.01, 252.555585], [1524557700000, 9239.0, 9263.27, 9239.0, 9254.0, 201.720044], [1524558600000, 9254.0, 9270.0, 9252.0, 9258.01, 229.20839], [1524559500000, 9258.88, 9266.86, 9244.0, 9249.99, 173.047345], [1524560400000, 9246.6, 9285.0, 9246.6, 9265.0, 296.049595], [1524561300000, 9265.0, 9270.97, 9217.03, 9245.79, 327.590702], [1524562200000, 9250.0, 9270.0, 9243.01, 9267.5, 213.578607], [1524563100000, 9270.0, 9285.78, 9265.01, 9285.0, 367.532862], [1524564000000, 9285.0, 9307.5, 9275.0, 9307.0, 604.07526], [1524564900000, 9307.0, 9317.0, 9281.0, 9301.65, 662.484004], [1524565800000, 9301.65, 9349.0, 9285.0, 9295.0, 653.42112], [1524566700000, 9296.0, 9308.9, 9280.0, 9292.15, 417.679253], [1524567600000, 9292.15, 9332.62, 9292.01, 9332.62, 267.2103], [1524568500000, 9332.62, 9332.79, 9309.14, 9314.74, 254.242099], [1524569400000, 9314.66, 9317.0, 9284.98, 9300.0, 278.176272], [1524570300000, 9291.25, 9300.0, 9273.22, 9294.57, 354.336666], [1524571200000, 9294.59, 9318.0, 9290.0, 9315.0, 327.236012], [1524572100000, 9317.0, 9329.8, 9311.0, 9324.87, 359.856852], [1524573000000, 9324.63, 9345.0, 9319.85, 9335.0, 316.521842], [1524573900000, 9334.51, 9383.66, 9320.01, 9380.0, 400.134768], [1524574800000, 9376.01, 9380.0, 9327.18, 9369.01, 419.015789], [1524575700000, 9369.82, 9385.0, 9350.01, 9380.01, 598.589172], [1524576600000, 9380.0, 9420.0, 9350.61, 9374.0, 680.702463], [1524577500000, 9371.2, 9374.0, 9221.0, 9259.99, 1706.784088], [1524578400000, 9259.99, 9291.0, 9155.0, 9270.0, 1744.952652], [1524579300000, 9270.0, 9284.0, 9232.17, 9279.0, 665.867436], [1524580200000, 9280.0, 9323.5, 9270.15, 9323.5, 480.0483], [1524581100000, 9323.5, 9331.0, 9285.32, 9289.69, 340.000766], [1524582000000, 9289.69, 9331.5, 9288.21, 9324.0, 384.784215], [1524582900000, 9324.0, 9370.0, 9313.11, 9344.01, 342.356761], [1524583800000, 9344.0, 9360.0, 9311.27, 9314.8, 353.323079], [1524584700000, 9314.4, 9347.77, 9301.0, 9347.77, 371.013813], [1524585600000, 9347.78, 9349.99, 9330.0, 9344.8, 296.581175], [1524586500000, 9344.8, 9380.0, 9337.0, 9345.99, 440.102818], [1524587400000, 9345.99, 9350.0, 9309.0, 9341.99, 424.276659], [1524588300000, 9341.99, 9368.8, 9329.38, 9350.19, 326.352332], [1524589200000, 9350.19, 9360.0, 9333.0, 9340.0, 197.767722], [1524590100000, 9338.99, 9398.85, 9337.0, 9374.0, 319.328972], [1524591000000, 9374.98, 9395.0, 9370.87, 9379.0, 267.677818], [1524591900000, 9378.01, 9415.95, 9375.0, 9409.97, 452.08338], [1524592800000, 9410.0, 9410.0, 9356.0, 9371.01, 410.119091], [1524593700000, 9371.03, 9380.0, 9350.0, 9371.01, 301.283979], [1524594600000, 9371.02, 9390.0, 9365.0, 9385.01, 300.893724], [1524595500000, 9384.01, 9411.0, 9384.01, 9410.99, 491.703088], [1524596400000, 9410.99, 9414.98, 9384.0, 9401.0, 362.648955], [1524597300000, 9400.0, 9412.0, 9293.29, 9383.98, 919.869209], [1524598200000, 9383.98, 9455.0, 9362.13, 9410.13, 658.594816], [1524599100000, 9416.99, 9452.0, 9411.0, 9449.9, 350.210987], [1524600000000, 9452.0, 9463.0, 9400.04, 9427.21, 489.240945], [1524600900000, 9426.0, 9443.0, 9405.4, 9438.0, 270.725789], [1524601800000, 9438.0, 9446.42, 9409.95, 9440.0, 310.513092], [1524602700000, 9439.79, 9459.0, 9432.97, 9450.79, 391.411326], [1524603600000, 9450.79, 9495.0, 9448.99, 9489.86, 475.227715], [1524604500000, 9489.86, 9491.17, 9439.13, 9466.89, 610.579046], [1524605400000, 9466.89, 9490.5, 9445.03, 9478.9, 382.821689], [1524606300000, 9478.0, 9478.99, 9450.0, 9468.0, 352.58637], [1524607200000, 9469.0, 9489.98, 9463.1, 9484.0, 513.360813], [1524608100000, 9483.25, 9559.82, 9479.02, 9550.89, 805.81602], [1524609000000, 9552.01, 9583.61, 9425.01, 9485.97, 956.754334], [1524609900000, 9475.01, 9580.0, 9462.0, 9559.75, 684.670583], [1524610800000, 9559.75, 9559.75, 9511.0, 9544.98, 461.151763], [1524611700000, 9544.98, 9636.47, 9528.0, 9635.05, 828.881447], [1524612600000, 9635.0, 9700.0, 9618.35, 9699.0, 789.210246], [1524613500000, 9699.99, 9731.01, 9589.78, 9619.99, 1319.354122], [1524614400000, 9618.96, 9678.34, 9566.0, 9664.99, 1173.929043], [1524615300000, 9649.49, 9680.0, 9551.79, 9580.01, 781.035688], [1524616200000, 9584.96, 9589.0, 9440.0, 9580.02, 1522.142556], [1524617100000, 9580.02, 9591.05, 9511.93, 9529.94, 699.610086], [1524618000000, 9529.21, 9550.0, 9466.01, 9550.0, 682.352162], [1524618900000, 9550.0, 9593.48, 9545.02, 9590.0, 442.401324], [1524619800000, 9590.0, 9637.17, 9583.59, 9616.09, 615.313836], [1524620700000, 9619.0, 9638.68, 9590.02, 9628.0, 422.267292], [1524621600000, 9628.0, 9673.0, 9530.0, 9633.0, 661.225277], [1524622500000, 9638.9, 9720.0, 9632.0, 9665.99, 716.020241], [1524623400000, 9665.99, 9759.82, 9659.04, 9739.88, 805.230478], [1524624300000, 9737.0, 9744.0, 9665.96, 9687.05, 743.566674], [1524625200000, 9675.01, 9729.88, 9670.01, 9702.0, 426.865361], [1524626100000, 9702.01, 9703.02, 9580.96, 9624.24, 826.641991], [1524627000000, 9630.0, 9649.99, 9584.0, 9591.88, 803.15528], [1524627900000, 9598.01, 9598.01, 9323.02, 9347.99, 2693.595485], [1524628800000, 9349.99, 9500.0, 9330.01, 9430.08, 1686.21148], [1524629700000, 9433.0, 9480.0, 9323.02, 9363.0, 1079.808512], [1524630600000, 9365.55, 9402.0, 9223.0, 9260.07, 2001.612726], [1524631500000, 9260.08, 9298.0, 9110.0, 9200.0, 2581.434896], [1524632400000, 9200.22, 9365.07, 9190.0, 9329.96, 1972.623364], [1524633300000, 9330.07, 9411.0, 9280.66, 9364.26, 1104.200884], [1524634200000, 9364.23, 9393.28, 9316.0, 9331.66, 703.866923], [1524635100000, 9334.0, 9396.0, 9303.0, 9370.0, 691.059498], [1524636000000, 9370.0, 9466.0, 9355.0, 9450.08, 805.651916], [1524636900000, 9455.0, 9476.23, 9428.0, 9441.1, 706.595004], [1524637800000, 9441.1, 9453.56, 9377.0, 9410.0, 518.607298], [1524638700000, 9411.29, 9445.94, 9402.0, 9415.06, 277.620532], [1524639600000, 9415.06, 9460.01, 9402.38, 9433.0, 375.830093], [1524640500000, 9434.95, 9468.0, 9415.0, 9454.22, 373.302303], [1524641400000, 9450.02, 9460.0, 9420.0, 9435.0, 345.305315], [1524642300000, 9435.0, 9440.0, 9322.0, 9416.39, 711.733353], [1524643200000, 9415.0, 9438.54, 9392.65, 9416.85, 490.794409], [1524644100000, 9418.01, 9428.02, 9338.0, 9366.87, 470.345707], [1524645000000, 9370.0, 9409.35, 9349.01, 9360.06, 328.541443], [1524645900000, 9362.72, 9364.86, 9251.0, 9281.98, 773.054919], [1524646800000, 9281.98, 9340.0, 9270.02, 9323.0, 490.261082], [1524647700000, 9323.0, 9331.28, 9268.07, 9309.84, 417.133867], [1524648600000, 9309.1, 9310.11, 9200.1, 9229.49, 836.427785], [1524649500000, 9227.07, 9289.8, 9210.5, 9272.0, 688.904683], [1524650400000, 9271.09, 9280.0, 9225.0, 9239.98, 525.98002], [1524651300000, 9239.98, 9244.97, 9086.0, 9090.0, 1963.0004], [1524652200000, 9090.0, 9160.1, 9035.21, 9045.25, 1900.412184], [1524653100000, 9050.0, 9150.0, 8960.0, 9140.68, 2424.370008], [1524654000000, 9140.0, 9154.39, 9070.0, 9083.91, 1121.392287], [1524654900000, 9083.9, 9083.9, 8980.0, 9012.95, 1115.19957], [1524655800000, 9012.98, 9106.95, 9010.0, 9041.09, 680.692803], [1524656700000, 9041.09, 9189.39, 9004.36, 9144.03, 1185.601193], [1524657600000, 9137.0, 9210.21, 9122.01, 9153.68, 1294.170498], [1524658500000, 9154.0, 9172.0, 9071.0, 9083.54, 854.762498], [1524659400000, 9088.12, 9179.0, 9086.2, 9169.98, 499.95441], [1524660300000, 9171.06, 9205.0, 9115.0, 9129.89, 624.9171], [1524661200000, 9129.84, 9159.03, 9102.46, 9135.23, 448.6697], [1524662100000, 9135.23, 9158.88, 9020.0, 9051.76, 752.129198], [1524663000000, 9054.98, 9100.0, 8925.8, 8963.01, 1237.776003], [1524663900000, 8962.99, 9056.38, 8954.09, 9011.78, 1226.799107], [1524664800000, 9011.79, 9042.93, 8860.0, 8877.87, 1285.565224], [1524665700000, 8877.88, 8950.0, 8840.07, 8845.0, 1603.874666], [1524666600000, 8844.66, 8916.04, 8781.62, 8805.07, 2242.715227], [1524667500000, 8805.07, 8917.0, 8730.0, 8880.0, 2221.545476], [1524668400000, 8874.33, 8900.0, 8825.0, 8869.99, 1106.891449], [1524669300000, 8869.99, 8975.0, 8869.1, 8889.0, 1229.136544], [1524670200000, 8882.79, 8946.4, 8854.02, 8939.12, 855.452868], [1524671100000, 8938.94, 8975.0, 8910.0, 8972.09, 692.601191], [1524672000000, 8972.09, 8977.0, 8860.0, 8893.0, 967.750886], [1524672900000, 8880.31, 8900.02, 8846.0, 8860.48, 670.436057], [1524673800000, 8865.22, 8930.75, 8847.0, 8909.65, 472.128441], [1524674700000, 8896.16, 8946.0, 8890.19, 8910.0, 486.395757], [1524675600000, 8908.32, 8968.0, 8908.28, 8965.99, 533.847191], [1524676500000, 8965.99, 9039.73, 8935.99, 9028.94, 823.254173], [1524677400000, 9023.81, 9089.0, 8994.98, 9088.99, 912.779608], [1524678300000, 9080.84, 9088.99, 9021.12, 9058.0, 535.273177], [1524679200000, 9055.1, 9063.58, 8975.0, 9010.73, 650.386072], [1524680100000, 9013.0, 9031.4, 8968.0, 9017.02, 408.204094], [1524681000000, 9018.0, 9050.0, 8992.0, 9039.99, 344.359066], [1524681900000, 9039.99, 9042.22, 8951.0, 8991.03, 413.692354], [1524682800000, 8991.04, 9020.01, 8976.03, 9004.1, 261.422682], [1524683700000, 9006.99, 9025.0, 8966.0, 8969.02, 293.2567], [1524684600000, 8966.11, 9018.49, 8948.05, 8989.98, 479.43203], [1524685500000, 8989.99, 9000.75, 8950.0, 8969.98, 276.394504], [1524686400000, 8969.55, 9068.85, 8963.54, 9060.0, 524.958602], [1524687300000, 9060.0, 9068.85, 9040.11, 9068.85, 275.024777], [1524688200000, 9068.0, 9116.91, 9061.12, 9102.66, 531.593589], [1524689100000, 9102.66, 9109.98, 9075.0, 9083.0, 336.35929], [1524690000000, 9085.16, 9130.0, 9076.01, 9127.0, 361.792369], [1524690900000, 9129.0, 9159.9, 9120.0, 9128.01, 567.549618], [1524691800000, 9130.01, 9150.0, 9116.28, 9122.0, 372.515476], [1524692700000, 9121.5, 9179.0, 9115.33, 9178.98, 532.866007], [1524693600000, 9178.98, 9185.01, 9102.01, 9124.79, 594.209661], [1524694500000, 9117.64, 9142.82, 9062.02, 9099.82, 651.466237], [1524695400000, 9099.8, 9104.4, 9064.01, 9066.44, 349.339815], [1524696300000, 9066.01, 9066.01, 8926.0, 8955.0, 993.909812], [1524697200000, 8950.0, 9007.6, 8875.1, 8913.43, 826.99588], [1524698100000, 8913.44, 8931.18, 8820.0, 8830.01, 555.673515], [1524699000000, 8831.57, 8889.63, 8800.01, 8805.0, 648.260931], [1524699900000, 8819.98, 8886.68, 8770.0, 8869.99, 918.618828], [1524700800000, 8869.99, 8869.99, 8752.04, 8819.37, 748.935661], [1524701700000, 8819.34, 8830.0, 8667.01, 8701.34, 1143.901965], [1524702600000, 8693.55, 8800.0, 8660.0, 8745.02, 1331.701608], [1524703500000, 8745.02, 8839.0, 8720.01, 8800.02, 633.17511], [1524704400000, 8808.17, 8830.0, 8720.13, 8807.0, 542.109248], [1524705300000, 8807.0, 8860.0, 8790.0, 8850.0, 536.573469], [1524706200000, 8854.66, 8863.85, 8810.0, 8831.57, 448.764779], [1524707100000, 8831.54, 8834.44, 8750.95, 8752.82, 445.378297], [1524708000000, 8755.06, 8831.0, 8751.0, 8825.46, 493.863212], [1524708900000, 8830.61, 8857.01, 8809.17, 8842.25, 413.85608], [1524709800000, 8842.25, 8889.94, 8823.0, 8880.0, 368.204864], [1524710700000, 8884.53, 8899.0, 8849.48, 8850.15, 361.227284], [1524711600000, 8850.22, 8888.0, 8827.0, 8883.0, 351.118912], [1524712500000, 8882.13, 8890.0, 8849.77, 8854.0, 376.316699], [1524713400000, 8853.99, 8859.98, 8763.14, 8819.0, 474.58878], [1524714300000, 8819.0, 8829.0, 8791.0, 8808.02, 227.968127], [1524715200000, 8812.7, 8871.07, 8800.0, 8860.0, 475.793683], [1524716100000, 8864.0, 8886.92, 8852.55, 8874.49, 321.312794], [1524717000000, 8873.8, 8932.69, 8862.49, 8907.04, 649.535684], [1524717900000, 8910.72, 8940.01, 8881.01, 8935.0, 691.694952], [1524718800000, 8936.0, 8977.0, 8901.46, 8961.85, 717.373256], [1524719700000, 8961.85, 8965.0, 8902.0, 8904.93, 396.698669], [1524720600000, 8904.9, 8937.0, 8880.0, 8885.43, 538.227401], [1524721500000, 8885.16, 8916.56, 8874.0, 8916.56, 398.105076], [1524722400000, 8905.88, 8945.34, 8901.1, 8934.01, 271.367533], [1524723300000, 8934.0, 8943.98, 8888.88, 8896.98, 351.446775], [1524724200000, 8888.91, 8906.94, 8771.0, 8805.94, 998.783557], [1524725100000, 8808.0, 8850.0, 8801.01, 8841.0, 520.748141], [1524726000000, 8841.04, 8853.5, 8803.0, 8814.99, 452.894556], [1524726900000, 8811.11, 8835.97, 8810.0, 8825.33, 256.695688], [1524727800000, 8825.21, 8868.99, 8812.03, 8866.8, 314.780939], [1524728700000, 8866.8, 8888.99, 8838.63, 8847.97, 336.684857], [1524729600000, 8847.97, 8887.8, 8820.0, 8830.84, 362.134049], [1524730500000, 8826.7, 8848.07, 8701.01, 8750.0, 933.445022], [1524731400000, 8750.0, 8772.0, 8680.0, 8743.81, 844.791247], [1524732300000, 8743.8, 8755.29, 8705.0, 8720.5, 623.31932], [1524733200000, 8720.58, 8773.0, 8716.01, 8759.0, 446.103175], [1524734100000, 8759.0, 8770.0, 8720.0, 8724.87, 414.808159], [1524735000000, 8723.0, 8726.02, 8651.62, 8708.85, 727.608275], [1524735900000, 8708.86, 8751.09, 8705.91, 8746.0, 429.193888], [1524736800000, 8746.0, 8794.43, 8738.14, 8789.0, 367.390203], [1524737700000, 8787.89, 8865.0, 8760.0, 8848.39, 494.65076], [1524738600000, 8848.39, 8881.0, 8819.0, 8864.99, 544.067369], [1524739500000, 8859.01, 8874.25, 8816.0, 8845.02, 411.579622], [1524740400000, 8844.98, 8880.0, 8819.0, 8880.0, 377.89327], [1524741300000, 8880.0, 8917.51, 8835.0, 8847.98, 433.037134], [1524742200000, 8845.04, 8874.6, 8835.01, 8849.0, 296.762343], [1524743100000, 8849.0, 8872.08, 8846.34, 8857.01, 311.781217], [1524744000000, 8858.51, 8925.0, 8857.01, 8915.03, 376.462557], [1524744900000, 8915.04, 8945.0, 8865.24, 8884.0, 493.915306], [1524745800000, 8880.2, 8925.04, 8871.55, 8910.33, 344.641635], [1524746700000, 8911.73, 8924.8, 8894.0, 8900.01, 243.670429], [1524747600000, 8904.78, 8904.93, 8839.0, 8866.0, 410.173493], [1524748500000, 8866.0, 8870.0, 8785.0, 8838.7, 415.115447], [1524749400000, 8839.0, 8859.98, 8801.0, 8859.98, 223.177838], [1524750300000, 8859.98, 8875.0, 8810.63, 8829.63, 282.481614], [1524751200000, 8828.27, 8873.0, 8826.9, 8866.53, 232.368104], [1524752100000, 8866.53, 8885.0, 8764.86, 8769.49, 613.639449], [1524753000000, 8763.99, 8809.0, 8740.01, 8756.51, 428.613857], [1524753900000, 8756.51, 8840.0, 8750.03, 8829.99, 479.154659], [1524754800000, 8829.99, 8830.0, 8787.21, 8799.99, 279.872144], [1524755700000, 8799.99, 8821.97, 8768.6, 8811.03, 298.899445], [1524756600000, 8811.03, 8831.85, 8782.06, 8794.25, 326.108962], [1524757500000, 8794.25, 8832.0, 8785.27, 8806.1, 253.328428], [1524758400000, 8806.1, 8818.7, 8775.89, 8815.14, 297.454772], [1524759300000, 8816.66, 8872.99, 8815.0, 8857.28, 497.91022], [1524760200000, 8856.22, 8894.0, 8841.14, 8876.99, 333.24811], [1524761100000, 8875.98, 8908.53, 8873.85, 8900.51, 342.873402], [1524762000000, 8899.0, 8902.42, 8867.5, 8884.89, 291.827552], [1524762900000, 8884.0, 8925.0, 8860.35, 8871.87, 326.29298], [1524763800000, 8875.0, 8898.92, 8846.0, 8854.0, 257.7916], [1524764700000, 8854.0, 8889.13, 8845.03, 8866.43, 245.884519], [1524765600000, 8866.43, 8876.29, 8839.53, 8869.0, 147.926988], [1524766500000, 8869.73, 8909.0, 8860.0, 8882.92, 220.496403], [1524767400000, 8882.92, 8893.9, 8852.0, 8860.84, 140.586805], [1524768300000, 8860.83, 8860.83, 8834.02, 8845.09, 200.534119], [1524769200000, 8845.1, 8869.99, 8838.35, 8865.85, 165.938086], [1524770100000, 8860.99, 8869.99, 8846.0, 8866.0, 202.912286], [1524771000000, 8866.0, 8895.21, 8860.0, 8876.0, 198.89489], [1524771900000, 8880.0, 8888.88, 8861.0, 8881.54, 92.619623], [1524772800000, 8880.0, 9087.0, 8880.0, 9073.99, 1098.232808], [1524773700000, 9070.21, 9138.0, 9027.94, 9096.96, 918.768172], [1524774600000, 9104.96, 9124.88, 9062.72, 9106.26, 476.774071], [1524775500000, 9106.26, 9137.4, 9075.0, 9123.99, 511.019423], [1524776400000, 9123.99, 9135.04, 9090.0, 9105.0, 420.524914], [1524777300000, 9114.81, 9168.98, 9100.0, 9167.02, 344.951161], [1524778200000, 9167.02, 9169.9, 9066.02, 9122.0, 592.904449], [1524779100000, 9122.01, 9130.0, 9078.02, 9099.0, 306.790777], [1524780000000, 9100.0, 9141.99, 9096.01, 9135.17, 333.092614], [1524780900000, 9135.17, 9174.11, 9135.17, 9158.05, 377.715707], [1524781800000, 9156.72, 9171.0, 9131.0, 9171.0, 337.373407], [1524782700000, 9170.08, 9235.99, 9150.0, 9221.0, 919.478889], [1524783600000, 9221.0, 9288.0, 9215.01, 9225.0, 842.400578], [1524784500000, 9223.73, 9250.2, 9188.0, 9237.0, 514.479912], [1524785400000, 9237.0, 9269.99, 9230.01, 9258.99, 434.323157], [1524786300000, 9259.01, 9307.48, 9257.88, 9266.0, 598.265775], [1524787200000, 9267.03, 9297.0, 9215.0, 9226.61, 607.719448], [1524788100000, 9226.94, 9284.77, 9217.01, 9247.67, 379.792675], [1524789000000, 9249.01, 9249.5, 9177.0, 9210.0, 512.070948], [1524789900000, 9210.0, 9245.56, 9200.0, 9210.32, 309.648801], [1524790800000, 9210.29, 9265.0, 9210.21, 9242.32, 351.124294], [1524791700000, 9242.3, 9292.0, 9242.25, 9254.76, 461.444332], [1524792600000, 9250.0, 9270.0, 9220.0, 9255.0, 266.548876], [1524793500000, 9255.0, 9255.0, 9214.0, 9249.97, 276.33081], [1524794400000, 9240.0, 9259.99, 9239.64, 9251.01, 312.328182], [1524795300000, 9259.35, 9282.0, 9252.34, 9273.5, 302.210235], [1524796200000, 9272.32, 9277.0, 9237.0, 9249.0, 251.486267], [1524797100000, 9248.0, 9260.0, 9233.51, 9255.49, 190.370896], [1524798000000, 9255.5, 9258.0, 9213.25, 9220.02, 345.902361], [1524798900000, 9220.01, 9235.0, 9216.42, 9227.03, 203.735845], [1524799800000, 9227.03, 9232.06, 9130.1, 9161.45, 697.044991], [1524800700000, 9156.81, 9200.0, 9123.25, 9143.01, 803.349009], [1524801600000, 9143.01, 9220.0, 9104.88, 9173.32, 587.971335], [1524802500000, 9173.31, 9213.67, 9162.76, 9209.35, 310.812529], [1524803400000, 9209.35, 9230.0, 9175.59, 9224.0, 302.227695], [1524804300000, 9224.0, 9235.0, 9203.08, 9204.99, 303.831046], [1524805200000, 9205.0, 9229.59, 9188.0, 9203.04, 221.953885], [1524806100000, 9203.04, 9217.54, 9189.8, 9213.0, 177.407483], [1524807000000, 9217.54, 9229.0, 9196.0, 9210.0, 284.716333], [1524807900000, 9210.0, 9212.07, 9160.0, 9180.82, 271.121463], [1524808800000, 9184.99, 9220.33, 9176.99, 9210.1, 339.055256], [1524809700000, 9209.97, 9262.98, 9209.97, 9230.0, 689.965676], [1524810600000, 9230.0, 9265.7, 9226.0, 9229.96, 368.647637], [1524811500000, 9229.96, 9259.0, 9226.0, 9250.0, 255.99798], [1524812400000, 9249.99, 9250.0, 9210.1, 9230.01, 226.113619], [1524813300000, 9225.02, 9232.74, 9188.0, 9188.0, 312.713499], [1524814200000, 9196.0, 9226.0, 9188.0, 9220.24, 211.780744], [1524815100000, 9220.25, 9250.0, 9220.01, 9240.97, 256.939342], [1524816000000, 9240.97, 9296.0, 9231.01, 9280.0, 553.539661], [1524816900000, 9280.0, 9281.99, 9256.0, 9271.0, 341.936855], [1524817800000, 9274.0, 9274.0, 9230.0, 9238.79, 235.416812], [1524818700000, 9238.79, 9269.88, 9230.0, 9260.0, 206.113536], [1524819600000, 9260.0, 9268.99, 9241.2, 9268.0, 152.214565], [1524820500000, 9261.0, 9279.88, 9251.53, 9265.0, 217.01421], [1524821400000, 9266.01, 9361.86, 9250.01, 9348.83, 951.584551], [1524822300000, 9345.0, 9387.48, 9326.81, 9369.0, 634.031923], [1524823200000, 9369.0, 9376.5, 9328.05, 9350.0, 395.4635], [1524824100000, 9350.0, 9380.0, 9340.0, 9368.99, 420.285784], [1524825000000, 9368.99, 9395.0, 9352.17, 9382.01, 499.56778], [1524825900000, 9382.01, 9382.1, 9350.0, 9365.0, 301.439132], [1524826800000, 9363.31, 9367.97, 9335.93, 9340.21, 282.4782], [1524827700000, 9340.22, 9345.52, 9290.03, 9345.52, 453.887946], [1524828600000, 9343.0, 9345.54, 9280.59, 9300.0, 311.259024], [1524829500000, 9305.0, 9335.18, 9297.2, 9309.0, 283.291653], [1524830400000, 9308.9, 9355.0, 9308.9, 9345.0, 327.326037], [1524831300000, 9342.0, 9349.99, 9325.0, 9349.9, 223.369993], [1524832200000, 9349.9, 9350.0, 9326.04, 9339.01, 332.875567], [1524833100000, 9339.01, 9347.73, 9253.68, 9290.07, 425.805191], [1524834000000, 9290.01, 9318.62, 9240.21, 9241.01, 497.048946], [1524834900000, 9241.01, 9265.99, 9150.1, 9190.01, 1070.939574], [1524835800000, 9190.01, 9250.0, 9155.46, 9221.0, 642.768268], [1524836700000, 9220.99, 9232.0, 9199.99, 9225.0, 314.315537], [1524837600000, 9226.97, 9249.0, 9202.0, 9240.0, 219.45231], [1524838500000, 9239.99, 9270.36, 9230.0, 9260.15, 381.181571], [1524839400000, 9260.15, 9275.0, 9219.01, 9253.04, 350.787502], [1524840300000, 9253.11, 9290.0, 9250.0, 9288.88, 449.637292], [1524841200000, 9280.14, 9288.88, 9250.0, 9250.21, 324.012815], [1524842100000, 9250.21, 9264.99, 9210.01, 9235.0, 521.383536], [1524843000000, 9235.14, 9260.0, 9225.0, 9251.01, 325.898122], [1524843900000, 9251.01, 9255.69, 9240.01, 9241.21, 188.664697], [1524844800000, 9241.2, 9310.96, 9241.0, 9308.87, 490.067042], [1524845700000, 9306.0, 9328.26, 9280.0, 9297.0, 433.94217], [1524846600000, 9296.95, 9300.0, 9269.0, 9287.0, 236.441826], [1524847500000, 9290.0, 9299.99, 9275.78, 9282.1, 235.061063], [1524848400000, 9286.01, 9299.98, 9269.54, 9280.97, 175.003838], [1524849300000, 9280.97, 9319.99, 9266.0, 9301.33, 338.199534], [1524850200000, 9301.83, 9316.0, 9282.99, 9298.0, 346.539565], [1524851100000, 9294.99, 9305.0, 9290.02, 9290.1, 262.487145], [1524852000000, 9290.1, 9296.31, 9240.0, 9272.47, 279.74896], [1524852900000, 9272.47, 9282.0, 9225.0, 9244.93, 320.004267], [1524853800000, 9244.94, 9271.76, 9213.8, 9252.0, 237.767724], [1524854700000, 9252.0, 9268.99, 9230.0, 9230.89, 164.386191], [1524855600000, 9230.89, 9250.56, 9191.0, 9195.04, 322.252566], [1524856500000, 9195.02, 9219.83, 9168.0, 9190.0, 370.53515], [1524857400000, 9189.85, 9210.0, 9170.0, 9187.97, 281.734858], [1524858300000, 9185.19, 9190.0, 9075.01, 9089.0, 1122.662866], [1524859200000, 9089.12, 9163.38, 9087.02, 9133.42, 485.653989], [1524860100000, 9133.42, 9133.42, 9054.01, 9090.55, 504.418846], [1524861000000, 9090.55, 9098.68, 8952.0, 8964.99, 1222.270081], [1524861900000, 8955.02, 9020.0, 8940.0, 8970.0, 871.723192], [1524862800000, 8969.99, 9040.0, 8909.83, 9029.92, 797.168072], [1524863700000, 9024.99, 9053.0, 8980.0, 8991.0, 517.909468], [1524864600000, 8991.0, 9019.96, 8970.01, 8995.17, 293.511938], [1524865500000, 8995.17, 9042.09, 8966.44, 8975.35, 302.644176], [1524866400000, 8975.36, 9045.0, 8975.36, 9042.67, 300.398461], [1524867300000, 9042.01, 9073.77, 9024.96, 9071.0, 234.647043], [1524868200000, 9071.0, 9093.09, 9060.0, 9079.01, 273.26671], [1524869100000, 9085.0, 9085.0, 9030.01, 9031.0, 268.775762], [1524870000000, 9032.0, 9073.93, 9022.0, 9056.95, 258.559033], [1524870900000, 9058.99, 9059.0, 9034.99, 9038.0, 146.56828], [1524871800000, 9038.0, 9038.0, 8970.0, 8991.0, 392.303173], [1524872700000, 8990.99, 8996.0, 8889.0, 8915.35, 527.338465], [1524873600000, 8915.35, 8938.2, 8870.0, 8938.2, 629.128485], [1524874500000, 8938.2, 8987.0, 8916.14, 8976.98, 348.807484], [1524875400000, 8976.99, 9049.76, 8976.04, 9040.0, 292.456519], [1524876300000, 9040.0, 9041.0, 8988.99, 9010.11, 483.647832], [1524877200000, 9005.98, 9031.85, 9000.0, 9030.01, 292.594779], [1524878100000, 9030.01, 9042.79, 9012.45, 9035.0, 234.988398], [1524879000000, 9036.0, 9097.99, 9025.01, 9092.0, 344.406628], [1524879900000, 9095.93, 9126.81, 9075.0, 9126.81, 426.871643], [1524880800000, 9126.81, 9129.17, 9089.98, 9110.01, 369.284006], [1524881700000, 9108.0, 9123.03, 9075.19, 9100.33, 440.966647], [1524882600000, 9100.33, 9119.0, 9086.7, 9094.98, 213.968574], [1524883500000, 9094.99, 9094.99, 9050.0, 9055.78, 293.416831], [1524884400000, 9053.47, 9100.0, 9051.0, 9097.51, 192.578571], [1524885300000, 9096.28, 9146.99, 9093.0, 9112.27, 285.673565], [1524886200000, 9112.0, 9130.0, 9100.0, 9114.0, 173.541463], [1524887100000, 9114.0, 9196.32, 9114.0, 9155.0, 437.27507], [1524888000000, 9155.01, 9168.71, 9137.72, 9142.99, 231.077535], [1524888900000, 9142.99, 9162.34, 9130.01, 9160.95, 214.310055], [1524889800000, 9160.92, 9165.47, 9131.0, 9148.01, 195.950406], [1524890700000, 9148.01, 9158.0, 9111.21, 9138.53, 275.582334], [1524891600000, 9138.54, 9184.8, 9127.64, 9180.02, 268.898183], [1524892500000, 9180.02, 9188.5, 9151.45, 9157.1, 252.421493], [1524893400000, 9157.0, 9164.18, 9141.3, 9156.99, 200.598696], [1524894300000, 9150.02, 9169.0, 9140.67, 9164.49, 212.106951], [1524895200000, 9164.48, 9199.99, 9160.01, 9189.93, 434.591983], [1524896100000, 9189.93, 9200.0, 9170.0, 9184.0, 263.855301], [1524897000000, 9184.01, 9209.8, 9175.0, 9203.0, 326.116428], [1524897900000, 9203.0, 9215.66, 9150.67, 9163.03, 324.246063], [1524898800000, 9163.02, 9171.07, 9128.0, 9150.99, 408.244411], [1524899700000, 9151.0, 9165.0, 9146.0, 9153.67, 174.373304], [1524900600000, 9153.67, 9154.08, 9108.99, 9124.92, 354.003365], [1524901500000, 9129.81, 9145.0, 9110.0, 9126.22, 266.479735], [1524902400000, 9121.05, 9126.21, 9081.02, 9088.99, 339.278517], [1524903300000, 9089.0, 9110.0, 9085.02, 9090.0, 288.125534], [1524904200000, 9090.0, 9330.0, 9088.96, 9320.0, 1354.840136], [1524905100000, 9315.0, 9325.0, 9190.0, 9217.48, 1066.509186], [1524906000000, 9227.49, 9250.0, 9155.06, 9195.61, 780.410388], [1524906900000, 9195.6, 9288.0, 9171.02, 9276.13, 490.492755], [1524907800000, 9270.0, 9300.4, 9224.11, 9275.0, 517.795526], [1524908700000, 9275.0, 9280.08, 9242.07, 9273.0, 184.336414], [1524909600000, 9273.0, 9310.0, 9257.8, 9284.36, 427.866539]], "30m": [[1524011400000, 7915.98, 7928.99, 7910.0, 7926.32, 300.339403], [1524013200000, 7926.0, 7979.0, 7920.01, 7963.64, 542.090478], [1524015000000, 7963.98, 7964.03, 7930.02, 7952.42, 269.860196], [1524016800000, 7952.42, 7966.54, 7937.02, 7951.5, 403.37279], [1524018600000, 7958.05, 7963.9, 7901.3, 7911.99, 368.63898], [1524020400000, 7905.69, 7933.0, 7905.69, 7925.05, 228.735227], [1524022200000, 7928.56, 7949.82, 7923.0, 7947.71, 276.111772], [1524024000000, 7947.74, 7949.0, 7920.0, 7929.99, 350.122797], [1524025800000, 7929.99, 7937.94, 7915.0, 7915.1, 367.125124], [1524027600000, 7915.1, 7938.11, 7907.05, 7932.53, 335.016082], [1524029400000, 7932.54, 7949.99, 7915.46, 7928.99, 327.546699], [1524031200000, 7925.83, 7945.51, 7905.15, 7931.2, 442.102541], [1524033000000, 7938.46, 8139.0, 7868.0, 8125.0, 2082.763913], [1524034800000, 8123.89, 8149.89, 8085.03, 8107.0, 1290.614179], [1524036600000, 8107.0, 8125.0, 8090.0, 8107.23, 508.52471], [1524038400000, 8113.51, 8118.0, 8071.0, 8083.44, 582.775488], [1524040200000, 8083.45, 8100.99, 8072.0, 8086.0, 594.394699], [1524042000000, 8082.56, 8103.0, 8074.67, 8084.99, 556.004599], [1524043800000, 8085.0, 8110.0, 8082.05, 8092.01, 363.00671], [1524045600000, 8092.02, 8109.99, 8077.08, 8085.99, 436.224329], [1524047400000, 8086.0, 8120.0, 8081.01, 8095.01, 581.905457], [1524049200000, 8095.0, 8097.0, 8067.02, 8089.99, 414.692354], [1524051000000, 8088.0, 8110.0, 8080.48, 8103.0, 402.819813], [1524052800000, 8104.0, 8117.81, 8085.0, 8086.99, 402.974085], [1524054600000, 8089.99, 8099.0, 8080.09, 8095.04, 319.715586], [1524056400000, 8095.03, 8114.0, 8075.06, 8088.99, 535.863588], [1524058200000, 8089.0, 8105.0, 8083.0, 8095.89, 371.374463], [1524060000000, 8098.45, 8100.0, 8083.06, 8086.0, 308.979545], [1524061800000, 8086.02, 8094.0, 7937.6, 7970.91, 1038.250628], [1524063600000, 7962.27, 7996.0, 7931.01, 7990.03, 1120.837473], [1524065400000, 7992.9, 8036.65, 7985.01, 7994.0, 612.537395], [1524067200000, 7994.0, 8041.0, 7985.01, 8030.05, 432.829846], [1524069000000, 8030.06, 8149.78, 8020.03, 8111.01, 1076.655321], [1524070800000, 8113.93, 8128.5, 8095.5, 8117.0, 607.407919], [1524072600000, 8117.01, 8128.0, 8078.01, 8099.0, 535.526961], [1524074400000, 8098.79, 8124.0, 8090.65, 8104.01, 485.799809], [1524076200000, 8104.11, 8117.81, 8095.0, 8109.0, 395.523175], [1524078000000, 8109.0, 8119.0, 8095.0, 8116.62, 424.192959], [1524079800000, 8116.63, 8126.79, 8108.0, 8116.65, 486.543061], [1524081600000, 8116.01, 8236.43, 8097.0, 8205.0, 1338.663758], [1524083400000, 8205.0, 8235.86, 8171.0, 8197.98, 713.281005], [1524085200000, 8187.02, 8198.0, 8174.05, 8187.99, 352.56508], [1524087000000, 8187.99, 8202.0, 8181.0, 8199.0, 453.495544], [1524088800000, 8199.0, 8220.1, 8170.0, 8178.03, 711.375903], [1524090600000, 8172.9, 8190.6, 8105.0, 8155.01, 789.620407], [1524092400000, 8156.5, 8179.26, 8141.01, 8168.0, 465.63546], [1524094200000, 8166.08, 8186.59, 8150.86, 8173.0, 458.107725], [1524096000000, 8173.99, 8180.0, 8100.0, 8144.99, 718.044191], [1524097800000, 8144.96, 8160.01, 8135.0, 8154.0, 324.576129], [1524099600000, 8158.0, 8159.08, 8137.0, 8141.78, 571.885944], [1524101400000, 8146.37, 8210.0, 8140.01, 8188.88, 1027.879196], [1524103200000, 8188.88, 8200.0, 8150.0, 8187.72, 557.727958], [1524105000000, 8187.72, 8290.0, 8180.0, 8220.01, 1096.403115], [1524106800000, 8220.01, 8220.01, 8156.0, 8182.01, 633.501167], [1524108600000, 8182.01, 8198.31, 8176.16, 8185.0, 408.746857], [1524110400000, 8184.99, 8185.0, 8139.76, 8151.99, 642.916216], [1524112200000, 8151.99, 8187.0, 8120.0, 8183.0, 735.169901], [1524114000000, 8183.0, 8186.98, 8145.68, 8163.4, 550.228983], [1524115800000, 8164.0, 8198.0, 8163.4, 8180.0, 487.393226], [1524117600000, 8180.0, 8215.45, 8175.18, 8213.14, 497.898403], [1524119400000, 8213.11, 8213.11, 8163.24, 8184.9, 424.377904], [1524121200000, 8184.9, 8249.0, 8165.0, 8209.36, 605.612417], [1524123000000, 8209.34, 8224.0, 8080.0, 8166.97, 1103.881948], [1524124800000, 8166.97, 8188.45, 8150.52, 8188.2, 509.876942], [1524126600000, 8185.01, 8239.99, 8169.0, 8177.98, 649.043125], [1524128400000, 8175.82, 8219.0, 8143.02, 8209.96, 619.987893], [1524130200000, 8209.96, 8240.0, 8180.0, 8230.89, 773.027624], [1524132000000, 8231.0, 8250.0, 8202.83, 8237.01, 704.772106], [1524133800000, 8237.02, 8250.0, 8230.0, 8240.63, 602.787362], [1524135600000, 8240.64, 8259.0, 8191.47, 8210.49, 641.142318], [1524137400000, 8211.18, 8222.83, 8192.36, 8207.01, 383.937516], [1524139200000, 8207.0, 8222.44, 8181.7, 8210.65, 459.078981], [1524141000000, 8210.65, 8248.5, 8210.64, 8237.68, 614.330553], [1524142800000, 8235.33, 8248.49, 8220.0, 8234.01, 360.668067], [1524144600000, 8234.01, 8245.01, 8218.0, 8234.84, 502.081481], [1524146400000, 8236.0, 8270.0, 8171.56, 8231.04, 1017.60315], [1524148200000, 8231.02, 8244.2, 8216.02, 8229.97, 439.257174], [1524150000000, 8229.0, 8239.9, 8214.0, 8224.62, 347.799747], [1524151800000, 8224.93, 8239.03, 8222.1, 8239.02, 428.306893], [1524153600000, 8235.45, 8288.37, 8230.01, 8248.0, 1000.947789], [1524155400000, 8248.0, 8262.27, 8235.0, 8244.99, 436.641575], [1524157200000, 8244.66, 8260.0, 8236.0, 8257.03, 321.594392], [1524159000000, 8260.0, 8296.0, 8238.66, 8259.08, 822.560047], [1524160800000, 8257.61, 8290.0, 8251.0, 8252.03, 438.00739], [1524162600000, 8252.03, 8275.02, 8245.02, 8274.57, 361.15831], [1524164400000, 8274.57, 8277.0, 8234.0, 8260.4, 421.462158], [1524166200000, 8262.0, 8262.0, 8233.1, 8249.95, 375.381814], [1524168000000, 8249.95, 8250.01, 8189.0, 8234.16, 793.848143], [1524169800000, 8236.35, 8247.99, 8220.01, 8226.7, 354.729625], [1524171600000, 8226.69, 8275.0, 8222.0, 8254.08, 461.199601], [1524173400000, 8259.89, 8280.0, 8248.58, 8272.28, 341.455474], [1524175200000, 8272.28, 8292.0, 8265.01, 8275.92, 442.74518], [1524177000000, 8275.93, 8291.99, 8250.0, 8253.0, 433.508841], [1524178800000, 8259.93, 8265.25, 8230.0, 8252.13, 312.981236], [1524180600000, 8257.96, 8294.99, 8252.01, 8278.0, 355.681402], [1524182400000, 8273.84, 8375.0, 8270.32, 8357.37, 1275.192993], [1524184200000, 8357.37, 8371.0, 8333.0, 8350.56, 617.95392], [1524186000000, 8350.55, 8350.55, 8312.29, 8325.0, 515.596669], [1524187800000, 8325.0, 8368.0, 8324.0, 8360.0, 560.72077], [1524189600000, 8359.99, 8398.0, 8336.0, 8365.02, 859.33341], [1524191400000, 8365.01, 8365.02, 8282.2, 8324.89, 1117.043033], [1524193200000, 8324.89, 8355.04, 8323.65, 8339.85, 392.968463], [1524195000000, 8343.11, 8348.0, 8320.0, 8331.03, 364.5666], [1524196800000, 8331.3, 8336.38, 8229.68, 8278.96, 2111.441565], [1524198600000, 8278.93, 8287.8, 8222.55, 8240.99, 965.591449], [1524200400000, 8240.99, 8300.0, 8177.09, 8275.99, 1282.106994], [1524202200000, 8275.0, 8290.0, 8247.02, 8272.99, 494.560625], [1524204000000, 8272.99, 8295.62, 8253.0, 8282.97, 621.034129], [1524205800000, 8283.97, 8321.19, 8280.0, 8309.89, 702.784735], [1524207600000, 8309.89, 8346.0, 8306.01, 8332.99, 700.379394], [1524209400000, 8332.99, 8348.98, 8293.49, 8319.97, 593.887254], [1524211200000, 8319.92, 8349.01, 8303.89, 8329.0, 641.086245], [1524213000000, 8329.0, 8331.98, 8281.0, 8294.1, 697.75508], [1524214800000, 8294.18, 8320.0, 8267.01, 8312.1, 523.214163], [1524216600000, 8311.62, 8323.96, 8294.56, 8308.87, 372.200816], [1524218400000, 8305.0, 8344.0, 8290.0, 8344.0, 380.64798], [1524220200000, 8343.03, 8540.37, 8340.0, 8488.01, 3084.942867], [1524222000000, 8488.89, 8531.4, 8480.19, 8509.88, 1179.296187], [1524223800000, 8508.0, 8516.58, 8488.88, 8515.01, 682.587739], [1524225600000, 8515.0, 8577.9, 8494.01, 8548.71, 1032.047593], [1524227400000, 8549.98, 8550.0, 8490.0, 8519.62, 1022.127747], [1524229200000, 8519.66, 8532.89, 8487.06, 8487.06, 610.069856], [1524231000000, 8487.06, 8509.69, 8455.04, 8499.0, 921.18295], [1524232800000, 8499.01, 8520.0, 8482.0, 8499.02, 530.660502], [1524234600000, 8499.02, 8509.48, 8475.66, 8498.0, 557.992436], [1524236400000, 8498.0, 8498.02, 8470.0, 8474.0, 546.31393], [1524238200000, 8475.0, 8481.48, 8431.86, 8459.99, 835.354546], [1524240000000, 8458.0, 8509.97, 8446.0, 8502.95, 603.87738], [1524241800000, 8502.95, 8519.94, 8480.0, 8508.0, 479.235153], [1524243600000, 8508.0, 8530.0, 8497.1, 8497.1, 500.770908], [1524245400000, 8497.1, 8515.77, 8488.9, 8505.0, 467.34502], [1524247200000, 8505.0, 8512.99, 8485.0, 8507.97, 403.566791], [1524249000000, 8508.99, 8525.95, 8490.33, 8505.01, 457.608177], [1524250800000, 8505.04, 8528.98, 8505.0, 8523.41, 350.550481], [1524252600000, 8524.0, 8539.63, 8514.53, 8518.0, 459.051507], [1524254400000, 8518.0, 8519.0, 8490.0, 8507.0, 707.244199], [1524256200000, 8507.0, 8529.0, 8500.02, 8525.83, 346.08008], [1524258000000, 8525.85, 8539.0, 8513.2, 8531.0, 460.77226], [1524259800000, 8531.0, 8560.0, 8508.01, 8508.04, 483.295741], [1524261600000, 8508.04, 8768.0, 8508.03, 8728.41, 1687.234413], [1524263400000, 8728.41, 8930.0, 8699.0, 8830.0, 2981.513972], [1524265200000, 8823.5, 8888.0, 8754.0, 8815.0, 1697.334052], [1524267000000, 8816.1, 8864.4, 8780.0, 8856.98, 917.214711], [1524268800000, 8852.12, 8869.23, 8825.01, 8840.04, 963.455191], [1524270600000, 8844.8, 8857.24, 8780.0, 8814.99, 1153.3301], [1524272400000, 8814.99, 8815.0, 8730.0, 8795.0, 1277.8765], [1524274200000, 8792.97, 8821.99, 8760.54, 8820.0, 726.88246], [1524276000000, 8820.0, 8864.56, 8807.02, 8830.98, 687.217845], [1524277800000, 8831.0, 8867.19, 8830.97, 8849.49, 548.603582], [1524279600000, 8849.0, 8928.0, 8845.12, 8878.0, 871.368361], [1524281400000, 8879.65, 8879.65, 8837.53, 8862.0, 492.223336], [1524283200000, 8858.0, 8880.61, 8843.0, 8850.0, 525.464619], [1524285000000, 8852.0, 8866.69, 8839.99, 8849.79, 353.499174], [1524286800000, 8848.39, 8868.0, 8840.0, 8862.27, 309.157506], [1524288600000, 8859.0, 8884.9, 8850.0, 8878.07, 328.960694], [1524290400000, 8878.07, 8935.96, 8867.87, 8898.0, 693.122659], [1524292200000, 8897.03, 8950.0, 8892.0, 8923.0, 625.365539], [1524294000000, 8920.02, 9035.0, 8907.13, 9035.0, 1062.336821], [1524295800000, 9035.0, 9035.0, 8854.2, 8874.88, 1598.658843], [1524297600000, 8874.87, 8888.0, 8761.0, 8797.5, 2026.561907], [1524299400000, 8794.0, 8817.99, 8708.96, 8790.0, 1783.383566], [1524301200000, 8790.92, 8800.0, 8714.02, 8739.97, 1173.947112], [1524303000000, 8739.98, 8757.9, 8630.0, 8705.01, 2481.637024], [1524304800000, 8713.35, 8749.83, 8687.01, 8728.0, 1253.338373], [1524306600000, 8727.99, 8728.98, 8640.44, 8670.0, 1413.856199], [1524308400000, 8672.02, 8684.0, 8565.0, 8589.99, 2144.25216], [1524310200000, 8589.99, 8720.57, 8585.18, 8700.0, 1563.686757], [1524312000000, 8700.01, 8758.5, 8680.0, 8702.92, 1078.073867], [1524313800000, 8702.92, 8765.0, 8702.0, 8755.01, 895.840565], [1524315600000, 8755.0, 8765.0, 8680.5, 8711.58, 722.392692], [1524317400000, 8711.0, 8778.46, 8701.02, 8748.0, 921.630797], [1524319200000, 8748.0, 8791.01, 8737.02, 8759.99, 708.687898], [1524321000000, 8750.21, 8782.83, 8735.99, 8742.55, 541.308499], [1524322800000, 8742.56, 8813.89, 8742.56, 8801.0, 801.033497], [1524324600000, 8801.0, 8846.63, 8795.0, 8828.2, 1112.108067], [1524326400000, 8828.13, 8874.0, 8772.0, 8806.03, 973.552397], [1524328200000, 8806.04, 8817.01, 8737.28, 8755.0, 783.662215], [1524330000000, 8755.0, 8810.16, 8753.18, 8778.0, 503.909795], [1524331800000, 8773.59, 8780.1, 8706.5, 8760.0, 605.148765], [1524333600000, 8760.05, 8778.0, 8730.0, 8766.0, 369.966214], [1524335400000, 8766.0, 8810.0, 8765.0, 8779.97, 472.472673], [1524337200000, 8780.0, 8818.16, 8778.94, 8797.0, 333.360889], [1524339000000, 8796.97, 8800.0, 8760.0, 8792.47, 385.663484], [1524340800000, 8792.47, 8800.01, 8735.0, 8766.0, 408.517018], [1524342600000, 8766.0, 8772.13, 8707.0, 8765.0, 608.217626], [1524344400000, 8765.0, 8799.0, 8740.0, 8797.99, 283.355791], [1524346200000, 8798.0, 8798.0, 8760.0, 8780.01, 274.975026], [1524348000000, 8780.01, 8805.0, 8762.32, 8785.1, 424.745479], [1524349800000, 8785.1, 8834.99, 8770.95, 8806.29, 330.96732], [1524351600000, 8806.35, 8845.0, 8789.57, 8832.99, 336.386586], [1524353400000, 8832.99, 8930.0, 8832.0, 8915.31, 938.066421], [1524355200000, 8915.31, 8915.33, 8850.0, 8857.86, 635.479282], [1524357000000, 8857.85, 8863.0, 8792.0, 8816.54, 576.102048], [1524358800000, 8816.54, 8837.76, 8786.8, 8813.48, 449.113263], [1524360600000, 8813.47, 8840.05, 8800.0, 8815.99, 457.994834], [1524362400000, 8815.99, 8850.0, 8801.01, 8842.38, 339.836452], [1524364200000, 8842.38, 8874.0, 8837.49, 8852.05, 520.402023], [1524366000000, 8854.99, 8872.09, 8842.0, 8853.0, 312.869615], [1524367800000, 8850.01, 8858.39, 8802.5, 8811.0, 360.625823], [1524369600000, 8814.0, 8829.0, 8794.62, 8813.0, 364.247624], [1524371400000, 8817.31, 8851.0, 8810.0, 8843.6, 314.119395], [1524373200000, 8843.6, 8887.96, 8840.13, 8852.58, 363.860393], [1524375000000, 8852.69, 8868.0, 8833.44, 8834.73, 231.887461], [1524376800000, 8834.73, 8883.95, 8834.5, 8870.11, 285.517628], [1524378600000, 8874.43, 8888.0, 8850.78, 8887.07, 394.825354], [1524380400000, 8888.0, 8904.99, 8854.0, 8875.97, 495.213852], [1524382200000, 8875.97, 8878.0, 8845.0, 8875.0, 319.267396], [1524384000000, 8875.0, 8963.0, 8865.0, 8916.99, 889.205254], [1524385800000, 8916.99, 8952.0, 8915.14, 8940.03, 704.613577], [1524387600000, 8940.0, 8979.5, 8885.0, 8910.75, 983.511072], [1524389400000, 8918.0, 8923.45, 8862.22, 8910.0, 552.037561], [1524391200000, 8910.0, 8948.0, 8902.12, 8937.01, 419.464552], [1524393000000, 8938.0, 8949.0, 8921.84, 8942.0, 448.0462], [1524394800000, 8941.0, 8975.0, 8925.0, 8973.0, 696.665483], [1524396600000, 8972.15, 9020.0, 8912.0, 8916.01, 1253.17497], [1524398400000, 8916.01, 8965.82, 8768.79, 8864.99, 2035.297268], [1524400200000, 8864.99, 8883.0, 8830.22, 8853.97, 687.511381], [1524402000000, 8853.97, 8913.31, 8830.0, 8884.99, 578.7541], [1524403800000, 8885.0, 8903.99, 8870.01, 8877.0, 461.717144], [1524405600000, 8877.0, 8939.69, 8874.03, 8933.0, 728.107043], [1524407400000, 8932.54, 8998.0, 8925.0, 8961.9, 1005.657251], [1524409200000, 8967.78, 8984.98, 8928.23, 8968.98, 693.846415], [1524411000000, 8966.0, 8969.0, 8931.0, 8940.67, 507.807905], [1524412800000, 8940.67, 9020.67, 8860.0, 8910.58, 1280.713168], [1524414600000, 8910.58, 8928.09, 8850.0, 8919.95, 939.476256], [1524416400000, 8919.95, 8950.0, 8919.0, 8938.99, 434.807257], [1524418200000, 8939.0, 8974.63, 8920.0, 8940.36, 472.024283], [1524420000000, 8940.36, 8949.0, 8921.02, 8937.49, 362.417602], [1524421800000, 8937.5, 8957.84, 8921.39, 8948.8, 370.992607], [1524423600000, 8948.8, 8948.81, 8860.0, 8917.87, 703.32857], [1524425400000, 8918.0, 8918.01, 8865.0, 8881.0, 571.272523], [1524427200000, 8881.0, 8925.0, 8865.99, 8925.0, 413.31466], [1524429000000, 8920.0, 8925.0, 8873.25, 8898.3, 397.060794], [1524430800000, 8898.3, 8915.0, 8870.0, 8895.0, 361.510773], [1524432600000, 8895.49, 8928.0, 8894.0, 8920.02, 373.56518], [1524434400000, 8926.8, 8926.88, 8820.0, 8849.99, 678.460004], [1524436200000, 8849.99, 8885.45, 8838.08, 8848.18, 346.723608], [1524438000000, 8848.18, 8848.18, 8727.68, 8770.0, 1589.067139], [1524439800000, 8770.0, 8816.94, 8747.63, 8787.02, 1096.739437], [1524441600000, 8785.7, 8830.0, 8745.0, 8817.57, 885.902611], [1524443400000, 8818.0, 8848.73, 8794.83, 8816.99, 473.296646], [1524445200000, 8816.99, 8839.7, 8812.5, 8836.79, 412.937134], [1524447000000, 8835.07, 8888.0, 8787.01, 8853.24, 552.652099], [1524448800000, 8844.24, 8868.5, 8821.83, 8858.31, 590.08873], [1524450600000, 8852.35, 8888.0, 8830.67, 8849.92, 456.96519], [1524452400000, 8849.91, 8878.91, 8847.01, 8872.49, 367.116266], [1524454200000, 8872.49, 8888.0, 8855.5, 8861.52, 374.103001], [1524456000000, 8861.52, 8878.98, 8840.0, 8854.97, 326.852316], [1524457800000, 8854.97, 8864.48, 8821.01, 8857.85, 326.853038], [1524459600000, 8857.84, 8860.46, 8827.66, 8841.0, 275.229312], [1524461400000, 8842.23, 8883.0, 8831.99, 8879.0, 431.825775], [1524463200000, 8878.04, 8879.0, 8853.0, 8870.0, 502.509546], [1524465000000, 8866.0, 8929.0, 8850.0, 8899.0, 899.4041], [1524466800000, 8899.0, 8970.01, 8895.45, 8950.95, 1150.929725], [1524468600000, 8947.42, 8955.0, 8918.31, 8942.39, 678.800566], [1524470400000, 8942.0, 8957.04, 8932.0, 8940.01, 600.783305], [1524472200000, 8940.02, 8949.0, 8892.98, 8900.31, 743.783461], [1524474000000, 8903.0, 8910.0, 8831.0, 8864.2, 1062.337337], [1524475800000, 8865.04, 8914.57, 8864.0, 8905.0, 596.820323], [1524477600000, 8905.0, 8920.0, 8874.71, 8911.79, 636.534711], [1524479400000, 8912.34, 8922.0, 8885.6, 8889.0, 408.74296], [1524481200000, 8889.0, 8899.99, 8877.75, 8888.0, 376.380222], [1524483000000, 8887.98, 8923.0, 8883.02, 8910.02, 500.276902], [1524484800000, 8910.02, 8985.0, 8910.01, 8960.01, 937.036319], [1524486600000, 8969.99, 8970.9, 8897.75, 8940.74, 738.987033], [1524488400000, 8940.0, 8944.9, 8900.0, 8929.19, 427.412812], [1524490200000, 8929.18, 8945.0, 8910.0, 8929.0, 462.397086], [1524492000000, 8934.39, 8940.0, 8895.0, 8900.0, 641.635989], [1524493800000, 8900.0, 8932.69, 8858.08, 8919.0, 834.74201], [1524495600000, 8919.0, 8935.0, 8901.0, 8903.92, 458.255285], [1524497400000, 8903.92, 8916.0, 8888.0, 8898.0, 484.838863], [1524499200000, 8898.0, 8936.0, 8892.02, 8930.0, 487.408671], [1524501000000, 8928.1, 8938.21, 8907.5, 8911.54, 510.180123], [1524502800000, 8912.77, 8917.58, 8861.42, 8878.55, 587.865273], [1524504600000, 8878.55, 8888.3, 8863.48, 8886.0, 398.688759], [1524506400000, 8887.67, 8900.0, 8877.01, 8898.2, 337.6751], [1524508200000, 8896.0, 8915.0, 8890.0, 8893.99, 374.244155], [1524510000000, 8894.0, 8900.0, 8870.0, 8878.0, 448.731356], [1524511800000, 8878.0, 8888.0, 8800.6, 8847.37, 864.576628], [1524513600000, 8847.37, 8880.0, 8825.01, 8868.0, 438.373407], [1524515400000, 8868.0, 8928.0, 8867.01, 8924.11, 478.760411], [1524517200000, 8924.11, 8925.04, 8912.0, 8924.31, 302.143136], [1524519000000, 8924.31, 8926.76, 8903.93, 8922.0, 400.303583], [1524520800000, 8925.8, 8947.64, 8916.48, 8930.0, 569.113647], [1524522600000, 8930.53, 8938.22, 8909.59, 8920.02, 297.137411], [1524524400000, 8924.12, 8931.96, 8890.21, 8899.0, 337.904236], [1524526200000, 8897.84, 8949.98, 8888.0, 8934.01, 388.57814], [1524528000000, 8934.0, 8975.0, 8922.0, 8974.95, 733.826114], [1524529800000, 8973.02, 9219.0, 8972.99, 9169.97, 3231.116337], [1524531600000, 9169.97, 9170.0, 9109.81, 9167.98, 983.304073], [1524533400000, 9167.98, 9194.0, 9124.02, 9186.0, 721.11771], [1524535200000, 9186.01, 9230.15, 9177.0, 9177.01, 1010.777019], [1524537000000, 9183.0, 9200.01, 9150.0, 9189.86, 847.605662], [1524538800000, 9185.01, 9200.0, 9166.0, 9194.98, 576.324446], [1524540600000, 9194.98, 9211.47, 9186.91, 9192.47, 816.455364], [1524542400000, 9192.48, 9229.04, 9190.0, 9220.0, 827.706799], [1524544200000, 9219.99, 9279.98, 9215.0, 9266.3, 958.422273], [1524546000000, 9266.3, 9279.4, 9214.0, 9224.82, 737.024942], [1524547800000, 9222.0, 9300.0, 9220.0, 9271.11, 938.429667], [1524549600000, 9271.14, 9278.81, 9235.01, 9236.0, 573.998328], [1524551400000, 9242.53, 9257.99, 9221.01, 9227.37, 606.925901], [1524553200000, 9235.0, 9243.27, 9177.0, 9225.0, 1064.421816], [1524555000000, 9225.0, 9238.68, 9208.0, 9216.0, 435.437518], [1524556800000, 9217.98, 9263.27, 9216.0, 9254.0, 454.275629], [1524558600000, 9254.0, 9270.0, 9244.0, 9249.99, 402.255735], [1524560400000, 9246.6, 9285.0, 9217.03, 9245.79, 623.640297], [1524562200000, 9250.0, 9285.78, 9243.01, 9285.0, 581.111469], [1524564000000, 9285.0, 9317.0, 9275.0, 9301.65, 1266.559264], [1524565800000, 9301.65, 9349.0, 9280.0, 9292.15, 1071.100373], [1524567600000, 9292.15, 9332.79, 9292.01, 9314.74, 521.452399], [1524569400000, 9314.66, 9317.0, 9273.22, 9294.57, 632.512938], [1524571200000, 9294.59, 9329.8, 9290.0, 9324.87, 687.092864], [1524573000000, 9324.63, 9383.66, 9319.85, 9380.0, 716.65661], [1524574800000, 9376.01, 9385.0, 9327.18, 9380.01, 1017.604961], [1524576600000, 9380.0, 9420.0, 9221.0, 9259.99, 2387.486551], [1524578400000, 9259.99, 9291.0, 9155.0, 9279.0, 2410.820088], [1524580200000, 9280.0, 9331.0, 9270.15, 9289.69, 820.049066], [1524582000000, 9289.69, 9370.0, 9288.21, 9344.01, 727.140976], [1524583800000, 9344.0, 9360.0, 9301.0, 9347.77, 724.336892], [1524585600000, 9347.78, 9380.0, 9330.0, 9345.99, 736.683993], [1524587400000, 9345.99, 9368.8, 9309.0, 9350.19, 750.628991], [1524589200000, 9350.19, 9398.85, 9333.0, 9374.0, 517.096694], [1524591000000, 9374.98, 9415.95, 9370.87, 9409.97, 719.761198], [1524592800000, 9410.0, 9410.0, 9350.0, 9371.01, 711.40307], [1524594600000, 9371.02, 9411.0, 9365.0, 9410.99, 792.596812], [1524596400000, 9410.99, 9414.98, 9293.29, 9383.98, 1282.518164], [1524598200000, 9383.98, 9455.0, 9362.13, 9449.9, 1008.805803], [1524600000000, 9452.0, 9463.0, 9400.04, 9438.0, 759.966734], [1524601800000, 9438.0, 9459.0, 9409.95, 9450.79, 701.924418], [1524603600000, 9450.79, 9495.0, 9439.13, 9466.89, 1085.806761], [1524605400000, 9466.89, 9490.5, 9445.03, 9468.0, 735.408059], [1524607200000, 9469.0, 9559.82, 9463.1, 9550.89, 1319.176833], [1524609000000, 9552.01, 9583.61, 9425.01, 9559.75, 1641.424917], [1524610800000, 9559.75, 9636.47, 9511.0, 9635.05, 1290.03321], [1524612600000, 9635.0, 9731.01, 9589.78, 9619.99, 2108.564368], [1524614400000, 9618.96, 9680.0, 9551.79, 9580.01, 1954.964731], [1524616200000, 9584.96, 9591.05, 9440.0, 9529.94, 2221.752642], [1524618000000, 9529.21, 9593.48, 9466.01, 9590.0, 1124.753486], [1524619800000, 9590.0, 9638.68, 9583.59, 9628.0, 1037.581128], [1524621600000, 9628.0, 9720.0, 9530.0, 9665.99, 1377.245518], [1524623400000, 9665.99, 9759.82, 9659.04, 9687.05, 1548.797152], [1524625200000, 9675.01, 9729.88, 9580.96, 9624.24, 1253.507352], [1524627000000, 9630.0, 9649.99, 9323.02, 9347.99, 3496.750765], [1524628800000, 9349.99, 9500.0, 9323.02, 9363.0, 2766.019992], [1524630600000, 9365.55, 9402.0, 9110.0, 9200.0, 4583.047622], [1524632400000, 9200.22, 9411.0, 9190.0, 9364.26, 3076.824248], [1524634200000, 9364.23, 9396.0, 9303.0, 9370.0, 1394.926421], [1524636000000, 9370.0, 9476.23, 9355.0, 9441.1, 1512.24692], [1524637800000, 9441.1, 9453.56, 9377.0, 9415.06, 796.22783], [1524639600000, 9415.06, 9468.0, 9402.38, 9454.22, 749.132396], [1524641400000, 9450.02, 9460.0, 9322.0, 9416.39, 1057.038668], [1524643200000, 9415.0, 9438.54, 9338.0, 9366.87, 961.140116], [1524645000000, 9370.0, 9409.35, 9251.0, 9281.98, 1101.596362], [1524646800000, 9281.98, 9340.0, 9268.07, 9309.84, 907.394949], [1524648600000, 9309.1, 9310.11, 9200.1, 9272.0, 1525.332468], [1524650400000, 9271.09, 9280.0, 9086.0, 9090.0, 2488.98042], [1524652200000, 9090.0, 9160.1, 8960.0, 9140.68, 4324.782192], [1524654000000, 9140.0, 9154.39, 8980.0, 9012.95, 2236.591857], [1524655800000, 9012.98, 9189.39, 9004.36, 9144.03, 1866.293996], [1524657600000, 9137.0, 9210.21, 9071.0, 9083.54, 2148.932996], [1524659400000, 9088.12, 9205.0, 9086.2, 9129.89, 1124.87151], [1524661200000, 9129.84, 9159.03, 9020.0, 9051.76, 1200.798898], [1524663000000, 9054.98, 9100.0, 8925.8, 9011.78, 2464.57511], [1524664800000, 9011.79, 9042.93, 8840.07, 8845.0, 2889.43989], [1524666600000, 8844.66, 8917.0, 8730.0, 8880.0, 4464.260703], [1524668400000, 8874.33, 8975.0, 8825.0, 8889.0, 2336.027993], [1524670200000, 8882.79, 8975.0, 8854.02, 8972.09, 1548.054059], [1524672000000, 8972.09, 8977.0, 8846.0, 8860.48, 1638.186943], [1524673800000, 8865.22, 8946.0, 8847.0, 8910.0, 958.524198], [1524675600000, 8908.32, 9039.73, 8908.28, 9028.94, 1357.101364], [1524677400000, 9023.81, 9089.0, 8994.98, 9058.0, 1448.052785], [1524679200000, 9055.1, 9063.58, 8968.0, 9017.02, 1058.590166], [1524681000000, 9018.0, 9050.0, 8951.0, 8991.03, 758.05142], [1524682800000, 8991.04, 9025.0, 8966.0, 8969.02, 554.679382], [1524684600000, 8966.11, 9018.49, 8948.05, 8969.98, 755.826534], [1524686400000, 8969.55, 9068.85, 8963.54, 9068.85, 799.983379], [1524688200000, 9068.0, 9116.91, 9061.12, 9083.0, 867.952879], [1524690000000, 9085.16, 9159.9, 9076.01, 9128.01, 929.341987], [1524691800000, 9130.01, 9179.0, 9115.33, 9178.98, 905.381483], [1524693600000, 9178.98, 9185.01, 9062.02, 9099.82, 1245.675898], [1524695400000, 9099.8, 9104.4, 8926.0, 8955.0, 1343.249627], [1524697200000, 8950.0, 9007.6, 8820.0, 8830.01, 1382.669395], [1524699000000, 8831.57, 8889.63, 8770.0, 8869.99, 1566.879759], [1524700800000, 8869.99, 8869.99, 8667.01, 8701.34, 1892.837626], [1524702600000, 8693.55, 8839.0, 8660.0, 8800.02, 1964.876718], [1524704400000, 8808.17, 8860.0, 8720.13, 8850.0, 1078.682717], [1524706200000, 8854.66, 8863.85, 8750.95, 8752.82, 894.143076], [1524708000000, 8755.06, 8857.01, 8751.0, 8842.25, 907.719292], [1524709800000, 8842.25, 8899.0, 8823.0, 8850.15, 729.432148], [1524711600000, 8850.22, 8890.0, 8827.0, 8854.0, 727.435611], [1524713400000, 8853.99, 8859.98, 8763.14, 8808.02, 702.556907], [1524715200000, 8812.7, 8886.92, 8800.0, 8874.49, 797.106477], [1524717000000, 8873.8, 8940.01, 8862.49, 8935.0, 1341.230636], [1524718800000, 8936.0, 8977.0, 8901.46, 8904.93, 1114.071925], [1524720600000, 8904.9, 8937.0, 8874.0, 8916.56, 936.332477], [1524722400000, 8905.88, 8945.34, 8888.88, 8896.98, 622.814308], [1524724200000, 8888.91, 8906.94, 8771.0, 8841.0, 1519.531698], [1524726000000, 8841.04, 8853.5, 8803.0, 8825.33, 709.590244], [1524727800000, 8825.21, 8888.99, 8812.03, 8847.97, 651.465796], [1524729600000, 8847.97, 8887.8, 8701.01, 8750.0, 1295.579071], [1524731400000, 8750.0, 8772.0, 8680.0, 8720.5, 1468.110567], [1524733200000, 8720.58, 8773.0, 8716.01, 8724.87, 860.911334], [1524735000000, 8723.0, 8751.09, 8651.62, 8746.0, 1156.802163], [1524736800000, 8746.0, 8865.0, 8738.14, 8848.39, 862.040963], [1524738600000, 8848.39, 8881.0, 8816.0, 8845.02, 955.646991], [1524740400000, 8844.98, 8917.51, 8819.0, 8847.98, 810.930404], [1524742200000, 8845.04, 8874.6, 8835.01, 8857.01, 608.54356], [1524744000000, 8858.51, 8945.0, 8857.01, 8884.0, 870.377863], [1524745800000, 8880.2, 8925.04, 8871.55, 8900.01, 588.312064], [1524747600000, 8904.78, 8904.93, 8785.0, 8838.7, 825.28894], [1524749400000, 8839.0, 8875.0, 8801.0, 8829.63, 505.659452], [1524751200000, 8828.27, 8885.0, 8764.86, 8769.49, 846.007553], [1524753000000, 8763.99, 8840.0, 8740.01, 8829.99, 907.768516], [1524754800000, 8829.99, 8830.0, 8768.6, 8811.03, 578.771589], [1524756600000, 8811.03, 8832.0, 8782.06, 8806.1, 579.43739], [1524758400000, 8806.1, 8872.99, 8775.89, 8857.28, 795.364992], [1524760200000, 8856.22, 8908.53, 8841.14, 8900.51, 676.121512], [1524762000000, 8899.0, 8925.0, 8860.35, 8871.87, 618.120532], [1524763800000, 8875.0, 8898.92, 8845.03, 8866.43, 503.676119], [1524765600000, 8866.43, 8909.0, 8839.53, 8882.92, 368.423391], [1524767400000, 8882.92, 8893.9, 8834.02, 8845.09, 341.120924], [1524769200000, 8845.1, 8869.99, 8838.35, 8866.0, 368.850372], [1524771000000, 8866.0, 8895.21, 8860.0, 8881.54, 291.514513], [1524772800000, 8880.0, 9138.0, 8880.0, 9096.96, 2017.00098], [1524774600000, 9104.96, 9137.4, 9062.72, 9123.99, 987.793494], [1524776400000, 9123.99, 9168.98, 9090.0, 9167.02, 765.476075], [1524778200000, 9167.02, 9169.9, 9066.02, 9099.0, 899.695226], [1524780000000, 9100.0, 9174.11, 9096.01, 9158.05, 710.808321], [1524781800000, 9156.72, 9235.99, 9131.0, 9221.0, 1256.852296], [1524783600000, 9221.0, 9288.0, 9188.0, 9237.0, 1356.88049], [1524785400000, 9237.0, 9307.48, 9230.01, 9266.0, 1032.588932], [1524787200000, 9267.03, 9297.0, 9215.0, 9247.67, 987.512123], [1524789000000, 9249.01, 9249.5, 9177.0, 9210.32, 821.719749], [1524790800000, 9210.29, 9292.0, 9210.21, 9254.76, 812.568626], [1524792600000, 9250.0, 9270.0, 9214.0, 9249.97, 542.879686], [1524794400000, 9240.0, 9282.0, 9239.64, 9273.5, 614.538417], [1524796200000, 9272.32, 9277.0, 9233.51, 9255.49, 441.857163], [1524798000000, 9255.5, 9258.0, 9213.25, 9227.03, 549.638206], [1524799800000, 9227.03, 9232.06, 9123.25, 9143.01, 1500.394], [1524801600000, 9143.01, 9220.0, 9104.88, 9209.35, 898.783864], [1524803400000, 9209.35, 9235.0, 9175.59, 9204.99, 606.058741], [1524805200000, 9205.0, 9229.59, 9188.0, 9213.0, 399.361368], [1524807000000, 9217.54, 9229.0, 9160.0, 9180.82, 555.837796], [1524808800000, 9184.99, 9262.98, 9176.99, 9230.0, 1029.020932], [1524810600000, 9230.0, 9265.7, 9226.0, 9250.0, 624.645617], [1524812400000, 9249.99, 9250.0, 9188.0, 9188.0, 538.827118], [1524814200000, 9196.0, 9250.0, 9188.0, 9240.97, 468.720086], [1524816000000, 9240.97, 9296.0, 9231.01, 9271.0, 895.476516], [1524817800000, 9274.0, 9274.0, 9230.0, 9260.0, 441.530348], [1524819600000, 9260.0, 9279.88, 9241.2, 9265.0, 369.228775], [1524821400000, 9266.01, 9387.48, 9250.01, 9369.0, 1585.616474], [1524823200000, 9369.0, 9380.0, 9328.05, 9368.99, 815.749284], [1524825000000, 9368.99, 9395.0, 9350.0, 9365.0, 801.006912], [1524826800000, 9363.31, 9367.97, 9290.03, 9345.52, 736.366146], [1524828600000, 9343.0, 9345.54, 9280.59, 9309.0, 594.550677], [1524830400000, 9308.9, 9355.0, 9308.9, 9349.9, 550.69603], [1524832200000, 9349.9, 9350.0, 9253.68, 9290.07, 758.680758], [1524834000000, 9290.01, 9318.62, 9150.1, 9190.01, 1567.98852], [1524835800000, 9190.01, 9250.0, 9155.46, 9225.0, 957.083805], [1524837600000, 9226.97, 9270.36, 9202.0, 9260.15, 600.633881], [1524839400000, 9260.15, 9290.0, 9219.01, 9288.88, 800.424794], [1524841200000, 9280.14, 9288.88, 9210.01, 9235.0, 845.396351], [1524843000000, 9235.14, 9260.0, 9225.0, 9241.21, 514.562819], [1524844800000, 9241.2, 9328.26, 9241.0, 9297.0, 924.009212], [1524846600000, 9296.95, 9300.0, 9269.0, 9282.1, 471.502889], [1524848400000, 9286.01, 9319.99, 9266.0, 9301.33, 513.203372], [1524850200000, 9301.83, 9316.0, 9282.99, 9290.1, 609.02671], [1524852000000, 9290.1, 9296.31, 9225.0, 9244.93, 599.753227], [1524853800000, 9244.94, 9271.76, 9213.8, 9230.89, 402.153915], [1524855600000, 9230.89, 9250.56, 9168.0, 9190.0, 692.787716], [1524857400000, 9189.85, 9210.0, 9075.01, 9089.0, 1404.397724], [1524859200000, 9089.12, 9163.38, 9054.01, 9090.55, 990.072835], [1524861000000, 9090.55, 9098.68, 8940.0, 8970.0, 2093.993273], [1524862800000, 8969.99, 9053.0, 8909.83, 8991.0, 1315.07754], [1524864600000, 8991.0, 9042.09, 8966.44, 8975.35, 596.156114], [1524866400000, 8975.36, 9073.77, 8975.36, 9071.0, 535.045504], [1524868200000, 9071.0, 9093.09, 9030.01, 9031.0, 542.042472], [1524870000000, 9032.0, 9073.93, 9022.0, 9038.0, 405.127313], [1524871800000, 9038.0, 9038.0, 8889.0, 8915.35, 919.641638], [1524873600000, 8915.35, 8987.0, 8870.0, 8976.98, 977.935969], [1524875400000, 8976.99, 9049.76, 8976.04, 9010.11, 776.104351], [1524877200000, 9005.98, 9042.79, 9000.0, 9035.0, 527.583177], [1524879000000, 9036.0, 9126.81, 9025.01, 9126.81, 771.278271], [1524880800000, 9126.81, 9129.17, 9075.19, 9100.33, 810.250653], [1524882600000, 9100.33, 9119.0, 9050.0, 9055.78, 507.385405], [1524884400000, 9053.47, 9146.99, 9051.0, 9112.27, 478.252136], [1524886200000, 9112.0, 9196.32, 9100.0, 9155.0, 610.816533], [1524888000000, 9155.01, 9168.71, 9130.01, 9160.95, 445.38759], [1524889800000, 9160.92, 9165.47, 9111.21, 9138.53, 471.53274], [1524891600000, 9138.54, 9188.5, 9127.64, 9157.1, 521.319676], [1524893400000, 9157.0, 9169.0, 9140.67, 9164.49, 412.705647], [1524895200000, 9164.48, 9200.0, 9160.01, 9184.0, 698.447284], [1524897000000, 9184.01, 9215.66, 9150.67, 9163.03, 650.362491], [1524898800000, 9163.02, 9171.07, 9128.0, 9153.67, 582.617715], [1524900600000, 9153.67, 9154.08, 9108.99, 9126.22, 620.4831], [1524902400000, 9121.05, 9126.21, 9081.02, 9090.0, 627.404051], [1524904200000, 9090.0, 9330.0, 9088.96, 9217.48, 2421.349322], [1524906000000, 9227.49, 9288.0, 9155.06, 9276.13, 1270.903143], [1524907800000, 9270.0, 9300.4, 9224.11, 9273.0, 702.13194], [1524909600000, 9273.0, 9310.0, 9257.8, 9289.96, 427.867426]], "1h": [[1523113200000, 6858.99, 7033.99, 6852.03, 7010.0, 3005.47648], [1523116800000, 7003.98, 7070.0, 6990.11, 7030.0, 2344.519187], [1523120400000, 7034.99, 7041.47, 6976.01, 7004.96, 1521.415594], [1523124000000, 7003.0, 7017.0, 6952.05, 6985.71, 1129.793439], [1523127600000, 6985.73, 6990.9, 6961.0, 6988.99, 824.727294], [1523131200000, 6988.99, 7019.56, 6972.0, 7009.0, 925.207905], [1523134800000, 7009.0, 7009.0, 6950.0, 6975.0, 711.784024], [1523138400000, 6975.0, 6990.0, 6870.0, 6923.99, 1033.018138], [1523142000000, 6923.99, 6938.23, 6850.01, 6895.8, 1076.938301], [1523145600000, 6895.81, 6987.15, 6880.0, 6949.99, 906.510887], [1523149200000, 6950.0, 6980.45, 6892.95, 6930.09, 706.372913], [1523152800000, 6930.09, 6965.0, 6914.11, 6935.01, 626.724303], [1523156400000, 6938.5, 6965.0, 6925.01, 6964.98, 503.986845], [1523160000000, 6960.11, 7010.0, 6943.54, 6971.6, 884.550255], [1523163600000, 6975.97, 7050.0, 6925.73, 6952.0, 960.778642], [1523167200000, 6952.0, 6962.98, 6891.79, 6926.01, 698.245543], [1523170800000, 6926.0, 6957.0, 6921.01, 6939.0, 554.848251], [1523174400000, 6939.0, 6976.99, 6924.3, 6962.98, 620.140668], [1523178000000, 6962.87, 7028.0, 6953.1, 6999.0, 1069.845461], [1523181600000, 6999.0, 7027.02, 6982.66, 6994.15, 1408.881082], [1523185200000, 6996.89, 7100.0, 6976.02, 7099.85, 1708.899908], [1523188800000, 7100.0, 7109.13, 7060.0, 7084.97, 1498.707131], [1523192400000, 7084.98, 7084.99, 7048.0, 7060.01, 723.311013], [1523196000000, 7060.01, 7076.98, 7020.01, 7024.0, 960.935768], [1523199600000, 7024.0, 7075.0, 7019.09, 7049.93, 941.352556], [1523203200000, 7047.01, 7049.93, 6974.75, 6980.0, 1429.852469], [1523206800000, 6980.0, 7014.73, 6937.03, 6999.0, 995.404848], [1523210400000, 6995.02, 7014.86, 6952.0, 6999.99, 947.903875], [1523214000000, 6999.99, 7010.6, 6970.0, 6994.42, 723.260163], [1523217600000, 6989.97, 6997.99, 6945.68, 6947.01, 586.706575], [1523221200000, 6953.0, 6994.0, 6942.84, 6992.0, 582.758567], [1523224800000, 6993.99, 7053.09, 6990.01, 7027.0, 735.784812], [1523228400000, 7026.99, 7030.0, 6992.0, 7018.0, 651.91063], [1523232000000, 7011.04, 7098.17, 7011.02, 7060.0, 1363.163785], [1523235600000, 7062.0, 7139.0, 7057.06, 7120.0, 1388.978625], [1523239200000, 7120.0, 7165.21, 7097.31, 7104.66, 1662.830209], [1523242800000, 7104.66, 7133.99, 7055.0, 7131.85, 1139.434049], [1523246400000, 7131.78, 7160.0, 7093.69, 7139.92, 1218.279629], [1523250000000, 7136.7, 7142.99, 7104.99, 7113.94, 600.282944], [1523253600000, 7115.0, 7132.0, 7084.0, 7120.0, 890.696465], [1523257200000, 7116.16, 7145.0, 7112.0, 7125.0, 771.667829], [1523260800000, 7129.79, 7170.92, 7125.01, 7167.0, 1095.410127], [1523264400000, 7167.0, 7185.0, 7072.0, 7076.0, 1271.385522], [1523268000000, 7076.0, 7083.0, 6765.81, 6782.0, 5230.519345], [1523271600000, 6782.99, 6799.5, 6691.18, 6745.0, 2875.099201], [1523275200000, 6740.0, 6792.0, 6676.5, 6740.0, 2740.809797], [1523278800000, 6739.99, 6764.0, 6714.0, 6730.88, 1197.519479], [1523282400000, 6730.9, 6738.94, 6680.0, 6731.27, 1753.439293], [1523286000000, 6738.0, 6783.0, 6717.01, 6738.98, 1206.030319], [1523289600000, 6738.98, 6759.9, 6720.01, 6754.97, 805.609319], [1523293200000, 6754.99, 6755.0, 6722.56, 6746.0, 637.056342], [1523296800000, 6745.99, 6767.99, 6730.0, 6750.01, 655.05806], [1523300400000, 6750.01, 6758.0, 6650.01, 6672.08, 1487.329225], [1523304000000, 6677.04, 6685.79, 6611.0, 6671.09, 1597.536728], [1523307600000, 6671.97, 6741.62, 6671.09, 6723.67, 916.721946], [1523311200000, 6723.67, 6723.67, 6683.03, 6693.0, 646.100289], [1523314800000, 6694.34, 6795.0, 6692.86, 6782.72, 927.338679], [1523318400000, 6781.55, 6790.0, 6747.93, 6765.61, 667.332214], [1523322000000, 6768.99, 6769.0, 6706.02, 6740.11, 673.314234], [1523325600000, 6740.05, 6776.0, 6735.03, 6750.17, 752.711492], [1523329200000, 6750.17, 6809.55, 6745.0, 6805.63, 919.206413], [1523332800000, 6808.68, 6820.0, 6758.12, 6778.0, 851.908382], [1523336400000, 6778.0, 6786.54, 6724.68, 6759.92, 1175.998992], [1523340000000, 6759.93, 6774.71, 6670.25, 6696.0, 1247.831577], [1523343600000, 6692.16, 6737.87, 6680.0, 6715.51, 847.062947], [1523347200000, 6717.32, 6736.0, 6656.0, 6733.11, 1040.156479], [1523350800000, 6731.56, 6785.0, 6721.0, 6785.0, 826.799542], [1523354400000, 6773.93, 6788.62, 6711.8, 6730.02, 1021.474152], [1523358000000, 6731.0, 6749.5, 6702.0, 6735.0, 784.538424], [1523361600000, 6735.0, 6762.46, 6719.91, 6758.0, 747.035625], [1523365200000, 6755.01, 6772.99, 6743.0, 6761.99, 757.705148], [1523368800000, 6761.99, 6771.99, 6733.0, 6765.0, 760.892064], [1523372400000, 6765.0, 6870.99, 6761.0, 6837.54, 2259.94097], [1523376000000, 6835.65, 6851.0, 6809.6, 6837.87, 884.880193], [1523379600000, 6837.9, 6870.0, 6831.0, 6867.48, 1032.216631], [1523383200000, 6867.49, 6874.0, 6833.01, 6853.0, 955.896836], [1523386800000, 6853.0, 6855.0, 6825.0, 6844.93, 681.343464], [1523390400000, 6844.93, 6847.85, 6805.52, 6847.03, 672.311545], [1523394000000, 6845.18, 6865.0, 6833.01, 6860.0, 623.040718], [1523397600000, 6860.0, 6890.0, 6768.01, 6792.6, 1354.337253], [1523401200000, 6792.46, 6845.0, 6770.0, 6843.9, 788.7928], [1523404800000, 6839.56, 6872.71, 6827.69, 6860.2, 981.781876], [1523408400000, 6860.2, 6866.98, 6830.0, 6840.0, 870.945759], [1523412000000, 6840.0, 6860.3, 6835.0, 6847.99, 732.717347], [1523415600000, 6847.99, 6848.0, 6800.0, 6818.79, 793.986444], [1523419200000, 6818.79, 6840.03, 6806.44, 6830.86, 600.591341], [1523422800000, 6830.86, 6867.4, 6813.0, 6817.71, 855.590766], [1523426400000, 6817.71, 6846.02, 6787.0, 6833.07, 961.126866], [1523430000000, 6833.08, 6848.0, 6818.96, 6846.89, 714.40139], [1523433600000, 6846.89, 6864.7, 6830.51, 6857.93, 800.426308], [1523437200000, 6857.93, 6869.34, 6834.02, 6854.12, 1039.476022], [1523440800000, 6856.99, 6857.97, 6820.0, 6820.03, 945.837526], [1523444400000, 6820.2, 6857.92, 6800.0, 6851.97, 958.292198], [1523448000000, 6851.53, 6864.0, 6840.0, 6855.0, 546.166809], [1523451600000, 6855.0, 6990.0, 6849.29, 6944.89, 2465.107686], [1523455200000, 6944.89, 6968.02, 6931.0, 6934.99, 1167.952827], [1523458800000, 6932.48, 6950.0, 6901.0, 6927.06, 1308.729602], [1523462400000, 6927.06, 6936.0, 6889.42, 6914.0, 1504.051228], [1523466000000, 6913.98, 6923.0, 6862.6, 6904.99, 1127.728797], [1523469600000, 6904.99, 6913.34, 6890.03, 6899.75, 915.774738], [1523473200000, 6899.75, 6927.48, 6892.11, 6910.63, 880.98351], [1523476800000, 6914.97, 6926.95, 6881.97, 6888.0, 945.038675], [1523480400000, 6886.0, 6910.0, 6878.14, 6909.0, 572.63209], [1523484000000, 6908.53, 6934.97, 6904.61, 6931.0, 741.951888], [1523487600000, 6931.05, 6987.41, 6931.0, 6953.79, 1566.579484], [1523491200000, 6953.78, 6975.0, 6918.0, 6931.0, 1243.306301], [1523494800000, 6933.49, 6949.9, 6885.0, 6939.99, 1073.859867], [1523498400000, 6939.98, 6972.24, 6930.0, 6964.0, 869.221662], [1523502000000, 6965.0, 6980.0, 6936.92, 6965.2, 1177.90424], [1523505600000, 6965.21, 6980.0, 6935.0, 6979.0, 914.324267], [1523509200000, 6979.89, 6985.0, 6928.0, 6940.0, 892.335545], [1523512800000, 6940.01, 6967.02, 6765.0, 6776.4, 2351.039564], [1523516400000, 6767.17, 6850.85, 6743.2, 6826.61, 2888.081595], [1523520000000, 6826.62, 6860.01, 6802.7, 6843.0, 1179.407555], [1523523600000, 6842.99, 6865.71, 6818.8, 6850.99, 1305.530371], [1523527200000, 6850.99, 6951.89, 6840.01, 6935.1, 1270.913537], [1523530800000, 6935.11, 8012.23, 6935.02, 7690.0, 16480.893133], [1523534400000, 7685.55, 7780.0, 7569.83, 7686.93, 7501.3181], [1523538000000, 7686.93, 7739.8, 7627.0, 7683.18, 3525.785109], [1523541600000, 7683.18, 7735.94, 7577.0, 7644.0, 2964.576258], [1523545200000, 7644.0, 7650.0, 7582.31, 7614.21, 2132.633589], [1523548800000, 7618.0, 7625.0, 7542.0, 7619.0, 2314.600659], [1523552400000, 7619.0, 7775.0, 7607.36, 7688.0, 3034.18377], [1523556000000, 7688.0, 7709.95, 7642.01, 7689.89, 1373.067622], [1523559600000, 7688.67, 7768.0, 7680.0, 7700.0, 1525.62255], [1523563200000, 7699.97, 7778.0, 7694.05, 7738.01, 1201.266469], [1523566800000, 7739.0, 7945.0, 7720.0, 7851.0, 2833.551877], [1523570400000, 7853.0, 7890.3, 7716.19, 7890.0, 2272.454868], [1523574000000, 7890.0, 7986.1, 7851.2, 7923.0, 2535.717479], [1523577600000, 7922.99, 7994.96, 7790.0, 7900.94, 2952.467445], [1523581200000, 7900.0, 7909.0, 7732.0, 7793.22, 1828.480039], [1523584800000, 7793.22, 7916.87, 7791.68, 7895.0, 1847.895341], [1523588400000, 7895.0, 7932.0, 7832.78, 7832.99, 1279.583952], [1523592000000, 7832.99, 7846.62, 7790.87, 7827.41, 1304.156512], [1523595600000, 7827.4, 7835.0, 7751.0, 7783.4, 1762.821999], [1523599200000, 7788.96, 7880.51, 7779.99, 7829.73, 1374.443259], [1523602800000, 7825.34, 8195.84, 7820.97, 8093.01, 4044.292119], [1523606400000, 8100.0, 8160.0, 8033.0, 8133.01, 3666.960491], [1523610000000, 8133.0, 8170.0, 8055.0, 8066.96, 2747.847378], [1523613600000, 8066.96, 8108.0, 8005.0, 8062.09, 1960.716606], [1523617200000, 8062.01, 8141.0, 8052.54, 8091.0, 2253.011444], [1523620800000, 8091.4, 8233.39, 8088.0, 8193.49, 2379.429674], [1523624400000, 8194.0, 8220.67, 8020.0, 8096.0, 3672.936807], [1523628000000, 8096.51, 8124.63, 8013.27, 8099.0, 2548.197969], [1523631600000, 8100.0, 8133.0, 8068.46, 8125.0, 1717.723765], [1523635200000, 8125.41, 8157.0, 8083.99, 8130.0, 1427.46751], [1523638800000, 8132.41, 8168.0, 8060.0, 8114.79, 1737.613203], [1523642400000, 8115.0, 8124.49, 8079.0, 8117.84, 997.858936], [1523646000000, 8117.93, 8130.0, 8050.0, 8094.0, 1177.280019], [1523649600000, 8093.82, 8109.9, 7822.0, 7885.0, 4581.051377], [1523653200000, 7885.0, 7903.58, 7801.0, 7859.74, 2463.312841], [1523656800000, 7864.57, 7899.0, 7768.47, 7899.0, 3082.77873], [1523660400000, 7895.39, 7967.26, 7844.42, 7877.41, 2236.195732], [1523664000000, 7877.48, 7924.92, 7810.0, 7910.21, 1653.490851], [1523667600000, 7910.21, 8095.0, 7900.0, 8065.24, 2257.047709], [1523671200000, 8069.43, 8090.0, 8002.95, 8033.59, 1168.32637], [1523674800000, 8033.58, 8060.0, 8000.01, 8044.66, 1156.242601], [1523678400000, 8044.67, 8046.76, 7935.15, 7960.01, 1485.866664], [1523682000000, 7960.01, 8025.13, 7949.07, 7957.36, 951.323272], [1523685600000, 7963.99, 8023.28, 7955.0, 8018.0, 1208.709985], [1523689200000, 8019.88, 8186.0, 7986.13, 8127.74, 2141.855686], [1523692800000, 8129.99, 8175.0, 8071.01, 8100.07, 1387.233793], [1523696400000, 8100.12, 8119.98, 7992.9, 8040.0, 1521.763989], [1523700000000, 8035.22, 8065.9, 7915.0, 7936.34, 1579.093608], [1523703600000, 7940.0, 8015.0, 7920.81, 7965.32, 1210.707371], [1523707200000, 7965.0, 7987.83, 7849.46, 7878.0, 2182.206587], [1523710800000, 7878.0, 7970.0, 7867.11, 7965.18, 1744.497946], [1523714400000, 7964.0, 7978.51, 7905.63, 7975.01, 1263.320851], [1523718000000, 7975.08, 7993.99, 7945.24, 7955.01, 1157.646084], [1523721600000, 7955.02, 8010.0, 7917.0, 8000.0, 1334.045357], [1523725200000, 8004.28, 8004.28, 7936.02, 7972.55, 921.796593], [1523728800000, 7972.55, 8046.63, 7943.4, 8028.0, 873.547199], [1523732400000, 8028.0, 8045.0, 7978.0, 8022.0, 739.230361], [1523736000000, 8022.0, 8087.0, 8000.0, 8077.96, 912.786002], [1523739600000, 8077.96, 8090.23, 8030.0, 8058.47, 750.319398], [1523743200000, 8058.48, 8084.0, 8045.01, 8060.22, 800.955196], [1523746800000, 8060.14, 8063.99, 7941.0, 7999.01, 1219.272884], [1523750400000, 8004.0, 8133.0, 7999.02, 8067.87, 1819.446928], [1523754000000, 8067.86, 8131.0, 8037.94, 8113.02, 993.093294], [1523757600000, 8113.2, 8130.0, 8071.51, 8095.03, 899.678729], [1523761200000, 8097.55, 8105.37, 8059.47, 8083.99, 583.279814], [1523764800000, 8084.0, 8150.0, 8081.0, 8116.0, 957.949642], [1523768400000, 8116.14, 8130.0, 8050.0, 8128.0, 813.634143], [1523772000000, 8127.02, 8130.0, 8081.0, 8111.15, 820.075395], [1523775600000, 8118.84, 8120.86, 8066.39, 8074.99, 655.760082], [1523779200000, 8074.91, 8154.0, 8072.1, 8130.0, 964.224205], [1523782800000, 8135.88, 8142.64, 8080.1, 8116.23, 712.282161], [1523786400000, 8118.0, 8130.61, 8110.69, 8117.29, 713.669071], [1523790000000, 8120.8, 8429.54, 8117.29, 8330.0, 5015.535725], [1523793600000, 8330.0, 8359.76, 8286.0, 8350.53, 1773.940982], [1523797200000, 8350.53, 8380.0, 8330.0, 8353.0, 1363.76114], [1523800800000, 8352.01, 8375.96, 8316.0, 8337.71, 1175.696938], [1523804400000, 8337.71, 8337.72, 8230.0, 8269.99, 1991.412603], [1523808000000, 8269.0, 8349.0, 8254.95, 8261.0, 1109.920302], [1523811600000, 8269.48, 8321.9, 8258.59, 8300.0, 986.703397], [1523815200000, 8296.01, 8334.21, 8280.0, 8321.02, 763.765289], [1523818800000, 8321.5, 8326.63, 8272.57, 8300.01, 754.200027], [1523822400000, 8305.55, 8326.0, 8280.0, 8293.0, 723.748962], [1523826000000, 8293.0, 8308.0, 8287.1, 8295.99, 622.991453], [1523829600000, 8295.99, 8364.81, 8277.57, 8350.0, 900.678625], [1523833200000, 8350.0, 8365.87, 8306.52, 8355.0, 831.271537], [1523836800000, 8355.07, 8419.0, 8320.0, 8389.0, 1573.817624], [1523840400000, 8390.0, 8412.32, 8318.42, 8321.37, 1238.445147], [1523844000000, 8325.0, 8348.0, 8076.19, 8119.0, 3980.258847], [1523847600000, 8119.0, 8174.0, 8095.0, 8146.9, 1716.630587], [1523851200000, 8144.73, 8151.0, 8101.0, 8127.99, 1002.914555], [1523854800000, 8127.99, 8131.97, 8000.0, 8036.43, 2892.075103], [1523858400000, 8035.0, 8110.1, 8020.0, 8089.87, 1747.847386], [1523862000000, 8090.03, 8130.47, 8064.61, 8110.0, 1108.441562], [1523865600000, 8110.21, 8138.53, 8077.89, 8131.0, 913.656041], [1523869200000, 8129.23, 8134.99, 8030.0, 8096.83, 1583.756015], [1523872800000, 8096.83, 8119.85, 8048.0, 8074.44, 1234.646916], [1523876400000, 8074.44, 8097.28, 8016.33, 8086.0, 1084.080434], [1523880000000, 8086.0, 8087.11, 7888.0, 7935.37, 3380.810566], [1523883600000, 7930.06, 7965.0, 7867.0, 7964.34, 2704.86384], [1523887200000, 7964.34, 7999.0, 7907.0, 7973.98, 1401.78959], [1523890800000, 7973.98, 7999.0, 7950.0, 7971.99, 1098.630542], [1523894400000, 7971.98, 7974.94, 7924.65, 7957.07, 919.449382], [1523898000000, 7957.85, 8056.0, 7953.0, 8031.02, 1472.482132], [1523901600000, 8031.02, 8040.76, 7994.41, 8020.0, 1092.479066], [1523905200000, 8020.0, 8050.0, 7953.0, 7983.99, 1187.723513], [1523908800000, 7983.97, 8000.0, 7935.99, 7975.02, 741.748696], [1523912400000, 7973.9, 8036.5, 7973.9, 8018.98, 890.967686], [1523916000000, 8015.0, 8025.6, 7969.0, 8017.0, 727.009992], [1523919600000, 8018.0, 8086.01, 8014.2, 8064.92, 969.544493], [1523923200000, 8064.92, 8083.61, 8014.08, 8054.97, 916.981386], [1523926800000, 8052.56, 8075.0, 8015.0, 8041.0, 994.800426], [1523930400000, 8041.99, 8049.48, 7956.17, 8034.36, 1226.449185], [1523934000000, 8040.0, 8055.93, 8018.15, 8045.78, 896.132918], [1523937600000, 8049.9, 8049.9, 7993.0, 8030.0, 943.571685], [1523941200000, 8030.0, 8036.8, 7975.01, 7983.0, 1009.18411], [1523944800000, 7975.01, 8045.46, 7960.0, 8025.01, 1134.286385], [1523948400000, 8026.02, 8172.76, 8025.0, 8138.45, 1984.300465], [1523952000000, 8143.72, 8172.0, 8125.2, 8131.6, 1376.983721], [1523955600000, 8134.0, 8173.7, 8131.6, 8144.41, 1448.248194], [1523959200000, 8144.41, 8155.0, 8064.52, 8087.3, 1695.688255], [1523962800000, 8087.3, 8127.33, 8085.0, 8124.87, 905.419198], [1523966400000, 8124.87, 8156.0, 8090.23, 8105.13, 1400.959391], [1523970000000, 8105.13, 8125.0, 8051.0, 8100.0, 1076.557051], [1523973600000, 8100.0, 8133.38, 8080.0, 8114.98, 1577.415087], [1523977200000, 8114.98, 8117.0, 8070.0, 8088.63, 949.857843], [1523980800000, 8088.63, 8134.0, 8086.2, 8120.01, 1159.515032], [1523984400000, 8120.01, 8128.99, 8084.97, 8105.0, 761.516255], [1523988000000, 8104.47, 8106.6, 7912.08, 7945.17, 1979.357172], [1523991600000, 7941.97, 7947.0, 7836.4, 7874.01, 3212.402814], [1523995200000, 7874.0, 7951.49, 7825.4, 7920.69, 1867.962093], [1523998800000, 7920.69, 7945.73, 7901.0, 7915.96, 1266.55941], [1524002400000, 7915.97, 7926.88, 7873.0, 7917.43, 1368.487872], [1524006000000, 7917.43, 7923.03, 7860.0, 7885.02, 999.967619], [1524009600000, 7890.96, 7935.57, 7868.07, 7926.32, 806.838937], [1524013200000, 7926.0, 7979.0, 7920.01, 7952.42, 811.950674], [1524016800000, 7952.42, 7966.54, 7901.3, 7911.99, 772.01177], [1524020400000, 7905.69, 7949.82, 7905.69, 7947.71, 504.846999], [1524024000000, 7947.74, 7949.0, 7915.0, 7915.1, 717.247921], [1524027600000, 7915.1, 7949.99, 7907.05, 7928.99, 662.562781], [1524031200000, 7925.83, 8139.0, 7868.0, 8125.0, 2524.866454], [1524034800000, 8123.89, 8149.89, 8085.03, 8107.23, 1799.138889], [1524038400000, 8113.51, 8118.0, 8071.0, 8086.0, 1177.170187], [1524042000000, 8082.56, 8110.0, 8074.67, 8092.01, 919.011309], [1524045600000, 8092.02, 8120.0, 8077.08, 8095.01, 1018.129786], [1524049200000, 8095.0, 8110.0, 8067.02, 8103.0, 817.512167], [1524052800000, 8104.0, 8117.81, 8080.09, 8095.04, 722.689671], [1524056400000, 8095.03, 8114.0, 8075.06, 8095.89, 907.238051], [1524060000000, 8098.45, 8100.0, 7937.6, 7970.91, 1347.230173], [1524063600000, 7962.27, 8036.65, 7931.01, 7994.0, 1733.374868], [1524067200000, 7994.0, 8149.78, 7985.01, 8111.01, 1509.485167], [1524070800000, 8113.93, 8128.5, 8078.01, 8099.0, 1142.93488], [1524074400000, 8098.79, 8124.0, 8090.65, 8109.0, 881.322984], [1524078000000, 8109.0, 8126.79, 8095.0, 8116.65, 910.73602], [1524081600000, 8116.01, 8236.43, 8097.0, 8197.98, 2051.944763], [1524085200000, 8187.02, 8202.0, 8174.05, 8199.0, 806.060624], [1524088800000, 8199.0, 8220.1, 8105.0, 8155.01, 1500.99631], [1524092400000, 8156.5, 8186.59, 8141.01, 8173.0, 923.743185], [1524096000000, 8173.99, 8180.0, 8100.0, 8154.0, 1042.62032], [1524099600000, 8158.0, 8210.0, 8137.0, 8188.88, 1599.76514], [1524103200000, 8188.88, 8290.0, 8150.0, 8220.01, 1654.131073], [1524106800000, 8220.01, 8220.01, 8156.0, 8185.0, 1042.248024], [1524110400000, 8184.99, 8187.0, 8120.0, 8183.0, 1378.086117], [1524114000000, 8183.0, 8198.0, 8145.68, 8180.0, 1037.622209], [1524117600000, 8180.0, 8215.45, 8163.24, 8184.9, 922.276307], [1524121200000, 8184.9, 8249.0, 8080.0, 8166.97, 1709.494365], [1524124800000, 8166.97, 8239.99, 8150.52, 8177.98, 1158.920067], [1524128400000, 8175.82, 8240.0, 8143.02, 8230.89, 1393.015517], [1524132000000, 8231.0, 8250.0, 8202.83, 8240.63, 1307.559468], [1524135600000, 8240.64, 8259.0, 8191.47, 8207.01, 1025.079834], [1524139200000, 8207.0, 8248.5, 8181.7, 8237.68, 1073.409534], [1524142800000, 8235.33, 8248.49, 8218.0, 8234.84, 862.749548], [1524146400000, 8236.0, 8270.0, 8171.56, 8229.97, 1456.860324], [1524150000000, 8229.0, 8239.9, 8214.0, 8239.02, 776.10664], [1524153600000, 8235.45, 8288.37, 8230.01, 8244.99, 1437.589364], [1524157200000, 8244.66, 8296.0, 8236.0, 8259.08, 1144.154439], [1524160800000, 8257.61, 8290.0, 8245.02, 8274.57, 799.1657], [1524164400000, 8274.57, 8277.0, 8233.1, 8249.95, 796.843972], [1524168000000, 8249.95, 8250.01, 8189.0, 8226.7, 1148.577768], [1524171600000, 8226.69, 8280.0, 8222.0, 8272.28, 802.655075], [1524175200000, 8272.28, 8292.0, 8250.0, 8253.0, 876.254021], [1524178800000, 8259.93, 8294.99, 8230.0, 8278.0, 668.662638], [1524182400000, 8273.84, 8375.0, 8270.32, 8350.56, 1893.146913], [1524186000000, 8350.55, 8368.0, 8312.29, 8360.0, 1076.317439], [1524189600000, 8359.99, 8398.0, 8282.2, 8324.89, 1976.376443], [1524193200000, 8324.89, 8355.04, 8320.0, 8331.03, 757.535063], [1524196800000, 8331.3, 8336.38, 8222.55, 8240.99, 3077.033014], [1524200400000, 8240.99, 8300.0, 8177.09, 8272.99, 1776.667619], [1524204000000, 8272.99, 8321.19, 8253.0, 8309.89, 1323.818864], [1524207600000, 8309.89, 8348.98, 8293.49, 8319.97, 1294.266648], [1524211200000, 8319.92, 8349.01, 8281.0, 8294.1, 1338.841325], [1524214800000, 8294.18, 8323.96, 8267.01, 8308.87, 895.414979], [1524218400000, 8305.0, 8540.37, 8290.0, 8488.01, 3465.590847], [1524222000000, 8488.89, 8531.4, 8480.19, 8515.01, 1861.883926], [1524225600000, 8515.0, 8577.9, 8490.0, 8519.62, 2054.17534], [1524229200000, 8519.66, 8532.89, 8455.04, 8499.0, 1531.252806], [1524232800000, 8499.01, 8520.0, 8475.66, 8498.0, 1088.652938], [1524236400000, 8498.0, 8498.02, 8431.86, 8459.99, 1381.668476], [1524240000000, 8458.0, 8519.94, 8446.0, 8508.0, 1083.112533], [1524243600000, 8508.0, 8530.0, 8488.9, 8505.0, 968.115928], [1524247200000, 8505.0, 8525.95, 8485.0, 8505.01, 861.174968], [1524250800000, 8505.04, 8539.63, 8505.0, 8518.0, 809.601988], [1524254400000, 8518.0, 8529.0, 8490.0, 8525.83, 1053.324279], [1524258000000, 8525.85, 8560.0, 8508.01, 8508.04, 944.068001], [1524261600000, 8508.04, 8930.0, 8508.03, 8830.0, 4668.748385], [1524265200000, 8823.5, 8888.0, 8754.0, 8856.98, 2614.548763], [1524268800000, 8852.12, 8869.23, 8780.0, 8814.99, 2116.785291], [1524272400000, 8814.99, 8821.99, 8730.0, 8820.0, 2004.75896], [1524276000000, 8820.0, 8867.19, 8807.02, 8849.49, 1235.821427], [1524279600000, 8849.0, 8928.0, 8837.53, 8862.0, 1363.591697], [1524283200000, 8858.0, 8880.61, 8839.99, 8849.79, 878.963793], [1524286800000, 8848.39, 8884.9, 8840.0, 8878.07, 638.1182], [1524290400000, 8878.07, 8950.0, 8867.87, 8923.0, 1318.488198], [1524294000000, 8920.02, 9035.0, 8854.2, 8874.88, 2660.995664], [1524297600000, 8874.87, 8888.0, 8708.96, 8790.0, 3809.945473], [1524301200000, 8790.92, 8800.0, 8630.0, 8705.01, 3655.584136], [1524304800000, 8713.35, 8749.83, 8640.44, 8670.0, 2667.194572], [1524308400000, 8672.02, 8720.57, 8565.0, 8700.0, 3707.938917], [1524312000000, 8700.01, 8765.0, 8680.0, 8755.01, 1973.914432], [1524315600000, 8755.0, 8778.46, 8680.5, 8748.0, 1644.023489], [1524319200000, 8748.0, 8791.01, 8735.99, 8742.55, 1249.996397], [1524322800000, 8742.56, 8846.63, 8742.56, 8828.2, 1913.141564], [1524326400000, 8828.13, 8874.0, 8737.28, 8755.0, 1757.214612], [1524330000000, 8755.0, 8810.16, 8706.5, 8760.0, 1109.05856], [1524333600000, 8760.05, 8810.0, 8730.0, 8779.97, 842.438887], [1524337200000, 8780.0, 8818.16, 8760.0, 8792.47, 719.024373], [1524340800000, 8792.47, 8800.01, 8707.0, 8765.0, 1016.734644], [1524344400000, 8765.0, 8799.0, 8740.0, 8780.01, 558.330817], [1524348000000, 8780.01, 8834.99, 8762.32, 8806.29, 755.712799], [1524351600000, 8806.35, 8930.0, 8789.57, 8915.31, 1274.453007], [1524355200000, 8915.31, 8915.33, 8792.0, 8816.54, 1211.58133], [1524358800000, 8816.54, 8840.05, 8786.8, 8815.99, 907.108097], [1524362400000, 8815.99, 8874.0, 8801.01, 8852.05, 860.238475], [1524366000000, 8854.99, 8872.09, 8802.5, 8811.0, 673.495438], [1524369600000, 8814.0, 8851.0, 8794.62, 8843.6, 678.367019], [1524373200000, 8843.6, 8887.96, 8833.44, 8834.73, 595.747854], [1524376800000, 8834.73, 8888.0, 8834.5, 8887.07, 680.342982], [1524380400000, 8888.0, 8904.99, 8845.0, 8875.0, 814.481248], [1524384000000, 8875.0, 8963.0, 8865.0, 8940.03, 1593.818831], [1524387600000, 8940.0, 8979.5, 8862.22, 8910.0, 1535.548633], [1524391200000, 8910.0, 8949.0, 8902.12, 8942.0, 867.510752], [1524394800000, 8941.0, 9020.0, 8912.0, 8916.01, 1949.840453], [1524398400000, 8916.01, 8965.82, 8768.79, 8853.97, 2722.808649], [1524402000000, 8853.97, 8913.31, 8830.0, 8877.0, 1040.471244], [1524405600000, 8877.0, 8998.0, 8874.03, 8961.9, 1733.764294], [1524409200000, 8967.78, 8984.98, 8928.23, 8940.67, 1201.65432], [1524412800000, 8940.67, 9020.67, 8850.0, 8919.95, 2220.189424], [1524416400000, 8919.95, 8974.63, 8919.0, 8940.36, 906.83154], [1524420000000, 8940.36, 8957.84, 8921.02, 8948.8, 733.410209], [1524423600000, 8948.8, 8948.81, 8860.0, 8881.0, 1274.601093], [1524427200000, 8881.0, 8925.0, 8865.99, 8898.3, 810.375454], [1524430800000, 8898.3, 8928.0, 8870.0, 8920.02, 735.075953], [1524434400000, 8926.8, 8926.88, 8820.0, 8848.18, 1025.183612], [1524438000000, 8848.18, 8848.18, 8727.68, 8787.02, 2685.806576], [1524441600000, 8785.7, 8848.73, 8745.0, 8816.99, 1359.199257], [1524445200000, 8816.99, 8888.0, 8787.01, 8853.24, 965.589233], [1524448800000, 8844.24, 8888.0, 8821.83, 8849.92, 1047.05392], [1524452400000, 8849.91, 8888.0, 8847.01, 8861.52, 741.219267], [1524456000000, 8861.52, 8878.98, 8821.01, 8857.85, 653.705354], [1524459600000, 8857.84, 8883.0, 8827.66, 8879.0, 707.055087], [1524463200000, 8878.04, 8929.0, 8850.0, 8899.0, 1401.913646], [1524466800000, 8899.0, 8970.01, 8895.45, 8942.39, 1829.730291], [1524470400000, 8942.0, 8957.04, 8892.98, 8900.31, 1344.566766], [1524474000000, 8903.0, 8914.57, 8831.0, 8905.0, 1659.15766], [1524477600000, 8905.0, 8922.0, 8874.71, 8889.0, 1045.277671], [1524481200000, 8889.0, 8923.0, 8877.75, 8910.02, 876.657124], [1524484800000, 8910.02, 8985.0, 8897.75, 8940.74, 1676.023352], [1524488400000, 8940.0, 8945.0, 8900.0, 8929.0, 889.809898], [1524492000000, 8934.39, 8940.0, 8858.08, 8919.0, 1476.377999], [1524495600000, 8919.0, 8935.0, 8888.0, 8898.0, 943.094148], [1524499200000, 8898.0, 8938.21, 8892.02, 8911.54, 997.588794], [1524502800000, 8912.77, 8917.58, 8861.42, 8886.0, 986.554032], [1524506400000, 8887.67, 8915.0, 8877.01, 8893.99, 711.919255], [1524510000000, 8894.0, 8900.0, 8800.6, 8847.37, 1313.307984], [1524513600000, 8847.37, 8928.0, 8825.01, 8924.11, 917.133818], [1524517200000, 8924.11, 8926.76, 8903.93, 8922.0, 702.446719], [1524520800000, 8925.8, 8947.64, 8909.59, 8920.02, 866.251058], [1524524400000, 8924.12, 8949.98, 8888.0, 8934.01, 726.482376], [1524528000000, 8934.0, 9219.0, 8922.0, 9169.97, 3964.942451], [1524531600000, 9169.97, 9194.0, 9109.81, 9186.0, 1704.421783], [1524535200000, 9186.01, 9230.15, 9150.0, 9189.86, 1858.382681], [1524538800000, 9185.01, 9211.47, 9166.0, 9192.47, 1392.77981], [1524542400000, 9192.48, 9279.98, 9190.0, 9266.3, 1786.129072], [1524546000000, 9266.3, 9300.0, 9214.0, 9271.11, 1675.454609], [1524549600000, 9271.14, 9278.81, 9221.01, 9227.37, 1180.924229], [1524553200000, 9235.0, 9243.27, 9177.0, 9216.0, 1499.859334], [1524556800000, 9217.98, 9270.0, 9216.0, 9249.99, 856.531364], [1524560400000, 9246.6, 9285.78, 9217.03, 9285.0, 1204.751766], [1524564000000, 9285.0, 9349.0, 9275.0, 9292.15, 2337.659637], [1524567600000, 9292.15, 9332.79, 9273.22, 9294.57, 1153.965337], [1524571200000, 9294.59, 9383.66, 9290.0, 9380.0, 1403.749474], [1524574800000, 9376.01, 9420.0, 9221.0, 9259.99, 3405.091512], [1524578400000, 9259.99, 9331.0, 9155.0, 9289.69, 3230.869154], [1524582000000, 9289.69, 9370.0, 9288.21, 9347.77, 1451.477868], [1524585600000, 9347.78, 9380.0, 9309.0, 9350.19, 1487.312984], [1524589200000, 9350.19, 9415.95, 9333.0, 9409.97, 1236.857892], [1524592800000, 9410.0, 9411.0, 9350.0, 9410.99, 1503.999882], [1524596400000, 9410.99, 9455.0, 9293.29, 9449.9, 2291.323967], [1524600000000, 9452.0, 9463.0, 9400.04, 9450.79, 1461.891152], [1524603600000, 9450.79, 9495.0, 9439.13, 9468.0, 1821.21482], [1524607200000, 9469.0, 9583.61, 9425.01, 9559.75, 2960.60175], [1524610800000, 9559.75, 9731.01, 9511.0, 9619.99, 3398.597578], [1524614400000, 9618.96, 9680.0, 9440.0, 9529.94, 4176.717373], [1524618000000, 9529.21, 9638.68, 9466.01, 9628.0, 2162.334614], [1524621600000, 9628.0, 9759.82, 9530.0, 9687.05, 2926.04267], [1524625200000, 9675.01, 9729.88, 9323.02, 9347.99, 4750.258117], [1524628800000, 9349.99, 9500.0, 9110.0, 9200.0, 7349.067614], [1524632400000, 9200.22, 9411.0, 9190.0, 9370.0, 4471.750669], [1524636000000, 9370.0, 9476.23, 9355.0, 9415.06, 2308.47475], [1524639600000, 9415.06, 9468.0, 9322.0, 9416.39, 1806.171064], [1524643200000, 9415.0, 9438.54, 9251.0, 9281.98, 2062.736478], [1524646800000, 9281.98, 9340.0, 9200.1, 9272.0, 2432.727417], [1524650400000, 9271.09, 9280.0, 8960.0, 9140.68, 6813.762612], [1524654000000, 9140.0, 9189.39, 8980.0, 9144.03, 4102.885853], [1524657600000, 9137.0, 9210.21, 9071.0, 9129.89, 3273.804506], [1524661200000, 9129.84, 9159.03, 8925.8, 9011.78, 3665.374008], [1524664800000, 9011.79, 9042.93, 8730.0, 8880.0, 7353.700593], [1524668400000, 8874.33, 8975.0, 8825.0, 8972.09, 3884.082052], [1524672000000, 8972.09, 8977.0, 8846.0, 8910.0, 2596.711141], [1524675600000, 8908.32, 9089.0, 8908.28, 9058.0, 2805.154149], [1524679200000, 9055.1, 9063.58, 8951.0, 8991.03, 1816.641586], [1524682800000, 8991.04, 9025.0, 8948.05, 8969.98, 1310.505916], [1524686400000, 8969.55, 9116.91, 8963.54, 9083.0, 1667.936258], [1524690000000, 9085.16, 9179.0, 9076.01, 9178.98, 1834.72347], [1524693600000, 9178.98, 9185.01, 8926.0, 8955.0, 2588.925525], [1524697200000, 8950.0, 9007.6, 8770.0, 8869.99, 2949.549154], [1524700800000, 8869.99, 8869.99, 8660.0, 8800.02, 3857.714344], [1524704400000, 8808.17, 8863.85, 8720.13, 8752.82, 1972.825793], [1524708000000, 8755.06, 8899.0, 8751.0, 8850.15, 1637.15144], [1524711600000, 8850.22, 8890.0, 8763.14, 8808.02, 1429.992518], [1524715200000, 8812.7, 8940.01, 8800.0, 8935.0, 2138.337113], [1524718800000, 8936.0, 8977.0, 8874.0, 8916.56, 2050.404402], [1524722400000, 8905.88, 8945.34, 8771.0, 8841.0, 2142.346006], [1524726000000, 8841.04, 8888.99, 8803.0, 8847.97, 1361.05604], [1524729600000, 8847.97, 8887.8, 8680.0, 8720.5, 2763.689638], [1524733200000, 8720.58, 8773.0, 8651.62, 8746.0, 2017.713497], [1524736800000, 8746.0, 8881.0, 8738.14, 8845.02, 1817.687954], [1524740400000, 8844.98, 8917.51, 8819.0, 8857.01, 1419.473964], [1524744000000, 8858.51, 8945.0, 8857.01, 8900.01, 1458.689927], [1524747600000, 8904.78, 8904.93, 8785.0, 8829.63, 1330.948392], [1524751200000, 8828.27, 8885.0, 8740.01, 8829.99, 1753.776069], [1524754800000, 8829.99, 8832.0, 8768.6, 8806.1, 1158.208979], [1524758400000, 8806.1, 8908.53, 8775.89, 8900.51, 1471.486504], [1524762000000, 8899.0, 8925.0, 8845.03, 8866.43, 1121.796651], [1524765600000, 8866.43, 8909.0, 8834.02, 8845.09, 709.544315], [1524769200000, 8845.1, 8895.21, 8838.35, 8881.54, 660.364885], [1524772800000, 8880.0, 9138.0, 8880.0, 9123.99, 3004.794474], [1524776400000, 9123.99, 9169.9, 9066.02, 9099.0, 1665.171301], [1524780000000, 9100.0, 9235.99, 9096.01, 9221.0, 1967.660617], [1524783600000, 9221.0, 9307.48, 9188.0, 9266.0, 2389.469422], [1524787200000, 9267.03, 9297.0, 9177.0, 9210.32, 1809.231872], [1524790800000, 9210.29, 9292.0, 9210.21, 9249.97, 1355.448312], [1524794400000, 9240.0, 9282.0, 9233.51, 9255.49, 1056.39558], [1524798000000, 9255.5, 9258.0, 9123.25, 9143.01, 2050.032206], [1524801600000, 9143.01, 9235.0, 9104.88, 9204.99, 1504.842605], [1524805200000, 9205.0, 9229.59, 9160.0, 9180.82, 955.199164], [1524808800000, 9184.99, 9265.7, 9176.99, 9250.0, 1653.666549], [1524812400000, 9249.99, 9250.0, 9188.0, 9240.97, 1007.547204], [1524816000000, 9240.97, 9296.0, 9230.0, 9260.0, 1337.006864], [1524819600000, 9260.0, 9387.48, 9241.2, 9369.0, 1954.845249], [1524823200000, 9369.0, 9395.0, 9328.05, 9365.0, 1616.756196], [1524826800000, 9363.31, 9367.97, 9280.59, 9309.0, 1330.916823], [1524830400000, 9308.9, 9355.0, 9253.68, 9290.07, 1309.376788], [1524834000000, 9290.01, 9318.62, 9150.1, 9225.0, 2525.072325], [1524837600000, 9226.97, 9290.0, 9202.0, 9288.88, 1401.058675], [1524841200000, 9280.14, 9288.88, 9210.01, 9241.21, 1359.95917], [1524844800000, 9241.2, 9328.26, 9241.0, 9282.1, 1395.512101], [1524848400000, 9286.01, 9319.99, 9266.0, 9290.1, 1122.230082], [1524852000000, 9290.1, 9296.31, 9213.8, 9230.89, 1001.907142], [1524855600000, 9230.89, 9250.56, 9075.01, 9089.0, 2097.18544], [1524859200000, 9089.12, 9163.38, 8940.0, 8970.0, 3084.066108], [1524862800000, 8969.99, 9053.0, 8909.83, 8975.35, 1911.233654], [1524866400000, 8975.36, 9093.09, 8975.36, 9031.0, 1077.087976], [1524870000000, 9032.0, 9073.93, 8889.0, 8915.35, 1324.768951], [1524873600000, 8915.35, 9049.76, 8870.0, 9010.11, 1754.04032], [1524877200000, 9005.98, 9126.81, 9000.0, 9126.81, 1298.861448], [1524880800000, 9126.81, 9129.17, 9050.0, 9055.78, 1317.636058], [1524884400000, 9053.47, 9196.32, 9051.0, 9155.0, 1089.068669], [1524888000000, 9155.01, 9168.71, 9111.21, 9138.53, 916.92033], [1524891600000, 9138.54, 9188.5, 9127.64, 9164.49, 934.025323], [1524895200000, 9164.48, 9215.66, 9150.67, 9163.03, 1348.809775], [1524898800000, 9163.02, 9171.07, 9108.99, 9126.22, 1203.100815], [1524902400000, 9121.05, 9330.0, 9081.02, 9217.48, 3048.753373], [1524906000000, 9227.49, 9300.4, 9155.06, 9273.0, 1973.035083], [1524909600000, 9273.0, 9310.0, 9257.8, 9289.98, 427.889426]], "2h": [[1521316800000, 7820.0, 8050.0, 7745.18, 7919.56, 3491.272996], [1521324000000, 7919.56, 8025.15, 7800.0, 7824.8, 2695.049265], [1521331200000, 7824.01, 7857.24, 7669.92, 7695.0, 3192.340126], [1521338400000, 7695.0, 7730.0, 7539.99, 7666.35, 5278.192087], [1521345600000, 7666.33, 7740.0, 7519.84, 7658.0, 3412.657579], [1521352800000, 7656.62, 7771.0, 7632.6, 7659.99, 2127.972124], [1521360000000, 7659.0, 7793.81, 7640.07, 7691.0, 2622.676406], [1521367200000, 7692.0, 7810.97, 7532.09, 7760.09, 3924.881135], [1521374400000, 7761.19, 7829.0, 7534.9, 7606.0, 3889.076886], [1521381600000, 7606.0, 7622.36, 7322.0, 7385.0, 7919.604712], [1521388800000, 7385.0, 7511.81, 7330.0, 7485.0, 4821.928467], [1521396000000, 7489.29, 7584.0, 7379.82, 7463.53, 4137.213803], [1521403200000, 7473.86, 8317.4, 7453.59, 8225.01, 10446.532093], [1521410400000, 8225.01, 8259.01, 8026.0, 8189.99, 7715.156293], [1521417600000, 8189.0, 8456.0, 8088.4, 8238.65, 7663.056017], [1521424800000, 8238.65, 8300.0, 8101.0, 8169.25, 3160.534373], [1521432000000, 8157.01, 8340.0, 8140.54, 8326.87, 3325.461321], [1521439200000, 8317.11, 8367.97, 8236.0, 8289.01, 2665.790353], [1521446400000, 8292.92, 8400.81, 8158.0, 8184.13, 4260.363728], [1521453600000, 8186.54, 8360.07, 8089.0, 8330.0, 3879.504579], [1521460800000, 8330.0, 8594.99, 8205.01, 8529.02, 5608.076418], [1521468000000, 8534.28, 8705.23, 8485.0, 8550.0, 7682.535641], [1521475200000, 8550.0, 8630.0, 8230.7, 8305.0, 6987.063289], [1521482400000, 8304.99, 8474.93, 8260.0, 8395.81, 3658.986333], [1521489600000, 8395.0, 8518.12, 8360.26, 8374.01, 2984.527982], [1521496800000, 8373.01, 8630.07, 8365.0, 8600.0, 3421.184908], [1521504000000, 8595.01, 8605.3, 8410.0, 8459.91, 3462.439434], [1521511200000, 8459.92, 8667.0, 8435.0, 8599.97, 3485.746906], [1521518400000, 8600.0, 8600.0, 8372.0, 8475.95, 3147.007923], [1521525600000, 8475.95, 8544.0, 8340.0, 8385.12, 2364.854949], [1521532800000, 8385.12, 8467.0, 8280.0, 8436.83, 4722.840176], [1521540000000, 8436.74, 8555.0, 8410.0, 8516.0, 2455.391119], [1521547200000, 8517.44, 8588.03, 8444.0, 8462.0, 2571.531057], [1521554400000, 8468.88, 8600.0, 8429.0, 8513.97, 2927.931914], [1521561600000, 8513.97, 8891.3, 8513.88, 8870.0, 7543.582342], [1521568800000, 8870.01, 8968.95, 8784.01, 8950.0, 3987.911214], [1521576000000, 8950.0, 9050.0, 8822.24, 8987.01, 4881.398312], [1521583200000, 8989.0, 8997.96, 8810.96, 8909.98, 3314.470489], [1521590400000, 8909.96, 8984.0, 8860.01, 8972.0, 2565.890646], [1521597600000, 8974.0, 9078.0, 8923.0, 9042.23, 2228.543942], [1521604800000, 9042.23, 9145.3, 9025.17, 9041.84, 3434.5224], [1521612000000, 9047.93, 9096.02, 8900.0, 8931.01, 3079.065283], [1521619200000, 8931.0, 9079.99, 8880.0, 9040.0, 3006.002834], [1521626400000, 9035.6, 9125.0, 9035.3, 9063.0, 2153.888163], [1521633600000, 9063.0, 9093.0, 8956.0, 9016.07, 2658.750973], [1521640800000, 9020.0, 9177.01, 9001.0, 9039.99, 3560.881227], [1521648000000, 9039.99, 9069.99, 8750.6, 8832.26, 8637.581205], [1521655200000, 8832.26, 8965.0, 8777.57, 8862.92, 3761.515817], [1521662400000, 8862.78, 8950.0, 8820.02, 8908.0, 2195.629105], [1521669600000, 8908.03, 8934.22, 8777.0, 8885.0, 2690.133776], [1521676800000, 8884.82, 9090.0, 8860.0, 9067.43, 2682.344128], [1521684000000, 9067.43, 9100.0, 8980.0, 9017.01, 2213.402431], [1521691200000, 9019.0, 9052.9, 8968.08, 9004.99, 1566.411648], [1521698400000, 9002.25, 9042.12, 8889.0, 8955.09, 2473.498183], [1521705600000, 8955.0, 9020.0, 8724.68, 8785.01, 4071.16414], [1521712800000, 8785.31, 8799.86, 8620.0, 8642.01, 5877.195791], [1521720000000, 8645.0, 8753.54, 8556.98, 8588.14, 4079.724708], [1521727200000, 8588.15, 8650.0, 8465.1, 8611.51, 6759.255636], [1521734400000, 8611.51, 8694.7, 8550.01, 8672.89, 3854.357709], [1521741600000, 8672.9, 8695.28, 8534.0, 8610.99, 2551.152991], [1521748800000, 8610.0, 8640.0, 8510.2, 8600.12, 1918.151151], [1521756000000, 8607.6, 8770.0, 8598.0, 8722.9, 2570.898293], [1521763200000, 8720.0, 8729.5, 8545.94, 8580.0, 2376.168338], [1521770400000, 8580.0, 8599.98, 8330.0, 8410.05, 5311.181155], [1521777600000, 8400.65, 8485.0, 8351.0, 8429.07, 2822.666789], [1521784800000, 8429.07, 8505.0, 8345.0, 8398.65, 3009.782323], [1521792000000, 8398.58, 8554.0, 8378.03, 8481.51, 3236.18241], [1521799200000, 8488.25, 8523.0, 8398.0, 8510.0, 2187.843469], [1521806400000, 8509.99, 8510.71, 8269.0, 8369.0, 3918.984587], [1521813600000, 8369.0, 8687.98, 8360.0, 8613.0, 5186.745432], [1521820800000, 8618.0, 8685.0, 8570.0, 8639.79, 2902.665532], [1521828000000, 8639.79, 8749.5, 8559.25, 8623.99, 3705.468592], [1521835200000, 8623.99, 8731.97, 8559.25, 8677.0, 2308.935447], [1521842400000, 8677.15, 8909.0, 8620.21, 8898.03, 3024.383592], [1521849600000, 8898.04, 8969.0, 8815.07, 8817.99, 3701.84878], [1521856800000, 8817.99, 8925.99, 8805.01, 8880.02, 2065.398082], [1521864000000, 8885.95, 8987.97, 8834.29, 8845.0, 3081.467806], [1521871200000, 8841.5, 8960.37, 8841.5, 8930.0, 2138.628687], [1521878400000, 8931.7, 8931.89, 8840.0, 8887.99, 1917.95483], [1521885600000, 8887.99, 8887.99, 8683.0, 8723.0, 3612.661927], [1521892800000, 8723.0, 8905.35, 8666.3, 8870.0, 3147.763527], [1521900000000, 8865.6, 8999.95, 8829.86, 8950.0, 2962.134498], [1521907200000, 8950.0, 8954.63, 8822.91, 8860.04, 2475.189965], [1521914400000, 8867.0, 8942.0, 8840.27, 8892.56, 1934.382174], [1521921600000, 8884.08, 8968.0, 8607.23, 8663.36, 4326.00937], [1521928800000, 8663.36, 8718.0, 8491.0, 8546.86, 4103.169926], [1521936000000, 8531.25, 8599.0, 8461.0, 8518.0, 3304.59241], [1521943200000, 8519.99, 8570.0, 8433.93, 8555.58, 2564.338069], [1521950400000, 8550.0, 8592.59, 8480.01, 8521.0, 1375.13701], [1521957600000, 8521.0, 8587.52, 8379.23, 8466.53, 2395.038601], [1521964800000, 8468.85, 8575.0, 8445.51, 8503.0, 1824.874067], [1521972000000, 8508.0, 8531.54, 8365.77, 8407.0, 2732.63418], [1521979200000, 8408.0, 8580.07, 8380.41, 8574.58, 2680.476329], [1521986400000, 8574.58, 8643.0, 8454.26, 8480.0, 2922.202005], [1521993600000, 8480.0, 8579.01, 8470.99, 8529.0, 2082.089726], [1522000800000, 8529.0, 8669.85, 8517.64, 8612.09, 2626.677575], [1522008000000, 8620.97, 8630.0, 8520.07, 8625.0, 1583.357445], [1522015200000, 8625.0, 8645.53, 8388.0, 8470.15, 2910.351899], [1522022400000, 8470.14, 8514.89, 8353.18, 8417.0, 2003.574489], [1522029600000, 8417.0, 8483.8, 8394.88, 8440.92, 1707.728946], [1522036800000, 8440.92, 8491.25, 8420.0, 8461.0, 1296.173935], [1522044000000, 8461.0, 8480.0, 8364.57, 8405.88, 1933.713621], [1522051200000, 8400.5, 8426.99, 8230.88, 8290.04, 3714.166551], [1522058400000, 8290.02, 8330.47, 8050.0, 8089.0, 6801.337713], [1522065600000, 8089.0, 8165.0, 8000.01, 8095.0, 4930.885476], [1522072800000, 8095.0, 8116.0, 8012.02, 8057.16, 3332.845231], [1522080000000, 8057.16, 8099.04, 7860.0, 7905.0, 6014.239065], [1522087200000, 7900.21, 7971.65, 7850.01, 7910.03, 3355.80817], [1522094400000, 7910.04, 7941.0, 7831.0, 7880.0, 2562.903911], [1522101600000, 7880.01, 8268.5, 7866.05, 8134.23, 6380.218552], [1522108800000, 8134.22, 8215.94, 8012.24, 8016.45, 2792.855975], [1522116000000, 8016.42, 8030.0, 7820.0, 7866.42, 4366.027735], [1522123200000, 7866.42, 7949.8, 7730.0, 7920.03, 4337.753106], [1522130400000, 7920.66, 8050.05, 7832.88, 7917.09, 2955.757111], [1522137600000, 7917.09, 7997.0, 7820.0, 7900.0, 2657.075761], [1522144800000, 7900.0, 8040.0, 7855.0, 7934.22, 2556.542215], [1522152000000, 7932.2, 8150.0, 7878.58, 8088.01, 3090.614352], [1522159200000, 8094.9, 8150.17, 8036.0, 8066.87, 3364.33552], [1522166400000, 8066.5, 8126.03, 7860.0, 7892.86, 3553.197181], [1522173600000, 7895.0, 7939.5, 7820.0, 7886.0, 2625.444492], [1522180800000, 7886.0, 8050.0, 7875.0, 8005.97, 2420.602588], [1522188000000, 8000.52, 8011.0, 7755.58, 7795.51, 2707.442014], [1522195200000, 7795.51, 7843.12, 7740.0, 7815.52, 2334.885017], [1522202400000, 7815.51, 7885.0, 7728.0, 7874.98, 2023.869613], [1522209600000, 7870.05, 7875.0, 7811.02, 7860.01, 1352.562294], [1522216800000, 7860.01, 7965.6, 7850.1, 7873.99, 2423.517214], [1522224000000, 7865.0, 8100.0, 7852.0, 8079.0, 2986.355987], [1522231200000, 8079.0, 8109.0, 8003.01, 8040.0, 2501.637303], [1522238400000, 8040.0, 8055.99, 7970.1, 8029.18, 2552.621835], [1522245600000, 8029.18, 8042.64, 7825.0, 7860.01, 3513.469798], [1522252800000, 7860.21, 7947.0, 7843.5, 7935.99, 1869.884189], [1522260000000, 7935.47, 7952.44, 7880.0, 7899.94, 1489.480769], [1522267200000, 7890.63, 7941.21, 7836.0, 7876.95, 1238.772293], [1522274400000, 7875.0, 8009.0, 7864.06, 7949.3, 2114.275358], [1522281600000, 7949.3, 7975.0, 7871.01, 7885.87, 1523.359919], [1522288800000, 7885.65, 7919.74, 7855.0, 7880.94, 1674.402693], [1522296000000, 7870.12, 7880.95, 7550.0, 7565.0, 7688.515935], [1522303200000, 7567.99, 7650.0, 7500.0, 7541.98, 3730.147387], [1522310400000, 7541.98, 7587.0, 7451.98, 7517.01, 3570.459819], [1522317600000, 7517.0, 7540.0, 7425.4, 7466.97, 3256.071957], [1522324800000, 7466.89, 7566.0, 7441.01, 7470.0, 3108.100179], [1522332000000, 7464.99, 7484.56, 7334.0, 7474.01, 4656.499543], [1522339200000, 7481.94, 7580.0, 7402.89, 7433.0, 4325.789749], [1522346400000, 7433.09, 7478.94, 7338.0, 7341.0, 2287.221692], [1522353600000, 7341.0, 7380.0, 6941.11, 7095.0, 11990.43189], [1522360800000, 7081.34, 7388.33, 7057.81, 7090.14, 6809.914362], [1522368000000, 7090.16, 7165.08, 6741.0, 6950.0, 10095.003058], [1522375200000, 6950.0, 6980.0, 6740.0, 6861.01, 4929.914564], [1522382400000, 6867.19, 7210.0, 6666.66, 7103.07, 7742.466249], [1522389600000, 7103.07, 7272.78, 6955.92, 7222.25, 6657.194954], [1522396800000, 7222.29, 7292.43, 7031.0, 7031.69, 4147.254494], [1522404000000, 7032.0, 7114.61, 6880.0, 7027.72, 4006.064823], [1522411200000, 7027.73, 7040.01, 6832.12, 6881.13, 3761.487336], [1522418400000, 6881.13, 6922.98, 6679.01, 6839.98, 5976.730412], [1522425600000, 6839.97, 6911.69, 6600.1, 6720.08, 7407.547927], [1522432800000, 6720.08, 6870.45, 6652.6, 6800.63, 3884.191497], [1522440000000, 6816.58, 6951.0, 6735.0, 6928.17, 3622.368057], [1522447200000, 6928.17, 6928.19, 6735.0, 6840.23, 3075.808605], [1522454400000, 6840.24, 7120.0, 6837.71, 7082.0, 3928.716962], [1522461600000, 7082.0, 7117.07, 6950.07, 6959.02, 3361.458566], [1522468800000, 6954.06, 7050.0, 6850.0, 6905.96, 2953.604938], [1522476000000, 6898.26, 6920.0, 6777.0, 6805.76, 2788.552146], [1522483200000, 6810.0, 7014.99, 6805.77, 6997.16, 2782.763091], [1522490400000, 6996.99, 7148.2, 6950.0, 7073.63, 4448.393105], [1522497600000, 7079.72, 7223.36, 7020.0, 7033.8, 4110.099492], [1522504800000, 7033.8, 7085.25, 6978.98, 7064.98, 2588.006852], [1522512000000, 7063.83, 7172.0, 7055.1, 7114.21, 2629.30714], [1522519200000, 7114.22, 7137.0, 6985.0, 7048.23, 2189.044216], [1522526400000, 7054.99, 7059.01, 6842.97, 6932.79, 3469.631652], [1522533600000, 6923.02, 6990.84, 6888.53, 6923.91, 1618.960927], [1522540800000, 6922.0, 7049.98, 6922.0, 7000.01, 1763.981633], [1522548000000, 7001.01, 7014.0, 6892.0, 6922.12, 1465.328265], [1522555200000, 6926.0, 6969.0, 6907.0, 6914.99, 1103.150812], [1522562400000, 6914.99, 6918.16, 6670.0, 6713.81, 4483.092587], [1522569600000, 6713.81, 6775.0, 6623.97, 6763.86, 3564.772465], [1522576800000, 6763.84, 6770.0, 6643.7, 6685.1, 2198.513071], [1522584000000, 6688.53, 6735.0, 6525.0, 6543.97, 4201.051341], [1522591200000, 6543.97, 6543.97, 6430.0, 6445.0, 5219.770181], [1522598400000, 6445.0, 6869.0, 6432.65, 6824.99, 9794.752608], [1522605600000, 6824.99, 6961.83, 6737.47, 6900.99, 5069.481376], [1522612800000, 6900.98, 6955.0, 6792.0, 6819.0, 2912.736618], [1522620000000, 6819.0, 6841.0, 6753.0, 6813.01, 2294.799506], [1522627200000, 6813.01, 7018.0, 6765.0, 6919.92, 3610.210184], [1522634400000, 6918.0, 7020.0, 6900.0, 6980.72, 2112.993795], [1522641600000, 6982.44, 7016.0, 6833.0, 6892.0, 2240.996279], [1522648800000, 6892.0, 7102.02, 6862.57, 7060.22, 3300.15959], [1522656000000, 7065.01, 7099.0, 7022.0, 7062.96, 2576.776245], [1522663200000, 7062.96, 7125.0, 7007.72, 7046.01, 2922.256186], [1522670400000, 7046.0, 7061.4, 6961.0, 7011.0, 2730.726704], [1522677600000, 7011.0, 7050.0, 6873.32, 7020.72, 3634.369753], [1522684800000, 7020.72, 7048.89, 6941.0, 6977.75, 2516.348251], [1522692000000, 6981.43, 7020.0, 6945.38, 6989.8, 1968.290075], [1522699200000, 6989.8, 7007.01, 6890.0, 6981.36, 2218.509922], [1522706400000, 6981.36, 7070.0, 6968.0, 7056.0, 2291.923088], [1522713600000, 7063.97, 7099.0, 7011.01, 7026.0, 1828.782797], [1522720800000, 7026.0, 7188.99, 7023.1, 7180.01, 3361.091048], [1522728000000, 7183.01, 7390.08, 7180.01, 7320.8, 5588.24188], [1522735200000, 7321.01, 7447.99, 7310.0, 7395.0, 3132.863977], [1522742400000, 7396.94, 7422.63, 7315.66, 7359.7, 3094.441343], [1522749600000, 7359.69, 7397.98, 7252.0, 7307.48, 3241.966022], [1522756800000, 7302.03, 7432.4, 7287.25, 7335.91, 2889.227743], [1522764000000, 7335.9, 7417.0, 7277.0, 7370.01, 3103.975017], [1522771200000, 7370.01, 7439.99, 7353.0, 7426.01, 2856.257963], [1522778400000, 7426.01, 7520.0, 7407.76, 7467.11, 3734.392191], [1522785600000, 7467.12, 7499.0, 7356.0, 7431.0, 2912.525825], [1522792800000, 7431.0, 7439.78, 7345.0, 7405.21, 2043.566005], [1522800000000, 7405.21, 7427.52, 7292.02, 7322.27, 3080.586264], [1522807200000, 7322.0, 7337.88, 7223.0, 7295.71, 3580.124496], [1522814400000, 7295.72, 7382.31, 7261.41, 7345.0, 2400.496512], [1522821600000, 7344.99, 7380.14, 7304.0, 7304.31, 1674.420158], [1522828800000, 7304.26, 7338.0, 7053.0, 7085.12, 5053.289356], [1522836000000, 7085.12, 7130.0, 7001.0, 7058.0, 4350.405262], [1522843200000, 7055.0, 7123.98, 7003.0, 7071.0, 3182.847824], [1522850400000, 7075.0, 7075.0, 6766.0, 6785.0, 6549.019994], [1522857600000, 6785.0, 6918.0, 6785.0, 6838.23, 3271.93993], [1522864800000, 6843.96, 6886.52, 6721.0, 6854.41, 4178.457223], [1522872000000, 6857.86, 6900.0, 6750.0, 6818.78, 2399.303166], [1522879200000, 6818.78, 6830.0, 6707.0, 6796.1, 2506.293619], [1522886400000, 6796.1, 6825.0, 6566.69, 6609.91, 4162.291942], [1522893600000, 6603.01, 6807.99, 6585.01, 6776.99, 3476.849173], [1522900800000, 6776.99, 6870.0, 6745.0, 6865.0, 3831.999716], [1522908000000, 6857.99, 6865.0, 6709.0, 6792.52, 3448.081687], [1522915200000, 6792.49, 6902.0, 6761.0, 6837.99, 3417.97483], [1522922400000, 6833.36, 6838.36, 6750.0, 6779.0, 2321.634651], [1522929600000, 6778.99, 6850.0, 6612.11, 6823.73, 4912.658642], [1522936800000, 6834.94, 6899.0, 6680.0, 6749.53, 4053.87621], [1522944000000, 6747.99, 6790.0, 6660.0, 6695.0, 3006.907935], [1522951200000, 6694.99, 6800.0, 6675.02, 6760.96, 2177.396493], [1522958400000, 6760.96, 6783.0, 6671.0, 6713.0, 1998.504563], [1522965600000, 6713.0, 6840.0, 6710.0, 6770.76, 2221.555618], [1522972800000, 6770.0, 6850.0, 6754.12, 6800.0, 1698.534082], [1522980000000, 6800.01, 6827.98, 6718.0, 6760.0, 2421.313598], [1522987200000, 6755.24, 6848.0, 6745.0, 6754.09, 2066.650227], [1522994400000, 6753.99, 6755.08, 6529.68, 6622.05, 5539.528508], [1523001600000, 6621.04, 6622.05, 6545.0, 6571.98, 2510.522467], [1523008800000, 6571.69, 6657.86, 6500.0, 6600.0, 3062.857628], [1523016000000, 6600.0, 6634.88, 6540.0, 6608.0, 2108.055309], [1523023200000, 6607.0, 6629.0, 6551.0, 6580.01, 1861.770223], [1523030400000, 6583.0, 6623.94, 6575.28, 6609.75, 1672.011227], [1523037600000, 6609.75, 6627.0, 6565.83, 6618.39, 1593.178702], [1523044800000, 6618.37, 6622.72, 6572.0, 6590.97, 1122.616469], [1523052000000, 6591.74, 6610.0, 6516.67, 6601.39, 1797.97348], [1523059200000, 6601.39, 6878.9, 6586.28, 6830.0, 4377.247384], [1523066400000, 6824.5, 6880.0, 6745.73, 6864.32, 2708.308379], [1523073600000, 6866.52, 6880.79, 6818.0, 6839.03, 2208.144442], [1523080800000, 6835.05, 6888.0, 6834.01, 6864.08, 2343.430667], [1523088000000, 6864.08, 6929.86, 6821.0, 6849.85, 3020.325044], [1523095200000, 6848.56, 6879.0, 6837.0, 6862.04, 1566.430075], [1523102400000, 6862.04, 6888.0, 6760.0, 6840.0, 2727.398664], [1523109600000, 6840.0, 7033.99, 6828.33, 7010.0, 3750.88973], [1523116800000, 7003.98, 7070.0, 6976.01, 7004.96, 3865.934781], [1523124000000, 7003.0, 7017.0, 6952.05, 6988.99, 1954.520733], [1523131200000, 6988.99, 7019.56, 6950.0, 6975.0, 1636.991929], [1523138400000, 6975.0, 6990.0, 6850.01, 6895.8, 2109.956439], [1523145600000, 6895.81, 6987.15, 6880.0, 6930.09, 1612.8838], [1523152800000, 6930.09, 6965.0, 6914.11, 6964.98, 1130.711148], [1523160000000, 6960.11, 7050.0, 6925.73, 6952.0, 1845.328897], [1523167200000, 6952.0, 6962.98, 6891.79, 6939.0, 1253.093794], [1523174400000, 6939.0, 7028.0, 6924.3, 6999.0, 1689.986129], [1523181600000, 6999.0, 7100.0, 6976.02, 7099.85, 3117.78099], [1523188800000, 7100.0, 7109.13, 7048.0, 7060.01, 2222.018144], [1523196000000, 7060.01, 7076.98, 7019.09, 7049.93, 1902.288324], [1523203200000, 7047.01, 7049.93, 6937.03, 6999.0, 2425.257317], [1523210400000, 6995.02, 7014.86, 6952.0, 6994.42, 1671.164038], [1523217600000, 6989.97, 6997.99, 6942.84, 6992.0, 1169.465142], [1523224800000, 6993.99, 7053.09, 6990.01, 7018.0, 1387.695442], [1523232000000, 7011.04, 7139.0, 7011.02, 7120.0, 2752.14241], [1523239200000, 7120.0, 7165.21, 7055.0, 7131.85, 2802.264258], [1523246400000, 7131.78, 7160.0, 7093.69, 7113.94, 1818.562573], [1523253600000, 7115.0, 7145.0, 7084.0, 7125.0, 1662.364294], [1523260800000, 7129.79, 7185.0, 7072.0, 7076.0, 2366.795649], [1523268000000, 7076.0, 7083.0, 6691.18, 6745.0, 8105.618546], [1523275200000, 6740.0, 6792.0, 6676.5, 6730.88, 3938.329276], [1523282400000, 6730.9, 6783.0, 6680.0, 6738.98, 2959.469612], [1523289600000, 6738.98, 6759.9, 6720.01, 6746.0, 1442.665661], [1523296800000, 6745.99, 6767.99, 6650.01, 6672.08, 2142.387285], [1523304000000, 6677.04, 6741.62, 6611.0, 6723.67, 2514.258674], [1523311200000, 6723.67, 6795.0, 6683.03, 6782.72, 1573.438968], [1523318400000, 6781.55, 6790.0, 6706.02, 6740.11, 1340.646448], [1523325600000, 6740.05, 6809.55, 6735.03, 6805.63, 1671.917905], [1523332800000, 6808.68, 6820.0, 6724.68, 6759.92, 2027.907374], [1523340000000, 6759.93, 6774.71, 6670.25, 6715.51, 2094.894524], [1523347200000, 6717.32, 6785.0, 6656.0, 6785.0, 1866.956021], [1523354400000, 6773.93, 6788.62, 6702.0, 6735.0, 1806.012576], [1523361600000, 6735.0, 6772.99, 6719.91, 6761.99, 1504.740773], [1523368800000, 6761.99, 6870.99, 6733.0, 6837.54, 3020.833034], [1523376000000, 6835.65, 6870.0, 6809.6, 6867.48, 1917.096824], [1523383200000, 6867.49, 6874.0, 6825.0, 6844.93, 1637.2403], [1523390400000, 6844.93, 6865.0, 6805.52, 6860.0, 1295.352263], [1523397600000, 6860.0, 6890.0, 6768.01, 6843.9, 2143.130053], [1523404800000, 6839.56, 6872.71, 6827.69, 6840.0, 1852.727635], [1523412000000, 6840.0, 6860.3, 6800.0, 6818.79, 1526.703791], [1523419200000, 6818.79, 6867.4, 6806.44, 6817.71, 1456.182107], [1523426400000, 6817.71, 6848.0, 6787.0, 6846.89, 1675.528256], [1523433600000, 6846.89, 6869.34, 6830.51, 6854.12, 1839.90233], [1523440800000, 6856.99, 6857.97, 6800.0, 6851.97, 1904.129724], [1523448000000, 6851.53, 6990.0, 6840.0, 6944.89, 3011.274495], [1523455200000, 6944.89, 6968.02, 6901.0, 6927.06, 2476.682429], [1523462400000, 6927.06, 6936.0, 6862.6, 6904.99, 2631.780025], [1523469600000, 6904.99, 6927.48, 6890.03, 6910.63, 1796.758248], [1523476800000, 6914.97, 6926.95, 6878.14, 6909.0, 1517.670765], [1523484000000, 6908.53, 6987.41, 6904.61, 6953.79, 2308.531372], [1523491200000, 6953.78, 6975.0, 6885.0, 6939.99, 2317.166168], [1523498400000, 6939.98, 6980.0, 6930.0, 6965.2, 2047.125902], [1523505600000, 6965.21, 6985.0, 6928.0, 6940.0, 1806.659812], [1523512800000, 6940.01, 6967.02, 6743.2, 6826.61, 5239.121159], [1523520000000, 6826.62, 6865.71, 6802.7, 6850.99, 2484.937926], [1523527200000, 6850.99, 8012.23, 6840.01, 7690.0, 17751.80667], [1523534400000, 7685.55, 7780.0, 7569.83, 7683.18, 11027.103209], [1523541600000, 7683.18, 7735.94, 7577.0, 7614.21, 5097.209847], [1523548800000, 7618.0, 7775.0, 7542.0, 7688.0, 5348.784429], [1523556000000, 7688.0, 7768.0, 7642.01, 7700.0, 2898.690172], [1523563200000, 7699.97, 7945.0, 7694.05, 7851.0, 4034.818346], [1523570400000, 7853.0, 7986.1, 7716.19, 7923.0, 4808.172347], [1523577600000, 7922.99, 7994.96, 7732.0, 7793.22, 4780.947484], [1523584800000, 7793.22, 7932.0, 7791.68, 7832.99, 3127.479293], [1523592000000, 7832.99, 7846.62, 7751.0, 7783.4, 3066.978511], [1523599200000, 7788.96, 8195.84, 7779.99, 8093.01, 5418.735378], [1523606400000, 8100.0, 8170.0, 8033.0, 8066.96, 6414.807869], [1523613600000, 8066.96, 8141.0, 8005.0, 8091.0, 4213.72805], [1523620800000, 8091.4, 8233.39, 8020.0, 8096.0, 6052.366481], [1523628000000, 8096.51, 8133.0, 8013.27, 8125.0, 4265.921734], [1523635200000, 8125.41, 8168.0, 8060.0, 8114.79, 3165.080713], [1523642400000, 8115.0, 8130.0, 8050.0, 8094.0, 2175.138955], [1523649600000, 8093.82, 8109.9, 7801.0, 7859.74, 7044.364218], [1523656800000, 7864.57, 7967.26, 7768.47, 7877.41, 5318.974462], [1523664000000, 7877.48, 8095.0, 7810.0, 8065.24, 3910.53856], [1523671200000, 8069.43, 8090.0, 8000.01, 8044.66, 2324.568971], [1523678400000, 8044.67, 8046.76, 7935.15, 7957.36, 2437.189936], [1523685600000, 7963.99, 8186.0, 7955.0, 8127.74, 3350.565671], [1523692800000, 8129.99, 8175.0, 7992.9, 8040.0, 2908.997782], [1523700000000, 8035.22, 8065.9, 7915.0, 7965.32, 2789.800979], [1523707200000, 7965.0, 7987.83, 7849.46, 7965.18, 3926.704533], [1523714400000, 7964.0, 7993.99, 7905.63, 7955.01, 2420.966935], [1523721600000, 7955.02, 8010.0, 7917.0, 7972.55, 2255.84195], [1523728800000, 7972.55, 8046.63, 7943.4, 8022.0, 1612.77756], [1523736000000, 8022.0, 8090.23, 8000.0, 8058.47, 1663.1054], [1523743200000, 8058.48, 8084.0, 7941.0, 7999.01, 2020.22808], [1523750400000, 8004.0, 8133.0, 7999.02, 8113.02, 2812.540222], [1523757600000, 8113.2, 8130.0, 8059.47, 8083.99, 1482.958543], [1523764800000, 8084.0, 8150.0, 8050.0, 8128.0, 1771.583785], [1523772000000, 8127.02, 8130.0, 8066.39, 8074.99, 1475.835477], [1523779200000, 8074.91, 8154.0, 8072.1, 8116.23, 1676.506366], [1523786400000, 8118.0, 8429.54, 8110.69, 8330.0, 5729.204796], [1523793600000, 8330.0, 8380.0, 8286.0, 8353.0, 3137.702122], [1523800800000, 8352.01, 8375.96, 8230.0, 8269.99, 3167.109541], [1523808000000, 8269.0, 8349.0, 8254.95, 8300.0, 2096.623699], [1523815200000, 8296.01, 8334.21, 8272.57, 8300.01, 1517.965316], [1523822400000, 8305.55, 8326.0, 8280.0, 8295.99, 1346.740415], [1523829600000, 8295.99, 8365.87, 8277.57, 8355.0, 1731.950162], [1523836800000, 8355.07, 8419.0, 8318.42, 8321.37, 2812.262771], [1523844000000, 8325.0, 8348.0, 8076.19, 8146.9, 5696.889434], [1523851200000, 8144.73, 8151.0, 8000.0, 8036.43, 3894.989658], [1523858400000, 8035.0, 8130.47, 8020.0, 8110.0, 2856.288948], [1523865600000, 8110.21, 8138.53, 8030.0, 8096.83, 2497.412056], [1523872800000, 8096.83, 8119.85, 8016.33, 8086.0, 2318.72735], [1523880000000, 8086.0, 8087.11, 7867.0, 7964.34, 6085.674406], [1523887200000, 7964.34, 7999.0, 7907.0, 7971.99, 2500.420132], [1523894400000, 7971.98, 8056.0, 7924.65, 8031.02, 2391.931514], [1523901600000, 8031.02, 8050.0, 7953.0, 7983.99, 2280.202579], [1523908800000, 7983.97, 8036.5, 7935.99, 8018.98, 1632.716382], [1523916000000, 8015.0, 8086.01, 7969.0, 8064.92, 1696.554485], [1523923200000, 8064.92, 8083.61, 8014.08, 8041.0, 1911.781812], [1523930400000, 8041.99, 8055.93, 7956.17, 8045.78, 2122.582103], [1523937600000, 8049.9, 8049.9, 7975.01, 7983.0, 1952.755795], [1523944800000, 7975.01, 8172.76, 7960.0, 8138.45, 3118.58685], [1523952000000, 8143.72, 8173.7, 8125.2, 8144.41, 2825.231915], [1523959200000, 8144.41, 8155.0, 8064.52, 8124.87, 2601.107453], [1523966400000, 8124.87, 8156.0, 8051.0, 8100.0, 2477.516442], [1523973600000, 8100.0, 8133.38, 8070.0, 8088.63, 2527.27293], [1523980800000, 8088.63, 8134.0, 8084.97, 8105.0, 1921.031287], [1523988000000, 8104.47, 8106.6, 7836.4, 7874.01, 5191.759986], [1523995200000, 7874.0, 7951.49, 7825.4, 7915.96, 3134.521503], [1524002400000, 7915.97, 7926.88, 7860.0, 7885.02, 2368.455491], [1524009600000, 7890.96, 7979.0, 7868.07, 7952.42, 1618.789611], [1524016800000, 7952.42, 7966.54, 7901.3, 7947.71, 1276.858769], [1524024000000, 7947.74, 7949.99, 7907.05, 7928.99, 1379.810702], [1524031200000, 7925.83, 8149.89, 7868.0, 8107.23, 4324.005343], [1524038400000, 8113.51, 8118.0, 8071.0, 8092.01, 2096.181496], [1524045600000, 8092.02, 8120.0, 8067.02, 8103.0, 1835.641953], [1524052800000, 8104.0, 8117.81, 8075.06, 8095.89, 1629.927722], [1524060000000, 8098.45, 8100.0, 7931.01, 7994.0, 3080.605041], [1524067200000, 7994.0, 8149.78, 7985.01, 8099.0, 2652.420047], [1524074400000, 8098.79, 8126.79, 8090.65, 8116.65, 1792.059004], [1524081600000, 8116.01, 8236.43, 8097.0, 8199.0, 2858.005387], [1524088800000, 8199.0, 8220.1, 8105.0, 8173.0, 2424.739495], [1524096000000, 8173.99, 8210.0, 8100.0, 8188.88, 2642.38546], [1524103200000, 8188.88, 8290.0, 8150.0, 8185.0, 2696.379097], [1524110400000, 8184.99, 8198.0, 8120.0, 8180.0, 2415.708326], [1524117600000, 8180.0, 8249.0, 8080.0, 8166.97, 2631.770672], [1524124800000, 8166.97, 8240.0, 8143.02, 8230.89, 2551.935584], [1524132000000, 8231.0, 8259.0, 8191.47, 8207.01, 2332.639302], [1524139200000, 8207.0, 8248.5, 8181.7, 8234.84, 1936.159082], [1524146400000, 8236.0, 8270.0, 8171.56, 8239.02, 2232.966964], [1524153600000, 8235.45, 8296.0, 8230.01, 8259.08, 2581.743803], [1524160800000, 8257.61, 8290.0, 8233.1, 8249.95, 1596.009672], [1524168000000, 8249.95, 8280.0, 8189.0, 8272.28, 1951.232843], [1524175200000, 8272.28, 8294.99, 8230.0, 8278.0, 1544.916659], [1524182400000, 8273.84, 8375.0, 8270.32, 8360.0, 2969.464352], [1524189600000, 8359.99, 8398.0, 8282.2, 8331.03, 2733.911506], [1524196800000, 8331.3, 8336.38, 8177.09, 8272.99, 4853.700633], [1524204000000, 8272.99, 8348.98, 8253.0, 8319.97, 2618.085512], [1524211200000, 8319.92, 8349.01, 8267.01, 8308.87, 2234.256304], [1524218400000, 8305.0, 8540.37, 8290.0, 8515.01, 5327.474773], [1524225600000, 8515.0, 8577.9, 8455.04, 8499.0, 3585.428146], [1524232800000, 8499.01, 8520.0, 8431.86, 8459.99, 2470.321414], [1524240000000, 8458.0, 8530.0, 8446.0, 8505.0, 2051.228461], [1524247200000, 8505.0, 8539.63, 8485.0, 8518.0, 1670.776956], [1524254400000, 8518.0, 8560.0, 8490.0, 8508.04, 1997.39228], [1524261600000, 8508.04, 8930.0, 8508.03, 8856.98, 7283.297148], [1524268800000, 8852.12, 8869.23, 8730.0, 8820.0, 4121.544251], [1524276000000, 8820.0, 8928.0, 8807.02, 8862.0, 2599.413124], [1524283200000, 8858.0, 8884.9, 8839.99, 8878.07, 1517.081993], [1524290400000, 8878.07, 9035.0, 8854.2, 8874.88, 3979.483862], [1524297600000, 8874.87, 8888.0, 8630.0, 8705.01, 7465.529609], [1524304800000, 8713.35, 8749.83, 8565.0, 8700.0, 6375.133489], [1524312000000, 8700.01, 8778.46, 8680.0, 8748.0, 3617.937921], [1524319200000, 8748.0, 8846.63, 8735.99, 8828.2, 3163.137961], [1524326400000, 8828.13, 8874.0, 8706.5, 8760.0, 2866.273172], [1524333600000, 8760.05, 8818.16, 8730.0, 8792.47, 1561.46326], [1524340800000, 8792.47, 8800.01, 8707.0, 8780.01, 1575.065461], [1524348000000, 8780.01, 8930.0, 8762.32, 8915.31, 2030.165806], [1524355200000, 8915.31, 8915.33, 8786.8, 8815.99, 2118.689427], [1524362400000, 8815.99, 8874.0, 8801.01, 8811.0, 1533.733913], [1524369600000, 8814.0, 8887.96, 8794.62, 8834.73, 1274.114873], [1524376800000, 8834.73, 8904.99, 8834.5, 8875.0, 1494.82423], [1524384000000, 8875.0, 8979.5, 8862.22, 8910.0, 3129.367464], [1524391200000, 8910.0, 9020.0, 8902.12, 8916.01, 2817.351205], [1524398400000, 8916.01, 8965.82, 8768.79, 8877.0, 3763.279893], [1524405600000, 8877.0, 8998.0, 8874.03, 8940.67, 2935.418614], [1524412800000, 8940.67, 9020.67, 8850.0, 8940.36, 3127.020964], [1524420000000, 8940.36, 8957.84, 8860.0, 8881.0, 2008.011302], [1524427200000, 8881.0, 8928.0, 8865.99, 8920.02, 1545.451407], [1524434400000, 8926.8, 8926.88, 8727.68, 8787.02, 3710.990188], [1524441600000, 8785.7, 8888.0, 8745.0, 8853.24, 2324.78849], [1524448800000, 8844.24, 8888.0, 8821.83, 8861.52, 1788.273187], [1524456000000, 8861.52, 8883.0, 8821.01, 8879.0, 1360.760441], [1524463200000, 8878.04, 8970.01, 8850.0, 8942.39, 3231.643937], [1524470400000, 8942.0, 8957.04, 8831.0, 8905.0, 3003.724426], [1524477600000, 8905.0, 8923.0, 8874.71, 8910.02, 1921.934795], [1524484800000, 8910.02, 8985.0, 8897.75, 8929.0, 2565.83325], [1524492000000, 8934.39, 8940.0, 8858.08, 8898.0, 2419.472147], [1524499200000, 8898.0, 8938.21, 8861.42, 8886.0, 1984.142826], [1524506400000, 8887.67, 8915.0, 8800.6, 8847.37, 2025.227239], [1524513600000, 8847.37, 8928.0, 8825.01, 8922.0, 1619.580537], [1524520800000, 8925.8, 8949.98, 8888.0, 8934.01, 1592.733434], [1524528000000, 8934.0, 9219.0, 8922.0, 9186.0, 5669.364234], [1524535200000, 9186.01, 9230.15, 9150.0, 9192.47, 3251.162491], [1524542400000, 9192.48, 9300.0, 9190.0, 9271.11, 3461.583681], [1524549600000, 9271.14, 9278.81, 9177.0, 9216.0, 2680.783563], [1524556800000, 9217.98, 9285.78, 9216.0, 9285.0, 2061.28313], [1524564000000, 9285.0, 9349.0, 9273.22, 9294.57, 3491.624974], [1524571200000, 9294.59, 9420.0, 9221.0, 9259.99, 4808.840986], [1524578400000, 9259.99, 9370.0, 9155.0, 9347.77, 4682.347022], [1524585600000, 9347.78, 9415.95, 9309.0, 9409.97, 2724.170876], [1524592800000, 9410.0, 9455.0, 9293.29, 9449.9, 3795.323849], [1524600000000, 9452.0, 9495.0, 9400.04, 9468.0, 3283.105972], [1524607200000, 9469.0, 9731.01, 9425.01, 9619.99, 6359.199328], [1524614400000, 9618.96, 9680.0, 9440.0, 9628.0, 6339.051987], [1524621600000, 9628.0, 9759.82, 9323.02, 9347.99, 7676.300787], [1524628800000, 9349.99, 9500.0, 9110.0, 9370.0, 11820.818283], [1524636000000, 9370.0, 9476.23, 9322.0, 9416.39, 4114.645814], [1524643200000, 9415.0, 9438.54, 9200.1, 9272.0, 4495.463895], [1524650400000, 9271.09, 9280.0, 8960.0, 9144.03, 10916.648465], [1524657600000, 9137.0, 9210.21, 8925.8, 9011.78, 6939.178514], [1524664800000, 9011.79, 9042.93, 8730.0, 8972.09, 11237.782645], [1524672000000, 8972.09, 9089.0, 8846.0, 9058.0, 5401.86529], [1524679200000, 9055.1, 9063.58, 8948.05, 8969.98, 3127.147502], [1524686400000, 8969.55, 9179.0, 8963.54, 9178.98, 3502.659728], [1524693600000, 9178.98, 9185.01, 8770.0, 8869.99, 5538.474679], [1524700800000, 8869.99, 8869.99, 8660.0, 8752.82, 5830.540137], [1524708000000, 8755.06, 8899.0, 8751.0, 8808.02, 3067.143958], [1524715200000, 8812.7, 8977.0, 8800.0, 8916.56, 4188.741515], [1524722400000, 8905.88, 8945.34, 8771.0, 8847.97, 3503.402046], [1524729600000, 8847.97, 8887.8, 8651.62, 8746.0, 4781.403135], [1524736800000, 8746.0, 8917.51, 8738.14, 8857.01, 3237.161918], [1524744000000, 8858.51, 8945.0, 8785.0, 8829.63, 2789.638319], [1524751200000, 8828.27, 8885.0, 8740.01, 8806.1, 2911.985048], [1524758400000, 8806.1, 8925.0, 8775.89, 8866.43, 2593.283155], [1524765600000, 8866.43, 8909.0, 8834.02, 8881.54, 1369.9092], [1524772800000, 8880.0, 9169.9, 8880.0, 9099.0, 4669.965775], [1524780000000, 9100.0, 9307.48, 9096.01, 9266.0, 4357.130039], [1524787200000, 9267.03, 9297.0, 9177.0, 9249.97, 3164.680184], [1524794400000, 9240.0, 9282.0, 9123.25, 9143.01, 3106.427786], [1524801600000, 9143.01, 9235.0, 9104.88, 9180.82, 2460.041769], [1524808800000, 9184.99, 9265.7, 9176.99, 9240.97, 2661.213753], [1524816000000, 9240.97, 9387.48, 9230.0, 9369.0, 3291.852113], [1524823200000, 9369.0, 9395.0, 9280.59, 9309.0, 2947.673019], [1524830400000, 9308.9, 9355.0, 9150.1, 9225.0, 3834.449113], [1524837600000, 9226.97, 9290.0, 9202.0, 9241.21, 2761.017845], [1524844800000, 9241.2, 9328.26, 9241.0, 9290.1, 2517.742183], [1524852000000, 9290.1, 9296.31, 9075.01, 9089.0, 3099.092582], [1524859200000, 9089.12, 9163.38, 8909.83, 8975.35, 4995.299762], [1524866400000, 8975.36, 9093.09, 8889.0, 8915.35, 2401.856927], [1524873600000, 8915.35, 9126.81, 8870.0, 9126.81, 3052.901768], [1524880800000, 9126.81, 9196.32, 9050.0, 9155.0, 2406.704727], [1524888000000, 9155.01, 9188.5, 9111.21, 9164.49, 1850.945653], [1524895200000, 9164.48, 9215.66, 9108.99, 9126.22, 2551.91059], [1524902400000, 9121.05, 9330.0, 9081.02, 9273.0, 5021.788456], [1524909600000, 9273.0, 9310.0, 9257.8, 9289.98, 427.889426]], "4h": [[1517616000000, 8873.03, 8920.0, 8233.0, 8344.81, 5058.529043], [1517630400000, 8344.88, 8788.0, 8229.0, 8708.82, 4158.330198], [1517644800000, 8708.82, 9123.0, 8579.0, 9099.87, 5096.724114], [1517659200000, 9099.87, 9459.6, 8969.0, 9173.0, 7066.94034], [1517673600000, 9173.01, 9401.0, 9055.0, 9339.43, 4005.86702], [1517688000000, 9350.0, 9473.01, 9022.0, 9199.96, 3338.61002], [1517702400000, 9199.96, 9250.0, 8901.01, 9219.18, 2810.29891], [1517716800000, 9219.19, 9368.0, 9075.01, 9200.0, 2431.080396], [1517731200000, 9200.0, 9216.0, 8687.45, 8691.99, 5322.600063], [1517745600000, 8691.99, 8894.12, 8357.93, 8419.96, 7359.318385], [1517760000000, 8419.96, 8585.0, 8180.0, 8264.2, 5737.008025], [1517774400000, 8264.19, 8474.0, 7930.0, 8184.81, 8354.00267], [1517788800000, 8179.99, 8342.05, 7910.0, 8137.23, 6227.667474], [1517803200000, 8148.83, 8382.8, 7915.01, 7965.01, 4611.51149], [1517817600000, 7965.01, 8049.99, 7510.0, 7578.0, 8595.768963], [1517832000000, 7572.32, 7788.87, 7167.0, 7384.85, 12353.960734], [1517846400000, 7375.49, 7536.41, 6625.0, 6698.33, 13593.166209], [1517860800000, 6680.76, 7543.99, 6625.0, 6939.99, 18021.107709], [1517875200000, 6939.63, 7150.0, 6155.0, 6327.05, 14648.966602], [1517889600000, 6317.8, 6655.0, 6000.01, 6043.0, 18582.335371], [1517904000000, 6040.98, 6960.0, 6019.24, 6559.0, 17286.572574], [1517918400000, 6559.0, 7462.0, 6435.99, 7290.61, 21152.740399], [1517932800000, 7299.99, 7623.83, 6781.0, 7544.93, 14178.223996], [1517947200000, 7543.18, 7878.0, 7425.67, 7652.14, 14352.661365], [1517961600000, 7655.02, 7770.0, 7155.0, 7200.0, 10107.705384], [1517976000000, 7200.0, 7734.52, 7150.01, 7669.97, 7528.66848], [1517990400000, 7669.97, 8274.0, 7580.6, 8151.53, 12798.246042], [1518004800000, 8138.05, 8476.0, 8036.0, 8169.0, 11365.768436], [1518019200000, 8165.0, 8399.0, 7867.0, 8130.81, 8745.316193], [1518033600000, 8130.81, 8259.12, 7531.11, 7599.0, 10232.755962], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518163200000, 7789.9, 8395.0, 7789.9, 8280.11, 3483.805239], [1518177600000, 8288.03, 8540.0, 8201.95, 8333.91, 6043.02653], [1518192000000, 8333.98, 8738.0, 8312.0, 8633.15, 5944.072439], [1518206400000, 8638.05, 8720.04, 8403.0, 8683.92, 5012.006617], [1518220800000, 8683.93, 8997.0, 8601.0, 8905.84, 7993.502755], [1518235200000, 8905.84, 9065.78, 8760.0, 8915.15, 5592.523995], [1518249600000, 8915.15, 8920.17, 8470.0, 8635.99, 9309.608361], [1518264000000, 8626.12, 8800.0, 8231.0, 8263.51, 9669.496264], [1518278400000, 8271.0, 8448.0, 8120.0, 8419.0, 8887.712905], [1518292800000, 8420.0, 8572.0, 8125.0, 8533.98, 7928.668373], [1518307200000, 8533.99, 8549.0, 7956.0, 7969.05, 8046.326184], [1518321600000, 7976.73, 8169.13, 7800.0, 7850.72, 7751.617967], [1518336000000, 7851.2, 8190.0, 7726.53, 8140.0, 8613.791974], [1518350400000, 8139.99, 8449.9, 8110.0, 8449.86, 8650.395645], [1518364800000, 8445.06, 8500.85, 8151.2, 8285.0, 6996.107264], [1518379200000, 8285.0, 8342.21, 8015.0, 8063.88, 4966.948918], [1518393600000, 8063.82, 8570.0, 8053.0, 8479.99, 8080.333298], [1518408000000, 8479.0, 8550.0, 8337.0, 8473.76, 4804.245419], [1518422400000, 8470.01, 8840.82, 8457.03, 8640.01, 9193.850506], [1518436800000, 8640.01, 8774.9, 8502.0, 8670.0, 6716.413677], [1518451200000, 8669.99, 8799.42, 8620.0, 8792.76, 5349.247434], [1518465600000, 8793.0, 8989.0, 8700.0, 8903.0, 7843.760156], [1518480000000, 8903.0, 8950.0, 8640.33, 8760.59, 6814.370804], [1518494400000, 8763.2, 8786.3, 8554.87, 8669.39, 5427.889741], [1518508800000, 8656.26, 8669.42, 8351.0, 8531.47, 8785.092716], [1518523200000, 8525.08, 8680.0, 8450.0, 8489.91, 5800.85879], [1518537600000, 8486.05, 8647.03, 8486.05, 8616.04, 3677.962165], [1518552000000, 8616.11, 8725.0, 8461.0, 8539.9, 4948.79874], [1518566400000, 8535.17, 8724.0, 8533.0, 8709.0, 4445.536377], [1518580800000, 8709.0, 8888.85, 8705.01, 8870.17, 5376.398996], [1518595200000, 8870.17, 8930.65, 8757.5, 8927.0, 5163.13491], [1518609600000, 8929.96, 9350.0, 8924.87, 9330.08, 13307.603908], [1518624000000, 9329.22, 9400.0, 9170.0, 9239.36, 7252.578778], [1518638400000, 9232.04, 9489.6, 9190.0, 9449.99, 5266.699898], [1518652800000, 9449.98, 9710.0, 9301.5, 9636.58, 8082.558079], [1518667200000, 9643.0, 9817.2, 9620.0, 9810.01, 6689.084789], [1518681600000, 9810.01, 9925.17, 9371.56, 9566.56, 12804.399253], [1518696000000, 9560.01, 9856.61, 9560.01, 9811.01, 6549.377968], [1518710400000, 9811.01, 10219.5, 9742.01, 10110.75, 10823.630984], [1518724800000, 10114.1, 10167.5, 9832.95, 10000.09, 7478.545642], [1518739200000, 10000.89, 10323.37, 9980.0, 10104.7, 6414.819334], [1518753600000, 10108.0, 10141.5, 9679.16, 9688.5, 8406.254833], [1518768000000, 9688.5, 9973.86, 9666.0, 9799.43, 6739.054921], [1518782400000, 9796.01, 10132.0, 9740.0, 10039.98, 6504.214311], [1518796800000, 10035.05, 10150.0, 9865.0, 10030.66, 5669.167777], [1518811200000, 10030.65, 10213.3, 9927.93, 10159.98, 4427.694798], [1518825600000, 10156.07, 10489.66, 10050.0, 10459.04, 7305.962891], [1518840000000, 10459.04, 10760.0, 10418.01, 10727.91, 7959.297717], [1518854400000, 10727.87, 10877.91, 10580.0, 10683.0, 8235.004713], [1518868800000, 10683.0, 10869.0, 10499.86, 10731.48, 7095.960571], [1518883200000, 10731.48, 10835.0, 10674.0, 10722.99, 5013.956269], [1518897600000, 10720.0, 11075.07, 10675.1, 11039.55, 6271.926246], [1518912000000, 11039.55, 11274.0, 10751.5, 10800.0, 9106.720792], [1518926400000, 10808.99, 10940.0, 10323.0, 10589.76, 14082.968291], [1518940800000, 10593.62, 10599.93, 10080.0, 10550.0, 13349.983889], [1518955200000, 10550.0, 10850.0, 10350.0, 10633.73, 9858.360006], [1518969600000, 10620.01, 10874.99, 10411.71, 10831.26, 8047.716738], [1518984000000, 10835.62, 10837.1, 10331.0, 10383.43, 6691.631012], [1518998400000, 10375.01, 10639.0, 10270.33, 10499.0, 6375.826465], [1519012800000, 10498.86, 10843.0, 10334.0, 10815.62, 5879.536835], [1519027200000, 10815.61, 11031.31, 10672.01, 10918.84, 8631.624528], [1519041600000, 10918.84, 11219.0, 10855.0, 11171.71, 6801.519111], [1519056000000, 11171.71, 11250.0, 10881.0, 11126.06, 7744.962027], [1519070400000, 11126.17, 11212.0, 11005.0, 11153.0, 5397.948165], [1519084800000, 11147.11, 11516.51, 11141.0, 11424.1, 9097.96099], [1519099200000, 11424.1, 11650.0, 11379.99, 11535.0, 6119.690326], [1519113600000, 11530.92, 11585.0, 11156.0, 11400.0, 8485.455971], [1519128000000, 11408.88, 11595.0, 11378.0, 11516.99, 5071.930077], [1519142400000, 11517.0, 11748.01, 11494.29, 11668.0, 7241.339632], [1519156800000, 11668.0, 11786.01, 11100.59, 11200.99, 12136.977292], [1519171200000, 11195.07, 11304.03, 10811.7, 10915.34, 15536.14564], [1519185600000, 10919.0, 11140.0, 10620.0, 11125.0, 10734.182206], [1519200000000, 11128.0, 11185.19, 10850.0, 10948.0, 6891.12062], [1519214400000, 10948.02, 11109.0, 10407.09, 10540.31, 13297.646938], [1519228800000, 10542.64, 10675.51, 10312.12, 10385.5, 11935.417604], [1519243200000, 10385.5, 10562.0, 10200.0, 10437.6, 9719.305746], [1519257600000, 10439.02, 10799.0, 10296.0, 10711.84, 8119.957129], [1519272000000, 10711.84, 10933.44, 10520.0, 10600.0, 7929.57954], [1519286400000, 10606.99, 10670.0, 10076.0, 10259.87, 12298.252064], [1519300800000, 10260.0, 10318.0, 9711.0, 9980.98, 20953.441335], [1519315200000, 9972.12, 10048.33, 9679.0, 10027.7, 10725.330819], [1519329600000, 10027.71, 10127.0, 9789.0, 9811.04, 7033.605596], [1519344000000, 9815.55, 9825.91, 9570.19, 9807.89, 10060.305708], [1519358400000, 9802.14, 9989.0, 9656.0, 9865.66, 9112.577181], [1519372800000, 9865.67, 10230.0, 9857.34, 10180.06, 10914.106446], [1519387200000, 10180.06, 10435.0, 10088.1, 10292.0, 10982.849267], [1519401600000, 10292.0, 10300.92, 10004.09, 10033.0, 9089.17118], [1519416000000, 10037.9, 10230.0, 9857.75, 10131.04, 7043.692588], [1519430400000, 10131.04, 10468.0, 10081.41, 10400.0, 6591.551708], [1519444800000, 10395.74, 10496.97, 9938.98, 10119.16, 8360.107089], [1519459200000, 10119.13, 10155.0, 9669.94, 9757.0, 8044.812092], [1519473600000, 9757.0, 9839.0, 9556.0, 9752.07, 7026.974278], [1519488000000, 9751.62, 9821.96, 9515.0, 9570.0, 4626.454142], [1519502400000, 9570.0, 9737.0, 9352.0, 9694.51, 6238.25699], [1519516800000, 9694.51, 9779.0, 9487.0, 9559.01, 4066.783949], [1519531200000, 9558.78, 9847.0, 9534.5, 9727.3, 4408.057991], [1519545600000, 9722.64, 9787.6, 9534.82, 9665.99, 4486.209142], [1519560000000, 9663.98, 9700.0, 9300.0, 9390.0, 6595.834012], [1519574400000, 9390.0, 9512.0, 9274.8, 9473.09, 4783.952065], [1519588800000, 9470.75, 9670.0, 9432.34, 9590.0, 4032.680427], [1519603200000, 9590.0, 9754.98, 9510.06, 9590.0, 3768.864611], [1519617600000, 9584.72, 9676.0, 9379.01, 9454.49, 3687.885506], [1519632000000, 9454.49, 9745.83, 9350.0, 9715.99, 5066.728387], [1519646400000, 9708.0, 10344.0, 9640.01, 10260.92, 12005.286862], [1519660800000, 10261.0, 10400.0, 10121.0, 10238.62, 5706.657581], [1519675200000, 10235.94, 10444.32, 10160.0, 10324.0, 4642.869809], [1519689600000, 10321.0, 10419.7, 10121.0, 10270.0, 4556.642466], [1519704000000, 10270.0, 10650.0, 10217.0, 10600.0, 5191.21605], [1519718400000, 10600.0, 10780.0, 10556.91, 10695.0, 6876.349645], [1519732800000, 10698.97, 10870.0, 10463.18, 10568.01, 7593.743082], [1519747200000, 10570.0, 10769.0, 10559.32, 10697.0, 3408.705254], [1519761600000, 10697.0, 10792.4, 10560.01, 10569.04, 3078.728626], [1519776000000, 10584.33, 10977.95, 10551.0, 10919.9, 4494.997217], [1519790400000, 10915.03, 11098.0, 10669.0, 10748.86, 7095.42371], [1519804800000, 10741.01, 10828.0, 10476.28, 10570.95, 6099.791437], [1519819200000, 10574.13, 10619.35, 10375.54, 10506.85, 4978.684008], [1519833600000, 10505.0, 10570.89, 10400.0, 10560.02, 3348.343326], [1519848000000, 10563.79, 10722.0, 10300.0, 10326.76, 4783.744084], [1519862400000, 10325.64, 10464.99, 10240.0, 10356.03, 3901.729532], [1519876800000, 10356.01, 10592.85, 10335.96, 10549.33, 3245.157625], [1519891200000, 10549.96, 10745.0, 10549.96, 10671.93, 3990.376894], [1519905600000, 10671.93, 10831.0, 10591.16, 10717.0, 4580.854208], [1519920000000, 10717.0, 10945.0, 10700.01, 10880.0, 3897.41721], [1519934400000, 10880.0, 11060.41, 10789.26, 10920.0, 5477.018461], [1519948800000, 10923.36, 11200.0, 10920.0, 11117.97, 5895.815624], [1519963200000, 11117.97, 11159.01, 10901.01, 11080.42, 4372.756546], [1519977600000, 11080.42, 11139.1, 10826.52, 10898.95, 4214.44968], [1519992000000, 10898.95, 11050.0, 10770.0, 10855.34, 3711.743908], [1520006400000, 10855.0, 10950.0, 10780.0, 10937.0, 2406.192253], [1520020800000, 10937.0, 11130.0, 10890.81, 11039.0, 3309.752079], [1520035200000, 11038.99, 11396.7, 11015.01, 11324.0, 4821.320872], [1520049600000, 11320.0, 11415.16, 11301.1, 11317.0, 3312.115747], [1520064000000, 11317.0, 11382.32, 11245.5, 11287.21, 3328.415959], [1520078400000, 11287.21, 11530.0, 11287.0, 11483.77, 3819.506904], [1520092800000, 11477.02, 11544.0, 11452.0, 11505.21, 2376.83206], [1520107200000, 11510.0, 11526.0, 11268.0, 11464.48, 3628.961738], [1520121600000, 11464.47, 11470.0, 11129.49, 11163.0, 3539.376016], [1520136000000, 11163.0, 11259.71, 11050.02, 11140.3, 3163.335629], [1520150400000, 11142.01, 11273.7, 11080.97, 11159.68, 2222.940026], [1520164800000, 11159.68, 11259.0, 11090.01, 11150.01, 2035.650843], [1520179200000, 11150.0, 11429.99, 11125.92, 11378.89, 3231.81579], [1520193600000, 11378.19, 11565.0, 11361.69, 11515.0, 3102.800349], [1520208000000, 11515.0, 11589.0, 11415.01, 11568.03, 2248.094776], [1520222400000, 11558.47, 11608.0, 11458.43, 11539.87, 2502.641392], [1520236800000, 11539.87, 11556.57, 11435.0, 11515.0, 2184.873611], [1520251200000, 11515.0, 11585.53, 11441.78, 11515.61, 2341.969551], [1520265600000, 11515.62, 11680.0, 11489.97, 11669.08, 2533.355187], [1520280000000, 11666.0, 11710.0, 11454.0, 11454.0, 3333.296546], [1520294400000, 11455.0, 11455.0, 11181.5, 11280.01, 5168.748613], [1520308800000, 11280.01, 11360.0, 11229.8, 11270.0, 2469.657427], [1520323200000, 11275.11, 11333.0, 10840.01, 10937.0, 6299.689292], [1520337600000, 10936.0, 11046.24, 10777.78, 10966.0, 5250.521463], [1520352000000, 10974.08, 11013.5, 10555.48, 10707.0, 6073.660496], [1520366400000, 10707.0, 10839.0, 10566.0, 10716.48, 4253.295072], [1520380800000, 10716.48, 10899.0, 10660.0, 10724.99, 3790.751942], [1520395200000, 10724.98, 10830.01, 10400.0, 10510.0, 5354.090536], [1520409600000, 10509.99, 10635.03, 10411.11, 10635.03, 4080.911191], [1520424000000, 10635.6, 10747.88, 10502.76, 10679.56, 5597.000716], [1520438400000, 10679.56, 10716.66, 9389.31, 9844.18, 24387.590634], [1520452800000, 9837.84, 10138.04, 9707.07, 9910.0, 7437.326061], [1520467200000, 9910.0, 10037.99, 9470.0, 9500.0, 7536.442501], [1520481600000, 9508.0, 9991.0, 9489.39, 9936.98, 5008.093269], [1520496000000, 9936.98, 10099.0, 9820.0, 9910.09, 4586.879647], [1520510400000, 9902.98, 9968.75, 9624.0, 9909.29, 5340.811382], [1520524800000, 9909.3, 9914.96, 9060.0, 9357.86, 13329.056391], [1520539200000, 9349.04, 9471.0, 9182.41, 9271.64, 5308.190036], [1520553600000, 9267.07, 9410.0, 8835.37, 8953.01, 9488.929812], [1520568000000, 8953.01, 8960.0, 8329.0, 8686.43, 17058.985447], [1520582400000, 8685.0, 8948.0, 8388.0, 8923.0, 9812.884542], [1520596800000, 8933.91, 9165.18, 8822.99, 8927.0, 9669.80194], [1520611200000, 8925.93, 9049.01, 8630.0, 8770.0, 8803.719739], [1520625600000, 8770.01, 9333.33, 8704.31, 9227.0, 9277.969927], [1520640000000, 9230.0, 9400.79, 9073.66, 9210.0, 7883.405519], [1520654400000, 9210.0, 9490.0, 9174.44, 9327.43, 5768.10053], [1520668800000, 9327.43, 9403.09, 9150.1, 9345.0, 4155.68305], [1520683200000, 9345.0, 9468.88, 9180.7, 9346.14, 5062.819928], [1520697600000, 9340.0, 9418.17, 8947.27, 9089.93, 7045.550302], [1520712000000, 9089.93, 9092.3, 8667.07, 8770.22, 7264.453528], [1520726400000, 8770.22, 8774.76, 8450.0, 8617.0, 8255.546821], [1520740800000, 8617.0, 8844.07, 8568.1, 8704.0, 4267.178518], [1520755200000, 8700.0, 9100.66, 8532.38, 9027.68, 5112.719233], [1520769600000, 9025.03, 9335.0, 9015.11, 9036.04, 9700.010888], [1520784000000, 9049.96, 9711.0, 9037.01, 9639.57, 9947.231726], [1520798400000, 9637.0, 9740.0, 9431.26, 9533.57, 7043.2862], [1520812800000, 9533.57, 9713.0, 9356.02, 9416.09, 5472.440203], [1520827200000, 9416.09, 9688.0, 9370.05, 9599.92, 4184.352807], [1520841600000, 9599.92, 9888.88, 9512.0, 9837.03, 5701.1611], [1520856000000, 9837.04, 9838.0, 9110.0, 9170.01, 10701.285763], [1520870400000, 9174.22, 9309.57, 8850.0, 8927.0, 9329.071839], [1520884800000, 8934.99, 9234.07, 8780.0, 9131.34, 6842.466218], [1520899200000, 9131.34, 9264.1, 8933.0, 9037.71, 4849.518794], [1520913600000, 9037.72, 9474.0, 9012.9, 9205.17, 7727.497386], [1520928000000, 9205.17, 9349.0, 8870.0, 9044.9, 7829.727089], [1520942400000, 9049.47, 9250.0, 8823.0, 9051.0, 8753.866172], [1520956800000, 9060.93, 9275.0, 8941.45, 9069.3, 6899.609979], [1520971200000, 9072.57, 9249.99, 9000.0, 9150.0, 4131.189938], [1520985600000, 9151.92, 9333.78, 9137.0, 9249.93, 4204.115104], [1521000000000, 9249.94, 9251.0, 9050.0, 9079.92, 3851.038065], [1521014400000, 9067.09, 9129.99, 8631.78, 8675.08, 8888.803578], [1521028800000, 8675.08, 8791.49, 8570.0, 8725.83, 7265.584851], [1521043200000, 8718.0, 8726.82, 8201.0, 8285.97, 12877.938984], [1521057600000, 8285.97, 8340.64, 7900.28, 8170.0, 12620.613526], [1521072000000, 8184.01, 8250.0, 7717.0, 7870.15, 9398.447341], [1521086400000, 7870.15, 7950.36, 7650.0, 7888.94, 8941.144628], [1521100800000, 7887.19, 8299.0, 7790.73, 8235.0, 9841.891737], [1521115200000, 8235.0, 8430.0, 7925.15, 8099.0, 11181.237313], [1521129600000, 8098.76, 8310.0, 7943.9, 8203.03, 7549.23784], [1521144000000, 8210.0, 8363.21, 8129.79, 8240.98, 5379.063418], [1521158400000, 8240.98, 8324.96, 7900.0, 8040.74, 7647.392915], [1521172800000, 8040.74, 8287.0, 8026.0, 8233.0, 5280.866649], [1521187200000, 8233.0, 8280.0, 8060.0, 8192.94, 5219.538547], [1521201600000, 8182.07, 8598.77, 8139.02, 8539.0, 10498.155063], [1521216000000, 8539.0, 8611.64, 8431.01, 8536.17, 5537.336921], [1521230400000, 8536.17, 8566.08, 8257.2, 8260.0, 4632.119798], [1521244800000, 8260.0, 8322.49, 8078.0, 8199.92, 5709.067537], [1521259200000, 8199.91, 8233.0, 8082.5, 8186.02, 3507.904094], [1521273600000, 8197.7, 8348.62, 8145.62, 8158.0, 3754.301456], [1521288000000, 8158.01, 8177.93, 7852.2, 7887.11, 8102.115441], [1521302400000, 7887.99, 7968.0, 7721.99, 7820.0, 5850.49554], [1521316800000, 7820.0, 8050.0, 7745.18, 7824.8, 6186.322261], [1521331200000, 7824.01, 7857.24, 7539.99, 7666.35, 8470.532213], [1521345600000, 7666.33, 7771.0, 7519.84, 7659.99, 5540.629703], [1521360000000, 7659.0, 7810.97, 7532.09, 7760.09, 6547.557541], [1521374400000, 7761.19, 7829.0, 7322.0, 7385.0, 11808.681598], [1521388800000, 7385.0, 7584.0, 7330.0, 7463.53, 8959.14227], [1521403200000, 7473.86, 8317.4, 7453.59, 8189.99, 18161.688386], [1521417600000, 8189.0, 8456.0, 8088.4, 8169.25, 10823.59039], [1521432000000, 8157.01, 8367.97, 8140.54, 8289.01, 5991.251674], [1521446400000, 8292.92, 8400.81, 8089.0, 8330.0, 8139.868307], [1521460800000, 8330.0, 8705.23, 8205.01, 8550.0, 13290.612059], [1521475200000, 8550.0, 8630.0, 8230.7, 8395.81, 10646.049622], [1521489600000, 8395.0, 8630.07, 8360.26, 8600.0, 6405.71289], [1521504000000, 8595.01, 8667.0, 8410.0, 8599.97, 6948.18634], [1521518400000, 8600.0, 8600.0, 8340.0, 8385.12, 5511.862872], [1521532800000, 8385.12, 8555.0, 8280.0, 8516.0, 7178.231295], [1521547200000, 8517.44, 8600.0, 8429.0, 8513.97, 5499.462971], [1521561600000, 8513.97, 8968.95, 8513.88, 8950.0, 11531.493556], [1521576000000, 8950.0, 9050.0, 8810.96, 8909.98, 8195.868801], [1521590400000, 8909.96, 9078.0, 8860.01, 9042.23, 4794.434588], [1521604800000, 9042.23, 9145.3, 8900.0, 8931.01, 6513.587683], [1521619200000, 8931.0, 9125.0, 8880.0, 9063.0, 5159.890997], [1521633600000, 9063.0, 9177.01, 8956.0, 9039.99, 6219.6322], [1521648000000, 9039.99, 9069.99, 8750.6, 8862.92, 12399.097022], [1521662400000, 8862.78, 8950.0, 8777.0, 8885.0, 4885.762881], [1521676800000, 8884.82, 9100.0, 8860.0, 9017.01, 4895.746559], [1521691200000, 9019.0, 9052.9, 8889.0, 8955.09, 4039.909831], [1521705600000, 8955.0, 9020.0, 8620.0, 8642.01, 9948.359931], [1521720000000, 8645.0, 8753.54, 8465.1, 8611.51, 10838.980344], [1521734400000, 8611.51, 8695.28, 8534.0, 8610.99, 6405.5107], [1521748800000, 8610.0, 8770.0, 8510.2, 8722.9, 4489.049444], [1521763200000, 8720.0, 8729.5, 8330.0, 8410.05, 7687.349493], [1521777600000, 8400.65, 8505.0, 8345.0, 8398.65, 5832.449112], [1521792000000, 8398.58, 8554.0, 8378.03, 8510.0, 5424.025879], [1521806400000, 8509.99, 8687.98, 8269.0, 8613.0, 9105.730019], [1521820800000, 8618.0, 8749.5, 8559.25, 8623.99, 6608.134124], [1521835200000, 8623.99, 8909.0, 8559.25, 8898.03, 5333.319039], [1521849600000, 8898.04, 8969.0, 8805.01, 8880.02, 5767.246862], [1521864000000, 8885.95, 8987.97, 8834.29, 8930.0, 5220.096493], [1521878400000, 8931.7, 8931.89, 8683.0, 8723.0, 5530.616757], [1521892800000, 8723.0, 8999.95, 8666.3, 8950.0, 6109.898025], [1521907200000, 8950.0, 8954.63, 8822.91, 8892.56, 4409.572139], [1521921600000, 8884.08, 8968.0, 8491.0, 8546.86, 8429.179296], [1521936000000, 8531.25, 8599.0, 8433.93, 8555.58, 5868.930479], [1521950400000, 8550.0, 8592.59, 8379.23, 8466.53, 3770.175611], [1521964800000, 8468.85, 8575.0, 8365.77, 8407.0, 4557.508247], [1521979200000, 8408.0, 8643.0, 8380.41, 8480.0, 5602.678334], [1521993600000, 8480.0, 8669.85, 8470.99, 8612.09, 4708.767301], [1522008000000, 8620.97, 8645.53, 8388.0, 8470.15, 4493.709344], [1522022400000, 8470.14, 8514.89, 8353.18, 8440.92, 3711.303435], [1522036800000, 8440.92, 8491.25, 8364.57, 8405.88, 3229.887556], [1522051200000, 8400.5, 8426.99, 8050.0, 8089.0, 10515.504264], [1522065600000, 8089.0, 8165.0, 8000.01, 8057.16, 8263.730707], [1522080000000, 8057.16, 8099.04, 7850.01, 7910.03, 9370.047235], [1522094400000, 7910.04, 8268.5, 7831.0, 8134.23, 8943.122463], [1522108800000, 8134.22, 8215.94, 7820.0, 7866.42, 7158.88371], [1522123200000, 7866.42, 8050.05, 7730.0, 7917.09, 7293.510217], [1522137600000, 7917.09, 8040.0, 7820.0, 7934.22, 5213.617976], [1522152000000, 7932.2, 8150.17, 7878.58, 8066.87, 6454.949872], [1522166400000, 8066.5, 8126.03, 7820.0, 7886.0, 6178.641673], [1522180800000, 7886.0, 8050.0, 7755.58, 7795.51, 5128.044602], [1522195200000, 7795.51, 7885.0, 7728.0, 7874.98, 4358.75463], [1522209600000, 7870.05, 7965.6, 7811.02, 7873.99, 3776.079508], [1522224000000, 7865.0, 8109.0, 7852.0, 8040.0, 5487.99329], [1522238400000, 8040.0, 8055.99, 7825.0, 7860.01, 6066.091633], [1522252800000, 7860.21, 7952.44, 7843.5, 7899.94, 3359.364958], [1522267200000, 7890.63, 8009.0, 7836.0, 7949.3, 3353.047651], [1522281600000, 7949.3, 7975.0, 7855.0, 7880.94, 3197.762612], [1522296000000, 7870.12, 7880.95, 7500.0, 7541.98, 11418.663322], [1522310400000, 7541.98, 7587.0, 7425.4, 7466.97, 6826.531776], [1522324800000, 7466.89, 7566.0, 7334.0, 7474.01, 7764.599722], [1522339200000, 7481.94, 7580.0, 7338.0, 7341.0, 6613.011441], [1522353600000, 7341.0, 7388.33, 6941.11, 7090.14, 18800.346252], [1522368000000, 7090.16, 7165.08, 6740.0, 6861.01, 15024.917622], [1522382400000, 6867.19, 7272.78, 6666.66, 7222.25, 14399.661203], [1522396800000, 7222.29, 7292.43, 6880.0, 7027.72, 8153.319317], [1522411200000, 7027.73, 7040.01, 6679.01, 6839.98, 9738.217748], [1522425600000, 6839.97, 6911.69, 6600.1, 6800.63, 11291.739424], [1522440000000, 6816.58, 6951.0, 6735.0, 6840.23, 6698.176662], [1522454400000, 6840.24, 7120.0, 6837.71, 6959.02, 7290.175528], [1522468800000, 6954.06, 7050.0, 6777.0, 6805.76, 5742.157084], [1522483200000, 6810.0, 7148.2, 6805.77, 7073.63, 7231.156196], [1522497600000, 7079.72, 7223.36, 6978.98, 7064.98, 6698.106344], [1522512000000, 7063.83, 7172.0, 6985.0, 7048.23, 4818.351356], [1522526400000, 7054.99, 7059.01, 6842.97, 6923.91, 5088.592579], [1522540800000, 6922.0, 7049.98, 6892.0, 6922.12, 3229.309898], [1522555200000, 6926.0, 6969.0, 6670.0, 6713.81, 5586.243399], [1522569600000, 6713.81, 6775.0, 6623.97, 6685.1, 5763.285536], [1522584000000, 6688.53, 6735.0, 6430.0, 6445.0, 9420.821522], [1522598400000, 6445.0, 6961.83, 6432.65, 6900.99, 14864.233984], [1522612800000, 6900.98, 6955.0, 6753.0, 6813.01, 5207.536124], [1522627200000, 6813.01, 7020.0, 6765.0, 6980.72, 5723.203979], [1522641600000, 6982.44, 7102.02, 6833.0, 7060.22, 5541.155869], [1522656000000, 7065.01, 7125.0, 7007.72, 7046.01, 5499.032431], [1522670400000, 7046.0, 7061.4, 6873.32, 7020.72, 6365.096457], [1522684800000, 7020.72, 7048.89, 6941.0, 6989.8, 4484.638326], [1522699200000, 6989.8, 7070.0, 6890.0, 7056.0, 4510.43301], [1522713600000, 7063.97, 7188.99, 7011.01, 7180.01, 5189.873845], [1522728000000, 7183.01, 7447.99, 7180.01, 7395.0, 8721.105857], [1522742400000, 7396.94, 7422.63, 7252.0, 7307.48, 6336.407365], [1522756800000, 7302.03, 7432.4, 7277.0, 7370.01, 5993.20276], [1522771200000, 7370.01, 7520.0, 7353.0, 7467.11, 6590.650154], [1522785600000, 7467.12, 7499.0, 7345.0, 7405.21, 4956.09183], [1522800000000, 7405.21, 7427.52, 7223.0, 7295.71, 6660.71076], [1522814400000, 7295.72, 7382.31, 7261.41, 7304.31, 4074.91667], [1522828800000, 7304.26, 7338.0, 7001.0, 7058.0, 9403.694618], [1522843200000, 7055.0, 7123.98, 6766.0, 6785.0, 9731.867818], [1522857600000, 6785.0, 6918.0, 6721.0, 6854.41, 7450.397153], [1522872000000, 6857.86, 6900.0, 6707.0, 6796.1, 4905.596785], [1522886400000, 6796.1, 6825.0, 6566.69, 6776.99, 7639.141115], [1522900800000, 6776.99, 6870.0, 6709.0, 6792.52, 7280.081403], [1522915200000, 6792.49, 6902.0, 6750.0, 6779.0, 5739.609481], [1522929600000, 6778.99, 6899.0, 6612.11, 6749.53, 8966.534852], [1522944000000, 6747.99, 6800.0, 6660.0, 6760.96, 5184.304428], [1522958400000, 6760.96, 6840.0, 6671.0, 6770.76, 4220.060181], [1522972800000, 6770.0, 6850.0, 6718.0, 6760.0, 4119.84768], [1522987200000, 6755.24, 6848.0, 6529.68, 6622.05, 7606.178735], [1523001600000, 6621.04, 6657.86, 6500.0, 6600.0, 5573.380095], [1523016000000, 6600.0, 6634.88, 6540.0, 6580.01, 3969.825532], [1523030400000, 6583.0, 6627.0, 6565.83, 6618.39, 3265.189929], [1523044800000, 6618.37, 6622.72, 6516.67, 6601.39, 2920.589949], [1523059200000, 6601.39, 6880.0, 6586.28, 6864.32, 7085.555763], [1523073600000, 6866.52, 6888.0, 6818.0, 6864.08, 4551.575109], [1523088000000, 6864.08, 6929.86, 6821.0, 6862.04, 4586.755119], [1523102400000, 6862.04, 7033.99, 6760.0, 7010.0, 6478.288394], [1523116800000, 7003.98, 7070.0, 6952.05, 6988.99, 5820.455514], [1523131200000, 6988.99, 7019.56, 6850.01, 6895.8, 3746.948368], [1523145600000, 6895.81, 6987.15, 6880.0, 6964.98, 2743.594948], [1523160000000, 6960.11, 7050.0, 6891.79, 6939.0, 3098.422691], [1523174400000, 6939.0, 7100.0, 6924.3, 7099.85, 4807.767119], [1523188800000, 7100.0, 7109.13, 7019.09, 7049.93, 4124.306468], [1523203200000, 7047.01, 7049.93, 6937.03, 6994.42, 4096.421355], [1523217600000, 6989.97, 7053.09, 6942.84, 7018.0, 2557.160584], [1523232000000, 7011.04, 7165.21, 7011.02, 7131.85, 5554.406668], [1523246400000, 7131.78, 7160.0, 7084.0, 7125.0, 3480.926867], [1523260800000, 7129.79, 7185.0, 6691.18, 6745.0, 10472.414195], [1523275200000, 6740.0, 6792.0, 6676.5, 6738.98, 6897.798888], [1523289600000, 6738.98, 6767.99, 6650.01, 6672.08, 3585.052946], [1523304000000, 6677.04, 6795.0, 6611.0, 6782.72, 4087.697642], [1523318400000, 6781.55, 6809.55, 6706.02, 6805.63, 3012.564353], [1523332800000, 6808.68, 6820.0, 6670.25, 6715.51, 4122.801898], [1523347200000, 6717.32, 6788.62, 6656.0, 6735.0, 3672.968597], [1523361600000, 6735.0, 6870.99, 6719.91, 6837.54, 4525.573807], [1523376000000, 6835.65, 6874.0, 6809.6, 6844.93, 3554.337124], [1523390400000, 6844.93, 6890.0, 6768.01, 6843.9, 3438.482316], [1523404800000, 6839.56, 6872.71, 6800.0, 6818.79, 3379.431426], [1523419200000, 6818.79, 6867.4, 6787.0, 6846.89, 3131.710363], [1523433600000, 6846.89, 6869.34, 6800.0, 6851.97, 3744.032054], [1523448000000, 6851.53, 6990.0, 6840.0, 6927.06, 5487.956924], [1523462400000, 6927.06, 6936.0, 6862.6, 6910.63, 4428.538273], [1523476800000, 6914.97, 6987.41, 6878.14, 6953.79, 3826.202137], [1523491200000, 6953.78, 6980.0, 6885.0, 6965.2, 4364.29207], [1523505600000, 6965.21, 6985.0, 6743.2, 6826.61, 7045.780971], [1523520000000, 6826.62, 8012.23, 6802.7, 7690.0, 20236.744596], [1523534400000, 7685.55, 7780.0, 7569.83, 7614.21, 16124.313056], [1523548800000, 7618.0, 7775.0, 7542.0, 7700.0, 8247.474601], [1523563200000, 7699.97, 7986.1, 7694.05, 7923.0, 8842.990693], [1523577600000, 7922.99, 7994.96, 7732.0, 7832.99, 7908.426777], [1523592000000, 7832.99, 8195.84, 7751.0, 8093.01, 8485.713889], [1523606400000, 8100.0, 8170.0, 8005.0, 8091.0, 10628.535919], [1523620800000, 8091.4, 8233.39, 8013.27, 8125.0, 10318.288215], [1523635200000, 8125.41, 8168.0, 8050.0, 8094.0, 5340.219668], [1523649600000, 8093.82, 8109.9, 7768.47, 7877.41, 12363.33868], [1523664000000, 7877.48, 8095.0, 7810.0, 8044.66, 6235.107531], [1523678400000, 8044.67, 8186.0, 7935.15, 8127.74, 5787.755607], [1523692800000, 8129.99, 8175.0, 7915.0, 7965.32, 5698.798761], [1523707200000, 7965.0, 7993.99, 7849.46, 7955.01, 6347.671468], [1523721600000, 7955.02, 8046.63, 7917.0, 8022.0, 3868.61951], [1523736000000, 8022.0, 8090.23, 7941.0, 7999.01, 3683.33348], [1523750400000, 8004.0, 8133.0, 7999.02, 8083.99, 4295.498765], [1523764800000, 8084.0, 8150.0, 8050.0, 8074.99, 3247.419262], [1523779200000, 8074.91, 8429.54, 8072.1, 8330.0, 7405.711162], [1523793600000, 8330.0, 8380.0, 8230.0, 8269.99, 6304.811663], [1523808000000, 8269.0, 8349.0, 8254.95, 8300.01, 3614.589015], [1523822400000, 8305.55, 8365.87, 8277.57, 8355.0, 3078.690577], [1523836800000, 8355.07, 8419.0, 8076.19, 8146.9, 8509.152205], [1523851200000, 8144.73, 8151.0, 8000.0, 8110.0, 6751.278606], [1523865600000, 8110.21, 8138.53, 8016.33, 8086.0, 4816.139406], [1523880000000, 8086.0, 8087.11, 7867.0, 7971.99, 8586.094538], [1523894400000, 7971.98, 8056.0, 7924.65, 7983.99, 4672.134093], [1523908800000, 7983.97, 8086.01, 7935.99, 8064.92, 3329.270867], [1523923200000, 8064.92, 8083.61, 7956.17, 8045.78, 4034.363915], [1523937600000, 8049.9, 8172.76, 7960.0, 8138.45, 5071.342645], [1523952000000, 8143.72, 8173.7, 8064.52, 8124.87, 5426.339368], [1523966400000, 8124.87, 8156.0, 8051.0, 8088.63, 5004.789372], [1523980800000, 8088.63, 8134.0, 7836.4, 7874.01, 7112.791273], [1523995200000, 7874.0, 7951.49, 7825.4, 7885.02, 5502.976994], [1524009600000, 7890.96, 7979.0, 7868.07, 7947.71, 2895.64838], [1524024000000, 7947.74, 8149.89, 7868.0, 8107.23, 5703.816045], [1524038400000, 8113.51, 8120.0, 8067.02, 8103.0, 3931.823449], [1524052800000, 8104.0, 8117.81, 7931.01, 7994.0, 4710.532763], [1524067200000, 7994.0, 8149.78, 7985.01, 8116.65, 4444.479051], [1524081600000, 8116.01, 8236.43, 8097.0, 8173.0, 5282.744882], [1524096000000, 8173.99, 8290.0, 8100.0, 8185.0, 5338.764557], [1524110400000, 8184.99, 8249.0, 8080.0, 8166.97, 5047.478998], [1524124800000, 8166.97, 8259.0, 8143.02, 8207.01, 4884.574886], [1524139200000, 8207.0, 8270.0, 8171.56, 8239.02, 4169.126046], [1524153600000, 8235.45, 8296.0, 8230.01, 8249.95, 4177.753475], [1524168000000, 8249.95, 8294.99, 8189.0, 8278.0, 3496.149502], [1524182400000, 8273.84, 8398.0, 8270.32, 8331.03, 5703.375858], [1524196800000, 8331.3, 8348.98, 8177.09, 8319.97, 7471.786145], [1524211200000, 8319.92, 8540.37, 8267.01, 8515.01, 7561.731077], [1524225600000, 8515.0, 8577.9, 8431.86, 8459.99, 6055.74956], [1524240000000, 8458.0, 8539.63, 8446.0, 8518.0, 3722.005417], [1524254400000, 8518.0, 8930.0, 8490.0, 8856.98, 9280.689428], [1524268800000, 8852.12, 8928.0, 8730.0, 8862.0, 6720.957375], [1524283200000, 8858.0, 9035.0, 8839.99, 8874.88, 5496.565855], [1524297600000, 8874.87, 8888.0, 8565.0, 8700.0, 13840.663098], [1524312000000, 8700.01, 8846.63, 8680.0, 8828.2, 6781.075882], [1524326400000, 8828.13, 8874.0, 8706.5, 8792.47, 4427.736432], [1524340800000, 8792.47, 8930.0, 8707.0, 8915.31, 3605.231267], [1524355200000, 8915.31, 8915.33, 8786.8, 8811.0, 3652.42334], [1524369600000, 8814.0, 8904.99, 8794.62, 8875.0, 2768.939103], [1524384000000, 8875.0, 9020.0, 8862.22, 8916.01, 5946.718669], [1524398400000, 8916.01, 8998.0, 8768.79, 8940.67, 6698.698507], [1524412800000, 8940.67, 9020.67, 8850.0, 8881.0, 5135.032266], [1524427200000, 8881.0, 8928.0, 8727.68, 8787.02, 5256.441595], [1524441600000, 8785.7, 8888.0, 8745.0, 8861.52, 4113.061677], [1524456000000, 8861.52, 8970.01, 8821.01, 8942.39, 4592.404378], [1524470400000, 8942.0, 8957.04, 8831.0, 8910.02, 4925.659221], [1524484800000, 8910.02, 8985.0, 8858.08, 8898.0, 4985.305397], [1524499200000, 8898.0, 8938.21, 8800.6, 8847.37, 4009.370065], [1524513600000, 8847.37, 8949.98, 8825.01, 8934.01, 3212.313971], [1524528000000, 8934.0, 9230.15, 8922.0, 9192.47, 8920.526725], [1524542400000, 9192.48, 9300.0, 9177.0, 9216.0, 6142.367244], [1524556800000, 9217.98, 9349.0, 9216.0, 9294.57, 5552.908104], [1524571200000, 9294.59, 9420.0, 9155.0, 9347.77, 9491.188008], [1524585600000, 9347.78, 9455.0, 9293.29, 9449.9, 6519.494725], [1524600000000, 9452.0, 9731.01, 9400.04, 9619.99, 9642.3053], [1524614400000, 9618.96, 9759.82, 9323.02, 9347.99, 14015.352774], [1524628800000, 9349.99, 9500.0, 9110.0, 9416.39, 15935.464097], [1524643200000, 9415.0, 9438.54, 8960.0, 9144.03, 15412.11236], [1524657600000, 9137.0, 9210.21, 8730.0, 8972.09, 18176.961159], [1524672000000, 8972.09, 9089.0, 8846.0, 8969.98, 8529.012792], [1524686400000, 8969.55, 9185.01, 8770.0, 8869.99, 9041.134407], [1524700800000, 8869.99, 8899.0, 8660.0, 8808.02, 8897.684095], [1524715200000, 8812.7, 8977.0, 8771.0, 8847.97, 7692.143561], [1524729600000, 8847.97, 8917.51, 8651.62, 8857.01, 8018.565053], [1524744000000, 8858.51, 8945.0, 8740.01, 8806.1, 5701.623367], [1524758400000, 8806.1, 8925.0, 8775.89, 8881.54, 3963.192355], [1524772800000, 8880.0, 9307.48, 8880.0, 9266.0, 9027.095814], [1524787200000, 9267.03, 9297.0, 9123.25, 9143.01, 6271.10797], [1524801600000, 9143.01, 9265.7, 9104.88, 9240.97, 5121.255522], [1524816000000, 9240.97, 9395.0, 9230.0, 9309.0, 6239.525132], [1524830400000, 9308.9, 9355.0, 9150.1, 9241.21, 6595.466958], [1524844800000, 9241.2, 9328.26, 9075.01, 9089.0, 5616.834765], [1524859200000, 9089.12, 9163.38, 8889.0, 8915.35, 7397.156689], [1524873600000, 8915.35, 9196.32, 8870.0, 9155.0, 5459.606495], [1524888000000, 9155.01, 9215.66, 9108.99, 9126.22, 4402.856243], [1524902400000, 9121.05, 9330.0, 9081.02, 9289.98, 5449.677882]], "8h": [[1510444800000, 6245.05, 6310.0, 5325.01, 6060.0, 2390.026627], [1510473600000, 6089.77, 6630.0, 5784.22, 6200.02, 1686.29828], [1510502400000, 6219.8, 6219.96, 5600.0, 5811.03, 892.158162], [1510531200000, 5839.94, 6350.0, 5699.99, 6196.66, 943.89903], [1510560000000, 6200.14, 6697.47, 6150.33, 6589.99, 1017.869468], [1510588800000, 6582.01, 6599.61, 6190.0, 6465.99, 659.474541], [1510617600000, 6465.99, 6684.98, 6465.99, 6545.33, 491.559998], [1510646400000, 6545.33, 6563.08, 6311.07, 6436.0, 508.950024], [1510675200000, 6430.0, 6593.0, 6391.0, 6574.99, 253.782509], [1510704000000, 6575.99, 6908.0, 6575.99, 6850.23, 604.62428], [1510732800000, 6850.23, 7248.0, 6825.0, 7245.0, 634.429266], [1510761600000, 7248.98, 7298.0, 7057.0, 7240.06, 540.552299], [1510790400000, 7240.14, 7390.0, 7076.0, 7369.99, 419.78883], [1510819200000, 7369.99, 7546.7, 7313.0, 7427.0, 975.162346], [1510848000000, 7427.01, 7940.0, 7393.38, 7864.5, 937.005574], [1510876800000, 7876.98, 7989.0, 7472.31, 7498.0, 1277.303394], [1510905600000, 7497.98, 7948.99, 7451.0, 7928.96, 1404.313039], [1510934400000, 7928.96, 7950.0, 7608.0, 7699.19, 1300.779492], [1510963200000, 7680.01, 7699.96, 7422.0, 7674.97, 1317.784093], [1510992000000, 7674.97, 7759.48, 7602.02, 7676.09, 1245.310067], [1511020800000, 7676.81, 7819.99, 7603.0, 7761.94, 1391.172317], [1511049600000, 7761.94, 7818.93, 7650.33, 7690.01, 1125.666684], [1511078400000, 7690.06, 7789.24, 7675.62, 7750.02, 1257.819318], [1511107200000, 7750.06, 8123.15, 7737.17, 8038.0, 1483.854442], [1511136000000, 8057.11, 8083.49, 7954.0, 8014.01, 1247.462535], [1511164800000, 8014.02, 8239.98, 8014.01, 8217.31, 1350.819677], [1511193600000, 8217.98, 8319.99, 8177.3, 8212.0, 1288.352136], [1511222400000, 8212.49, 8290.0, 7801.0, 8165.55, 2109.81899], [1511251200000, 8165.38, 8400.0, 8125.0, 8370.01, 1383.480916], [1511280000000, 8383.44, 8384.98, 8070.0, 8119.51, 1051.17411], [1511308800000, 8091.09, 8289.94, 8091.09, 8289.88, 1169.05293], [1511337600000, 8289.89, 8322.68, 8108.0, 8205.02, 1514.01215], [1511366400000, 8200.54, 8258.73, 8108.0, 8205.92, 861.94063], [1511395200000, 8233.03, 8260.0, 8130.0, 8140.0, 1251.477464], [1511424000000, 8139.98, 8197.35, 8031.01, 8168.12, 1650.016498], [1511452800000, 8167.31, 8200.0, 8000.0, 8019.99, 1192.458725], [1511481600000, 8019.97, 8280.0, 7850.0, 8280.0, 1331.373645], [1511510400000, 8262.02, 8369.0, 7950.0, 8110.02, 2104.672853], [1511539200000, 8110.02, 8250.0, 8090.62, 8138.0, 975.742614], [1511568000000, 8138.99, 8296.83, 8090.0, 8280.89, 1275.981765], [1511596800000, 8280.0, 8550.55, 8276.0, 8542.99, 1631.600384], [1511625600000, 8542.98, 8734.78, 8500.0, 8700.01, 1385.041533], [1511654400000, 8700.04, 8978.9, 8604.72, 8864.0, 1307.632409], [1511683200000, 8884.0, 9078.0, 8786.45, 9075.01, 1417.307305], [1511712000000, 9078.0, 9350.0, 8952.04, 9128.02, 1422.440523], [1511740800000, 9128.0, 9645.55, 9112.04, 9645.55, 1421.34186], [1511769600000, 9640.02, 9654.28, 9166.0, 9568.94, 1745.56385], [1511798400000, 9567.99, 9650.0, 9355.01, 9650.0, 1354.719997], [1511827200000, 9650.0, 9869.84, 9570.5, 9817.0, 1500.754269], [1511856000000, 9816.98, 9939.0, 9658.0, 9822.33, 1979.934193], [1511884800000, 9833.98, 9925.0, 9820.12, 9896.8, 1436.522523], [1511913600000, 9896.79, 10800.0, 9873.68, 10429.98, 2663.794176], [1511942400000, 10429.98, 11300.03, 10326.05, 10770.89, 3745.252276], [1511971200000, 10764.49, 10975.0, 8520.0, 9687.88, 6943.492263], [1512000000000, 9687.88, 10900.0, 9532.88, 10070.0, 3559.810868], [1512028800000, 10051.56, 10296.0, 8850.8, 8980.0, 3536.579371], [1512057600000, 8979.99, 10089.99, 8910.01, 9838.96, 2293.18409], [1512086400000, 9837.0, 9924.99, 9380.0, 9540.0, 1820.405906], [1512115200000, 9540.0, 10740.0, 9540.0, 10460.0, 2648.230653], [1512144000000, 10460.0, 10898.0, 10354.01, 10782.99, 1666.287074], [1512172800000, 10775.04, 11100.0, 10650.0, 10931.04, 1882.053256], [1512201600000, 10926.38, 11190.0, 10620.0, 10709.73, 1916.6193], [1512230400000, 10709.76, 11050.0, 10689.07, 10890.01, 966.767201], [1512259200000, 10902.69, 11169.04, 10799.0, 11146.02, 1223.378364], [1512288000000, 11150.49, 11820.66, 11066.01, 11710.0, 1897.599144], [1512316800000, 11710.0, 11825.0, 10500.0, 11165.41, 2225.659016], [1512345600000, 11165.41, 11600.0, 11163.78, 11544.76, 1360.449499], [1512374400000, 11538.39, 11600.0, 10802.0, 11301.07, 1409.337933], [1512403200000, 11309.02, 11579.0, 11051.0, 11579.0, 1893.63713], [1512432000000, 11571.03, 11798.0, 11447.68, 11780.0, 1884.546455], [1512460800000, 11765.5, 11853.0, 11450.0, 11800.0, 1750.586426], [1512489600000, 11800.0, 11800.0, 11561.01, 11699.99, 1915.599174], [1512518400000, 11699.99, 12531.06, 11665.58, 12426.93, 2092.646433], [1512547200000, 12432.77, 12920.0, 12250.0, 12322.4, 2344.374359], [1512576000000, 12322.41, 13615.23, 12220.0, 13550.05, 2270.925527], [1512604800000, 13541.01, 14318.44, 13050.0, 14302.84, 2442.857574], [1512633600000, 14311.44, 15500.0, 13700.0, 15310.01, 2528.058158], [1512662400000, 15310.02, 16649.96, 14450.01, 16599.0, 2516.149963], [1512691200000, 16599.0, 17204.99, 14120.0, 15880.0, 5529.453313], [1512720000000, 15881.47, 15999.99, 14015.0, 15265.7, 6753.783587], [1512748800000, 15265.69, 15998.98, 14790.02, 15880.0, 5305.776236], [1512777600000, 15880.01, 16269.3, 15001.0, 15340.01, 4735.050851], [1512806400000, 15340.05, 15370.13, 14203.0, 14405.48, 4216.146178], [1512835200000, 14405.48, 14813.0, 12535.0, 14656.07, 4967.561658], [1512864000000, 14664.01, 14699.97, 12368.0, 13419.98, 5847.535697], [1512892800000, 13419.98, 15612.1, 12900.13, 15400.0, 5537.401264], [1512921600000, 15410.25, 15720.12, 14150.0, 14899.98, 5168.100212], [1512950400000, 14946.26, 16689.0, 14901.08, 16431.0, 4723.641885], [1512979200000, 16427.0, 16554.98, 16000.01, 16359.8, 3769.87386], [1513008000000, 16322.01, 17470.0, 16210.02, 16587.97, 3326.886017], [1513036800000, 16587.97, 16976.45, 16200.0, 16799.97, 3257.051725], [1513065600000, 16797.16, 16921.06, 15875.0, 16311.68, 3539.342996], [1513094400000, 16319.94, 16685.27, 16000.0, 16349.99, 2640.40769], [1513123200000, 16349.99, 16546.0, 14666.56, 16092.34, 3750.684435], [1513152000000, 16083.08, 16420.35, 15654.52, 15844.21, 3899.317219], [1513180800000, 15822.5, 16274.98, 14853.68, 16033.29, 4766.327147], [1513209600000, 16030.34, 16234.66, 15450.0, 15775.23, 4416.131702], [1513238400000, 15756.7, 16445.0, 15651.0, 16074.54, 4041.211921], [1513267200000, 16097.98, 16438.01, 15967.12, 16334.98, 3159.523528], [1513296000000, 16334.98, 17796.39, 16298.45, 17073.27, 3523.001874], [1513324800000, 17070.0, 17991.0, 16876.89, 17542.81, 3330.781933], [1513353600000, 17549.5, 17850.0, 17240.0, 17539.83, 2327.49014], [1513382400000, 17516.81, 17827.99, 17190.01, 17677.54, 1549.682533], [1513411200000, 17677.54, 18800.89, 17532.05, 18751.02, 1363.49789], [1513440000000, 18751.01, 19539.0, 18365.0, 19102.66, 1289.448286], [1513468800000, 19120.19, 19495.0, 18800.0, 19462.98, 2767.722129], [1513497600000, 19495.0, 19798.68, 18846.0, 19220.0, 3163.560747], [1513526400000, 19220.0, 19449.48, 18510.0, 18860.02, 3245.900558], [1513555200000, 18860.04, 19006.61, 17029.98, 18576.99, 4838.535858], [1513584000000, 18576.99, 19300.0, 18021.98, 18670.0, 3215.354855], [1513612800000, 18670.0, 18900.0, 18100.2, 18856.25, 2570.742358], [1513641600000, 18856.25, 18950.0, 18500.0, 18562.01, 2736.487406], [1513670400000, 18569.52, 18695.2, 16300.0, 17164.85, 7030.293008], [1513699200000, 17164.83, 18185.18, 16500.0, 17295.2, 3443.967806], [1513728000000, 17295.2, 17295.2, 14777.66, 16354.17, 7563.045792], [1513756800000, 16360.0, 17720.35, 16300.0, 16505.0, 3468.003402], [1513785600000, 16540.0, 16970.0, 15830.13, 16488.98, 2419.447499], [1513814400000, 16480.52, 17309.5, 16375.29, 17038.99, 4193.16538], [1513843200000, 17046.02, 17049.99, 14022.0, 14400.0, 8513.106168], [1513872000000, 14400.0, 15527.63, 14302.95, 15492.64, 7617.945752], [1513900800000, 15514.03, 15699.34, 12200.0, 12726.45, 14672.884068], [1513929600000, 12726.45, 14331.38, 10961.0, 12660.27, 13571.550721], [1513958400000, 12696.5, 14649.99, 11800.01, 13326.61, 7831.836386], [1513987200000, 13326.61, 14300.0, 12978.18, 13609.25, 4899.934528], [1514016000000, 13609.25, 14950.0, 13480.0, 14218.39, 4458.959609], [1514044800000, 14218.39, 14900.0, 13234.56, 13300.0, 3782.644738], [1514073600000, 13300.0, 13819.99, 12100.0, 13252.12, 10848.187516], [1514102400000, 13228.0, 13600.0, 11640.0, 12543.07, 10488.105968], [1514131200000, 12540.0, 13570.0, 12030.0, 13500.0, 7221.241504], [1514160000000, 13500.0, 13690.64, 12708.0, 13561.14, 6678.047169], [1514188800000, 13580.0, 14300.0, 13059.0, 13473.0, 5967.23898], [1514217600000, 13473.0, 13885.0, 13331.0, 13699.34, 3102.921458], [1514246400000, 13699.34, 15350.0, 13533.0, 15063.02, 6974.163573], [1514275200000, 15073.16, 15900.1, 14660.0, 15649.0, 5546.500832], [1514304000000, 15649.99, 16050.0, 15432.06, 15689.01, 2514.003699], [1514332800000, 15709.98, 16498.05, 15559.54, 16055.0, 3744.865117], [1514361600000, 16073.69, 16200.0, 14876.0, 15155.01, 5451.167201], [1514390400000, 15162.25, 15563.63, 14200.15, 15459.99, 5763.832405], [1514419200000, 15459.97, 15539.99, 13417.99, 13984.39, 9358.314914], [1514448000000, 13984.38, 14348.22, 13150.0, 14040.0, 6877.281123], [1514476800000, 14045.94, 14221.99, 13190.0, 14182.11, 5482.261977], [1514505600000, 14199.14, 14981.0, 14008.0, 14450.0, 5840.230379], [1514534400000, 14456.65, 14748.0, 13850.0, 14557.49, 6507.063822], [1514563200000, 14557.52, 14797.0, 14130.0, 14378.9, 5724.713915], [1514592000000, 14378.99, 14398.85, 12900.0, 13620.0, 6852.151806], [1514620800000, 13620.0, 13647.95, 11821.0, 12313.99, 7343.212952], [1514649600000, 12315.0, 13200.0, 11750.0, 12440.01, 5025.793281], [1514678400000, 12345.1, 13411.02, 12149.98, 12797.46, 4520.795682], [1514707200000, 12797.44, 13421.75, 12425.98, 13212.68, 3662.521716], [1514736000000, 13226.16, 14050.11, 13192.02, 13716.36, 3585.67232], [1514764800000, 13715.65, 13818.55, 13155.38, 13570.35, 2978.419643], [1514793600000, 13569.98, 13735.24, 12750.0, 13247.0, 3151.689084], [1514822400000, 13247.0, 13599.7, 12940.0, 13380.0, 2479.807117], [1514851200000, 13382.16, 13850.0, 12890.02, 13343.0, 5345.848979], [1514880000000, 13343.01, 13894.86, 13302.59, 13690.03, 5962.062182], [1514908800000, 13690.02, 15473.49, 13503.0, 14675.11, 8770.18095], [1514937600000, 14690.0, 15307.56, 14660.0, 15170.0, 6515.535657], [1514966400000, 15170.0, 15172.99, 14150.0, 15033.77, 6285.537067], [1514995200000, 15045.0, 15130.0, 14671.0, 14919.51, 3104.594915], [1515024000000, 14919.51, 15280.0, 14649.99, 14748.0, 5902.436088], [1515052800000, 14734.07, 14800.0, 13918.04, 14353.01, 8300.383236], [1515081600000, 14367.99, 15100.08, 14238.01, 15059.54, 7126.83025], [1515110400000, 15059.56, 15200.0, 14600.0, 14920.14, 7059.473469], [1515139200000, 14916.95, 16350.0, 14880.0, 16087.72, 8016.125797], [1515168000000, 16094.99, 17176.24, 16087.73, 16960.39, 8175.891859], [1515196800000, 16960.39, 17099.99, 16288.0, 16518.0, 6411.694072], [1515225600000, 16500.18, 16750.01, 16011.21, 16556.22, 6206.958682], [1515254400000, 16550.04, 17143.13, 16501.75, 17069.79, 5952.804754], [1515283200000, 17069.79, 17099.96, 16400.0, 16746.99, 5927.867851], [1515312000000, 16747.0, 16886.75, 16300.0, 16439.65, 2688.757985], [1515340800000, 16439.64, 16500.0, 15610.0, 16150.03, 3876.499722], [1515369600000, 16218.85, 16322.3, 15476.0, 15865.0, 6231.576701], [1515398400000, 15864.99, 15869.97, 12812.0, 14299.98, 13639.560217], [1515427200000, 14297.9, 15270.99, 14238.32, 14902.54, 6729.472994], [1515456000000, 14902.54, 15500.0, 14601.0, 15062.28, 4362.427696], [1515484800000, 15062.28, 15300.0, 14011.05, 14654.96, 6059.856338], [1515513600000, 14655.01, 14998.62, 14125.0, 14400.0, 3892.720219], [1515542400000, 14401.0, 14480.0, 13750.0, 13979.0, 5559.773062], [1515571200000, 13978.95, 14490.0, 13131.31, 14399.95, 8142.071446], [1515600000000, 14399.95, 14955.66, 14172.95, 14907.09, 3709.157147], [1515628800000, 14940.0, 14968.68, 11400.0, 13530.42, 17848.833439], [1515657600000, 13530.42, 14400.0, 13041.0, 13958.08, 8121.725233], [1515686400000, 13950.05, 14190.0, 12511.0, 13238.78, 7584.165079], [1515715200000, 13238.76, 13966.63, 12500.0, 13722.04, 7051.171715], [1515744000000, 13722.04, 14109.78, 13301.99, 13411.79, 5074.667455], [1515772800000, 13411.79, 13900.0, 13222.0, 13740.01, 4291.322967], [1515801600000, 13749.95, 14320.0, 13706.15, 14255.09, 4954.220722], [1515830400000, 14250.0, 14580.0, 13974.94, 14241.26, 4248.603144], [1515859200000, 14257.84, 14357.0, 13923.18, 14210.0, 3018.684662], [1515888000000, 14210.0, 14339.5, 13359.07, 13590.0, 3766.341124], [1515916800000, 13590.0, 13720.0, 12569.2, 12869.89, 9217.648313], [1515945600000, 12869.82, 13600.8, 12690.01, 13474.99, 4033.904892], [1515974400000, 13477.98, 13736.4, 13215.56, 13355.0, 4077.562364], [1516003200000, 13346.34, 14249.99, 13147.79, 13990.01, 6786.235892], [1516032000000, 13990.01, 14100.0, 13340.64, 13539.93, 3788.296449], [1516060800000, 13500.0, 13542.93, 12222.0, 12347.32, 10504.542635], [1516089600000, 12340.0, 12488.0, 10620.88, 11964.02, 25480.122246], [1516118400000, 11963.9, 11988.47, 9035.0, 10900.0, 27416.504294], [1516147200000, 10899.99, 11488.88, 9777.0, 10765.01, 21121.989615], [1516176000000, 10777.93, 10799.78, 9037.94, 9227.47, 23723.080675], [1516204800000, 9227.46, 11680.99, 9150.01, 10988.79, 27486.726356], [1516233600000, 10972.59, 11600.0, 10435.33, 10472.97, 17648.58108], [1516262400000, 10461.71, 11878.82, 10440.01, 11700.0, 15182.942901], [1516291200000, 11696.99, 11742.95, 10635.3, 10961.97, 15632.910956], [1516320000000, 10960.0, 11435.0, 10360.0, 11069.72, 13720.115072], [1516348800000, 11060.0, 11795.0, 10950.0, 11400.0, 12318.903702], [1516377600000, 11383.16, 11700.0, 11003.0, 11474.98, 8090.356647], [1516406400000, 11474.98, 12869.0, 11412.45, 12660.98, 13560.882936], [1516435200000, 12660.98, 12835.0, 12240.24, 12539.05, 7739.046398], [1516464000000, 12539.08, 13099.0, 12535.0, 12799.94, 7468.928493], [1516492800000, 12799.8, 12799.8, 11300.0, 11701.14, 15109.114304], [1516521600000, 11721.43, 12291.35, 11403.0, 11412.0, 12530.442989], [1516550400000, 11420.99, 11548.99, 10965.0, 11530.0, 13740.216133], [1516579200000, 11530.0, 11770.0, 11149.0, 11743.97, 9596.349212], [1516608000000, 11745.0, 11926.35, 10139.97, 10330.0, 18499.863449], [1516636800000, 10330.06, 10849.0, 9900.24, 10760.05, 15656.39413], [1516665600000, 10760.05, 10998.0, 10108.4, 10250.0, 11438.307536], [1516694400000, 10250.85, 10770.54, 9905.0, 10750.0, 12550.515837], [1516723200000, 10750.0, 11399.0, 10678.0, 10799.18, 13485.099179], [1516752000000, 10799.14, 11100.1, 10500.0, 10956.0, 8770.508874], [1516780800000, 10955.99, 11570.48, 10729.0, 11070.09, 11687.456975], [1516809600000, 11070.09, 11390.0, 10862.08, 11349.99, 6700.621913], [1516838400000, 11349.96, 11794.05, 11248.48, 11460.0, 8217.587847], [1516867200000, 11465.91, 11483.98, 10959.0, 10999.0, 7126.721072], [1516896000000, 10998.99, 11395.0, 10950.21, 11175.27, 5495.645264], [1516924800000, 11184.7, 11643.0, 11010.0, 11010.0, 6646.945878], [1516953600000, 11010.09, 11147.85, 10311.15, 11147.85, 19011.982935], [1516982400000, 11147.84, 11399.0, 10800.93, 11089.0, 7397.943147], [1517011200000, 11089.0, 11400.0, 10842.69, 11243.68, 6036.535084], [1517040000000, 11243.68, 11495.0, 10900.0, 11464.97, 6572.706105], [1517068800000, 11452.62, 11650.0, 11360.0, 11491.0, 6251.527156], [1517097600000, 11499.98, 12244.0, 11408.0, 11969.0, 7216.079808], [1517126400000, 11969.0, 12079.9, 11652.0, 11791.12, 5999.837519], [1517155200000, 11793.0, 11999.98, 11750.0, 11879.95, 3671.422197], [1517184000000, 11879.95, 11975.02, 11273.0, 11318.01, 6791.300322], [1517212800000, 11320.0, 11528.0, 11139.55, 11383.91, 4390.772596], [1517241600000, 11383.91, 11499.0, 11150.0, 11251.0, 2988.30462], [1517270400000, 11250.11, 11308.42, 10850.0, 11118.99, 4521.501601], [1517299200000, 11119.0, 11210.57, 10206.25, 10323.02, 7997.517734], [1517328000000, 10323.25, 10600.0, 9900.0, 10237.51, 13035.353611], [1517356800000, 10230.0, 10347.52, 9700.0, 10280.0, 9366.085519], [1517385600000, 10280.0, 10425.85, 9900.0, 10017.47, 5502.255293], [1517414400000, 10017.51, 10298.0, 9860.0, 10285.1, 3147.615993], [1517443200000, 10285.1, 10335.0, 9959.04, 10063.75, 4286.184581], [1517472000000, 10063.75, 10078.1, 9224.0, 9339.87, 14017.45132], [1517500800000, 9326.23, 9560.01, 8750.99, 9224.52, 15261.12841], [1517529600000, 9224.52, 9250.0, 8505.0, 8673.11, 12646.292314], [1517558400000, 8673.11, 9120.0, 8010.02, 9070.0, 25528.303697], [1517587200000, 9070.0, 9247.79, 8501.0, 8873.03, 11797.030964], [1517616000000, 8873.03, 8920.0, 8229.0, 8708.82, 9216.859241], [1517644800000, 8708.82, 9459.6, 8579.0, 9173.0, 12163.664454], [1517673600000, 9173.01, 9473.01, 9022.0, 9199.96, 7344.47704], [1517702400000, 9199.96, 9368.0, 8901.01, 9200.0, 5241.379306], [1517731200000, 9200.0, 9216.0, 8357.93, 8419.96, 12681.918448], [1517760000000, 8419.96, 8585.0, 7930.0, 8184.81, 14091.010695], [1517788800000, 8179.99, 8382.8, 7910.0, 7965.01, 10839.178964], [1517817600000, 7965.01, 8049.99, 7167.0, 7384.85, 20949.729697], [1517846400000, 7375.49, 7543.99, 6625.0, 6939.99, 31614.273918], [1517875200000, 6939.63, 7150.0, 6000.01, 6043.0, 33231.301973], [1517904000000, 6040.98, 7462.0, 6019.24, 7290.61, 38439.312973], [1517932800000, 7299.99, 7878.0, 6781.0, 7652.14, 28530.885361], [1517961600000, 7655.02, 7770.0, 7150.01, 7669.97, 17636.373864], [1517990400000, 7669.97, 8476.0, 7580.6, 8169.0, 24164.014478], [1518019200000, 8165.0, 8399.0, 7531.11, 7599.0, 18978.072155], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518163200000, 7789.9, 8540.0, 7789.9, 8333.91, 9526.831769], [1518192000000, 8333.98, 8738.0, 8312.0, 8683.92, 10956.079056], [1518220800000, 8683.93, 9065.78, 8601.0, 8915.15, 13586.02675], [1518249600000, 8915.15, 8920.17, 8231.0, 8263.51, 18979.104625], [1518278400000, 8271.0, 8572.0, 8120.0, 8533.98, 16816.381278], [1518307200000, 8533.99, 8549.0, 7800.0, 7850.72, 15797.944151], [1518336000000, 7851.2, 8449.9, 7726.53, 8449.86, 17264.187619], [1518364800000, 8445.06, 8500.85, 8015.0, 8063.88, 11963.056182], [1518393600000, 8063.82, 8570.0, 8053.0, 8473.76, 12884.578717], [1518422400000, 8470.01, 8840.82, 8457.03, 8670.0, 15910.264183], [1518451200000, 8669.99, 8989.0, 8620.0, 8903.0, 13193.00759], [1518480000000, 8903.0, 8950.0, 8554.87, 8669.39, 12242.260545], [1518508800000, 8656.26, 8680.0, 8351.0, 8489.91, 14585.951506], [1518537600000, 8486.05, 8725.0, 8461.0, 8539.9, 8626.760905], [1518566400000, 8535.17, 8888.85, 8533.0, 8870.17, 9821.935373], [1518595200000, 8870.17, 9350.0, 8757.5, 9330.08, 18470.738818], [1518624000000, 9329.22, 9489.6, 9170.0, 9449.99, 12519.278676], [1518652800000, 9449.98, 9817.2, 9301.5, 9810.01, 14771.642868], [1518681600000, 9810.01, 9925.17, 9371.56, 9811.01, 19353.777221], [1518710400000, 9811.01, 10219.5, 9742.01, 10000.09, 18302.176626], [1518739200000, 10000.89, 10323.37, 9679.16, 9688.5, 14821.074167], [1518768000000, 9688.5, 10132.0, 9666.0, 10039.98, 13243.269232], [1518796800000, 10035.05, 10213.3, 9865.0, 10159.98, 10096.862575], [1518825600000, 10156.07, 10760.0, 10050.0, 10727.91, 15265.260608], [1518854400000, 10727.87, 10877.91, 10499.86, 10731.48, 15330.965284], [1518883200000, 10731.48, 11075.07, 10674.0, 11039.55, 11285.882515], [1518912000000, 11039.55, 11274.0, 10323.0, 10589.76, 23189.689083], [1518940800000, 10593.62, 10850.0, 10080.0, 10633.73, 23208.343895], [1518969600000, 10620.01, 10874.99, 10331.0, 10383.43, 14739.34775], [1518998400000, 10375.01, 10843.0, 10270.33, 10815.62, 12255.3633], [1519027200000, 10815.61, 11219.0, 10672.01, 11171.71, 15433.143639], [1519056000000, 11171.71, 11250.0, 10881.0, 11153.0, 13142.910192], [1519084800000, 11147.11, 11650.0, 11141.0, 11535.0, 15217.651316], [1519113600000, 11530.92, 11595.0, 11156.0, 11516.99, 13557.386048], [1519142400000, 11517.0, 11786.01, 11100.59, 11200.99, 19378.316924], [1519171200000, 11195.07, 11304.03, 10620.0, 11125.0, 26270.327846], [1519200000000, 11128.0, 11185.19, 10407.09, 10540.31, 20188.767558], [1519228800000, 10542.64, 10675.51, 10200.0, 10437.6, 21654.72335], [1519257600000, 10439.02, 10933.44, 10296.0, 10600.0, 16049.536669], [1519286400000, 10606.99, 10670.0, 9711.0, 9980.98, 33251.693399], [1519315200000, 9972.12, 10127.0, 9679.0, 9811.04, 17758.936415], [1519344000000, 9815.55, 9989.0, 9570.19, 9865.66, 19172.882889], [1519372800000, 9865.67, 10435.0, 9857.34, 10292.0, 21896.955713], [1519401600000, 10292.0, 10300.92, 9857.75, 10131.04, 16132.863768], [1519430400000, 10131.04, 10496.97, 9938.98, 10119.16, 14951.658797], [1519459200000, 10119.13, 10155.0, 9556.0, 9752.07, 15071.78637], [1519488000000, 9751.62, 9821.96, 9352.0, 9694.51, 10864.711132], [1519516800000, 9694.51, 9847.0, 9487.0, 9727.3, 8474.84194], [1519545600000, 9722.64, 9787.6, 9300.0, 9390.0, 11082.043154], [1519574400000, 9390.0, 9670.0, 9274.8, 9590.0, 8816.632492], [1519603200000, 9590.0, 9754.98, 9379.01, 9454.49, 7456.750117], [1519632000000, 9454.49, 10344.0, 9350.0, 10260.92, 17072.015249], [1519660800000, 10261.0, 10444.32, 10121.0, 10324.0, 10349.52739], [1519689600000, 10321.0, 10650.0, 10121.0, 10600.0, 9747.858516], [1519718400000, 10600.0, 10870.0, 10463.18, 10568.01, 14470.092727], [1519747200000, 10570.0, 10792.4, 10559.32, 10569.04, 6487.43388], [1519776000000, 10584.33, 11098.0, 10551.0, 10748.86, 11590.420927], [1519804800000, 10741.01, 10828.0, 10375.54, 10506.85, 11078.475445], [1519833600000, 10505.0, 10722.0, 10300.0, 10326.76, 8132.08741], [1519862400000, 10325.64, 10592.85, 10240.0, 10549.33, 7146.887157], [1519891200000, 10549.96, 10831.0, 10549.96, 10717.0, 8571.231102], [1519920000000, 10717.0, 11060.41, 10700.01, 10920.0, 9374.435671], [1519948800000, 10923.36, 11200.0, 10901.01, 11080.42, 10268.57217], [1519977600000, 11080.42, 11139.1, 10770.0, 10855.34, 7926.193588], [1520006400000, 10855.0, 11130.0, 10780.0, 11039.0, 5715.944332], [1520035200000, 11038.99, 11415.16, 11015.01, 11317.0, 8133.436619], [1520064000000, 11317.0, 11530.0, 11245.5, 11483.77, 7147.922863], [1520092800000, 11477.02, 11544.0, 11268.0, 11464.48, 6005.793798], [1520121600000, 11464.47, 11470.0, 11050.02, 11140.3, 6702.711645], [1520150400000, 11142.01, 11273.7, 11080.97, 11150.01, 4258.590869], [1520179200000, 11150.0, 11565.0, 11125.92, 11515.0, 6334.616139], [1520208000000, 11515.0, 11608.0, 11415.01, 11539.87, 4750.736168], [1520236800000, 11539.87, 11585.53, 11435.0, 11515.61, 4526.843162], [1520265600000, 11515.62, 11710.0, 11454.0, 11454.0, 5866.651733], [1520294400000, 11455.0, 11455.0, 11181.5, 11270.0, 7638.40604], [1520323200000, 11275.11, 11333.0, 10777.78, 10966.0, 11550.210755], [1520352000000, 10974.08, 11013.5, 10555.48, 10716.48, 10326.955568], [1520380800000, 10716.48, 10899.0, 10400.0, 10510.0, 9144.842478], [1520409600000, 10509.99, 10747.88, 10411.11, 10679.56, 9677.911907], [1520438400000, 10679.56, 10716.66, 9389.31, 9910.0, 31824.916695], [1520467200000, 9910.0, 10037.99, 9470.0, 9936.98, 12544.53577], [1520496000000, 9936.98, 10099.0, 9624.0, 9909.29, 9927.691029], [1520524800000, 9909.3, 9914.96, 9060.0, 9271.64, 18637.246427], [1520553600000, 9267.07, 9410.0, 8329.0, 8686.43, 26547.915259], [1520582400000, 8685.0, 9165.18, 8388.0, 8927.0, 19482.686482], [1520611200000, 8925.93, 9333.33, 8630.0, 9227.0, 18081.689666], [1520640000000, 9230.0, 9490.0, 9073.66, 9327.43, 13651.506049], [1520668800000, 9327.43, 9468.88, 9150.1, 9346.14, 9218.502978], [1520697600000, 9340.0, 9418.17, 8667.07, 8770.22, 14310.00383], [1520726400000, 8770.22, 8844.07, 8450.0, 8704.0, 12522.725339], [1520755200000, 8700.0, 9335.0, 8532.38, 9036.04, 14812.730121], [1520784000000, 9049.96, 9740.0, 9037.01, 9533.57, 16990.517926], [1520812800000, 9533.57, 9713.0, 9356.02, 9599.92, 9656.79301], [1520841600000, 9599.92, 9888.88, 9110.0, 9170.01, 16402.446863], [1520870400000, 9174.22, 9309.57, 8780.0, 9131.34, 16171.538057], [1520899200000, 9131.34, 9474.0, 8933.0, 9205.17, 12577.01618], [1520928000000, 9205.17, 9349.0, 8823.0, 9051.0, 16583.593261], [1520956800000, 9060.93, 9275.0, 8941.45, 9150.0, 11030.799917], [1520985600000, 9151.92, 9333.78, 9050.0, 9079.92, 8055.153169], [1521014400000, 9067.09, 9129.99, 8570.0, 8725.83, 16154.388429], [1521043200000, 8718.0, 8726.82, 7900.28, 8170.0, 25498.55251], [1521072000000, 8184.01, 8250.0, 7650.0, 7888.94, 18339.591969], [1521100800000, 7887.19, 8430.0, 7790.73, 8099.0, 21023.12905], [1521129600000, 8098.76, 8363.21, 7943.9, 8240.98, 12928.301258], [1521158400000, 8240.98, 8324.96, 7900.0, 8233.0, 12928.259564], [1521187200000, 8233.0, 8598.77, 8060.0, 8539.0, 15717.69361], [1521216000000, 8539.0, 8611.64, 8257.2, 8260.0, 10169.456719], [1521244800000, 8260.0, 8322.49, 8078.0, 8186.02, 9216.971631], [1521273600000, 8197.7, 8348.62, 7852.2, 7887.11, 11856.416897], [1521302400000, 7887.99, 8050.0, 7721.99, 7824.8, 12036.817801], [1521331200000, 7824.01, 7857.24, 7519.84, 7659.99, 14011.161916], [1521360000000, 7659.0, 7829.0, 7322.0, 7385.0, 18356.239139], [1521388800000, 7385.0, 8317.4, 7330.0, 8189.99, 27120.830656], [1521417600000, 8189.0, 8456.0, 8088.4, 8289.01, 16814.842064], [1521446400000, 8292.92, 8705.23, 8089.0, 8550.0, 21430.480366], [1521475200000, 8550.0, 8630.07, 8230.7, 8600.0, 17051.762512], [1521504000000, 8595.01, 8667.0, 8340.0, 8385.12, 12460.049212], [1521532800000, 8385.12, 8600.0, 8280.0, 8513.97, 12677.694266], [1521561600000, 8513.97, 9050.0, 8513.88, 8909.98, 19727.362357], [1521590400000, 8909.96, 9145.3, 8860.01, 8931.01, 11308.022271], [1521619200000, 8931.0, 9177.01, 8880.0, 9039.99, 11379.523197], [1521648000000, 9039.99, 9069.99, 8750.6, 8885.0, 17284.859903], [1521676800000, 8884.82, 9100.0, 8860.0, 8955.09, 8935.65639], [1521705600000, 8955.0, 9020.0, 8465.1, 8611.51, 20787.340275], [1521734400000, 8611.51, 8770.0, 8510.2, 8722.9, 10894.560144], [1521763200000, 8720.0, 8729.5, 8330.0, 8398.65, 13519.798605], [1521792000000, 8398.58, 8687.98, 8269.0, 8613.0, 14529.755898], [1521820800000, 8618.0, 8909.0, 8559.25, 8898.03, 11941.453163], [1521849600000, 8898.04, 8987.97, 8805.01, 8930.0, 10987.343355], [1521878400000, 8931.7, 8999.95, 8666.3, 8950.0, 11640.514782], [1521907200000, 8950.0, 8968.0, 8491.0, 8546.86, 12838.751435], [1521936000000, 8531.25, 8599.0, 8379.23, 8466.53, 9639.10609], [1521964800000, 8468.85, 8643.0, 8365.77, 8480.0, 10160.186581], [1521993600000, 8480.0, 8669.85, 8388.0, 8470.15, 9202.476645], [1522022400000, 8470.14, 8514.89, 8353.18, 8405.88, 6941.190991], [1522051200000, 8400.5, 8426.99, 8000.01, 8057.16, 18779.234971], [1522080000000, 8057.16, 8268.5, 7831.0, 8134.23, 18313.169698], [1522108800000, 8134.22, 8215.94, 7730.0, 7917.09, 14452.393927], [1522137600000, 7917.09, 8150.17, 7820.0, 8066.87, 11668.567848], [1522166400000, 8066.5, 8126.03, 7755.58, 7795.51, 11306.686275], [1522195200000, 7795.51, 7965.6, 7728.0, 7873.99, 8134.834138], [1522224000000, 7865.0, 8109.0, 7825.0, 7860.01, 11554.084923], [1522252800000, 7860.21, 8009.0, 7836.0, 7949.3, 6712.412609], [1522281600000, 7949.3, 7975.0, 7500.0, 7541.98, 14616.425934], [1522310400000, 7541.98, 7587.0, 7334.0, 7474.01, 14591.131498], [1522339200000, 7481.94, 7580.0, 6941.11, 7090.14, 25413.357693], [1522368000000, 7090.16, 7272.78, 6666.66, 7222.25, 29424.578825], [1522396800000, 7222.29, 7292.43, 6679.01, 6839.98, 17891.537065], [1522425600000, 6839.97, 6951.0, 6600.1, 6840.23, 17989.916086], [1522454400000, 6840.24, 7120.0, 6777.0, 6805.76, 13032.332612], [1522483200000, 6810.0, 7223.36, 6805.77, 7064.98, 13929.26254], [1522512000000, 7063.83, 7172.0, 6842.97, 6923.91, 9906.943935], [1522540800000, 6922.0, 7049.98, 6670.0, 6713.81, 8815.553297], [1522569600000, 6713.81, 6775.0, 6430.0, 6445.0, 15184.107058], [1522598400000, 6445.0, 6961.83, 6432.65, 6813.01, 20071.770108], [1522627200000, 6813.01, 7102.02, 6765.0, 7060.22, 11264.359848], [1522656000000, 7065.01, 7125.0, 6873.32, 7020.72, 11864.128888], [1522684800000, 7020.72, 7070.0, 6890.0, 7056.0, 8995.071336], [1522713600000, 7063.97, 7447.99, 7011.01, 7395.0, 13910.979702], [1522742400000, 7396.94, 7432.4, 7252.0, 7370.01, 12329.610125], [1522771200000, 7370.01, 7520.0, 7345.0, 7405.21, 11546.741984], [1522800000000, 7405.21, 7427.52, 7223.0, 7304.31, 10735.62743], [1522828800000, 7304.26, 7338.0, 6766.0, 6785.0, 19135.562436], [1522857600000, 6785.0, 6918.0, 6707.0, 6796.1, 12355.993938], [1522886400000, 6796.1, 6870.0, 6566.69, 6792.52, 14919.222518], [1522915200000, 6792.49, 6902.0, 6612.11, 6749.53, 14706.144333], [1522944000000, 6747.99, 6840.0, 6660.0, 6770.76, 9404.364609], [1522972800000, 6770.0, 6850.0, 6529.68, 6622.05, 11726.026415], [1523001600000, 6621.04, 6657.86, 6500.0, 6580.01, 9543.205627], [1523030400000, 6583.0, 6627.0, 6516.67, 6601.39, 6185.779878], [1523059200000, 6601.39, 6888.0, 6586.28, 6864.08, 11637.130872], [1523088000000, 6864.08, 7033.99, 6760.0, 7010.0, 11065.043513], [1523116800000, 7003.98, 7070.0, 6850.01, 6895.8, 9567.403882], [1523145600000, 6895.81, 7050.0, 6880.0, 6939.0, 5842.017639], [1523174400000, 6939.0, 7109.13, 6924.3, 7049.93, 8932.073587], [1523203200000, 7047.01, 7053.09, 6937.03, 7018.0, 6653.581939], [1523232000000, 7011.04, 7165.21, 7011.02, 7125.0, 9035.333535], [1523260800000, 7129.79, 7185.0, 6676.5, 6738.98, 17370.213083], [1523289600000, 6738.98, 6795.0, 6611.0, 6782.72, 7672.750588], [1523318400000, 6781.55, 6820.0, 6670.25, 6715.51, 7135.366251], [1523347200000, 6717.32, 6870.99, 6656.0, 6837.54, 8198.542404], [1523376000000, 6835.65, 6890.0, 6768.01, 6843.9, 6992.81944], [1523404800000, 6839.56, 6872.71, 6787.0, 6846.89, 6511.141789], [1523433600000, 6846.89, 6990.0, 6800.0, 6927.06, 9231.988978], [1523462400000, 6927.06, 6987.41, 6862.6, 6953.79, 8254.74041], [1523491200000, 6953.78, 6985.0, 6743.2, 6826.61, 11410.073041], [1523520000000, 6826.62, 8012.23, 6802.7, 7614.21, 36361.057652], [1523548800000, 7618.0, 7986.1, 7542.0, 7923.0, 17090.465294], [1523577600000, 7922.99, 8195.84, 7732.0, 8093.01, 16394.140666], [1523606400000, 8100.0, 8233.39, 8005.0, 8125.0, 20946.824134], [1523635200000, 8125.41, 8168.0, 7768.47, 7877.41, 17703.558348], [1523664000000, 7877.48, 8186.0, 7810.0, 8127.74, 12022.863138], [1523692800000, 8129.99, 8175.0, 7849.46, 7955.01, 12046.470229], [1523721600000, 7955.02, 8090.23, 7917.0, 7999.01, 7551.95299], [1523750400000, 8004.0, 8150.0, 7999.02, 8074.99, 7542.918027], [1523779200000, 8074.91, 8429.54, 8072.1, 8269.99, 13710.522825], [1523808000000, 8269.0, 8365.87, 8254.95, 8355.0, 6693.279592], [1523836800000, 8355.07, 8419.0, 8000.0, 8110.0, 15260.430811], [1523865600000, 8110.21, 8138.53, 7867.0, 7971.99, 13402.233944], [1523894400000, 7971.98, 8086.01, 7924.65, 8064.92, 8001.40496], [1523923200000, 8064.92, 8172.76, 7956.17, 8138.45, 9105.70656], [1523952000000, 8143.72, 8173.7, 8051.0, 8088.63, 10431.12874], [1523980800000, 8088.63, 8134.0, 7825.4, 7885.02, 12615.768267], [1524009600000, 7890.96, 8149.89, 7868.0, 8107.23, 8599.464425], [1524038400000, 8113.51, 8120.0, 7931.01, 7994.0, 8642.356212], [1524067200000, 7994.0, 8236.43, 7985.01, 8173.0, 9727.223933], [1524096000000, 8173.99, 8290.0, 8080.0, 8166.97, 10386.243555], [1524124800000, 8166.97, 8270.0, 8143.02, 8239.02, 9053.700932], [1524153600000, 8235.45, 8296.0, 8189.0, 8278.0, 7673.902977], [1524182400000, 8273.84, 8398.0, 8177.09, 8319.97, 13175.162003], [1524211200000, 8319.92, 8577.9, 8267.01, 8459.99, 13617.480637], [1524240000000, 8458.0, 8930.0, 8446.0, 8856.98, 13002.694845], [1524268800000, 8852.12, 9035.0, 8730.0, 8874.88, 12217.52323], [1524297600000, 8874.87, 8888.0, 8565.0, 8828.2, 20621.73898], [1524326400000, 8828.13, 8930.0, 8706.5, 8915.31, 8032.967699], [1524355200000, 8915.31, 8915.33, 8786.8, 8875.0, 6421.362443], [1524384000000, 8875.0, 9020.0, 8768.79, 8940.67, 12645.417176], [1524412800000, 8940.67, 9020.67, 8727.68, 8787.02, 10391.473861], [1524441600000, 8785.7, 8970.01, 8745.0, 8942.39, 8705.466055], [1524470400000, 8942.0, 8985.0, 8831.0, 8898.0, 9910.964618], [1524499200000, 8898.0, 8949.98, 8800.6, 8934.01, 7221.684036], [1524528000000, 8934.0, 9300.0, 8922.0, 9216.0, 15062.893969], [1524556800000, 9217.98, 9420.0, 9155.0, 9347.77, 15044.096112], [1524585600000, 9347.78, 9731.01, 9293.29, 9619.99, 16161.800025], [1524614400000, 9618.96, 9759.82, 9110.0, 9416.39, 29950.816871], [1524643200000, 9415.0, 9438.54, 8730.0, 8972.09, 33589.073519], [1524672000000, 8972.09, 9185.01, 8770.0, 8869.99, 17570.147199], [1524700800000, 8869.99, 8977.0, 8660.0, 8847.97, 16589.827656], [1524729600000, 8847.97, 8945.0, 8651.62, 8806.1, 13720.18842], [1524758400000, 8806.1, 9307.48, 8775.89, 9266.0, 12990.288169], [1524787200000, 9267.03, 9297.0, 9104.88, 9240.97, 11392.363492], [1524816000000, 9240.97, 9395.0, 9150.1, 9241.21, 12834.99209], [1524844800000, 9241.2, 9328.26, 8889.0, 8915.35, 13013.991454], [1524873600000, 8915.35, 9215.66, 8870.0, 9126.22, 9862.462738], [1524902400000, 9121.05, 9330.0, 9081.02, 9289.98, 5449.677882]], "12h": [[1503273600000, 4069.13, 4119.62, 3953.4, 4023.11, 522.291586], [1503316800000, 4023.11, 4070.49, 3911.79, 4016.0, 169.451474], [1503360000000, 4016.0, 4016.0, 3400.0, 3866.48, 503.638101], [1503403200000, 3866.48, 4104.82, 3786.81, 4040.0, 463.046757], [1503446400000, 4040.0, 4242.32, 4013.89, 4237.99, 436.522009], [1503489600000, 4205.98, 4265.8, 4069.8, 4114.01, 564.614556], [1503532800000, 4147.0, 4250.94, 4085.01, 4202.0, 418.186098], [1503576000000, 4211.78, 4371.68, 4136.33, 4316.01, 369.232655], [1503619200000, 4316.01, 4370.0, 4267.5, 4361.27, 317.047129], [1503662400000, 4361.27, 4453.91, 4247.48, 4280.68, 256.565611], [1503705600000, 4280.71, 4319.7, 4228.99, 4288.72, 106.498937], [1503748800000, 4288.72, 4367.0, 4212.41, 4337.44, 121.609131], [1503792000000, 4332.51, 4400.0, 4285.56, 4323.37, 167.597269], [1503835200000, 4340.0, 4386.79, 4285.54, 4310.01, 183.095316], [1503878400000, 4310.01, 4365.4, 4124.54, 4308.0, 289.414587], [1503921600000, 4309.0, 4399.82, 4271.03, 4386.69, 314.427029], [1503964800000, 4353.65, 4417.61, 4313.55, 4368.5, 295.370462], [1504008000000, 4368.5, 4625.85, 4347.59, 4587.48, 308.174566], [1504051200000, 4564.52, 4647.51, 4416.01, 4498.35, 445.128309], [1504094400000, 4537.0, 4609.92, 4416.16, 4555.14, 363.340462], [1504137600000, 4555.14, 4678.57, 4555.14, 4656.67, 324.524617], [1504180800000, 4674.97, 4745.42, 4631.41, 4724.89, 232.432185], [1504224000000, 4689.89, 4798.46, 4654.88, 4775.0, 307.840767], [1504267200000, 4775.0, 4885.55, 4725.81, 4834.91, 252.825599], [1504310400000, 4796.16, 4939.19, 4473.35, 4630.01, 466.548012], [1504353600000, 4669.75, 4675.0, 4286.87, 4472.14, 462.600583], [1504396800000, 4508.5, 4714.76, 4456.8, 4486.0, 335.535161], [1504440000000, 4475.23, 4583.84, 4298.33, 4509.08, 355.681037], [1504483200000, 4505.0, 4527.49, 4052.0, 4153.0, 821.924754], [1504526400000, 4153.0, 4311.14, 3972.51, 4100.11, 572.71986], [1504569600000, 4106.97, 4248.6, 3603.0, 4246.82, 722.686125], [1504612800000, 4248.64, 4484.99, 4096.06, 4366.47, 506.252032], [1504656000000, 4366.49, 4597.79, 4335.26, 4548.13, 529.023331], [1504699200000, 4544.59, 4662.87, 4422.28, 4619.77, 278.340395], [1504742400000, 4619.77, 4661.93, 4438.19, 4613.94, 245.62961], [1504785600000, 4616.79, 4788.59, 4586.13, 4691.61, 254.800365], [1504828800000, 4691.66, 4735.39, 4586.13, 4647.53, 127.036328], [1504872000000, 4653.92, 4690.83, 4028.93, 4282.8, 1005.218718], [1504915200000, 4282.8, 4426.62, 4150.06, 4327.63, 383.100668], [1504958400000, 4331.82, 4400.6, 4159.64, 4258.81, 275.682284], [1505001600000, 4258.81, 4279.7, 3801.0, 4098.79, 412.544427], [1505044800000, 4069.43, 4283.0, 4043.17, 4130.37, 247.828848], [1505088000000, 4153.62, 4334.43, 4098.91, 4191.53, 494.720202], [1505131200000, 4191.54, 4313.18, 4158.84, 4208.47, 205.268863], [1505174400000, 4208.6, 4394.59, 4201.9, 4340.1, 344.964833], [1505217600000, 4343.01, 4345.92, 4040.8, 4163.72, 534.665486], [1505260800000, 4159.72, 4165.38, 3796.8, 3832.0, 515.871549], [1505304000000, 3831.01, 3991.01, 3760.0, 3944.69, 397.590996], [1505347200000, 3944.0, 3993.0, 3418.0, 3481.02, 697.680912], [1505390400000, 3481.02, 3666.0, 3165.13, 3189.02, 967.340631], [1505433600000, 3188.01, 3460.0, 2817.0, 2919.0, 921.291279], [1505476800000, 2870.9, 3856.0, 2870.9, 3700.0, 1047.575213], [1505520000000, 3674.01, 3950.0, 3470.66, 3630.06, 837.160812], [1505563200000, 3630.06, 3800.0, 3531.01, 3714.95, 460.403141], [1505606400000, 3685.23, 3709.94, 3499.02, 3499.03, 372.606569], [1505649600000, 3499.03, 3748.21, 3499.03, 3699.99, 309.564641], [1505692800000, 3690.0, 4000.0, 3690.0, 3929.33, 507.727306], [1505736000000, 3932.98, 4123.2, 3890.0, 4035.01, 522.279149], [1505779200000, 4060.0, 4089.97, 3830.91, 3969.01, 470.873596], [1505822400000, 3969.32, 4029.99, 3830.91, 3910.04, 431.458533], [1505865600000, 3910.04, 3988.83, 3820.0, 3927.77, 366.425565], [1505908800000, 3927.77, 4046.08, 3860.09, 3900.0, 354.509511], [1505952000000, 3889.99, 3910.0, 3800.0, 3864.95, 346.631619], [1505995200000, 3862.99, 3879.99, 3567.0, 3609.99, 655.022465], [1506038400000, 3592.84, 3750.0, 3522.22, 3539.97, 423.348129], [1506081600000, 3528.36, 3645.99, 3505.55, 3595.87, 415.618296], [1506124800000, 3595.88, 3798.9, 3542.91, 3798.0, 350.638464], [1506168000000, 3798.9, 3817.19, 3700.0, 3780.0, 402.154327], [1506211200000, 3779.54, 3789.99, 3622.76, 3683.36, 402.534833], [1506254400000, 3674.22, 3730.0, 3624.38, 3660.02, 259.101557], [1506297600000, 3660.02, 3815.74, 3653.69, 3781.05, 374.479434], [1506340800000, 3781.05, 3979.87, 3770.0, 3920.75, 353.515279], [1506384000000, 3928.0, 3959.56, 3850.05, 3949.45, 325.348531], [1506427200000, 3950.0, 3976.99, 3880.0, 3882.35, 201.379456], [1506470400000, 3882.36, 4099.95, 3872.81, 4073.0, 278.67384], [1506513600000, 4072.2, 4249.94, 4053.4, 4193.0, 349.497126], [1506556800000, 4192.11, 4300.0, 4136.0, 4180.0, 408.51714], [1506600000000, 4170.19, 4210.0, 4101.0, 4174.5, 441.268185], [1506643200000, 4178.98, 4248.0, 3952.01, 4220.01, 1087.887629], [1506686400000, 4234.99, 4263.86, 4101.01, 4174.69, 514.421936], [1506729600000, 4175.0, 4345.0, 4138.1, 4324.99, 402.256831], [1506772800000, 4320.21, 4380.0, 4275.35, 4378.51, 318.096352], [1506816000000, 4378.49, 4378.49, 4265.02, 4337.01, 306.462599], [1506859200000, 4337.01, 4406.52, 4240.04, 4378.48, 420.501086], [1506902400000, 4400.0, 4560.0, 4380.01, 4410.01, 340.959126], [1506945600000, 4419.99, 4561.63, 4360.0, 4380.0, 314.797848], [1506988800000, 4380.0, 4467.33, 4189.71, 4297.99, 616.898117], [1507032000000, 4290.0, 4329.86, 4180.8, 4310.0, 465.425446], [1507075200000, 4314.9, 4373.0, 4185.01, 4228.0, 431.429838], [1507118400000, 4230.0, 4248.97, 4142.0, 4208.59, 437.035263], [1507161600000, 4208.59, 4235.0, 4110.0, 4226.05, 457.50286], [1507204800000, 4226.05, 4355.0, 4226.05, 4292.43, 321.635778], [1507248000000, 4318.99, 4417.0, 4292.0, 4405.0, 272.798384], [1507291200000, 4391.11, 4416.78, 4312.57, 4369.0, 233.730792], [1507334400000, 4369.0, 4399.0, 4312.56, 4335.9, 163.201498], [1507377600000, 4335.9, 4479.5, 4326.0, 4423.0, 134.396002], [1507420800000, 4425.0, 4517.0, 4425.0, 4487.99, 224.988115], [1507464000000, 4487.99, 4658.0, 4460.02, 4640.0, 293.473889], [1507507200000, 4640.0, 4660.0, 4550.0, 4615.0, 225.114195], [1507550400000, 4615.0, 4889.98, 4615.0, 4786.95, 421.34895], [1507593600000, 4786.95, 4888.88, 4720.16, 4790.0, 354.689845], [1507636800000, 4790.01, 4960.0, 4680.59, 4783.06, 688.531928], [1507680000000, 4783.06, 4852.22, 4710.0, 4818.99, 612.082536], [1507723200000, 4804.93, 4881.61, 4751.01, 4821.43, 141.34686], [1507766400000, 4821.43, 5265.5, 4810.16, 5184.0, 540.763389], [1507809600000, 5184.0, 5439.99, 5173.1, 5430.0, 735.938093], [1507852800000, 5439.99, 5846.17, 5379.84, 5649.0, 1144.376539], [1507896000000, 5658.97, 5800.0, 5520.0, 5649.98, 735.451081], [1507939200000, 5650.0, 5779.0, 5580.01, 5720.02, 485.489902], [1507982400000, 5720.02, 5900.0, 5685.02, 5869.99, 485.269144], [1508025600000, 5855.03, 5922.3, 5400.01, 5400.01, 702.704233], [1508068800000, 5419.0, 5756.36, 5404.98, 5709.99, 640.819142], [1508112000000, 5710.0, 5749.99, 5585.19, 5728.99, 617.754631], [1508155200000, 5739.96, 5788.91, 5642.02, 5760.02, 911.241831], [1508198400000, 5760.0, 5774.98, 5540.02, 5579.98, 660.614057], [1508241600000, 5579.89, 5649.99, 5508.63, 5595.0, 769.255319], [1508284800000, 5595.0, 5596.0, 5226.0, 5273.25, 1232.016577], [1508328000000, 5283.98, 5588.0, 5037.95, 5512.06, 1085.787796], [1508371200000, 5513.0, 5706.09, 5490.26, 5690.12, 815.059989], [1508414400000, 5710.0, 5710.0, 5600.0, 5683.9, 1066.662118], [1508457600000, 5683.31, 5697.99, 5600.0, 5662.75, 725.609429], [1508500800000, 5662.75, 6110.0, 5602.86, 6010.01, 1247.367791], [1508544000000, 6013.72, 6167.99, 5960.0, 6116.98, 876.614657], [1508587200000, 6116.98, 6171.0, 5850.03, 6024.97, 787.693036], [1508630400000, 6003.27, 6060.0, 5720.03, 5819.98, 754.707379], [1508673600000, 5819.98, 6000.0, 5770.04, 5950.02, 607.384837], [1508716800000, 5975.0, 6080.0, 5787.98, 5881.99, 811.419218], [1508760000000, 5881.98, 5969.98, 5621.03, 5915.93, 1001.138497], [1508803200000, 5909.47, 5925.0, 5482.22, 5676.04, 1499.773901], [1508846400000, 5680.0, 5719.03, 5450.0, 5477.03, 1080.644866], [1508889600000, 5506.92, 5650.0, 5286.98, 5469.98, 1297.118019], [1508932800000, 5469.99, 5704.96, 5375.0, 5689.99, 985.695186], [1508976000000, 5670.1, 5853.99, 5650.0, 5853.99, 1018.49149], [1509019200000, 5845.03, 5939.99, 5757.0, 5861.77, 954.474392], [1509062400000, 5861.77, 5980.0, 5770.23, 5843.18, 730.566111], [1509105600000, 5843.03, 5843.04, 5649.24, 5768.83, 673.140305], [1509148800000, 5768.79, 5850.02, 5677.02, 5680.28, 536.136628], [1509192000000, 5680.27, 5733.03, 5630.03, 5719.64, 740.617784], [1509235200000, 5709.98, 5815.84, 5648.01, 5784.97, 683.493896], [1509278400000, 5784.99, 6189.88, 5730.0, 6169.98, 1121.284277], [1509321600000, 6133.01, 6248.68, 6075.5, 6181.98, 815.188764], [1509364800000, 6179.92, 6198.98, 6030.0, 6120.5, 658.498279], [1509408000000, 6120.52, 6223.33, 6100.0, 6223.33, 529.393847], [1509451200000, 6223.41, 6498.01, 6201.01, 6463.0, 982.381078], [1509494400000, 6463.0, 6645.32, 6338.02, 6614.97, 740.549041], [1509537600000, 6613.92, 6774.67, 6455.0, 6753.98, 935.066147], [1509580800000, 6753.98, 7300.0, 6685.1, 6887.81, 1250.153846], [1509624000000, 6887.66, 7132.0, 6700.0, 7019.98, 1253.456957], [1509667200000, 7010.31, 7346.34, 6923.0, 7230.95, 1017.712895], [1509710400000, 7230.95, 7299.99, 7032.0, 7115.04, 873.784697], [1509753600000, 7115.02, 7199.99, 6901.0, 7085.02, 755.013869], [1509796800000, 7085.02, 7480.99, 7085.0, 7357.09, 644.177898], [1509840000000, 7357.27, 7513.82, 7280.0, 7513.82, 504.870937], [1509883200000, 7513.8, 7590.25, 7279.02, 7345.01, 702.961393], [1509926400000, 7345.1, 7401.0, 7101.0, 7304.11, 738.820007], [1509969600000, 7324.97, 7400.98, 6906.0, 6960.12, 1024.199254], [1510012800000, 6981.72, 7198.49, 6909.01, 7160.55, 674.397443], [1510056000000, 7160.54, 7195.0, 6901.0, 7064.04, 765.862051], [1510099200000, 7070.0, 7420.0, 7035.02, 7396.0, 809.633436], [1510142400000, 7406.47, 7770.02, 6651.0, 7303.0, 2012.665366], [1510185600000, 7303.01, 7392.0, 7040.0, 7076.0, 1218.097358], [1510228800000, 7076.0, 7189.89, 7015.0, 7079.99, 695.30095], [1510272000000, 7079.0, 7279.91, 6800.0, 6831.2, 1093.026916], [1510315200000, 6831.2, 6910.0, 6255.01, 6506.98, 2161.677189], [1510358400000, 6503.0, 6797.98, 6402.01, 6410.02, 992.191823], [1510401600000, 6410.02, 6478.0, 6100.0, 6245.05, 1761.965038], [1510444800000, 6245.05, 6630.0, 5325.01, 6241.71, 3486.588714], [1510488000000, 6241.71, 6320.0, 5600.0, 5811.03, 1481.894355], [1510531200000, 5839.94, 6497.99, 5699.99, 6426.02, 1292.107243], [1510574400000, 6426.03, 6697.47, 6190.0, 6465.99, 1329.135796], [1510617600000, 6465.99, 6684.98, 6400.0, 6410.0, 757.301564], [1510660800000, 6410.03, 6593.0, 6311.07, 6574.99, 496.990967], [1510704000000, 6575.99, 6998.0, 6575.99, 6998.0, 830.705491], [1510747200000, 6998.0, 7298.0, 6998.0, 7240.06, 948.900354], [1510790400000, 7240.14, 7546.7, 7076.0, 7380.54, 941.384076], [1510833600000, 7380.53, 7940.0, 7313.0, 7864.5, 1390.572674], [1510876800000, 7876.98, 7989.0, 7451.0, 7765.08, 1896.764189], [1510920000000, 7769.17, 7950.0, 7608.0, 7699.19, 2085.631736], [1510963200000, 7680.01, 7759.48, 7422.0, 7747.96, 1953.540668], [1511006400000, 7747.0, 7819.99, 7602.02, 7761.94, 2000.725809], [1511049600000, 7761.94, 7818.93, 7650.33, 7753.83, 1800.329053], [1511092800000, 7735.49, 8123.15, 7700.0, 8038.0, 2067.011391], [1511136000000, 8057.11, 8083.49, 7954.0, 8057.01, 1932.803385], [1511179200000, 8066.98, 8319.99, 8057.53, 8212.0, 1953.830963], [1511222400000, 8212.49, 8290.0, 7801.0, 8241.06, 2810.165596], [1511265600000, 8252.25, 8400.0, 8070.0, 8119.51, 1734.30842], [1511308800000, 8091.09, 8322.68, 8091.09, 8270.02, 1942.335711], [1511352000000, 8270.12, 8290.0, 8108.0, 8205.92, 1602.669999], [1511395200000, 8233.03, 8260.0, 8031.01, 8099.97, 2047.828749], [1511438400000, 8099.95, 8200.0, 8000.0, 8019.99, 2046.123938], [1511481600000, 8019.97, 8369.0, 7850.0, 8130.73, 2624.665845], [1511524800000, 8165.0, 8250.0, 8079.0, 8138.0, 1787.123267], [1511568000000, 8138.99, 8448.99, 8090.0, 8419.54, 2008.973153], [1511611200000, 8419.54, 8734.78, 8394.49, 8700.01, 2283.650529], [1511654400000, 8700.04, 8978.9, 8604.72, 8903.01, 1962.589857], [1511697600000, 8903.03, 9350.0, 8870.01, 9128.02, 2184.79038], [1511740800000, 9128.0, 9654.28, 9112.04, 9498.99, 2426.564417], [1511784000000, 9485.02, 9650.0, 9355.01, 9650.0, 2095.06129], [1511827200000, 9650.0, 9930.0, 9570.5, 9915.0, 2421.672188], [1511870400000, 9919.61, 9939.0, 9658.0, 9896.8, 2495.538797], [1511913600000, 9896.79, 10900.0, 9873.68, 10776.3, 3615.669183], [1511956800000, 10798.53, 11300.03, 8520.0, 9687.88, 9736.869532], [1512000000000, 9687.88, 10900.0, 9402.15, 9600.0, 4973.888966], [1512043200000, 9610.01, 10089.99, 8850.8, 9838.96, 4415.685363], [1512086400000, 9837.0, 10000.0, 9380.0, 9956.24, 2794.545695], [1512129600000, 9960.01, 10898.0, 9960.01, 10782.99, 3340.377938], [1512172800000, 10775.04, 11190.0, 10650.0, 10940.98, 2897.011454], [1512216000000, 10949.0, 11111.1, 10620.0, 10890.01, 1868.428303], [1512259200000, 10902.69, 11620.0, 10799.0, 11615.99, 2082.801417], [1512302400000, 11601.97, 11825.0, 10500.0, 11165.41, 3263.835107], [1512345600000, 11165.41, 11600.0, 11003.0, 11120.82, 1931.412763], [1512388800000, 11120.7, 11579.0, 10802.0, 11579.0, 2732.011799], [1512432000000, 11571.03, 11798.0, 11447.68, 11664.0, 2746.33073], [1512475200000, 11652.0, 11853.0, 11561.01, 11699.99, 2804.401325], [1512518400000, 11699.99, 12920.0, 11665.58, 12593.96, 3283.270557], [1512561600000, 12620.0, 13615.23, 12220.0, 13550.05, 3424.675762], [1512604800000, 13541.01, 14788.0, 13050.0, 13799.98, 3645.983716], [1512648000000, 13799.95, 16649.96, 13702.0, 16599.0, 3841.081979], [1512691200000, 16599.0, 17204.99, 14015.0, 14834.98, 8866.297629], [1512734400000, 14849.99, 15998.98, 14412.65, 15880.0, 8722.715507], [1512777600000, 15880.01, 16269.3, 14203.0, 14700.01, 7006.778075], [1512820800000, 14700.03, 15100.0, 12535.0, 14656.07, 6911.980612], [1512864000000, 14664.01, 14699.97, 12368.0, 13560.55, 8306.689606], [1512907200000, 13560.55, 15720.12, 13357.98, 14899.98, 8246.347567], [1512950400000, 14946.26, 16689.0, 14901.08, 16052.02, 6747.066559], [1512993600000, 16052.05, 17470.0, 16000.01, 16587.97, 5073.335203], [1513036800000, 16587.97, 16976.45, 16200.0, 16600.0, 4863.781458], [1513080000000, 16600.0, 16839.67, 15875.0, 16349.99, 4573.020953], [1513123200000, 16349.99, 16546.0, 14666.56, 15842.17, 5514.687688], [1513166400000, 15851.07, 16420.35, 14853.68, 16033.29, 6901.641113], [1513209600000, 16030.34, 16445.0, 15450.0, 16099.0, 6473.841094], [1513252800000, 16098.95, 16439.99, 15651.0, 16334.98, 5143.026057], [1513296000000, 16334.98, 17982.22, 16298.45, 17900.0, 5189.895613], [1513339200000, 17900.0, 17991.0, 17240.0, 17539.83, 3991.378334], [1513382400000, 17516.81, 17898.0, 17190.01, 17829.99, 1874.835858], [1513425600000, 17830.0, 19539.0, 17800.01, 19102.66, 2327.792851], [1513468800000, 19120.19, 19710.0, 18800.0, 19709.5, 4126.735807], [1513512000000, 19709.5, 19798.68, 18510.0, 18860.02, 5050.447627], [1513555200000, 18860.04, 19200.1, 17029.98, 19126.66, 6318.378612], [1513598400000, 19116.11, 19300.0, 18021.98, 18856.25, 4306.254459], [1513641600000, 18856.25, 18950.0, 16300.0, 17250.0, 6638.2445], [1513684800000, 17214.2, 18185.18, 16500.0, 17295.2, 6572.50372], [1513728000000, 17295.2, 17450.0, 14777.66, 17253.0, 9466.01197], [1513771200000, 17253.0, 17720.35, 15830.13, 16488.98, 3984.484723], [1513814400000, 16480.52, 17309.5, 16249.98, 16490.99, 7320.419451], [1513857600000, 16491.0, 16658.03, 14022.0, 15492.64, 13003.797849], [1513900800000, 15514.03, 15699.34, 12200.0, 13456.0, 19700.157832], [1513944000000, 13449.1, 14649.99, 10961.0, 13326.61, 16376.113343], [1513987200000, 13326.61, 14650.0, 12978.18, 14642.99, 6852.421106], [1514030400000, 14640.0, 14950.0, 13234.56, 13300.0, 6289.117769], [1514073600000, 13300.0, 13819.99, 11866.38, 12345.89, 15729.830106], [1514116800000, 12345.89, 13570.0, 11640.0, 13500.0, 12827.704882], [1514160000000, 13500.0, 13970.0, 12708.0, 13800.0, 9938.999552], [1514203200000, 13808.11, 14300.0, 13059.0, 13699.34, 5809.208055], [1514246400000, 13699.34, 15350.0, 13533.0, 14849.98, 9907.340452], [1514289600000, 14844.0, 16050.0, 14660.0, 15689.01, 5127.327652], [1514332800000, 15709.98, 16498.05, 15250.59, 15570.13, 6191.208379], [1514376000000, 15570.11, 15978.0, 14200.15, 15459.99, 8768.656344], [1514419200000, 15459.97, 15539.99, 13150.0, 13578.98, 13129.568368], [1514462400000, 13578.98, 14305.0, 13190.0, 14182.11, 8588.289646], [1514505600000, 14199.14, 14981.0, 13850.0, 14280.01, 9044.444098], [1514548800000, 14290.0, 14797.0, 13900.0, 14378.9, 9027.564018], [1514592000000, 14378.99, 14398.85, 12810.0, 13150.0, 9046.238476], [1514635200000, 13119.03, 13200.0, 11750.0, 12440.01, 10174.919563], [1514678400000, 12345.1, 13411.02, 12149.98, 12989.94, 6044.632104], [1514721600000, 12956.49, 14050.11, 12870.01, 13716.36, 5724.357614], [1514764800000, 13715.65, 13818.55, 13001.13, 13220.56, 4298.175574], [1514808000000, 13220.56, 13599.7, 12750.0, 13380.0, 4311.74027], [1514851200000, 13382.16, 13850.0, 12890.02, 13490.0, 7942.031653], [1514894400000, 13490.0, 15473.49, 13450.46, 14675.11, 12136.060458], [1514937600000, 14690.0, 15307.56, 14150.0, 14730.05, 10718.338599], [1514980800000, 14764.73, 15130.0, 14400.04, 14919.51, 5187.32904], [1515024000000, 14919.51, 15280.0, 13918.04, 14539.97, 10241.988139], [1515067200000, 14539.99, 15100.08, 14181.88, 15059.54, 11087.661435], [1515110400000, 15059.56, 16350.0, 14600.0, 16090.69, 11294.798231], [1515153600000, 16090.7, 17176.24, 15750.0, 16960.39, 11956.692894], [1515196800000, 16960.39, 17099.99, 16288.0, 16529.89, 8981.698935], [1515240000000, 16505.16, 17143.13, 16011.21, 17069.79, 9589.758573], [1515283200000, 17069.79, 17099.96, 16400.0, 16607.0, 7403.574371], [1515326400000, 16611.0, 16649.05, 15610.0, 16150.03, 5089.551187], [1515369600000, 16218.85, 16322.3, 14551.0, 15400.0, 11135.487957], [1515412800000, 15414.0, 15499.0, 12812.0, 14902.54, 15465.121955], [1515456000000, 14902.54, 15500.0, 14170.33, 14726.0, 6915.746339], [1515499200000, 14726.0, 14998.62, 14011.05, 14400.0, 7399.257914], [1515542400000, 14401.0, 14480.0, 13131.31, 13919.08, 10480.794851], [1515585600000, 13919.09, 14955.66, 13500.0, 14907.09, 6930.206804], [1515628800000, 14940.0, 14968.68, 11400.0, 13385.1, 21529.06521], [1515672000000, 13385.1, 14400.0, 12511.0, 13238.78, 12025.658541], [1515715200000, 13238.76, 14109.78, 12500.0, 13900.02, 9484.14553], [1515758400000, 13900.02, 14059.48, 13222.0, 13740.01, 6933.016607], [1515801600000, 13749.95, 14320.0, 13706.15, 14178.0, 6634.900254], [1515844800000, 14166.0, 14580.0, 13923.18, 14210.0, 5586.608274], [1515888000000, 14210.0, 14339.5, 13120.0, 13280.15, 6730.424273], [1515931200000, 13280.16, 13600.8, 12569.2, 13474.99, 10287.470056], [1515974400000, 13477.98, 13740.27, 13147.79, 13644.9, 7164.920931], [1516017600000, 13645.0, 14249.99, 13340.64, 13539.93, 7487.173774], [1516060800000, 13500.0, 13542.93, 10620.88, 12127.16, 27884.803734], [1516104000000, 12140.0, 12200.0, 9035.0, 10900.0, 35516.365441], [1516147200000, 10899.99, 11488.88, 9587.99, 9808.14, 30824.333764], [1516190400000, 9850.76, 11680.99, 9037.94, 10988.79, 41507.462882], [1516233600000, 10972.59, 11600.0, 10435.33, 11413.78, 24374.244577], [1516276800000, 11413.78, 11878.82, 10635.3, 10961.97, 24090.19036], [1516320000000, 10960.0, 11596.0, 10360.0, 11530.22, 19618.529984], [1516363200000, 11535.18, 11795.0, 11003.0, 11474.98, 14510.845437], [1516406400000, 11474.98, 12869.0, 11412.45, 12320.01, 17827.410658], [1516449600000, 12320.05, 13099.0, 12240.24, 12799.94, 10941.447169], [1516492800000, 12799.8, 12799.8, 11300.0, 12194.18, 21797.525396], [1516536000000, 12194.18, 12291.35, 10965.0, 11530.0, 19582.24803], [1516579200000, 11530.0, 11926.35, 11149.0, 11240.0, 13986.752561], [1516622400000, 11240.0, 11380.0, 9900.24, 10760.05, 29765.85423], [1516665600000, 10760.05, 10998.0, 9905.0, 10143.1, 17256.600972], [1516708800000, 10143.01, 11399.0, 9987.02, 10799.18, 20217.32158], [1516752000000, 10799.14, 11234.0, 10500.0, 11111.0, 12876.304091], [1516795200000, 11111.0, 11570.48, 10862.08, 11349.99, 14282.283671], [1516838400000, 11349.96, 11794.05, 11147.07, 11215.0, 11488.793953], [1516881600000, 11215.0, 11395.0, 10950.21, 11175.27, 9351.16023], [1516924800000, 11184.7, 11643.0, 10311.15, 10513.97, 17937.807726], [1516968000000, 10510.0, 11399.0, 10410.0, 11089.0, 15119.064234], [1517011200000, 11089.0, 11400.0, 10842.69, 11020.0, 9190.499299], [1517054400000, 11018.0, 11650.0, 10968.18, 11491.0, 9670.269046], [1517097600000, 11499.98, 12244.0, 11408.0, 12012.62, 10060.951174], [1517140800000, 12001.94, 12079.9, 11652.0, 11879.95, 6826.38835], [1517184000000, 11879.95, 11975.02, 11139.55, 11279.99, 9258.759356], [1517227200000, 11272.01, 11499.0, 11150.0, 11251.0, 4911.618182], [1517270400000, 11250.11, 11308.42, 10850.0, 11047.34, 6459.968361], [1517313600000, 11050.34, 11096.0, 9900.0, 10237.51, 19094.404585], [1517356800000, 10230.0, 10363.0, 9700.0, 10290.05, 12092.427593], [1517400000000, 10294.97, 10425.85, 9860.0, 10285.1, 5923.529212], [1517443200000, 10285.1, 10335.0, 9500.0, 9591.44, 11690.981262], [1517486400000, 9591.45, 9665.58, 8750.99, 9224.52, 21873.783049], [1517529600000, 9224.52, 9250.0, 8250.92, 8299.75, 20221.802637], [1517572800000, 8299.75, 9247.79, 8010.02, 8873.03, 29749.824338], [1517616000000, 8873.03, 9123.0, 8229.0, 9099.87, 14313.583355], [1517659200000, 9099.87, 9473.01, 8969.0, 9199.96, 14411.41738], [1517702400000, 9199.96, 9368.0, 8687.45, 8691.99, 10563.979369], [1517745600000, 8691.99, 8894.12, 7930.0, 8184.81, 21450.32908], [1517788800000, 8179.99, 8382.8, 7510.0, 7578.0, 19434.947927], [1517832000000, 7572.32, 7788.87, 6625.0, 6939.99, 43968.234652], [1517875200000, 6939.63, 7150.0, 6000.01, 6559.0, 50517.874547], [1517918400000, 6559.0, 7878.0, 6435.99, 7652.14, 49683.62576], [1517961600000, 7655.02, 8274.0, 7150.01, 8151.53, 30434.619906], [1518004800000, 8138.05, 8476.0, 7531.11, 7599.0, 30343.840591], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518134400000, 7789.9, 8395.0, 7789.9, 8280.11, 3483.805239], [1518177600000, 8288.03, 8738.0, 8201.95, 8683.92, 16999.105586], [1518220800000, 8683.93, 9065.78, 8470.0, 8635.99, 22895.635111], [1518264000000, 8626.12, 8800.0, 8120.0, 8533.98, 26485.877542], [1518307200000, 8533.99, 8549.0, 7726.53, 8140.0, 24411.736125], [1518350400000, 8139.99, 8500.85, 8015.0, 8063.88, 20613.451827], [1518393600000, 8063.82, 8840.82, 8053.0, 8640.01, 22078.429223], [1518436800000, 8640.01, 8989.0, 8502.0, 8903.0, 19909.421267], [1518480000000, 8903.0, 8950.0, 8351.0, 8531.47, 21027.353261], [1518523200000, 8525.08, 8725.0, 8450.0, 8539.9, 14427.619695], [1518566400000, 8535.17, 8930.65, 8533.0, 8927.0, 14985.070283], [1518609600000, 8929.96, 9489.6, 8924.87, 9449.99, 25826.882584], [1518652800000, 9449.98, 9925.17, 9301.5, 9566.56, 27576.042121], [1518696000000, 9560.01, 10219.5, 9560.01, 10000.09, 24851.554594], [1518739200000, 10000.89, 10323.37, 9666.0, 9799.43, 21560.129088], [1518782400000, 9796.01, 10213.3, 9740.0, 10159.98, 16601.076886], [1518825600000, 10156.07, 10877.91, 10050.0, 10683.0, 23500.265321], [1518868800000, 10683.0, 11075.07, 10499.86, 11039.55, 18381.843086], [1518912000000, 11039.55, 11274.0, 10080.0, 10550.0, 36539.672972], [1518955200000, 10550.0, 10874.99, 10331.0, 10383.43, 24597.707756], [1518998400000, 10375.01, 11031.31, 10270.33, 10918.84, 20886.987828], [1519041600000, 10918.84, 11250.0, 10855.0, 11153.0, 19944.429303], [1519084800000, 11147.11, 11650.0, 11141.0, 11400.0, 23703.107287], [1519128000000, 11408.88, 11786.01, 11100.59, 11200.99, 24450.247001], [1519171200000, 11195.07, 11304.03, 10620.0, 10948.0, 33161.448466], [1519214400000, 10948.02, 11109.0, 10200.0, 10437.6, 34952.370288], [1519257600000, 10439.02, 10933.44, 10076.0, 10259.87, 28347.788733], [1519300800000, 10260.0, 10318.0, 9679.0, 9811.04, 38712.37775], [1519344000000, 9815.55, 10230.0, 9570.19, 10180.06, 30086.989335], [1519387200000, 10180.06, 10435.0, 9857.75, 10131.04, 27115.713035], [1519430400000, 10131.04, 10496.97, 9669.94, 9757.0, 22996.470889], [1519473600000, 9757.0, 9839.0, 9352.0, 9694.51, 17891.68541], [1519516800000, 9694.51, 9847.0, 9487.0, 9665.99, 12961.051082], [1519560000000, 9663.98, 9700.0, 9274.8, 9590.0, 15412.466504], [1519603200000, 9590.0, 9754.98, 9350.0, 9715.99, 12523.478504], [1519646400000, 9708.0, 10444.32, 9640.01, 10324.0, 22354.814252], [1519689600000, 10321.0, 10780.0, 10121.0, 10695.0, 16624.208161], [1519732800000, 10698.97, 10870.0, 10463.18, 10569.04, 14081.176962], [1519776000000, 10584.33, 11098.0, 10476.28, 10570.95, 17690.212364], [1519819200000, 10574.13, 10722.0, 10300.0, 10326.76, 13110.771418], [1519862400000, 10325.64, 10745.0, 10240.0, 10671.93, 11137.264051], [1519905600000, 10671.93, 11060.41, 10591.16, 10920.0, 13955.289879], [1519948800000, 10923.36, 11200.0, 10826.52, 10898.95, 14483.02185], [1519992000000, 10898.95, 11130.0, 10770.0, 11039.0, 9427.68824], [1520035200000, 11038.99, 11415.16, 11015.01, 11287.21, 11461.852578], [1520078400000, 11287.21, 11544.0, 11268.0, 11464.48, 9825.300702], [1520121600000, 11464.47, 11470.0, 11050.02, 11159.68, 8925.651671], [1520164800000, 11159.68, 11565.0, 11090.01, 11515.0, 8370.266982], [1520208000000, 11515.0, 11608.0, 11415.01, 11515.0, 6935.609779], [1520251200000, 11515.0, 11710.0, 11441.78, 11454.0, 8208.621284], [1520294400000, 11455.0, 11455.0, 10840.01, 10937.0, 13938.095332], [1520337600000, 10936.0, 11046.24, 10555.48, 10716.48, 15577.477031], [1520380800000, 10716.48, 10899.0, 10400.0, 10635.03, 13225.753669], [1520424000000, 10635.6, 10747.88, 9389.31, 9910.0, 37421.917411], [1520467200000, 9910.0, 10099.0, 9470.0, 9910.09, 17131.415417], [1520510400000, 9902.98, 9968.75, 9060.0, 9271.64, 23978.057809], [1520553600000, 9267.07, 9410.0, 8329.0, 8923.0, 36360.799801], [1520596800000, 8933.91, 9333.33, 8630.0, 9227.0, 27751.491606], [1520640000000, 9230.0, 9490.0, 9073.66, 9345.0, 17807.189099], [1520683200000, 9345.0, 9468.88, 8667.07, 8770.22, 19372.823758], [1520726400000, 8770.22, 9100.66, 8450.0, 9027.68, 17635.444572], [1520769600000, 9025.03, 9740.0, 9015.11, 9533.57, 26690.528814], [1520812800000, 9533.57, 9888.88, 9356.02, 9837.03, 15357.95411], [1520856000000, 9837.04, 9838.0, 8780.0, 9131.34, 26872.82382], [1520899200000, 9131.34, 9474.0, 8870.0, 9044.9, 20406.743269], [1520942400000, 9049.47, 9275.0, 8823.0, 9150.0, 19784.666089], [1520985600000, 9151.92, 9333.78, 8631.78, 8675.08, 16943.956747], [1521028800000, 8675.08, 8791.49, 7900.28, 8170.0, 32764.137361], [1521072000000, 8184.01, 8299.0, 7650.0, 8235.0, 28181.483706], [1521115200000, 8235.0, 8430.0, 7925.15, 8240.98, 24109.538571], [1521158400000, 8240.98, 8324.96, 7900.0, 8192.94, 18147.798111], [1521201600000, 8182.07, 8611.64, 8139.02, 8260.0, 20667.611782], [1521244800000, 8260.0, 8348.62, 8078.0, 8158.0, 12971.273087], [1521288000000, 8158.01, 8177.93, 7721.99, 7824.8, 20138.933242], [1521331200000, 7824.01, 7857.24, 7519.84, 7760.09, 20558.719457], [1521374400000, 7761.19, 8317.4, 7322.0, 8189.99, 38929.512254], [1521417600000, 8189.0, 8456.0, 8088.4, 8330.0, 24954.710371], [1521460800000, 8330.0, 8705.23, 8205.01, 8600.0, 30342.374571], [1521504000000, 8595.01, 8667.0, 8280.0, 8516.0, 19638.280507], [1521547200000, 8517.44, 9050.0, 8429.0, 8909.98, 25226.825328], [1521590400000, 8909.96, 9145.3, 8860.01, 9063.0, 16467.913268], [1521633600000, 9063.0, 9177.01, 8750.6, 8885.0, 23504.492103], [1521676800000, 8884.82, 9100.0, 8620.0, 8642.01, 18884.016321], [1521720000000, 8645.0, 8770.0, 8465.1, 8722.9, 21733.540488], [1521763200000, 8720.0, 8729.5, 8330.0, 8510.0, 18943.824484], [1521806400000, 8509.99, 8909.0, 8269.0, 8898.03, 21047.183182], [1521849600000, 8898.04, 8987.97, 8683.0, 8723.0, 16517.960112], [1521892800000, 8723.0, 8999.95, 8491.0, 8546.86, 18948.64946], [1521936000000, 8531.25, 8599.0, 8365.77, 8407.0, 14196.614337], [1521979200000, 8408.0, 8669.85, 8380.41, 8470.15, 14805.154979], [1522022400000, 8470.14, 8514.89, 8050.0, 8089.0, 17456.695255], [1522065600000, 8089.0, 8268.5, 7831.0, 8134.23, 26576.900405], [1522108800000, 8134.22, 8215.94, 7730.0, 7934.22, 19666.011903], [1522152000000, 7932.2, 8150.17, 7755.58, 7795.51, 17761.636147], [1522195200000, 7795.51, 8109.0, 7728.0, 8040.0, 13622.827428], [1522238400000, 8040.0, 8055.99, 7825.0, 7949.3, 12778.504242], [1522281600000, 7949.3, 7975.0, 7425.4, 7466.97, 21442.95771], [1522324800000, 7466.89, 7580.0, 6941.11, 7090.14, 33177.957415], [1522368000000, 7090.16, 7292.43, 6666.66, 7027.72, 37577.898142], [1522411200000, 7027.73, 7040.01, 6600.1, 6840.23, 27728.133834], [1522454400000, 6840.24, 7148.2, 6777.0, 7073.63, 20263.488808], [1522497600000, 7079.72, 7223.36, 6842.97, 6923.91, 16605.050279], [1522540800000, 6922.0, 7049.98, 6623.97, 6685.1, 14578.838833], [1522584000000, 6688.53, 6961.83, 6430.0, 6813.01, 29492.59163], [1522627200000, 6813.01, 7125.0, 6765.0, 7046.01, 16763.392279], [1522670400000, 7046.0, 7070.0, 6873.32, 7056.0, 15360.167793], [1522713600000, 7063.97, 7447.99, 7011.01, 7307.48, 20247.387067], [1522756800000, 7302.03, 7520.0, 7277.0, 7405.21, 17539.944744], [1522800000000, 7405.21, 7427.52, 7001.0, 7058.0, 20139.322048], [1522843200000, 7055.0, 7123.98, 6707.0, 6796.1, 22087.861756], [1522886400000, 6796.1, 6902.0, 6566.69, 6779.0, 20658.831999], [1522929600000, 6778.99, 6899.0, 6612.11, 6770.76, 18370.899461], [1522972800000, 6770.0, 6850.0, 6500.0, 6600.0, 17299.40651], [1523016000000, 6600.0, 6634.88, 6516.67, 6601.39, 10155.60541], [1523059200000, 6601.39, 6929.86, 6586.28, 6862.04, 16223.885991], [1523102400000, 6862.04, 7070.0, 6760.0, 6895.8, 16045.692276], [1523145600000, 6895.81, 7100.0, 6880.0, 7099.85, 10649.784758], [1523188800000, 7100.0, 7109.13, 6937.03, 7018.0, 10777.888407], [1523232000000, 7011.04, 7185.0, 6691.18, 6745.0, 19507.74773], [1523275200000, 6740.0, 6795.0, 6611.0, 6782.72, 14570.549476], [1523318400000, 6781.55, 6820.0, 6656.0, 6735.0, 10808.334848], [1523361600000, 6735.0, 6890.0, 6719.91, 6843.9, 11518.393247], [1523404800000, 6839.56, 6872.71, 6787.0, 6851.97, 10255.173843], [1523448000000, 6851.53, 6990.0, 6840.0, 6953.79, 13742.697334], [1523491200000, 6953.78, 8012.23, 6743.2, 7690.0, 31646.817637], [1523534400000, 7685.55, 7986.1, 7542.0, 7923.0, 33214.77835], [1523577600000, 7922.99, 8195.84, 7732.0, 8091.0, 27022.676585], [1523620800000, 8091.4, 8233.39, 7768.47, 7877.41, 28021.846563], [1523664000000, 7877.48, 8186.0, 7810.0, 7965.32, 17721.661899], [1523707200000, 7965.0, 8090.23, 7849.46, 7999.01, 13899.624458], [1523750400000, 8004.0, 8429.54, 7999.02, 8330.0, 14948.629189], [1523793600000, 8330.0, 8380.0, 8230.0, 8355.0, 12998.091255], [1523836800000, 8355.07, 8419.0, 8000.0, 8086.0, 20076.570217], [1523880000000, 8086.0, 8087.11, 7867.0, 8064.92, 16587.499498], [1523923200000, 8064.92, 8173.7, 7956.17, 8124.87, 14532.045928], [1523966400000, 8124.87, 8156.0, 7825.4, 7885.02, 17620.557639], [1524009600000, 7890.96, 8149.89, 7868.0, 8103.0, 12531.287874], [1524052800000, 8104.0, 8236.43, 7931.01, 8173.0, 14437.756696], [1524096000000, 8173.99, 8290.0, 8080.0, 8207.01, 15270.818441], [1524139200000, 8207.0, 8296.0, 8171.56, 8278.0, 11843.029023], [1524182400000, 8273.84, 8540.37, 8177.09, 8515.01, 20736.89308], [1524225600000, 8515.0, 8930.0, 8431.86, 8856.98, 19058.444405], [1524268800000, 8852.12, 9035.0, 8565.0, 8700.0, 26058.186328], [1524312000000, 8700.01, 8930.0, 8680.0, 8915.31, 14814.043581], [1524355200000, 8915.31, 9020.0, 8786.8, 8916.01, 12368.081112], [1524398400000, 8916.01, 9020.67, 8727.68, 8787.02, 17090.172368], [1524441600000, 8785.7, 8970.01, 8745.0, 8910.02, 13631.125276], [1524484800000, 8910.02, 8985.0, 8800.6, 8934.01, 12206.989433], [1524528000000, 8934.0, 9349.0, 8922.0, 9294.57, 20615.802073], [1524571200000, 9294.59, 9731.01, 9155.0, 9619.99, 25652.988033], [1524614400000, 9618.96, 9759.82, 8960.0, 9144.03, 45362.929231], [1524657600000, 9137.0, 9210.21, 8730.0, 8869.99, 35747.108358], [1524700800000, 8869.99, 8977.0, 8651.62, 8857.01, 24608.392709], [1524744000000, 8858.51, 9307.48, 8740.01, 9266.0, 18691.911536], [1524787200000, 9267.03, 9395.0, 9104.88, 9309.0, 17631.888624], [1524830400000, 9308.9, 9355.0, 8889.0, 8915.35, 19609.458412], [1524873600000, 8915.35, 9330.0, 8870.0, 9289.98, 15312.14062]], "1d": [[1502928000000, 4261.48, 4485.39, 4200.74, 4285.08, 795.150377], [1503014400000, 4285.08, 4371.52, 3938.77, 4108.37, 1199.888264], [1503100800000, 4108.37, 4184.69, 3850.0, 4139.98, 381.309763], [1503187200000, 4120.98, 4211.08, 4032.62, 4086.29, 467.083022], [1503273600000, 4069.13, 4119.62, 3911.79, 4016.0, 691.74306], [1503360000000, 4016.0, 4104.82, 3400.0, 4040.0, 966.684858], [1503446400000, 4040.0, 4265.8, 4013.89, 4114.01, 1001.136565], [1503532800000, 4147.0, 4371.68, 4085.01, 4316.01, 787.418753], [1503619200000, 4316.01, 4453.91, 4247.48, 4280.68, 573.61274], [1503705600000, 4280.71, 4367.0, 4212.41, 4337.44, 228.108068], [1503792000000, 4332.51, 4400.0, 4285.54, 4310.01, 350.692585], [1503878400000, 4310.01, 4399.82, 4124.54, 4386.69, 603.841616], [1503964800000, 4353.65, 4625.85, 4313.55, 4587.48, 603.545028], [1504051200000, 4564.52, 4647.51, 4416.01, 4555.14, 808.468771], [1504137600000, 4555.14, 4745.42, 4555.14, 4724.89, 556.956802], [1504224000000, 4689.89, 4885.55, 4654.88, 4834.91, 560.666366], [1504310400000, 4796.16, 4939.19, 4286.87, 4472.14, 929.148595], [1504396800000, 4508.5, 4714.76, 4298.33, 4509.08, 691.216198], [1504483200000, 4505.0, 4527.49, 3972.51, 4100.11, 1394.644614], [1504569600000, 4106.97, 4484.99, 3603.0, 4366.47, 1228.938157], [1504656000000, 4366.49, 4662.87, 4335.26, 4619.77, 807.363726], [1504742400000, 4619.77, 4788.59, 4438.19, 4691.61, 500.429975], [1504828800000, 4691.66, 4735.39, 4028.93, 4282.8, 1132.255046], [1504915200000, 4282.8, 4426.62, 4150.06, 4258.81, 658.782952], [1505001600000, 4258.81, 4283.0, 3801.0, 4130.37, 660.373275], [1505088000000, 4153.62, 4334.43, 4098.91, 4208.47, 699.989065], [1505174400000, 4208.6, 4394.59, 4040.8, 4163.72, 879.630319], [1505260800000, 4159.72, 4165.38, 3760.0, 3944.69, 913.462545], [1505347200000, 3944.0, 3993.0, 3165.13, 3189.02, 1665.021543], [1505433600000, 3188.01, 3856.0, 2817.0, 3700.0, 1968.866492], [1505520000000, 3674.01, 3950.0, 3470.66, 3714.95, 1297.563953], [1505606400000, 3685.23, 3748.21, 3499.02, 3699.99, 682.17121], [1505692800000, 3690.0, 4123.2, 3690.0, 4035.01, 1030.006455], [1505779200000, 4060.0, 4089.97, 3830.91, 3910.04, 902.332129], [1505865600000, 3910.04, 4046.08, 3820.0, 3900.0, 720.935076], [1505952000000, 3889.99, 3910.0, 3567.0, 3609.99, 1001.654084], [1506038400000, 3592.84, 3750.0, 3505.55, 3595.87, 838.966425], [1506124800000, 3595.88, 3817.19, 3542.91, 3780.0, 752.792791], [1506211200000, 3779.54, 3789.99, 3622.76, 3660.02, 661.63639], [1506297600000, 3660.02, 3979.87, 3653.69, 3920.75, 727.994713], [1506384000000, 3928.0, 3976.99, 3850.05, 3882.35, 526.727987], [1506470400000, 3882.36, 4249.94, 3872.81, 4193.0, 628.170966], [1506556800000, 4192.11, 4300.0, 4101.0, 4174.5, 849.785325], [1506643200000, 4178.98, 4263.86, 3952.01, 4174.69, 1602.309565], [1506729600000, 4175.0, 4380.0, 4138.1, 4378.51, 720.353183], [1506816000000, 4378.49, 4406.52, 4240.04, 4378.48, 726.963685], [1506902400000, 4400.0, 4561.63, 4360.0, 4380.0, 655.756974], [1506988800000, 4380.0, 4467.33, 4180.8, 4310.0, 1082.323563], [1507075200000, 4314.9, 4373.0, 4142.0, 4208.59, 868.465101], [1507161600000, 4208.59, 4355.0, 4110.0, 4292.43, 779.138638], [1507248000000, 4318.99, 4417.0, 4292.0, 4369.0, 506.529176], [1507334400000, 4369.0, 4479.5, 4312.56, 4423.0, 297.5975], [1507420800000, 4425.0, 4658.0, 4425.0, 4640.0, 518.462004], [1507507200000, 4640.0, 4889.98, 4550.0, 4786.95, 646.463145], [1507593600000, 4786.95, 4960.0, 4680.59, 4783.06, 1043.221773], [1507680000000, 4783.06, 4881.61, 4710.0, 4821.43, 753.429396], [1507766400000, 4821.43, 5439.99, 4810.16, 5430.0, 1276.701482], [1507852800000, 5439.99, 5846.17, 5379.84, 5649.98, 1879.82762], [1507939200000, 5650.0, 5900.0, 5580.01, 5869.99, 970.759046], [1508025600000, 5855.03, 5922.3, 5400.01, 5709.99, 1343.523375], [1508112000000, 5710.0, 5788.91, 5585.19, 5760.02, 1528.996462], [1508198400000, 5760.0, 5774.98, 5508.63, 5595.0, 1429.869376], [1508284800000, 5595.0, 5596.0, 5037.95, 5512.06, 2317.804373], [1508371200000, 5513.0, 5710.0, 5490.26, 5683.9, 1881.722107], [1508457600000, 5683.31, 6110.0, 5600.0, 6010.01, 1972.97722], [1508544000000, 6013.72, 6171.0, 5850.03, 6024.97, 1664.307693], [1508630400000, 6003.27, 6060.0, 5720.03, 5950.02, 1362.092216], [1508716800000, 5975.0, 6080.0, 5621.03, 5915.93, 1812.557715], [1508803200000, 5909.47, 5925.0, 5450.0, 5477.03, 2580.418767], [1508889600000, 5506.92, 5704.96, 5286.98, 5689.99, 2282.813205], [1508976000000, 5670.1, 5939.99, 5650.0, 5861.77, 1972.965882], [1509062400000, 5861.77, 5980.0, 5649.24, 5768.83, 1403.706416], [1509148800000, 5768.79, 5850.02, 5630.03, 5719.64, 1276.754412], [1509235200000, 5709.98, 6189.88, 5648.01, 6169.98, 1804.778173], [1509321600000, 6133.01, 6248.68, 6030.0, 6120.5, 1473.687043], [1509408000000, 6120.52, 6498.01, 6100.0, 6463.0, 1511.774925], [1509494400000, 6463.0, 6774.67, 6338.02, 6753.98, 1675.615188], [1509580800000, 6753.98, 7300.0, 6685.1, 7019.98, 2503.610803], [1509667200000, 7010.31, 7346.34, 6923.0, 7115.04, 1891.497592], [1509753600000, 7115.02, 7480.99, 6901.0, 7357.09, 1399.191767], [1509840000000, 7357.27, 7590.25, 7279.02, 7345.01, 1207.83233], [1509926400000, 7345.1, 7401.0, 6906.0, 6960.12, 1763.019261], [1510012800000, 6981.72, 7198.49, 6901.0, 7064.04, 1440.259494], [1510099200000, 7070.0, 7770.02, 6651.0, 7303.0, 2822.298802], [1510185600000, 7303.01, 7392.0, 7015.0, 7079.99, 1913.398308], [1510272000000, 7079.0, 7279.91, 6255.01, 6506.98, 3254.704105], [1510358400000, 6503.0, 6797.98, 6100.0, 6245.05, 2754.156861], [1510444800000, 6245.05, 6630.0, 5325.01, 5811.03, 4968.483069], [1510531200000, 5839.94, 6697.47, 5699.99, 6465.99, 2621.243039], [1510617600000, 6465.99, 6684.98, 6311.07, 6574.99, 1254.292531], [1510704000000, 6575.99, 7298.0, 6575.99, 7240.06, 1779.605845], [1510790400000, 7240.14, 7940.0, 7076.0, 7864.5, 2331.95675], [1510876800000, 7876.98, 7989.0, 7451.0, 7699.19, 3982.395925], [1510963200000, 7680.01, 7819.99, 7422.0, 7761.94, 3954.266477], [1511049600000, 7761.94, 8123.15, 7650.33, 8038.0, 3867.340444], [1511136000000, 8057.11, 8319.99, 7954.0, 8212.0, 3886.634348], [1511222400000, 8212.49, 8400.0, 7801.0, 8119.51, 4544.474016], [1511308800000, 8091.09, 8322.68, 8091.09, 8205.92, 3545.00571], [1511395200000, 8233.03, 8260.0, 8000.0, 8019.99, 4093.952687], [1511481600000, 8019.97, 8369.0, 7850.0, 8138.0, 4411.789112], [1511568000000, 8138.99, 8734.78, 8090.0, 8700.01, 4292.623682], [1511654400000, 8700.04, 9350.0, 8604.72, 9128.02, 4147.380237], [1511740800000, 9128.0, 9654.28, 9112.04, 9650.0, 4521.625707], [1511827200000, 9650.0, 9939.0, 9570.5, 9896.8, 4917.210985], [1511913600000, 9896.79, 11300.03, 8520.0, 9687.88, 13352.538715], [1512000000000, 9687.88, 10900.0, 8850.8, 9838.96, 9389.574329], [1512086400000, 9837.0, 10898.0, 9380.0, 10782.99, 6134.923633], [1512172800000, 10775.04, 11190.0, 10620.0, 10890.01, 4765.439757], [1512259200000, 10902.69, 11825.0, 10500.0, 11165.41, 5346.636524], [1512345600000, 11165.41, 11600.0, 10802.0, 11579.0, 4663.424562], [1512432000000, 11571.03, 11853.0, 11447.68, 11699.99, 5550.732055], [1512518400000, 11699.99, 13615.23, 11665.58, 13550.05, 6707.946319], [1512604800000, 13541.01, 16649.96, 13050.0, 16599.0, 7487.065695], [1512691200000, 16599.0, 17204.99, 14015.0, 15880.0, 17589.013136], [1512777600000, 15880.01, 16269.3, 12535.0, 14656.07, 13918.758687], [1512864000000, 14664.01, 15720.12, 12368.0, 14899.98, 16553.037173], [1512950400000, 14946.26, 17470.0, 14901.08, 16587.97, 11820.401762], [1513036800000, 16587.97, 16976.45, 15875.0, 16349.99, 9436.802411], [1513123200000, 16349.99, 16546.0, 14666.56, 16033.29, 12416.328801], [1513209600000, 16030.34, 16445.0, 15450.0, 16334.98, 11616.867151], [1513296000000, 16334.98, 17991.0, 16298.45, 17539.83, 9181.273947], [1513382400000, 17516.81, 19539.0, 17190.01, 19102.66, 4202.628709], [1513468800000, 19120.19, 19798.68, 18510.0, 18860.02, 9177.183434], [1513555200000, 18860.04, 19300.0, 17029.98, 18856.25, 10624.633071], [1513641600000, 18856.25, 18950.0, 16300.0, 17295.2, 13210.74822], [1513728000000, 17295.2, 17720.35, 14777.66, 16488.98, 13450.496693], [1513814400000, 16480.52, 17309.5, 14022.0, 15492.64, 20324.2173], [1513900800000, 15514.03, 15699.34, 10961.0, 13326.61, 36076.271175], [1513987200000, 13326.61, 14950.0, 12978.18, 13300.0, 13141.538875], [1514073600000, 13300.0, 13819.99, 11640.0, 13500.0, 28557.534988], [1514160000000, 13500.0, 14300.0, 12708.0, 13699.34, 15748.207607], [1514246400000, 13699.34, 16050.0, 13533.0, 15689.01, 15034.668104], [1514332800000, 15709.98, 16498.05, 14200.15, 15459.99, 14959.864723], [1514419200000, 15459.97, 15539.99, 13150.0, 14182.11, 21717.858014], [1514505600000, 14199.14, 14981.0, 13850.0, 14378.9, 18072.008116], [1514592000000, 14378.99, 14398.85, 11750.0, 12440.01, 19221.158039], [1514678400000, 12345.1, 14050.11, 12149.98, 13716.36, 11768.989718], [1514764800000, 13715.65, 13818.55, 12750.0, 13380.0, 8609.915844], [1514851200000, 13382.16, 15473.49, 12890.02, 14675.11, 20078.092111], [1514937600000, 14690.0, 15307.56, 14150.0, 14919.51, 15905.667639], [1515024000000, 14919.51, 15280.0, 13918.04, 15059.54, 21329.649574], [1515110400000, 15059.56, 17176.24, 14600.0, 16960.39, 23251.491125], [1515196800000, 16960.39, 17143.13, 16011.21, 17069.79, 18571.457508], [1515283200000, 17069.79, 17099.96, 15610.0, 16150.03, 12493.125558], [1515369600000, 16218.85, 16322.3, 12812.0, 14902.54, 26600.609912], [1515456000000, 14902.54, 15500.0, 14011.05, 14400.0, 14315.004253], [1515542400000, 14401.0, 14955.66, 13131.31, 14907.09, 17411.001655], [1515628800000, 14940.0, 14968.68, 11400.0, 13238.78, 33554.723751], [1515715200000, 13238.76, 14109.78, 12500.0, 13740.01, 16417.162137], [1515801600000, 13749.95, 14580.0, 13706.15, 14210.0, 12221.508528], [1515888000000, 14210.0, 14339.5, 12569.2, 13474.99, 17017.894329], [1515974400000, 13477.98, 14249.99, 13147.79, 13539.93, 14652.094705], [1516060800000, 13500.0, 13542.93, 9035.0, 10900.0, 63401.169175], [1516147200000, 10899.99, 11680.99, 9037.94, 10988.79, 72331.796646], [1516233600000, 10972.59, 11878.82, 10435.33, 10961.97, 48464.434937], [1516320000000, 10960.0, 11795.0, 10360.0, 11474.98, 34129.375421], [1516406400000, 11474.98, 13099.0, 11412.45, 12799.94, 28768.857827], [1516492800000, 12799.8, 12799.8, 10965.0, 11530.0, 41379.773426], [1516579200000, 11530.0, 11926.35, 9900.24, 10760.05, 43752.606791], [1516665600000, 10760.05, 11399.0, 9905.0, 10799.18, 37473.922552], [1516752000000, 10799.14, 11570.48, 10500.0, 11349.99, 27158.587762], [1516838400000, 11349.96, 11794.05, 10950.21, 11175.27, 20839.954183], [1516924800000, 11184.7, 11643.0, 10311.15, 11089.0, 33056.87196], [1517011200000, 11089.0, 11650.0, 10842.69, 11491.0, 18860.768345], [1517097600000, 11499.98, 12244.0, 11408.0, 11879.95, 16887.339524], [1517184000000, 11879.95, 11975.02, 11139.55, 11251.0, 14170.377538], [1517270400000, 11250.11, 11308.42, 9900.0, 10237.51, 25554.372946], [1517356800000, 10230.0, 10425.85, 9700.0, 10285.1, 18015.956805], [1517443200000, 10285.1, 10335.0, 8750.99, 9224.52, 33564.764311], [1517529600000, 9224.52, 9250.0, 8010.02, 8873.03, 49971.626975], [1517616000000, 8873.03, 9473.01, 8229.0, 9199.96, 28725.000735], [1517702400000, 9199.96, 9368.0, 7930.0, 8184.81, 32014.308449], [1517788800000, 8179.99, 8382.8, 6625.0, 6939.99, 63403.182579], [1517875200000, 6939.63, 7878.0, 6000.01, 7652.14, 100201.500307], [1517961600000, 7655.02, 8476.0, 7150.01, 7599.0, 60778.460497], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518134400000, 7789.9, 8738.0, 7789.9, 8683.92, 20482.910825], [1518220800000, 8683.93, 9065.78, 8120.0, 8533.98, 49381.512653], [1518307200000, 8533.99, 8549.0, 7726.53, 8063.88, 45025.187952], [1518393600000, 8063.82, 8989.0, 8053.0, 8903.0, 41987.85049], [1518480000000, 8903.0, 8950.0, 8351.0, 8539.9, 35454.972956], [1518566400000, 8535.17, 9489.6, 8533.0, 9449.99, 40811.952867], [1518652800000, 9449.98, 10219.5, 9301.5, 10000.09, 52427.596715], [1518739200000, 10000.89, 10323.37, 9666.0, 10159.98, 38161.205974], [1518825600000, 10156.07, 11075.07, 10050.0, 11039.55, 41882.108407], [1518912000000, 11039.55, 11274.0, 10080.0, 10383.43, 61137.380728], [1518998400000, 10375.01, 11250.0, 10270.33, 11153.0, 40831.417131], [1519084800000, 11147.11, 11786.01, 11100.59, 11200.99, 48153.354288], [1519171200000, 11195.07, 11304.03, 10200.0, 10437.6, 68113.818754], [1519257600000, 10439.02, 10933.44, 9679.0, 9811.04, 67060.166483], [1519344000000, 9815.55, 10435.0, 9570.19, 10131.04, 57202.70237], [1519430400000, 10131.04, 10496.97, 9352.0, 9694.51, 40888.156299], [1519516800000, 9694.51, 9847.0, 9274.8, 9590.0, 28373.517586], [1519603200000, 9590.0, 10444.32, 9350.0, 10324.0, 34878.292756], [1519689600000, 10321.0, 10870.0, 10121.0, 10569.04, 30705.385123], [1519776000000, 10584.33, 11098.0, 10300.0, 10326.76, 30800.983782], [1519862400000, 10325.64, 11060.41, 10240.0, 10920.0, 25092.55393], [1519948800000, 10923.36, 11200.0, 10770.0, 11039.0, 23910.71009], [1520035200000, 11038.99, 11544.0, 11015.01, 11464.48, 21287.15328], [1520121600000, 11464.47, 11565.0, 11050.02, 11515.0, 17295.918653], [1520208000000, 11515.0, 11710.0, 11415.01, 11454.0, 15144.231063], [1520294400000, 11455.0, 11455.0, 10555.48, 10716.48, 29515.572363], [1520380800000, 10716.48, 10899.0, 9389.31, 9910.0, 50647.67108], [1520467200000, 9910.0, 10099.0, 9060.0, 9271.64, 41109.473226], [1520553600000, 9267.07, 9410.0, 8329.0, 9227.0, 64112.291407], [1520640000000, 9230.0, 9490.0, 8667.07, 8770.22, 37180.012857], [1520726400000, 8770.22, 9740.0, 8450.0, 9533.57, 44325.973386], [1520812800000, 9533.57, 9888.88, 8780.0, 9131.34, 42230.77793], [1520899200000, 9131.34, 9474.0, 8823.0, 9150.0, 40191.409358], [1520985600000, 9151.92, 9333.78, 7900.28, 8170.0, 49708.094108], [1521072000000, 8184.01, 8430.0, 7650.0, 8240.98, 52291.022277], [1521158400000, 8240.98, 8611.64, 7900.0, 8260.0, 38815.409893], [1521244800000, 8260.0, 8348.62, 7721.99, 7824.8, 33110.206329], [1521331200000, 7824.01, 8317.4, 7322.0, 8189.99, 59488.231711], [1521417600000, 8189.0, 8705.23, 8088.4, 8600.0, 55297.084942], [1521504000000, 8595.01, 9050.0, 8280.0, 8909.98, 44865.105835], [1521590400000, 8909.96, 9177.01, 8750.6, 8885.0, 39972.405371], [1521676800000, 8884.82, 9100.0, 8465.1, 8722.9, 40617.556809], [1521763200000, 8720.0, 8909.0, 8269.0, 8898.03, 39991.007666], [1521849600000, 8898.04, 8999.95, 8491.0, 8546.86, 35466.609572], [1521936000000, 8531.25, 8669.85, 8365.77, 8470.15, 29001.769316], [1522022400000, 8470.14, 8514.89, 7831.0, 8134.23, 44033.59566], [1522108800000, 8134.22, 8215.94, 7730.0, 7795.51, 37427.64805], [1522195200000, 7795.51, 8109.0, 7728.0, 7949.3, 26401.33167], [1522281600000, 7949.3, 7975.0, 6941.11, 7090.14, 54620.915125], [1522368000000, 7090.16, 7292.43, 6600.1, 6840.23, 65306.031976], [1522454400000, 6840.24, 7223.36, 6777.0, 6923.91, 36868.539087], [1522540800000, 6922.0, 7049.98, 6430.0, 6813.01, 44071.430463], [1522627200000, 6813.01, 7125.0, 6765.0, 7056.0, 32123.560072], [1522713600000, 7063.97, 7520.0, 7011.01, 7405.21, 37787.331811], [1522800000000, 7405.21, 7427.52, 6707.0, 6796.1, 42227.183804], [1522886400000, 6796.1, 6902.0, 6566.69, 6770.76, 39029.73146], [1522972800000, 6770.0, 6850.0, 6500.0, 6601.39, 27455.01192], [1523059200000, 6601.39, 7070.0, 6586.28, 6895.8, 32269.578267], [1523145600000, 6895.81, 7109.13, 6880.0, 7018.0, 21427.673165], [1523232000000, 7011.04, 7185.0, 6611.0, 6782.72, 34078.297206], [1523318400000, 6781.55, 6890.0, 6656.0, 6843.9, 22326.728095], [1523404800000, 6839.56, 6990.0, 6787.0, 6953.79, 23997.871177], [1523491200000, 6953.78, 8012.23, 6743.2, 7923.0, 64861.595987], [1523577600000, 7922.99, 8233.39, 7732.0, 7877.41, 55044.523148], [1523664000000, 7877.48, 8186.0, 7810.0, 7999.01, 31621.286357], [1523750400000, 8004.0, 8429.54, 7999.02, 8355.0, 27946.720444], [1523836800000, 8355.07, 8419.0, 7867.0, 8064.92, 36664.069715], [1523923200000, 8064.92, 8173.7, 7825.4, 7885.02, 32152.603567], [1524009600000, 7890.96, 8236.43, 7868.0, 8173.0, 26969.04457], [1524096000000, 8173.99, 8296.0, 8080.0, 8278.0, 27113.847464], [1524182400000, 8273.84, 8930.0, 8177.09, 8856.98, 39795.337485], [1524268800000, 8852.12, 9035.0, 8565.0, 8915.31, 40872.229909], [1524355200000, 8915.31, 9020.67, 8727.68, 8787.02, 29458.25348], [1524441600000, 8785.7, 8985.0, 8745.0, 8934.01, 25838.114709], [1524528000000, 8934.0, 9731.01, 8922.0, 9619.99, 46268.790106], [1524614400000, 9618.96, 9759.82, 8730.0, 8869.99, 81110.037589], [1524700800000, 8869.99, 9307.48, 8651.62, 9266.0, 43300.304245], [1524787200000, 9267.03, 9395.0, 8889.0, 8915.35, 37241.347036], [1524873600000, 8915.35, 9330.0, 8870.0, 9284.35, 15312.145401]], "3d": [[1502928000000, 4261.48, 4485.39, 3850.0, 4139.98, 2376.348404], [1503187200000, 4120.98, 4211.08, 3400.0, 4040.0, 2125.51094], [1503446400000, 4040.0, 4453.91, 4013.89, 4280.68, 2362.168058], [1503705600000, 4280.71, 4400.0, 4124.54, 4386.69, 1182.642269], [1503964800000, 4353.65, 4745.42, 4313.55, 4724.89, 1968.970601], [1504224000000, 4689.89, 4939.19, 4286.87, 4509.08, 2181.031159], [1504483200000, 4505.0, 4662.87, 3603.0, 4619.77, 3430.946497], [1504742400000, 4619.77, 4788.59, 4028.93, 4258.81, 2291.467973], [1505001600000, 4258.81, 4394.59, 3801.0, 4163.72, 2239.992659], [1505260800000, 4159.72, 4165.38, 2817.0, 3700.0, 4547.35058], [1505520000000, 3674.01, 4123.2, 3470.66, 4035.01, 3009.741618], [1505779200000, 4060.0, 4089.97, 3567.0, 3609.99, 2624.921289], [1506038400000, 3592.84, 3817.19, 3505.55, 3660.02, 2253.395606], [1506297600000, 3660.02, 4249.94, 3653.69, 4193.0, 1882.893666], [1506556800000, 4192.11, 4380.0, 3952.01, 4378.51, 3172.448073], [1506816000000, 4378.49, 4561.63, 4180.8, 4310.0, 2465.044222], [1507075200000, 4314.9, 4417.0, 4110.0, 4369.0, 2154.132915], [1507334400000, 4369.0, 4889.98, 4312.56, 4786.95, 1462.522649], [1507593600000, 4786.95, 5439.99, 4680.59, 5430.0, 3073.352651], [1507852800000, 5439.99, 5922.3, 5379.84, 5709.99, 4194.110041], [1508112000000, 5710.0, 5788.91, 5037.95, 5512.06, 5276.670211], [1508371200000, 5513.0, 6171.0, 5490.26, 6024.97, 5519.00702], [1508630400000, 6003.27, 6080.0, 5450.0, 5477.03, 5755.068698], [1508889600000, 5506.92, 5980.0, 5286.98, 5768.83, 5659.485503], [1509148800000, 5768.79, 6248.68, 5630.03, 6120.5, 4555.219628], [1509408000000, 6120.52, 7300.0, 6100.0, 7019.98, 5691.000916], [1509667200000, 7010.31, 7590.25, 6901.0, 7345.01, 4498.521689], [1509926400000, 7345.1, 7770.02, 6651.0, 7303.0, 6025.577557], [1510185600000, 7303.01, 7392.0, 6100.0, 6245.05, 7922.259274], [1510444800000, 6245.05, 6697.47, 5325.01, 6574.99, 8844.018639], [1510704000000, 6575.99, 7989.0, 6575.99, 7699.19, 8093.95852], [1510963200000, 7680.01, 8319.99, 7422.0, 8212.0, 11708.241269], [1511222400000, 8212.49, 8400.0, 7801.0, 8019.99, 12183.432413], [1511481600000, 8019.97, 9350.0, 7850.0, 9128.02, 12851.793031], [1511740800000, 9128.0, 11300.03, 8520.0, 9687.88, 22791.375407], [1512000000000, 9687.88, 11190.0, 8850.8, 10890.01, 20289.937719], [1512259200000, 10902.69, 11853.0, 10500.0, 11699.99, 15560.793141], [1512518400000, 11699.99, 17204.99, 11665.58, 15880.0, 31784.02515], [1512777600000, 15880.01, 17470.0, 12368.0, 16587.97, 42292.197622], [1513036800000, 16587.97, 16976.45, 14666.56, 16334.98, 33469.998363], [1513296000000, 16334.98, 19798.68, 16298.45, 18860.02, 22561.08609], [1513555200000, 18860.04, 19300.0, 14777.66, 16488.98, 37285.877984], [1513814400000, 16480.52, 17309.5, 10961.0, 13300.0, 69542.02735], [1514073600000, 13300.0, 16050.0, 11640.0, 15689.01, 59340.410699], [1514332800000, 15709.98, 16498.05, 13150.0, 14378.9, 54749.730853], [1514592000000, 14378.99, 14398.85, 11750.0, 13380.0, 39600.063601], [1514851200000, 13382.16, 15473.49, 12890.02, 15059.54, 57313.409324], [1515110400000, 15059.56, 17176.24, 14600.0, 16150.03, 54316.074191], [1515369600000, 16218.85, 16322.3, 12812.0, 14907.09, 58326.61582], [1515628800000, 14940.0, 14968.68, 11400.0, 14210.0, 62193.394416], [1515888000000, 14210.0, 14339.5, 9035.0, 10900.0, 95071.158209], [1516147200000, 10899.99, 11878.82, 9037.94, 11474.98, 154925.607004], [1516406400000, 11474.98, 13099.0, 9900.24, 10760.05, 113901.238044], [1516665600000, 10760.05, 11794.05, 9905.0, 11175.27, 85472.464497], [1516924800000, 11184.7, 12244.0, 10311.15, 11879.95, 68804.979829], [1517184000000, 11879.95, 11975.02, 9700.0, 10285.1, 57740.707289], [1517443200000, 10285.1, 10335.0, 8010.02, 9199.96, 112261.392021], [1517702400000, 9199.96, 9368.0, 6000.01, 7652.14, 195618.991335], [1517961600000, 7655.02, 8738.0, 7150.01, 8683.92, 82782.90864], [1518220800000, 8683.93, 9065.78, 7726.53, 8903.0, 136394.551095], [1518480000000, 8903.0, 10219.5, 8351.0, 10000.09, 128694.522538], [1518739200000, 10000.89, 11274.0, 9666.0, 10383.43, 141180.695109], [1518998400000, 10375.01, 11786.01, 10200.0, 10437.6, 157098.590173], [1519257600000, 10439.02, 10933.44, 9352.0, 9694.51, 165151.025152], [1519516800000, 9694.51, 10870.0, 9274.8, 10569.04, 93957.195465], [1519776000000, 10584.33, 11200.0, 10240.0, 11039.0, 79804.247802], [1520035200000, 11038.99, 11710.0, 11015.01, 11454.0, 53727.302996], [1520294400000, 11455.0, 11455.0, 9060.0, 9271.64, 121272.716669], [1520553600000, 9267.07, 9740.0, 8329.0, 9533.57, 145618.27765], [1520812800000, 9533.57, 9888.88, 7900.28, 8170.0, 132130.281396], [1521072000000, 8184.01, 8611.64, 7650.0, 7824.8, 124216.638499], [1521331200000, 7824.01, 9050.0, 7322.0, 8909.98, 159650.422488], [1521590400000, 8909.96, 9177.01, 8269.0, 8898.03, 120580.969846], [1521849600000, 8898.04, 8999.95, 7831.0, 8134.23, 108501.974548], [1522108800000, 8134.22, 8215.94, 6941.11, 7090.14, 118449.894845], [1522368000000, 7090.16, 7292.43, 6430.0, 6813.01, 146246.001526], [1522627200000, 6813.01, 7520.0, 6707.0, 6796.1, 112138.075687], [1522886400000, 6796.1, 7070.0, 6500.0, 6895.8, 98754.321647], [1523145600000, 6895.81, 7185.0, 6611.0, 6843.9, 77832.698466], [1523404800000, 6839.56, 8233.39, 6743.2, 7877.41, 143903.990312], [1523664000000, 7877.48, 8429.54, 7810.0, 8064.92, 96232.076516], [1523923200000, 8064.92, 8296.0, 7825.4, 8278.0, 86235.495601], [1524182400000, 8273.84, 9035.0, 8177.09, 8787.02, 110125.820874], [1524441600000, 8785.7, 9759.82, 8730.0, 8869.99, 153216.942404], [1524700800000, 8869.99, 9395.0, 8651.62, 9289.0, 95853.806724]], "1w": [[1502668800000, 4261.48, 4485.39, 3850.0, 4086.29, 2843.431426], [1503273600000, 4069.13, 4453.91, 3400.0, 4310.01, 4599.396629], [1503878400000, 4310.01, 4939.19, 4124.54, 4509.08, 4753.843376], [1504483200000, 4505.0, 4788.59, 3603.0, 4130.37, 6382.787745], [1505088000000, 4153.62, 4394.59, 2817.0, 3699.99, 8106.705127], [1505692800000, 3690.0, 4123.2, 3505.55, 3660.02, 5908.32335], [1506297600000, 3660.02, 4406.52, 3653.69, 4378.48, 5782.305424], [1506902400000, 4400.0, 4658.0, 4110.0, 4640.0, 4708.272956], [1507507200000, 4640.0, 5922.3, 4550.0, 5709.99, 7913.925837], [1508112000000, 5710.0, 6171.0, 5037.95, 5950.02, 12157.769447], [1508716800000, 5975.0, 6189.88, 5286.98, 6169.98, 13133.99457], [1509321600000, 6133.01, 7590.25, 6030.0, 7345.01, 11663.209648], [1509926400000, 7345.1, 7770.02, 5325.01, 5811.03, 18916.3199], [1510531200000, 5839.94, 8123.15, 5699.99, 8038.0, 19791.101011], [1511136000000, 8057.11, 9350.0, 7801.0, 9128.02, 28921.859792], [1511740800000, 9128.0, 11825.0, 8520.0, 11165.41, 48427.94965], [1512345600000, 11165.41, 17204.99, 10802.0, 14899.98, 72469.977627], [1512950400000, 14946.26, 19798.68, 14666.56, 18860.02, 67851.486215], [1513555200000, 18860.04, 19300.0, 10961.0, 13500.0, 135385.440322], [1514160000000, 13500.0, 16498.05, 11750.0, 13716.36, 116522.754321], [1514764800000, 13715.65, 17176.24, 12750.0, 16150.03, 120239.399359], [1515369600000, 16218.85, 16322.3, 11400.0, 13474.99, 137537.904565], [1515974400000, 13477.98, 14249.99, 9035.0, 11530.0, 303127.502137], [1516579200000, 11530.0, 12244.0, 9900.24, 11879.95, 198030.051117], [1517184000000, 11879.95, 11975.02, 7930.0, 8184.81, 202016.407759], [1517788800000, 8179.99, 9065.78, 6000.01, 8063.88, 340794.292131], [1518393600000, 8063.82, 11274.0, 8053.0, 10383.43, 311863.068137], [1518998400000, 10375.01, 11786.01, 9274.8, 9590.0, 350623.132911], [1519603200000, 9590.0, 11565.0, 9350.0, 11515.0, 183970.997614], [1520208000000, 11515.0, 11710.0, 8329.0, 9533.57, 282035.225382], [1520812800000, 9533.57, 9888.88, 7322.0, 8189.99, 315835.151606], [1521417600000, 8189.0, 9177.01, 8088.4, 8470.15, 285211.539511], [1522022400000, 8470.14, 8514.89, 6430.0, 6813.01, 308729.492031], [1522627200000, 6813.01, 7520.0, 6500.0, 7018.0, 232320.070499], [1523232000000, 7011.04, 8429.54, 6611.0, 8355.0, 259877.022414], [1523836800000, 8355.07, 9035.0, 7825.4, 8787.02, 233025.38619], [1524441600000, 8785.7, 9759.82, 8651.62, 9288.0, 249070.751984]], "1M": [[1501545600000, 4261.48, 4745.42, 3400.0, 4724.89, 10015.640272], [1504224000000, 4689.89, 4939.19, 2817.0, 4378.51, 27634.18912], [1506816000000, 4378.49, 6498.01, 4110.0, 6463.0, 41626.388463], [1509494400000, 6463.0, 11300.03, 5325.01, 9838.96, 108487.978119], [1512086400000, 9837.0, 19798.68, 9380.0, 13716.36, 408476.658399], [1514764800000, 13715.65, 17176.24, 9035.0, 10285.1, 816675.564467], [1517443200000, 10285.1, 11786.01, 6000.01, 10326.76, 1243940.85531], [1519862400000, 10325.64, 11710.0, 6600.1, 6923.91, 1235326.31402], [1522540800000, 6922.0, 9759.82, 6430.0, 9288.0, 1018364.661565]]} \ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 8565a2a70..464db7dfa 100644 --- a/docs/index.html +++ b/docs/index.html @@ -2,7 +2,7 @@ - Trading-Bot : CryptoBot + Drakkars : OctoBot diff --git a/docs/install/install-matplotlib.sh b/docs/install/install-matplotlib.sh new file mode 100755 index 000000000..c98f06acb --- /dev/null +++ b/docs/install/install-matplotlib.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +apt install python3-matplotlib -y +pip3 install git+https://github.com/matplotlib/mpl_finance.git diff --git a/docs/install/install-ta-lib.sh b/docs/install/install-ta-lib.sh index 02c0a8557..fbc2d7439 100755 --- a/docs/install/install-ta-lib.sh +++ b/docs/install/install-ta-lib.sh @@ -4,4 +4,4 @@ tar -xf ta-lib-0.4.0-src.tar.gz cd ta-lib ./configure --prefix=/usr make -sudo make install \ No newline at end of file +make install diff --git a/docs/install/linux_dependencies.sh b/docs/install/linux_dependencies.sh new file mode 100644 index 000000000..95dccb905 --- /dev/null +++ b/docs/install/linux_dependencies.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash +apt install -y build-essential libc6-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev +apt install -y libxml2-dev libxslt1-dev libxslt-dev libjpeg-dev zlib1g-dev libpng12-dev libffi-dev diff --git a/docs/install/linux_installer.sh b/docs/install/linux_installer.sh new file mode 100755 index 000000000..b2c66e3da --- /dev/null +++ b/docs/install/linux_installer.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +apt install -y wget python3 python3-dev python3-pip python3-tk -y +bash ./docs/install/linux_dependencies.sh +bash ./docs/install/install-ta-lib.sh diff --git a/docs/install/raspberry-pre-install.sh b/docs/install/raspberry-pre-install.sh index b0930245f..a66b0ac36 100644 --- a/docs/install/raspberry-pre-install.sh +++ b/docs/install/raspberry-pre-install.sh @@ -1,11 +1,28 @@ -sudo apt-get install -y build-essential libc6-dev -sudo apt-get install -y libncurses5-dev libncursesw5-dev libreadline6-dev -sudo apt-get install -y libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev -sudo apt-get install -y libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev +#!/usr/bin/env bash +if add-apt-repository ppa:jonathonf/python-3.6; then + echo Repository found and compatible, downloading python3.6 from there. + apt update + apt install -y python3 python3-pip +else + echo Impossible to add repository to the list, probably because of a light operating system, installing python3.6 the hard way, this might take several minutes. -sudo apt install -y libxml2-dev libxslt1-dev -sudo apt install -y libffi-dev + echo Step 1/5 "====>" Installing dependancies + bash ./docs/install/linux_dependencies.sh + apt-get install -y tk-dev -sudo add-apt-repository ppa:jonathonf/python-3.6 -sudo apt update -sudo apt install -y python3 python3-pip \ No newline at end of file + echo Step 2/5 "====>" Downloading and preparing Python3.6 to be installed, this might take some time + wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz + tar xf Python-3.6.5.tar.xz + cd Python-3.6.5 + ./configure + + echo Step 3/5 "====>" Installing Python3.6, this takes some time + make altinstall + + echo Step 4/5 "====>" Updating Python3.6 service_identity + pip3.6 install service_identity --force --upgrade + + echo Step 5/5 "====>" Removing installation files + cd .. + rm -rf Python-3.6.5.tar.xz Python-3.6.5 +fi diff --git a/docs/install/windows/windows_installer.bat b/docs/install/windows/windows_installer.bat new file mode 100644 index 000000000..66c3efb49 --- /dev/null +++ b/docs/install/windows/windows_installer.bat @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +@echo off +REM VARS +set bot_location="../../../" +set config_path=config +set python_cmd=python + +REM dependencies url +set TA_LIB_WIN32=https://github.com/Drakkar-Software/OctoBot/releases/download/0.0.12-alpha/TA_Lib-0.4.17-cp36-cp36m-win32.whl +set TA_LIB_WIN64=https://github.com/Drakkar-Software/OctoBot/releases/download/0.0.12-alpha/TA_Lib-0.4.17-cp36-cp36m-win_amd64.whl +set TWISTED_WIN32=https://github.com/Drakkar-Software/OctoBot/releases/download/0.0.12-alpha/Twisted-18.4.0-cp36-cp36m-win32.whl +set TWISTED_WIN64=https://github.com/Drakkar-Software/OctoBot/releases/download/0.0.12-alpha/Twisted-18.4.0-cp36-cp36m-win_amd64.whl + +REM TEST INSTALL +%python_cmd% --version 2>NUL +if errorlevel 1 goto errorNoPython + +REM REQUIREMENTS +echo **Installing dependencies...** +REM ARCH AMD64 +%python_cmd% -m pip install %TA_LIB_WIN64% +%python_cmd% -m pip install %TWISTED_WIN64% + +REM ARCH WIN32 +%python_cmd% -m pip install %TA_LIB_WIN32% +%python_cmd% -m pip install %TWISTED_WIN32% + +REM BOT INSTALL +cd %bot_location% + +REM BOT REQUIREMENTS +echo **Installing requirements...** +%python_cmd% -m pip install -r requirements.txt + +REM CONFIGURATION +echo **Set default configuration...** +cd %config_path% +copy default_config.json config.json +copy default_evaluator_config.json evaluator_config.json + +REM BOT MODULES INSTALL +echo **Installing modules...** +cd .. +%python_cmd% start.py -p install all + +REM Once done, exit the batch file -- skips executing the errorNoPython section +goto:eof + +:errorNoPython +echo. +echo Error^: Python not installed (check https://github.com/Drakkar-Software/OctoBot/wiki/Installation) diff --git a/evaluator/Dispatchers/abstract_dispatcher.py b/evaluator/Dispatchers/abstract_dispatcher.py index f3ad06aa2..cef2a4680 100644 --- a/evaluator/Dispatchers/abstract_dispatcher.py +++ b/evaluator/Dispatchers/abstract_dispatcher.py @@ -1,13 +1,15 @@ import threading from abc import * -from tools.asynchronous_client import AsynchronousClient +from tools.asynchronous_server import AsynchronousServer # ****** Unique dispatcher side ****** class AbstractDispatcher(threading.Thread): __metaclass__ = ABCMeta + _SLEEPING_TIME_BEFORE_RECONNECT_ATTEMPT_SEC = 10 + def __init__(self, config): super().__init__() self.registered_list = [] @@ -24,8 +26,23 @@ def register_client(self, client): self.registered_list.append(client) @abstractmethod + def _start_dispatcher(self): + raise NotImplementedError("start_dispatcher not implemented") + + @abstractmethod + def _something_to_watch(self): + raise NotImplementedError("_something_to_watch not implemented") + + @abstractmethod + def _get_data(self): + raise NotImplementedError("_get_data not implemented") + def run(self): - raise NotImplementedError("run not implemented") + if self.is_setup_correctly: + if self._something_to_watch(): + self._get_data() + self._start_dispatcher() + self.logger.warning("Nothing to monitor, dispatcher is going to sleep.") def get_is_setup_correctly(self): return self.is_setup_correctly @@ -35,7 +52,7 @@ def stop(self): # ****** Implementation side ****** -class DispatcherAbstractClient(AsynchronousClient): +class DispatcherAbstractClient(AsynchronousServer): __metaclass__ = ABCMeta def __init__(self): diff --git a/evaluator/Dispatchers/reddit_dispatcher.py b/evaluator/Dispatchers/reddit_dispatcher.py new file mode 100644 index 000000000..b8b8c400d --- /dev/null +++ b/evaluator/Dispatchers/reddit_dispatcher.py @@ -0,0 +1,99 @@ +import logging +import time +from prawcore.exceptions import RequestException, ResponseException, OAuthException + +from config.cst import * +from evaluator.Dispatchers.abstract_dispatcher import AbstractDispatcher +from services import RedditService + + +class RedditDispatcher(AbstractDispatcher): + def __init__(self, config): + super().__init__(config) + self.logger = logging.getLogger(self.__class__.__name__) + self.subreddits = None + self.counter = 0 + self.social_config = {} + + # check presence of twitter instance + if RedditService.is_setup_correctly(self.config): + self.reddit_service = self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT][CONFIG_SERVICE_INSTANCE] + self.is_setup_correctly = True + else: + self.logger.warning("Required services are not ready") + self.is_setup_correctly = False + + # merge new config into existing config + def update_social_config(self, config): + if CONFIG_REDDIT_SUBREDDITS in self.social_config: + self.social_config[CONFIG_REDDIT_SUBREDDITS] = {**self.social_config[CONFIG_REDDIT_SUBREDDITS], + **config[CONFIG_REDDIT_SUBREDDITS]} + else: + self.social_config[CONFIG_REDDIT_SUBREDDITS] = config[CONFIG_REDDIT_SUBREDDITS] + + def _init_subreddits(self): + self.subreddits = "" + for symbol in self.social_config[CONFIG_REDDIT_SUBREDDITS]: + for subreddit in self.social_config[CONFIG_REDDIT_SUBREDDITS][symbol]: + if subreddit not in self.subreddits: + if self.subreddits: + self.subreddits = self.subreddits + "+" + subreddit + else: + self.subreddits = self.subreddits + subreddit + + def _get_data(self): + if not self.subreddits: + self._init_subreddits() + + def _something_to_watch(self): + return CONFIG_REDDIT_SUBREDDITS in self.social_config and self.social_config[CONFIG_REDDIT_SUBREDDITS] + + def _start_listener(self): + subreddit = self.reddit_service.get_endpoint().subreddit(self.subreddits) + start_time = time.time() + for entry in subreddit.stream.submissions(): + self.counter += 1 + # check if we are in the 100 history or if it's a new entry (new posts are more valuables) + # the older the entry is, the les weight it gets + entry_age_when_dispatcher_started_in_sec = start_time - entry.created_utc + entry_weight = 0 + if entry_age_when_dispatcher_started_in_sec > 0: + # entry in history => weight proportional to entry's age + # last 12 hours: weight = 4 + # last 2 days: weight = 3 + # last 7 days: weight = 2 + # older: weight = 1 + if entry_age_when_dispatcher_started_in_sec / HOURS_TO_SECONDS <= 12: + entry_weight = 4 + elif entry_age_when_dispatcher_started_in_sec / DAYS_TO_SECONDS <= 2: + entry_weight = 3 + elif entry_age_when_dispatcher_started_in_sec / DAYS_TO_SECONDS <= 7: + entry_weight = 2 + else: + entry_weight = 1 + else: + # new entry => max weight + entry_weight = 5 + subreddit_name = entry.subreddit.display_name.lower() + self.notify_registered_clients_if_interested(subreddit_name, + {CONFIG_REDDIT_ENTRY: entry, + CONFIG_REDDIT_ENTRY_WEIGHT: entry_weight}) + + def _start_dispatcher(self): + while self.keep_running: + try: + self._start_listener() + except RequestException: + # probably a connexion loss, try again + time.sleep(self._SLEEPING_TIME_BEFORE_RECONNECT_ATTEMPT_SEC) + except OAuthException as e: + self.logger.error("Error when receiving Reddit feed: '{0}' this may mean {1}" + .format(e, "that reddit login info in config.json are wrong.")) + self.keep_running = False + except ResponseException as e: + self.logger.error("Error when receiving Reddit feed: '{0}' this may mean {1}" + .format(e, "that reddit configuration in config.json are wrong.")) + self.keep_running = False + except Exception as e: + self.logger.error("Error when receiving Reddit feed: '{0}'".format(e)) + self.keep_running = False diff --git a/evaluator/Dispatchers/twitter_dispatcher.py b/evaluator/Dispatchers/twitter_dispatcher.py index f2c15f190..c2ffe6bd6 100644 --- a/evaluator/Dispatchers/twitter_dispatcher.py +++ b/evaluator/Dispatchers/twitter_dispatcher.py @@ -1,5 +1,6 @@ import logging import twitter +import time from config.cst import * from evaluator.Dispatchers.abstract_dispatcher import AbstractDispatcher @@ -66,20 +67,25 @@ def _something_to_watch(self): or (CONFIG_TWITTERS_ACCOUNTS in self.social_config and self.social_config[CONFIG_TWITTERS_ACCOUNTS]) - def run(self): - if self.is_setup_correctly: - if self._something_to_watch(): - self._get_data() - try: - for tweet in self.twitter_service.get_endpoint().GetStreamFilter(follow=self.user_ids, - track=self.hashtags): - self.counter += 1 - string_tweet = self.twitter_service.tweet_to_string(tweet).lower() - tweet_desc = str(tweet).lower() - self.notify_registered_clients_if_interested(tweet_desc, - {CONFIG_TWEET: tweet, - CONFIG_TWEET_DESCRIPTION: string_tweet}) - except twitter.error.TwitterError as e: - self.logger.error("Error when receiving Twitter feed: " + str(e.message)) - else: - self.logger.warning("Nothing to monitor, dispatcher is going to sleep.") + def _start_listener(self): + for tweet in self.twitter_service.get_endpoint().GetStreamFilter(follow=self.user_ids, + track=self.hashtags): + self.counter += 1 + string_tweet = self.twitter_service.get_tweet_text(tweet) + if string_tweet: + tweet_desc = str(tweet).lower() + self.notify_registered_clients_if_interested(tweet_desc, + {CONFIG_TWEET: tweet, + CONFIG_TWEET_DESCRIPTION: string_tweet.lower() + }) + + def _start_dispatcher(self): + while self.keep_running: + try: + self._start_listener() + except twitter.error.TwitterError as e: + self.logger.error("Error when receiving Twitter feed: {0} ({1})".format(e.message, e)) + self.keep_running = False + except Exception as e: + self.logger.error("Error when receiving Twitter feed: {0} ({1})".format(e.message, e)) + self.keep_running = False diff --git a/evaluator/README.md b/evaluator/README.md new file mode 100644 index 000000000..b83386d18 --- /dev/null +++ b/evaluator/README.md @@ -0,0 +1,18 @@ +# Where are evaluators and strategies ? +Because OctoBot is modular, a wide range of evaluators and strategies are usable. + +Default evaluators and strategies are located here: [https://github.com/Drakkar-Software/OctoBot-Packages](https://github.com/Drakkar-Software/OctoBot-Packages). + +To install default evaluators and strategies in your OctoBot, run the command + +```bash +python start.py -p install all +``` + + +It is also possible to specify which module(s) to install by naming it(them). In this case only the modules available in the available packages can be installed. +``` +python start.py -p install forum_evaluator john_smith_macd_evaluator advanced_twitter_evaluator +``` + +**You can find how to create your OctoBot evaluators and strategies [here](https://github.com/Drakkar-Software/OctoBot/wiki/Customize-your-OctoBot).** diff --git a/evaluator/RealTime/Default/.keep b/evaluator/RealTime/Default/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/evaluator/RealTime/__init__.py b/evaluator/RealTime/__init__.py index 3034fc6dd..451104ce0 100644 --- a/evaluator/RealTime/__init__.py +++ b/evaluator/RealTime/__init__.py @@ -1,4 +1,3 @@ from .realtime_evaluator import * -from .instant_fluctuations_evaluator import * -from .orderbook_evaluator import * +from .Default import * from .Advanced import * diff --git a/evaluator/RealTime/instant_fluctuations_evaluator.py b/evaluator/RealTime/instant_fluctuations_evaluator.py deleted file mode 100644 index 7a1571211..000000000 --- a/evaluator/RealTime/instant_fluctuations_evaluator.py +++ /dev/null @@ -1,37 +0,0 @@ -import time - -from evaluator.RealTime.realtime_evaluator import RealTimeTAEvaluator - -from config.cst import * - - -class InstantFluctuationsEvaluator(RealTimeTAEvaluator): - def __init__(self, exchange_inst, symbol): - super().__init__(exchange_inst, symbol) - self.enabled = False - - def refresh_data(self): - self.exchange.get_symbol_prices( - self.symbol, - self.specific_config[CONFIG_TIME_FRAME]) - - def eval_impl(self): - # Can use CDLLONGLINE - Long Line Candle & CDLSHORTLINE - Short Line Candle - # example ! - # check last candle - self.eval_note = 0.42 - something_is_happening = True - if something_is_happening: - self.notify_evaluator_threads(self.__class__.__name__) - - def set_default_config(self): - self.specific_config = { - CONFIG_REFRESH_RATE: 5, - CONFIG_TIME_FRAME: TimeFrames.FIVE_MINUTES - } - - def run(self): - while self.keep_running: - self.refresh_data() - self.eval() - time.sleep(self.specific_config[CONFIG_REFRESH_RATE]) diff --git a/evaluator/RealTime/orderbook_evaluator.py b/evaluator/RealTime/orderbook_evaluator.py deleted file mode 100644 index 6d48265f5..000000000 --- a/evaluator/RealTime/orderbook_evaluator.py +++ /dev/null @@ -1,35 +0,0 @@ -import time - -from config.cst import CONFIG_TIME_FRAME, TimeFrames, CONFIG_REFRESH_RATE -from evaluator.RealTime import RealTimeTAEvaluator - - -class WhalesOrderBookEvaluator(RealTimeTAEvaluator): - def __init__(self, exchange_inst, symbol): - super().__init__(exchange_inst, symbol) - self.enabled = False - - def refresh_data(self): - self.exchange.get_symbol_prices( - self.symbol, - self.specific_config[CONFIG_TIME_FRAME]) - - def eval_impl(self): - # example ! - # check orderbook whales - self.eval_note = 0.42 - something_is_happening = True - if something_is_happening: - self.notify_evaluator_threads(self.__class__.__name__) - - def set_default_config(self): - self.specific_config = { - CONFIG_REFRESH_RATE: 5, - CONFIG_TIME_FRAME: TimeFrames.FIVE_MINUTES - } - - def run(self): - while self.keep_running: - self.refresh_data() - self.eval() - time.sleep(self.specific_config[CONFIG_REFRESH_RATE]) diff --git a/evaluator/RealTime/realtime_evaluator.py b/evaluator/RealTime/realtime_evaluator.py index 9689759e9..ae85cb5dc 100644 --- a/evaluator/RealTime/realtime_evaluator.py +++ b/evaluator/RealTime/realtime_evaluator.py @@ -1,10 +1,13 @@ import os import threading +import time from abc import * +from backtesting.backtesting import Backtesting from config.config import load_config from config.cst import * from evaluator.abstract_evaluator import AbstractEvaluator +from tools.time_frame_manager import TimeFrameManager class RealTimeEvaluator(AbstractEvaluator, threading.Thread): @@ -13,8 +16,9 @@ class RealTimeEvaluator(AbstractEvaluator, threading.Thread): def __init__(self): super().__init__() self.specific_config = None + self.refresh_time = 0 self.data = None - self.evaluator_threads = [] + self.evaluator_thread_managers = [] self.keep_running = True self.load_config() @@ -32,11 +36,11 @@ def load_config(self): else: self.set_default_config() - def add_evaluator_thread(self, evaluator_thread): - self.evaluator_threads.append(evaluator_thread) + def add_evaluator_thread_manager(self, evaluator_thread): + self.evaluator_thread_managers.append(evaluator_thread) - def notify_evaluator_threads(self, notifier_name): - for thread in self.evaluator_threads: + def notify_evaluator_thread_managers(self, notifier_name): + for thread in self.evaluator_thread_managers: thread.notify(notifier_name) # to implement in subclasses if config necessary @@ -44,30 +48,67 @@ def set_default_config(self): pass @abstractmethod - def eval_impl(self) -> None: + def _refresh_data(self): + raise NotImplementedError("Eval_impl not implemented") + + @abstractmethod + def _define_refresh_time(self): raise NotImplementedError("Eval_impl not implemented") @abstractmethod + def eval_impl(self) -> None: + raise NotImplementedError("Eval_impl not implemented") + def run(self): - raise NotImplementedError("Run not implemented") + while self.keep_running: + now = time.time() + try: + self._refresh_data() + except Exception as e: + self.logger.error("error when refreshing data for {0}: {1}".format(self.symbol, e)) + self.eval() + + if not Backtesting.enabled(self.config): + sleeping_time = self.refresh_time - (time.time() - now) + if sleeping_time > 0: + time.sleep(sleeping_time) class RealTimeTAEvaluator(RealTimeEvaluator): __metaclass__ = RealTimeEvaluator def __init__(self, exchange_inst, symbol): + self.exchange = exchange_inst super().__init__() self.symbol = symbol - self.exchange = exchange_inst + self._define_refresh_time() @abstractmethod - def refresh_data(self): + def _refresh_data(self): raise NotImplementedError("Eval_impl not implemented") @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") - @abstractmethod - def run(self): - raise NotImplementedError("Eval_impl not implemented") \ No newline at end of file + def valid_refresh_time(self, config_refresh_time): + if config_refresh_time > self.exchange.get_exchange_manager().get_rate_limit() or \ + self.exchange.get_exchange_manager().websocket_available(): + return config_refresh_time + else: + return self.exchange.get_exchange_manager().get_rate_limit() + + def _define_refresh_time(self): + self.refresh_time = self.valid_refresh_time(self.specific_config[CONFIG_REFRESH_RATE]) + + def set_default_config(self): + time_frames = self.exchange.get_exchange_manager().get_config_time_frame() + min_time_frame = TimeFrameManager.find_min_time_frame(time_frames, MIN_EVAL_TIME_FRAME) + refresh_rate = DEFAULT_WEBSOCKET_REAL_TIME_EVALUATOR_REFRESH_RATE_SECONDS if \ + self.exchange.get_exchange_manager().websocket_available() \ + else DEFAULT_REST_REAL_TIME_EVALUATOR_REFRESH_RATE_SECONDS + + self.specific_config = { + CONFIG_TIME_FRAME: min_time_frame, + CONFIG_REFRESH_RATE: refresh_rate, + } diff --git a/evaluator/Social/Default/.keep b/evaluator/Social/Default/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/evaluator/Social/__init__.py b/evaluator/Social/__init__.py index 98e0d0d24..a821b58a6 100644 --- a/evaluator/Social/__init__.py +++ b/evaluator/Social/__init__.py @@ -1,6 +1,3 @@ from .social_evaluator import * -from .forum_evaluator import * -from .stats_evaluator import * -from .news_evaluator import * +from .Default import * from .Advanced import * - diff --git a/evaluator/Social/forum_evaluator.py b/evaluator/Social/forum_evaluator.py deleted file mode 100644 index 41d203d5a..000000000 --- a/evaluator/Social/forum_evaluator.py +++ /dev/null @@ -1,39 +0,0 @@ -from config.cst import * -from evaluator.Social.social_evaluator import ForumSocialEvaluator - - -class RedditForumEvaluator(ForumSocialEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - self.is_threaded = False - - def get_data(self): - pass - - def eval_impl(self): - pass - - def run(self): - pass - - def set_default_config(self): - self.social_config = { - CONFIG_REFRESH_RATE: 3 - } - - -class BTCTalkForumEvaluator(ForumSocialEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - self.is_threaded = False - - def get_data(self): - pass - - def eval_impl(self): - pass - - def run(self): - pass diff --git a/evaluator/Social/news_evaluator.py b/evaluator/Social/news_evaluator.py deleted file mode 100644 index 3cd33d573..000000000 --- a/evaluator/Social/news_evaluator.py +++ /dev/null @@ -1,135 +0,0 @@ -from config.cst import * -from evaluator.Dispatchers.twitter_dispatcher import TwitterDispatcher -from evaluator.Social.social_evaluator import NewsSocialEvaluator -from evaluator.Util.advanced_manager import AdvancedManager -from evaluator.Util.text_analysis import TextAnalysis -from evaluator.Dispatchers.abstract_dispatcher import * -from tools.decoding_encoding import DecoderEncoder - - -class TwitterNewsEvaluator(NewsSocialEvaluator, DispatcherAbstractClient): - def __init__(self): - NewsSocialEvaluator.__init__(self) - DispatcherAbstractClient.__init__(self) - self.enabled = False - self.is_threaded = False - self.count = 0 - self.symbol = "" - self.sentiment_analyser = None - - def set_dispatcher(self, dispatcher): - super().set_dispatcher(dispatcher) - self.dispatcher.update_social_config(self.social_config) - - def get_data(self): - pass - - @staticmethod - def get_dispatcher_class(): - return TwitterDispatcher - - def get_twitter_service(self): - return self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TWITTER][CONFIG_SERVICE_INSTANCE] - - def _print_tweet(self, tweet_text, count=""): - self.logger.debug("Current note : {0} | {1} : {2} : Text : {3}".format(self.eval_note, - count, - self.symbol, - DecoderEncoder.encode_into_bytes( - tweet_text))) - - def receive_notification_data(self, data): - self.count += 1 - self.eval_note = self._get_sentiment(data[CONFIG_TWEET], data[CONFIG_TWEET_DESCRIPTION]) - if self.eval_note != START_PENDING_EVAL_NOTE: - self._print_tweet(data[CONFIG_TWEET_DESCRIPTION], str(self.count)) - self._check_eval_note() - - def _check_eval_note(self): - if self.eval_note != START_PENDING_EVAL_NOTE: - if self.eval_note > 0.6 or self.eval_note < -0.6: - self.notify_evaluator_threads(self.__class__.__name__) - - def _get_sentiment(self, tweet, tweet_text): - # The compound score is computed by summing the valence scores of each word in the lexicon, adjusted according - # to the rules, and then normalized to be between -1 (most extreme negative) and +1 (most extreme positive). - # https://github.com/cjhutto/vaderSentiment - try: - stupid_useless_name = "########" - author_screen_name = tweet['user']['screen_name'] if "screen_name" in tweet['user'] else stupid_useless_name - author_name = tweet['user']['name'] if "name" in tweet['user'] else stupid_useless_name - if self.social_config[CONFIG_TWITTERS_ACCOUNTS]: - if author_screen_name in self.social_config[CONFIG_TWITTERS_ACCOUNTS][self.symbol] \ - or author_name in self.social_config[CONFIG_TWITTERS_ACCOUNTS][self.symbol]: - return -1 * self.sentiment_analyser.analyse(tweet_text) - except KeyError: - pass - - # ignore # for the moment (too much of bullshit) - return START_PENDING_EVAL_NOTE - - def eval_impl(self): - pass - - def run(self): - pass - - def is_interested_by_this_notification(self, notification_description): - # true if in twitter accounts - if self.social_config[CONFIG_TWITTERS_ACCOUNTS]: - for account in self.social_config[CONFIG_TWITTERS_ACCOUNTS][self.symbol]: - if account.lower() in notification_description: - return True - - # false if it's a RT of an unfollowed account - if notification_description.startswith("rt"): - return False - - # true if contains symbol - if self.symbol.lower() in notification_description: - return True - - # true if in hashtags - if self.social_config[CONFIG_TWITTERS_HASHTAGS]: - for hashtags in self.social_config[CONFIG_TWITTERS_HASHTAGS][self.symbol]: - if hashtags.lower() in notification_description: - return True - return False - - def _purify_config(self): - # remove other symbols data to avoid unnecessary tweets - if self.symbol in self.social_config[CONFIG_TWITTERS_ACCOUNTS]: - self.social_config[CONFIG_TWITTERS_ACCOUNTS] = \ - {self.symbol: self.social_config[CONFIG_TWITTERS_ACCOUNTS][self.symbol]} - else: - self.social_config[CONFIG_TWITTERS_ACCOUNTS] = {} - if self.symbol in self.social_config[CONFIG_TWITTERS_HASHTAGS]: - self.social_config[CONFIG_TWITTERS_HASHTAGS] = \ - {self.symbol: self.social_config[CONFIG_TWITTERS_HASHTAGS][self.symbol]} - else: - self.social_config[CONFIG_TWITTERS_HASHTAGS] = {} - - def prepare(self): - self._purify_config() - self.sentiment_analyser = AdvancedManager.get_util_instance(self.config, TextAnalysis) - - -class MediumNewsEvaluator(NewsSocialEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - self.is_threaded = False - - def get_data(self): - pass - - def eval_impl(self): - self.notify_evaluator_threads(self.__class__.__name__) - - def run(self): - pass - - def set_default_config(self): - self.social_config = { - CONFIG_REFRESH_RATE: 2 - } diff --git a/evaluator/Social/social_evaluator.py b/evaluator/Social/social_evaluator.py index 1174813de..e73f02d1f 100644 --- a/evaluator/Social/social_evaluator.py +++ b/evaluator/Social/social_evaluator.py @@ -16,8 +16,9 @@ def __init__(self): self.social_config = {} self.need_to_notify = False self.is_threaded = False + self.is_self_refreshing = False self.keep_running = True - self.evaluator_threads = [] + self.evaluator_thread_managers = [] self.load_config() @classmethod @@ -27,23 +28,35 @@ def get_config_file_name(cls): def stop(self): self.keep_running = False - def add_evaluator_thread(self, evaluator_thread): - self.evaluator_threads.append(evaluator_thread) + def add_evaluator_thread_manager(self, evaluator_thread): + self.evaluator_thread_managers.append(evaluator_thread) - def notify_evaluator_threads(self, notifier_name): - for thread in self.evaluator_threads: + def notify_evaluator_thread_managers(self, notifier_name): + for thread in self.evaluator_thread_managers: thread.notify(notifier_name) def load_config(self): config_file = self.get_config_file_name() + # try with this class name if os.path.isfile(config_file): self.social_config = load_config(config_file) else: + # if it's not possible, try with any super-class' config file + for super_class in self.get_parent_evaluator_classes(SocialEvaluator): + super_class_config_file = super_class.get_config_file_name() + if os.path.isfile(super_class_config_file): + self.social_config = load_config(super_class_config_file) + return + # set default config if nothing found + if not self.social_config: self.set_default_config() def get_is_threaded(self): return self.is_threaded + def get_is_self_refreshing(self): + return self.is_self_refreshing + # to implement in subclasses if config necessary # required if is_threaded = False --> provide evaluator refreshing time def set_default_config(self): @@ -84,9 +97,6 @@ def run(self): class StatsSocialEvaluator(SocialEvaluator): __metaclass__ = SocialEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") @@ -97,15 +107,12 @@ def get_data(self): @abstractmethod def run(self): - raise NotImplementedError("Eval_impl not implemented") + raise NotImplementedError("Run not implemented") class ForumSocialEvaluator(SocialEvaluator): __metaclass__ = SocialEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") @@ -116,15 +123,12 @@ def get_data(self): @abstractmethod def run(self): - raise NotImplementedError("Eval_impl not implemented") + raise NotImplementedError("Run not implemented") class NewsSocialEvaluator(SocialEvaluator): __metaclass__ = SocialEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") @@ -135,4 +139,4 @@ def get_data(self): @abstractmethod def run(self): - raise NotImplementedError("Eval_impl not implemented") + raise NotImplementedError("Run not implemented") diff --git a/evaluator/Social/stats_evaluator.py b/evaluator/Social/stats_evaluator.py deleted file mode 100644 index 357fcf02a..000000000 --- a/evaluator/Social/stats_evaluator.py +++ /dev/null @@ -1,54 +0,0 @@ -import numpy - -from pytrends.exceptions import ResponseError -from pytrends.request import TrendReq - -from config.cst import * -from evaluator.Util.statistics_analysis import StatisticAnalysis -from evaluator.Social.social_evaluator import StatsSocialEvaluator -from evaluator.Util.advanced_manager import AdvancedManager - - -class GoogleTrendStatsEvaluator(StatsSocialEvaluator): - def __init__(self): - super().__init__() - self.pytrends = None - self.enabled = False - self.is_threaded = False - - # Use pytrends lib (https://github.com/GeneralMills/pytrends) - # https://github.com/GeneralMills/pytrends/blob/master/examples/example.py - def get_data(self): - self.pytrends = TrendReq(hl='en-US', tz=0) - # self.pytrends.GENERAL_URL = "https://trends.google.com/trends/explore" - # self.symbol - key_words = [self.symbol] - try: - # looks like only 1 and 3 months are working ... - time_frame = "today " + str(self.social_config[STATS_EVALUATOR_HISTORY_TIME]) + "-m" - # Attention apparement limite de request / h assez faible - self.pytrends.build_payload(kw_list=key_words, cat=0, timeframe=time_frame, geo='', gprop='') - except ResponseError as e: - self.logger.warn(str(e)) - - def eval_impl(self): - interest_over_time_df = self.pytrends.interest_over_time() - - # compute bollinger bands - self.eval_note = AdvancedManager.get_class(self.config, StatisticAnalysis).analyse_recent_trend_changes( - interest_over_time_df[self.symbol], numpy.sqrt) - - def run(self): - pass - - # check if history is not too high - def load_config(self): - super(GoogleTrendStatsEvaluator, self).load_config() - if self.social_config[STATS_EVALUATOR_HISTORY_TIME] > STATS_EVALUATOR_MAX_HISTORY_TIME: - self.social_config[STATS_EVALUATOR_HISTORY_TIME] = STATS_EVALUATOR_MAX_HISTORY_TIME - - def set_default_config(self): - self.social_config = { - CONFIG_REFRESH_RATE: 3600, - STATS_EVALUATOR_HISTORY_TIME: 3 - } diff --git a/evaluator/Strategies/Default/.keep b/evaluator/Strategies/Default/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/evaluator/Strategies/__init__.py b/evaluator/Strategies/__init__.py index 46d7529b8..99b0c0d61 100644 --- a/evaluator/Strategies/__init__.py +++ b/evaluator/Strategies/__init__.py @@ -1,3 +1,3 @@ from .strategies_evaluator import * -from .mixed_strategies_evaluator import * +from .Default import * from .Advanced import * diff --git a/evaluator/Strategies/mixed_strategies_evaluator.py b/evaluator/Strategies/mixed_strategies_evaluator.py deleted file mode 100644 index 96bccfc3f..000000000 --- a/evaluator/Strategies/mixed_strategies_evaluator.py +++ /dev/null @@ -1,145 +0,0 @@ -from config.cst import * -from evaluator.RealTime import InstantFluctuationsEvaluator -from evaluator.Strategies import MixedStrategiesEvaluator -from evaluator.Social import MediumNewsEvaluator, RedditForumEvaluator - - -# TEMP strategy -class TempFullMixedStrategiesEvaluator(MixedStrategiesEvaluator): - def __init__(self): - super().__init__() - self.enabled = True - self.social_counter = 0 - self.ta_relevance_counter = 0 - self.rt_counter = 0 - - self.ta_evaluation = 0 - self.social_evaluation = 0 - self.rt_evaluation = 0 - - def inc_social_counter(self, inc=1): - self.social_counter += inc - - def inc_ta_counter(self, inc=1): - self.ta_relevance_counter += inc - - def inc_rt_counter(self, inc=1): - self.rt_counter += inc - - @staticmethod - def check_valid_eval_note(eval_note): - if eval_note and eval_note is not START_PENDING_EVAL_NOTE: - return True - else: - return False - - def eval_impl(self) -> None: - # TODO : temp counter without relevance - self.social_counter = 0 - self.rt_counter = 0 - - # relevance counters - self.ta_relevance_counter = 0 - - # eval note total with relevance factor - self.ta_evaluation = 0 - self.social_evaluation = 0 - self.rt_evaluation = 0 - - for rt in self.matrix[EvaluatorMatrixTypes.REAL_TIME]: - if self.check_valid_eval_note(self.matrix[EvaluatorMatrixTypes.REAL_TIME][rt]): - self.rt_evaluation += self.matrix[EvaluatorMatrixTypes.REAL_TIME][rt] - self.inc_rt_counter() - - for ta in self.matrix[EvaluatorMatrixTypes.TA]: - if self.matrix[EvaluatorMatrixTypes.TA][ta]: - for ta_time_frame in self.matrix[EvaluatorMatrixTypes.TA][ta]: - if self.check_valid_eval_note(self.matrix[EvaluatorMatrixTypes.TA][ta][ta_time_frame]): - time_frame_relevance = TimeFramesRelevance[ta_time_frame] - self.ta_evaluation += self.matrix[EvaluatorMatrixTypes.TA][ta][ta_time_frame] * time_frame_relevance - self.inc_ta_counter(time_frame_relevance) - - for social in self.matrix[EvaluatorMatrixTypes.SOCIAL]: - if self.check_valid_eval_note(self.matrix[EvaluatorMatrixTypes.SOCIAL][social]): - self.social_evaluation += self.matrix[EvaluatorMatrixTypes.SOCIAL][social] - self.inc_social_counter() - - self.finalize() - - def finalize(self): - # TODO : This is an example - eval_temp = 0 - category = 0 - - if self.ta_relevance_counter > 0: - eval_temp += self.ta_evaluation / self.ta_relevance_counter - category += 1 - - if self.social_counter > 0: - eval_temp += self.social_evaluation / self.social_counter - category += 1 - - if self.rt_counter > 0: - eval_temp += self.rt_evaluation / self.rt_counter - category += 1 - - if category > 0: - self.eval_note = eval_temp / category - - -class InstantSocialReactionMixedStrategiesEvaluator(MixedStrategiesEvaluator): - def __init__(self): - super().__init__() - - self.enabled = False - - self.social_counter = 0 - self.instant_counter = 0 - - self.instant_evaluation = 0 - self.social_evaluation = 0 - - def eval_impl(self) -> None: - self.social_counter = 0 - self.instant_counter = 0 - - self.instant_evaluation = 0 - self.social_evaluation = 0 - - # TODO : This is an example - if InstantFluctuationsEvaluator.get_name() in self.matrix[EvaluatorMatrixTypes.REAL_TIME]: - self.instant_evaluation += self.matrix[EvaluatorMatrixTypes.REAL_TIME][ - InstantFluctuationsEvaluator.get_name()] - self.inc_instant_counter() - - if MediumNewsEvaluator.get_name() in self.matrix[EvaluatorMatrixTypes.SOCIAL]: - self.social_evaluation += self.matrix[EvaluatorMatrixTypes.SOCIAL][MediumNewsEvaluator.get_name()] - self.inc_social_counter() - - if RedditForumEvaluator.get_name() in self.matrix[EvaluatorMatrixTypes.SOCIAL]: - self.social_evaluation += self.matrix[EvaluatorMatrixTypes.SOCIAL][MediumNewsEvaluator.get_name()] - self.inc_social_counter() - - self.finalize() - - def inc_social_counter(self, inc=1): - self.social_counter += inc - - def inc_instant_counter(self, inc=1): - self.instant_counter += inc - - def finalize(self): - # TODO : This is an example - eval_temp = 0 - category = 0 - - if self.instant_counter > 0: - eval_temp += self.instant_evaluation / self.instant_counter - category += 1 - - if self.social_counter > 0: - eval_temp += self.social_evaluation / self.social_counter - category += 1 - - if category > 0: - self.eval_note = eval_temp / category diff --git a/evaluator/Strategies/strategies_evaluator.py b/evaluator/Strategies/strategies_evaluator.py index 54b840699..f5b9ab452 100644 --- a/evaluator/Strategies/strategies_evaluator.py +++ b/evaluator/Strategies/strategies_evaluator.py @@ -1,6 +1,7 @@ from abc import * from evaluator.abstract_evaluator import AbstractEvaluator +from tools.evaluator_divergence_analyser import EvaluatorDivergenceAnalyser class StrategiesEvaluator(AbstractEvaluator): @@ -9,6 +10,7 @@ class StrategiesEvaluator(AbstractEvaluator): def __init__(self): super().__init__() self.matrix = None + self.divergence_evaluator_analyser = None def set_matrix(self, matrix): self.matrix = matrix.get_matrix() @@ -16,6 +18,12 @@ def set_matrix(self, matrix): def get_is_evaluable(self): return not (self.get_is_updating() or self.matrix is None) + def create_divergence_analyser(self): + self.divergence_evaluator_analyser = EvaluatorDivergenceAnalyser() + + def get_divergence(self): + return self.divergence_evaluator_analyser.update(self.matrix) + @abstractmethod def eval_impl(self) -> None: raise NotImplementedError("Eval_impl not implemented") @@ -24,9 +32,6 @@ def eval_impl(self) -> None: class MixedStrategiesEvaluator(StrategiesEvaluator): __metaclass__ = StrategiesEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self) -> None: - raise NotImplementedError("Eval_impl not implemented") \ No newline at end of file + raise NotImplementedError("Eval_impl not implemented") diff --git a/evaluator/TA/Default/.keep b/evaluator/TA/Default/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/evaluator/TA/TA_evaluator.py b/evaluator/TA/TA_evaluator.py index a4f2cc789..2fd8a56c7 100644 --- a/evaluator/TA/TA_evaluator.py +++ b/evaluator/TA/TA_evaluator.py @@ -36,9 +36,6 @@ def eval(self) -> None: class MomentumEvaluator(TAEvaluator): __metaclass__ = TAEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") @@ -47,9 +44,6 @@ def eval_impl(self): class OrderBookEvaluator(TAEvaluator): __metaclass__ = TAEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") @@ -58,9 +52,6 @@ def eval_impl(self): class VolatilityEvaluator(TAEvaluator): __metaclass__ = TAEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") @@ -69,9 +60,6 @@ def eval_impl(self): class TrendEvaluator(TAEvaluator): __metaclass__ = TAEvaluator - def __init__(self): - super().__init__() - @abstractmethod def eval_impl(self): raise NotImplementedError("Eval_impl not implemented") diff --git a/evaluator/TA/__init__.py b/evaluator/TA/__init__.py index 868020305..d7b2e0869 100644 --- a/evaluator/TA/__init__.py +++ b/evaluator/TA/__init__.py @@ -1,6 +1,3 @@ from .TA_evaluator import * -from .momentum_evaluator import * -from .trend_evaluator import * -from .volatility_evaluator import * +from .Default import * from .Advanced import * - diff --git a/evaluator/TA/momentum_evaluator.py b/evaluator/TA/momentum_evaluator.py deleted file mode 100644 index f0e17c622..000000000 --- a/evaluator/TA/momentum_evaluator.py +++ /dev/null @@ -1,318 +0,0 @@ -import talib -import math -from talib._ta_lib import CDLINVERTEDHAMMER, CDLDOJI, CDLSHOOTINGSTAR, CDLHAMMER, CDLHARAMI, CDLPIERCING - -from config.cst import * -from evaluator.TA.TA_evaluator import MomentumEvaluator - -from evaluator.Util.trend_analysis import TrendAnalysis -from evaluator.Util.pattern_analysis import PatternAnalyser - - -class RSIMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.pertinence = 1 - self.enabled = True - - # TODO : temp analysis - def eval_impl(self): - rsi_v = talib.RSI(self.data[PriceStrings.STR_PRICE_CLOSE.value]) - - long_trend = TrendAnalysis.get_trend(rsi_v, self.long_term_averages) - short_trend = TrendAnalysis.get_trend(rsi_v, self.short_term_averages) - - # check if trend change - if short_trend > 0 > long_trend: - # trend changed to up - self.set_eval_note(-short_trend) - - elif long_trend > 0 > short_trend: - # trend changed to down - self.set_eval_note(short_trend) - - # use RSI current value - last_rsi_value = rsi_v.tail(1).values[0] - if last_rsi_value > 50: - self.set_eval_note(rsi_v.tail(1).values[0] / 200) - else: - self.set_eval_note((rsi_v.tail(1).values[0] - 100) / 200) - - -# bollinger_bands -class BBMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = True - - def eval_impl(self): - - # compute bollinger bands - upper_band, middle_band, lower_band = talib.BBANDS(self.data[PriceStrings.STR_PRICE_CLOSE.value], 20, 2, 2) - # if close to lower band => low value => bad, - # therefore if close to middle, value is keeping up => good - # finally if up the middle one or even close to the upper band => very good - - current_value = self.data[PriceStrings.STR_PRICE_CLOSE.value].iloc[-1] - current_up = upper_band.tail(1).values[0] - current_middle = middle_band.tail(1).values[0] - current_low = lower_band.tail(1).values[0] - delta_up = current_up - current_middle - delta_low = current_middle - current_low - - # its exactly on all bands - if current_up == current_low: - self.eval_note = START_PENDING_EVAL_NOTE - - # exactly on the middle - elif current_value == current_middle: - self.eval_note = 0 - - # up the upper band - elif current_value > current_up: - self.eval_note = 1 - - # down the lower band - elif current_value < current_low: - self.eval_note = -1 - - # regular values case: use parabolic factor all the time - else: - - # up the middle band - if current_middle < current_value: - self.eval_note = math.pow((current_value - current_middle) / delta_up, 2) - - # down the middle band - elif current_middle > current_value: - self.eval_note = -1 * math.pow((current_middle - current_value) / delta_low, 2) - - -class CandlePatternMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.pertinence = 1 - self.factor = 0.5 - self.enabled = True - - def update_note(self, pattern_bool): - last_value = pattern_bool.tail(1).values[0] - - # bullish - if last_value >= 100: - - # confirmation - if last_value > 200: - self.set_eval_note(-2 * self.factor) - else: - self.set_eval_note(-1 * self.factor) - - # bearish - elif last_value <= -100: - - # confirmation - if last_value > 200: - self.set_eval_note(2 * self.factor) - else: - self.set_eval_note(1 * self.factor) - - def eval_impl(self): - open_values = self.data[PriceStrings.STR_PRICE_OPEN.value] - high_values = self.data[PriceStrings.STR_PRICE_HIGH.value] - low_values = self.data[PriceStrings.STR_PRICE_LOW.value] - close_values = self.data[PriceStrings.STR_PRICE_CLOSE.value] - - # Inverted Hammer - # When the low and the open are the same, a bullish Inverted Hammer candlestick is formed and - # it is considered a stronger bullish sign than when the low and close are the same, forming a bearish - # Hanging Man (the bearish Hanging Man is still considered bullish, just not as much because the day ended by - # closing with losses). - self.update_note(CDLINVERTEDHAMMER(open_values, high_values, low_values, close_values)) - - # Hammer - # The long lower shadow of the Hammer implies that the market tested to find where support and - # demand was located. When the market found the area of support, the lows of the day, bulls began to push - # prices higher, near the opening price. Thus, the bearish advance downward was rejected by the bulls. - self.update_note(CDLHAMMER(open_values, high_values, low_values, close_values)) - - # Doji - # It is important to emphasize that the Doji pattern does not mean reversal, it means indecision.Doji's - # are often found during periods of resting after a significant move higher or lower; the market, - # after resting, then continues on its way. Nevertheless, a Doji pattern could be interpreted as a sign that - # a prior trend is losing its strength, and taking some profits might be well advised. - self.update_note(CDLDOJI(open_values, high_values, low_values, close_values)) - - # Shooting star - # The Shooting Star formation is considered less bearish, but nevertheless bearish when the - # open and low are roughly the same. The bears were able to counteract the bulls, but were not able to bring - # the price back to the price at the open. - # The long upper shadow of the Shooting Star implies that the market tested to find where resistance and - # supply was located. When the market found the area of resistance, the highs of the day, bears began to push - # prices lower, ending the day near the opening price. Thus, the bullish advance upward was rejected by the - # bears. - self.update_note(CDLSHOOTINGSTAR(open_values, high_values, low_values, close_values)) - - # Harami A buy signal could be triggered when the day after the bullish Harami occured, price rose higher, - # closing above the downward resistance trendline. A bullish Harami pattern and a trendline break is a - # combination that potentially could resulst in a buy signal. A sell signal could be triggered when the day - # after the bearish Harami occured, price fell even further down, closing below the upward support trendline. - # When combined, a bearish Harami pattern and a trendline break might be interpreted as a potential sell - # signal. - self.update_note(CDLHARAMI(open_values, high_values, low_values, close_values)) - - # Piercing Line - # Pattern Bullish Engulfing Pattern (see: Bullish Engulfing Pattern) is typically viewed as - # being more bullish than the Piercing Pattern because it completely reverses the losses of Day 1 and adds - # new gains. - self.update_note(CDLPIERCING(open_values, high_values, low_values, close_values)) - - # if neutral - if self.eval_note == 0: - self.eval_note = START_PENDING_EVAL_NOTE - - -# ADX --> trend_strength -class ADXMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = True - - # implementation according to: https://www.investopedia.com/articles/technical/02/041002.asp => length = 14 and - # exponential moving average = 20 in a uptrend market - # idea: adx > 30 => strong trend, < 20 => trend change to come - def eval_impl(self): - min_adx = 7.5 - max_adx = 50 - neutral_adx = 25 - adx = talib.ADX(self.data[PriceStrings.STR_PRICE_HIGH.value], - self.data[PriceStrings.STR_PRICE_LOW.value], - self.data[PriceStrings.STR_PRICE_CLOSE.value], - timeperiod=14) - instant_ema = talib.EMA(self.data[PriceStrings.STR_PRICE_CLOSE.value], timeperiod=2) - slow_ema = talib.EMA(self.data[PriceStrings.STR_PRICE_CLOSE.value], timeperiod=20) - - current_adx = adx.iloc[-1] - current_slows_ema = slow_ema.iloc[-1] - current_instant_ema = instant_ema.iloc[-1] - - multiplier = -1 if current_instant_ema < current_slows_ema else 1 - - # strong adx => strong trend - if current_adx > neutral_adx: - # if max adx already reached => when ADX forms a top and begins to turn down, you should look for a - # retracement that causes the price to move toward its 20-day exponential moving average (EMA). - adx_last_values = adx.tail(20) - adx_last_value = adx_last_values.iloc[-1] - - # max already reached => trend will slow down - if adx_last_value < adx_last_values.max(): - - self.eval_note = multiplier * (1 - ((max_adx - current_adx) / (max_adx - neutral_adx))) - - # max not reached => trend will continue, return chances to be max now - else: - crossing_indexes = TrendAnalysis.get_threshold_change_indexes(adx, neutral_adx) - chances_to_be_max = TrendAnalysis.get_estimation_of_move_state_relatively_to_previous_moves_length( - crossing_indexes) - proximity_to_max = min(1, current_adx / max_adx) - self.eval_note = multiplier * proximity_to_max * chances_to_be_max - - # weak adx => change to come - else: - self.eval_note = multiplier * min(1, ((neutral_adx - current_adx) / (neutral_adx - min_adx))) - - -class OBVMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - obv_v = talib.OBV(self.data[PriceStrings.STR_PRICE_CLOSE.value], - self.data[PriceStrings.STR_PRICE_VOL.value]) - - -# William's % R --> overbought / oversold -class WilliamsRMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - willr_v = talib.WILLR(self.data[PriceStrings.STR_PRICE_HIGH.value], - self.data[PriceStrings.STR_PRICE_LOW.value], - self.data[PriceStrings.STR_PRICE_CLOSE.value]) - - -# TRIX --> percent rate-of-change trend -class TRIXMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - trix_v = talib.TRIX(self.data[PriceStrings.STR_PRICE_CLOSE.value]) - - -class MACDMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = True - - def eval_impl(self): - macd, macd_signal, macd_hist = talib.MACD(self.data[PriceStrings.STR_PRICE_CLOSE.value], - fastperiod=12, - slowperiod=26, - signalperiod=9) - - # on macd hist => M pattern: bearish movement, W pattern: bullish movement - # max on hist: optimal sell or buy - - zero_crossing_indexes = TrendAnalysis.get_threshold_change_indexes(macd_hist, 0) - last_index = len(macd_hist.index)-1 - pattern, start_index, end_index = PatternAnalyser.find_pattern(macd_hist, zero_crossing_indexes, last_index) - - if pattern != PatternAnalyser.UNKNOWN_PATTERN: - - # set sign (-1 buy or 1 sell) - signe_multiplier = -1 if pattern == "W" or pattern == "V" else 1 - - # set pattern time frame => W and M are on 2 time frames, others 1 - pattern_move_time = 2 if (pattern == "W" or pattern == "M") and end_index == last_index else 1 - - # set weight according to the max value of the pattern and the current value - current_pattern_start = start_index - weight = macd_hist.iloc[-1] / macd_hist[current_pattern_start:].max() if signe_multiplier == 1 \ - else macd_hist.iloc[-1] / macd_hist[current_pattern_start:].min() - - # finally, add pattern's strength - weight = weight*PatternAnalyser.get_pattern_strength(pattern) - - # check if currently - self.eval_note = signe_multiplier * \ - weight * \ - TrendAnalysis.get_estimation_of_move_state_relatively_to_previous_moves_length( - zero_crossing_indexes, - pattern_move_time) - else: - self.eval_note = START_PENDING_EVAL_NOTE - - -class ChaikinOscillatorMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass - - -class StochasticMomentumEvaluator(MomentumEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - slowk, slowd = talib.STOCH(self.data[PriceStrings.STR_PRICE_HIGH.value], - self.data[PriceStrings.STR_PRICE_LOW.value], - self.data[PriceStrings.STR_PRICE_CLOSE.value]) diff --git a/evaluator/TA/trend_evaluator.py b/evaluator/TA/trend_evaluator.py deleted file mode 100644 index 0620bf038..000000000 --- a/evaluator/TA/trend_evaluator.py +++ /dev/null @@ -1,99 +0,0 @@ -from config.cst import * -import numpy -import talib - -from evaluator.TA.TA_evaluator import TrendEvaluator -from evaluator.Util.trend_analysis import TrendAnalysis -from evaluator.Util.data_frame_util import DataFrameUtil - - -# evaluates position of the current (2 unit) average trend relatively to the 5 units average and 10 units average trend -class DoubleMovingAverageTrendEvaluator(TrendEvaluator): - def __init__(self): - super().__init__() - self.enabled = True - - def eval_impl(self): - time_units = [5, 10] - current_moving_average = talib.MA(self.data[PriceStrings.STR_PRICE_CLOSE.value], timeperiod=2, matype=0) - results = [self.get_moving_average_analysis(self.data[PriceStrings.STR_PRICE_CLOSE.value], - current_moving_average, - i) - for i in time_units] - self.eval_note = numpy.mean(results) - - if self.eval_note == 0: - self.eval_note = START_PENDING_EVAL_NOTE - - # < 0 --> Current average bellow other one (computed using time_period) - # > 0 --> Current average above other one (computed using time_period) - @staticmethod - def get_moving_average_analysis(data_frame, current_moving_average, time_period): - - time_period_unit_moving_average = talib.MA(data_frame, timeperiod=time_period, matype=0) - - # compute difference between 1 unit values and others ( >0 means currently up the other one) - values_difference = (current_moving_average - time_period_unit_moving_average) - - # indexes where current_unit_moving_average crosses time_period_unit_moving_average - crossing_indexes = TrendAnalysis.get_threshold_change_indexes(values_difference, 0) - - multiplier = 1 if values_difference.iloc[-1] else -1 - - # check enough data in the frame (at least 2) => did not just crossed the other curve - if len(crossing_indexes) > 0 and crossing_indexes[-1] < len(values_difference.index)-2: - current_divergence_data = values_difference[crossing_indexes[-1]+1:] - normalized_data = DataFrameUtil.normalize_data_frame(current_divergence_data) - current_value = (normalized_data.iloc[-1]+1)/2 - if current_value == "nan": - return 0 - # check <= values_difference.count()-1if current value is max/min - if current_value == 0 or current_value == 1: - chances_to_be_max = TrendAnalysis.get_estimation_of_move_state_relatively_to_previous_moves_length( - crossing_indexes) - return multiplier*current_value*chances_to_be_max - # other case: maxima already reached => return distance to max - else: - return multiplier*current_value - - # just crossed the average => neutral - return 0 - -# https://mrjbq7.github.io/ta-lib/func_groups/overlap_studies.html -class CandleAnalysisTrendEvaluator(TrendEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass - - -# directional_movement_index --> trend strength -class DMITrendEvaluator(TrendEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass - - -# bollinger_bands -class BBTrendEvaluator(TrendEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass - - -# ease_of_movement --> ease to change trend --> trend strength -class EOMTrendEvaluator(TrendEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass diff --git a/evaluator/TA/volatility_evaluator.py b/evaluator/TA/volatility_evaluator.py deleted file mode 100644 index 76e1a9f65..000000000 --- a/evaluator/TA/volatility_evaluator.py +++ /dev/null @@ -1,30 +0,0 @@ -from evaluator.TA.TA_evaluator import VolatilityEvaluator - - -# average_true_range -class ATRVolatilityEvaluator(VolatilityEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass - - -# mass index -class MassIndexVolatilityEvaluator(VolatilityEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass - - -class ChaikinVolatilityEvaluator(VolatilityEvaluator): - def __init__(self): - super().__init__() - self.enabled = False - - def eval_impl(self): - pass diff --git a/evaluator/Updaters/social_evaluator_not_threaded_update.py b/evaluator/Updaters/social_evaluator_not_threaded_update.py index 88d4f1658..2d1e67805 100644 --- a/evaluator/Updaters/social_evaluator_not_threaded_update.py +++ b/evaluator/Updaters/social_evaluator_not_threaded_update.py @@ -20,28 +20,30 @@ def stop(self): def _create_eval_timers(self): for social_eval in self.social_evaluator_list: # if key exists --> else this social eval will not be refreshed - if CONFIG_REFRESH_RATE in social_eval.get_social_config(): - self.social_evaluator_list_timers.append( - { - "social_evaluator_class_inst": social_eval, - "refresh_rate": social_eval.get_social_config()[CONFIG_REFRESH_RATE], - # force first refresh - "last_refresh": social_eval.get_social_config()[CONFIG_REFRESH_RATE], - "last_refresh_time": time.time() - }) - else: - self.logger.warning("Social evaluator {0} doesn't have a valid social config refresh rate." - .format(social_eval.__class__.__name__)) + if not social_eval.get_is_self_refreshing(): + if CONFIG_REFRESH_RATE in social_eval.get_social_config(): + self.social_evaluator_list_timers.append( + { + "social_evaluator_class_inst": social_eval, + "refresh_rate": social_eval.get_social_config()[CONFIG_REFRESH_RATE], + # force first refresh + "last_refresh": social_eval.get_social_config()[CONFIG_REFRESH_RATE], + "last_refresh_time": time.time() + }) + else: + self.logger.warning("Social evaluator {0} doesn't have a valid social config refresh rate." + .format(social_eval.__class__.__name__)) def run(self): - while self.keep_running: - for social_eval in self.social_evaluator_list_timers: - now = time.time() - social_eval["last_refresh"] += now - social_eval["last_refresh_time"] - social_eval["last_refresh_time"] = now - if social_eval["last_refresh"] >= social_eval["refresh_rate"]: - social_eval["last_refresh"] = 0 - social_eval["social_evaluator_class_inst"].get_data() - social_eval["social_evaluator_class_inst"].eval() + if self.social_evaluator_list_timers: + while self.keep_running: + for social_eval in self.social_evaluator_list_timers: + now = time.time() + social_eval["last_refresh"] += now - social_eval["last_refresh_time"] + social_eval["last_refresh_time"] = now + if social_eval["last_refresh"] >= social_eval["refresh_rate"]: + social_eval["last_refresh"] = 0 + social_eval["social_evaluator_class_inst"].get_data() + social_eval["social_evaluator_class_inst"].eval() - time.sleep(SOCIAL_EVALUATOR_NOT_THREADED_UPDATE_RATE) + time.sleep(SOCIAL_EVALUATOR_NOT_THREADED_UPDATE_RATE) diff --git a/evaluator/Updaters/symbol_time_frames_updater.py b/evaluator/Updaters/symbol_time_frames_updater.py new file mode 100644 index 000000000..762053fd8 --- /dev/null +++ b/evaluator/Updaters/symbol_time_frames_updater.py @@ -0,0 +1,84 @@ +import threading +import time +import logging + +from backtesting.backtesting import Backtesting +from config.cst import * + + +class SymbolTimeFramesDataUpdaterThread(threading.Thread): + def __init__(self): + super().__init__() + self.evaluator_threads_manager_by_time_frame = {} + self.refreshed_times = {} + self.time_frame_last_update = {} + self.keep_running = True + self.logger = logging.getLogger(self.__class__.__name__) + + # add a time frame to watch and its related evaluator thread manager + def register_evaluator_thread_manager(self, time_frame, evaluator_thread_manager): + self.evaluator_threads_manager_by_time_frame[time_frame] = evaluator_thread_manager + + def stop(self): + self.keep_running = False + + def get_refreshed_times(self, time_frame): + return self.refreshed_times[time_frame] + + # notify the time frame's evaluator thread manager to refresh its data + def _refresh_data(self, time_frame, limit=None): + evaluator_thread_manager_to_notify = self.evaluator_threads_manager_by_time_frame[time_frame] + evaluator_thread_manager_to_notify.evaluator.set_data( + evaluator_thread_manager_to_notify.exchange.get_symbol_prices( + evaluator_thread_manager_to_notify.symbol, + evaluator_thread_manager_to_notify.time_frame, + limit=limit)) + self.refreshed_times[time_frame] += 1 + evaluator_thread_manager_to_notify.notify(self.__class__.__name__) + + # start background refresher + def run(self): + time_frames = self.evaluator_threads_manager_by_time_frame.keys() + + if time_frames: + max_sleeping_time = 2 + + # figure out from an evaluator if back testing is running for this symbol + evaluator_thread_manager = next(iter(self.evaluator_threads_manager_by_time_frame.values())) + back_testing_enabled = Backtesting.enabled(evaluator_thread_manager.get_evaluator().get_config()) + + # init refreshed_times at 0 for each time frame + self.refreshed_times = {key: 0 for key in time_frames} + # init last refresh times at 0 for each time frame + self.time_frame_last_update = {key: 0 for key in time_frames} + + while self.keep_running: + now = time.time() + + for time_frame in time_frames: + if back_testing_enabled: + exchange = evaluator_thread_manager.exchange.get_exchange() + if exchange.should_update_data( + evaluator_thread_manager.symbol, + time_frame, + evaluator_thread_manager.symbol_evaluator.get_trader_simulator(exchange)): + self._refresh_data(time_frame) + + # if data from this time frame needs an update + elif now - self.time_frame_last_update[time_frame] >= \ + TimeFramesMinutes[time_frame] * MINUTE_TO_SECONDS: + try: + self._refresh_data(time_frame) + except Exception as e: + self.logger.error("error when refreshing data for time frame {0} for {1}: {2}" + .format(time_frame, evaluator_thread_manager.symbol, e)) + self.time_frame_last_update[time_frame] = time.time() + + if not back_testing_enabled: + sleeping_time = max_sleeping_time - (time.time() - now) + if sleeping_time > 0: + time.sleep(sleeping_time) + else: + time.sleep(0) + else: + self.logger.warning("no time frames to monitor, going to sleep.") diff --git a/evaluator/Updaters/time_frame_update.py b/evaluator/Updaters/time_frame_update.py deleted file mode 100644 index 27faf33f7..000000000 --- a/evaluator/Updaters/time_frame_update.py +++ /dev/null @@ -1,33 +0,0 @@ -import threading -import time - -from config.cst import * - - -# reset to count sec -class TimeFrameUpdateDataThread(threading.Thread): - def __init__(self, parent): - super().__init__() - self.parent = parent - self.refreshed_times = 0 - self.keep_running = True - - def stop(self): - self.keep_running = False - - def get_refreshed_times(self): - return self.refreshed_times - - def _refresh_data(self): - self.parent.evaluator.set_data( - self.parent.exchange.get_symbol_prices( - self.parent.symbol, - self.parent.time_frame)) - self.refreshed_times += 1 - self.parent.notify(self.__class__.__name__) - - def run(self): - while self.keep_running: - now = time.time() - self._refresh_data() - time.sleep(TimeFramesMinutes[self.parent.time_frame] * MINUTE_TO_SECONDS - (time.time() - now)) diff --git a/evaluator/Util/Default/.keep b/evaluator/Util/Default/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/evaluator/Util/__init__.py b/evaluator/Util/__init__.py index a242d4555..ed002979d 100644 --- a/evaluator/Util/__init__.py +++ b/evaluator/Util/__init__.py @@ -1 +1,4 @@ +from .abstract_util import * +from .advanced_manager import * +from .Default import * from .Advanced import * diff --git a/evaluator/Util/advanced_manager.py b/evaluator/Util/advanced_manager.py index a9c10b646..e698d2e30 100644 --- a/evaluator/Util/advanced_manager.py +++ b/evaluator/Util/advanced_manager.py @@ -110,3 +110,12 @@ def get_util_instance(config, class_type, *args): AdvancedManager._get_advanced_instances_list(config)[class_type] = instance return instance return None + + @staticmethod + def create_advanced_evaluator_types_list(evaluator_class, config): + evaluator_advanced_eval_class_list = [] + for evaluator_subclass in evaluator_class.__subclasses__(): + for eval_class in evaluator_subclass.__subclasses__(): + for eval_class_type in AdvancedManager.get_classes(config, eval_class): + evaluator_advanced_eval_class_list.append(eval_class_type) + return evaluator_advanced_eval_class_list diff --git a/evaluator/Util/data_frame_util.py b/evaluator/Util/data_frame_util.py deleted file mode 100644 index 225e51d75..000000000 --- a/evaluator/Util/data_frame_util.py +++ /dev/null @@ -1,7 +0,0 @@ - - -class DataFrameUtil: - - @staticmethod - def normalize_data_frame(data_frame): - return (data_frame - data_frame.mean()) / (data_frame.max() - data_frame.min()) diff --git a/evaluator/Util/pattern_analysis.py b/evaluator/Util/pattern_analysis.py deleted file mode 100644 index 79ad9c588..000000000 --- a/evaluator/Util/pattern_analysis.py +++ /dev/null @@ -1,67 +0,0 @@ -import numpy - - -class PatternAnalyser: - - UNKNOWN_PATTERN = "?" - - # returns the starting and ending index of the pattern if it's found - # supported patterns: - # W, M, N and V (ex: for macd) - # return boolean (pattern found or not), start index and end index - @staticmethod - def find_pattern(data_frame, zero_crossing_indexes, data_frame_max_index): - if len(zero_crossing_indexes) > 1: - - last_move_data = data_frame[zero_crossing_indexes[-1]:] - - # if last_move_data is shaped in W - shape = PatternAnalyser._get_pattern(last_move_data) - - if shape == "N" or shape == "V": - # check presence of W or M with insignificant move in the other direction - backwards_index = 2 - while backwards_index < len(zero_crossing_indexes) and \ - zero_crossing_indexes[-1*backwards_index] - zero_crossing_indexes[-1*backwards_index-1] < 4: - backwards_index += 1 - extended_last_move_data = data_frame[zero_crossing_indexes[-1*backwards_index]:] - extended_shape = PatternAnalyser._get_pattern(extended_last_move_data) - - if extended_shape == "W" or extended_shape == "M": - # check that values are on the same side (< or >0) - first_part = data_frame[zero_crossing_indexes[-1*backwards_index]: - zero_crossing_indexes[-1*backwards_index+1]] - second_part = data_frame[zero_crossing_indexes[-1]:] - if numpy.mean(first_part)*numpy.mean(second_part) > 0: - return extended_shape, zero_crossing_indexes[-1*backwards_index], zero_crossing_indexes[-1] - - if shape != PatternAnalyser.UNKNOWN_PATTERN: - return shape, zero_crossing_indexes[-1], data_frame_max_index - - return PatternAnalyser.UNKNOWN_PATTERN, None, None - - @staticmethod - def _get_pattern(data_frame): - mean_value = numpy.mean(data_frame)*0.5 - indexes_under_mean_value = data_frame.index[data_frame > mean_value] \ - if mean_value < 0 \ - else data_frame.index[data_frame < mean_value] - - nb_gaps = 0 - for i in range(len(indexes_under_mean_value)-1): - if indexes_under_mean_value[i+1]-indexes_under_mean_value[i] > 3: - nb_gaps += 1 - - if nb_gaps > 1: - return "W" if mean_value < 0 else "M" - else: - return "V" if mean_value < 0 else "N" - - # returns a value 0 < value < 1: the higher the stronger is the pattern - @staticmethod - def get_pattern_strength(pattern): - if pattern == "W" or pattern == "M": - return 1 - elif pattern == "N" or pattern == "V": - return 0.75 - return 0 diff --git a/evaluator/Util/statistics_analysis.py b/evaluator/Util/statistics_analysis.py deleted file mode 100644 index 59b638b69..000000000 --- a/evaluator/Util/statistics_analysis.py +++ /dev/null @@ -1,61 +0,0 @@ -import talib -import numpy -from config.cst import START_PENDING_EVAL_NOTE - -from evaluator.Util.abstract_util import AbstractUtil - - -class StatisticAnalysis(AbstractUtil): - - # Return linear proximity to the lower or the upper band relatively to the middle band. - # Linearly compute proximity between middle and delta before linear: - @staticmethod - def analyse_recent_trend_changes(data_frame, delta_function): - # compute bollinger bands - upper_band, middle_band, lower_band = talib.BBANDS(data_frame, 20, 2, 2) - # if close to lower band => low value => bad, - # therefore if close to middle, value is keeping up => good - # finally if up the middle one or even close to the upper band => very good - - current_value = data_frame.iloc[-1] - current_up = upper_band.tail(1).values[0] - current_middle = middle_band.tail(1).values[0] - current_low = lower_band.tail(1).values[0] - delta_up = current_up - current_middle - delta_low = current_middle - current_low - - # its exactly on all bands - if current_up == current_low: - return START_PENDING_EVAL_NOTE - - # exactly on the middle - elif current_value == current_middle: - return 0 - - # up the upper band - elif current_value > current_up: - return -1 - - # down the lower band - elif current_value < current_low: - return 1 - - # delta given: use parabolic factor after delta, linear before - delta = delta_function(numpy.mean([delta_up, delta_low])) - - micro_change = ((current_value / current_middle) - 1) / 2 - - # approximately on middle band - if current_middle + delta >= current_value >= current_middle - delta: - return micro_change - - # up the middle area - elif current_middle + delta < current_value: - return -1 * max(micro_change, (current_value - current_middle) / delta_up) - - # down the middle area - elif current_middle - delta > current_value: - return max(micro_change, (current_middle - current_value) / delta_low) - - # should not happen - return 0 diff --git a/evaluator/Util/text_analysis.py b/evaluator/Util/text_analysis.py deleted file mode 100644 index 033445400..000000000 --- a/evaluator/Util/text_analysis.py +++ /dev/null @@ -1,48 +0,0 @@ -from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer -from tools.decoding_encoding import DecoderEncoder - -from evaluator.Util.abstract_util import AbstractUtil - - -class TextAnalysis(AbstractUtil): - def __init__(self): - self.analyzer = SentimentIntensityAnalyzer() - # self.test() - - def analyse(self, text): - return self.analyzer.polarity_scores(text)["compound"] - - # official account tweets that can be used for testing purposes - def test(self): - texts = [ - "So excited at what I am working on for the future. I don’t get to talk about what I am actively doing on a daily basis because it’s far ahead of our messaging but I am beyond excited about it! #substratum $sub", - "Have you read about VeChain and INPI ASIA's integration to bring nanotechnology for digital identity to the VeChainThor blockchain? NDCodes resist high temperature, last over 100 years, are incredibly durable and invisible to the naked eye", - "Crypto market update: BTC holds near $9K, ETH rising over $640, BCH grows 85% on the week", - "Extremely excited & proud to announce that #Substratum Node is NOW Open Source! https://github.com/SubstratumNetwork/SubstratumNode …#NetNeutrality $SUB #cryptocurrency #bitcoin #blockchain #technology #SubSavesTheInternet", - "A scientific hypothesis about how cats, infected with toxoplasmosis, are making humans buy Bitcoin was presented at last night's BAHFest at MIT.", - "Net Neutrality Ends! Substratum Update 4.23.18", - "One more test from @SubstratumNet for today. :)", - "Goldman Sachs hires crypto trader as head of digital assets markets", - "Big news coming! Scheduled to be 27th/28th April... Have a guess...😎", - "A great step to safer #exchanges: @WandXDapp Joins REMME’s 2018 Pilot Program for testing functionality of certificate-based signup and login for end users. https://medium.com/remme/wandx-joins-remmes-2018-pilot-program-588379aaea4d … #nomorepasswords #blockchain #crypto $REM" - "omeone transferred $99 million in litecoin — and it only cost them $0.40 in fees. My bank charges me a hell of a lot more to transfer a hell of a lot less. Can we hurry up with this crypto/blockchain revolution I'm tired of paying fees out of my ass to a bunch of fat cats", - "This week's Theta Surge on http://SLIVER.tv isn't just for virtual items... five PlayStation 4s will be given out to viewers that use Theta Tokens to reward the featured #Fortnite streamer! Tune in this Friday at 1pm PST to win!", - "The European Parliament has voted for regulations to prevent the use of cryptocurrencies in money laundering and terrorism financing. As long as they have good intention i don' t care.. but how much can we trust them??!?!" - "By partnering with INPI ASIA, the VeChainThor Platform incorporates nanotechnology with digital identification to provide solutions to some of the worlds most complex IoT problems.", - "Thanks to the China Academy of Information and Communication Technology, IPRdaily and Nashwork for organizing the event.", - "Delivered a two hour open course last week in Beijing. You can tell the awareness of blockchain is drastically increasing by the questions asked by the audience. But people need hand holding and business friendly features to adopt the tech.", - "Introducing the first Oracle Enabler tool of the VeChainThor Platform: Multi-Party Payment Protocol (MPP).", - "An open letter from Sunny Lu (CEO) on VeChainThor Platform.", - "VeChain has finished the production of digital intellectual property services with partner iTaotaoke. This solution provides a competitive advantage for an industry in need of trust-free reporting and content protections.#GoVeChain", - "Special thanks to @GaboritMickael to have invited @vechainofficial to present our solution and make a little demo to @AccentureFrance", - "VeChain’s COO, @kfeng027, is invited to ‘Crypto Media Collection Vo.1’ held at DeNA’s campus by Coinjinja in Tokyo, one of the largest cryptocurrency information platforms. Kevin’s speech begins at 16:35 UTC+9, livestreamed via https://ssl.twitcasting.tv/coinjinja ", - "VeChain will pitch their solutions potentially landing a co-development product with LVMH. In attendance will be CEOs Bill McDermott (SAP), Chuck Robbins (CISCO), Ginni Rometty (IBM), and Stephane Richard (Orange) as speakers -", - "As the only blockchain company selected, VeChain is among 30 of 800+ hand-picked startups to compete for the second edition of the LVMH Innovation Award. As a result, VeChain has been invited to join the Luxury Lab LVMH at Viva Technology in Paris from May 24-26, 2018.", - "VeChain to further its partnership with RFID leader Xiamen Innov and newly announced top enterprise solution provider CoreLink by deploying a VeChainThor enterprise level decentralized application - AssetLink.", - "Today, a group of senior leaders from TCL's Eagle Talent program visited the VeChain SH office. @VeChain_GU demonstrated our advanced enterprise solutions and it's relation to TCL's market. As a result, we're exploring new developments within TCL related to blockchain technology.", - "VeChain announces a partnership with eGrid, a leading publicly listed ERP, SCM and CRM solution provider to synergistically provide comprehensive blockchain technology backing for a significant portion of China’s automobile industry.", - "We are glad to be recognized as Top 10 blockchain technology solution providers in 2018. outprovides a platform for CIOs and decision makers to share their experiences, wisdom and advice. Read the full version article via", - "Talked about TOTO at the blockchain seminar in R University of Science and Technology business school last Saturday. It covered 3000 MBA students across business schools in China." - ] - for text in texts: - print(str(self.analyse(text)) + " => "+str(DecoderEncoder.encode_into_bytes(text))) diff --git a/evaluator/Util/trend_analysis.py b/evaluator/Util/trend_analysis.py deleted file mode 100644 index f96309778..000000000 --- a/evaluator/Util/trend_analysis.py +++ /dev/null @@ -1,81 +0,0 @@ -import numpy - -from evaluator.Util.abstract_util import AbstractUtil -from config.cst import DIVERGENCE_USED_VALUE - - -class TrendAnalysis(AbstractUtil): - - # trend < 0 --> Down trend - # trend > 0 --> Up trend - @staticmethod - def get_trend(data_frame, averages_to_use): - trend = 0 - inc = round(1 / len(averages_to_use), 2) - averages = [] - - # Get averages - for average_to_use in averages_to_use: - averages.append(data_frame.tail(average_to_use).values.mean()) - - for a in range(0, len(averages) - 1): - if averages[a] - averages[a + 1] > 0: - trend -= inc - else: - trend += inc - - return trend - - @staticmethod - # TODO - def detect_divergence(data_frame, indicator_data_frame): - candle_data = data_frame.tail(DIVERGENCE_USED_VALUE) - indicator_data = indicator_data_frame.tail(DIVERGENCE_USED_VALUE) - - total_delta = [] - - for i in range(0, DIVERGENCE_USED_VALUE - 1): - candle_delta = candle_data.values[i] - candle_data.values[i + 1] - indicator_delta = indicator_data.values[i] - indicator_data.values[i + 1] - total_delta.append(candle_delta - indicator_delta) - - @staticmethod - def get_estimation_of_move_state_relatively_to_previous_moves_length(mean_crossing_indexes, pattern_move_size=1): - - # compute average move size - time_averages = [(lambda a: mean_crossing_indexes[a+1]-mean_crossing_indexes[a])(a) - for a in range(len(mean_crossing_indexes)-1)] - time_average = numpy.mean(time_averages)*pattern_move_size - - # higher than time_average => high chances to be at half of the move already - if time_averages[-1] > time_average/2: - return 1 - else: - return time_averages[-1] / (time_average/2) - - @staticmethod - def get_threshold_change_indexes(data_frame, threshold): - - # sub threshold values - sub_threshold_indexes = data_frame.index[data_frame <= threshold] - - # remove consecutive sub-threshold values because they are not crosses - threshold_crossing_indexes = [] - current_move_size = 1 - for i in range(len(sub_threshold_indexes)): - index = sub_threshold_indexes[i] - if not len(threshold_crossing_indexes): - threshold_crossing_indexes.append(index) - else: - if threshold_crossing_indexes[-1] == index - current_move_size: - current_move_size += 1 - else: - threshold_crossing_indexes.append(sub_threshold_indexes[i-1]) - threshold_crossing_indexes.append(index) - current_move_size = 1 - # add last index if data_frame ends above threshold and last threshold_crossing_indexes inferior - # to data_frame size - if sub_threshold_indexes[-1] < len(data_frame.index) and data_frame.iloc[-1] > threshold: - threshold_crossing_indexes.append(sub_threshold_indexes[-1]+1) - - return threshold_crossing_indexes diff --git a/evaluator/__init__.py b/evaluator/__init__.py index 8b1378917..e69de29bb 100644 --- a/evaluator/__init__.py +++ b/evaluator/__init__.py @@ -1 +0,0 @@ - diff --git a/evaluator/abstract_evaluator.py b/evaluator/abstract_evaluator.py index 642ef487b..134e1cee2 100644 --- a/evaluator/abstract_evaluator.py +++ b/evaluator/abstract_evaluator.py @@ -1,3 +1,5 @@ +import time + from config.cst import * from evaluator.Dispatchers.abstract_dispatcher import * @@ -17,6 +19,9 @@ def __init__(self): self.eval_note = START_PENDING_EVAL_NOTE self.pertinence = START_EVAL_PERTINENCE + self.eval_note_time_to_live = None + self.eval_note_changed_time = None + @classmethod def get_name(cls): return cls.__name__ @@ -28,6 +33,7 @@ def set_logger(self, logger): # Used to provide the global config def set_config(self, config): self.config = config + self.enabled = self.is_enabled(False) # Symbol is the cryptocurrency symbol def set_symbol(self, symbol): @@ -58,6 +64,7 @@ def get_is_updating(self): def eval(self) -> None: self.is_updating = True try: + self.ensure_eval_note_is_not_expired() self.eval_impl() except Exception as e: if CONFIG_DEBUG_OPTION in self.config and self.config[CONFIG_DEBUG_OPTION]: @@ -83,11 +90,28 @@ def eval(self) -> None: def eval_impl(self) -> None: raise NotImplementedError("Eval_impl not implemented") + # explore up to the 1st parent @classmethod def get_is_dispatcher_client(cls): - return DispatcherAbstractClient in cls.__bases__ + if DispatcherAbstractClient in cls.__bases__: + return True + else: + for base in cls.__bases__: + if DispatcherAbstractClient in base.__bases__: + return True + return False + + @classmethod + def get_parent_evaluator_classes(cls, higher_parent_class_limit=None): + classes = [] + limit_class = higher_parent_class_limit if higher_parent_class_limit else AbstractEvaluator + for class_type in cls.mro(): + if limit_class in class_type.mro(): + classes.append(class_type) + return classes def set_eval_note(self, new_eval_note): + self.eval_note_changed() if self.eval_note == START_PENDING_EVAL_NOTE: self.eval_note = INIT_EVAL_NOTE @@ -97,3 +121,33 @@ def set_eval_note(self, new_eval_note): self.eval_note = -1 else: self.eval_note += new_eval_note + + def is_enabled(self, default): + if self.config[CONFIG_EVALUATOR] is not None: + if self.get_name() in self.config[CONFIG_EVALUATOR]: + return self.config[CONFIG_EVALUATOR][self.get_name()] + else: + for parent in self.__class__.mro(): + if parent.__name__ in self.config[CONFIG_EVALUATOR]: + return self.config[CONFIG_EVALUATOR][parent.__name__] + return default + + # use only if the current evaluation is to stay for a pre-defined amount of seconds + def save_evaluation_expiration_time(self, eval_note_time_to_live, eval_note_changed_time=None): + self.eval_note_time_to_live = eval_note_time_to_live + self.eval_note_changed_time = eval_note_changed_time if eval_note_changed_time else time.time() + + def eval_note_changed(self): + if self.eval_note_time_to_live is not None: + if self.eval_note_changed_time is None: + self.eval_note_changed_time = time.time() + + def ensure_eval_note_is_not_expired(self): + if self.eval_note_time_to_live is not None: + if self.eval_note_changed_time is None: + self.eval_note_changed_time = time.time() + + if time.time() - self.eval_note_changed_time > self.eval_note_time_to_live: + self.eval_note = START_PENDING_EVAL_NOTE + self.eval_note_time_to_live = None + self.eval_note_changed_time = None diff --git a/evaluator/cryptocurrency_evaluator.py b/evaluator/cryptocurrency_evaluator.py new file mode 100644 index 000000000..d260ae3a3 --- /dev/null +++ b/evaluator/cryptocurrency_evaluator.py @@ -0,0 +1,61 @@ +from backtesting.backtesting import Backtesting +from evaluator.Updaters.social_evaluator_not_threaded_update import SocialEvaluatorNotThreadedUpdateThread +from evaluator.evaluator_creator import EvaluatorCreator + + +class CryptocurrencyEvaluator: + def __init__(self, config, crypto_currency, dispatchers_list): + self.config = config + self.crypto_currency = crypto_currency + self.dispatchers_list = dispatchers_list + + self.symbol_evaluator_list = {} + + if Backtesting.enabled(self.config): + self.social_eval_list = [] + self.social_not_threaded_list = [] + else: + self.social_eval_list = EvaluatorCreator.create_social_eval(self.config, + self.crypto_currency, + self.dispatchers_list) + + self.social_not_threaded_list = EvaluatorCreator.create_social_not_threaded_list(self.social_eval_list) + + self.social_evaluator_refresh = SocialEvaluatorNotThreadedUpdateThread(self.social_not_threaded_list) + + def add_symbol_evaluator(self, symbol, symbol_evaluator): + self.symbol_evaluator_list[symbol] = symbol_evaluator + + def start_threads(self): + self.social_evaluator_refresh.start() + + def stop_threads(self): + for thread in self.social_eval_list: + thread.stop() + + self.social_evaluator_refresh.stop() + + def join_threads(self): + for thread in self.social_eval_list: + if thread.is_alive(): + thread.join() + + self.social_evaluator_refresh.join() + + def get_social_eval_list(self): + return self.social_eval_list + + def get_dispatchers_list(self): + return self.dispatchers_list + + def get_social_not_threaded_list(self): + return self.social_not_threaded_list + + def get_symbol_pairs(self): + return self.config["crypto_currencies"][self.crypto_currency]["pairs"] + + def get_symbol_evaluator_list(self): + return self.symbol_evaluator_list + + def get_config(self): + return self.config diff --git a/evaluator/evaluator.py b/evaluator/evaluator.py index 4a8666155..46e3b0492 100644 --- a/evaluator/evaluator.py +++ b/evaluator/evaluator.py @@ -48,12 +48,12 @@ def set_ta_eval_list(self, new_ta_list): def set_social_eval(self, new_social_list, evaluator_thread): self.social_eval_list = new_social_list for social_eval in self.social_eval_list: - social_eval.add_evaluator_thread(evaluator_thread) + social_eval.add_evaluator_thread_manager(evaluator_thread) def set_real_time_eval(self, new_real_time_list, evaluator_thread): self.real_time_eval_list = new_real_time_list for real_time_eval in self.real_time_eval_list: - real_time_eval.add_evaluator_thread(evaluator_thread) + real_time_eval.add_evaluator_thread_manager(evaluator_thread) def update_ta_eval(self, ignored_evaluator=None): # update only with new data @@ -92,3 +92,6 @@ def get_creator(self): def get_config(self): return self.config + + def get_time_frame(self): + return self.time_frame diff --git a/evaluator/evaluator_creator.py b/evaluator/evaluator_creator.py index 69347091c..b293729b6 100644 --- a/evaluator/evaluator_creator.py +++ b/evaluator/evaluator_creator.py @@ -14,23 +14,14 @@ class EvaluatorCreator: def get_name(cls): return cls.__name__ - @staticmethod - def create_advanced_evaluators(evaluator_class, config): - evaluator_advanced_eval_class_list = [] - for evaluator_subclass in evaluator_class.__subclasses__(): - for eval_class in evaluator_subclass.__subclasses__(): - for eval_class_type in AdvancedManager.get_classes(config, eval_class): - evaluator_advanced_eval_class_list.append(eval_class_type) - return evaluator_advanced_eval_class_list - @staticmethod def create_ta_eval_list(evaluator): ta_eval_instance_list = [] - for ta_eval_class in EvaluatorCreator.create_advanced_evaluators(TAEvaluator, evaluator.get_config()): + for ta_eval_class in AdvancedManager.create_advanced_evaluator_types_list(TAEvaluator, evaluator.get_config()): ta_eval_class_instance = ta_eval_class() + ta_eval_class_instance.set_config(evaluator.config) if ta_eval_class_instance.get_is_enabled(): ta_eval_class_instance.set_logger(logging.getLogger(ta_eval_class.get_name())) - ta_eval_class_instance.set_config(evaluator.config) ta_eval_class_instance.set_data(evaluator.data) ta_eval_class_instance.set_symbol(evaluator.get_symbol()) ta_eval_instance_list.append(ta_eval_class_instance) @@ -49,12 +40,12 @@ def create_dispatchers(config): @staticmethod def create_social_eval(config, symbol, dispatchers_list): social_eval_list = [] - for social_eval_class in EvaluatorCreator.create_advanced_evaluators(SocialEvaluator, config): + for social_eval_class in AdvancedManager.create_advanced_evaluator_types_list(SocialEvaluator, config): social_eval_class_instance = social_eval_class() + social_eval_class_instance.set_config(config) if social_eval_class_instance.get_is_enabled(): is_evaluator_to_be_used = True social_eval_class_instance.set_logger(logging.getLogger(social_eval_class.get_name())) - social_eval_class_instance.set_config(config) social_eval_class_instance.set_symbol(symbol) social_eval_class_instance.prepare() @@ -90,11 +81,11 @@ def set_social_eval_dispatcher(social_eval_class_instance, dispatchers_list): @staticmethod def create_real_time_ta_evals(config, exchange_inst, symbol): real_time_ta_eval_list = [] - for real_time_eval_class in EvaluatorCreator.create_advanced_evaluators(RealTimeEvaluator, config): + for real_time_eval_class in AdvancedManager.create_advanced_evaluator_types_list(RealTimeEvaluator, config): real_time_eval_class_instance = real_time_eval_class(exchange_inst, symbol) + real_time_eval_class_instance.set_config(config) if real_time_eval_class_instance.get_is_enabled(): real_time_eval_class_instance.set_logger(logging.getLogger(real_time_eval_class.get_name())) - real_time_eval_class_instance.set_config(config) # start refreshing thread real_time_eval_class_instance.start() @@ -117,8 +108,9 @@ def create_social_not_threaded_list(social_eval_list): @staticmethod def create_strategies_eval_list(config): strategies_eval_list = [] - for strategies_eval_class in EvaluatorCreator.create_advanced_evaluators(StrategiesEvaluator, config): + for strategies_eval_class in AdvancedManager.create_advanced_evaluator_types_list(StrategiesEvaluator, config): strategies_eval_class_instance = strategies_eval_class() + strategies_eval_class_instance.set_config(config) if strategies_eval_class_instance.get_is_enabled(): strategies_eval_class_instance.set_logger( logging.getLogger(strategies_eval_class_instance.get_name())) diff --git a/evaluator/evaluator_final.py b/evaluator/evaluator_final.py index 66a220791..4db4598dc 100644 --- a/evaluator/evaluator_final.py +++ b/evaluator/evaluator_final.py @@ -3,11 +3,12 @@ from config.cst import EvaluatorStates, INIT_EVAL_NOTE from evaluator.evaluator_order_creator import EvaluatorOrderCreator -from tools import EvaluatorNotification -from tools.asynchronous_client import AsynchronousClient +from tools.asynchronous_server import AsynchronousServer +from tools.notifications import EvaluatorNotification +from tools.evaluators_util import check_valid_eval_note -class FinalEvaluator(AsynchronousClient): +class FinalEvaluator(AsynchronousServer): def __init__(self, symbol_evaluator, exchange, symbol): super().__init__(self.finalize) self.symbol_evaluator = symbol_evaluator @@ -21,74 +22,75 @@ def __init__(self, symbol_evaluator, exchange, symbol): self.logger = logging.getLogger(self.__class__.__name__) # If final_eval not is < X_THRESHOLD --> state = X - self.VERY_LONG_THRESHOLD = -0.75 + self.VERY_LONG_THRESHOLD = -0.95 self.LONG_THRESHOLD = -0.25 self.NEUTRAL_THRESHOLD = 0.25 - self.SHORT_THRESHOLD = 0.75 + self.SHORT_THRESHOLD = 0.95 self.RISK_THRESHOLD = 0.2 self.notifier = EvaluatorNotification(self.config) self.queue = Queue() - def _set_state(self, state): - if state != self.state: - self.state = state - self.logger.info(" ** NEW FINAL STATE ** : {0}".format(self.state)) - - # cancel open orders - if self.symbol_evaluator.get_trader(self.exchange).enabled(): - self.symbol_evaluator.get_trader(self.exchange).cancel_open_orders(self.symbol) - if self.symbol_evaluator.get_trader_simulator(self.exchange).enabled(): - self.symbol_evaluator.get_trader_simulator(self.exchange).cancel_open_orders(self.symbol) - - # create notification - evaluator_notification = None - if self.notifier.enabled() and self.state is not EvaluatorStates.NEUTRAL: - evaluator_notification = self.notifier.notify_state_changed( - self.final_eval, - self.symbol_evaluator, - self.symbol_evaluator.get_trader(self.exchange), - self.state, - self.symbol_evaluator.get_matrix(self.exchange).get_matrix()) - - # call orders creation method - self.create_final_state_orders(evaluator_notification) + def _set_state(self, new_state): + if new_state != self.state: + # previous_state = self.state + self.state = new_state + self.logger.info("{0} ** NEW FINAL STATE ** : {1}".format(self.symbol, self.state)) + + # if new state is not neutral --> cancel orders and create new else keep orders + if new_state is not EvaluatorStates.NEUTRAL: + + # cancel open orders + if self.symbol_evaluator.get_trader(self.exchange).is_enabled(): + self.symbol_evaluator.get_trader(self.exchange).cancel_open_orders(self.symbol) + if self.symbol_evaluator.get_trader_simulator(self.exchange).is_enabled(): + self.symbol_evaluator.get_trader_simulator(self.exchange).cancel_open_orders(self.symbol) + + # create notification + evaluator_notification = None + if self.notifier.enabled(): + evaluator_notification = self.notifier.notify_state_changed( + self.final_eval, + self.symbol_evaluator.get_crypto_currency_evaluator(), + self.symbol_evaluator.get_symbol(), + self.symbol_evaluator.get_trader(self.exchange), + self.state, + self.symbol_evaluator.get_matrix(self.exchange).get_matrix()) + + # call orders creation method + self.create_final_state_orders(evaluator_notification) # create real and/or simulating orders in trader instances def create_final_state_orders(self, evaluator_notification): # create orders - if EvaluatorOrderCreator.can_create_order(self.symbol, - self.exchange, - self.symbol_evaluator.get_trader( - self.exchange), - self.state): - - # create real exchange order - if self.symbol_evaluator.get_trader(self.exchange).enabled(): - FinalEvaluator._push_order_notification_if_possible( - self.symbol_evaluator.get_evaluator_order_creator().create_new_order( - self.final_eval, - self.symbol, - self.exchange, - self.symbol_evaluator.get_trader(self.exchange), - self.state), - evaluator_notification) - # create trader simulator order - if self.symbol_evaluator.get_trader_simulator(self.exchange).enabled(): - FinalEvaluator._push_order_notification_if_possible( - self.symbol_evaluator.get_evaluator_order_creator().create_new_order( - self.final_eval, - self.symbol, - self.exchange, - self.symbol_evaluator.get_trader_simulator(self.exchange), - self.state), - evaluator_notification) + # simulated trader + self._create_order_if_possible(evaluator_notification, + self.symbol_evaluator.get_trader_simulator(self.exchange)) + + # real trader + self._create_order_if_possible(evaluator_notification, + self.symbol_evaluator.get_trader(self.exchange)) + + def _create_order_if_possible(self, evaluator_notification, trader): + if trader.is_enabled(): + with trader.get_portfolio() as pf: + if EvaluatorOrderCreator.can_create_order(self.symbol, self.exchange, self.state, pf): + FinalEvaluator._push_order_notification_if_possible( + self.symbol_evaluator.get_evaluator_order_creator().create_new_order( + self.final_eval, + self.symbol, + self.exchange, + trader, + pf, + self.state), + evaluator_notification) @staticmethod - def _push_order_notification_if_possible(order, notification): - if order is not None: - order.get_order_notifier().notify(notification) + def _push_order_notification_if_possible(order_list, notification): + if order_list: + for order in order_list: + order.get_order_notifier().notify(notification) def get_state(self): return self.state @@ -100,27 +102,32 @@ def _prepare(self): strategies_analysis_note_counter = 0 # Strategies analysis for evaluated_strategies in self.symbol_evaluator.get_strategies_eval_list(self.exchange): - self.final_eval += evaluated_strategies.get_eval_note() * evaluated_strategies.get_pertinence() - strategies_analysis_note_counter += evaluated_strategies.get_pertinence() + strategy_eval = evaluated_strategies.get_eval_note() + if check_valid_eval_note(strategy_eval): + self.final_eval += strategy_eval * evaluated_strategies.get_pertinence() + strategies_analysis_note_counter += evaluated_strategies.get_pertinence() if strategies_analysis_note_counter > 0: self.final_eval /= strategies_analysis_note_counter else: self.final_eval = INIT_EVAL_NOTE + def _get_delta_risk(self): + return self.RISK_THRESHOLD * self.symbol_evaluator.get_trader(self.exchange).get_risk() + def _create_state(self): - risk = self.symbol_evaluator.get_trader(self.exchange).get_risk() + delta_risk = self._get_delta_risk() - if self.final_eval < self.VERY_LONG_THRESHOLD - (self.RISK_THRESHOLD * risk): + if self.final_eval < self.VERY_LONG_THRESHOLD + delta_risk: self._set_state(EvaluatorStates.VERY_LONG) - elif self.final_eval < self.LONG_THRESHOLD + (self.RISK_THRESHOLD * risk): + elif self.final_eval < self.LONG_THRESHOLD + delta_risk: self._set_state(EvaluatorStates.LONG) - elif self.final_eval < self.NEUTRAL_THRESHOLD - (self.RISK_THRESHOLD * risk): + elif self.final_eval < self.NEUTRAL_THRESHOLD - delta_risk: self._set_state(EvaluatorStates.NEUTRAL) - elif self.final_eval < self.SHORT_THRESHOLD + (self.RISK_THRESHOLD * risk): + elif self.final_eval < self.SHORT_THRESHOLD - delta_risk: self._set_state(EvaluatorStates.SHORT) else: @@ -129,6 +136,7 @@ def _create_state(self): def finalize(self): # reset previous note self.final_eval = INIT_EVAL_NOTE + self._prepare() self._create_state() diff --git a/evaluator/evaluator_matrix.py b/evaluator/evaluator_matrix.py index d79aeab25..2e993f479 100644 --- a/evaluator/evaluator_matrix.py +++ b/evaluator/evaluator_matrix.py @@ -1,8 +1,10 @@ from config.cst import EvaluatorMatrixTypes +from tools.evaluators_util import check_valid_eval_note class EvaluatorMatrix: - def __init__(self): + def __init__(self, config): + self.config = config self.matrix = { EvaluatorMatrixTypes.TA: {}, EvaluatorMatrixTypes.SOCIAL: {}, @@ -23,5 +25,20 @@ def set_eval(self, matrix_type, evaluator_name, value, time_frame=None): def get_type_evals(self, matrix_type): return self.matrix[matrix_type] + @staticmethod + def get_eval_note(matrix, matrix_type, evaluator_name, time_frame=None): + if matrix_type in matrix and evaluator_name in matrix[matrix_type]: + if time_frame is not None: + if isinstance(matrix[matrix_type][evaluator_name], dict) \ + and time_frame in matrix[matrix_type][evaluator_name]: + eval_note = matrix[matrix_type][evaluator_name][time_frame] + if check_valid_eval_note(eval_note): + return eval_note + else: + eval_note = matrix[matrix_type][evaluator_name] + if check_valid_eval_note(eval_note): + return eval_note + return None + def get_matrix(self): return self.matrix diff --git a/evaluator/evaluator_order_creator.py b/evaluator/evaluator_order_creator.py index 0817bb611..37f04d0b4 100644 --- a/evaluator/evaluator_order_creator.py +++ b/evaluator/evaluator_order_creator.py @@ -1,16 +1,17 @@ import logging +import math from config.cst import * +from config.cst import ExchangeConstantsMarketStatusColumns as Ecmsc +from tools.symbol_util import split_symbol class EvaluatorOrderCreator: def __init__(self): - self.last_values_count = 10 - self.MAX_SUM_RESULT = 2 - self.STOP_LOSS_ORDER_MAX_PERCENT = 0.97 - self.STOP_LOSS_ORDER_MIN_PERCENT = 0.90 + self.STOP_LOSS_ORDER_MAX_PERCENT = 0.99 + self.STOP_LOSS_ORDER_MIN_PERCENT = 0.95 self.STOP_LOSS_ORDER_ATTENUATION = (self.STOP_LOSS_ORDER_MAX_PERCENT - self.STOP_LOSS_ORDER_MIN_PERCENT) self.QUANTITY_MIN_PERCENT = 0.1 @@ -20,14 +21,146 @@ def __init__(self): self.QUANTITY_MARKET_MIN_PERCENT = 0.5 self.QUANTITY_MARKET_MAX_PERCENT = 1 self.QUANTITY_BUY_MARKET_ATTENUATION = 0.2 - self.QUANTITY_MARKET_ATTENUATION = (self.QUANTITY_MARKET_MAX_PERCENT - self.QUANTITY_MARKET_MIN_PERCENT) / self.MAX_SUM_RESULT + self.QUANTITY_MARKET_ATTENUATION = (self.QUANTITY_MARKET_MAX_PERCENT - self.QUANTITY_MARKET_MIN_PERCENT) \ + / self.MAX_SUM_RESULT - self.BUY_LIMIT_ORDER_MAX_PERCENT = 0.99 - self.BUY_LIMIT_ORDER_MIN_PERCENT = 0.96 + self.BUY_LIMIT_ORDER_MAX_PERCENT = 0.995 + self.BUY_LIMIT_ORDER_MIN_PERCENT = 0.98 self.SELL_LIMIT_ORDER_MIN_PERCENT = 1 + (1 - self.BUY_LIMIT_ORDER_MAX_PERCENT) self.SELL_LIMIT_ORDER_MAX_PERCENT = 1 + (1 - self.BUY_LIMIT_ORDER_MIN_PERCENT) - self.LIMIT_ORDER_ATTENUATION = ( - self.BUY_LIMIT_ORDER_MAX_PERCENT - self.BUY_LIMIT_ORDER_MIN_PERCENT) / self.MAX_SUM_RESULT + self.LIMIT_ORDER_ATTENUATION = (self.BUY_LIMIT_ORDER_MAX_PERCENT - self.BUY_LIMIT_ORDER_MIN_PERCENT)\ + / self.MAX_SUM_RESULT + + @staticmethod + def can_create_order(symbol, exchange, state, portfolio): + currency, market = split_symbol(symbol) + + # get symbol min amount when creating order + symbol_limit = exchange.get_market_status(symbol)[Ecmsc.LIMITS.value] + symbol_min_amount = symbol_limit[Ecmsc.LIMITS_AMOUNT.value][Ecmsc.LIMITS_AMOUNT_MIN.value] + order_min_amount = symbol_limit[Ecmsc.LIMITS_COST.value][Ecmsc.LIMITS_COST_MIN.value] + + # short cases => sell => need this currency + if state == EvaluatorStates.VERY_SHORT or state == EvaluatorStates.SHORT: + return portfolio.get_currency_portfolio(currency) > symbol_min_amount + + # long cases => buy => need money(aka other currency in the pair) to buy this currency + elif state == EvaluatorStates.LONG or state == EvaluatorStates.VERY_LONG: + return portfolio.get_currency_portfolio(market) > order_min_amount + + # other cases like neutral state or unfulfilled previous conditions + return False + + # creates a new order (or multiple split orders), always check EvaluatorOrderCreator.can_create_order() first. + def create_new_order(self, eval_note, symbol, exchange, trader, portfolio, state): + try: + last_prices = exchange.get_recent_trades(symbol) + reference_sum = 0 + + for last_price in last_prices[-ORDER_CREATION_LAST_TRADES_TO_USE:]: + reference_sum += float(last_price["price"]) + + reference = reference_sum / ORDER_CREATION_LAST_TRADES_TO_USE + + currency, market = split_symbol(symbol) + + current_portfolio = portfolio.get_currency_portfolio(currency) + current_market_quantity = portfolio.get_currency_portfolio(market) + + market_quantity = current_market_quantity / reference + + price = reference + symbol_market = exchange.get_market_status(symbol) + + created_orders = [] + + if state == EvaluatorStates.VERY_SHORT: + quantity = self._get_market_quantity_from_risk(eval_note, + trader, + current_portfolio) + for order_quantity, order_price in self._check_and_adapt_order_details_if_necessary(quantity, price, + symbol_market): + market = trader.create_order_instance(order_type=TraderOrderType.SELL_MARKET, + symbol=symbol, + current_price=order_price, + quantity=order_quantity, + price=order_price) + trader.create_order(market, portfolio) + created_orders.append(market) + return created_orders + + elif state == EvaluatorStates.SHORT: + quantity = self._get_limit_quantity_from_risk(eval_note, + trader, + current_portfolio) + limit_price = EvaluatorOrderCreator\ + ._adapt_price(symbol_market, price * self._get_limit_price_from_risk(eval_note, trader)) + stop_price = EvaluatorOrderCreator \ + ._adapt_price(symbol_market, price * self._get_stop_price_from_risk(trader)) + for order_quantity, order_price in self._check_and_adapt_order_details_if_necessary(quantity, + limit_price, + symbol_market): + limit = trader.create_order_instance(order_type=TraderOrderType.SELL_LIMIT, + symbol=symbol, + current_price=price, + quantity=order_quantity, + price=order_price) + updated_limit = trader.create_order(limit, portfolio) + created_orders.append(updated_limit) + + stop = trader.create_order_instance(order_type=TraderOrderType.STOP_LOSS, + symbol=symbol, + current_price=price, + quantity=order_quantity, + price=stop_price, + linked_to=updated_limit) + trader.create_order(stop, portfolio) + return created_orders + + elif state == EvaluatorStates.NEUTRAL: + pass + + # TODO : stop loss + elif state == EvaluatorStates.LONG: + quantity = self._get_limit_quantity_from_risk(eval_note, + trader, + market_quantity) + limit_price = EvaluatorOrderCreator\ + ._adapt_price(symbol_market, price * self._get_limit_price_from_risk(eval_note, trader)) + for order_quantity, order_price in self._check_and_adapt_order_details_if_necessary(quantity, + limit_price, + symbol_market): + limit = trader.create_order_instance(order_type=TraderOrderType.BUY_LIMIT, + symbol=symbol, + current_price=price, + quantity=order_quantity, + price=order_price) + trader.create_order(limit, portfolio) + created_orders.append(limit) + return created_orders + + elif state == EvaluatorStates.VERY_LONG: + quantity = self._get_market_quantity_from_risk(eval_note, + trader, + market_quantity, + True) + for order_quantity, order_price in self._check_and_adapt_order_details_if_necessary(quantity, price, + symbol_market): + market = trader.create_order_instance(order_type=TraderOrderType.BUY_MARKET, + symbol=symbol, + current_price=order_price, + quantity=order_quantity, + price=order_price) + trader.create_order(market, portfolio) + created_orders.append(market) + return created_orders + + # if nothing go returned, return None + return None + + except Exception as e: + logging.getLogger(self.__class__.__name__).error("Failed to create order : {0}".format(e)) + return None @staticmethod def _check_factor(min_val, max_val, factor): @@ -45,6 +178,7 @@ def _check_factor(min_val, max_val, factor): 1 - abs(eval_note) + 1 - trader.get_risk() --> result between 0 and 2 --> self.MAX_SUM_RESULT self.QUANTITY_ATTENUATION --> try to contains the result between self.XXX_MIN_PERCENT and self.XXX_MAX_PERCENT """ + def _get_limit_price_from_risk(self, eval_note, trader): if eval_note > 0: factor = self.SELL_LIMIT_ORDER_MIN_PERCENT + \ @@ -59,6 +193,18 @@ def _get_limit_price_from_risk(self, eval_note, trader): self.BUY_LIMIT_ORDER_MAX_PERCENT, factor) + """ + Starting point : self.STOP_LOSS_ORDER_MAX_PERCENT + trader.get_risk() --> low risk : stop level close to the current price + self.STOP_LOSS_ORDER_ATTENUATION --> try to contains the result between self.STOP_LOSS_ORDER_MIN_PERCENT and self.STOP_LOSS_ORDER_MAX_PERCENT + """ + + def _get_stop_price_from_risk(self, trader): + factor = self.STOP_LOSS_ORDER_MAX_PERCENT - (trader.get_risk() * self.STOP_LOSS_ORDER_ATTENUATION) + return EvaluatorOrderCreator._check_factor(self.STOP_LOSS_ORDER_MIN_PERCENT, + self.STOP_LOSS_ORDER_MAX_PERCENT, + factor) + """ Starting point : self.QUANTITY_MIN_PERCENT abs(eval_note) --> confirmation level --> high : sell/buy more quantity @@ -66,6 +212,7 @@ def _get_limit_price_from_risk(self, eval_note, trader): abs(eval_note) + trader.get_risk() --> result between 0 and 2 --> self.MAX_SUM_RESULT self.QUANTITY_ATTENUATION --> try to contains the result between self.QUANTITY_MIN_PERCENT and self.QUANTITY_MAX_PERCENT """ + def _get_limit_quantity_from_risk(self, eval_note, trader, quantity): factor = self.QUANTITY_MIN_PERCENT + ((abs(eval_note) + trader.get_risk()) * self.QUANTITY_ATTENUATION) return EvaluatorOrderCreator._check_factor(self.QUANTITY_MIN_PERCENT, @@ -79,9 +226,10 @@ def _get_limit_quantity_from_risk(self, eval_note, trader, quantity): abs(eval_note) + trader.get_risk() --> result between 0 and 2 --> self.MAX_SUM_RESULT self.QUANTITY_MARKET_ATTENUATION --> try to contains the result between self.QUANTITY_MARKET_MIN_PERCENT and self.QUANTITY_MARKET_MAX_PERCENT """ + def _get_market_quantity_from_risk(self, eval_note, trader, quantity, buy=False): factor = self.QUANTITY_MARKET_MIN_PERCENT + ( - (abs(eval_note) + trader.get_risk()) * self.QUANTITY_MARKET_ATTENUATION) + (abs(eval_note) + trader.get_risk()) * self.QUANTITY_MARKET_ATTENUATION) # if buy market --> limit market usage if buy: @@ -91,98 +239,112 @@ def _get_market_quantity_from_risk(self, eval_note, trader, quantity, buy=False) self.QUANTITY_MARKET_MAX_PERCENT, factor) * quantity - """ - Starting point : self.STOP_LOSS_ORDER_MAX_PERCENT - trader.get_risk() --> low risk : stop level close to the current price - self.STOP_LOSS_ORDER_ATTENUATION --> try to contains the result between self.STOP_LOSS_ORDER_MIN_PERCENT and self.STOP_LOSS_ORDER_MAX_PERCENT - """ - def _get_stop_price_from_risk(self, trader): - factor = self.STOP_LOSS_ORDER_MAX_PERCENT - (trader.get_risk() * self.STOP_LOSS_ORDER_ATTENUATION) - return EvaluatorOrderCreator._check_factor(self.STOP_LOSS_ORDER_MIN_PERCENT, - self.STOP_LOSS_ORDER_MAX_PERCENT, - factor) + @staticmethod + def _trunc_with_n_decimal_digits(value, digits): + # force exact representation + return float("{0:.{1}f}".format(math.trunc(value*10**digits)/(10**digits), digits)) @staticmethod - def can_create_order(symbol, exchange, trader, state): - currency, market = exchange.split_symbol(symbol) + def _get_value_or_default(dictionary, key, default=math.nan): + if key in dictionary: + value = dictionary[key] + return value if value is not None else default + return default - # short cases => sell => need this currency - if state == EvaluatorStates.VERY_SHORT or state == EvaluatorStates.SHORT: - return trader.get_portfolio().get_currency_portfolio(currency) > MARKET_MIN_PORTFOLIO_CREATE_ORDER + @staticmethod + def _adapt_order_quantity_because_quantity(limiting_value, max_value, quantity_to_adapt, price, symbol_market): + orders = [] + nb_full_orders = limiting_value // max_value + rest_order_quantity = limiting_value % max_value + after_rest_quantity_to_adapt = quantity_to_adapt + if rest_order_quantity > 0: + after_rest_quantity_to_adapt -= rest_order_quantity + valid_last_order_quantity = EvaluatorOrderCreator._adapt_quantity(symbol_market, rest_order_quantity) + orders.append((valid_last_order_quantity, price)) - # long cases => buy => need money(aka other currency in the pair) to buy this currency - elif state == EvaluatorStates.LONG or state == EvaluatorStates.VERY_LONG: - return trader.get_portfolio().get_currency_portfolio(market) > CURRENCY_MIN_PORTFOLIO_CREATE_ORDER + other_orders_quantity = (after_rest_quantity_to_adapt + max_value)/(nb_full_orders+1) + valid_other_orders_quantity = EvaluatorOrderCreator._adapt_quantity(symbol_market, other_orders_quantity) + orders += [(valid_other_orders_quantity, price)]*int(nb_full_orders) + return orders - # other cases like neutral state or unfulfilled previous conditions - return False + @staticmethod + def _adapt_order_quantity_because_price(limiting_value, max_value, price, symbol_market): + orders = [] + nb_full_orders = limiting_value // max_value + rest_order_cost = limiting_value % max_value + if rest_order_cost > 0: + valid_last_order_quantity = EvaluatorOrderCreator._adapt_quantity(symbol_market, rest_order_cost/price) + orders.append((valid_last_order_quantity, price)) - # creates a new order, always check EvaluatorOrderCreator.can_create_order() first. - def create_new_order(self, eval_note, symbol, exchange, trader, state): - try: - last_prices = exchange.get_recent_trades(symbol) - reference_sum = 0 + other_orders_quantity = max_value / price + valid_other_orders_quantity = EvaluatorOrderCreator._adapt_quantity(symbol_market, other_orders_quantity) + orders += [(valid_other_orders_quantity, price)] * int(nb_full_orders) + return orders - for last_price in last_prices[-self.last_values_count:]: - reference_sum += float(last_price["price"]) + @staticmethod + def _adapt_price(symbol_market, price): + maximal_price_digits = EvaluatorOrderCreator._get_value_or_default(symbol_market[Ecmsc.PRECISION.value], + Ecmsc.PRECISION_PRICE.value, + CURRENCY_DEFAULT_MAX_PRICE_DIGITS) + return EvaluatorOrderCreator._trunc_with_n_decimal_digits(price, maximal_price_digits) - reference = reference_sum / self.last_values_count + @staticmethod + def _adapt_quantity(symbol_market, quantity): + maximal_volume_digits = EvaluatorOrderCreator._get_value_or_default(symbol_market[Ecmsc.PRECISION.value], + Ecmsc.PRECISION_AMOUNT.value, 0) + return EvaluatorOrderCreator._trunc_with_n_decimal_digits(quantity, maximal_volume_digits) - currency, market = exchange.split_symbol(symbol) - current_portfolio = trader.get_portfolio().get_currency_portfolio(currency) - current_market_quantity = trader.get_portfolio().get_currency_portfolio(market) - market_quantity = current_market_quantity / reference + """ + Checks and adapts the quantity and price of the order to ensure it's exchange compliant: + - are the quantity and price of the order compliant with the exchange's number of digits requirement + => otherwise quantity and price will be truncated accordingly + - is the price of the currency compliant with the exchange's price interval for this currency + => otherwise order is impossible => returns empty list + - are the order total price and quantity superior or equal to the exchange's minimum order requirement + => otherwise order is impossible => returns empty list + - are the order total price and quantity inferior or equal to the exchange's maximum order requirement + => otherwise order is impossible as is => split order into smaller ones and returns the list + => returns the quantity and price list of possible order(s) + """ - # TODO : temp - if state == EvaluatorStates.VERY_SHORT: - market = trader.create_order(TraderOrderType.SELL_MARKET, - symbol, - self._get_market_quantity_from_risk(eval_note, - trader, - current_portfolio), - reference) - return market + @staticmethod + def _check_and_adapt_order_details_if_necessary(quantity, price, symbol_market): + symbol_market_limits = symbol_market[Ecmsc.LIMITS.value] - elif state == EvaluatorStates.SHORT: - limit = trader.create_order(TraderOrderType.SELL_LIMIT, - symbol, - self._get_limit_quantity_from_risk(eval_note, - trader, - current_portfolio), - reference * self._get_limit_price_from_risk(eval_note, - trader)) - trader.create_order(TraderOrderType.STOP_LOSS, - symbol, - self._get_limit_quantity_from_risk(eval_note, - trader, - current_portfolio), - reference * self._get_stop_price_from_risk(trader), - linked_to=limit) - return limit + limit_amount = symbol_market_limits[Ecmsc.LIMITS_AMOUNT.value] + limit_cost = symbol_market_limits[Ecmsc.LIMITS_COST.value] + limit_price = symbol_market_limits[Ecmsc.LIMITS_PRICE.value] - elif state == EvaluatorStates.NEUTRAL: - pass + min_quantity = EvaluatorOrderCreator._get_value_or_default(limit_amount, Ecmsc.LIMITS_AMOUNT_MIN.value) + max_quantity = EvaluatorOrderCreator._get_value_or_default(limit_amount, Ecmsc.LIMITS_AMOUNT_MAX.value) + min_cost = EvaluatorOrderCreator._get_value_or_default(limit_cost, Ecmsc.LIMITS_COST_MIN.value) + max_cost = EvaluatorOrderCreator._get_value_or_default(limit_cost, Ecmsc.LIMITS_COST_MAX.value) + min_price = EvaluatorOrderCreator._get_value_or_default(limit_price, Ecmsc.LIMITS_PRICE_MIN.value) + max_price = EvaluatorOrderCreator._get_value_or_default(limit_price, Ecmsc.LIMITS_PRICE_MAX.value) - # TODO : stop loss - elif state == EvaluatorStates.LONG: - limit = trader.create_order(TraderOrderType.BUY_LIMIT, - symbol, - self._get_limit_quantity_from_risk(eval_note, - trader, - market_quantity), - reference * self._get_limit_price_from_risk(eval_note, - trader)) - return limit + # adapt digits if necessary + valid_quantity = EvaluatorOrderCreator._adapt_quantity(symbol_market, quantity) + valid_price = EvaluatorOrderCreator._adapt_price(symbol_market, price) - elif state == EvaluatorStates.VERY_LONG: - market = trader.create_order(TraderOrderType.BUY_MARKET, - symbol, - self._get_market_quantity_from_risk(eval_note, - trader, - market_quantity, - True), - reference) - return market - except Exception as e: - logging.getLogger(self.__class__.__name__).error("Failed to create order : {0}".format(e)) - return None + total_order_price = valid_quantity * valid_price + + # check total_order_price not < min_cost and valid_quantity not < min_quantity and max_price > price > min_price + if total_order_price < min_cost or valid_quantity < min_quantity or not (max_price > valid_price > min_price): + # invalid order + return [] + + # check total_order_price not > max_cost and valid_quantity not > max_quantity + elif total_order_price > max_cost or valid_quantity > max_quantity: + # split quantity into smaller orders + nb_orders_according_to_cost = total_order_price / max_cost + nb_orders_according_to_quantity = valid_quantity / max_quantity + if nb_orders_according_to_cost > nb_orders_according_to_quantity: + return EvaluatorOrderCreator._adapt_order_quantity_because_price(total_order_price, max_cost,price, + symbol_market) + else: + return EvaluatorOrderCreator._adapt_order_quantity_because_quantity(valid_quantity, max_quantity, + quantity, price, symbol_market) + + else: + # valid order that can be handled wy the exchange + return [(valid_quantity, valid_price)] diff --git a/evaluator/evaluator_threads_manager.py b/evaluator/evaluator_threads_manager.py index c5134c2f6..ef140475a 100644 --- a/evaluator/evaluator_threads_manager.py +++ b/evaluator/evaluator_threads_manager.py @@ -1,7 +1,6 @@ import logging from config.cst import * -from evaluator.Updaters.time_frame_update import TimeFrameUpdateDataThread from evaluator.evaluator import Evaluator @@ -9,6 +8,7 @@ class EvaluatorThreadsManager: def __init__(self, config, symbol, time_frame, + symbol_time_frame_updater_thread, symbol_evaluator, exchange, real_time_ta_eval_list): @@ -16,19 +16,20 @@ def __init__(self, config, self.exchange = exchange self.symbol = symbol self.time_frame = time_frame + self.symbol_time_frame_updater_thread = symbol_time_frame_updater_thread self.symbol_evaluator = symbol_evaluator # notify symbol evaluator - self.symbol_evaluator.add_evaluator_thread(self.exchange, self.symbol, self) + self.symbol_evaluator.add_evaluator_thread_manager(self.exchange, self.symbol, self.time_frame, self) self.matrix = self.symbol_evaluator.get_matrix(self.exchange) # Exchange # TODO : self.exchange.update_balance(self.symbol) - self.thread_name = "TA THREAD - {0} - {1} - {2}".format(self.symbol, - self.exchange.get_name(), - self.time_frame) + self.thread_name = "TA THREAD MANAGER - {0} - {1} - {2}".format(self.symbol, + self.exchange.get_name(), + self.time_frame) self.logger = logging.getLogger(self.thread_name) # Create Evaluator @@ -40,17 +41,23 @@ def __init__(self, config, self.evaluator.set_symbol_evaluator(self.symbol_evaluator) # Add threaded evaluators that can notify the current thread - self.evaluator.set_social_eval(self.symbol_evaluator.get_social_eval_list(), self) + self.evaluator.set_social_eval(self.symbol_evaluator.get_crypto_currency_evaluator().get_social_eval_list(), self) self.evaluator.set_real_time_eval(real_time_ta_eval_list, self) # Create static evaluators self.evaluator.set_ta_eval_list(self.evaluator.get_creator().create_ta_eval_list(self.evaluator)) - # Create refreshing threads - self.data_refresher = TimeFrameUpdateDataThread(self) + # Register in refreshing threads + self.symbol_time_frame_updater_thread.register_evaluator_thread_manager(self.time_frame, self) + + def get_refreshed_times(self): + return self.symbol_time_frame_updater_thread.get_refreshed_times(self.time_frame) + + def get_evaluator(self): + return self.evaluator def notify(self, notifier_name): - if self.data_refresher.get_refreshed_times() > 0: + if self.get_refreshed_times() > 0: self.logger.debug("** Notified by {0} **".format(notifier_name)) self._refresh_eval(notifier_name) else: @@ -74,29 +81,33 @@ def _refresh_matrix(self): self.matrix = self.symbol_evaluator.get_matrix(self.exchange) for ta_eval in self.evaluator.get_ta_eval_list(): + ta_eval.ensure_eval_note_is_not_expired() self.matrix.set_eval(EvaluatorMatrixTypes.TA, ta_eval.get_name(), ta_eval.get_eval_note(), self.time_frame) for social_eval in self.evaluator.get_social_eval_list(): + social_eval.ensure_eval_note_is_not_expired() self.matrix.set_eval(EvaluatorMatrixTypes.SOCIAL, social_eval.get_name(), - social_eval.get_eval_note()) + social_eval.get_eval_note(), None) for real_time_eval in self.evaluator.get_real_time_eval_list(): + real_time_eval.ensure_eval_note_is_not_expired() self.matrix.set_eval(EvaluatorMatrixTypes.REAL_TIME, real_time_eval.get_name(), real_time_eval.get_eval_note()) def start_threads(self): - self.data_refresher.start() + pass def stop_threads(self): for thread in self.evaluator.get_real_time_eval_list(): thread.stop() - self.data_refresher.stop() def join_threads(self): for thread in self.evaluator.get_real_time_eval_list(): thread.join() - self.data_refresher.join() - def get_data_refresher(self): - return self.data_refresher + def get_symbol_time_frame_updater_thread(self): + return self.symbol_time_frame_updater_thread + + def get_exchange(self): + return self.exchange diff --git a/evaluator/symbol_evaluator.py b/evaluator/symbol_evaluator.py index 888accb9d..88e735186 100644 --- a/evaluator/symbol_evaluator.py +++ b/evaluator/symbol_evaluator.py @@ -1,5 +1,4 @@ from config.cst import EvaluatorMatrixTypes -from evaluator.Updaters.social_evaluator_not_threaded_update import SocialEvaluatorNotThreadedUpdateThread from evaluator.evaluator_creator import EvaluatorCreator from evaluator.evaluator_final import FinalEvaluator from evaluator.evaluator_matrix import EvaluatorMatrix @@ -7,55 +6,37 @@ class SymbolEvaluator: - def __init__(self, config, crypto_currency, dispatchers_list): - self.crypto_currency = crypto_currency + def __init__(self, config, symbol, crypto_currency_evaluator): + self.crypto_currency_evaluator = crypto_currency_evaluator + self.symbol = symbol self.trader_simulator = None self.config = config self.traders = None self.trader_simulators = None - self.dispatchers_list = dispatchers_list - self.evaluator_threads = {} + self.evaluator_thread_managers = {} self.final_evaluators = {} self.matrices = {} self.strategies_eval_lists = {} - - self.social_eval_list = EvaluatorCreator.create_social_eval(self.config, - self.crypto_currency, - self.dispatchers_list) - - self.social_not_threaded_list = EvaluatorCreator.create_social_not_threaded_list(self.social_eval_list) - - self.social_evaluator_refresh = SocialEvaluatorNotThreadedUpdateThread(self.social_not_threaded_list) + self.finalize_enabled_list = {} self.evaluator_order_creator = EvaluatorOrderCreator() - def start_threads(self): - self.social_evaluator_refresh.start() - - def stop_threads(self): - for thread in self.social_eval_list: - thread.stop() - - self.social_evaluator_refresh.stop() - - def join_threads(self): - for thread in self.social_eval_list: - thread.join() - - self.social_evaluator_refresh.join() - def set_traders(self, trader): self.traders = trader def set_trader_simulators(self, simulator): self.trader_simulators = simulator - def add_evaluator_thread(self, exchange, symbol, evaluator_thread): - self.evaluator_threads[exchange.get_name()] = evaluator_thread - self.final_evaluators[exchange.get_name()] = FinalEvaluator(self, exchange, symbol) - self.matrices[exchange.get_name()] = EvaluatorMatrix() - self.strategies_eval_lists[exchange.get_name()] = EvaluatorCreator.create_strategies_eval_list(self.config) + def add_evaluator_thread_manager(self, exchange, symbol, time_frame, evaluator_thread): + if exchange.get_name() in self.evaluator_thread_managers: + self.evaluator_thread_managers[exchange.get_name()][time_frame] = evaluator_thread + else: + self.evaluator_thread_managers[exchange.get_name()] = {time_frame: evaluator_thread} + self.final_evaluators[exchange.get_name()] = FinalEvaluator(self, exchange, symbol) + self.matrices[exchange.get_name()] = EvaluatorMatrix(self.config) + self.strategies_eval_lists[exchange.get_name()] = EvaluatorCreator.create_strategies_eval_list(self.config) + self.finalize_enabled_list[exchange.get_name()] = False def update_strategies_eval(self, new_matrix, exchange, ignored_evaluator=None): for strategies_evaluator in self.get_strategies_eval_list(exchange): @@ -67,9 +48,18 @@ def update_strategies_eval(self, new_matrix, exchange, ignored_evaluator=None): strategies_evaluator.get_eval_note()) def finalize(self, exchange): - if self.evaluator_threads[exchange.get_name()].get_data_refresher().get_refreshed_times() > 0: + if not self.finalize_enabled_list[exchange.get_name()]: + self._check_finalize(exchange) + + if self.finalize_enabled_list[exchange.get_name()]: self.final_evaluators[exchange.get_name()].add_to_queue() + def _check_finalize(self, exchange): + self.finalize_enabled_list[exchange.get_name()] = True + for evaluator_thread in self.evaluator_thread_managers[exchange.get_name()].values(): + if evaluator_thread.get_refreshed_times() == 0: + self.finalize_enabled_list[exchange.get_name()] = False + def get_trader(self, exchange): return self.traders[exchange.get_name()] @@ -79,11 +69,14 @@ def get_trader_simulator(self, exchange): def get_final(self, exchange): return self.final_evaluators[exchange.get_name()] + def has_exchange(self, exchange): + return exchange.get_name() in self.final_evaluators + def get_matrix(self, exchange): return self.matrices[exchange.get_name()] - def get_evaluator(self, exchange): - return self.evaluator_threads[exchange.get_name()].get_evaluator() + def get_evaluator_thread_managers(self, exchange): + return self.evaluator_thread_managers[exchange.get_name()] def get_config(self): return self.config @@ -94,15 +87,8 @@ def get_strategies_eval_list(self, exchange): def get_evaluator_order_creator(self): return self.evaluator_order_creator - def get_social_eval_list(self): - return self.social_eval_list - - def get_dispatchers_list(self): - return self.dispatchers_list - - def get_social_not_threaded_list(self): - return self.social_not_threaded_list - - def get_symbol_pairs(self): - return self.config["crypto_currencies"][self.crypto_currency]["pairs"] + def get_symbol(self): + return self.symbol + def get_crypto_currency_evaluator(self): + return self.crypto_currency_evaluator diff --git a/interfaces/__init__.py b/interfaces/__init__.py new file mode 100644 index 000000000..72a55ef13 --- /dev/null +++ b/interfaces/__init__.py @@ -0,0 +1,36 @@ +bot_instance = None +global_config = None +reference_market = None +default_time_frame = None + + +def __init__(bot, config): + global bot_instance + bot_instance = bot + + global global_config + global_config = config + + +def get_bot(): + return bot_instance + + +def get_global_config(): + return global_config + + +def set_default_time_frame(time_frame): + global default_time_frame + default_time_frame = time_frame + + +def get_default_time_frame(): + return default_time_frame + + +def get_reference_market(): + global reference_market + if reference_market is None: + reference_market = next(iter(get_bot().get_exchange_traders().values())).get_trades_manager().get_reference() + return reference_market diff --git a/interfaces/telegram/bot.py b/interfaces/telegram/bot.py new file mode 100644 index 000000000..819f083e6 --- /dev/null +++ b/interfaces/telegram/bot.py @@ -0,0 +1,266 @@ +import datetime +import logging + +from telegram.ext import CommandHandler, MessageHandler, Filters + +from config.cst import * +from interfaces import get_reference_market, get_bot +from interfaces.trading_util import get_portfolio_current_value, get_open_orders, get_trades_history, \ + get_global_portfolio_currencies_amounts, set_risk, get_risk, get_global_profitability, get_currencies_with_status, \ + cancel_all_open_orders, set_enable_trading, has_real_and_or_simulated_traders +from tools.commands import Commands +from tools.pretty_printer import PrettyPrinter + + +class TelegramApp: + EOL = "\n" + NO_TRADER_MESSAGE = "No trader is activated in my config/config.json file.\n" \ + "See https://github.com/Drakkar-Software/OctoBot/wiki if you need help with my configuration." + NO_CURRENCIES_MESSAGE = "No cryptocurrencies are in my config/config.json file.\n" \ + "See https://github.com/Drakkar-Software/OctoBot/wiki/Configuration#cryptocurrencies " \ + "if you need help with my cryptocurrencies configuration." + + def __init__(self, config, telegram_service, telegram_updater): + self.config = config + self.paused = False + self.telegram_service = telegram_service + self.telegram_updater = telegram_updater + self.dispatcher = self.telegram_updater.dispatcher + self.logger = logging.getLogger(self.__class__.__name__) + + self.add_handlers() + + # Start the Bot + self.telegram_updater.start_polling() + + def add_handlers(self): + self.dispatcher.add_handler(CommandHandler("start", self.command_start)) + self.dispatcher.add_handler(CommandHandler("ping", self.command_ping)) + self.dispatcher.add_handler(CommandHandler(["portfolio", "pf"], self.command_portfolio)) + self.dispatcher.add_handler(CommandHandler(["open_orders", "oo"], self.command_open_orders)) + self.dispatcher.add_handler(CommandHandler(["trades_history", "th"], self.command_trades_history)) + self.dispatcher.add_handler(CommandHandler(["profitability", "pb"], self.command_profitability)) + self.dispatcher.add_handler(CommandHandler("set_risk", self.command_risk)) + self.dispatcher.add_handler(CommandHandler(["market_status", "ms"], self.command_market_status)) + self.dispatcher.add_handler(CommandHandler("stop", self.command_stop)) + self.dispatcher.add_handler(CommandHandler("help", self.command_help)) + self.dispatcher.add_handler(CommandHandler(["pause", "resume"], self.command_pause_resume)) + self.dispatcher.add_handler(MessageHandler(Filters.command, self.command_unknown)) + + # log all errors + self.dispatcher.add_error_handler(self.command_error) + + # TEST : unhandled messages + self.dispatcher.add_handler(MessageHandler(Filters.text, self.echo)) + + @staticmethod + def command_unknown(_, update): + update.message.reply_text("Unfortunately, I don't know the command: {0}".format(update.effective_message.text)) + + @staticmethod + def command_help(_, update): + message = "My OctoBot skills:" + TelegramApp.EOL + TelegramApp.EOL + message += "/start: Displays my startup message." + TelegramApp.EOL + message += "/ping: Shows for how long I'm working." + TelegramApp.EOL + message += "/portfolio or /pf: Displays my current portfolio." + TelegramApp.EOL + message += "/open_orders or /oo: Displays my current open orders." + TelegramApp.EOL + message += "/trades_history or /th: Displays my trades history since I started." + TelegramApp.EOL + message += "/profitability or /pb: Displays the profitability I made since I started." + TelegramApp.EOL + message += "/market_status or /ms: Displays my understanding of the market and my risk parameter." + TelegramApp.EOL + message += "/set_risk: Changes my current risk setting into your command's parameter." + TelegramApp.EOL + message += "/pause or /resume: Pause or resume me." + TelegramApp.EOL + message += "/stop: Stops me." + TelegramApp.EOL + message += "/help: Displays this help." + update.message.reply_text(message) + + @staticmethod + def get_command_param(command_name, update): + return update.message.text.replace(command_name, "") + + @staticmethod + def command_start(_, update): + update.message.reply_text("Hello, I'm OctoBot, type /help to know my skills.") + + @staticmethod + def command_stop(_, update): + # TODO add confirmation + update.message.reply_text("I'm leaving this world...") + Commands.stop_bot(get_bot()) + + def command_pause_resume(self, _, update): + if self.paused: + update.message.reply_text("Resuming...{0}I will restart trading when i see opportunities !" + .format(TelegramApp.EOL)) + set_enable_trading(True) + self.paused = False + else: + update.message.reply_text("Pausing...{}I'm cancelling my orders.".format(TelegramApp.EOL)) + cancel_all_open_orders() + set_enable_trading(False) + self.paused = True + + @staticmethod + def command_ping(_, update): + update.message.reply_text("I'm alive since {0}.".format( + datetime.datetime.fromtimestamp(get_bot().get_start_time()).strftime('%Y-%m-%d %H:%M:%S'))) + + @staticmethod + def command_risk(_, update): + try: + risk = float(TelegramApp.get_command_param("/set_risk", update)) + set_risk(risk) + update.message.reply_text("New risk set successfully.") + except Exception: + update.message.reply_text("Failed to set new risk, please provide a number between 0 and 1.") + + @staticmethod + def command_profitability(_, update): + has_real_trader, has_simulated_trader, \ + real_global_profitability, simulated_global_profitability, \ + real_percent_profitability, simulated_percent_profitability = get_global_profitability() + profitability_string = "" + if has_real_trader: + profitability_string = "{0}Global profitability : {1} ({2}%){3}".format( + REAL_TRADER_STR, + PrettyPrinter.portfolio_profitability_pretty_print(real_global_profitability, + None, + get_reference_market()), + PrettyPrinter.get_min_string_from_number(real_percent_profitability, 2), + TelegramApp.EOL) + if has_simulated_trader: + profitability_string += "{0}Global profitability : {1} ({2}%)".format( + SIMULATOR_TRADER_STR, + PrettyPrinter.portfolio_profitability_pretty_print(simulated_global_profitability, + None, + get_reference_market()), + PrettyPrinter.get_min_string_from_number(simulated_percent_profitability, 2)) + if not profitability_string: + profitability_string = TelegramApp.NO_TRADER_MESSAGE + update.message.reply_text(profitability_string) + + @staticmethod + def command_portfolio(_, update): + has_real_trader, has_simulated_trader, \ + portfolio_real_current_value, portfolio_simulated_current_value = get_portfolio_current_value() + reference_market = get_reference_market() + real_global_portfolio, simulated_global_portfolio = get_global_portfolio_currencies_amounts() + + portfolios_string = "" + if has_real_trader: + portfolios_string += "{0}Portfolio value : {1} {2}{3}".format( + REAL_TRADER_STR, + PrettyPrinter.get_min_string_from_number(portfolio_real_current_value), + reference_market, + TelegramApp.EOL) + portfolios_string += "{0}Portfolio : {2}{1}{2}{2}".format( + REAL_TRADER_STR, + PrettyPrinter.global_portfolio_pretty_print(real_global_portfolio), + TelegramApp.EOL) + + if has_simulated_trader: + portfolios_string += "{0}Portfolio value : {1} {2}{3}".format( + SIMULATOR_TRADER_STR, + PrettyPrinter.get_min_string_from_number(portfolio_simulated_current_value), + reference_market, + TelegramApp.EOL) + portfolios_string += "{0}Portfolio : {2}{1}".format( + SIMULATOR_TRADER_STR, + PrettyPrinter.global_portfolio_pretty_print(simulated_global_portfolio), + TelegramApp.EOL) + + if not portfolios_string: + portfolios_string = TelegramApp.NO_TRADER_MESSAGE + update.message.reply_text(portfolios_string) + + @staticmethod + def command_open_orders(_, update): + has_real_trader, has_simulated_trader = has_real_and_or_simulated_traders() + portfolio_real_open_orders, portfolio_simulated_open_orders = get_open_orders() + + orders_string = "" + if has_real_trader: + orders_string += "{0}Open orders :{1}".format(REAL_TRADER_STR, TelegramApp.EOL) + for orders in portfolio_real_open_orders: + for order in orders: + orders_string += PrettyPrinter.open_order_pretty_printer(order) + TelegramApp.EOL + + if has_simulated_trader: + orders_string += TelegramApp.EOL + "{0}Open orders :{1}".format(SIMULATOR_TRADER_STR, + TelegramApp.EOL) + for orders in portfolio_simulated_open_orders: + for order in orders: + orders_string += PrettyPrinter.open_order_pretty_printer(order) + TelegramApp.EOL + + if not orders_string: + orders_string = TelegramApp.NO_TRADER_MESSAGE + + update.message.reply_text(orders_string) + + @staticmethod + def command_trades_history(_, update): + has_real_trader, has_simulated_trader = has_real_and_or_simulated_traders() + real_trades_history, simulated_trades_history = get_trades_history() + + trades_history_string = "" + if has_real_trader: + trades_history_string += "{0}Trades :{1}".format(REAL_TRADER_STR, TelegramApp.EOL) + for trades in real_trades_history: + for trade in trades: + trades_history_string += PrettyPrinter.trade_pretty_printer(trade) + TelegramApp.EOL + + if has_simulated_trader: + for trades in simulated_trades_history: + trades_history_string += TelegramApp.EOL + "{0}Trades :{1}".format(SIMULATOR_TRADER_STR, + TelegramApp.EOL) + for trade in trades: + trades_history_string += PrettyPrinter.trade_pretty_printer(trade) + TelegramApp.EOL + + if not trades_history_string: + trades_history_string = TelegramApp.NO_TRADER_MESSAGE + + update.message.reply_text(trades_history_string) + + @staticmethod + def command_market_status(_, update): + try: + message = "My cryptocurrencies evaluations are:" + TelegramApp.EOL + TelegramApp.EOL + at_least_one_currency = False + for currency_pair, currency_info in get_currencies_with_status().items(): + at_least_one_currency = True + message += "- {0}:{1}".format(currency_pair, TelegramApp.EOL) + for exchange_name, evaluation in currency_info.items(): + message += "=> {0}: {1}{2}".format(exchange_name, evaluation.name, TelegramApp.EOL) + if not at_least_one_currency: + message += TelegramApp.NO_CURRENCIES_MESSAGE + TelegramApp.EOL + message += "{0}My current risk is: {1}".format(TelegramApp.EOL, get_risk()) + update.message.reply_text(message) + except Exception: + update.message.reply_text("I'm unfortunately currently unable to show you my market evaluations, " + + "please retry in a few seconds.") + + @staticmethod + def command_error(_, update): + update.message.reply_text("Failed to perform this command : {0}".format(update.message.text)) + + @staticmethod + def help(_, update): + update.message.reply_text("...") + + @staticmethod + def echo(_, update): + update.message.reply_text(update.message.text) + + @staticmethod + def enable(config, is_enabled): + if CONFIG_INTERFACES not in config: + config[CONFIG_INTERFACES] = {} + if CONFIG_INTERFACES_TELEGRAM not in config[CONFIG_INTERFACES]: + config[CONFIG_INTERFACES][CONFIG_INTERFACES_TELEGRAM] = {} + config[CONFIG_INTERFACES][CONFIG_INTERFACES_TELEGRAM][CONFIG_ENABLED_OPTION] = is_enabled + + @staticmethod + def is_enabled(config): + return CONFIG_INTERFACES in config \ + and CONFIG_INTERFACES_TELEGRAM in config[CONFIG_INTERFACES] \ + and CONFIG_ENABLED_OPTION in config[CONFIG_INTERFACES][CONFIG_INTERFACES_TELEGRAM] \ + and config[CONFIG_INTERFACES][CONFIG_INTERFACES_TELEGRAM][CONFIG_ENABLED_OPTION] diff --git a/interfaces/trading_util.py b/interfaces/trading_util.py new file mode 100644 index 000000000..cf14b221d --- /dev/null +++ b/interfaces/trading_util.py @@ -0,0 +1,207 @@ +from interfaces import get_bot +from trading.trader.portfolio import Portfolio + + +def get_traders(): + return [trader for trader in get_bot().get_exchange_traders().values()] + \ + [trader for trader in get_bot().get_exchange_trader_simulators().values()] + + +def get_portfolio_current_value(): + simulated_value = 0 + real_value = 0 + traders = get_traders() + has_real_trader = False + has_simulated_trader = False + + for trader in traders: + if trader.enabled(trader.config): + trade_manager = trader.get_trades_manager() + + current_value = trade_manager.get_portfolio_current_value() + + # current_value might be 0 if no trades have been made / canceled => use origin value + if current_value == 0: + current_value = trade_manager.get_portfolio_origin_value() + + if trader.get_simulate(): + simulated_value += current_value + has_simulated_trader = True + else: + real_value += current_value + has_real_trader = True + + return has_real_trader, has_simulated_trader, real_value, simulated_value + + +def has_real_and_or_simulated_traders(): + has_real_trader = False + has_simulated_trader = False + traders = get_traders() + for trader in traders: + if trader.enabled(trader.config): + if trader.get_simulate(): + has_simulated_trader = True + else: + has_real_trader = True + return has_real_trader, has_simulated_trader + + +def get_open_orders(): + simulated_open_orders = [] + real_open_orders = [] + traders = get_traders() + + for trader in traders: + if trader.get_simulate(): + simulated_open_orders.append(trader.get_open_orders()) + else: + real_open_orders.append(trader.get_open_orders()) + + return real_open_orders, simulated_open_orders + + +def cancel_all_open_orders(): + for trader in get_traders(): + trader.cancel_all_open_orders() + + +def set_enable_trading(enable): + for trader in get_traders(): + if trader.enabled(trader.config): + trader.set_enabled(enable) + + +def get_trades_history(): + simulated_trades_history = [] + real_trades_history = [] + traders = get_traders() + + for trader in traders: + if trader.get_simulate(): + simulated_trades_history.append(trader.get_trades_manager().get_trade_history()) + else: + real_trades_history.append(trader.get_trades_manager().get_trade_history()) + + return real_trades_history, simulated_trades_history + + +def set_risk(risk): + traders = get_traders() + + for trader in traders: + trader.set_risk(risk) + + +def get_risk(): + return next(iter(get_bot().get_exchange_traders().values())).get_risk() + + +def get_global_profitability(): + simulated_global_profitability = 0 + real_global_profitability = 0 + traders = get_traders() + simulated_full_origin_value = 0 + real_full_origin_value = 0 + has_real_trader = False + has_simulated_trader = False + + for trader in traders: + if trader.enabled(trader.config): + trade_manager = trader.get_trades_manager() + + # TODO : use other return values + current_value, _, _ = trade_manager.get_profitability() + + if trader.get_simulate(): + simulated_full_origin_value += trade_manager.get_portfolio_origin_value() + simulated_global_profitability += current_value + has_simulated_trader = True + else: + real_full_origin_value += trade_manager.get_portfolio_origin_value() + real_global_profitability += current_value + has_real_trader = True + + simulated_percent_profitability = simulated_global_profitability * 100 / simulated_full_origin_value \ + if simulated_full_origin_value > 0 else 0 + real_percent_profitability = real_global_profitability * 100 / real_full_origin_value \ + if real_full_origin_value > 0 else 0 + + return has_real_trader, has_simulated_trader, \ + real_global_profitability, simulated_global_profitability, \ + real_percent_profitability, simulated_percent_profitability + + +def get_portfolios(): + simulated_portfolios = [] + real_portfolios = [] + traders = get_traders() + + for trader in traders: + if trader.get_simulate(): + simulated_portfolios.append(trader.get_portfolio().get_portfolio()) + else: + real_portfolios.append(trader.get_portfolio().get_portfolio()) + + return real_portfolios, simulated_portfolios + + +def get_currencies_with_status(): + symbol_with_evaluation = {} + for symbol_evaluator in get_bot().get_symbol_evaluator_list().values(): + symbol_with_evaluation[symbol_evaluator.get_symbol()] = \ + {exchange.get_name(): symbol_evaluator.get_final(exchange).get_state() + for exchange in get_bot().get_exchanges_list().values() + if symbol_evaluator.has_exchange(exchange)} + return symbol_with_evaluation + + +def get_global_portfolio_currencies_amounts(): + real_portfolios, simulated_portfolios = get_portfolios() + real_global_portfolio = {} + simulated_global_portfolio = {} + + for portfolio in simulated_portfolios: + for currency, amounts in portfolio.items(): + if currency not in simulated_global_portfolio: + simulated_global_portfolio[currency] = { + Portfolio.TOTAL: 0, + Portfolio.AVAILABLE: 0 + } + + simulated_global_portfolio[currency][Portfolio.TOTAL] += amounts[Portfolio.TOTAL] + simulated_global_portfolio[currency][Portfolio.AVAILABLE] = amounts[Portfolio.AVAILABLE] + + for portfolio in real_portfolios: + for currency, amounts in portfolio.items(): + if currency not in real_global_portfolio: + real_global_portfolio[currency] = { + Portfolio.TOTAL: 0, + Portfolio.AVAILABLE: 0 + } + + real_global_portfolio[currency][Portfolio.TOTAL] += amounts[Portfolio.TOTAL] + real_global_portfolio[currency][Portfolio.AVAILABLE] = amounts[Portfolio.AVAILABLE] + + return real_global_portfolio, simulated_global_portfolio + + +def get_trades_by_times_and_prices(): + simulated_trades_times = [] + simulated_trades_prices = [] + + real_trades_times = [] + real_trades_prices = [] + + traders = get_traders() + + for trader in traders: + for trade in trader.get_trades_manager().get_trade_history(): + if trader.get_simulate(): + simulated_trades_times.append(trade.get_filled_time()) + simulated_trades_prices.append(trade.get_price()) + else: + real_trades_times.append(trade.get_filled_time()) + real_trades_prices.append(trade.get_price()) + + return real_trades_prices, real_trades_times, simulated_trades_prices, simulated_trades_times diff --git a/interfaces/web/__init__.py b/interfaces/web/__init__.py index e69de29bb..8078d23a7 100644 --- a/interfaces/web/__init__.py +++ b/interfaces/web/__init__.py @@ -0,0 +1,89 @@ +import copy +import logging +import time + +import dash +import flask +import pandas + +from config.cst import PriceStrings + +server_instance = flask.Flask(__name__) +app_instance = dash.Dash(__name__, sharing=True, server=server_instance, url_base_pathname='/dashboard') +app_instance.config['suppress_callback_exceptions'] = True + +# disable Flask logging +log = logging.getLogger('werkzeug') +log.setLevel(logging.ERROR) + +matrix_history = [] +symbol_data_history = {} +portfolio_value_history = { + "real_value": [], + "simulated_value": [], + "timestamp": [] +} + +TIME_AXIS_TITLE = "Time" + + +def add_to_matrix_history(matrix): + matrix_history.append({ + "matrix": copy.deepcopy(matrix.get_matrix()), + "timestamp": time.time() + }) + + +def add_to_portfolio_value_history(real_value, simulated_value): + portfolio_value_history["real_value"].append(real_value) + portfolio_value_history["simulated_value"].append(simulated_value) + portfolio_value_history["timestamp"].append(time.time()) + + +def add_to_symbol_data_history(symbol, data, time_frame): + if symbol not in symbol_data_history: + symbol_data_history[symbol] = {} + + if time_frame not in symbol_data_history[symbol]: + symbol_data_history[symbol][time_frame] = data + else: + # merge new data into current data + # find index from where data is new + new_data_index = 0 + for i in range(1, len(data)): + if data.iloc[-i][PriceStrings.STR_PRICE_TIME.value] > \ + symbol_data_history[symbol][time_frame].iloc[-1][PriceStrings.STR_PRICE_TIME.value]: + new_data_index = i + else: + break + if new_data_index > 0: + symbol_data_history[symbol][time_frame] = pandas.concat( + [symbol_data_history[symbol][time_frame], data[-new_data_index:]], ignore_index=True) + + +def get_matrix_history(): + return matrix_history + + +def get_portfolio_value_history(): + return portfolio_value_history + + +def get_symbol_data_history(symbol, time_frame): + return symbol_data_history[symbol][time_frame] + + +def load_callbacks(): + from .dash_controller import update_values, \ + update_strategy_values, \ + update_time_frame_dropdown_options, \ + update_symbol_dropdown_options, \ + update_symbol_dropdown_value, \ + update_evaluator_dropdown_options, \ + update_evaluator_dropdown_values, \ + update_currencies_amounts, \ + update_portfolio_value + + +def load_routes(): + from .flask_controller import index diff --git a/interfaces/web/app.py b/interfaces/web/app.py index ccd289ef6..975739513 100644 --- a/interfaces/web/app.py +++ b/interfaces/web/app.py @@ -1,11 +1,14 @@ import logging import threading +from time import sleep import dash_core_components as dcc import dash_html_components as html -from dash import dash -from flask import request -from config.cst import CONFIG_ENABLED_OPTION +import dash_table_experiments as dt + +from config.cst import CONFIG_CRYPTO_CURRENCIES, CONFIG_WEB, CONFIG_CATEGORY_SERVICES, CONFIG_WEB_IP, CONFIG_WEB_PORT +from interfaces import get_bot +from interfaces.web import app_instance, load_callbacks, load_routes class WebApp(threading.Thread): @@ -15,49 +18,94 @@ def __init__(self, config): self.logger = logging.getLogger(self.__class__.__name__) self.app = None - def enabled(self): - if "interfaces" in self.config \ - and "web" in self.config["interfaces"] \ - and self.config["interfaces"]["web"][CONFIG_ENABLED_OPTION]: - return True - else: - return False - def run(self): - self.app = dash.Dash() - # temp - self.app.css.append_css({ - "external_url": "https://codepen.io/chriddyp/pen/bWLwgP.css" - }) - self.app.layout = html.Div([ - # Page Header - html.Div([ - html.H1('CryptoBot') - ]), - # Dropdown Grid + # wait bot is ready + while get_bot() is None or not get_bot().is_ready(): + sleep(0.1) + + # Define the WSGI application object + self.app = app_instance + + self.app.layout = html.Div(children=[ + html.H1('OctoBot Dashboard'), + + dcc.Graph(id='portfolio-value-graph', animate=True), + + dt.DataTable( + rows=[{}], + row_selectable=False, + filterable=True, + sortable=True, + editable=False, + selected_row_indices=[], + id='datatable-portfolio' + ), + dcc.Interval( + id='portfolio-update', + interval=3 * 1000 + ), + html.Div([ - html.Div([ - # Select Symbol Dropdown - html.Div([ - html.Div('Select Symbol', className='three columns'), - html.Div(dcc.Dropdown(id='division-selector'), - className='nine columns') - ]), - ], className='six columns'), - - # Empty - html.Div(className='six columns'), - ], className='twleve columns'), + html.Label('Exchange'), + dcc.Dropdown(id='exchange-name', + options=[{'label': s, 'value': s} + for s in get_bot().get_exchanges_list().keys()], + value=next(iter(get_bot().get_exchanges_list().keys())), + multi=False, + ), + html.Label('Currency'), + dcc.Dropdown(id='cryptocurrency-name', + options=[{'label': s, 'value': s} + for s in self.config[CONFIG_CRYPTO_CURRENCIES].keys()], + value=next(iter(self.config[CONFIG_CRYPTO_CURRENCIES].keys())) + if self.config[CONFIG_CRYPTO_CURRENCIES] else "", + multi=False, + ), + html.Label('Symbol'), + dcc.Dropdown(id='symbol', + options=[], + value="BTC/USDT", + multi=False, + ), + html.Label('TimeFrame'), + dcc.Dropdown(id='time-frame', + options=[], + value=None, + multi=False, + ), + html.Label('Evaluator'), + dcc.Dropdown(id='evaluator-name', + options=[], + value="", + multi=False, + ), + ], + style={'columnCount': 1, 'marginLeft': 25, 'marginRight': 25, 'marginTop': 25, 'marginBottom': 25}), + dcc.Graph(id='live-graph', animate=True), + dcc.Interval( + id='graph-update', + interval=3 * 1000 + ), + + dcc.Graph(id='strategy-live-graph', animate=True), + dcc.Interval( + id='strategy-graph-update', + interval=3 * 1000 + ), ]) - self.app.use_reloader = False - self.app.run_server(host="127.0.0.1", port=8050, debug=False) + load_callbacks() + load_routes() + self.app.run_server(host=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_IP], + port=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_PORT], + debug=False, + threaded=True) def stop(self): - func = request.environ.get('werkzeug.server.shutdown') - if func is None: - self.logger.warning("Not running with the Werkzeug Server") - func() - + # func = request.environ.get('werkzeug.server.shutdown') + # if func is None: + # raise RuntimeError('Not running with the Werkzeug Server') + # func() + pass diff --git a/interfaces/web/bot_data_model.py b/interfaces/web/bot_data_model.py new file mode 100644 index 000000000..f721c8723 --- /dev/null +++ b/interfaces/web/bot_data_model.py @@ -0,0 +1,216 @@ +import time + +import plotly +import plotly.graph_objs as go + +from config.cst import PriceStrings, TimeFrames, EvaluatorMatrixTypes +from evaluator.evaluator_matrix import EvaluatorMatrix +from interfaces import get_reference_market, get_bot, set_default_time_frame, get_default_time_frame +from interfaces.trading_util import get_portfolio_current_value, get_trades_by_times_and_prices +from interfaces.web import add_to_matrix_history, get_matrix_history, add_to_symbol_data_history, \ + add_to_portfolio_value_history, get_portfolio_value_history, TIME_AXIS_TITLE, get_symbol_data_history +from tools.symbol_util import split_symbol +from trading.trader.portfolio import Portfolio + + +def get_value_from_dict_or_string(data, is_time_frame=False): + if isinstance(data, dict): + if is_time_frame: + return TimeFrames(data["value"]) + else: + return data["value"] + else: + if is_time_frame: + if data is None: + return get_default_time_frame() + else: + return TimeFrames(data) + else: + return data + + +def set_default_time_frame_for_this_symbol(time_frame_value): + set_default_time_frame(TimeFrames(time_frame_value)) + + +def get_portfolio_currencies_update(): + currencies = [] + bot = get_bot() + traders = [trader for trader in bot.get_exchange_traders().values()] + \ + [trader for trader in bot.get_exchange_trader_simulators().values()] + for trader in traders: + currencies += [ + { + "Cryptocurrency": [currency], + "Total (available)": ["{} ({})".format(amounts[Portfolio.TOTAL], + amounts[Portfolio.AVAILABLE])], + "Exchange": [trader.exchange.get_name()], + "Real / Simulator": ["Simulator" if trader.get_simulate() else "Real"] + } + for currency, amounts in trader.get_portfolio().get_portfolio().items()] + return currencies + + +def update_portfolio_history(): + _, _, real_value, simulated_value = get_portfolio_current_value() + + add_to_portfolio_value_history(real_value, simulated_value) + + +def get_portfolio_value_in_history(): + at_least_one_simulated = False + at_least_one_real = False + min_value = 0 + max_value = 1 + + reference_market = get_reference_market() + + portfolio_value_in_history = get_portfolio_value_history() + + if max(portfolio_value_in_history["real_value"]) > 0: + at_least_one_real = True + if max(portfolio_value_in_history["simulated_value"]) > 0: + at_least_one_simulated = True + + real_data = plotly.graph_objs.Scatter( + x=portfolio_value_in_history["timestamp"], + y=portfolio_value_in_history["real_value"], + name='Real Portfolio in {}'.format(reference_market), + mode='lines' + ) + + simulated_data = plotly.graph_objs.Scatter( + x=portfolio_value_in_history["timestamp"], + y=portfolio_value_in_history["simulated_value"], + name='Simulated Portfolio in {}'.format(reference_market), + mode='lines' + ) + + # Title + real_simulated_string = "real" if at_least_one_real or not at_least_one_simulated else "" + real_simulated_string += " and " if at_least_one_simulated and at_least_one_real else "" + real_simulated_string += "simulated" if at_least_one_simulated else "" + + # merge two portfolio types + merged_data = [] + if at_least_one_simulated: + merged_data.append(simulated_data) + min_value = min(portfolio_value_in_history["simulated_value"]) + max_value = max(portfolio_value_in_history["simulated_value"]) + if at_least_one_real or not at_least_one_simulated: + merged_data.append(real_data) + min_value = min(min_value, min(portfolio_value_in_history["real_value"])) + max_value = max(max_value, max(portfolio_value_in_history["real_value"])) + + return {'data': merged_data, + 'layout': go.Layout( + title='Portfolio value ({})'.format(real_simulated_string), + xaxis=dict(range=[get_bot().get_start_time(), time.time()], + title=TIME_AXIS_TITLE), + yaxis=dict(range=[max(0, min_value * 0.99), max(0.1, max_value * 1.01)], + title=reference_market) + )} + + +def get_currency_graph_update(exchange_name, symbol, time_frame, cryptocurrency_name): + symbol_evaluator_list = get_bot().get_symbol_evaluator_list() + exchange_list = get_bot().get_exchanges_list() + + if time_frame is not None: + if len(symbol_evaluator_list) > 0: + evaluator_thread_managers = symbol_evaluator_list[symbol].get_evaluator_thread_managers( + exchange_list[exchange_name]) + + if time_frame in evaluator_thread_managers: + evaluator_thread_manager = evaluator_thread_managers[time_frame] + df = evaluator_thread_manager.get_evaluator().get_data() + + if df is not None: + _, pair_tag = split_symbol(symbol) + add_to_symbol_data_history(symbol, df, time_frame) + df = get_symbol_data_history(symbol, time_frame) + + # df.loc[:, PriceStrings.STR_PRICE_TIME.value] /= 1000 + + X = df[PriceStrings.STR_PRICE_TIME.value] + Y = df[PriceStrings.STR_PRICE_CLOSE.value] + + # Candlestick + data = go.Ohlc(x=df[PriceStrings.STR_PRICE_TIME.value], + open=df[PriceStrings.STR_PRICE_OPEN.value], + high=df[PriceStrings.STR_PRICE_HIGH.value], + low=df[PriceStrings.STR_PRICE_LOW.value], + close=df[PriceStrings.STR_PRICE_CLOSE.value]) + + real_trades_prices, real_trades_times, simulated_trades_prices, simulated_trades_times = \ + get_trades_by_times_and_prices() + + real_trades_points = go.Scatter( + x=real_trades_prices, + y=real_trades_times, + mode='markers', + name='markers' + ) + + simulated_trades_points = go.Scatter( + x=simulated_trades_times, + y=simulated_trades_prices, + mode='markers', + name='markers' + ) + + return {'data': [data, real_trades_points, simulated_trades_points], + 'layout': go.Layout( + title="{} real time data (per time frame)".format(cryptocurrency_name), + xaxis=dict(range=[min(X), max(X)], + title=TIME_AXIS_TITLE), + yaxis=dict(range=[min(Y) * 0.98, max(Y) * 1.02], + title=pair_tag) + )} + return None + + +def get_evaluator_graph_in_matrix_history(symbol, + exchange_name, + evaluator_type, + evaluator_name, + time_frame, + cryptocurrency_name): + symbol_evaluator_list = get_bot().get_symbol_evaluator_list() + exchange_list = get_bot().get_exchanges_list() + + if evaluator_name is not None and len(symbol_evaluator_list) > 0: + matrix = symbol_evaluator_list[symbol].get_matrix(exchange_list[exchange_name]) + add_to_matrix_history(matrix) + + formatted_matrix_history = { + "timestamps": [], + "evaluator_data": [] + } + + for matrix in get_matrix_history(): + if evaluator_type == EvaluatorMatrixTypes.TA: + eval_note = EvaluatorMatrix.get_eval_note(matrix["matrix"], evaluator_type, evaluator_name, time_frame) + else: + eval_note = EvaluatorMatrix.get_eval_note(matrix["matrix"], evaluator_type, evaluator_name) + + if eval_note is not None: + formatted_matrix_history["evaluator_data"].append(eval_note) + formatted_matrix_history["timestamps"].append(matrix["timestamp"]) + + data = plotly.graph_objs.Scatter( + x=formatted_matrix_history["timestamps"], + y=formatted_matrix_history["evaluator_data"], + name='Scatter', + mode='lines+markers' + ) + + return {'data': [data], + 'layout': go.Layout( + title="{} strategy".format(cryptocurrency_name), + xaxis=dict(range=[get_bot().get_start_time(), time.time()], + title=TIME_AXIS_TITLE), + yaxis=dict(range=[-1.1, 1.1], + title="Buy or sell") + )} + return None diff --git a/interfaces/web/dash_controller.py b/interfaces/web/dash_controller.py new file mode 100644 index 000000000..a6ec30239 --- /dev/null +++ b/interfaces/web/dash_controller.py @@ -0,0 +1,186 @@ +from dash.dependencies import Output, Event, Input + +from config.cst import CONFIG_CRYPTO_CURRENCIES, CONFIG_CRYPTO_PAIRS, CONFIG_TIME_FRAME +from interfaces import global_config +from interfaces.web import app_instance +from interfaces.web.bot_data_model import * + + +@app_instance.callback(Output('live-graph', 'figure'), + [Input('exchange-name', 'value'), + Input('cryptocurrency-name', 'value'), + Input('symbol', 'value'), + Input('time-frame', 'value')], + events=[Event('graph-update', 'interval')]) +def update_values(exchange_name, cryptocurrency_name, symbol, time_frame): + return get_currency_graph_update(exchange_name, + get_value_from_dict_or_string(symbol), + get_value_from_dict_or_string(time_frame, True), + cryptocurrency_name) + + +@app_instance.callback(Output('strategy-live-graph', 'figure'), + [Input('exchange-name', 'value'), + Input('cryptocurrency-name', 'value'), + Input('symbol', 'value'), + Input('time-frame', 'value'), + Input('evaluator-name', 'value')], + events=[Event('strategy-graph-update', 'interval')]) +def update_strategy_values(exchange_name, cryptocurrency_name, symbol, time_frame, evaluator_name): + return get_evaluator_graph_in_matrix_history(get_value_from_dict_or_string(symbol), + exchange_name, + EvaluatorMatrixTypes.STRATEGIES, + get_value_from_dict_or_string(evaluator_name), + get_value_from_dict_or_string(time_frame, True), + cryptocurrency_name) + + +@app_instance.callback(Output('portfolio-value-graph', 'figure'), + events=[Event('portfolio-update', 'interval')]) +def update_portfolio_value(): + update_portfolio_history() + return get_portfolio_value_in_history() + + +@app_instance.callback(Output('datatable-portfolio', 'rows'), + events=[Event('portfolio-update', 'interval')]) +def update_currencies_amounts(): + return get_portfolio_currencies_update() + + +@app_instance.callback(Output('symbol', 'options'), + [Input('exchange-name', 'value'), + Input('cryptocurrency-name', 'value')]) +def update_symbol_dropdown_options(exchange_name, cryptocurrency_name): + exchange = get_bot().get_exchanges_list()[exchange_name] + symbol_list = [] + + for symbol in global_config[CONFIG_CRYPTO_CURRENCIES][cryptocurrency_name][CONFIG_CRYPTO_PAIRS]: + if exchange.get_exchange_manager().symbol_exists(symbol): + symbol_list.append({ + "label": symbol, + "value": symbol + }) + + return symbol_list + + +@app_instance.callback(Output('symbol', 'value'), + [Input('exchange-name', 'value'), + Input('cryptocurrency-name', 'value')]) +def update_symbol_dropdown_value(exchange_name, cryptocurrency_name): + exchange = get_bot().get_exchanges_list()[exchange_name] + + for symbol in global_config[CONFIG_CRYPTO_CURRENCIES][cryptocurrency_name][CONFIG_CRYPTO_PAIRS]: + if exchange.get_exchange_manager().symbol_exists(symbol): + return { + "label": symbol, + "value": symbol + } + + return None + + +@app_instance.callback(Output('time-frame', 'options'), + [Input('exchange-name', 'value'), + Input('symbol', 'value')]) +def update_time_frame_dropdown_options(exchange_name, symbol): + exchange = get_bot().get_exchanges_list()[exchange_name] + + time_frame_list = [] + for time_frame in global_config[CONFIG_TIME_FRAME]: + if exchange.get_exchange_manager().time_frame_exists(TimeFrames(time_frame).value): + time_frame_list.append({ + "label": time_frame, + "value": time_frame + }) + if time_frame_list: + set_default_time_frame_for_this_symbol(time_frame_list[0]["value"]) + return time_frame_list + + +@app_instance.callback(Output('time-frame', 'value'), + [Input('exchange-name', 'value'), + Input('symbol', 'value')]) +def update_time_frame_dropdown_value(exchange_name, symbol): + exchange = get_bot().get_exchanges_list()[exchange_name] + + for time_frame in global_config[CONFIG_TIME_FRAME]: + if exchange.get_exchange_manager().time_frame_exists(TimeFrames(time_frame).value): + return { + "label": time_frame, + "value": time_frame + } + return None + + +@app_instance.callback(Output('evaluator-name', 'options'), + [Input('cryptocurrency-name', 'value'), + Input('exchange-name', 'value'), + Input('symbol', 'value'), + Input('time-frame', 'value')]) +def update_evaluator_dropdown_options(cryptocurrency_name, exchange_name, symbol, time_frame): + symbol_evaluator = get_bot().get_symbol_evaluator_list()[get_value_from_dict_or_string(symbol)] + exchange = get_bot().get_exchanges_list()[exchange_name] + + time_frame = get_value_from_dict_or_string(time_frame, True) + evaluator_list = [] + evaluator_name_list = [] + + # TA and Real time + if time_frame in symbol_evaluator.get_evaluator_thread_managers(exchange): + for ta in symbol_evaluator.get_evaluator_thread_managers(exchange)[time_frame] \ + .get_evaluator().get_ta_eval_list(): + if ta.get_name() not in evaluator_name_list: + evaluator_name_list.append(ta.get_name()) + evaluator_list.append({ + "label": ta.get_name(), + "value": ta.get_name() + }) + + for real_time in symbol_evaluator.get_evaluator_thread_managers(exchange)[time_frame] \ + .get_evaluator().get_real_time_eval_list(): + if real_time.get_name() not in evaluator_name_list: + evaluator_name_list.append(real_time.get_name()) + evaluator_list.append({ + "label": real_time.get_name(), + "value": real_time.get_name() + }) + else: + print(str(time_frame)+" not in: "+str(symbol_evaluator.get_evaluator_thread_managers(exchange))) + + # Socials + for social in symbol_evaluator.get_crypto_currency_evaluator().get_social_eval_list(): + if social.get_name() not in evaluator_name_list: + evaluator_name_list.append(social.get_name()) + evaluator_list.append({ + "label": social.get_name(), + "value": social.get_name() + }) + + # strategies + for strategies in symbol_evaluator.get_strategies_eval_list(exchange): + if strategies.get_name() not in evaluator_name_list: + evaluator_name_list.append(strategies.get_name()) + evaluator_list.append({ + "label": strategies.get_name(), + "value": strategies.get_name() + }) + + return evaluator_list + + +@app_instance.callback(Output('evaluator-name', 'value'), + [Input('cryptocurrency-name', 'value'), + Input('exchange-name', 'value'), + Input('symbol', 'value'), + Input('time-frame', 'value')]) +def update_evaluator_dropdown_values(cryptocurrency_name, exchange_name, symbol, time_frame): + symbol_evaluator = get_bot().get_symbol_evaluator_list()[get_value_from_dict_or_string(symbol)] + exchange = get_bot().get_exchanges_list()[exchange_name] + first_strategy = next(iter(symbol_evaluator.get_strategies_eval_list(exchange))).get_name() + + return { + "label": first_strategy, + "value": first_strategy + } diff --git a/interfaces/web/flask_controller.py b/interfaces/web/flask_controller.py new file mode 100644 index 000000000..931cb3689 --- /dev/null +++ b/interfaces/web/flask_controller.py @@ -0,0 +1,8 @@ +from flask import render_template + +from interfaces.web import server_instance + + +@server_instance.route("/") +def index(): + return render_template('index.html') diff --git a/interfaces/web/static/.keep b/interfaces/web/static/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/interfaces/web/templates/.keep b/interfaces/web/templates/.keep new file mode 100644 index 000000000..e69de29bb diff --git a/interfaces/web/templates/index.html b/interfaces/web/templates/index.html new file mode 100644 index 000000000..ddda12765 --- /dev/null +++ b/interfaces/web/templates/index.html @@ -0,0 +1,11 @@ + + + + + OctoBot + + +Current portfolio : {{portfolio}}
+Go to dashboard + + \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 5afbe584f..000000000 --- a/main.py +++ /dev/null @@ -1,8 +0,0 @@ -from bot import Crypto_Bot - -if __name__ == '__main__': - bot = Crypto_Bot() - bot.create_exchange_traders() - bot.create_evaluation_threads() - bot.start_threads() - bot.join_threads() diff --git a/octobot.py b/octobot.py new file mode 100644 index 000000000..937bfbfe4 --- /dev/null +++ b/octobot.py @@ -0,0 +1,262 @@ +import logging +import time +import ccxt + +from backtesting.backtesting import Backtesting +from config.cst import * +from evaluator.Updaters.symbol_time_frames_updater import SymbolTimeFramesDataUpdaterThread +from evaluator.Util.advanced_manager import AdvancedManager +from evaluator.cryptocurrency_evaluator import CryptocurrencyEvaluator +from evaluator.evaluator_creator import EvaluatorCreator +from evaluator.evaluator_threads_manager import EvaluatorThreadsManager +from evaluator.symbol_evaluator import SymbolEvaluator +from services import ServiceCreator +from tools.notifications import Notification +from tools.performance_analyser import PerformanceAnalyser +from tools.time_frame_manager import TimeFrameManager +from trading.exchanges.exchange_manager import ExchangeManager +from trading.trader.trader import Trader +from trading.trader.trader_simulator import TraderSimulator + +"""Main OctoBot class: +- Create all indicators and thread for each cryptocurrencies in config """ + + +class OctoBot: + """ + Constructor : + - Load configs + """ + + def __init__(self, config): + self.start_time = time.time() + self.config = config + self.ready = False + + # Logger + self.logger = logging.getLogger(self.__class__.__name__) + + # Advanced + AdvancedManager.create_class_list(self.config) + + # Debug tools + self.performance_analyser = None + if CONFIG_DEBUG_OPTION_PERF in self.config and self.config[CONFIG_DEBUG_OPTION_PERF]: + self.performance_analyser = PerformanceAnalyser() + + self.time_frames = TimeFrameManager.get_config_time_frame(self.config) + + # Add services to self.config[CONFIG_CATEGORY_SERVICES] + ServiceCreator.create_services(self.config) + + # Notifier + self.config[CONFIG_NOTIFICATION_INSTANCE] = Notification(self.config) + + # Notify starting + self.config[CONFIG_NOTIFICATION_INSTANCE].notify_with_all(NOTIFICATION_STARTING_MESSAGE) + + # Backtesting + self.backtesting_enabled = None + + self.symbol_threads_manager = {} + self.exchange_traders = {} + self.exchange_trader_simulators = {} + self.exchanges_list = {} + self.symbol_evaluator_list = {} + self.crypto_currency_evaluator_list = {} + self.dispatchers_list = [] + self.symbol_time_frame_updater_threads = [] + + def create_exchange_traders(self): + self.backtesting_enabled = Backtesting.enabled(self.config) + + available_exchanges = ccxt.exchanges + for exchange_class_string in self.config[CONFIG_EXCHANGES]: + if exchange_class_string in available_exchanges: + exchange_type = getattr(ccxt, exchange_class_string) + + # Backtesting Exchange + if self.backtesting_enabled: + exchange_manager = ExchangeManager(self.config, exchange_type, is_simulated=True) + else: + # True Exchange + exchange_manager = ExchangeManager(self.config, exchange_type, is_simulated=False) + + exchange_inst = exchange_manager.get_exchange() + self.exchanges_list[exchange_inst.get_name()] = exchange_inst + + # create trader instance for this exchange + exchange_trader = Trader(self.config, exchange_inst) + self.exchange_traders[exchange_inst.get_name()] = exchange_trader + + # create trader simulator instance for this exchange + exchange_trader_simulator = TraderSimulator(self.config, exchange_inst) + self.exchange_trader_simulators[exchange_inst.get_name()] = exchange_trader_simulator + else: + self.logger.error("{0} exchange not found".format(exchange_class_string)) + + def create_evaluation_threads(self): + self.logger.info("Evaluation threads creation...") + + # create dispatchers + self.dispatchers_list = EvaluatorCreator.create_dispatchers(self.config) + + # create Social and TA evaluators + for crypto_currency, crypto_currency_data in self.config[CONFIG_CRYPTO_CURRENCIES].items(): + + # create crypto_currency evaluator + crypto_currency_evaluator = CryptocurrencyEvaluator(self.config, crypto_currency, self.dispatchers_list) + self.crypto_currency_evaluator_list[crypto_currency] = crypto_currency_evaluator + + # create TA evaluators + for symbol in crypto_currency_data[CONFIG_CRYPTO_PAIRS]: + + # create symbol evaluator + symbol_evaluator = SymbolEvaluator(self.config, symbol, crypto_currency_evaluator) + symbol_evaluator.set_traders(self.exchange_traders) + symbol_evaluator.set_trader_simulators(self.exchange_trader_simulators) + + crypto_currency_evaluator.add_symbol_evaluator(symbol, symbol_evaluator) + self.symbol_evaluator_list[symbol] = symbol_evaluator + + for exchange in self.exchanges_list.values(): + if exchange.get_exchange_manager().enabled(): + + # Verify that symbol exists on this exchange + if symbol in exchange.get_exchange_manager().get_traded_pairs(): + self._create_symbol_threads_managers(symbol, + exchange, + symbol_evaluator) + + # notify that exchange doesn't support this symbol + else: + if not self.backtesting_enabled: + self.logger.warning("{0} doesn't support {1}".format(exchange.get_name(), symbol)) + + def _create_symbol_threads_managers(self, symbol, exchange, symbol_evaluator): + # Create real time TA evaluators + real_time_ta_eval_list = EvaluatorCreator.create_real_time_ta_evals(self.config, + exchange, + symbol) + symbol_time_frame_updater_thread = SymbolTimeFramesDataUpdaterThread() + for time_frame in self.time_frames: + if exchange.get_exchange_manager().time_frame_exists(time_frame.value): + self.symbol_threads_manager[time_frame] = EvaluatorThreadsManager(self.config, + symbol, + time_frame, + symbol_time_frame_updater_thread, + symbol_evaluator, + exchange, + real_time_ta_eval_list) + self.symbol_time_frame_updater_threads.append(symbol_time_frame_updater_thread) + + def start_threads(self): + if self.performance_analyser: + self.performance_analyser.start() + + for crypto_currency_evaluator in self.crypto_currency_evaluator_list.values(): + crypto_currency_evaluator.start_threads() + + for manager in self.symbol_threads_manager.values(): + manager.start_threads() + + for thread in self.symbol_time_frame_updater_threads: + thread.start() + + for thread in self.dispatchers_list: + thread.start() + + self.ready = True + self.logger.info("Evaluation threads started...") + + def join_threads(self): + for manager in self.symbol_threads_manager: + self.symbol_threads_manager[manager].join_threads() + + for thread in self.symbol_time_frame_updater_threads: + thread.join() + + for crypto_currency_evaluator in self.crypto_currency_evaluator_list.values(): + crypto_currency_evaluator.join_threads() + + for trader in self.exchange_traders.values(): + trader.join_order_manager() + + for trader_simulator in self.exchange_trader_simulators.values(): + trader_simulator.join_order_manager() + + for thread in self.dispatchers_list: + thread.join() + + if self.performance_analyser: + self.performance_analyser.join() + + def stop_threads(self): + # Notify stopping + self.config[CONFIG_NOTIFICATION_INSTANCE].notify_with_all(NOTIFICATION_STOPPING_MESSAGE) + + self.logger.info("Stopping threads ...") + + for thread in self.symbol_time_frame_updater_threads: + thread.stop() + + for manager in self.symbol_threads_manager.values(): + manager.stop_threads() + + for crypto_currency_evaluator in self.crypto_currency_evaluator_list.values(): + crypto_currency_evaluator.stop_threads() + + for trader in self.exchange_traders.values(): + trader.stop_order_manager() + + for trader_simulator in self.exchange_trader_simulators.values(): + trader_simulator.stop_order_manager() + + for thread in self.dispatchers_list: + thread.stop() + + if self.performance_analyser: + self.performance_analyser.stop() + + # stop services + for service_instance in ServiceCreator.get_service_instances(self.config): + try: + service_instance.stop() + except Exception as e: + raise e + + # stop exchanges threads + for exchange in self.exchanges_list.values(): + exchange.stop() + + self.logger.info("Threads stopped.") + + def get_symbols_threads_manager(self): + return self.symbol_threads_manager + + def get_exchange_traders(self): + return self.exchange_traders + + def get_exchange_trader_simulators(self): + return self.exchange_trader_simulators + + def get_exchanges_list(self): + return self.exchanges_list + + def get_symbol_evaluator_list(self): + return self.symbol_evaluator_list + + def get_crypto_currency_evaluator_list(self): + return self.crypto_currency_evaluator_list + + def get_dispatchers_list(self): + return self.dispatchers_list + + def get_symbol_time_frame_updater_threads(self): + return self.symbol_time_frame_updater_threads + + def get_start_time(self): + return self.start_time + + def is_ready(self): + return self.ready diff --git a/requirements.txt b/requirements.txt index a78621b2a..b4e86a550 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,16 +1,26 @@ +matplotlib==2.2.2 +requests vaderSentiment pandas pytrends ccxt -TA-Lib -pytest +twisted==18.4.0 + +python-binance + +TA-Lib==0.4.17 numpy colorlog Python-Twitter psutil +plotly +newspaper3k +praw +python-telegram-bot + dash +dash-table-experiments flask dash-renderer dash-html-components -dash-core-components -plotly \ No newline at end of file +dash-core-components \ No newline at end of file diff --git a/services/__init__.py b/services/__init__.py index 05fa1a377..5896434a0 100644 --- a/services/__init__.py +++ b/services/__init__.py @@ -1,3 +1,6 @@ from .service_creator import * from .twitter_service import * from .gmail_service import * +from .reddit_service import * +from .telegram_service import * +from .web_service import * diff --git a/services/abstract_service.py b/services/abstract_service.py index 6927e6208..33b4ea393 100644 --- a/services/abstract_service.py +++ b/services/abstract_service.py @@ -32,6 +32,15 @@ def set_config(self, config): def get_is_enabled(self): return self.enabled + # implement locally if the service has thread(s) to stop + def stop(self): + pass + + # implement locally if the service shouldn't raise warning at startup if configuration is not set + @staticmethod + def get_should_warn(): + return True + # Returns true if all the configuration is available @abstractmethod def has_required_configuration(self): @@ -51,3 +60,11 @@ def get_type(self) -> None: @abstractmethod def prepare(self) -> None: raise NotImplementedError("prepare not implemented") + + # Called by say_hello after service is prepared, return relevant service information + @abstractmethod + def get_successful_startup_message(self): + raise NotImplementedError("get_successful_startup_message not implemented") + + def say_hello(self): + self.logger.info(self.get_successful_startup_message()) diff --git a/services/gmail_service.py b/services/gmail_service.py index ba4e29c48..72ccc2a43 100644 --- a/services/gmail_service.py +++ b/services/gmail_service.py @@ -58,3 +58,7 @@ def send_mail(self, subject, content): except Exception as e: self.logger.error("Failed to send mail : {0}".format(e)) return False + + def get_successful_startup_message(self): + return "Successfully initialized to notify {0}."\ + .format(self.config[CONFIG_CATEGORY_SERVICES][CONFIG_GMAIL]["mail_dest"]) diff --git a/services/reddit_service.py b/services/reddit_service.py new file mode 100644 index 000000000..11c896cce --- /dev/null +++ b/services/reddit_service.py @@ -0,0 +1,45 @@ +import praw + +from config.cst import * +from services.abstract_service import * + + +class RedditService(AbstractService): + + def __init__(self): + super().__init__() + self.reddit_api = None + + @staticmethod + def is_setup_correctly(config): + if CONFIG_REDDIT in config[CONFIG_CATEGORY_SERVICES] \ + and CONFIG_SERVICE_INSTANCE in config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT]: + return True + else: + return False + + def prepare(self): + if not self.reddit_api: + self.reddit_api = praw.Reddit(client_id=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT]["client_id"], + client_secret=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT]["client_secret"], + password=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT]["password"], + user_agent='bot', + username=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT]["username"]) + + def get_type(self): + return CONFIG_REDDIT + + def get_endpoint(self): + return self.reddit_api + + def has_required_configuration(self): + return CONFIG_CATEGORY_SERVICES in self.config \ + and CONFIG_REDDIT in self.config[CONFIG_CATEGORY_SERVICES] \ + and "client_id" in self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT] \ + and "client_secret" in self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT] \ + and "password" in self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT] \ + and "username" in self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT] + + def get_successful_startup_message(self): + return "Successfully initialized using {0} account."\ + .format(self.config[CONFIG_CATEGORY_SERVICES][CONFIG_REDDIT]["username"]) diff --git a/services/service_creator.py b/services/service_creator.py index b2a27bf23..8a7ff4123 100644 --- a/services/service_creator.py +++ b/services/service_creator.py @@ -18,7 +18,23 @@ def create_services(config): service_instance.set_logger(logging.getLogger(service_class.get_name())) service_instance.set_config(config) if service_instance.has_required_configuration(): - service_instance.prepare() - config[CONFIG_CATEGORY_SERVICES][service_instance.get_type()][CONFIG_SERVICE_INSTANCE] = service_instance + try: + service_instance.prepare() + config[CONFIG_CATEGORY_SERVICES][service_instance.get_type()][CONFIG_SERVICE_INSTANCE] = \ + service_instance + service_instance.say_hello() + except Exception as e: + logger.error("{0} preparation produced the following error: {1}" + .format(service_class.get_name(), e)) else: - logger.warning(service_class.get_name()+" can't be initialized: configuration is missing !") + if service_instance.get_should_warn(): + logger.warning("{0} can't be initialized: configuration is missing !" + .format(service_class.get_name())) + + @staticmethod + def get_service_instances(config): + instances = [] + for services in config[CONFIG_CATEGORY_SERVICES]: + if CONFIG_SERVICE_INSTANCE in config[CONFIG_CATEGORY_SERVICES][services]: + instances.append(config[CONFIG_CATEGORY_SERVICES][services][CONFIG_SERVICE_INSTANCE]) + return instances diff --git a/services/telegram_service.py b/services/telegram_service.py new file mode 100644 index 000000000..ca7f500e4 --- /dev/null +++ b/services/telegram_service.py @@ -0,0 +1,73 @@ +import telegram +from telegram.ext import Updater # , Dispatcher + +from config.cst import * +from interfaces.telegram.bot import TelegramApp +from services.abstract_service import * + + +class TelegramService(AbstractService): + + def __init__(self): + super().__init__() + self.telegram_api = None + self.chat_id = None + self.telegram_app = None + self.telegram_updater = None + + @staticmethod + def is_setup_correctly(config): + if CONFIG_TELEGRAM in config[CONFIG_CATEGORY_SERVICES] \ + and CONFIG_SERVICE_INSTANCE in config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM]: + return True + else: + return False + + def prepare(self): + if not self.telegram_api: + self.chat_id = self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM]["chat_id"] + self.telegram_api = telegram.Bot( + token=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM][CONFIG_TOKEN]) + + if not self.telegram_app: + if not self.telegram_updater: + self.telegram_updater = Updater( + token=self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM][CONFIG_TOKEN]) + + if TelegramApp.is_enabled(self.config): + self.telegram_app = TelegramApp(self.config, self, self.telegram_updater) + + def get_type(self): + return CONFIG_TELEGRAM + + def get_endpoint(self): + return self.telegram_api + + def get_updater(self): + return self.telegram_updater + + def stop(self): + if self.telegram_updater: + # __exception_event.is_set() + # self.telegram_updater.dispatcher.__stop_event.set() + # self.telegram_updater.__exception_event.set() + # self.telegram_updater.dispatcher.__exception_event.set() + self.telegram_updater.dispatcher.running = False + self.telegram_updater.running = False + # self.telegram_updater.dispatcher.running = False + # self.telegram_updater.stop() + + def has_required_configuration(self): + return CONFIG_CATEGORY_SERVICES in self.config \ + and CONFIG_TELEGRAM in self.config[CONFIG_CATEGORY_SERVICES] \ + and "token" in self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM] \ + and "chat_id" in self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM] + + def send_message(self, content): + self.telegram_api.send_message(chat_id=self.chat_id, text=content) + + def _get_bot_url(self): + return "https://web.telegram.org/#/im?p={0}".format(self.telegram_api.get_me().name) + + def get_successful_startup_message(self): + return "Successfully initialized and accessible at: {0}.".format(self._get_bot_url()) diff --git a/services/twitter_service.py b/services/twitter_service.py index 5f0457c26..c1d8b3a0a 100644 --- a/services/twitter_service.py +++ b/services/twitter_service.py @@ -1,4 +1,6 @@ import twitter +from twitter.api import CHARACTER_LIMIT +from twitter.twitter_utils import calc_expected_status_length from config.cst import * from services.abstract_service import * @@ -48,28 +50,72 @@ def has_required_configuration(self): @staticmethod def decode_tweet(tweet): - try: + if "extended_tweet" in tweet and "full_text" in tweet: return tweet["extended_tweet"]["full_text"] - except KeyError: + elif "text" in tweet: return tweet["text"] + return "" def post(self, content): try: - return self.twitter_api.PostUpdate(status=content) + return self.split_tweet_content(content=content, tweet_id=None) except Exception as e: self.logger.error("Failed to send tweet : {0}".format(e)) - return None + return None def respond(self, tweet_id, content): try: - return self.twitter_api.PostUpdate(status=content, in_reply_to_status_id=tweet_id) + return self.split_tweet_content(content=content, tweet_id=tweet_id) except Exception as e: self.logger.error("Failed to send tweet : {0}".format(e)) - return None + return None + + def split_tweet_content(self, content, counter=None, counter_max=None, tweet_id=None): + # add twitter counter at the beginning + if counter is not None and counter_max is not None: + content = "{0}/{1} {2}".format(counter, counter_max, content) + counter += 1 + + # get the current content size + post_size = calc_expected_status_length(content) + + # check if the current content size can be posted + if post_size > CHARACTER_LIMIT: + + # calculate the number of post required for the whole content + if not counter_max: + counter_max = post_size // CHARACTER_LIMIT + counter = 1 + + # post the current tweet + post = self.twitter_api.PostUpdate(status=content[:CHARACTER_LIMIT], in_reply_to_status_id=tweet_id) + + # recursive call for all post while content > CHARACTER_LIMIT + self.split_tweet_content(content[CHARACTER_LIMIT:], + counter=counter, + counter_max=counter_max, + tweet_id=tweet_id) - def tweet_to_string(self, tweet): + return post + else: + return self.twitter_api.PostUpdate(status=content[:CHARACTER_LIMIT], in_reply_to_status_id=tweet_id) + + def get_tweet_text(self, tweet): try: return TwitterService.decode_tweet(tweet) except Exception as e2: self.logger.error(e2) return "" + + @staticmethod + def get_twitter_id_from_url(url): + return str(url).split("/")[-1] + + def get_tweet(self, tweet_id): + return self.twitter_api.GetStatus(tweet_id) + + def _get_twitter_url(self): + return "https://twitter.com/{0}".format(self.twitter_api.VerifyCredentials().screen_name) + + def get_successful_startup_message(self): + return "Successfully initialized and accessible at: {0}.".format(self._get_twitter_url()) diff --git a/services/web_service.py b/services/web_service.py new file mode 100644 index 000000000..5267e063e --- /dev/null +++ b/services/web_service.py @@ -0,0 +1,68 @@ +import socket + +from config.cst import CONFIG_WEB, CONFIG_CATEGORY_SERVICES, CONFIG_ENABLED_OPTION, CONFIG_SERVICE_INSTANCE, \ + CONFIG_WEB_IP, CONFIG_WEB_PORT, DEFAULT_SERVER_IP, DEFAULT_SERVER_PORT +from interfaces.web.app import WebApp +from services import AbstractService + + +class WebService(AbstractService): + + def __init__(self): + super().__init__() + self.web_app = None + + @staticmethod + def is_setup_correctly(config): + if CONFIG_WEB in config[CONFIG_CATEGORY_SERVICES] \ + and CONFIG_SERVICE_INSTANCE in config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB]: + return True + else: + return False + + def has_required_configuration(self): + return CONFIG_CATEGORY_SERVICES in self.config \ + and CONFIG_WEB in self.config[CONFIG_CATEGORY_SERVICES] \ + and self.config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_ENABLED_OPTION] + + def get_endpoint(self) -> None: + return self.web_app + + def get_type(self) -> None: + return CONFIG_WEB + + def prepare(self) -> None: + self.web_app = WebApp(self.config) + self.web_app.start() + + @staticmethod + def get_should_warn(): + return False + + def stop(self): + if self.web_app: + self.web_app.stop() + + @staticmethod + def enable(config, is_enabled): + if CONFIG_CATEGORY_SERVICES not in config: + config[CONFIG_CATEGORY_SERVICES] = {} + if CONFIG_WEB not in config[CONFIG_CATEGORY_SERVICES]: + config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB] = {} + config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_IP] = DEFAULT_SERVER_IP + config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_PORT] = DEFAULT_SERVER_PORT + else: + if CONFIG_WEB_IP not in config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB]: + config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_IP] = DEFAULT_SERVER_IP + if CONFIG_WEB_PORT not in config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB]: + config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_PORT] = DEFAULT_SERVER_PORT + + config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_ENABLED_OPTION] = is_enabled + + def _get_web_server_url(self): + return "{0}:{1}"\ + .format(socket.gethostbyname(socket.gethostname()), + self.config[CONFIG_CATEGORY_SERVICES][CONFIG_WEB][CONFIG_WEB_PORT]) + + def get_successful_startup_message(self): + return "Interface successfully initialized and accessible at: http://{0}.".format(self._get_web_server_url()) diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 000000000..e2da98fae --- /dev/null +++ b/setup.cfg @@ -0,0 +1,20 @@ +[aliases] +release = egg_info -Db '' + +[bdist_wheel] +universal = 1 + +[metadata] +license_file = LICENSE + +[tool:pytest] +minversion = 3.0 +testpaths = tests +addopts = -v -x --ignore=setup.py --pep8 +pep8maxlinelength = 127 +pep8ignore = + E402 # module level import not at top of file + E241 # multiple spaces after ',' + E226 # missing white space around arithmetic operator + E222 # multiple spaces after operator + docs/source/conf.py ALL \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 000000000..ef0378b2f --- /dev/null +++ b/setup.py @@ -0,0 +1,36 @@ +from setuptools import setup + +from config.cst import VERSION + +DESCRIPTION = open('README.md').read() + '\n\n' + open('docs/CHANGELOG.md').read() + +setup( + name='OctoBot', + version=VERSION, + # TODO packages=[''], + url='https://github.com/Drakkar-Software/OctoBot', + license='MIT', + author='Trading-Bot team', + description='Cryptocurrencies alert / trading bot', + long_description=DESCRIPTION, + entry_points={ + 'console_scripts': [ + 'coveralls = coveralls.cli:main', + ], + }, + # TODO install_requires=[], + setup_requires=['pytest-runner'], + # TODO tests_require=[], + # TODO extras_require={}, + classifiers=[ + 'Development Status :: 4 - Beta', + 'License :: OSI Approved :: MIT License', + 'Operating System :: OS Independent', + 'Operating System :: MacOS :: MacOS X', + 'Operating System :: Microsoft :: Windows', + 'Operating System :: POSIX', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + ], +) diff --git a/start.py b/start.py new file mode 100644 index 000000000..c66d9f2c2 --- /dev/null +++ b/start.py @@ -0,0 +1,102 @@ +import argparse +import logging +import sys +import traceback +from logging.config import fileConfig + +from config.config import load_config +from config.cst import * +from tools.commands import Commands +from interfaces.telegram.bot import TelegramApp +from services import WebService + + +def _log_uncaught_exceptions(ex_cls, ex, tb): + logging.exception(''.join(traceback.format_tb(tb))) + logging.exception('{0}: {1}'.format(ex_cls, ex)) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='OctoBot') + parser.add_argument('start', help='start the OctoBot', + action='store_true') + parser.add_argument('-s', '--simulate', help='start the OctoBot with the trader simulator', + action='store_true') + parser.add_argument('-d', '--data_collector', help='start the data collector process to create data for backtesting', + action='store_true') + parser.add_argument('-u', '--update', help='update OctoBot with the latest version available', + action='store_true') + parser.add_argument('-b', '--backtesting', help='enable the backtesting option and use the backtesting config', + action='store_true') + parser.add_argument('-r', '--risk', type=float, help='risk representation (between 0 and 1)') + parser.add_argument('-w', '--web', help='Start web server', + action='store_true') + parser.add_argument('-t', '--telegram', help='Start telegram command handler', + action='store_true') + parser.add_argument('-p', '--packager', help='Start OctoBot tentacle (package) manager: -p install all to install ' + 'all modules and -p install [modules] to install specific modules', + nargs='+') + + args = parser.parse_args() + + fileConfig('config/logging_config.ini') + + logger = logging.getLogger("OctoBot Launcher") + + # Force new log file creation not to log at the previous one's end. + logger.parent.handlers[1].doRollover() + + sys.excepthook = _log_uncaught_exceptions + + # Version + logger.info("Version : {0}".format(LONG_VERSION)) + + logger.info("Loading config files...") + config = load_config() + + # Handle utility methods before bot initializing if possible + if args.packager: + Commands.package_manager(config, args.packager) + + elif args.update: + Commands.update(logger) + + else: + # In those cases load OctoBot + from octobot import OctoBot + + config[CONFIG_EVALUATOR] = load_config(CONFIG_EVALUATOR_FILE, False) + + TelegramApp.enable(config, args.telegram) + + WebService.enable(config, args.web) + + bot = OctoBot(config) + + import interfaces + interfaces.__init__(bot, config) + + if args.data_collector: + Commands.data_collector(config) + + # start crypto bot options + else: + if args.backtesting: + import backtesting + backtesting.__init__(bot) + + config[CONFIG_BACKTESTING][CONFIG_ENABLED_OPTION] = True + config[CONFIG_CATEGORY_NOTIFICATION][CONFIG_ENABLED_OPTION] = False + + config[CONFIG_TRADER][CONFIG_ENABLED_OPTION] = False + config[CONFIG_SIMULATOR][CONFIG_ENABLED_OPTION] = True + + if args.simulate: + config[CONFIG_TRADER][CONFIG_ENABLED_OPTION] = False + config[CONFIG_SIMULATOR][CONFIG_ENABLED_OPTION] = True + + if args.risk is not None and 0 < args.risk <= 1: + config[CONFIG_TRADER][CONFIG_TRADER_RISK] = args.risk + + if args.start: + Commands.start_bot(bot, logger) diff --git a/tests/functional_tests/__init__.py b/tests/functional_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/static/binance_BTC_USDT_20180428_121156.data b/tests/static/binance_BTC_USDT_20180428_121156.data new file mode 100644 index 000000000..8d9443b68 --- /dev/null +++ b/tests/static/binance_BTC_USDT_20180428_121156.data @@ -0,0 +1 @@ +{"1m": [[1524880320000, 9094.18, 9098.0, 9090.0, 9097.12, 29.20769], [1524880380000, 9095.0, 9097.99, 9085.0, 9089.02, 18.642948], [1524880440000, 9089.02, 9094.24, 9084.98, 9092.13, 42.738878], [1524880500000, 9090.01, 9095.46, 9085.0, 9092.61, 20.411073], [1524880560000, 9092.62, 9096.0, 9092.61, 9095.42, 6.362108], [1524880620000, 9096.0, 9107.0, 9095.42, 9105.08, 56.934633], [1524880680000, 9107.98, 9120.23, 9107.98, 9119.32, 43.661843], [1524880740000, 9120.23, 9126.81, 9118.0, 9126.81, 48.509827], [1524880800000, 9126.81, 9128.09, 9116.0, 9116.52, 63.183033], [1524880860000, 9116.0, 9121.74, 9116.0, 9116.01, 43.262053], [1524880920000, 9116.0, 9116.01, 9089.98, 9090.18, 28.994326], [1524880980000, 9099.09, 9111.85, 9090.17, 9111.83, 18.89067], [1524881040000, 9101.53, 9111.85, 9099.99, 9110.01, 22.678861], [1524881100000, 9110.01, 9111.85, 9110.0, 9111.01, 13.737443], [1524881160000, 9111.0, 9113.96, 9111.0, 9113.96, 17.780914], [1524881220000, 9113.96, 9124.99, 9112.0, 9123.0, 16.307828], [1524881280000, 9125.0, 9129.17, 9114.01, 9114.01, 34.254745], [1524881340000, 9115.0, 9129.0, 9100.32, 9123.95, 39.403439], [1524881400000, 9120.57, 9123.94, 9114.01, 9123.08, 5.539075], [1524881460000, 9123.08, 9129.0, 9120.0, 9121.84, 26.513747], [1524881520000, 9121.84, 9128.0, 9114.01, 9119.0, 11.919154], [1524881580000, 9118.99, 9119.94, 9110.0, 9115.0, 8.656376], [1524881640000, 9115.0, 9118.69, 9100.39, 9110.01, 18.162342], [1524881700000, 9108.0, 9115.0, 9100.39, 9114.99, 20.98832], [1524881760000, 9114.99, 9115.0, 9105.0, 9110.02, 34.413698], [1524881820000, 9110.03, 9111.42, 9075.19, 9088.03, 69.41519], [1524881880000, 9083.18, 9088.03, 9078.0, 9080.02, 25.158955], [1524881940000, 9080.02, 9091.59, 9075.19, 9085.0, 28.418703], [1524882000000, 9085.01, 9090.12, 9080.0, 9086.99, 15.730926], [1524882060000, 9086.99, 9100.0, 9080.06, 9090.39, 33.006884], [1524882120000, 9090.39, 9100.32, 9090.38, 9099.0, 28.472196], [1524882180000, 9099.0, 9118.48, 9099.0, 9111.01, 27.515375], [1524882240000, 9116.94, 9123.03, 9111.01, 9116.93, 21.112542], [1524882300000, 9117.99, 9117.99, 9100.33, 9103.01, 49.063182], [1524882360000, 9103.01, 9109.0, 9100.0, 9100.0, 23.551851], [1524882420000, 9100.0, 9115.94, 9100.0, 9101.0, 34.882035], [1524882480000, 9101.0, 9109.89, 9101.0, 9102.11, 8.591047], [1524882540000, 9102.11, 9106.1, 9100.33, 9100.33, 20.645743], [1524882600000, 9100.33, 9106.11, 9100.33, 9105.0, 12.726996], [1524882660000, 9105.0, 9107.44, 9102.0, 9103.01, 19.46195], [1524882720000, 9109.88, 9109.99, 9103.01, 9108.0, 17.171666], [1524882780000, 9108.99, 9110.49, 9105.21, 9106.32, 11.584391], [1524882840000, 9105.48, 9112.8, 9105.21, 9112.79, 11.825441], [1524882900000, 9112.79, 9116.58, 9105.25, 9105.25, 18.029042], [1524882960000, 9105.67, 9119.0, 9105.67, 9116.31, 5.315861], [1524883020000, 9114.11, 9116.31, 9108.0, 9108.0, 18.894472], [1524883080000, 9108.0, 9110.01, 9108.0, 9108.03, 9.273475], [1524883140000, 9108.04, 9110.01, 9108.01, 9108.06, 13.690748], [1524883200000, 9108.06, 9112.86, 9103.3, 9103.3, 14.554275], [1524883260000, 9105.0, 9105.0, 9100.33, 9101.99, 3.853307], [1524883320000, 9101.5, 9110.01, 9100.33, 9100.33, 11.11452], [1524883380000, 9100.33, 9100.34, 9090.0, 9090.11, 34.380085], [1524883440000, 9090.11, 9095.0, 9086.7, 9094.98, 12.092345], [1524883500000, 9094.99, 9094.99, 9086.9, 9086.9, 17.767146], [1524883560000, 9090.0, 9093.13, 9073.68, 9076.0, 20.871505], [1524883620000, 9075.99, 9084.68, 9073.68, 9083.0, 9.471618], [1524883680000, 9083.99, 9090.0, 9077.76, 9090.0, 10.421445], [1524883740000, 9089.99, 9093.13, 9073.7, 9084.72, 10.894499], [1524883800000, 9084.42, 9084.42, 9073.72, 9073.86, 10.157149], [1524883860000, 9073.86, 9086.99, 9073.68, 9073.68, 14.72462], [1524883920000, 9073.85, 9081.97, 9062.0, 9064.0, 59.816901], [1524883980000, 9064.0, 9079.4, 9055.0, 9066.24, 21.053692], [1524884040000, 9070.0, 9070.0, 9056.64, 9056.64, 11.638231], [1524884100000, 9056.64, 9066.21, 9050.0, 9056.0, 26.838529], [1524884160000, 9060.0, 9072.86, 9056.98, 9060.01, 16.631446], [1524884220000, 9065.91, 9070.03, 9055.63, 9064.17, 39.265481], [1524884280000, 9056.92, 9062.98, 9056.01, 9057.01, 9.669728], [1524884340000, 9057.01, 9062.0, 9053.47, 9055.78, 14.194841], [1524884400000, 9053.47, 9070.03, 9051.0, 9063.96, 7.399338], [1524884460000, 9070.03, 9077.55, 9063.99, 9068.84, 7.48082], [1524884520000, 9070.0, 9078.9, 9065.0, 9065.0, 6.940409], [1524884580000, 9074.51, 9075.0, 9065.01, 9073.62, 5.851091], [1524884640000, 9069.5, 9083.3, 9066.01, 9082.81, 9.249684], [1524884700000, 9082.8, 9082.92, 9075.76, 9080.0, 22.33925], [1524884760000, 9082.84, 9083.3, 9078.0, 9080.0, 18.159872], [1524884820000, 9080.01, 9083.3, 9080.01, 9083.3, 6.666073], [1524884880000, 9083.3, 9086.0, 9083.04, 9085.05, 8.930929], [1524884940000, 9085.0, 9085.05, 9083.3, 9085.0, 6.666931], [1524885000000, 9085.0, 9092.41, 9085.0, 9091.0, 28.213726], [1524885060000, 9091.0, 9100.0, 9090.01, 9098.38, 23.831208], [1524885120000, 9093.02, 9100.0, 9092.46, 9094.1, 9.057284], [1524885180000, 9094.1, 9099.0, 9092.46, 9092.46, 15.908904], [1524885240000, 9092.46, 9099.02, 9092.0, 9097.51, 15.883052], [1524885300000, 9096.28, 9097.51, 9093.0, 9096.51, 4.321044], [1524885360000, 9093.3, 9096.67, 9093.3, 9095.98, 9.076152], [1524885420000, 9095.98, 9096.53, 9093.69, 9096.51, 13.186262], [1524885480000, 9096.51, 9096.51, 9094.5, 9095.0, 15.555526], [1524885540000, 9095.45, 9096.52, 9094.5, 9095.1, 9.55621], [1524885600000, 9095.1, 9113.7, 9095.09, 9109.0, 32.455274], [1524885660000, 9109.0, 9116.31, 9101.98, 9110.46, 13.785083], [1524885720000, 9110.46, 9129.0, 9110.46, 9126.19, 29.990179], [1524885780000, 9126.19, 9146.99, 9121.0, 9121.26, 61.905931], [1524885840000, 9125.0, 9126.03, 9121.26, 9121.26, 16.854817], [1524885900000, 9121.26, 9126.03, 9120.0, 9124.77, 25.649231], [1524885960000, 9125.58, 9130.0, 9121.0, 9122.01, 21.977883], [1524886020000, 9124.99, 9130.26, 9122.01, 9123.01, 10.211102], [1524886080000, 9123.01, 9125.0, 9121.0, 9122.0, 7.966947], [1524886140000, 9122.0, 9124.0, 9110.46, 9112.27, 13.181924], [1524886200000, 9112.0, 9121.99, 9110.32, 9111.0, 10.553614], [1524886260000, 9111.01, 9115.0, 9110.0, 9110.33, 10.013344], [1524886320000, 9112.95, 9116.21, 9110.34, 9115.99, 5.867337], [1524886380000, 9114.01, 9128.49, 9114.01, 9128.49, 18.9355], [1524886440000, 9128.49, 9129.42, 9124.22, 9124.23, 12.959013], [1524886500000, 9124.23, 9130.0, 9124.22, 9124.23, 10.449614], [1524886560000, 9124.23, 9128.48, 9124.22, 9124.23, 8.212494], [1524886620000, 9124.23, 9127.22, 9109.49, 9110.13, 27.926238], [1524886680000, 9120.0, 9120.0, 9108.94, 9111.01, 6.999053], [1524886740000, 9113.12, 9115.24, 9111.0, 9115.23, 6.889685], [1524886800000, 9115.23, 9118.36, 9100.0, 9110.44, 22.717742], [1524886860000, 9110.44, 9124.0, 9110.43, 9120.0, 15.349473], [1524886920000, 9113.4, 9120.0, 9106.41, 9118.82, 7.339945], [1524886980000, 9119.95, 9119.95, 9111.05, 9112.08, 3.983764], [1524887040000, 9115.3, 9120.0, 9112.03, 9114.0, 5.344647], [1524887100000, 9114.0, 9119.94, 9114.0, 9115.25, 4.154397], [1524887160000, 9115.25, 9136.01, 9115.25, 9131.41, 26.121303], [1524887220000, 9131.65, 9133.98, 9125.01, 9132.57, 10.232922], [1524887280000, 9132.57, 9140.0, 9126.31, 9139.99, 14.004287], [1524887340000, 9139.99, 9140.0, 9137.6, 9137.61, 14.840915], [1524887400000, 9137.61, 9141.3, 9137.61, 9140.0, 16.881866], [1524887460000, 9140.0, 9146.0, 9138.88, 9145.01, 6.367835], [1524887520000, 9145.02, 9155.66, 9142.81, 9152.24, 59.053917], [1524887580000, 9155.64, 9180.75, 9145.07, 9162.24, 144.932174], [1524887640000, 9170.99, 9196.32, 9162.29, 9176.7, 45.197169], [1524887700000, 9176.7, 9181.66, 9152.44, 9158.0, 24.995997], [1524887760000, 9158.0, 9167.77, 9152.5, 9158.32, 16.674296], [1524887820000, 9167.0, 9170.0, 9158.29, 9158.38, 18.374381], [1524887880000, 9158.38, 9163.96, 9152.44, 9153.51, 24.391803], [1524887940000, 9153.5, 9157.87, 9152.48, 9155.0, 11.051808], [1524888000000, 9155.01, 9162.0, 9155.0, 9162.0, 10.508049], [1524888060000, 9157.0, 9165.0, 9155.0, 9157.07, 10.511765], [1524888120000, 9163.99, 9168.71, 9157.05, 9159.33, 23.593264], [1524888180000, 9157.93, 9163.76, 9157.05, 9161.0, 19.971825], [1524888240000, 9161.01, 9163.72, 9145.0, 9151.06, 42.615489], [1524888300000, 9151.06, 9151.06, 9137.72, 9137.75, 14.65276], [1524888360000, 9143.27, 9149.0, 9137.73, 9147.01, 25.820821], [1524888420000, 9147.01, 9151.11, 9147.01, 9150.99, 9.156525], [1524888480000, 9150.0, 9151.0, 9148.49, 9148.99, 12.132922], [1524888540000, 9148.0, 9149.0, 9140.0, 9140.97, 7.495421], [1524888600000, 9147.85, 9147.85, 9137.73, 9146.75, 13.030406], [1524888660000, 9146.69, 9149.99, 9140.19, 9140.46, 11.846179], [1524888720000, 9140.46, 9149.71, 9137.74, 9140.0, 7.401096], [1524888780000, 9140.0, 9149.69, 9137.76, 9140.0, 13.804253], [1524888840000, 9139.2, 9145.0, 9139.18, 9142.99, 8.53676], [1524888900000, 9142.99, 9145.47, 9130.01, 9130.95, 23.555771], [1524888960000, 9141.09, 9145.97, 9131.07, 9139.64, 7.141991], [1524889020000, 9139.64, 9145.0, 9139.64, 9141.1, 9.583477], [1524889080000, 9140.51, 9144.0, 9140.0, 9144.0, 16.055973], [1524889140000, 9143.94, 9144.0, 9140.0, 9140.56, 6.487454], [1524889200000, 9141.0, 9141.0, 9140.56, 9140.56, 6.323473], [1524889260000, 9140.28, 9144.0, 9139.79, 9141.0, 20.943643], [1524889320000, 9140.58, 9146.34, 9140.0, 9146.34, 12.606837], [1524889380000, 9146.34, 9150.0, 9143.51, 9150.0, 14.522949], [1524889440000, 9149.99, 9160.0, 9149.99, 9160.0, 20.035032], [1524889500000, 9159.99, 9162.34, 9153.0, 9153.58, 10.703659], [1524889560000, 9153.69, 9162.34, 9153.57, 9162.0, 12.205989], [1524889620000, 9160.0, 9162.0, 9153.59, 9157.55, 26.909187], [1524889680000, 9157.02, 9161.0, 9155.2, 9161.0, 9.362208], [1524889740000, 9160.0, 9161.0, 9155.24, 9160.95, 17.872412], [1524889800000, 9160.92, 9160.95, 9153.0, 9156.48, 11.642115], [1524889860000, 9153.03, 9158.0, 9151.36, 9152.02, 25.534766], [1524889920000, 9152.02, 9161.11, 9151.35, 9161.1, 24.173887], [1524889980000, 9157.0, 9161.11, 9139.78, 9144.99, 15.676753], [1524890040000, 9145.0, 9145.98, 9135.0, 9136.0, 9.869303], [1524890100000, 9143.98, 9150.58, 9131.0, 9144.15, 14.978063], [1524890160000, 9146.81, 9155.0, 9142.0, 9146.84, 10.899667], [1524890220000, 9150.0, 9151.14, 9146.82, 9146.89, 12.519239], [1524890280000, 9146.84, 9150.0, 9137.0, 9142.77, 15.593112], [1524890340000, 9144.36, 9151.0, 9142.81, 9149.8, 8.018637], [1524890400000, 9149.8, 9157.33, 9147.0, 9154.36, 13.036719], [1524890460000, 9157.34, 9165.47, 9155.66, 9165.15, 10.719954], [1524890520000, 9165.15, 9165.47, 9150.03, 9158.98, 12.931877], [1524890580000, 9154.49, 9158.96, 9150.03, 9150.04, 3.935643], [1524890640000, 9150.04, 9154.99, 9148.01, 9148.01, 6.420671], [1524890700000, 9148.01, 9158.0, 9146.0, 9157.0, 21.272533], [1524890760000, 9150.0, 9157.0, 9150.0, 9155.91, 5.868529], [1524890820000, 9155.0, 9156.95, 9150.03, 9150.04, 7.107126], [1524890880000, 9155.63, 9157.0, 9150.04, 9151.02, 6.654704], [1524890940000, 9152.9, 9154.77, 9144.36, 9148.05, 20.854348], [1524891000000, 9149.8, 9150.0, 9128.99, 9140.74, 18.895295], [1524891060000, 9140.53, 9140.53, 9125.0, 9129.8, 21.680638], [1524891120000, 9129.8, 9140.75, 9119.28, 9119.28, 10.945016], [1524891180000, 9119.29, 9125.0, 9116.0, 9119.99, 12.502371], [1524891240000, 9120.0, 9135.84, 9111.21, 9135.81, 14.011063], [1524891300000, 9135.74, 9140.79, 9121.03, 9140.79, 13.601457], [1524891360000, 9140.79, 9149.0, 9133.72, 9134.11, 7.501947], [1524891420000, 9140.0, 9144.99, 9134.01, 9139.45, 21.895268], [1524891480000, 9139.99, 9144.99, 9138.53, 9138.54, 10.610245], [1524891540000, 9140.0, 9145.0, 9138.53, 9138.53, 82.181794], [1524891600000, 9138.54, 9144.86, 9127.64, 9130.0, 25.433553], [1524891660000, 9130.0, 9157.1, 9130.0, 9157.1, 37.758952], [1524891720000, 9157.1, 9157.1, 9148.92, 9151.0, 11.390051], [1524891780000, 9154.6, 9154.6, 9145.0, 9145.0, 3.178034], [1524891840000, 9145.0, 9150.87, 9141.34, 9145.0, 6.161642], [1524891900000, 9144.0, 9148.07, 9142.0, 9144.01, 4.65975], [1524891960000, 9147.7, 9147.71, 9144.0, 9144.0, 3.760905], [1524892020000, 9144.01, 9160.28, 9144.01, 9160.28, 29.10883], [1524892080000, 9160.21, 9168.2, 9157.0, 9160.01, 43.39648], [1524892140000, 9160.02, 9168.09, 9160.0, 9168.09, 7.388921], [1524892200000, 9168.01, 9168.01, 9161.02, 9161.03, 5.964761], [1524892260000, 9161.04, 9168.01, 9161.02, 9167.06, 10.705886], [1524892320000, 9162.01, 9173.0, 9162.01, 9173.0, 29.814331], [1524892380000, 9173.0, 9184.8, 9172.03, 9177.78, 45.707892], [1524892440000, 9180.55, 9183.75, 9177.01, 9180.02, 4.468195], [1524892500000, 9180.02, 9188.5, 9178.1, 9181.67, 18.177088], [1524892560000, 9183.83, 9185.99, 9167.06, 9171.0, 11.890326], [1524892620000, 9173.0, 9174.0, 9171.0, 9172.01, 11.964617], [1524892680000, 9172.0, 9176.94, 9171.01, 9172.04, 9.633371], [1524892740000, 9174.49, 9176.93, 9171.0, 9172.05, 14.632832], [1524892800000, 9171.01, 9173.01, 9170.02, 9172.98, 16.325621], [1524892860000, 9172.98, 9173.0, 9170.0, 9172.98, 14.299663], [1524892920000, 9172.97, 9176.93, 9171.01, 9176.92, 10.368081], [1524892980000, 9176.91, 9176.93, 9173.0, 9175.26, 9.818305], [1524893040000, 9175.0, 9175.82, 9173.0, 9175.0, 5.077018], [1524893100000, 9175.0, 9177.78, 9173.05, 9175.1, 13.771533], [1524893160000, 9175.2, 9177.78, 9151.59, 9167.8, 39.860486], [1524893220000, 9167.8, 9167.8, 9151.73, 9151.73, 11.827633], [1524893280000, 9153.77, 9168.7, 9151.73, 9160.18, 8.242935], [1524893340000, 9160.18, 9164.19, 9151.45, 9157.1, 56.531984], [1524893400000, 9157.0, 9164.18, 9157.0, 9163.99, 21.869965], [1524893460000, 9161.19, 9163.75, 9144.01, 9153.78, 35.256017], [1524893520000, 9153.5, 9161.16, 9150.98, 9153.78, 11.247645], [1524893580000, 9154.3, 9161.89, 9152.0, 9157.0, 17.214401], [1524893640000, 9160.0, 9164.0, 9152.09, 9152.09, 15.569929], [1524893700000, 9153.77, 9163.57, 9150.51, 9153.82, 8.091377], [1524893760000, 9153.82, 9162.88, 9150.52, 9154.59, 11.877768], [1524893820000, 9151.01, 9160.0, 9141.3, 9141.3, 4.797086], [1524893880000, 9152.38, 9163.56, 9141.7, 9153.34, 9.445447], [1524893940000, 9162.86, 9163.54, 9153.37, 9162.85, 9.969235], [1524894000000, 9160.14, 9162.85, 9146.01, 9155.89, 13.840632], [1524894060000, 9155.87, 9159.96, 9141.3, 9150.0, 7.625787], [1524894120000, 9150.0, 9158.0, 9144.39, 9144.39, 18.989127], [1524894180000, 9150.0, 9158.0, 9147.2, 9153.5, 9.965716], [1524894240000, 9153.5, 9156.99, 9150.0, 9156.99, 4.838564], [1524894300000, 9150.02, 9157.0, 9150.01, 9150.01, 8.33521], [1524894360000, 9150.01, 9153.0, 9140.67, 9146.0, 7.045162], [1524894420000, 9148.09, 9150.0, 9144.48, 9148.61, 2.485056], [1524894480000, 9148.34, 9155.0, 9148.07, 9149.68, 8.862235], [1524894540000, 9149.68, 9155.0, 9148.08, 9153.33, 9.217288], [1524894600000, 9148.09, 9158.0, 9148.08, 9157.0, 12.034898], [1524894660000, 9157.04, 9160.01, 9157.0, 9159.87, 11.606115], [1524894720000, 9157.22, 9162.0, 9157.22, 9157.22, 10.053772], [1524894780000, 9160.18, 9160.19, 9157.06, 9157.06, 12.979205], [1524894840000, 9157.06, 9160.19, 9150.0, 9160.19, 11.172469], [1524894900000, 9160.19, 9163.78, 9160.0, 9160.2, 27.477981], [1524894960000, 9163.54, 9168.72, 9160.0, 9160.0, 23.518483], [1524895020000, 9162.0, 9166.51, 9152.0, 9158.73, 28.20967], [1524895080000, 9153.15, 9167.0, 9153.15, 9165.0, 26.473761], [1524895140000, 9166.51, 9169.0, 9161.0, 9164.49, 12.635646], [1524895200000, 9164.48, 9168.0, 9160.01, 9166.99, 10.716273], [1524895260000, 9166.97, 9171.79, 9160.2, 9167.0, 17.464059], [1524895320000, 9162.11, 9175.0, 9162.11, 9174.0, 14.267714], [1524895380000, 9174.01, 9175.0, 9163.73, 9164.01, 18.893037], [1524895440000, 9164.01, 9175.1, 9164.0, 9165.06, 9.132571], [1524895500000, 9165.06, 9175.53, 9165.06, 9175.01, 19.621863], [1524895560000, 9170.01, 9175.06, 9166.0, 9174.98, 28.122135], [1524895620000, 9172.03, 9174.98, 9169.01, 9174.85, 24.969758], [1524895680000, 9174.97, 9179.78, 9170.04, 9179.78, 40.983167], [1524895740000, 9179.0, 9198.61, 9175.0, 9175.0, 100.386187], [1524895800000, 9175.0, 9189.88, 9169.9, 9180.0, 32.950486], [1524895860000, 9177.17, 9196.1, 9177.17, 9185.86, 39.827072], [1524895920000, 9194.61, 9199.99, 9185.56, 9190.73, 22.891666], [1524895980000, 9190.73, 9199.99, 9182.46, 9182.69, 31.705204], [1524896040000, 9182.69, 9190.62, 9180.0, 9189.93, 22.660791], [1524896100000, 9189.93, 9190.0, 9182.52, 9187.59, 31.596065], [1524896160000, 9189.0, 9189.99, 9177.08, 9182.6, 36.043226], [1524896220000, 9180.3, 9187.0, 9177.08, 9187.0, 15.907732], [1524896280000, 9185.88, 9199.0, 9185.88, 9195.0, 8.429153], [1524896340000, 9195.01, 9200.0, 9195.01, 9196.01, 18.468903], [1524896400000, 9199.99, 9200.0, 9190.74, 9190.74, 38.707795], [1524896460000, 9194.72, 9195.0, 9181.0, 9181.0, 21.411635], [1524896520000, 9185.38, 9185.83, 9175.0, 9184.75, 14.183524], [1524896580000, 9184.68, 9185.0, 9170.0, 9178.0, 14.447119], [1524896640000, 9175.0, 9179.89, 9170.38, 9179.89, 12.590333], [1524896700000, 9179.79, 9183.0, 9176.0, 9183.0, 5.480308], [1524896760000, 9182.99, 9184.0, 9170.3, 9177.97, 13.84091], [1524896820000, 9182.61, 9182.61, 9170.02, 9170.03, 8.111331], [1524896880000, 9170.03, 9180.3, 9170.02, 9178.98, 4.297333], [1524896940000, 9175.32, 9185.13, 9174.78, 9184.0, 20.339934], [1524897000000, 9184.01, 9189.88, 9182.0, 9186.0, 9.416579], [1524897060000, 9188.88, 9188.94, 9175.0, 9182.29, 11.748176], [1524897120000, 9184.58, 9190.0, 9180.0, 9189.94, 8.540398], [1524897180000, 9189.84, 9198.03, 9189.84, 9198.03, 32.055175], [1524897240000, 9198.03, 9200.28, 9198.03, 9200.02, 40.060225], [1524897300000, 9200.12, 9200.77, 9191.89, 9200.72, 17.650355], [1524897360000, 9195.02, 9200.89, 9180.0, 9180.37, 24.026158], [1524897420000, 9186.01, 9194.54, 9180.0, 9180.0, 8.858097], [1524897480000, 9181.63, 9198.71, 9180.0, 9195.05, 18.384885], [1524897540000, 9195.04, 9197.11, 9180.72, 9182.0, 12.610938], [1524897600000, 9182.0, 9196.22, 9181.11, 9196.21, 24.245478], [1524897660000, 9196.21, 9200.3, 9188.65, 9195.0, 25.593872], [1524897720000, 9195.0, 9199.9, 9190.02, 9195.0, 25.399949], [1524897780000, 9195.0, 9199.99, 9190.05, 9199.99, 21.74651], [1524897840000, 9199.0, 9209.8, 9191.12, 9203.0, 45.779633], [1524897900000, 9203.0, 9209.8, 9200.0, 9203.02, 23.365827], [1524897960000, 9204.0, 9208.0, 9204.0, 9204.03, 19.738422], [1524898020000, 9204.04, 9211.74, 9204.0, 9205.0, 20.364006], [1524898080000, 9210.0, 9215.66, 9205.0, 9212.01, 13.899875], [1524898140000, 9212.0, 9215.66, 9212.0, 9215.0, 18.132992], [1524898200000, 9215.0, 9215.0, 9205.02, 9213.94, 27.350778], [1524898260000, 9206.73, 9213.75, 9190.81, 9195.22, 30.195045], [1524898320000, 9204.15, 9204.15, 9178.35, 9195.82, 39.949863], [1524898380000, 9193.44, 9199.0, 9181.89, 9193.0, 5.939644], [1524898440000, 9195.0, 9195.14, 9185.0, 9189.89, 15.339232], [1524898500000, 9187.0, 9189.86, 9175.0, 9175.0, 11.665177], [1524898560000, 9179.99, 9182.99, 9174.22, 9182.92, 22.588183], [1524898620000, 9178.98, 9182.92, 9175.0, 9175.0, 17.525565], [1524898680000, 9178.74, 9178.87, 9150.67, 9162.0, 41.123915], [1524898740000, 9159.02, 9180.36, 9159.02, 9163.03, 17.067539], [1524898800000, 9163.02, 9171.07, 9160.0, 9163.03, 7.903137], [1524898860000, 9168.0, 9170.72, 9162.9, 9163.02, 19.593633], [1524898920000, 9163.02, 9163.02, 9132.71, 9139.0, 37.31577], [1524898980000, 9138.99, 9153.14, 9133.66, 9142.0, 31.331064], [1524899040000, 9142.0, 9149.0, 9130.02, 9135.29, 44.068329], [1524899100000, 9136.0, 9136.01, 9131.28, 9135.01, 81.445142], [1524899160000, 9134.22, 9135.01, 9129.1, 9129.92, 24.732127], [1524899220000, 9129.92, 9135.01, 9128.13, 9135.01, 48.854017], [1524899280000, 9135.01, 9135.01, 9131.03, 9131.99, 14.135783], [1524899340000, 9131.04, 9133.0, 9128.0, 9132.98, 10.389048], [1524899400000, 9132.99, 9160.6, 9132.98, 9146.08, 40.32353], [1524899460000, 9146.1, 9155.23, 9142.02, 9151.99, 7.097705], [1524899520000, 9151.99, 9152.0, 9145.97, 9151.99, 17.102068], [1524899580000, 9151.99, 9155.99, 9146.0, 9155.99, 16.616679], [1524899640000, 9159.99, 9160.0, 9147.0, 9150.99, 7.336379], [1524899700000, 9151.0, 9157.85, 9147.18, 9150.46, 11.827381], [1524899760000, 9153.0, 9154.99, 9147.1, 9148.07, 6.361516], [1524899820000, 9147.1, 9150.0, 9146.0, 9150.0, 10.999999], [1524899880000, 9150.0, 9150.0, 9147.1, 9150.0, 12.852867], [1524899940000, 9150.0, 9150.0, 9147.74, 9147.74, 15.831034], [1524900000000, 9147.74, 9153.0, 9147.1, 9151.5, 9.983281], [1524900060000, 9151.1, 9159.0, 9151.0, 9154.04, 11.644442], [1524900120000, 9154.04, 9160.0, 9154.0, 9154.19, 9.461819], [1524900180000, 9154.19, 9161.01, 9154.19, 9160.99, 8.439433], [1524900240000, 9160.99, 9164.19, 9160.11, 9164.12, 12.10761], [1524900300000, 9164.18, 9165.0, 9155.98, 9155.99, 26.816337], [1524900360000, 9155.98, 9164.0, 9154.1, 9161.99, 10.339696], [1524900420000, 9157.0, 9161.99, 9155.93, 9156.02, 3.684383], [1524900480000, 9158.99, 9160.0, 9153.65, 9153.65, 10.185363], [1524900540000, 9154.08, 9154.08, 9153.6, 9153.67, 13.838143], [1524900600000, 9153.67, 9154.08, 9151.0, 9151.0, 9.326824], [1524900660000, 9151.0, 9152.73, 9126.01, 9132.01, 41.373918], [1524900720000, 9135.0, 9137.57, 9132.0, 9135.0, 17.196467], [1524900780000, 9134.59, 9145.0, 9133.0, 9137.65, 21.171597], [1524900840000, 9137.65, 9147.93, 9133.02, 9136.23, 37.821322], [1524900900000, 9140.53, 9144.97, 9133.04, 9136.15, 34.447236], [1524900960000, 9136.15, 9139.9, 9130.0, 9132.93, 14.574198], [1524901020000, 9132.93, 9135.0, 9117.58, 9123.33, 20.457075], [1524901080000, 9120.0, 9124.97, 9109.0, 9113.96, 53.879874], [1524901140000, 9119.98, 9128.0, 9108.99, 9125.0, 16.902655], [1524901200000, 9125.86, 9142.1, 9118.6, 9124.93, 43.62554], [1524901260000, 9135.22, 9135.25, 9124.92, 9135.25, 12.967262], [1524901320000, 9135.26, 9139.59, 9130.0, 9130.0, 7.404202], [1524901380000, 9130.0, 9134.99, 9124.92, 9130.0, 13.318739], [1524901440000, 9125.01, 9130.0, 9124.45, 9124.92, 9.536456], [1524901500000, 9129.81, 9129.81, 9111.72, 9118.6, 12.710251], [1524901560000, 9118.61, 9123.0, 9110.0, 9117.9, 30.629049], [1524901620000, 9117.0, 9122.96, 9110.02, 9119.95, 26.57151], [1524901680000, 9119.99, 9120.0, 9112.11, 9119.98, 23.253989], [1524901740000, 9116.46, 9129.0, 9116.46, 9125.03, 36.3188], [1524901800000, 9125.03, 9130.0, 9125.0, 9128.0, 18.302724], [1524901860000, 9128.0, 9134.9, 9125.04, 9130.05, 6.207821], [1524901920000, 9130.05, 9134.98, 9130.01, 9134.9, 16.138173], [1524901980000, 9134.89, 9137.65, 9134.19, 9134.99, 13.646724], [1524902040000, 9135.0, 9145.0, 9134.19, 9140.02, 22.843426], [1524902100000, 9140.02, 9140.02, 9127.62, 9127.62, 21.967406], [1524902160000, 9127.62, 9135.13, 9120.08, 9122.93, 14.386954], [1524902220000, 9122.94, 9134.47, 9122.94, 9126.2, 3.619771], [1524902280000, 9126.21, 9131.99, 9125.1, 9127.99, 10.175077], [1524902340000, 9125.1, 9130.0, 9118.7, 9126.22, 9.70806], [1524902400000, 9121.05, 9126.21, 9115.0, 9119.01, 18.83437], [1524902460000, 9119.98, 9124.89, 9110.33, 9112.55, 21.26476], [1524902520000, 9113.88, 9120.0, 9111.0, 9119.0, 5.211686], [1524902580000, 9115.03, 9118.0, 9106.1, 9114.89, 14.289394], [1524902640000, 9114.89, 9115.0, 9106.81, 9114.0, 12.831781], [1524902700000, 9114.0, 9114.93, 9102.0, 9102.49, 15.76316], [1524902760000, 9102.49, 9112.0, 9090.8, 9096.58, 92.550754], [1524902820000, 9100.01, 9107.0, 9085.0, 9085.17, 25.07308], [1524902880000, 9085.17, 9097.49, 9084.73, 9090.01, 15.131159], [1524902940000, 9094.21, 9096.0, 9086.34, 9095.98, 25.088172], [1524903000000, 9091.11, 9102.0, 9091.1, 9100.31, 11.802174], [1524903060000, 9100.32, 9100.32, 9083.03, 9083.05, 23.580642], [1524903120000, 9083.05, 9096.0, 9081.02, 9083.06, 19.474728], [1524903180000, 9091.98, 9092.0, 9083.01, 9090.0, 12.411338], [1524903240000, 9090.0, 9092.0, 9083.62, 9088.99, 25.971319], [1524903300000, 9089.0, 9100.0, 9085.02, 9092.0, 29.786101], [1524903360000, 9092.0, 9096.26, 9085.06, 9086.97, 11.903341], [1524903420000, 9086.97, 9100.31, 9086.96, 9099.21, 32.561712], [1524903480000, 9099.41, 9110.0, 9099.41, 9103.0, 10.660779], [1524903540000, 9103.01, 9110.0, 9103.01, 9106.64, 20.407206], [1524903600000, 9106.64, 9110.0, 9090.48, 9090.48, 23.81261], [1524903660000, 9091.53, 9099.0, 9090.49, 9098.0, 26.886532], [1524903720000, 9094.28, 9099.9, 9088.98, 9098.0, 36.664293], [1524903780000, 9094.99, 9098.0, 9092.0, 9097.98, 16.833058], [1524903840000, 9097.98, 9098.0, 9089.33, 9090.5, 20.307329], [1524903900000, 9090.5, 9094.99, 9090.5, 9094.0, 6.305896], [1524903960000, 9094.0, 9098.0, 9090.62, 9093.38, 13.309881], [1524904020000, 9097.99, 9097.99, 9090.63, 9092.02, 8.699278], [1524904080000, 9093.3, 9098.0, 9086.96, 9097.99, 17.433714], [1524904140000, 9095.0, 9098.0, 9088.96, 9090.0, 12.553804], [1524904200000, 9090.0, 9147.0, 9088.96, 9133.84, 61.044089], [1524904260000, 9140.78, 9159.0, 9130.07, 9148.27, 82.680805], [1524904320000, 9148.75, 9174.0, 9148.27, 9174.0, 30.836378], [1524904380000, 9171.34, 9210.0, 9171.3, 9209.93, 69.308281], [1524904440000, 9209.93, 9258.0, 9209.93, 9246.33, 184.591907], [1524904500000, 9246.33, 9285.25, 9246.3, 9285.0, 180.734145], [1524904560000, 9283.24, 9294.0, 9275.58, 9293.02, 94.699067], [1524904620000, 9294.0, 9298.72, 9275.57, 9279.99, 85.722201], [1524904680000, 9275.57, 9280.88, 9266.0, 9273.01, 73.633143], [1524904740000, 9273.01, 9279.0, 9265.42, 9271.06, 46.546167], [1524904800000, 9274.97, 9280.0, 9267.55, 9280.0, 33.081096], [1524904860000, 9280.0, 9322.31, 9276.46, 9310.01, 136.765936], [1524904920000, 9310.01, 9328.0, 9310.01, 9328.0, 82.845912], [1524904980000, 9322.76, 9330.0, 9300.0, 9301.02, 134.673062], [1524905040000, 9301.02, 9320.0, 9300.17, 9320.0, 57.677947], [1524905100000, 9315.0, 9325.0, 9310.04, 9313.0, 63.884951], [1524905160000, 9316.0, 9319.7, 9291.78, 9291.78, 122.209589], [1524905220000, 9290.0, 9297.5, 9276.82, 9283.89, 43.438007], [1524905280000, 9287.94, 9312.99, 9283.89, 9300.1, 56.41405], [1524905340000, 9300.12, 9310.08, 9294.73, 9294.76, 19.872333], [1524905400000, 9295.0, 9307.0, 9294.0, 9300.08, 24.242088], [1524905460000, 9300.08, 9303.03, 9285.0, 9290.0, 14.485662], [1524905520000, 9290.0, 9294.7, 9281.0, 9290.0, 30.787312], [1524905580000, 9290.0, 9293.99, 9283.57, 9284.05, 23.906592], [1524905640000, 9284.05, 9292.69, 9283.0, 9292.69, 32.984705], [1524905700000, 9293.98, 9300.08, 9285.39, 9300.06, 31.968803], [1524905760000, 9300.01, 9307.99, 9296.65, 9307.08, 29.071099], [1524905820000, 9307.08, 9312.91, 9305.0, 9309.99, 42.974733], [1524905880000, 9309.99, 9311.96, 9256.0, 9256.01, 143.199672], [1524905940000, 9256.01, 9268.49, 9190.0, 9217.48, 387.06959], [1524906000000, 9227.49, 9237.58, 9155.55, 9199.06, 189.052157], [1524906060000, 9217.03, 9250.0, 9178.0, 9231.86, 106.578592], [1524906120000, 9223.77, 9231.87, 9183.99, 9197.82, 63.969579], [1524906180000, 9200.0, 9217.99, 9190.0, 9214.22, 41.791566], [1524906240000, 9214.2, 9215.0, 9191.17, 9191.17, 48.583828], [1524906300000, 9191.17, 9198.89, 9183.99, 9189.2, 39.802638], [1524906360000, 9189.18, 9189.21, 9155.06, 9180.0, 55.456572], [1524906420000, 9180.0, 9192.7, 9174.49, 9185.0, 52.11393], [1524906480000, 9186.77, 9223.78, 9184.08, 9219.46, 57.855014], [1524906540000, 9219.46, 9223.78, 9200.0, 9223.65, 31.366282], [1524906600000, 9219.0, 9223.77, 9210.0, 9222.94, 20.706363], [1524906660000, 9218.02, 9222.0, 9210.52, 9219.0, 8.558388], [1524906720000, 9218.99, 9218.99, 9202.0, 9206.81, 20.131123], [1524906780000, 9210.5, 9212.0, 9200.0, 9200.0, 24.028838], [1524906840000, 9200.0, 9200.0, 9184.07, 9195.61, 20.415518], [1524906900000, 9195.6, 9207.12, 9191.79, 9202.75, 48.244251], [1524906960000, 9202.75, 9210.0, 9195.0, 9207.0, 10.020061], [1524907020000, 9207.0, 9207.36, 9182.0, 9182.0, 28.699181], [1524907080000, 9189.85, 9190.07, 9171.02, 9180.0, 37.176748], [1524907140000, 9171.05, 9195.89, 9171.03, 9195.87, 26.415381], [1524907200000, 9192.99, 9195.89, 9188.12, 9195.89, 7.479244], [1524907260000, 9195.89, 9206.83, 9195.89, 9201.99, 9.864965], [1524907320000, 9201.0, 9227.91, 9201.0, 9225.0, 64.644316], [1524907380000, 9227.91, 9231.87, 9215.82, 9215.82, 49.386222], [1524907440000, 9217.07, 9224.99, 9215.82, 9224.99, 7.754905], [1524907500000, 9223.02, 9227.98, 9221.0, 9227.98, 7.650984], [1524907560000, 9227.0, 9266.69, 9227.0, 9262.51, 51.565991], [1524907620000, 9257.0, 9280.35, 9241.0, 9270.15, 96.606695], [1524907680000, 9279.0, 9288.0, 9259.98, 9264.0, 33.08526], [1524907740000, 9264.0, 9279.99, 9256.01, 9276.13, 11.898551], [1524907800000, 9270.0, 9280.0, 9253.0, 9265.96, 97.878643], [1524907860000, 9265.89, 9266.0, 9253.0, 9255.79, 15.292248], [1524907920000, 9255.79, 9257.99, 9245.0, 9245.03, 10.912108], [1524907980000, 9245.03, 9251.47, 9245.02, 9247.42, 14.069335], [1524908040000, 9249.0, 9251.5, 9247.44, 9248.03, 14.715889], [1524908100000, 9248.03, 9248.36, 9240.0, 9242.01, 17.702285], [1524908160000, 9244.99, 9245.2, 9224.11, 9233.92, 34.967873], [1524908220000, 9233.92, 9269.15, 9225.31, 9269.15, 16.938182], [1524908280000, 9257.78, 9300.4, 9257.78, 9297.67, 163.330222], [1524908340000, 9276.19, 9293.65, 9260.0, 9279.0, 24.352667], [1524908400000, 9272.63, 9286.27, 9269.02, 9280.88, 26.322845], [1524908460000, 9280.11, 9285.0, 9280.0, 9280.01, 23.628367], [1524908520000, 9280.04, 9285.0, 9278.0, 9278.0, 30.323808], [1524908580000, 9280.1, 9280.1, 9269.03, 9273.99, 9.660972], [1524908640000, 9273.0, 9275.0, 9270.0, 9275.0, 17.700082], [1524908700000, 9275.0, 9280.0, 9270.12, 9280.0, 8.520378], [1524908760000, 9280.0, 9280.0, 9272.01, 9275.0, 22.239112], [1524908820000, 9276.29, 9280.06, 9275.0, 9278.73, 12.609659], [1524908880000, 9278.73, 9280.08, 9278.73, 9280.05, 6.646339], [1524908940000, 9280.03, 9280.06, 9274.99, 9276.85, 8.1703], [1524909000000, 9276.85, 9276.85, 9270.22, 9273.97, 9.195855], [1524909060000, 9271.12, 9274.99, 9271.11, 9274.99, 8.087431], [1524909120000, 9274.99, 9274.99, 9252.71, 9254.56, 36.61168], [1524909180000, 9254.56, 9264.95, 9242.07, 9264.95, 19.701796], [1524909240000, 9260.72, 9265.42, 9252.2, 9260.0, 7.118839], [1524909300000, 9256.05, 9265.42, 9256.05, 9257.14, 6.515954], [1524909360000, 9257.14, 9267.0, 9257.14, 9257.83, 10.279723], [1524909420000, 9262.18, 9270.0, 9257.81, 9270.0, 14.078611], [1524909480000, 9270.0, 9274.99, 9267.0, 9274.97, 7.568269], [1524909540000, 9274.96, 9275.0, 9270.34, 9273.0, 6.992468], [1524909600000, 9273.0, 9275.0, 9271.0, 9271.0, 9.499706], [1524909660000, 9271.96, 9275.0, 9270.0, 9273.94, 7.419038], [1524909720000, 9273.93, 9273.94, 9263.12, 9268.71, 7.503009], [1524909780000, 9268.71, 9269.01, 9265.43, 9266.0, 4.680454], [1524909840000, 9268.84, 9273.92, 9266.0, 9272.03, 7.242068], [1524909900000, 9272.05, 9279.95, 9272.04, 9273.0, 15.53934], [1524909960000, 9275.76, 9278.89, 9275.5, 9275.77, 6.121931], [1524910020000, 9276.02, 9307.0, 9275.77, 9307.0, 111.291589], [1524910080000, 9307.0, 9310.0, 9257.8, 9261.39, 175.669331], [1524910140000, 9262.05, 9294.99, 9262.05, 9286.96, 14.439159], [1524910200000, 9280.75, 9309.51, 9280.75, 9309.49, 20.011098], [1524910260000, 9309.51, 9309.51, 9270.0, 9284.35, 47.966059], [1524910380000, 9299.87, 9299.87, 9296.42, 9299.87, 0.897399], [1524910440000, 9266.08, 9276.99, 9253.65, 9266.85, 13.579068]], "3m": [[1524820320000, 9256.54, 9268.99, 9256.53, 9268.0, 17.965908], [1524820500000, 9261.0, 9275.0, 9260.34, 9274.99, 22.587311], [1524820680000, 9274.99, 9279.0, 9269.0, 9277.77, 27.156959], [1524820860000, 9278.38, 9279.88, 9255.13, 9259.11, 70.514853], [1524821040000, 9259.11, 9272.9, 9251.53, 9267.0, 38.15932], [1524821220000, 9268.94, 9274.99, 9260.0, 9265.0, 58.595767], [1524821400000, 9266.01, 9266.01, 9250.01, 9262.0, 56.010012], [1524821580000, 9262.0, 9274.97, 9257.13, 9273.25, 97.984047], [1524821760000, 9273.62, 9298.42, 9272.0, 9291.06, 136.4422], [1524821940000, 9292.83, 9347.48, 9292.83, 9347.46, 441.835535], [1524822120000, 9346.0, 9361.86, 9339.17, 9348.83, 219.312757], [1524822300000, 9345.0, 9356.0, 9326.81, 9353.72, 95.659175], [1524822480000, 9350.0, 9369.0, 9345.42, 9356.99, 177.619858], [1524822660000, 9356.99, 9366.99, 9351.01, 9364.99, 57.772932], [1524822840000, 9364.99, 9380.0, 9362.65, 9379.91, 105.883418], [1524823020000, 9379.91, 9387.48, 9351.01, 9369.0, 197.09654], [1524823200000, 9369.0, 9376.5, 9334.92, 9334.92, 116.732734], [1524823380000, 9339.88, 9344.99, 9328.05, 9335.02, 85.776468], [1524823560000, 9338.01, 9349.99, 9335.01, 9337.06, 69.922722], [1524823740000, 9337.05, 9350.67, 9337.0, 9350.44, 63.161018], [1524823920000, 9350.42, 9367.23, 9347.02, 9350.0, 59.870558], [1524824100000, 9350.0, 9362.0, 9340.0, 9357.79, 54.228579], [1524824280000, 9357.79, 9376.44, 9355.0, 9375.0, 85.016259], [1524824460000, 9375.0, 9380.0, 9343.0, 9343.0, 113.875959], [1524824640000, 9350.01, 9366.0, 9341.39, 9363.41, 102.475466], [1524824820000, 9364.86, 9375.82, 9363.36, 9368.99, 64.689521], [1524825000000, 9368.99, 9370.98, 9360.0, 9360.43, 65.57585], [1524825180000, 9360.43, 9363.0, 9352.17, 9358.0, 43.782768], [1524825360000, 9358.0, 9362.85, 9352.2, 9362.85, 56.02431], [1524825540000, 9362.85, 9387.48, 9362.85, 9382.0, 189.800147], [1524825720000, 9387.0, 9395.0, 9371.0, 9382.01, 144.384705], [1524825900000, 9382.01, 9382.1, 9365.96, 9372.03, 81.655206], [1524826080000, 9375.98, 9376.0, 9370.0, 9370.7, 58.361986], [1524826260000, 9370.71, 9372.98, 9355.0, 9360.03, 75.920873], [1524826440000, 9362.0, 9362.0, 9350.0, 9359.99, 43.471116], [1524826620000, 9359.99, 9372.0, 9351.22, 9365.0, 42.029951], [1524826800000, 9363.31, 9367.97, 9361.0, 9362.0, 29.529304], [1524826980000, 9361.99, 9365.0, 9335.93, 9344.02, 132.678762], [1524827160000, 9344.02, 9349.0, 9337.77, 9345.49, 49.160885], [1524827340000, 9344.0, 9352.03, 9340.2, 9341.98, 31.052667], [1524827520000, 9341.5, 9354.0, 9340.21, 9340.21, 40.056582], [1524827700000, 9340.22, 9340.22, 9290.03, 9325.0, 200.422239], [1524827880000, 9325.0, 9325.04, 9301.0, 9313.34, 116.090073], [1524828060000, 9319.89, 9326.0, 9312.2, 9325.0, 50.718729], [1524828240000, 9326.0, 9340.0, 9321.02, 9326.02, 36.874643], [1524828420000, 9331.0, 9345.52, 9321.0, 9345.52, 49.782262], [1524828600000, 9343.0, 9345.54, 9335.0, 9335.01, 78.864618], [1524828780000, 9340.0, 9340.0, 9325.03, 9325.03, 31.208146], [1524828960000, 9325.02, 9329.84, 9320.0, 9323.06, 24.731149], [1524829140000, 9325.01, 9334.97, 9312.21, 9319.0, 67.560604], [1524829320000, 9318.99, 9321.2, 9280.59, 9300.0, 108.894507], [1524829500000, 9305.0, 9309.09, 9297.2, 9307.9, 50.701482], [1524829680000, 9307.9, 9329.1, 9300.06, 9320.94, 41.39432], [1524829860000, 9320.94, 9335.18, 9320.94, 9326.0, 35.469982], [1524830040000, 9326.0, 9332.91, 9312.6, 9315.78, 60.475868], [1524830220000, 9316.0, 9320.91, 9305.05, 9309.0, 95.250001], [1524830400000, 9308.9, 9320.86, 9308.9, 9310.0, 71.940021], [1524830580000, 9310.0, 9339.0, 9310.0, 9332.54, 102.497348], [1524830760000, 9332.54, 9338.99, 9332.0, 9336.08, 64.478181], [1524830940000, 9332.9, 9351.0, 9332.89, 9350.49, 46.805781], [1524831120000, 9350.5, 9355.0, 9334.1, 9345.0, 41.604706], [1524831300000, 9342.0, 9349.97, 9341.17, 9349.97, 63.043365], [1524831480000, 9347.99, 9348.84, 9345.58, 9345.98, 42.132927], [1524831660000, 9345.98, 9346.0, 9332.01, 9332.9, 49.657427], [1524831840000, 9332.89, 9348.09, 9325.0, 9340.22, 47.102398], [1524832020000, 9340.23, 9349.99, 9340.23, 9349.9, 21.433876], [1524832200000, 9349.9, 9350.0, 9343.0, 9343.0, 65.370408], [1524832380000, 9343.01, 9347.01, 9330.0, 9340.04, 66.805453], [1524832560000, 9345.0, 9345.0, 9326.04, 9335.02, 48.094731], [1524832740000, 9336.53, 9343.0, 9330.01, 9343.0, 97.387798], [1524832920000, 9342.99, 9347.0, 9337.72, 9339.01, 55.217177], [1524833100000, 9339.01, 9347.73, 9327.01, 9336.0, 34.596278], [1524833280000, 9336.0, 9337.3, 9301.0, 9307.0, 81.581592], [1524833460000, 9307.0, 9307.0, 9275.0, 9280.0, 105.926872], [1524833640000, 9275.01, 9290.0, 9253.68, 9284.0, 160.186873], [1524833820000, 9284.0, 9291.48, 9281.91, 9290.07, 43.513576], [1524834000000, 9290.01, 9295.0, 9273.97, 9290.01, 73.095565], [1524834180000, 9293.0, 9318.62, 9290.0, 9300.02, 102.793253], [1524834360000, 9298.0, 9300.01, 9282.15, 9289.0, 85.070729], [1524834540000, 9285.01, 9295.64, 9265.51, 9265.51, 91.552856], [1524834720000, 9267.99, 9268.0, 9240.21, 9241.01, 144.536543], [1524834900000, 9241.01, 9265.99, 9241.01, 9260.52, 72.524353], [1524835080000, 9264.0, 9264.0, 9245.13, 9245.44, 49.827845], [1524835260000, 9245.26, 9249.98, 9150.1, 9214.82, 602.329619], [1524835440000, 9214.82, 9228.3, 9185.96, 9197.43, 244.386207], [1524835620000, 9193.48, 9209.96, 9190.0, 9190.01, 101.87155], [1524835800000, 9190.01, 9202.39, 9171.45, 9178.69, 126.213129], [1524835980000, 9178.0, 9199.95, 9155.46, 9189.8, 203.826822], [1524836160000, 9188.39, 9235.29, 9188.39, 9214.93, 147.674722], [1524836340000, 9206.05, 9218.0, 9205.04, 9215.01, 49.497703], [1524836520000, 9215.01, 9250.0, 9214.0, 9221.0, 115.555892], [1524836700000, 9220.99, 9230.0, 9215.0, 9229.0, 54.778977], [1524836880000, 9229.0, 9232.0, 9201.0, 9213.93, 112.585161], [1524837060000, 9201.5, 9228.81, 9199.99, 9216.26, 65.663044], [1524837240000, 9216.26, 9231.5, 9212.9, 9228.0, 39.067736], [1524837420000, 9225.0, 9228.0, 9212.92, 9225.0, 42.220619], [1524837600000, 9226.97, 9228.91, 9202.0, 9212.9, 32.568979], [1524837780000, 9206.0, 9216.0, 9204.0, 9209.99, 36.509131], [1524837960000, 9204.09, 9220.0, 9204.07, 9213.01, 43.474957], [1524838140000, 9216.0, 9245.99, 9213.02, 9230.5, 53.993018], [1524838320000, 9233.0, 9249.0, 9228.0, 9240.0, 52.906225], [1524838500000, 9239.99, 9242.0, 9230.0, 9241.92, 44.916272], [1524838680000, 9241.93, 9241.93, 9231.61, 9234.0, 52.614045], [1524838860000, 9234.0, 9270.36, 9231.61, 9264.34, 132.161129], [1524839040000, 9256.33, 9266.64, 9240.11, 9247.29, 84.037582], [1524839220000, 9247.29, 9266.65, 9240.0, 9260.15, 67.452543], [1524839400000, 9260.15, 9275.0, 9244.67, 9254.47, 71.115597], [1524839580000, 9253.17, 9254.47, 9234.25, 9242.7, 60.076551], [1524839760000, 9236.0, 9243.99, 9219.01, 9227.99, 64.89765], [1524839940000, 9228.0, 9249.87, 9220.49, 9241.24, 98.783849], [1524840120000, 9241.24, 9259.99, 9241.24, 9253.04, 55.913855], [1524840300000, 9253.11, 9271.37, 9253.04, 9266.01, 77.407825], [1524840480000, 9266.01, 9268.62, 9253.04, 9254.11, 71.232061], [1524840660000, 9254.11, 9268.61, 9250.0, 9260.0, 89.920267], [1524840840000, 9260.0, 9271.68, 9256.01, 9270.99, 74.372854], [1524841020000, 9271.68, 9290.0, 9270.99, 9288.88, 136.704285], [1524841200000, 9280.14, 9288.88, 9250.0, 9250.03, 91.547571], [1524841380000, 9260.29, 9265.35, 9250.02, 9256.0, 84.489888], [1524841560000, 9256.36, 9268.02, 9251.0, 9265.01, 37.741309], [1524841740000, 9260.0, 9264.01, 9250.2, 9260.0, 71.182635], [1524841920000, 9259.95, 9264.0, 9250.2, 9250.21, 39.051412], [1524842100000, 9250.21, 9264.99, 9237.01, 9245.01, 66.337788], [1524842280000, 9245.02, 9256.0, 9238.55, 9246.87, 91.507637], [1524842460000, 9246.87, 9247.9, 9213.85, 9227.2, 132.740215], [1524842640000, 9230.59, 9237.97, 9210.01, 9228.2, 130.658953], [1524842820000, 9223.33, 9247.36, 9223.33, 9235.0, 100.138943], [1524843000000, 9235.14, 9239.77, 9225.0, 9238.99, 73.381386], [1524843180000, 9238.99, 9245.55, 9236.8, 9241.93, 69.046593], [1524843360000, 9240.01, 9255.1, 9239.71, 9251.48, 57.310136], [1524843540000, 9251.48, 9260.0, 9242.05, 9246.02, 79.332256], [1524843720000, 9246.02, 9255.69, 9246.01, 9251.01, 46.827751], [1524843900000, 9251.01, 9255.69, 9249.99, 9254.73, 41.409231], [1524844080000, 9250.05, 9255.0, 9248.01, 9248.01, 26.559487], [1524844260000, 9248.01, 9250.0, 9240.01, 9242.36, 36.727917], [1524844440000, 9242.35, 9242.5, 9240.01, 9242.5, 34.40672], [1524844620000, 9242.4, 9250.57, 9240.97, 9241.21, 49.561342], [1524844800000, 9241.2, 9285.0, 9241.0, 9280.76, 117.292332], [1524844980000, 9280.76, 9293.0, 9269.0, 9290.14, 84.201974], [1524845160000, 9293.0, 9299.37, 9286.0, 9289.98, 101.056453], [1524845340000, 9294.0, 9297.51, 9282.0, 9294.08, 48.231775], [1524845520000, 9297.51, 9310.96, 9291.03, 9308.87, 139.284508], [1524845700000, 9306.0, 9315.0, 9291.01, 9313.0, 85.993788], [1524845880000, 9313.0, 9328.26, 9300.0, 9301.0, 151.906037], [1524846060000, 9305.0, 9308.32, 9280.0, 9289.99, 104.474608], [1524846240000, 9289.99, 9298.98, 9280.14, 9298.0, 50.097256], [1524846420000, 9298.39, 9298.4, 9293.12, 9297.0, 41.470481], [1524846600000, 9296.95, 9300.0, 9285.05, 9285.35, 58.167533], [1524846780000, 9285.35, 9298.57, 9285.05, 9290.5, 45.941882], [1524846960000, 9290.51, 9290.51, 9276.0, 9279.28, 42.544516], [1524847140000, 9279.28, 9281.97, 9269.0, 9281.97, 41.17794], [1524847320000, 9281.97, 9290.0, 9281.0, 9287.0, 48.609955], [1524847500000, 9290.0, 9294.44, 9285.0, 9290.0, 56.756996], [1524847680000, 9285.0, 9294.02, 9275.78, 9282.06, 33.356792], [1524847860000, 9275.87, 9293.95, 9275.87, 9290.7, 50.686255], [1524848040000, 9292.76, 9299.46, 9285.95, 9294.91, 40.068541], [1524848220000, 9295.13, 9299.99, 9280.0, 9282.1, 54.192479], [1524848400000, 9286.01, 9299.98, 9286.0, 9297.77, 45.197292], [1524848580000, 9297.77, 9297.81, 9295.99, 9295.99, 26.076214], [1524848760000, 9295.99, 9296.02, 9290.0, 9295.03, 27.326209], [1524848940000, 9295.03, 9295.03, 9289.0, 9290.0, 24.139946], [1524849120000, 9290.01, 9293.48, 9269.54, 9280.97, 52.264177], [1524849300000, 9280.97, 9281.5, 9266.0, 9272.99, 100.183547], [1524849480000, 9278.95, 9285.0, 9270.05, 9275.0, 26.919113], [1524849660000, 9275.0, 9292.0, 9272.98, 9291.59, 90.192369], [1524849840000, 9291.49, 9319.99, 9286.02, 9307.01, 62.294069], [1524850020000, 9307.03, 9318.58, 9300.48, 9301.33, 58.610436], [1524850200000, 9301.83, 9308.32, 9298.0, 9298.0, 95.716375], [1524850380000, 9298.0, 9316.0, 9293.0, 9301.82, 29.49499], [1524850560000, 9306.0, 9310.0, 9286.73, 9288.18, 88.044775], [1524850740000, 9288.18, 9299.0, 9282.99, 9297.0, 69.284531], [1524850920000, 9296.2, 9299.0, 9290.0, 9298.0, 63.998894], [1524851100000, 9294.99, 9303.15, 9290.02, 9294.99, 67.721018], [1524851280000, 9294.99, 9299.7, 9291.0, 9292.6, 52.545071], [1524851460000, 9292.6, 9299.0, 9292.52, 9295.22, 47.8328], [1524851640000, 9295.23, 9300.04, 9292.53, 9296.4, 45.05097], [1524851820000, 9296.0, 9305.0, 9290.1, 9290.1, 49.337286], [1524852000000, 9290.1, 9296.31, 9285.0, 9285.0, 51.179159], [1524852180000, 9285.01, 9295.0, 9240.0, 9271.97, 127.587276], [1524852360000, 9271.97, 9280.0, 9260.4, 9278.0, 50.621677], [1524852540000, 9278.0, 9280.0, 9271.06, 9272.0, 28.555642], [1524852720000, 9279.0, 9279.94, 9271.01, 9272.47, 21.805206], [1524852900000, 9272.47, 9282.0, 9272.46, 9280.64, 54.648958], [1524853080000, 9280.64, 9280.64, 9273.0, 9273.0, 63.70994], [1524853260000, 9273.0, 9278.18, 9230.0, 9255.0, 97.297323], [1524853440000, 9239.31, 9258.04, 9225.0, 9244.36, 65.619042], [1524853620000, 9249.0, 9262.0, 9237.69, 9244.93, 38.729004], [1524853800000, 9244.94, 9245.0, 9232.0, 9241.0, 42.380592], [1524853980000, 9238.0, 9243.0, 9220.0, 9223.14, 59.862367], [1524854160000, 9222.01, 9235.0, 9213.8, 9231.73, 64.39189], [1524854340000, 9231.73, 9253.0, 9228.0, 9247.05, 33.632148], [1524854520000, 9249.02, 9271.76, 9242.27, 9252.0, 37.500727], [1524854700000, 9252.0, 9268.99, 9252.0, 9252.07, 33.754603], [1524854880000, 9266.44, 9266.44, 9247.09, 9251.99, 24.376311], [1524855060000, 9251.06, 9251.99, 9240.28, 9245.85, 22.906916], [1524855240000, 9245.84, 9245.84, 9232.4, 9236.6, 34.667013], [1524855420000, 9236.6, 9236.8, 9230.0, 9230.89, 48.681348], [1524855600000, 9230.89, 9231.0, 9220.0, 9223.77, 45.352667], [1524855780000, 9223.77, 9236.4, 9223.76, 9236.4, 49.394287], [1524855960000, 9236.39, 9250.56, 9230.12, 9234.0, 59.029698], [1524856140000, 9230.12, 9236.39, 9222.08, 9225.0, 16.064171], [1524856320000, 9225.01, 9235.0, 9191.0, 9195.04, 152.411743], [1524856500000, 9195.02, 9210.0, 9188.0, 9198.0, 73.010014], [1524856680000, 9198.0, 9219.83, 9193.22, 9202.01, 40.017845], [1524856860000, 9202.01, 9205.0, 9182.5, 9184.24, 96.304923], [1524857040000, 9190.04, 9215.11, 9168.0, 9180.22, 101.067572], [1524857220000, 9185.96, 9200.0, 9175.03, 9190.0, 60.134796], [1524857400000, 9189.85, 9199.0, 9185.02, 9185.11, 45.860247], [1524857580000, 9190.0, 9190.0, 9171.11, 9174.01, 65.14765], [1524857760000, 9174.01, 9195.99, 9170.0, 9184.2, 88.4563], [1524857940000, 9184.19, 9210.0, 9181.07, 9199.99, 54.908563], [1524858120000, 9199.99, 9200.0, 9185.19, 9187.97, 27.362098], [1524858300000, 9185.19, 9190.0, 9171.62, 9174.99, 47.963205], [1524858480000, 9174.99, 9175.52, 9109.0, 9119.98, 367.694199], [1524858660000, 9115.41, 9151.99, 9092.0, 9115.0, 350.722059], [1524858840000, 9111.0, 9125.4, 9102.0, 9115.11, 144.400495], [1524859020000, 9120.0, 9120.0, 9075.01, 9089.0, 211.882908], [1524859200000, 9089.12, 9140.0, 9087.02, 9140.0, 145.995816], [1524859380000, 9132.0, 9153.99, 9126.29, 9142.67, 149.915286], [1524859560000, 9139.99, 9163.38, 9130.95, 9150.0, 76.251713], [1524859740000, 9153.58, 9154.0, 9131.15, 9135.7, 71.002633], [1524859920000, 9140.3, 9144.48, 9132.01, 9133.42, 42.488541], [1524860100000, 9133.42, 9133.42, 9101.0, 9114.97, 72.2149], [1524860280000, 9114.97, 9116.95, 9104.74, 9105.0, 37.643021], [1524860460000, 9105.0, 9114.99, 9096.0, 9100.0, 50.137835], [1524860640000, 9100.0, 9103.0, 9068.42, 9070.0, 177.297302], [1524860820000, 9068.42, 9110.0, 9054.01, 9090.55, 167.125788], [1524861000000, 9090.55, 9098.68, 9055.44, 9060.13, 95.466121], [1524861180000, 9060.14, 9077.0, 9055.0, 9056.22, 74.137342], [1524861360000, 9056.22, 9060.0, 9005.0, 9010.0, 352.701494], [1524861540000, 9010.0, 9022.0, 8960.0, 8961.17, 365.520908], [1524861720000, 8961.17, 8995.0, 8952.0, 8964.99, 334.444216], [1524861900000, 8955.02, 9019.0, 8952.0, 9010.63, 312.750403], [1524862080000, 9010.63, 9018.6, 8961.77, 8978.45, 155.545939], [1524862260000, 8978.45, 9020.0, 8978.45, 8989.92, 127.967408], [1524862440000, 8998.99, 8998.99, 8945.41, 8954.01, 159.428966], [1524862620000, 8954.0, 8984.98, 8940.0, 8970.0, 116.030476], [1524862800000, 8969.99, 8978.0, 8936.0, 8947.7, 145.62345], [1524862980000, 8941.26, 8950.0, 8909.83, 8937.9, 232.297481], [1524863160000, 8928.16, 8967.62, 8926.27, 8955.0, 100.247706], [1524863340000, 8955.0, 9000.0, 8955.0, 9000.0, 120.626183], [1524863520000, 9000.0, 9040.0, 8990.03, 9029.92, 198.373252], [1524863700000, 9024.99, 9053.0, 9020.2, 9040.0, 161.107212], [1524863880000, 9040.2, 9043.96, 9008.59, 9018.9, 116.03357], [1524864060000, 9018.9, 9033.07, 9016.98, 9030.0, 57.620415], [1524864240000, 9030.0, 9035.0, 9021.0, 9021.02, 77.767767], [1524864420000, 9021.02, 9029.0, 8980.0, 8991.0, 105.380504], [1524864600000, 8991.0, 8998.88, 8970.01, 8983.2, 59.730124], [1524864780000, 8984.94, 8998.85, 8980.0, 8991.89, 91.864868], [1524864960000, 8991.89, 9012.57, 8991.89, 9007.04, 50.568993], [1524865140000, 9005.0, 9019.96, 9000.8, 9011.98, 55.586177], [1524865320000, 9011.98, 9018.0, 8990.0, 8995.17, 35.761776], [1524865500000, 8995.17, 8995.17, 8976.05, 8989.93, 58.674216], [1524865680000, 8990.01, 9014.99, 8990.01, 9012.8, 34.628943], [1524865860000, 9014.99, 9042.09, 9013.02, 9025.0, 58.605159], [1524866040000, 9031.11, 9031.12, 9010.0, 9025.0, 45.926732], [1524866220000, 9024.99, 9029.64, 8966.44, 8975.35, 104.809126], [1524866400000, 8975.36, 9005.4, 8975.36, 9000.11, 83.712641], [1524866580000, 9000.13, 9015.0, 8991.9, 8991.92, 76.188776], [1524866760000, 8995.96, 9024.99, 8985.06, 9024.98, 43.594865], [1524866940000, 9024.99, 9043.86, 9024.98, 9040.72, 51.510171], [1524867120000, 9040.74, 9045.0, 9037.61, 9042.67, 45.392008], [1524867300000, 9042.01, 9045.0, 9030.0, 9032.05, 41.883403], [1524867480000, 9032.06, 9035.36, 9024.96, 9034.06, 35.326086], [1524867660000, 9033.99, 9035.38, 9025.57, 9034.95, 18.379881], [1524867840000, 9034.95, 9070.0, 9034.0, 9069.23, 81.194105], [1524868020000, 9069.97, 9073.77, 9060.2, 9071.0, 57.863568], [1524868200000, 9071.0, 9073.77, 9060.0, 9060.01, 60.371898], [1524868380000, 9062.0, 9072.99, 9060.01, 9072.98, 28.522452], [1524868560000, 9072.99, 9078.0, 9070.2, 9074.0, 47.561373], [1524868740000, 9072.02, 9093.09, 9071.18, 9071.47, 91.608396], [1524868920000, 9089.96, 9089.96, 9071.7, 9079.01, 45.202591], [1524869100000, 9085.0, 9085.0, 9051.02, 9060.1, 101.106308], [1524869280000, 9060.1, 9066.05, 9055.0, 9064.0, 36.715127], [1524869460000, 9064.93, 9066.0, 9058.0, 9061.0, 32.673291], [1524869640000, 9061.0, 9068.99, 9042.21, 9043.1, 61.983552], [1524869820000, 9043.08, 9049.0, 9030.01, 9031.0, 36.297484], [1524870000000, 9032.0, 9036.1, 9022.0, 9031.5, 98.299783], [1524870180000, 9030.02, 9037.0, 9025.01, 9037.0, 25.042572], [1524870360000, 9033.28, 9063.61, 9033.28, 9057.37, 56.814258], [1524870540000, 9063.61, 9073.93, 9057.4, 9067.0, 37.254511], [1524870720000, 9067.0, 9072.51, 9043.96, 9056.95, 41.147909], [1524870900000, 9058.99, 9059.0, 9038.0, 9042.94, 33.529981], [1524871080000, 9042.94, 9046.0, 9040.0, 9041.99, 19.387134], [1524871260000, 9040.01, 9045.0, 9040.01, 9044.9, 48.847825], [1524871440000, 9044.99, 9058.99, 9040.01, 9043.0, 23.863377], [1524871620000, 9042.0, 9044.0, 9034.99, 9038.0, 20.939963], [1524871800000, 9038.0, 9038.0, 8970.0, 8999.08, 166.40848], [1524871980000, 9004.83, 9004.83, 8970.1, 8976.97, 82.619744], [1524872160000, 8980.0, 8991.9, 8972.83, 8981.08, 27.002792], [1524872340000, 8981.08, 8996.53, 8981.07, 8991.0, 38.713176], [1524872520000, 8991.0, 8996.67, 8987.92, 8991.0, 77.558981], [1524872700000, 8990.99, 8996.0, 8981.25, 8987.99, 32.275564], [1524872880000, 8989.97, 8990.0, 8968.45, 8975.23, 47.981573], [1524873060000, 8975.02, 8976.99, 8911.01, 8920.0, 155.801824], [1524873240000, 8920.0, 8926.99, 8900.01, 8906.99, 107.746832], [1524873420000, 8900.01, 8929.79, 8889.0, 8915.35, 183.532672], [1524873600000, 8915.35, 8915.35, 8870.0, 8894.01, 224.501377], [1524873780000, 8895.0, 8900.98, 8871.06, 8889.36, 135.198736], [1524873960000, 8899.02, 8930.0, 8888.89, 8928.01, 98.390747], [1524874140000, 8928.01, 8932.8, 8900.0, 8903.98, 80.343379], [1524874320000, 8908.5, 8938.2, 8903.0, 8938.2, 90.694246], [1524874500000, 8938.2, 8947.65, 8916.14, 8926.44, 93.002032], [1524874680000, 8929.03, 8949.01, 8921.0, 8935.03, 97.088986], [1524874860000, 8935.02, 8978.46, 8930.0, 8978.46, 43.247936], [1524875040000, 8978.46, 8987.0, 8965.03, 8974.84, 84.292493], [1524875220000, 8965.02, 8982.72, 8961.71, 8976.98, 31.176037], [1524875400000, 8976.99, 9007.12, 8976.04, 8995.0, 73.267566], [1524875580000, 8995.01, 8997.8, 8976.98, 8985.79, 45.094274], [1524875760000, 8983.0, 9018.9, 8981.0, 9014.79, 61.135426], [1524875940000, 9015.0, 9045.0, 9009.01, 9033.04, 55.549837], [1524876120000, 9033.05, 9049.76, 9022.0, 9040.0, 57.409416], [1524876300000, 9040.0, 9040.09, 9007.2, 9012.82, 60.810408], [1524876480000, 9022.6, 9041.0, 9012.87, 9024.99, 240.42962], [1524876660000, 9024.99, 9027.73, 9018.0, 9020.0, 49.524857], [1524876840000, 9019.0, 9020.0, 8998.0, 9001.21, 64.060588], [1524877020000, 9001.21, 9010.12, 8988.99, 9010.11, 68.822359], [1524877200000, 9005.98, 9029.85, 9005.97, 9025.3, 58.380084], [1524877380000, 9022.8, 9029.85, 9000.0, 9006.64, 97.41693], [1524877560000, 9005.01, 9019.0, 9000.0, 9012.46, 44.839443], [1524877740000, 9012.46, 9019.0, 9012.44, 9018.99, 33.34601], [1524877920000, 9018.99, 9031.85, 9017.91, 9030.01, 58.612312], [1524878100000, 9030.01, 9037.43, 9024.0, 9036.0, 60.849697], [1524878280000, 9036.0, 9042.79, 9032.8, 9033.51, 55.679038], [1524878460000, 9033.51, 9036.21, 9012.45, 9025.54, 56.759371], [1524878640000, 9025.31, 9027.1, 9013.0, 9020.0, 22.856911], [1524878820000, 9020.0, 9035.99, 9015.5, 9035.0, 38.843381], [1524879000000, 9036.0, 9036.71, 9025.01, 9035.58, 16.60223], [1524879180000, 9035.98, 9063.9, 9029.22, 9060.0, 65.38396], [1524879360000, 9060.0, 9072.06, 9060.0, 9070.01, 67.463642], [1524879540000, 9070.01, 9092.54, 9070.0, 9087.84, 115.324786], [1524879720000, 9089.89, 9097.99, 9087.84, 9092.0, 79.63201], [1524879900000, 9095.93, 9095.94, 9075.0, 9089.99, 82.621944], [1524880080000, 9089.99, 9095.16, 9085.14, 9091.98, 66.407365], [1524880260000, 9094.2, 9098.0, 9085.0, 9089.02, 59.223972], [1524880440000, 9089.02, 9096.0, 9084.98, 9095.42, 69.512059], [1524880620000, 9096.0, 9126.81, 9095.42, 9126.81, 149.106303], [1524880800000, 9126.81, 9128.09, 9089.98, 9090.18, 135.439412], [1524880980000, 9099.09, 9111.85, 9090.17, 9111.01, 55.306974], [1524881160000, 9111.0, 9129.17, 9111.0, 9114.01, 68.343487], [1524881340000, 9115.0, 9129.0, 9100.32, 9121.84, 71.456261], [1524881520000, 9121.84, 9128.0, 9100.39, 9110.01, 38.737872], [1524881700000, 9108.0, 9115.0, 9075.19, 9088.03, 124.817208], [1524881880000, 9083.18, 9091.59, 9075.19, 9086.99, 69.308584], [1524882060000, 9086.99, 9118.48, 9080.06, 9111.01, 88.994455], [1524882240000, 9116.94, 9123.03, 9100.0, 9100.0, 93.727575], [1524882420000, 9100.0, 9115.94, 9100.0, 9100.33, 64.118825], [1524882600000, 9100.33, 9109.99, 9100.33, 9108.0, 49.360612], [1524882780000, 9108.99, 9116.58, 9105.21, 9105.25, 41.438874], [1524882960000, 9105.67, 9119.0, 9105.67, 9108.03, 33.483808], [1524883140000, 9108.04, 9112.86, 9100.33, 9101.99, 32.09833], [1524883320000, 9101.5, 9110.01, 9086.7, 9094.98, 57.58695], [1524883500000, 9094.99, 9094.99, 9073.68, 9083.0, 48.110269], [1524883680000, 9083.99, 9093.13, 9073.7, 9073.86, 31.473093], [1524883860000, 9073.86, 9086.99, 9055.0, 9066.24, 95.595213], [1524884040000, 9070.0, 9072.86, 9050.0, 9060.01, 55.108206], [1524884220000, 9065.91, 9070.03, 9053.47, 9055.78, 63.13005], [1524884400000, 9053.47, 9078.9, 9051.0, 9065.0, 21.820567], [1524884580000, 9074.51, 9083.3, 9065.01, 9080.0, 37.440025], [1524884760000, 9082.84, 9086.0, 9078.0, 9085.05, 33.756874], [1524884940000, 9085.0, 9100.0, 9083.3, 9098.38, 58.711865], [1524885120000, 9093.02, 9100.0, 9092.0, 9097.51, 40.84924], [1524885300000, 9096.28, 9097.51, 9093.0, 9096.51, 26.583458], [1524885480000, 9096.51, 9113.7, 9094.5, 9109.0, 57.56701], [1524885660000, 9109.0, 9146.99, 9101.98, 9121.26, 105.681193], [1524885840000, 9125.0, 9130.0, 9120.0, 9122.01, 64.481931], [1524886020000, 9124.99, 9130.26, 9110.46, 9112.27, 31.359973], [1524886200000, 9112.0, 9121.99, 9110.0, 9115.99, 26.434295], [1524886380000, 9114.01, 9130.0, 9114.01, 9124.23, 42.344127], [1524886560000, 9124.23, 9128.48, 9108.94, 9111.01, 43.137785], [1524886740000, 9113.12, 9124.0, 9100.0, 9120.0, 44.9569], [1524886920000, 9113.4, 9120.0, 9106.41, 9114.0, 16.668356], [1524887100000, 9114.0, 9136.01, 9114.0, 9132.57, 40.508622], [1524887280000, 9132.57, 9141.3, 9126.31, 9140.0, 45.727068], [1524887460000, 9140.0, 9180.75, 9138.88, 9162.24, 210.353926], [1524887640000, 9170.99, 9196.32, 9152.44, 9158.32, 86.867462], [1524887820000, 9167.0, 9170.0, 9152.44, 9155.0, 53.817992], [1524888000000, 9155.01, 9168.71, 9155.0, 9159.33, 44.613078], [1524888180000, 9157.93, 9163.76, 9137.72, 9137.75, 77.240074], [1524888360000, 9143.27, 9151.11, 9137.73, 9148.99, 47.110268], [1524888540000, 9148.0, 9149.99, 9137.73, 9140.46, 32.372006], [1524888720000, 9140.46, 9149.71, 9137.74, 9142.99, 29.742109], [1524888900000, 9142.99, 9145.97, 9130.01, 9141.1, 40.281239], [1524889080000, 9140.51, 9144.0, 9140.0, 9140.56, 28.8669], [1524889260000, 9140.28, 9150.0, 9139.79, 9150.0, 48.073429], [1524889440000, 9149.99, 9162.34, 9149.99, 9162.0, 42.94468], [1524889620000, 9160.0, 9162.0, 9153.59, 9160.95, 54.143807], [1524889800000, 9160.92, 9161.11, 9151.35, 9161.1, 61.350768], [1524889980000, 9157.0, 9161.11, 9131.0, 9144.15, 40.524119], [1524890160000, 9146.81, 9155.0, 9137.0, 9142.77, 39.012018], [1524890340000, 9144.36, 9165.47, 9142.81, 9165.15, 31.77531], [1524890520000, 9165.15, 9165.47, 9148.01, 9148.01, 23.288191], [1524890700000, 9148.01, 9158.0, 9146.0, 9150.04, 34.248188], [1524890880000, 9155.63, 9157.0, 9128.99, 9140.74, 46.404347], [1524891060000, 9140.53, 9140.75, 9116.0, 9119.99, 45.128025], [1524891240000, 9120.0, 9149.0, 9111.21, 9134.11, 35.114467], [1524891420000, 9140.0, 9145.0, 9134.01, 9138.53, 114.687307], [1524891600000, 9138.54, 9157.1, 9127.64, 9151.0, 74.582556], [1524891780000, 9154.6, 9154.6, 9141.34, 9144.01, 13.999426], [1524891960000, 9147.7, 9168.2, 9144.0, 9160.01, 76.266215], [1524892140000, 9160.02, 9168.09, 9160.0, 9167.06, 24.059568], [1524892320000, 9162.01, 9184.8, 9162.01, 9180.02, 79.990418], [1524892500000, 9180.02, 9188.5, 9167.06, 9172.01, 42.032031], [1524892680000, 9172.0, 9176.94, 9170.02, 9172.98, 40.591824], [1524892860000, 9172.98, 9176.93, 9170.0, 9175.26, 34.486049], [1524893040000, 9175.0, 9177.78, 9151.59, 9167.8, 58.709037], [1524893220000, 9167.8, 9168.7, 9151.45, 9157.1, 76.602552], [1524893400000, 9157.0, 9164.18, 9144.01, 9153.78, 68.373627], [1524893580000, 9154.3, 9164.0, 9150.51, 9153.82, 40.875707], [1524893760000, 9153.82, 9163.56, 9141.3, 9153.34, 26.120301], [1524893940000, 9162.86, 9163.54, 9141.3, 9150.0, 31.435654], [1524894120000, 9150.0, 9158.0, 9144.39, 9156.99, 33.793407], [1524894300000, 9150.02, 9157.0, 9140.67, 9148.61, 17.865428], [1524894480000, 9148.34, 9158.0, 9148.07, 9157.0, 30.114421], [1524894660000, 9157.04, 9162.0, 9157.0, 9157.06, 34.639092], [1524894840000, 9157.06, 9168.72, 9150.0, 9160.0, 62.168933], [1524895020000, 9162.0, 9169.0, 9152.0, 9164.49, 67.319077], [1524895200000, 9164.48, 9175.0, 9160.01, 9174.0, 42.448046], [1524895380000, 9174.01, 9175.53, 9163.73, 9175.01, 47.647471], [1524895560000, 9170.01, 9179.78, 9166.0, 9179.78, 94.07506], [1524895740000, 9179.0, 9198.61, 9169.9, 9185.86, 173.163745], [1524895920000, 9194.61, 9199.99, 9180.0, 9189.93, 77.257661], [1524896100000, 9189.93, 9190.0, 9177.08, 9187.0, 83.547023], [1524896280000, 9185.88, 9200.0, 9185.88, 9190.74, 65.605851], [1524896460000, 9194.72, 9195.0, 9170.0, 9178.0, 50.042278], [1524896640000, 9175.0, 9184.0, 9170.3, 9177.97, 31.911551], [1524896820000, 9182.61, 9185.13, 9170.02, 9184.0, 32.748598], [1524897000000, 9184.01, 9190.0, 9175.0, 9189.94, 29.705153], [1524897180000, 9189.84, 9200.77, 9189.84, 9200.72, 89.765755], [1524897360000, 9195.02, 9200.89, 9180.0, 9195.05, 51.26914], [1524897540000, 9195.04, 9200.3, 9180.72, 9195.0, 62.450288], [1524897720000, 9195.0, 9209.8, 9190.02, 9203.0, 92.926092], [1524897900000, 9203.0, 9211.74, 9200.0, 9205.0, 63.468255], [1524898080000, 9210.0, 9215.66, 9205.0, 9213.94, 59.383645], [1524898260000, 9206.73, 9213.75, 9178.35, 9193.0, 76.084552], [1524898440000, 9195.0, 9195.14, 9174.22, 9182.92, 49.592592], [1524898620000, 9178.98, 9182.92, 9150.67, 9163.03, 75.717019], [1524898800000, 9163.02, 9171.07, 9132.71, 9139.0, 64.81254], [1524898980000, 9138.99, 9153.14, 9130.02, 9135.01, 156.844535], [1524899160000, 9134.22, 9135.01, 9128.13, 9131.99, 87.721927], [1524899340000, 9131.04, 9160.6, 9128.0, 9151.99, 57.810283], [1524899520000, 9151.99, 9160.0, 9145.97, 9150.99, 41.055126], [1524899700000, 9151.0, 9157.85, 9146.0, 9150.0, 29.188896], [1524899880000, 9150.0, 9153.0, 9147.1, 9151.5, 38.667182], [1524900060000, 9151.1, 9161.01, 9151.0, 9160.99, 29.545694], [1524900240000, 9160.99, 9165.0, 9154.1, 9161.99, 49.263643], [1524900420000, 9157.0, 9161.99, 9153.6, 9153.67, 27.707889], [1524900600000, 9153.67, 9154.08, 9126.01, 9135.0, 67.897209], [1524900780000, 9134.59, 9147.93, 9133.0, 9136.15, 93.440155], [1524900960000, 9136.15, 9139.9, 9109.0, 9113.96, 88.911147], [1524901140000, 9119.98, 9142.1, 9108.99, 9135.25, 73.495457], [1524901320000, 9135.26, 9139.59, 9124.45, 9124.92, 30.259397], [1524901500000, 9129.81, 9129.81, 9110.0, 9119.95, 69.91081], [1524901680000, 9119.99, 9130.0, 9112.11, 9128.0, 77.875513], [1524901860000, 9128.0, 9137.65, 9125.04, 9134.99, 35.992718], [1524902040000, 9135.0, 9145.0, 9120.08, 9122.93, 59.197786], [1524902220000, 9122.94, 9134.47, 9118.7, 9126.22, 23.502908], [1524902400000, 9121.05, 9126.21, 9110.33, 9119.0, 45.310816], [1524902580000, 9115.03, 9118.0, 9102.0, 9102.49, 42.884335], [1524902760000, 9102.49, 9112.0, 9084.73, 9090.01, 132.754993], [1524902940000, 9094.21, 9102.0, 9083.03, 9083.05, 60.470988], [1524903120000, 9083.05, 9096.0, 9081.02, 9088.99, 57.857385], [1524903300000, 9089.0, 9100.31, 9085.02, 9099.21, 74.251154], [1524903480000, 9099.41, 9110.0, 9090.48, 9090.48, 54.880595], [1524903660000, 9091.53, 9099.9, 9088.98, 9097.98, 80.383883], [1524903840000, 9097.98, 9098.0, 9089.33, 9093.38, 39.923106], [1524904020000, 9097.99, 9098.0, 9086.96, 9090.0, 38.686796], [1524904200000, 9090.0, 9174.0, 9088.96, 9174.0, 174.561272], [1524904380000, 9171.34, 9285.25, 9171.3, 9285.0, 434.634333], [1524904560000, 9283.24, 9298.72, 9266.0, 9273.01, 254.054411], [1524904740000, 9273.01, 9322.31, 9265.42, 9310.01, 216.393199], [1524904920000, 9310.01, 9330.0, 9300.0, 9320.0, 275.196921], [1524905100000, 9315.0, 9325.0, 9276.82, 9283.89, 229.532547], [1524905280000, 9287.94, 9312.99, 9283.89, 9300.08, 100.528471], [1524905460000, 9300.08, 9303.03, 9281.0, 9284.05, 69.179566], [1524905640000, 9284.05, 9307.99, 9283.0, 9307.08, 94.024607], [1524905820000, 9307.08, 9312.91, 9190.0, 9217.48, 573.243995], [1524906000000, 9227.49, 9250.0, 9155.55, 9197.82, 359.600328], [1524906180000, 9200.0, 9217.99, 9183.99, 9189.2, 130.178032], [1524906360000, 9189.18, 9223.78, 9155.06, 9219.46, 165.425516], [1524906540000, 9219.46, 9223.78, 9200.0, 9219.0, 60.631033], [1524906720000, 9218.99, 9218.99, 9184.07, 9195.61, 64.575479], [1524906900000, 9195.6, 9210.0, 9182.0, 9182.0, 86.963493], [1524907080000, 9189.85, 9195.89, 9171.02, 9195.89, 71.071373], [1524907260000, 9195.89, 9231.87, 9195.89, 9215.82, 123.895503], [1524907440000, 9217.07, 9266.69, 9215.82, 9262.51, 66.97188], [1524907620000, 9257.0, 9288.0, 9241.0, 9276.13, 141.590506], [1524907800000, 9270.0, 9280.0, 9245.0, 9245.03, 124.082999], [1524907980000, 9245.03, 9251.5, 9240.0, 9242.01, 46.487509], [1524908160000, 9244.99, 9300.4, 9224.11, 9297.67, 215.236277], [1524908340000, 9276.19, 9293.65, 9260.0, 9280.01, 74.303879], [1524908520000, 9280.04, 9285.0, 9269.03, 9275.0, 57.684862], [1524908700000, 9275.0, 9280.06, 9270.12, 9278.73, 43.369149], [1524908880000, 9278.73, 9280.08, 9270.22, 9273.97, 24.012494], [1524909060000, 9271.12, 9274.99, 9242.07, 9264.95, 64.400907], [1524909240000, 9260.72, 9267.0, 9252.2, 9257.83, 23.914516], [1524909420000, 9262.18, 9275.0, 9257.81, 9273.0, 28.639348], [1524909600000, 9273.0, 9275.0, 9263.12, 9268.71, 24.421753], [1524909780000, 9268.71, 9279.95, 9265.43, 9273.0, 27.461862], [1524909960000, 9275.76, 9310.0, 9257.8, 9261.39, 293.082851], [1524910140000, 9262.05, 9309.51, 9262.05, 9284.35, 82.416316]], "5m": [[1524760500000, 8849.99, 8888.0, 8845.02, 8880.0, 129.512743], [1524760800000, 8883.8, 8894.0, 8855.0, 8876.99, 123.961977], [1524761100000, 8875.98, 8900.0, 8873.85, 8894.71, 110.855444], [1524761400000, 8894.99, 8896.0, 8875.02, 8884.59, 97.548219], [1524761700000, 8884.79, 8908.53, 8884.59, 8900.51, 134.469739], [1524762000000, 8899.0, 8902.42, 8875.0, 8879.98, 115.819683], [1524762300000, 8879.98, 8886.07, 8867.5, 8876.9, 83.479488], [1524762600000, 8876.9, 8890.0, 8872.63, 8884.89, 92.528381], [1524762900000, 8884.0, 8920.0, 8881.87, 8920.0, 79.03783], [1524763200000, 8918.95, 8925.0, 8880.0, 8898.76, 162.32123], [1524763500000, 8898.73, 8908.78, 8860.35, 8871.87, 84.93392], [1524763800000, 8875.0, 8898.92, 8865.0, 8888.91, 95.344983], [1524764100000, 8890.47, 8890.47, 8872.86, 8879.05, 62.663578], [1524764400000, 8879.05, 8880.0, 8846.0, 8854.0, 99.783039], [1524764700000, 8854.0, 8879.99, 8845.03, 8879.99, 83.266987], [1524765000000, 8875.0, 8889.13, 8861.0, 8870.01, 99.420139], [1524765300000, 8873.3, 8881.04, 8847.09, 8866.43, 63.197393], [1524765600000, 8866.43, 8876.29, 8857.9, 8868.45, 39.955016], [1524765900000, 8868.45, 8868.88, 8839.53, 8851.68, 54.858665], [1524766200000, 8851.07, 8869.74, 8851.04, 8869.0, 53.113307], [1524766500000, 8869.73, 8870.0, 8860.0, 8870.0, 46.098413], [1524766800000, 8869.99, 8909.0, 8867.01, 8893.0, 73.927972], [1524767100000, 8893.0, 8901.0, 8873.99, 8882.92, 100.470018], [1524767400000, 8882.92, 8893.9, 8870.0, 8890.99, 58.138337], [1524767700000, 8890.0, 8893.9, 8863.0, 8867.0, 51.122558], [1524768000000, 8867.0, 8874.98, 8852.0, 8860.84, 31.32591], [1524768300000, 8860.83, 8860.83, 8837.0, 8843.09, 95.672114], [1524768600000, 8847.97, 8859.46, 8837.0, 8840.52, 59.635915], [1524768900000, 8841.98, 8852.9, 8834.02, 8845.09, 45.22609], [1524769200000, 8845.1, 8868.85, 8844.0, 8854.99, 44.814308], [1524769500000, 8854.99, 8855.0, 8838.35, 8853.0, 61.13847], [1524769800000, 8852.99, 8869.99, 8845.0, 8865.85, 59.985308], [1524770100000, 8860.99, 8865.85, 8846.0, 8846.01, 49.647545], [1524770400000, 8849.53, 8862.0, 8846.0, 8850.07, 52.534943], [1524770700000, 8856.95, 8869.99, 8850.07, 8866.0, 100.729798], [1524771000000, 8866.0, 8870.0, 8860.0, 8869.99, 48.563642], [1524771300000, 8869.99, 8895.21, 8868.02, 8882.99, 63.578151], [1524771600000, 8877.07, 8885.0, 8865.0, 8876.0, 86.753097], [1524771900000, 8880.0, 8881.9, 8861.0, 8871.99, 29.343358], [1524772200000, 8871.99, 8878.82, 8865.01, 8878.15, 27.14235], [1524772500000, 8878.15, 8888.88, 8871.0, 8881.54, 36.133915], [1524772800000, 8880.0, 8893.36, 8880.0, 8892.0, 52.068753], [1524773100000, 8892.0, 9050.0, 8888.0, 9048.42, 662.35307], [1524773400000, 9040.43, 9087.0, 9032.45, 9073.99, 383.810985], [1524773700000, 9070.21, 9087.0, 9027.94, 9042.0, 301.359743], [1524774000000, 9043.07, 9097.0, 9041.99, 9096.1, 214.62135], [1524774300000, 9096.1, 9138.0, 9075.25, 9096.96, 402.787079], [1524774600000, 9104.96, 9124.88, 9076.0, 9076.2, 193.783823], [1524774900000, 9078.0, 9099.59, 9062.72, 9070.0, 162.972189], [1524775200000, 9069.18, 9109.0, 9067.02, 9106.26, 120.018059], [1524775500000, 9106.26, 9124.63, 9075.0, 9101.0, 211.214281], [1524775800000, 9101.01, 9137.4, 9099.99, 9109.0, 213.159817], [1524776100000, 9108.98, 9124.0, 9101.04, 9123.99, 86.645325], [1524776400000, 9123.99, 9133.99, 9111.11, 9132.0, 130.525699], [1524776700000, 9130.54, 9135.04, 9101.04, 9105.0, 135.259782], [1524777000000, 9105.0, 9114.99, 9090.0, 9105.0, 154.739433], [1524777300000, 9114.81, 9114.96, 9100.0, 9114.0, 64.06073], [1524777600000, 9110.0, 9138.0, 9105.99, 9134.03, 108.325612], [1524777900000, 9134.03, 9168.98, 9134.03, 9167.02, 172.564819], [1524778200000, 9167.02, 9169.9, 9138.0, 9152.78, 122.634961], [1524778500000, 9149.99, 9164.98, 9120.0, 9127.01, 238.538042], [1524778800000, 9132.94, 9132.94, 9066.02, 9122.0, 231.731446], [1524779100000, 9122.01, 9130.0, 9115.01, 9120.0, 63.996896], [1524779400000, 9119.99, 9120.0, 9078.02, 9082.02, 156.465517], [1524779700000, 9083.0, 9100.0, 9080.0, 9099.0, 86.328364], [1524780000000, 9100.0, 9120.0, 9096.01, 9119.0, 73.350722], [1524780300000, 9119.0, 9137.65, 9115.5, 9127.0, 152.81654], [1524780600000, 9127.01, 9141.99, 9120.0, 9135.17, 106.925352], [1524780900000, 9135.17, 9155.0, 9135.17, 9151.02, 110.696147], [1524781200000, 9150.99, 9169.99, 9150.99, 9169.01, 130.845381], [1524781500000, 9169.01, 9174.11, 9141.2, 9158.05, 136.174179], [1524781800000, 9156.72, 9158.05, 9131.0, 9134.99, 99.518816], [1524782100000, 9134.79, 9156.0, 9131.55, 9150.97, 124.364734], [1524782400000, 9150.97, 9171.0, 9147.03, 9171.0, 113.489857], [1524782700000, 9170.08, 9178.0, 9150.0, 9170.0, 161.213325], [1524783000000, 9170.0, 9235.0, 9168.97, 9225.71, 512.64291], [1524783300000, 9230.0, 9235.99, 9211.09, 9221.0, 245.622654], [1524783600000, 9221.0, 9288.0, 9217.72, 9256.28, 477.557972], [1524783900000, 9257.33, 9268.95, 9218.9, 9230.0, 233.665252], [1524784200000, 9230.0, 9258.19, 9215.01, 9225.0, 131.177354], [1524784500000, 9223.73, 9250.2, 9216.63, 9236.01, 127.616191], [1524784800000, 9238.97, 9241.68, 9190.0, 9195.41, 178.115034], [1524785100000, 9190.43, 9248.06, 9188.0, 9237.0, 208.748687], [1524785400000, 9237.0, 9269.99, 9236.99, 9256.3, 203.703296], [1524785700000, 9256.3, 9256.31, 9234.99, 9239.0, 90.791461], [1524786000000, 9240.0, 9263.24, 9230.01, 9258.99, 139.8284], [1524786300000, 9259.01, 9307.48, 9257.88, 9286.0, 306.613927], [1524786600000, 9287.69, 9289.0, 9260.0, 9268.0, 142.643961], [1524786900000, 9267.48, 9297.99, 9261.44, 9266.0, 149.007887], [1524787200000, 9267.03, 9297.0, 9257.0, 9266.78, 227.247075], [1524787500000, 9266.76, 9275.94, 9215.0, 9231.94, 242.496915], [1524787800000, 9231.94, 9245.92, 9216.0, 9226.61, 137.975458], [1524788100000, 9226.94, 9251.82, 9217.01, 9249.0, 125.377042], [1524788400000, 9248.99, 9284.77, 9240.39, 9242.0, 166.979104], [1524788700000, 9242.0, 9260.94, 9240.37, 9247.67, 87.436529], [1524789000000, 9249.01, 9249.5, 9230.06, 9237.97, 95.651249], [1524789300000, 9237.96, 9245.0, 9210.1, 9213.0, 98.200756], [1524789600000, 9213.0, 9213.0, 9177.0, 9210.0, 318.218943], [1524789900000, 9210.0, 9245.56, 9206.07, 9240.41, 96.202134], [1524790200000, 9240.0, 9240.0, 9229.0, 9233.97, 95.493403], [1524790500000, 9228.11, 9228.11, 9200.0, 9210.32, 117.953264], [1524790800000, 9210.29, 9261.0, 9210.21, 9252.29, 107.567648], [1524791100000, 9260.91, 9265.0, 9238.8, 9242.36, 150.016869], [1524791400000, 9242.36, 9248.33, 9229.09, 9242.32, 93.539777], [1524791700000, 9242.3, 9292.0, 9242.25, 9289.9, 191.797758], [1524792000000, 9285.01, 9290.0, 9260.01, 9270.64, 147.668334], [1524792300000, 9270.64, 9280.88, 9242.33, 9254.76, 121.97824], [1524792600000, 9250.0, 9265.04, 9250.0, 9252.01, 106.104622], [1524792900000, 9252.01, 9257.75, 9220.0, 9239.99, 94.607613], [1524793200000, 9239.99, 9270.0, 9239.99, 9255.0, 65.836641], [1524793500000, 9255.0, 9255.0, 9246.42, 9250.08, 81.787521], [1524793800000, 9250.09, 9252.0, 9214.0, 9228.27, 104.680519], [1524794100000, 9228.27, 9250.0, 9218.39, 9249.97, 89.86277], [1524794400000, 9240.0, 9257.98, 9239.64, 9251.04, 82.334538], [1524794700000, 9251.0, 9257.98, 9247.01, 9249.99, 79.374552], [1524795000000, 9249.02, 9259.99, 9239.66, 9251.01, 150.619092], [1524795300000, 9259.35, 9275.58, 9252.34, 9273.54, 149.550558], [1524795600000, 9273.65, 9282.0, 9265.0, 9268.07, 103.453623], [1524795900000, 9268.07, 9273.5, 9265.99, 9273.5, 49.206054], [1524796200000, 9272.32, 9277.0, 9265.6, 9266.04, 60.820051], [1524796500000, 9266.05, 9269.98, 9250.0, 9252.38, 89.13042], [1524796800000, 9252.38, 9259.99, 9237.0, 9249.0, 101.535796], [1524797100000, 9248.0, 9260.0, 9233.51, 9258.0, 96.422288], [1524797400000, 9258.0, 9260.0, 9249.99, 9259.96, 44.399873], [1524797700000, 9259.96, 9260.0, 9244.75, 9255.49, 49.548735], [1524798000000, 9255.5, 9258.0, 9232.3, 9232.63, 99.869894], [1524798300000, 9240.05, 9242.91, 9218.0, 9218.0, 131.116939], [1524798600000, 9218.0, 9233.6, 9213.25, 9220.02, 114.915528], [1524798900000, 9220.01, 9228.02, 9216.42, 9218.89, 59.818394], [1524799200000, 9218.89, 9224.98, 9216.42, 9224.05, 60.559213], [1524799500000, 9224.97, 9235.0, 9218.05, 9227.03, 83.358238], [1524799800000, 9227.03, 9232.06, 9210.93, 9212.01, 133.709651], [1524800100000, 9212.0, 9220.0, 9200.01, 9215.5, 168.392538], [1524800400000, 9215.5, 9216.0, 9130.1, 9161.45, 394.942802], [1524800700000, 9156.81, 9190.0, 9140.82, 9177.76, 243.244154], [1524801000000, 9177.0, 9200.0, 9167.89, 9174.48, 264.018689], [1524801300000, 9174.48, 9177.55, 9123.25, 9143.01, 296.086166], [1524801600000, 9143.01, 9149.32, 9104.88, 9125.42, 260.497988], [1524801900000, 9125.4, 9220.0, 9118.0, 9189.0, 255.968969], [1524802200000, 9189.0, 9190.0, 9162.76, 9173.32, 71.504378], [1524802500000, 9173.31, 9190.0, 9162.76, 9185.04, 104.152575], [1524802800000, 9185.04, 9200.0, 9181.51, 9198.0, 95.839297], [1524803100000, 9200.0, 9213.67, 9194.17, 9209.35, 110.820657], [1524803400000, 9209.35, 9211.0, 9175.6, 9178.97, 94.555597], [1524803700000, 9178.97, 9195.0, 9175.59, 9191.0, 55.056409], [1524804000000, 9188.55, 9230.0, 9186.64, 9224.0, 152.615689], [1524804300000, 9224.0, 9235.0, 9209.98, 9224.99, 149.665361], [1524804600000, 9213.82, 9227.41, 9203.08, 9218.0, 100.807295], [1524804900000, 9211.1, 9219.74, 9203.96, 9204.99, 53.35839], [1524805200000, 9205.0, 9213.0, 9188.0, 9200.0, 89.250511], [1524805500000, 9196.0, 9225.99, 9196.0, 9219.92, 77.715488], [1524805800000, 9219.93, 9229.59, 9203.03, 9203.04, 54.987886], [1524806100000, 9203.04, 9217.06, 9195.0, 9197.44, 70.8507], [1524806400000, 9195.92, 9200.73, 9189.8, 9194.96, 45.91781], [1524806700000, 9196.01, 9217.54, 9194.94, 9213.0, 60.638973], [1524807000000, 9217.54, 9229.0, 9196.0, 9201.01, 119.676041], [1524807300000, 9200.08, 9218.91, 9196.1, 9215.0, 71.641912], [1524807600000, 9215.01, 9218.91, 9200.0, 9210.0, 93.39838], [1524807900000, 9210.0, 9212.07, 9197.12, 9200.0, 89.598171], [1524808200000, 9200.0, 9204.07, 9180.0, 9181.0, 76.93283], [1524808500000, 9183.08, 9192.0, 9160.0, 9180.82, 104.590462], [1524808800000, 9184.99, 9199.9, 9176.99, 9191.91, 125.029089], [1524809100000, 9191.91, 9195.0, 9179.0, 9195.0, 93.307995], [1524809400000, 9194.23, 9220.33, 9194.23, 9210.1, 120.718172], [1524809700000, 9209.97, 9252.18, 9209.97, 9241.88, 407.752367], [1524810000000, 9240.01, 9262.98, 9232.0, 9238.75, 159.121306], [1524810300000, 9238.75, 9257.53, 9220.0, 9230.0, 123.092003], [1524810600000, 9230.0, 9249.0, 9230.0, 9240.93, 75.751813], [1524810900000, 9242.97, 9262.65, 9240.92, 9261.9, 88.419296], [1524811200000, 9261.03, 9265.7, 9226.0, 9229.96, 204.476528], [1524811500000, 9229.96, 9246.33, 9226.0, 9234.24, 78.37857], [1524811800000, 9235.18, 9249.0, 9232.16, 9239.93, 85.968744], [1524812100000, 9239.93, 9259.0, 9233.0, 9250.0, 91.650666], [1524812400000, 9249.99, 9250.0, 9233.0, 9239.99, 75.863], [1524812700000, 9239.99, 9239.99, 9229.0, 9229.0, 56.456352], [1524813000000, 9232.81, 9235.0, 9210.1, 9230.01, 93.794267], [1524813300000, 9225.02, 9232.74, 9215.1, 9229.01, 68.536904], [1524813600000, 9229.01, 9231.5, 9210.6, 9217.27, 100.683255], [1524813900000, 9210.6, 9217.31, 9188.0, 9188.0, 143.49334], [1524814200000, 9196.0, 9217.79, 9188.0, 9211.02, 78.52179], [1524814500000, 9213.95, 9226.0, 9206.0, 9215.6, 71.133841], [1524814800000, 9215.6, 9220.25, 9215.59, 9220.24, 62.125113], [1524815100000, 9220.25, 9230.0, 9220.01, 9225.0, 47.995324], [1524815400000, 9225.0, 9235.0, 9222.9, 9229.0, 89.13032], [1524815700000, 9228.01, 9250.0, 9227.02, 9240.97, 119.813698], [1524816000000, 9240.97, 9249.25, 9231.01, 9242.5, 69.056217], [1524816300000, 9242.49, 9296.0, 9239.59, 9289.86, 288.656321], [1524816600000, 9289.86, 9296.0, 9266.04, 9280.0, 195.827123], [1524816900000, 9280.0, 9280.87, 9271.21, 9275.0, 103.143388], [1524817200000, 9275.0, 9281.99, 9260.01, 9272.96, 116.357958], [1524817500000, 9272.96, 9279.36, 9256.0, 9271.0, 122.435509], [1524817800000, 9274.0, 9274.0, 9252.11, 9252.2, 85.700528], [1524818100000, 9252.25, 9260.99, 9252.0, 9259.11, 58.38907], [1524818400000, 9259.99, 9259.99, 9230.0, 9238.79, 91.327214], [1524818700000, 9238.79, 9249.0, 9230.0, 9247.99, 54.025965], [1524819000000, 9245.01, 9268.98, 9245.01, 9263.69, 71.048191], [1524819300000, 9263.69, 9269.88, 9244.55, 9260.0, 81.03938], [1524819600000, 9260.0, 9260.46, 9241.2, 9251.0, 54.184013], [1524819900000, 9250.86, 9268.78, 9248.41, 9255.0, 57.846958], [1524820200000, 9261.99, 9268.99, 9255.0, 9268.0, 40.183594], [1524820500000, 9261.0, 9277.65, 9260.34, 9270.1, 39.555674], [1524820800000, 9273.0, 9279.88, 9251.53, 9258.99, 100.44939], [1524821100000, 9259.99, 9274.99, 9258.98, 9265.0, 77.009146], [1524821400000, 9266.01, 9266.01, 9250.01, 9260.0, 83.219039], [1524821700000, 9260.0, 9340.0, 9260.0, 9336.99, 477.731075], [1524822000000, 9336.99, 9361.86, 9333.42, 9348.83, 390.634437], [1524822300000, 9345.0, 9368.0, 9326.81, 9360.0, 229.552875], [1524822600000, 9360.0, 9370.82, 9351.01, 9370.82, 129.246381], [1524822900000, 9370.81, 9387.48, 9351.01, 9369.0, 275.232667], [1524823200000, 9369.0, 9376.5, 9328.05, 9328.05, 162.364644], [1524823500000, 9330.23, 9349.99, 9328.06, 9338.0, 132.821868], [1524823800000, 9338.0, 9367.23, 9337.18, 9350.0, 100.276988], [1524824100000, 9350.0, 9370.0, 9340.0, 9369.91, 103.947456], [1524824400000, 9369.91, 9380.0, 9341.39, 9348.0, 175.441961], [1524824700000, 9350.0, 9375.82, 9347.4, 9368.99, 140.896367], [1524825000000, 9368.99, 9370.98, 9352.17, 9355.0, 94.570773], [1524825300000, 9354.18, 9368.0, 9352.19, 9365.0, 85.579199], [1524825600000, 9365.0, 9395.0, 9363.2, 9382.01, 319.417808], [1524825900000, 9382.01, 9382.1, 9365.96, 9370.65, 120.700513], [1524826200000, 9372.0, 9374.0, 9355.0, 9359.84, 110.887549], [1524826500000, 9357.74, 9372.0, 9350.0, 9365.0, 69.85107], [1524826800000, 9363.31, 9367.97, 9335.93, 9342.0, 146.086915], [1524827100000, 9342.0, 9352.03, 9337.77, 9344.0, 78.139554], [1524827400000, 9344.0, 9354.0, 9340.2, 9340.21, 58.251731], [1524827700000, 9340.22, 9340.22, 9290.03, 9316.0, 283.34875], [1524828000000, 9311.5, 9331.72, 9306.97, 9331.72, 94.91112], [1524828300000, 9325.7, 9345.52, 9321.0, 9345.52, 75.628076], [1524828600000, 9343.0, 9345.54, 9330.01, 9334.97, 98.755471], [1524828900000, 9334.97, 9334.97, 9320.0, 9327.99, 45.750598], [1524829200000, 9323.19, 9327.98, 9280.59, 9300.0, 166.752955], [1524829500000, 9305.0, 9310.0, 9297.2, 9309.0, 80.3153], [1524829800000, 9309.0, 9335.18, 9305.09, 9321.0, 66.865214], [1524830100000, 9321.49, 9323.01, 9305.05, 9309.0, 136.111139], [1524830400000, 9308.9, 9333.0, 9308.9, 9331.86, 142.225031], [1524830700000, 9332.9, 9339.0, 9326.03, 9337.01, 103.110212], [1524831000000, 9335.0, 9355.0, 9334.1, 9345.0, 81.990794], [1524831300000, 9342.0, 9349.97, 9341.17, 9348.09, 92.862618], [1524831600000, 9348.83, 9348.83, 9325.0, 9332.99, 88.388625], [1524831900000, 9332.99, 9349.99, 9332.99, 9349.9, 42.11875], [1524832200000, 9349.9, 9350.0, 9330.0, 9333.01, 110.780624], [1524832500000, 9340.0, 9345.0, 9326.04, 9335.02, 106.665888], [1524832800000, 9335.02, 9347.0, 9335.02, 9339.01, 115.429055], [1524833100000, 9339.01, 9347.73, 9317.79, 9320.0, 79.737629], [1524833400000, 9318.01, 9324.99, 9253.68, 9288.99, 248.340953], [1524833700000, 9281.79, 9291.48, 9273.94, 9290.07, 97.726609], [1524834000000, 9290.01, 9318.62, 9273.97, 9298.13, 122.731857], [1524834300000, 9298.13, 9310.72, 9280.0, 9281.37, 170.283163], [1524834600000, 9280.0, 9295.64, 9240.21, 9241.01, 204.033926], [1524834900000, 9241.01, 9265.99, 9241.01, 9252.01, 105.307808], [1524835200000, 9251.0, 9255.0, 9150.1, 9194.99, 726.211121], [1524835500000, 9187.19, 9220.0, 9186.15, 9190.01, 239.420645], [1524835800000, 9190.01, 9202.39, 9155.46, 9190.99, 306.559276], [1524836100000, 9189.99, 9235.29, 9181.0, 9207.1, 184.866383], [1524836400000, 9208.0, 9250.0, 9207.1, 9221.0, 151.342609], [1524836700000, 9220.99, 9230.0, 9215.0, 9229.23, 85.788417], [1524837000000, 9229.44, 9232.0, 9199.99, 9218.72, 161.514444], [1524837300000, 9224.98, 9231.5, 9212.92, 9225.0, 67.012676], [1524837600000, 9226.97, 9228.91, 9202.0, 9215.83, 52.827804], [1524837900000, 9215.47, 9229.0, 9204.01, 9219.99, 67.939979], [1524838200000, 9219.0, 9249.0, 9219.0, 9240.0, 98.684527], [1524838500000, 9239.99, 9242.0, 9230.0, 9235.38, 77.203002], [1524838800000, 9236.0, 9270.36, 9231.61, 9257.4, 181.106565], [1524839100000, 9260.0, 9266.65, 9240.0, 9260.15, 122.872004], [1524839400000, 9260.15, 9275.0, 9236.58, 9243.99, 118.552161], [1524839700000, 9243.98, 9244.0, 9219.01, 9220.6, 94.670888], [1524840000000, 9225.0, 9259.99, 9220.6, 9253.04, 137.564453], [1524840300000, 9253.11, 9271.37, 9253.04, 9263.96, 119.602532], [1524840600000, 9264.06, 9268.61, 9250.0, 9265.0, 144.085103], [1524840900000, 9265.0, 9290.0, 9260.01, 9288.88, 185.949657], [1524841200000, 9280.14, 9288.88, 9250.0, 9257.99, 158.696324], [1524841500000, 9256.0, 9268.02, 9250.2, 9259.94, 73.807592], [1524841800000, 9259.02, 9264.0, 9250.2, 9250.21, 91.508899], [1524842100000, 9250.21, 9264.99, 9237.01, 9248.11, 132.790625], [1524842400000, 9248.11, 9253.5, 9213.85, 9220.1, 199.342245], [1524842700000, 9220.0, 9247.36, 9210.01, 9235.0, 189.250666], [1524843000000, 9235.14, 9245.55, 9225.0, 9245.55, 115.549613], [1524843300000, 9245.54, 9260.0, 9239.71, 9255.68, 97.290195], [1524843600000, 9255.68, 9260.0, 9242.05, 9251.01, 113.058314], [1524843900000, 9251.01, 9255.69, 9249.99, 9250.35, 58.597382], [1524844200000, 9251.0, 9251.0, 9240.01, 9242.35, 63.980855], [1524844500000, 9240.02, 9250.57, 9240.01, 9241.21, 66.08646], [1524844800000, 9241.2, 9287.0, 9241.0, 9281.01, 166.531484], [1524845100000, 9283.99, 9299.37, 9281.0, 9290.0, 151.851976], [1524845400000, 9290.0, 9310.96, 9288.15, 9308.87, 171.683582], [1524845700000, 9306.0, 9328.26, 9291.01, 9323.75, 189.693177], [1524846000000, 9323.74, 9323.74, 9280.0, 9287.99, 174.213149], [1524846300000, 9287.99, 9298.98, 9287.0, 9297.0, 70.035844], [1524846600000, 9296.95, 9300.0, 9285.05, 9295.0, 81.619764], [1524846900000, 9295.0, 9298.57, 9269.0, 9279.26, 82.611593], [1524847200000, 9279.26, 9290.0, 9276.03, 9287.0, 72.210469], [1524847500000, 9290.0, 9294.44, 9283.0, 9285.99, 70.874618], [1524847800000, 9285.99, 9299.46, 9275.78, 9295.78, 81.172624], [1524848100000, 9295.78, 9299.99, 9280.0, 9282.1, 83.013821], [1524848400000, 9286.01, 9299.98, 9286.0, 9296.75, 66.179504], [1524848700000, 9296.74, 9297.0, 9290.0, 9294.99, 37.976429], [1524849000000, 9294.99, 9294.99, 9269.54, 9280.97, 70.847905], [1524849300000, 9280.97, 9285.0, 9266.0, 9280.0, 116.746282], [1524849600000, 9280.0, 9293.48, 9270.05, 9293.46, 113.404238], [1524849900000, 9293.47, 9319.99, 9293.0, 9301.33, 108.049014], [1524850200000, 9301.83, 9316.0, 9293.0, 9310.0, 120.941805], [1524850500000, 9306.01, 9310.0, 9282.99, 9282.99, 101.379306], [1524850800000, 9288.06, 9299.0, 9288.06, 9298.0, 124.218454], [1524851100000, 9294.99, 9303.15, 9290.02, 9293.53, 104.858125], [1524851400000, 9294.99, 9299.0, 9292.52, 9295.23, 71.265381], [1524851700000, 9295.23, 9305.0, 9290.1, 9290.1, 86.363639], [1524852000000, 9290.1, 9296.31, 9240.0, 9247.01, 158.371072], [1524852300000, 9252.95, 9280.0, 9249.0, 9275.0, 78.70798], [1524852600000, 9273.03, 9280.0, 9271.01, 9272.47, 42.669908], [1524852900000, 9272.47, 9282.0, 9272.46, 9278.42, 103.029266], [1524853200000, 9278.42, 9278.42, 9230.0, 9248.0, 132.100252], [1524853500000, 9248.0, 9262.0, 9225.0, 9244.93, 84.874749], [1524853800000, 9244.94, 9245.0, 9227.04, 9228.01, 72.198213], [1524854100000, 9228.01, 9245.0, 9213.8, 9243.96, 105.965098], [1524854400000, 9245.0, 9271.76, 9242.27, 9252.0, 59.604413], [1524854700000, 9252.0, 9268.99, 9252.0, 9252.01, 49.968391], [1524855000000, 9252.01, 9252.13, 9240.27, 9242.48, 38.244825], [1524855300000, 9240.28, 9242.5, 9230.0, 9230.89, 76.172975], [1524855600000, 9230.89, 9235.0, 9220.0, 9233.15, 86.352374], [1524855900000, 9233.38, 9250.56, 9226.0, 9227.0, 71.956221], [1524856200000, 9227.0, 9235.0, 9191.0, 9195.04, 163.943971], [1524856500000, 9195.02, 9219.83, 9188.0, 9204.11, 91.711628], [1524856800000, 9204.11, 9209.38, 9168.0, 9171.58, 152.272147], [1524857100000, 9179.25, 9215.11, 9170.94, 9190.0, 126.551375], [1524857400000, 9189.85, 9199.0, 9176.2, 9176.83, 79.900222], [1524857700000, 9185.0, 9196.22, 9170.0, 9190.01, 139.182029], [1524858000000, 9196.21, 9210.0, 9185.19, 9187.97, 62.652607], [1524858300000, 9185.19, 9190.0, 9157.01, 9157.01, 184.917031], [1524858600000, 9160.73, 9167.09, 9092.0, 9105.03, 632.035225], [1524858900000, 9105.03, 9125.4, 9075.01, 9089.0, 305.71061], [1524859200000, 9089.12, 9153.99, 9087.02, 9137.95, 269.377808], [1524859500000, 9130.01, 9163.38, 9127.12, 9136.43, 133.948809], [1524859800000, 9136.43, 9150.0, 9131.15, 9133.42, 82.327372], [1524860100000, 9133.42, 9133.42, 9101.0, 9105.0, 98.706543], [1524860400000, 9105.0, 9114.99, 9073.54, 9083.0, 124.1464], [1524860700000, 9073.67, 9110.0, 9054.01, 9090.55, 281.565903], [1524861000000, 9090.55, 9098.68, 9055.44, 9063.2, 148.877815], [1524861300000, 9069.92, 9069.99, 9005.0, 9011.0, 418.234429], [1524861600000, 9011.0, 9017.98, 8952.0, 8964.99, 655.157837], [1524861900000, 8955.02, 9019.0, 8952.0, 8976.99, 422.783762], [1524862200000, 8976.99, 9020.0, 8970.01, 8982.0, 203.528156], [1524862500000, 8982.0, 8987.92, 8940.0, 8970.0, 245.411274], [1524862800000, 8969.99, 8978.0, 8909.83, 8927.0, 325.097453], [1524863100000, 8927.0, 8987.0, 8922.27, 8979.6, 206.152679], [1524863400000, 8979.6, 9040.0, 8960.0, 9029.92, 265.91794], [1524863700000, 9024.99, 9053.0, 9010.01, 9015.04, 242.214586], [1524864000000, 9015.04, 9035.0, 9008.59, 9032.0, 108.508298], [1524864300000, 9032.0, 9032.0, 8980.0, 8991.0, 167.186584], [1524864600000, 8991.0, 8998.88, 8970.01, 8987.04, 109.505161], [1524864900000, 8988.0, 9015.33, 8987.03, 9014.98, 108.989248], [1524865200000, 9010.02, 9019.96, 8990.0, 8995.17, 75.017529], [1524865500000, 8995.17, 9004.02, 8976.05, 9004.01, 78.460328], [1524865800000, 9004.01, 9042.09, 9002.0, 9028.0, 89.67987], [1524866100000, 9026.5, 9029.64, 8966.44, 8975.35, 134.503978], [1524866400000, 8975.36, 9015.0, 8975.36, 9005.03, 143.708091], [1524866700000, 9002.2, 9040.76, 8985.06, 9030.0, 84.923131], [1524867000000, 9038.61, 9045.0, 9030.0, 9042.67, 71.767239], [1524867300000, 9042.01, 9045.0, 9024.96, 9033.61, 72.794173], [1524867600000, 9028.0, 9035.39, 9025.01, 9035.01, 35.01155], [1524867900000, 9035.01, 9073.77, 9035.01, 9071.0, 126.84132], [1524868200000, 9071.0, 9073.77, 9060.0, 9070.0, 77.519298], [1524868500000, 9071.0, 9078.0, 9066.01, 9075.0, 63.687313], [1524868800000, 9074.0, 9093.09, 9071.18, 9079.01, 132.060099], [1524869100000, 9085.0, 9085.0, 9051.02, 9064.96, 131.800654], [1524869400000, 9064.99, 9068.99, 9056.35, 9068.0, 55.68689], [1524869700000, 9068.99, 9068.99, 9030.01, 9031.0, 81.288218], [1524870000000, 9032.0, 9036.1, 9022.0, 9033.28, 114.693321], [1524870300000, 9033.28, 9064.97, 9032.01, 9063.6, 74.388156], [1524870600000, 9063.6, 9073.93, 9043.96, 9056.95, 69.477556], [1524870900000, 9058.99, 9059.0, 9038.0, 9040.0, 46.975833], [1524871200000, 9043.37, 9058.99, 9040.0, 9049.7, 64.342176], [1524871500000, 9050.49, 9058.97, 9034.99, 9038.0, 35.250271], [1524871800000, 9038.0, 9038.0, 8970.0, 8991.9, 199.180527], [1524872100000, 8990.99, 8991.9, 8970.1, 8982.99, 88.851302], [1524872400000, 8983.0, 8996.67, 8981.07, 8991.0, 104.271344], [1524872700000, 8990.99, 8996.0, 8968.45, 8979.82, 67.370601], [1524873000000, 8979.82, 8986.94, 8911.0, 8915.87, 197.311027], [1524873300000, 8923.62, 8929.79, 8889.0, 8915.35, 262.656837], [1524873600000, 8915.35, 8915.35, 8870.0, 8887.13, 302.432026], [1524873900000, 8895.66, 8932.8, 8884.0, 8913.97, 197.713596], [1524874200000, 8912.0, 8938.2, 8900.0, 8938.2, 128.982863], [1524874500000, 8938.2, 8949.01, 8916.14, 8943.04, 170.248259], [1524874800000, 8948.95, 8987.0, 8930.0, 8975.26, 96.324512], [1524875100000, 8980.0, 8982.72, 8961.71, 8976.98, 82.234713], [1524875400000, 8976.99, 9007.12, 8976.04, 8990.0, 104.88489], [1524875700000, 8989.99, 9033.82, 8981.0, 9033.82, 87.569231], [1524876000000, 9033.82, 9049.76, 9022.0, 9040.0, 100.002398], [1524876300000, 9040.0, 9041.0, 9007.2, 9040.0, 226.321606], [1524876600000, 9040.0, 9041.0, 8998.0, 9000.0, 148.634432], [1524876900000, 8999.8, 9011.02, 8988.99, 9010.11, 108.691794], [1524877200000, 9005.98, 9029.85, 9005.97, 9019.99, 123.034169], [1524877500000, 9019.0, 9019.0, 9000.0, 9017.07, 88.568039], [1524877800000, 9017.07, 9031.85, 9012.5, 9030.01, 80.992571], [1524878100000, 9030.01, 9038.08, 9024.0, 9038.08, 86.63113], [1524878400000, 9038.08, 9042.79, 9012.45, 9013.0, 98.37722], [1524878700000, 9020.5, 9035.99, 9013.01, 9035.0, 49.980048], [1524879000000, 9036.0, 9049.0, 9025.01, 9049.0, 36.898103], [1524879300000, 9049.0, 9078.64, 9042.8, 9075.2, 132.570753], [1524879600000, 9076.0, 9097.99, 9075.0, 9092.0, 174.937772], [1524879900000, 9095.93, 9095.94, 9075.0, 9090.0, 127.264184], [1524880200000, 9092.0, 9098.0, 9084.98, 9092.13, 123.727975], [1524880500000, 9090.01, 9126.81, 9085.0, 9126.81, 175.879484], [1524880800000, 9126.81, 9128.09, 9089.98, 9110.01, 177.008943], [1524881100000, 9110.01, 9129.17, 9100.32, 9123.95, 121.484369], [1524881400000, 9120.57, 9129.0, 9100.39, 9110.01, 70.790694], [1524881700000, 9108.0, 9115.0, 9075.19, 9085.0, 178.394866], [1524882000000, 9085.01, 9123.03, 9080.0, 9116.93, 125.837923], [1524882300000, 9117.99, 9117.99, 9100.0, 9100.33, 136.733858], [1524882600000, 9100.33, 9112.8, 9100.33, 9112.79, 72.770444], [1524882900000, 9112.79, 9119.0, 9105.25, 9108.06, 65.203598], [1524883200000, 9108.06, 9112.86, 9086.7, 9094.98, 75.994532], [1524883500000, 9094.99, 9094.99, 9073.68, 9084.72, 69.426213], [1524883800000, 9084.42, 9086.99, 9055.0, 9056.64, 117.390593], [1524884100000, 9056.64, 9072.86, 9050.0, 9055.78, 106.600025], [1524884400000, 9053.47, 9083.3, 9051.0, 9082.81, 36.921342], [1524884700000, 9082.8, 9086.0, 9075.76, 9085.0, 62.763055], [1524885000000, 9085.0, 9100.0, 9085.0, 9097.51, 92.894174], [1524885300000, 9096.28, 9097.51, 9093.0, 9095.1, 51.695194], [1524885600000, 9095.1, 9146.99, 9095.09, 9121.26, 154.991284], [1524885900000, 9121.26, 9130.26, 9110.46, 9112.27, 78.987087], [1524886200000, 9112.0, 9129.42, 9110.0, 9124.23, 58.328808], [1524886500000, 9124.23, 9130.0, 9108.94, 9115.23, 60.477084], [1524886800000, 9115.23, 9124.0, 9100.0, 9114.0, 54.735571], [1524887100000, 9114.0, 9140.0, 9114.0, 9137.61, 69.353824], [1524887400000, 9137.61, 9196.32, 9137.61, 9176.7, 272.432961], [1524887700000, 9176.7, 9181.66, 9152.44, 9155.0, 95.488285], [1524888000000, 9155.01, 9168.71, 9145.0, 9151.06, 107.200392], [1524888300000, 9151.06, 9151.11, 9137.72, 9140.97, 69.258449], [1524888600000, 9147.85, 9149.99, 9137.73, 9142.99, 54.618694], [1524888900000, 9142.99, 9145.97, 9130.01, 9140.56, 62.824666], [1524889200000, 9141.0, 9160.0, 9139.79, 9160.0, 74.431934], [1524889500000, 9159.99, 9162.34, 9153.0, 9160.95, 77.053455], [1524889800000, 9160.92, 9161.11, 9135.0, 9136.0, 86.896824], [1524890100000, 9143.98, 9155.0, 9131.0, 9149.8, 62.008718], [1524890400000, 9149.8, 9165.47, 9147.0, 9148.01, 47.044864], [1524890700000, 9148.01, 9158.0, 9144.36, 9148.05, 61.75724], [1524891000000, 9149.8, 9150.0, 9111.21, 9135.81, 78.034383], [1524891300000, 9135.74, 9149.0, 9121.03, 9138.53, 135.790711], [1524891600000, 9138.54, 9157.1, 9127.64, 9145.0, 83.922232], [1524891900000, 9144.0, 9168.2, 9142.0, 9168.09, 88.314886], [1524892200000, 9168.01, 9184.8, 9161.02, 9180.02, 96.661065], [1524892500000, 9180.02, 9188.5, 9167.06, 9172.05, 66.298234], [1524892800000, 9171.01, 9176.93, 9170.0, 9175.0, 55.888688], [1524893100000, 9175.0, 9177.78, 9151.45, 9157.1, 130.234571], [1524893400000, 9157.0, 9164.18, 9144.01, 9152.09, 101.157957], [1524893700000, 9153.77, 9163.57, 9141.3, 9162.85, 44.180913], [1524894000000, 9160.14, 9162.85, 9141.3, 9156.99, 55.259826], [1524894300000, 9150.02, 9157.0, 9140.67, 9153.33, 35.944951], [1524894600000, 9148.09, 9162.0, 9148.08, 9160.19, 57.846459], [1524894900000, 9160.19, 9169.0, 9152.0, 9164.49, 118.315541], [1524895200000, 9164.48, 9175.1, 9160.01, 9165.06, 70.473654], [1524895500000, 9165.06, 9198.61, 9165.06, 9175.0, 214.08311], [1524895800000, 9175.0, 9199.99, 9169.9, 9189.93, 150.035219], [1524896100000, 9189.93, 9200.0, 9177.08, 9196.01, 110.445079], [1524896400000, 9199.99, 9200.0, 9170.0, 9179.89, 101.340406], [1524896700000, 9179.79, 9185.13, 9170.02, 9184.0, 52.069816], [1524897000000, 9184.01, 9200.28, 9175.0, 9200.02, 101.820553], [1524897300000, 9200.12, 9200.89, 9180.0, 9182.0, 81.530433], [1524897600000, 9182.0, 9209.8, 9181.11, 9203.0, 142.765442], [1524897900000, 9203.0, 9215.66, 9200.0, 9215.0, 95.501122], [1524898200000, 9215.0, 9215.0, 9178.35, 9189.89, 118.774562], [1524898500000, 9187.0, 9189.86, 9150.67, 9163.03, 109.970379], [1524898800000, 9163.02, 9171.07, 9130.02, 9135.29, 140.211933], [1524899100000, 9136.0, 9136.01, 9128.0, 9132.98, 179.556117], [1524899400000, 9132.99, 9160.6, 9132.98, 9150.99, 88.476361], [1524899700000, 9151.0, 9157.85, 9146.0, 9147.74, 57.872797], [1524900000000, 9147.74, 9164.19, 9147.1, 9164.12, 51.636585], [1524900300000, 9164.18, 9165.0, 9153.6, 9153.67, 64.863922], [1524900600000, 9153.67, 9154.08, 9126.01, 9136.23, 126.890128], [1524900900000, 9140.53, 9144.97, 9108.99, 9125.0, 140.261038], [1524901200000, 9125.86, 9142.1, 9118.6, 9124.92, 86.852199], [1524901500000, 9129.81, 9129.81, 9110.0, 9125.03, 129.483599], [1524901800000, 9125.03, 9145.0, 9125.0, 9140.02, 77.138868], [1524902100000, 9140.02, 9140.02, 9118.7, 9126.22, 59.857268], [1524902400000, 9121.05, 9126.21, 9106.1, 9114.0, 72.431991], [1524902700000, 9114.0, 9114.93, 9084.73, 9095.98, 173.606325], [1524903000000, 9091.11, 9102.0, 9081.02, 9088.99, 93.240201], [1524903300000, 9089.0, 9110.0, 9085.02, 9106.64, 105.319139], [1524903600000, 9106.64, 9110.0, 9088.98, 9090.5, 124.503822], [1524903900000, 9090.5, 9098.0, 9086.96, 9090.0, 58.302573], [1524904200000, 9090.0, 9258.0, 9088.96, 9246.33, 428.46146], [1524904500000, 9246.33, 9298.72, 9246.3, 9271.06, 481.334723], [1524904800000, 9274.97, 9330.0, 9267.55, 9320.0, 445.043953], [1524905100000, 9315.0, 9325.0, 9276.82, 9294.76, 305.81893], [1524905400000, 9295.0, 9307.0, 9281.0, 9292.69, 126.406359], [1524905700000, 9293.98, 9312.91, 9190.0, 9217.48, 634.283897], [1524906000000, 9227.49, 9250.0, 9155.55, 9191.17, 449.975722], [1524906300000, 9191.17, 9223.78, 9155.06, 9223.65, 236.594436], [1524906600000, 9219.0, 9223.77, 9184.07, 9195.61, 93.84023], [1524906900000, 9195.6, 9210.0, 9171.02, 9195.87, 150.555622], [1524907200000, 9192.99, 9231.87, 9188.12, 9224.99, 139.129652], [1524907500000, 9223.02, 9288.0, 9221.0, 9276.13, 200.807481], [1524907800000, 9270.0, 9280.0, 9245.0, 9248.03, 152.868223], [1524908100000, 9248.03, 9300.4, 9224.11, 9279.0, 257.291229], [1524908400000, 9272.63, 9286.27, 9269.02, 9275.0, 107.636074], [1524908700000, 9275.0, 9280.08, 9270.12, 9276.85, 58.185788], [1524909000000, 9276.85, 9276.85, 9242.07, 9260.0, 80.715601], [1524909300000, 9256.05, 9275.0, 9256.05, 9273.0, 45.435025], [1524909600000, 9273.0, 9275.0, 9263.12, 9272.03, 36.344275], [1524909900000, 9272.05, 9310.0, 9257.8, 9286.96, 323.06135], [1524910200000, 9280.75, 9309.51, 9270.0, 9277.91, 67.99835]], "15m": [[1524460500000, 8842.34, 8850.0, 8830.0, 8841.0, 123.237625], [1524461400000, 8842.23, 8855.0, 8831.99, 8838.0, 137.309909], [1524462300000, 8837.99, 8883.0, 8836.99, 8879.0, 294.515866], [1524463200000, 8878.04, 8879.0, 8853.0, 8855.02, 230.79729], [1524464100000, 8856.01, 8870.7, 8855.01, 8870.0, 271.712256], [1524465000000, 8866.0, 8907.45, 8850.0, 8907.45, 401.787323], [1524465900000, 8907.45, 8929.0, 8874.67, 8899.0, 497.616777], [1524466800000, 8899.0, 8952.88, 8895.45, 8941.47, 531.385882], [1524467700000, 8941.47, 8970.01, 8927.58, 8950.95, 619.543843], [1524468600000, 8947.42, 8955.0, 8932.0, 8939.87, 395.229777], [1524469500000, 8939.83, 8950.0, 8918.31, 8942.39, 283.570789], [1524470400000, 8942.0, 8953.89, 8932.0, 8952.46, 336.264842], [1524471300000, 8949.04, 8957.04, 8936.01, 8940.01, 264.518463], [1524472200000, 8940.02, 8949.0, 8892.98, 8917.06, 366.373662], [1524473100000, 8917.06, 8933.4, 8894.5, 8900.31, 377.409799], [1524474000000, 8903.0, 8910.0, 8886.95, 8890.07, 322.018671], [1524474900000, 8900.55, 8901.0, 8831.0, 8864.2, 740.318666], [1524475800000, 8865.04, 8898.77, 8864.0, 8893.01, 294.631613], [1524476700000, 8893.01, 8914.57, 8890.04, 8905.0, 302.18871], [1524477600000, 8905.0, 8905.3, 8888.0, 8895.0, 275.6156], [1524478500000, 8892.83, 8920.0, 8874.71, 8911.79, 360.919111], [1524479400000, 8912.34, 8922.0, 8899.42, 8909.61, 237.043065], [1524480300000, 8905.35, 8914.87, 8885.6, 8889.0, 171.699895], [1524481200000, 8889.0, 8899.99, 8877.75, 8894.0, 205.959228], [1524482100000, 8889.05, 8897.59, 8882.99, 8888.0, 170.420994], [1524483000000, 8887.98, 8923.0, 8883.02, 8900.0, 342.142137], [1524483900000, 8903.0, 8915.0, 8892.73, 8910.02, 158.134765], [1524484800000, 8910.02, 8928.0, 8910.01, 8921.63, 249.781468], [1524485700000, 8921.63, 8985.0, 8921.63, 8960.01, 687.254851], [1524486600000, 8969.99, 8970.9, 8911.06, 8913.07, 421.985419], [1524487500000, 8913.07, 8940.74, 8897.75, 8940.74, 317.001614], [1524488400000, 8940.0, 8944.9, 8920.0, 8930.0, 186.408603], [1524489300000, 8936.91, 8936.91, 8900.0, 8929.19, 241.004209], [1524490200000, 8929.18, 8939.0, 8910.0, 8938.99, 212.800158], [1524491100000, 8938.99, 8945.0, 8922.27, 8929.0, 249.596928], [1524492000000, 8934.39, 8940.0, 8895.0, 8896.85, 264.113953], [1524492900000, 8896.85, 8927.27, 8895.0, 8900.0, 377.522036], [1524493800000, 8900.0, 8905.0, 8858.08, 8888.98, 522.599272], [1524494700000, 8891.0, 8932.69, 8888.0, 8919.0, 312.142738], [1524495600000, 8919.0, 8935.0, 8914.01, 8917.87, 292.675585], [1524496500000, 8918.01, 8919.98, 8901.0, 8903.92, 165.5797], [1524497400000, 8903.92, 8914.95, 8888.0, 8907.0, 281.496356], [1524498300000, 8906.08, 8916.0, 8888.0, 8898.0, 203.342507], [1524499200000, 8898.0, 8929.35, 8892.02, 8925.0, 286.283037], [1524500100000, 8925.99, 8936.0, 8920.0, 8930.0, 201.125634], [1524501000000, 8928.1, 8938.21, 8928.1, 8928.1, 250.209228], [1524501900000, 8928.1, 8930.92, 8907.5, 8911.54, 259.970895], [1524502800000, 8912.77, 8917.58, 8874.0, 8890.43, 306.585465], [1524503700000, 8894.99, 8899.98, 8861.42, 8878.55, 281.279808], [1524504600000, 8878.55, 8888.3, 8863.48, 8879.63, 232.730537], [1524505500000, 8872.0, 8887.67, 8870.0, 8886.0, 165.958222], [1524506400000, 8887.67, 8900.0, 8877.01, 8879.25, 173.874203], [1524507300000, 8879.5, 8900.0, 8878.2, 8898.2, 163.800897], [1524508200000, 8896.0, 8915.0, 8890.0, 8899.99, 169.16055], [1524509100000, 8899.99, 8908.37, 8892.4, 8893.99, 205.083605], [1524510000000, 8894.0, 8896.99, 8884.0, 8887.98, 196.554954], [1524510900000, 8887.98, 8900.0, 8870.0, 8878.0, 252.176402], [1524511800000, 8878.0, 8888.0, 8866.89, 8870.11, 197.152269], [1524512700000, 8870.11, 8872.0, 8800.6, 8847.37, 667.424359], [1524513600000, 8847.37, 8858.99, 8825.01, 8858.0, 246.344867], [1524514500000, 8858.0, 8880.0, 8851.0, 8868.0, 192.02854], [1524515400000, 8868.0, 8917.33, 8867.01, 8899.99, 231.847302], [1524516300000, 8899.99, 8928.0, 8892.28, 8924.11, 246.913109], [1524517200000, 8924.11, 8925.04, 8912.0, 8920.0, 166.19887], [1524518100000, 8920.0, 8924.87, 8912.0, 8924.31, 135.944266], [1524519000000, 8924.31, 8924.88, 8903.93, 8915.01, 154.875798], [1524519900000, 8915.02, 8926.76, 8909.0, 8922.0, 245.427785], [1524520800000, 8925.8, 8947.64, 8924.15, 8928.98, 446.538009], [1524521700000, 8926.95, 8933.55, 8916.48, 8930.0, 122.575638], [1524522600000, 8930.53, 8938.22, 8925.0, 8932.0, 146.164122], [1524523500000, 8932.0, 8932.0, 8909.59, 8920.02, 150.973289], [1524524400000, 8924.12, 8929.35, 8906.87, 8922.0, 169.655142], [1524525300000, 8922.0, 8931.96, 8890.21, 8899.0, 168.249094], [1524526200000, 8897.84, 8929.01, 8888.0, 8928.69, 166.845751], [1524527100000, 8928.69, 8949.98, 8924.0, 8934.01, 221.732389], [1524528000000, 8934.0, 8949.91, 8922.0, 8936.03, 263.333094], [1524528900000, 8936.04, 8975.0, 8936.03, 8974.95, 470.49302], [1524529800000, 8973.02, 9189.0, 8972.99, 9174.0, 2190.166077], [1524530700000, 9174.0, 9219.0, 9147.0, 9169.97, 1040.95026], [1524531600000, 9169.97, 9170.0, 9109.81, 9160.0, 691.494486], [1524532500000, 9159.99, 9167.98, 9139.0, 9167.98, 291.809587], [1524533400000, 9167.98, 9194.0, 9124.02, 9166.73, 478.125382], [1524534300000, 9169.0, 9189.9, 9156.54, 9186.0, 242.992328], [1524535200000, 9186.01, 9230.15, 9178.0, 9224.77, 555.920197], [1524536100000, 9224.77, 9229.0, 9177.0, 9177.01, 454.856822], [1524537000000, 9183.0, 9195.5, 9150.0, 9177.0, 463.544264], [1524537900000, 9176.46, 9200.01, 9156.01, 9189.86, 384.061398], [1524538800000, 9185.01, 9194.0, 9166.0, 9183.97, 263.109537], [1524539700000, 9184.12, 9200.0, 9177.0, 9194.98, 313.214909], [1524540600000, 9194.98, 9211.47, 9186.91, 9201.0, 513.226448], [1524541500000, 9201.0, 9209.77, 9191.87, 9192.47, 303.228916], [1524542400000, 9192.48, 9229.04, 9192.47, 9225.2, 408.301647], [1524543300000, 9225.2, 9225.45, 9190.0, 9220.0, 419.405152], [1524544200000, 9219.99, 9258.0, 9215.0, 9235.29, 500.18579], [1524545100000, 9235.3, 9279.98, 9233.02, 9266.3, 458.236483], [1524546000000, 9266.3, 9279.4, 9225.0, 9250.0, 368.36475], [1524546900000, 9249.96, 9256.01, 9214.0, 9224.82, 368.660192], [1524547800000, 9222.0, 9284.0, 9220.0, 9262.98, 461.496341], [1524548700000, 9263.01, 9300.0, 9263.0, 9271.11, 476.933326], [1524549600000, 9271.14, 9278.81, 9251.65, 9271.0, 269.233548], [1524550500000, 9276.0, 9276.9, 9235.01, 9236.0, 304.76478], [1524551400000, 9242.53, 9250.0, 9225.0, 9245.02, 295.321485], [1524552300000, 9245.04, 9257.99, 9221.01, 9227.37, 311.604416], [1524553200000, 9235.0, 9243.27, 9177.0, 9196.01, 782.022154], [1524554100000, 9196.01, 9243.0, 9196.0, 9225.0, 282.399662], [1524555000000, 9225.0, 9235.64, 9208.0, 9235.17, 187.060165], [1524555900000, 9235.64, 9238.68, 9208.0, 9216.0, 248.377353], [1524556800000, 9217.98, 9249.0, 9216.0, 9238.01, 252.555585], [1524557700000, 9239.0, 9263.27, 9239.0, 9254.0, 201.720044], [1524558600000, 9254.0, 9270.0, 9252.0, 9258.01, 229.20839], [1524559500000, 9258.88, 9266.86, 9244.0, 9249.99, 173.047345], [1524560400000, 9246.6, 9285.0, 9246.6, 9265.0, 296.049595], [1524561300000, 9265.0, 9270.97, 9217.03, 9245.79, 327.590702], [1524562200000, 9250.0, 9270.0, 9243.01, 9267.5, 213.578607], [1524563100000, 9270.0, 9285.78, 9265.01, 9285.0, 367.532862], [1524564000000, 9285.0, 9307.5, 9275.0, 9307.0, 604.07526], [1524564900000, 9307.0, 9317.0, 9281.0, 9301.65, 662.484004], [1524565800000, 9301.65, 9349.0, 9285.0, 9295.0, 653.42112], [1524566700000, 9296.0, 9308.9, 9280.0, 9292.15, 417.679253], [1524567600000, 9292.15, 9332.62, 9292.01, 9332.62, 267.2103], [1524568500000, 9332.62, 9332.79, 9309.14, 9314.74, 254.242099], [1524569400000, 9314.66, 9317.0, 9284.98, 9300.0, 278.176272], [1524570300000, 9291.25, 9300.0, 9273.22, 9294.57, 354.336666], [1524571200000, 9294.59, 9318.0, 9290.0, 9315.0, 327.236012], [1524572100000, 9317.0, 9329.8, 9311.0, 9324.87, 359.856852], [1524573000000, 9324.63, 9345.0, 9319.85, 9335.0, 316.521842], [1524573900000, 9334.51, 9383.66, 9320.01, 9380.0, 400.134768], [1524574800000, 9376.01, 9380.0, 9327.18, 9369.01, 419.015789], [1524575700000, 9369.82, 9385.0, 9350.01, 9380.01, 598.589172], [1524576600000, 9380.0, 9420.0, 9350.61, 9374.0, 680.702463], [1524577500000, 9371.2, 9374.0, 9221.0, 9259.99, 1706.784088], [1524578400000, 9259.99, 9291.0, 9155.0, 9270.0, 1744.952652], [1524579300000, 9270.0, 9284.0, 9232.17, 9279.0, 665.867436], [1524580200000, 9280.0, 9323.5, 9270.15, 9323.5, 480.0483], [1524581100000, 9323.5, 9331.0, 9285.32, 9289.69, 340.000766], [1524582000000, 9289.69, 9331.5, 9288.21, 9324.0, 384.784215], [1524582900000, 9324.0, 9370.0, 9313.11, 9344.01, 342.356761], [1524583800000, 9344.0, 9360.0, 9311.27, 9314.8, 353.323079], [1524584700000, 9314.4, 9347.77, 9301.0, 9347.77, 371.013813], [1524585600000, 9347.78, 9349.99, 9330.0, 9344.8, 296.581175], [1524586500000, 9344.8, 9380.0, 9337.0, 9345.99, 440.102818], [1524587400000, 9345.99, 9350.0, 9309.0, 9341.99, 424.276659], [1524588300000, 9341.99, 9368.8, 9329.38, 9350.19, 326.352332], [1524589200000, 9350.19, 9360.0, 9333.0, 9340.0, 197.767722], [1524590100000, 9338.99, 9398.85, 9337.0, 9374.0, 319.328972], [1524591000000, 9374.98, 9395.0, 9370.87, 9379.0, 267.677818], [1524591900000, 9378.01, 9415.95, 9375.0, 9409.97, 452.08338], [1524592800000, 9410.0, 9410.0, 9356.0, 9371.01, 410.119091], [1524593700000, 9371.03, 9380.0, 9350.0, 9371.01, 301.283979], [1524594600000, 9371.02, 9390.0, 9365.0, 9385.01, 300.893724], [1524595500000, 9384.01, 9411.0, 9384.01, 9410.99, 491.703088], [1524596400000, 9410.99, 9414.98, 9384.0, 9401.0, 362.648955], [1524597300000, 9400.0, 9412.0, 9293.29, 9383.98, 919.869209], [1524598200000, 9383.98, 9455.0, 9362.13, 9410.13, 658.594816], [1524599100000, 9416.99, 9452.0, 9411.0, 9449.9, 350.210987], [1524600000000, 9452.0, 9463.0, 9400.04, 9427.21, 489.240945], [1524600900000, 9426.0, 9443.0, 9405.4, 9438.0, 270.725789], [1524601800000, 9438.0, 9446.42, 9409.95, 9440.0, 310.513092], [1524602700000, 9439.79, 9459.0, 9432.97, 9450.79, 391.411326], [1524603600000, 9450.79, 9495.0, 9448.99, 9489.86, 475.227715], [1524604500000, 9489.86, 9491.17, 9439.13, 9466.89, 610.579046], [1524605400000, 9466.89, 9490.5, 9445.03, 9478.9, 382.821689], [1524606300000, 9478.0, 9478.99, 9450.0, 9468.0, 352.58637], [1524607200000, 9469.0, 9489.98, 9463.1, 9484.0, 513.360813], [1524608100000, 9483.25, 9559.82, 9479.02, 9550.89, 805.81602], [1524609000000, 9552.01, 9583.61, 9425.01, 9485.97, 956.754334], [1524609900000, 9475.01, 9580.0, 9462.0, 9559.75, 684.670583], [1524610800000, 9559.75, 9559.75, 9511.0, 9544.98, 461.151763], [1524611700000, 9544.98, 9636.47, 9528.0, 9635.05, 828.881447], [1524612600000, 9635.0, 9700.0, 9618.35, 9699.0, 789.210246], [1524613500000, 9699.99, 9731.01, 9589.78, 9619.99, 1319.354122], [1524614400000, 9618.96, 9678.34, 9566.0, 9664.99, 1173.929043], [1524615300000, 9649.49, 9680.0, 9551.79, 9580.01, 781.035688], [1524616200000, 9584.96, 9589.0, 9440.0, 9580.02, 1522.142556], [1524617100000, 9580.02, 9591.05, 9511.93, 9529.94, 699.610086], [1524618000000, 9529.21, 9550.0, 9466.01, 9550.0, 682.352162], [1524618900000, 9550.0, 9593.48, 9545.02, 9590.0, 442.401324], [1524619800000, 9590.0, 9637.17, 9583.59, 9616.09, 615.313836], [1524620700000, 9619.0, 9638.68, 9590.02, 9628.0, 422.267292], [1524621600000, 9628.0, 9673.0, 9530.0, 9633.0, 661.225277], [1524622500000, 9638.9, 9720.0, 9632.0, 9665.99, 716.020241], [1524623400000, 9665.99, 9759.82, 9659.04, 9739.88, 805.230478], [1524624300000, 9737.0, 9744.0, 9665.96, 9687.05, 743.566674], [1524625200000, 9675.01, 9729.88, 9670.01, 9702.0, 426.865361], [1524626100000, 9702.01, 9703.02, 9580.96, 9624.24, 826.641991], [1524627000000, 9630.0, 9649.99, 9584.0, 9591.88, 803.15528], [1524627900000, 9598.01, 9598.01, 9323.02, 9347.99, 2693.595485], [1524628800000, 9349.99, 9500.0, 9330.01, 9430.08, 1686.21148], [1524629700000, 9433.0, 9480.0, 9323.02, 9363.0, 1079.808512], [1524630600000, 9365.55, 9402.0, 9223.0, 9260.07, 2001.612726], [1524631500000, 9260.08, 9298.0, 9110.0, 9200.0, 2581.434896], [1524632400000, 9200.22, 9365.07, 9190.0, 9329.96, 1972.623364], [1524633300000, 9330.07, 9411.0, 9280.66, 9364.26, 1104.200884], [1524634200000, 9364.23, 9393.28, 9316.0, 9331.66, 703.866923], [1524635100000, 9334.0, 9396.0, 9303.0, 9370.0, 691.059498], [1524636000000, 9370.0, 9466.0, 9355.0, 9450.08, 805.651916], [1524636900000, 9455.0, 9476.23, 9428.0, 9441.1, 706.595004], [1524637800000, 9441.1, 9453.56, 9377.0, 9410.0, 518.607298], [1524638700000, 9411.29, 9445.94, 9402.0, 9415.06, 277.620532], [1524639600000, 9415.06, 9460.01, 9402.38, 9433.0, 375.830093], [1524640500000, 9434.95, 9468.0, 9415.0, 9454.22, 373.302303], [1524641400000, 9450.02, 9460.0, 9420.0, 9435.0, 345.305315], [1524642300000, 9435.0, 9440.0, 9322.0, 9416.39, 711.733353], [1524643200000, 9415.0, 9438.54, 9392.65, 9416.85, 490.794409], [1524644100000, 9418.01, 9428.02, 9338.0, 9366.87, 470.345707], [1524645000000, 9370.0, 9409.35, 9349.01, 9360.06, 328.541443], [1524645900000, 9362.72, 9364.86, 9251.0, 9281.98, 773.054919], [1524646800000, 9281.98, 9340.0, 9270.02, 9323.0, 490.261082], [1524647700000, 9323.0, 9331.28, 9268.07, 9309.84, 417.133867], [1524648600000, 9309.1, 9310.11, 9200.1, 9229.49, 836.427785], [1524649500000, 9227.07, 9289.8, 9210.5, 9272.0, 688.904683], [1524650400000, 9271.09, 9280.0, 9225.0, 9239.98, 525.98002], [1524651300000, 9239.98, 9244.97, 9086.0, 9090.0, 1963.0004], [1524652200000, 9090.0, 9160.1, 9035.21, 9045.25, 1900.412184], [1524653100000, 9050.0, 9150.0, 8960.0, 9140.68, 2424.370008], [1524654000000, 9140.0, 9154.39, 9070.0, 9083.91, 1121.392287], [1524654900000, 9083.9, 9083.9, 8980.0, 9012.95, 1115.19957], [1524655800000, 9012.98, 9106.95, 9010.0, 9041.09, 680.692803], [1524656700000, 9041.09, 9189.39, 9004.36, 9144.03, 1185.601193], [1524657600000, 9137.0, 9210.21, 9122.01, 9153.68, 1294.170498], [1524658500000, 9154.0, 9172.0, 9071.0, 9083.54, 854.762498], [1524659400000, 9088.12, 9179.0, 9086.2, 9169.98, 499.95441], [1524660300000, 9171.06, 9205.0, 9115.0, 9129.89, 624.9171], [1524661200000, 9129.84, 9159.03, 9102.46, 9135.23, 448.6697], [1524662100000, 9135.23, 9158.88, 9020.0, 9051.76, 752.129198], [1524663000000, 9054.98, 9100.0, 8925.8, 8963.01, 1237.776003], [1524663900000, 8962.99, 9056.38, 8954.09, 9011.78, 1226.799107], [1524664800000, 9011.79, 9042.93, 8860.0, 8877.87, 1285.565224], [1524665700000, 8877.88, 8950.0, 8840.07, 8845.0, 1603.874666], [1524666600000, 8844.66, 8916.04, 8781.62, 8805.07, 2242.715227], [1524667500000, 8805.07, 8917.0, 8730.0, 8880.0, 2221.545476], [1524668400000, 8874.33, 8900.0, 8825.0, 8869.99, 1106.891449], [1524669300000, 8869.99, 8975.0, 8869.1, 8889.0, 1229.136544], [1524670200000, 8882.79, 8946.4, 8854.02, 8939.12, 855.452868], [1524671100000, 8938.94, 8975.0, 8910.0, 8972.09, 692.601191], [1524672000000, 8972.09, 8977.0, 8860.0, 8893.0, 967.750886], [1524672900000, 8880.31, 8900.02, 8846.0, 8860.48, 670.436057], [1524673800000, 8865.22, 8930.75, 8847.0, 8909.65, 472.128441], [1524674700000, 8896.16, 8946.0, 8890.19, 8910.0, 486.395757], [1524675600000, 8908.32, 8968.0, 8908.28, 8965.99, 533.847191], [1524676500000, 8965.99, 9039.73, 8935.99, 9028.94, 823.254173], [1524677400000, 9023.81, 9089.0, 8994.98, 9088.99, 912.779608], [1524678300000, 9080.84, 9088.99, 9021.12, 9058.0, 535.273177], [1524679200000, 9055.1, 9063.58, 8975.0, 9010.73, 650.386072], [1524680100000, 9013.0, 9031.4, 8968.0, 9017.02, 408.204094], [1524681000000, 9018.0, 9050.0, 8992.0, 9039.99, 344.359066], [1524681900000, 9039.99, 9042.22, 8951.0, 8991.03, 413.692354], [1524682800000, 8991.04, 9020.01, 8976.03, 9004.1, 261.422682], [1524683700000, 9006.99, 9025.0, 8966.0, 8969.02, 293.2567], [1524684600000, 8966.11, 9018.49, 8948.05, 8989.98, 479.43203], [1524685500000, 8989.99, 9000.75, 8950.0, 8969.98, 276.394504], [1524686400000, 8969.55, 9068.85, 8963.54, 9060.0, 524.958602], [1524687300000, 9060.0, 9068.85, 9040.11, 9068.85, 275.024777], [1524688200000, 9068.0, 9116.91, 9061.12, 9102.66, 531.593589], [1524689100000, 9102.66, 9109.98, 9075.0, 9083.0, 336.35929], [1524690000000, 9085.16, 9130.0, 9076.01, 9127.0, 361.792369], [1524690900000, 9129.0, 9159.9, 9120.0, 9128.01, 567.549618], [1524691800000, 9130.01, 9150.0, 9116.28, 9122.0, 372.515476], [1524692700000, 9121.5, 9179.0, 9115.33, 9178.98, 532.866007], [1524693600000, 9178.98, 9185.01, 9102.01, 9124.79, 594.209661], [1524694500000, 9117.64, 9142.82, 9062.02, 9099.82, 651.466237], [1524695400000, 9099.8, 9104.4, 9064.01, 9066.44, 349.339815], [1524696300000, 9066.01, 9066.01, 8926.0, 8955.0, 993.909812], [1524697200000, 8950.0, 9007.6, 8875.1, 8913.43, 826.99588], [1524698100000, 8913.44, 8931.18, 8820.0, 8830.01, 555.673515], [1524699000000, 8831.57, 8889.63, 8800.01, 8805.0, 648.260931], [1524699900000, 8819.98, 8886.68, 8770.0, 8869.99, 918.618828], [1524700800000, 8869.99, 8869.99, 8752.04, 8819.37, 748.935661], [1524701700000, 8819.34, 8830.0, 8667.01, 8701.34, 1143.901965], [1524702600000, 8693.55, 8800.0, 8660.0, 8745.02, 1331.701608], [1524703500000, 8745.02, 8839.0, 8720.01, 8800.02, 633.17511], [1524704400000, 8808.17, 8830.0, 8720.13, 8807.0, 542.109248], [1524705300000, 8807.0, 8860.0, 8790.0, 8850.0, 536.573469], [1524706200000, 8854.66, 8863.85, 8810.0, 8831.57, 448.764779], [1524707100000, 8831.54, 8834.44, 8750.95, 8752.82, 445.378297], [1524708000000, 8755.06, 8831.0, 8751.0, 8825.46, 493.863212], [1524708900000, 8830.61, 8857.01, 8809.17, 8842.25, 413.85608], [1524709800000, 8842.25, 8889.94, 8823.0, 8880.0, 368.204864], [1524710700000, 8884.53, 8899.0, 8849.48, 8850.15, 361.227284], [1524711600000, 8850.22, 8888.0, 8827.0, 8883.0, 351.118912], [1524712500000, 8882.13, 8890.0, 8849.77, 8854.0, 376.316699], [1524713400000, 8853.99, 8859.98, 8763.14, 8819.0, 474.58878], [1524714300000, 8819.0, 8829.0, 8791.0, 8808.02, 227.968127], [1524715200000, 8812.7, 8871.07, 8800.0, 8860.0, 475.793683], [1524716100000, 8864.0, 8886.92, 8852.55, 8874.49, 321.312794], [1524717000000, 8873.8, 8932.69, 8862.49, 8907.04, 649.535684], [1524717900000, 8910.72, 8940.01, 8881.01, 8935.0, 691.694952], [1524718800000, 8936.0, 8977.0, 8901.46, 8961.85, 717.373256], [1524719700000, 8961.85, 8965.0, 8902.0, 8904.93, 396.698669], [1524720600000, 8904.9, 8937.0, 8880.0, 8885.43, 538.227401], [1524721500000, 8885.16, 8916.56, 8874.0, 8916.56, 398.105076], [1524722400000, 8905.88, 8945.34, 8901.1, 8934.01, 271.367533], [1524723300000, 8934.0, 8943.98, 8888.88, 8896.98, 351.446775], [1524724200000, 8888.91, 8906.94, 8771.0, 8805.94, 998.783557], [1524725100000, 8808.0, 8850.0, 8801.01, 8841.0, 520.748141], [1524726000000, 8841.04, 8853.5, 8803.0, 8814.99, 452.894556], [1524726900000, 8811.11, 8835.97, 8810.0, 8825.33, 256.695688], [1524727800000, 8825.21, 8868.99, 8812.03, 8866.8, 314.780939], [1524728700000, 8866.8, 8888.99, 8838.63, 8847.97, 336.684857], [1524729600000, 8847.97, 8887.8, 8820.0, 8830.84, 362.134049], [1524730500000, 8826.7, 8848.07, 8701.01, 8750.0, 933.445022], [1524731400000, 8750.0, 8772.0, 8680.0, 8743.81, 844.791247], [1524732300000, 8743.8, 8755.29, 8705.0, 8720.5, 623.31932], [1524733200000, 8720.58, 8773.0, 8716.01, 8759.0, 446.103175], [1524734100000, 8759.0, 8770.0, 8720.0, 8724.87, 414.808159], [1524735000000, 8723.0, 8726.02, 8651.62, 8708.85, 727.608275], [1524735900000, 8708.86, 8751.09, 8705.91, 8746.0, 429.193888], [1524736800000, 8746.0, 8794.43, 8738.14, 8789.0, 367.390203], [1524737700000, 8787.89, 8865.0, 8760.0, 8848.39, 494.65076], [1524738600000, 8848.39, 8881.0, 8819.0, 8864.99, 544.067369], [1524739500000, 8859.01, 8874.25, 8816.0, 8845.02, 411.579622], [1524740400000, 8844.98, 8880.0, 8819.0, 8880.0, 377.89327], [1524741300000, 8880.0, 8917.51, 8835.0, 8847.98, 433.037134], [1524742200000, 8845.04, 8874.6, 8835.01, 8849.0, 296.762343], [1524743100000, 8849.0, 8872.08, 8846.34, 8857.01, 311.781217], [1524744000000, 8858.51, 8925.0, 8857.01, 8915.03, 376.462557], [1524744900000, 8915.04, 8945.0, 8865.24, 8884.0, 493.915306], [1524745800000, 8880.2, 8925.04, 8871.55, 8910.33, 344.641635], [1524746700000, 8911.73, 8924.8, 8894.0, 8900.01, 243.670429], [1524747600000, 8904.78, 8904.93, 8839.0, 8866.0, 410.173493], [1524748500000, 8866.0, 8870.0, 8785.0, 8838.7, 415.115447], [1524749400000, 8839.0, 8859.98, 8801.0, 8859.98, 223.177838], [1524750300000, 8859.98, 8875.0, 8810.63, 8829.63, 282.481614], [1524751200000, 8828.27, 8873.0, 8826.9, 8866.53, 232.368104], [1524752100000, 8866.53, 8885.0, 8764.86, 8769.49, 613.639449], [1524753000000, 8763.99, 8809.0, 8740.01, 8756.51, 428.613857], [1524753900000, 8756.51, 8840.0, 8750.03, 8829.99, 479.154659], [1524754800000, 8829.99, 8830.0, 8787.21, 8799.99, 279.872144], [1524755700000, 8799.99, 8821.97, 8768.6, 8811.03, 298.899445], [1524756600000, 8811.03, 8831.85, 8782.06, 8794.25, 326.108962], [1524757500000, 8794.25, 8832.0, 8785.27, 8806.1, 253.328428], [1524758400000, 8806.1, 8818.7, 8775.89, 8815.14, 297.454772], [1524759300000, 8816.66, 8872.99, 8815.0, 8857.28, 497.91022], [1524760200000, 8856.22, 8894.0, 8841.14, 8876.99, 333.24811], [1524761100000, 8875.98, 8908.53, 8873.85, 8900.51, 342.873402], [1524762000000, 8899.0, 8902.42, 8867.5, 8884.89, 291.827552], [1524762900000, 8884.0, 8925.0, 8860.35, 8871.87, 326.29298], [1524763800000, 8875.0, 8898.92, 8846.0, 8854.0, 257.7916], [1524764700000, 8854.0, 8889.13, 8845.03, 8866.43, 245.884519], [1524765600000, 8866.43, 8876.29, 8839.53, 8869.0, 147.926988], [1524766500000, 8869.73, 8909.0, 8860.0, 8882.92, 220.496403], [1524767400000, 8882.92, 8893.9, 8852.0, 8860.84, 140.586805], [1524768300000, 8860.83, 8860.83, 8834.02, 8845.09, 200.534119], [1524769200000, 8845.1, 8869.99, 8838.35, 8865.85, 165.938086], [1524770100000, 8860.99, 8869.99, 8846.0, 8866.0, 202.912286], [1524771000000, 8866.0, 8895.21, 8860.0, 8876.0, 198.89489], [1524771900000, 8880.0, 8888.88, 8861.0, 8881.54, 92.619623], [1524772800000, 8880.0, 9087.0, 8880.0, 9073.99, 1098.232808], [1524773700000, 9070.21, 9138.0, 9027.94, 9096.96, 918.768172], [1524774600000, 9104.96, 9124.88, 9062.72, 9106.26, 476.774071], [1524775500000, 9106.26, 9137.4, 9075.0, 9123.99, 511.019423], [1524776400000, 9123.99, 9135.04, 9090.0, 9105.0, 420.524914], [1524777300000, 9114.81, 9168.98, 9100.0, 9167.02, 344.951161], [1524778200000, 9167.02, 9169.9, 9066.02, 9122.0, 592.904449], [1524779100000, 9122.01, 9130.0, 9078.02, 9099.0, 306.790777], [1524780000000, 9100.0, 9141.99, 9096.01, 9135.17, 333.092614], [1524780900000, 9135.17, 9174.11, 9135.17, 9158.05, 377.715707], [1524781800000, 9156.72, 9171.0, 9131.0, 9171.0, 337.373407], [1524782700000, 9170.08, 9235.99, 9150.0, 9221.0, 919.478889], [1524783600000, 9221.0, 9288.0, 9215.01, 9225.0, 842.400578], [1524784500000, 9223.73, 9250.2, 9188.0, 9237.0, 514.479912], [1524785400000, 9237.0, 9269.99, 9230.01, 9258.99, 434.323157], [1524786300000, 9259.01, 9307.48, 9257.88, 9266.0, 598.265775], [1524787200000, 9267.03, 9297.0, 9215.0, 9226.61, 607.719448], [1524788100000, 9226.94, 9284.77, 9217.01, 9247.67, 379.792675], [1524789000000, 9249.01, 9249.5, 9177.0, 9210.0, 512.070948], [1524789900000, 9210.0, 9245.56, 9200.0, 9210.32, 309.648801], [1524790800000, 9210.29, 9265.0, 9210.21, 9242.32, 351.124294], [1524791700000, 9242.3, 9292.0, 9242.25, 9254.76, 461.444332], [1524792600000, 9250.0, 9270.0, 9220.0, 9255.0, 266.548876], [1524793500000, 9255.0, 9255.0, 9214.0, 9249.97, 276.33081], [1524794400000, 9240.0, 9259.99, 9239.64, 9251.01, 312.328182], [1524795300000, 9259.35, 9282.0, 9252.34, 9273.5, 302.210235], [1524796200000, 9272.32, 9277.0, 9237.0, 9249.0, 251.486267], [1524797100000, 9248.0, 9260.0, 9233.51, 9255.49, 190.370896], [1524798000000, 9255.5, 9258.0, 9213.25, 9220.02, 345.902361], [1524798900000, 9220.01, 9235.0, 9216.42, 9227.03, 203.735845], [1524799800000, 9227.03, 9232.06, 9130.1, 9161.45, 697.044991], [1524800700000, 9156.81, 9200.0, 9123.25, 9143.01, 803.349009], [1524801600000, 9143.01, 9220.0, 9104.88, 9173.32, 587.971335], [1524802500000, 9173.31, 9213.67, 9162.76, 9209.35, 310.812529], [1524803400000, 9209.35, 9230.0, 9175.59, 9224.0, 302.227695], [1524804300000, 9224.0, 9235.0, 9203.08, 9204.99, 303.831046], [1524805200000, 9205.0, 9229.59, 9188.0, 9203.04, 221.953885], [1524806100000, 9203.04, 9217.54, 9189.8, 9213.0, 177.407483], [1524807000000, 9217.54, 9229.0, 9196.0, 9210.0, 284.716333], [1524807900000, 9210.0, 9212.07, 9160.0, 9180.82, 271.121463], [1524808800000, 9184.99, 9220.33, 9176.99, 9210.1, 339.055256], [1524809700000, 9209.97, 9262.98, 9209.97, 9230.0, 689.965676], [1524810600000, 9230.0, 9265.7, 9226.0, 9229.96, 368.647637], [1524811500000, 9229.96, 9259.0, 9226.0, 9250.0, 255.99798], [1524812400000, 9249.99, 9250.0, 9210.1, 9230.01, 226.113619], [1524813300000, 9225.02, 9232.74, 9188.0, 9188.0, 312.713499], [1524814200000, 9196.0, 9226.0, 9188.0, 9220.24, 211.780744], [1524815100000, 9220.25, 9250.0, 9220.01, 9240.97, 256.939342], [1524816000000, 9240.97, 9296.0, 9231.01, 9280.0, 553.539661], [1524816900000, 9280.0, 9281.99, 9256.0, 9271.0, 341.936855], [1524817800000, 9274.0, 9274.0, 9230.0, 9238.79, 235.416812], [1524818700000, 9238.79, 9269.88, 9230.0, 9260.0, 206.113536], [1524819600000, 9260.0, 9268.99, 9241.2, 9268.0, 152.214565], [1524820500000, 9261.0, 9279.88, 9251.53, 9265.0, 217.01421], [1524821400000, 9266.01, 9361.86, 9250.01, 9348.83, 951.584551], [1524822300000, 9345.0, 9387.48, 9326.81, 9369.0, 634.031923], [1524823200000, 9369.0, 9376.5, 9328.05, 9350.0, 395.4635], [1524824100000, 9350.0, 9380.0, 9340.0, 9368.99, 420.285784], [1524825000000, 9368.99, 9395.0, 9352.17, 9382.01, 499.56778], [1524825900000, 9382.01, 9382.1, 9350.0, 9365.0, 301.439132], [1524826800000, 9363.31, 9367.97, 9335.93, 9340.21, 282.4782], [1524827700000, 9340.22, 9345.52, 9290.03, 9345.52, 453.887946], [1524828600000, 9343.0, 9345.54, 9280.59, 9300.0, 311.259024], [1524829500000, 9305.0, 9335.18, 9297.2, 9309.0, 283.291653], [1524830400000, 9308.9, 9355.0, 9308.9, 9345.0, 327.326037], [1524831300000, 9342.0, 9349.99, 9325.0, 9349.9, 223.369993], [1524832200000, 9349.9, 9350.0, 9326.04, 9339.01, 332.875567], [1524833100000, 9339.01, 9347.73, 9253.68, 9290.07, 425.805191], [1524834000000, 9290.01, 9318.62, 9240.21, 9241.01, 497.048946], [1524834900000, 9241.01, 9265.99, 9150.1, 9190.01, 1070.939574], [1524835800000, 9190.01, 9250.0, 9155.46, 9221.0, 642.768268], [1524836700000, 9220.99, 9232.0, 9199.99, 9225.0, 314.315537], [1524837600000, 9226.97, 9249.0, 9202.0, 9240.0, 219.45231], [1524838500000, 9239.99, 9270.36, 9230.0, 9260.15, 381.181571], [1524839400000, 9260.15, 9275.0, 9219.01, 9253.04, 350.787502], [1524840300000, 9253.11, 9290.0, 9250.0, 9288.88, 449.637292], [1524841200000, 9280.14, 9288.88, 9250.0, 9250.21, 324.012815], [1524842100000, 9250.21, 9264.99, 9210.01, 9235.0, 521.383536], [1524843000000, 9235.14, 9260.0, 9225.0, 9251.01, 325.898122], [1524843900000, 9251.01, 9255.69, 9240.01, 9241.21, 188.664697], [1524844800000, 9241.2, 9310.96, 9241.0, 9308.87, 490.067042], [1524845700000, 9306.0, 9328.26, 9280.0, 9297.0, 433.94217], [1524846600000, 9296.95, 9300.0, 9269.0, 9287.0, 236.441826], [1524847500000, 9290.0, 9299.99, 9275.78, 9282.1, 235.061063], [1524848400000, 9286.01, 9299.98, 9269.54, 9280.97, 175.003838], [1524849300000, 9280.97, 9319.99, 9266.0, 9301.33, 338.199534], [1524850200000, 9301.83, 9316.0, 9282.99, 9298.0, 346.539565], [1524851100000, 9294.99, 9305.0, 9290.02, 9290.1, 262.487145], [1524852000000, 9290.1, 9296.31, 9240.0, 9272.47, 279.74896], [1524852900000, 9272.47, 9282.0, 9225.0, 9244.93, 320.004267], [1524853800000, 9244.94, 9271.76, 9213.8, 9252.0, 237.767724], [1524854700000, 9252.0, 9268.99, 9230.0, 9230.89, 164.386191], [1524855600000, 9230.89, 9250.56, 9191.0, 9195.04, 322.252566], [1524856500000, 9195.02, 9219.83, 9168.0, 9190.0, 370.53515], [1524857400000, 9189.85, 9210.0, 9170.0, 9187.97, 281.734858], [1524858300000, 9185.19, 9190.0, 9075.01, 9089.0, 1122.662866], [1524859200000, 9089.12, 9163.38, 9087.02, 9133.42, 485.653989], [1524860100000, 9133.42, 9133.42, 9054.01, 9090.55, 504.418846], [1524861000000, 9090.55, 9098.68, 8952.0, 8964.99, 1222.270081], [1524861900000, 8955.02, 9020.0, 8940.0, 8970.0, 871.723192], [1524862800000, 8969.99, 9040.0, 8909.83, 9029.92, 797.168072], [1524863700000, 9024.99, 9053.0, 8980.0, 8991.0, 517.909468], [1524864600000, 8991.0, 9019.96, 8970.01, 8995.17, 293.511938], [1524865500000, 8995.17, 9042.09, 8966.44, 8975.35, 302.644176], [1524866400000, 8975.36, 9045.0, 8975.36, 9042.67, 300.398461], [1524867300000, 9042.01, 9073.77, 9024.96, 9071.0, 234.647043], [1524868200000, 9071.0, 9093.09, 9060.0, 9079.01, 273.26671], [1524869100000, 9085.0, 9085.0, 9030.01, 9031.0, 268.775762], [1524870000000, 9032.0, 9073.93, 9022.0, 9056.95, 258.559033], [1524870900000, 9058.99, 9059.0, 9034.99, 9038.0, 146.56828], [1524871800000, 9038.0, 9038.0, 8970.0, 8991.0, 392.303173], [1524872700000, 8990.99, 8996.0, 8889.0, 8915.35, 527.338465], [1524873600000, 8915.35, 8938.2, 8870.0, 8938.2, 629.128485], [1524874500000, 8938.2, 8987.0, 8916.14, 8976.98, 348.807484], [1524875400000, 8976.99, 9049.76, 8976.04, 9040.0, 292.456519], [1524876300000, 9040.0, 9041.0, 8988.99, 9010.11, 483.647832], [1524877200000, 9005.98, 9031.85, 9000.0, 9030.01, 292.594779], [1524878100000, 9030.01, 9042.79, 9012.45, 9035.0, 234.988398], [1524879000000, 9036.0, 9097.99, 9025.01, 9092.0, 344.406628], [1524879900000, 9095.93, 9126.81, 9075.0, 9126.81, 426.871643], [1524880800000, 9126.81, 9129.17, 9089.98, 9110.01, 369.284006], [1524881700000, 9108.0, 9123.03, 9075.19, 9100.33, 440.966647], [1524882600000, 9100.33, 9119.0, 9086.7, 9094.98, 213.968574], [1524883500000, 9094.99, 9094.99, 9050.0, 9055.78, 293.416831], [1524884400000, 9053.47, 9100.0, 9051.0, 9097.51, 192.578571], [1524885300000, 9096.28, 9146.99, 9093.0, 9112.27, 285.673565], [1524886200000, 9112.0, 9130.0, 9100.0, 9114.0, 173.541463], [1524887100000, 9114.0, 9196.32, 9114.0, 9155.0, 437.27507], [1524888000000, 9155.01, 9168.71, 9137.72, 9142.99, 231.077535], [1524888900000, 9142.99, 9162.34, 9130.01, 9160.95, 214.310055], [1524889800000, 9160.92, 9165.47, 9131.0, 9148.01, 195.950406], [1524890700000, 9148.01, 9158.0, 9111.21, 9138.53, 275.582334], [1524891600000, 9138.54, 9184.8, 9127.64, 9180.02, 268.898183], [1524892500000, 9180.02, 9188.5, 9151.45, 9157.1, 252.421493], [1524893400000, 9157.0, 9164.18, 9141.3, 9156.99, 200.598696], [1524894300000, 9150.02, 9169.0, 9140.67, 9164.49, 212.106951], [1524895200000, 9164.48, 9199.99, 9160.01, 9189.93, 434.591983], [1524896100000, 9189.93, 9200.0, 9170.0, 9184.0, 263.855301], [1524897000000, 9184.01, 9209.8, 9175.0, 9203.0, 326.116428], [1524897900000, 9203.0, 9215.66, 9150.67, 9163.03, 324.246063], [1524898800000, 9163.02, 9171.07, 9128.0, 9150.99, 408.244411], [1524899700000, 9151.0, 9165.0, 9146.0, 9153.67, 174.373304], [1524900600000, 9153.67, 9154.08, 9108.99, 9124.92, 354.003365], [1524901500000, 9129.81, 9145.0, 9110.0, 9126.22, 266.479735], [1524902400000, 9121.05, 9126.21, 9081.02, 9088.99, 339.278517], [1524903300000, 9089.0, 9110.0, 9085.02, 9090.0, 288.125534], [1524904200000, 9090.0, 9330.0, 9088.96, 9320.0, 1354.840136], [1524905100000, 9315.0, 9325.0, 9190.0, 9217.48, 1066.509186], [1524906000000, 9227.49, 9250.0, 9155.06, 9195.61, 780.410388], [1524906900000, 9195.6, 9288.0, 9171.02, 9276.13, 490.492755], [1524907800000, 9270.0, 9300.4, 9224.11, 9275.0, 517.795526], [1524908700000, 9275.0, 9280.08, 9242.07, 9273.0, 184.336414], [1524909600000, 9273.0, 9310.0, 9257.8, 9284.36, 427.866539]], "30m": [[1524011400000, 7915.98, 7928.99, 7910.0, 7926.32, 300.339403], [1524013200000, 7926.0, 7979.0, 7920.01, 7963.64, 542.090478], [1524015000000, 7963.98, 7964.03, 7930.02, 7952.42, 269.860196], [1524016800000, 7952.42, 7966.54, 7937.02, 7951.5, 403.37279], [1524018600000, 7958.05, 7963.9, 7901.3, 7911.99, 368.63898], [1524020400000, 7905.69, 7933.0, 7905.69, 7925.05, 228.735227], [1524022200000, 7928.56, 7949.82, 7923.0, 7947.71, 276.111772], [1524024000000, 7947.74, 7949.0, 7920.0, 7929.99, 350.122797], [1524025800000, 7929.99, 7937.94, 7915.0, 7915.1, 367.125124], [1524027600000, 7915.1, 7938.11, 7907.05, 7932.53, 335.016082], [1524029400000, 7932.54, 7949.99, 7915.46, 7928.99, 327.546699], [1524031200000, 7925.83, 7945.51, 7905.15, 7931.2, 442.102541], [1524033000000, 7938.46, 8139.0, 7868.0, 8125.0, 2082.763913], [1524034800000, 8123.89, 8149.89, 8085.03, 8107.0, 1290.614179], [1524036600000, 8107.0, 8125.0, 8090.0, 8107.23, 508.52471], [1524038400000, 8113.51, 8118.0, 8071.0, 8083.44, 582.775488], [1524040200000, 8083.45, 8100.99, 8072.0, 8086.0, 594.394699], [1524042000000, 8082.56, 8103.0, 8074.67, 8084.99, 556.004599], [1524043800000, 8085.0, 8110.0, 8082.05, 8092.01, 363.00671], [1524045600000, 8092.02, 8109.99, 8077.08, 8085.99, 436.224329], [1524047400000, 8086.0, 8120.0, 8081.01, 8095.01, 581.905457], [1524049200000, 8095.0, 8097.0, 8067.02, 8089.99, 414.692354], [1524051000000, 8088.0, 8110.0, 8080.48, 8103.0, 402.819813], [1524052800000, 8104.0, 8117.81, 8085.0, 8086.99, 402.974085], [1524054600000, 8089.99, 8099.0, 8080.09, 8095.04, 319.715586], [1524056400000, 8095.03, 8114.0, 8075.06, 8088.99, 535.863588], [1524058200000, 8089.0, 8105.0, 8083.0, 8095.89, 371.374463], [1524060000000, 8098.45, 8100.0, 8083.06, 8086.0, 308.979545], [1524061800000, 8086.02, 8094.0, 7937.6, 7970.91, 1038.250628], [1524063600000, 7962.27, 7996.0, 7931.01, 7990.03, 1120.837473], [1524065400000, 7992.9, 8036.65, 7985.01, 7994.0, 612.537395], [1524067200000, 7994.0, 8041.0, 7985.01, 8030.05, 432.829846], [1524069000000, 8030.06, 8149.78, 8020.03, 8111.01, 1076.655321], [1524070800000, 8113.93, 8128.5, 8095.5, 8117.0, 607.407919], [1524072600000, 8117.01, 8128.0, 8078.01, 8099.0, 535.526961], [1524074400000, 8098.79, 8124.0, 8090.65, 8104.01, 485.799809], [1524076200000, 8104.11, 8117.81, 8095.0, 8109.0, 395.523175], [1524078000000, 8109.0, 8119.0, 8095.0, 8116.62, 424.192959], [1524079800000, 8116.63, 8126.79, 8108.0, 8116.65, 486.543061], [1524081600000, 8116.01, 8236.43, 8097.0, 8205.0, 1338.663758], [1524083400000, 8205.0, 8235.86, 8171.0, 8197.98, 713.281005], [1524085200000, 8187.02, 8198.0, 8174.05, 8187.99, 352.56508], [1524087000000, 8187.99, 8202.0, 8181.0, 8199.0, 453.495544], [1524088800000, 8199.0, 8220.1, 8170.0, 8178.03, 711.375903], [1524090600000, 8172.9, 8190.6, 8105.0, 8155.01, 789.620407], [1524092400000, 8156.5, 8179.26, 8141.01, 8168.0, 465.63546], [1524094200000, 8166.08, 8186.59, 8150.86, 8173.0, 458.107725], [1524096000000, 8173.99, 8180.0, 8100.0, 8144.99, 718.044191], [1524097800000, 8144.96, 8160.01, 8135.0, 8154.0, 324.576129], [1524099600000, 8158.0, 8159.08, 8137.0, 8141.78, 571.885944], [1524101400000, 8146.37, 8210.0, 8140.01, 8188.88, 1027.879196], [1524103200000, 8188.88, 8200.0, 8150.0, 8187.72, 557.727958], [1524105000000, 8187.72, 8290.0, 8180.0, 8220.01, 1096.403115], [1524106800000, 8220.01, 8220.01, 8156.0, 8182.01, 633.501167], [1524108600000, 8182.01, 8198.31, 8176.16, 8185.0, 408.746857], [1524110400000, 8184.99, 8185.0, 8139.76, 8151.99, 642.916216], [1524112200000, 8151.99, 8187.0, 8120.0, 8183.0, 735.169901], [1524114000000, 8183.0, 8186.98, 8145.68, 8163.4, 550.228983], [1524115800000, 8164.0, 8198.0, 8163.4, 8180.0, 487.393226], [1524117600000, 8180.0, 8215.45, 8175.18, 8213.14, 497.898403], [1524119400000, 8213.11, 8213.11, 8163.24, 8184.9, 424.377904], [1524121200000, 8184.9, 8249.0, 8165.0, 8209.36, 605.612417], [1524123000000, 8209.34, 8224.0, 8080.0, 8166.97, 1103.881948], [1524124800000, 8166.97, 8188.45, 8150.52, 8188.2, 509.876942], [1524126600000, 8185.01, 8239.99, 8169.0, 8177.98, 649.043125], [1524128400000, 8175.82, 8219.0, 8143.02, 8209.96, 619.987893], [1524130200000, 8209.96, 8240.0, 8180.0, 8230.89, 773.027624], [1524132000000, 8231.0, 8250.0, 8202.83, 8237.01, 704.772106], [1524133800000, 8237.02, 8250.0, 8230.0, 8240.63, 602.787362], [1524135600000, 8240.64, 8259.0, 8191.47, 8210.49, 641.142318], [1524137400000, 8211.18, 8222.83, 8192.36, 8207.01, 383.937516], [1524139200000, 8207.0, 8222.44, 8181.7, 8210.65, 459.078981], [1524141000000, 8210.65, 8248.5, 8210.64, 8237.68, 614.330553], [1524142800000, 8235.33, 8248.49, 8220.0, 8234.01, 360.668067], [1524144600000, 8234.01, 8245.01, 8218.0, 8234.84, 502.081481], [1524146400000, 8236.0, 8270.0, 8171.56, 8231.04, 1017.60315], [1524148200000, 8231.02, 8244.2, 8216.02, 8229.97, 439.257174], [1524150000000, 8229.0, 8239.9, 8214.0, 8224.62, 347.799747], [1524151800000, 8224.93, 8239.03, 8222.1, 8239.02, 428.306893], [1524153600000, 8235.45, 8288.37, 8230.01, 8248.0, 1000.947789], [1524155400000, 8248.0, 8262.27, 8235.0, 8244.99, 436.641575], [1524157200000, 8244.66, 8260.0, 8236.0, 8257.03, 321.594392], [1524159000000, 8260.0, 8296.0, 8238.66, 8259.08, 822.560047], [1524160800000, 8257.61, 8290.0, 8251.0, 8252.03, 438.00739], [1524162600000, 8252.03, 8275.02, 8245.02, 8274.57, 361.15831], [1524164400000, 8274.57, 8277.0, 8234.0, 8260.4, 421.462158], [1524166200000, 8262.0, 8262.0, 8233.1, 8249.95, 375.381814], [1524168000000, 8249.95, 8250.01, 8189.0, 8234.16, 793.848143], [1524169800000, 8236.35, 8247.99, 8220.01, 8226.7, 354.729625], [1524171600000, 8226.69, 8275.0, 8222.0, 8254.08, 461.199601], [1524173400000, 8259.89, 8280.0, 8248.58, 8272.28, 341.455474], [1524175200000, 8272.28, 8292.0, 8265.01, 8275.92, 442.74518], [1524177000000, 8275.93, 8291.99, 8250.0, 8253.0, 433.508841], [1524178800000, 8259.93, 8265.25, 8230.0, 8252.13, 312.981236], [1524180600000, 8257.96, 8294.99, 8252.01, 8278.0, 355.681402], [1524182400000, 8273.84, 8375.0, 8270.32, 8357.37, 1275.192993], [1524184200000, 8357.37, 8371.0, 8333.0, 8350.56, 617.95392], [1524186000000, 8350.55, 8350.55, 8312.29, 8325.0, 515.596669], [1524187800000, 8325.0, 8368.0, 8324.0, 8360.0, 560.72077], [1524189600000, 8359.99, 8398.0, 8336.0, 8365.02, 859.33341], [1524191400000, 8365.01, 8365.02, 8282.2, 8324.89, 1117.043033], [1524193200000, 8324.89, 8355.04, 8323.65, 8339.85, 392.968463], [1524195000000, 8343.11, 8348.0, 8320.0, 8331.03, 364.5666], [1524196800000, 8331.3, 8336.38, 8229.68, 8278.96, 2111.441565], [1524198600000, 8278.93, 8287.8, 8222.55, 8240.99, 965.591449], [1524200400000, 8240.99, 8300.0, 8177.09, 8275.99, 1282.106994], [1524202200000, 8275.0, 8290.0, 8247.02, 8272.99, 494.560625], [1524204000000, 8272.99, 8295.62, 8253.0, 8282.97, 621.034129], [1524205800000, 8283.97, 8321.19, 8280.0, 8309.89, 702.784735], [1524207600000, 8309.89, 8346.0, 8306.01, 8332.99, 700.379394], [1524209400000, 8332.99, 8348.98, 8293.49, 8319.97, 593.887254], [1524211200000, 8319.92, 8349.01, 8303.89, 8329.0, 641.086245], [1524213000000, 8329.0, 8331.98, 8281.0, 8294.1, 697.75508], [1524214800000, 8294.18, 8320.0, 8267.01, 8312.1, 523.214163], [1524216600000, 8311.62, 8323.96, 8294.56, 8308.87, 372.200816], [1524218400000, 8305.0, 8344.0, 8290.0, 8344.0, 380.64798], [1524220200000, 8343.03, 8540.37, 8340.0, 8488.01, 3084.942867], [1524222000000, 8488.89, 8531.4, 8480.19, 8509.88, 1179.296187], [1524223800000, 8508.0, 8516.58, 8488.88, 8515.01, 682.587739], [1524225600000, 8515.0, 8577.9, 8494.01, 8548.71, 1032.047593], [1524227400000, 8549.98, 8550.0, 8490.0, 8519.62, 1022.127747], [1524229200000, 8519.66, 8532.89, 8487.06, 8487.06, 610.069856], [1524231000000, 8487.06, 8509.69, 8455.04, 8499.0, 921.18295], [1524232800000, 8499.01, 8520.0, 8482.0, 8499.02, 530.660502], [1524234600000, 8499.02, 8509.48, 8475.66, 8498.0, 557.992436], [1524236400000, 8498.0, 8498.02, 8470.0, 8474.0, 546.31393], [1524238200000, 8475.0, 8481.48, 8431.86, 8459.99, 835.354546], [1524240000000, 8458.0, 8509.97, 8446.0, 8502.95, 603.87738], [1524241800000, 8502.95, 8519.94, 8480.0, 8508.0, 479.235153], [1524243600000, 8508.0, 8530.0, 8497.1, 8497.1, 500.770908], [1524245400000, 8497.1, 8515.77, 8488.9, 8505.0, 467.34502], [1524247200000, 8505.0, 8512.99, 8485.0, 8507.97, 403.566791], [1524249000000, 8508.99, 8525.95, 8490.33, 8505.01, 457.608177], [1524250800000, 8505.04, 8528.98, 8505.0, 8523.41, 350.550481], [1524252600000, 8524.0, 8539.63, 8514.53, 8518.0, 459.051507], [1524254400000, 8518.0, 8519.0, 8490.0, 8507.0, 707.244199], [1524256200000, 8507.0, 8529.0, 8500.02, 8525.83, 346.08008], [1524258000000, 8525.85, 8539.0, 8513.2, 8531.0, 460.77226], [1524259800000, 8531.0, 8560.0, 8508.01, 8508.04, 483.295741], [1524261600000, 8508.04, 8768.0, 8508.03, 8728.41, 1687.234413], [1524263400000, 8728.41, 8930.0, 8699.0, 8830.0, 2981.513972], [1524265200000, 8823.5, 8888.0, 8754.0, 8815.0, 1697.334052], [1524267000000, 8816.1, 8864.4, 8780.0, 8856.98, 917.214711], [1524268800000, 8852.12, 8869.23, 8825.01, 8840.04, 963.455191], [1524270600000, 8844.8, 8857.24, 8780.0, 8814.99, 1153.3301], [1524272400000, 8814.99, 8815.0, 8730.0, 8795.0, 1277.8765], [1524274200000, 8792.97, 8821.99, 8760.54, 8820.0, 726.88246], [1524276000000, 8820.0, 8864.56, 8807.02, 8830.98, 687.217845], [1524277800000, 8831.0, 8867.19, 8830.97, 8849.49, 548.603582], [1524279600000, 8849.0, 8928.0, 8845.12, 8878.0, 871.368361], [1524281400000, 8879.65, 8879.65, 8837.53, 8862.0, 492.223336], [1524283200000, 8858.0, 8880.61, 8843.0, 8850.0, 525.464619], [1524285000000, 8852.0, 8866.69, 8839.99, 8849.79, 353.499174], [1524286800000, 8848.39, 8868.0, 8840.0, 8862.27, 309.157506], [1524288600000, 8859.0, 8884.9, 8850.0, 8878.07, 328.960694], [1524290400000, 8878.07, 8935.96, 8867.87, 8898.0, 693.122659], [1524292200000, 8897.03, 8950.0, 8892.0, 8923.0, 625.365539], [1524294000000, 8920.02, 9035.0, 8907.13, 9035.0, 1062.336821], [1524295800000, 9035.0, 9035.0, 8854.2, 8874.88, 1598.658843], [1524297600000, 8874.87, 8888.0, 8761.0, 8797.5, 2026.561907], [1524299400000, 8794.0, 8817.99, 8708.96, 8790.0, 1783.383566], [1524301200000, 8790.92, 8800.0, 8714.02, 8739.97, 1173.947112], [1524303000000, 8739.98, 8757.9, 8630.0, 8705.01, 2481.637024], [1524304800000, 8713.35, 8749.83, 8687.01, 8728.0, 1253.338373], [1524306600000, 8727.99, 8728.98, 8640.44, 8670.0, 1413.856199], [1524308400000, 8672.02, 8684.0, 8565.0, 8589.99, 2144.25216], [1524310200000, 8589.99, 8720.57, 8585.18, 8700.0, 1563.686757], [1524312000000, 8700.01, 8758.5, 8680.0, 8702.92, 1078.073867], [1524313800000, 8702.92, 8765.0, 8702.0, 8755.01, 895.840565], [1524315600000, 8755.0, 8765.0, 8680.5, 8711.58, 722.392692], [1524317400000, 8711.0, 8778.46, 8701.02, 8748.0, 921.630797], [1524319200000, 8748.0, 8791.01, 8737.02, 8759.99, 708.687898], [1524321000000, 8750.21, 8782.83, 8735.99, 8742.55, 541.308499], [1524322800000, 8742.56, 8813.89, 8742.56, 8801.0, 801.033497], [1524324600000, 8801.0, 8846.63, 8795.0, 8828.2, 1112.108067], [1524326400000, 8828.13, 8874.0, 8772.0, 8806.03, 973.552397], [1524328200000, 8806.04, 8817.01, 8737.28, 8755.0, 783.662215], [1524330000000, 8755.0, 8810.16, 8753.18, 8778.0, 503.909795], [1524331800000, 8773.59, 8780.1, 8706.5, 8760.0, 605.148765], [1524333600000, 8760.05, 8778.0, 8730.0, 8766.0, 369.966214], [1524335400000, 8766.0, 8810.0, 8765.0, 8779.97, 472.472673], [1524337200000, 8780.0, 8818.16, 8778.94, 8797.0, 333.360889], [1524339000000, 8796.97, 8800.0, 8760.0, 8792.47, 385.663484], [1524340800000, 8792.47, 8800.01, 8735.0, 8766.0, 408.517018], [1524342600000, 8766.0, 8772.13, 8707.0, 8765.0, 608.217626], [1524344400000, 8765.0, 8799.0, 8740.0, 8797.99, 283.355791], [1524346200000, 8798.0, 8798.0, 8760.0, 8780.01, 274.975026], [1524348000000, 8780.01, 8805.0, 8762.32, 8785.1, 424.745479], [1524349800000, 8785.1, 8834.99, 8770.95, 8806.29, 330.96732], [1524351600000, 8806.35, 8845.0, 8789.57, 8832.99, 336.386586], [1524353400000, 8832.99, 8930.0, 8832.0, 8915.31, 938.066421], [1524355200000, 8915.31, 8915.33, 8850.0, 8857.86, 635.479282], [1524357000000, 8857.85, 8863.0, 8792.0, 8816.54, 576.102048], [1524358800000, 8816.54, 8837.76, 8786.8, 8813.48, 449.113263], [1524360600000, 8813.47, 8840.05, 8800.0, 8815.99, 457.994834], [1524362400000, 8815.99, 8850.0, 8801.01, 8842.38, 339.836452], [1524364200000, 8842.38, 8874.0, 8837.49, 8852.05, 520.402023], [1524366000000, 8854.99, 8872.09, 8842.0, 8853.0, 312.869615], [1524367800000, 8850.01, 8858.39, 8802.5, 8811.0, 360.625823], [1524369600000, 8814.0, 8829.0, 8794.62, 8813.0, 364.247624], [1524371400000, 8817.31, 8851.0, 8810.0, 8843.6, 314.119395], [1524373200000, 8843.6, 8887.96, 8840.13, 8852.58, 363.860393], [1524375000000, 8852.69, 8868.0, 8833.44, 8834.73, 231.887461], [1524376800000, 8834.73, 8883.95, 8834.5, 8870.11, 285.517628], [1524378600000, 8874.43, 8888.0, 8850.78, 8887.07, 394.825354], [1524380400000, 8888.0, 8904.99, 8854.0, 8875.97, 495.213852], [1524382200000, 8875.97, 8878.0, 8845.0, 8875.0, 319.267396], [1524384000000, 8875.0, 8963.0, 8865.0, 8916.99, 889.205254], [1524385800000, 8916.99, 8952.0, 8915.14, 8940.03, 704.613577], [1524387600000, 8940.0, 8979.5, 8885.0, 8910.75, 983.511072], [1524389400000, 8918.0, 8923.45, 8862.22, 8910.0, 552.037561], [1524391200000, 8910.0, 8948.0, 8902.12, 8937.01, 419.464552], [1524393000000, 8938.0, 8949.0, 8921.84, 8942.0, 448.0462], [1524394800000, 8941.0, 8975.0, 8925.0, 8973.0, 696.665483], [1524396600000, 8972.15, 9020.0, 8912.0, 8916.01, 1253.17497], [1524398400000, 8916.01, 8965.82, 8768.79, 8864.99, 2035.297268], [1524400200000, 8864.99, 8883.0, 8830.22, 8853.97, 687.511381], [1524402000000, 8853.97, 8913.31, 8830.0, 8884.99, 578.7541], [1524403800000, 8885.0, 8903.99, 8870.01, 8877.0, 461.717144], [1524405600000, 8877.0, 8939.69, 8874.03, 8933.0, 728.107043], [1524407400000, 8932.54, 8998.0, 8925.0, 8961.9, 1005.657251], [1524409200000, 8967.78, 8984.98, 8928.23, 8968.98, 693.846415], [1524411000000, 8966.0, 8969.0, 8931.0, 8940.67, 507.807905], [1524412800000, 8940.67, 9020.67, 8860.0, 8910.58, 1280.713168], [1524414600000, 8910.58, 8928.09, 8850.0, 8919.95, 939.476256], [1524416400000, 8919.95, 8950.0, 8919.0, 8938.99, 434.807257], [1524418200000, 8939.0, 8974.63, 8920.0, 8940.36, 472.024283], [1524420000000, 8940.36, 8949.0, 8921.02, 8937.49, 362.417602], [1524421800000, 8937.5, 8957.84, 8921.39, 8948.8, 370.992607], [1524423600000, 8948.8, 8948.81, 8860.0, 8917.87, 703.32857], [1524425400000, 8918.0, 8918.01, 8865.0, 8881.0, 571.272523], [1524427200000, 8881.0, 8925.0, 8865.99, 8925.0, 413.31466], [1524429000000, 8920.0, 8925.0, 8873.25, 8898.3, 397.060794], [1524430800000, 8898.3, 8915.0, 8870.0, 8895.0, 361.510773], [1524432600000, 8895.49, 8928.0, 8894.0, 8920.02, 373.56518], [1524434400000, 8926.8, 8926.88, 8820.0, 8849.99, 678.460004], [1524436200000, 8849.99, 8885.45, 8838.08, 8848.18, 346.723608], [1524438000000, 8848.18, 8848.18, 8727.68, 8770.0, 1589.067139], [1524439800000, 8770.0, 8816.94, 8747.63, 8787.02, 1096.739437], [1524441600000, 8785.7, 8830.0, 8745.0, 8817.57, 885.902611], [1524443400000, 8818.0, 8848.73, 8794.83, 8816.99, 473.296646], [1524445200000, 8816.99, 8839.7, 8812.5, 8836.79, 412.937134], [1524447000000, 8835.07, 8888.0, 8787.01, 8853.24, 552.652099], [1524448800000, 8844.24, 8868.5, 8821.83, 8858.31, 590.08873], [1524450600000, 8852.35, 8888.0, 8830.67, 8849.92, 456.96519], [1524452400000, 8849.91, 8878.91, 8847.01, 8872.49, 367.116266], [1524454200000, 8872.49, 8888.0, 8855.5, 8861.52, 374.103001], [1524456000000, 8861.52, 8878.98, 8840.0, 8854.97, 326.852316], [1524457800000, 8854.97, 8864.48, 8821.01, 8857.85, 326.853038], [1524459600000, 8857.84, 8860.46, 8827.66, 8841.0, 275.229312], [1524461400000, 8842.23, 8883.0, 8831.99, 8879.0, 431.825775], [1524463200000, 8878.04, 8879.0, 8853.0, 8870.0, 502.509546], [1524465000000, 8866.0, 8929.0, 8850.0, 8899.0, 899.4041], [1524466800000, 8899.0, 8970.01, 8895.45, 8950.95, 1150.929725], [1524468600000, 8947.42, 8955.0, 8918.31, 8942.39, 678.800566], [1524470400000, 8942.0, 8957.04, 8932.0, 8940.01, 600.783305], [1524472200000, 8940.02, 8949.0, 8892.98, 8900.31, 743.783461], [1524474000000, 8903.0, 8910.0, 8831.0, 8864.2, 1062.337337], [1524475800000, 8865.04, 8914.57, 8864.0, 8905.0, 596.820323], [1524477600000, 8905.0, 8920.0, 8874.71, 8911.79, 636.534711], [1524479400000, 8912.34, 8922.0, 8885.6, 8889.0, 408.74296], [1524481200000, 8889.0, 8899.99, 8877.75, 8888.0, 376.380222], [1524483000000, 8887.98, 8923.0, 8883.02, 8910.02, 500.276902], [1524484800000, 8910.02, 8985.0, 8910.01, 8960.01, 937.036319], [1524486600000, 8969.99, 8970.9, 8897.75, 8940.74, 738.987033], [1524488400000, 8940.0, 8944.9, 8900.0, 8929.19, 427.412812], [1524490200000, 8929.18, 8945.0, 8910.0, 8929.0, 462.397086], [1524492000000, 8934.39, 8940.0, 8895.0, 8900.0, 641.635989], [1524493800000, 8900.0, 8932.69, 8858.08, 8919.0, 834.74201], [1524495600000, 8919.0, 8935.0, 8901.0, 8903.92, 458.255285], [1524497400000, 8903.92, 8916.0, 8888.0, 8898.0, 484.838863], [1524499200000, 8898.0, 8936.0, 8892.02, 8930.0, 487.408671], [1524501000000, 8928.1, 8938.21, 8907.5, 8911.54, 510.180123], [1524502800000, 8912.77, 8917.58, 8861.42, 8878.55, 587.865273], [1524504600000, 8878.55, 8888.3, 8863.48, 8886.0, 398.688759], [1524506400000, 8887.67, 8900.0, 8877.01, 8898.2, 337.6751], [1524508200000, 8896.0, 8915.0, 8890.0, 8893.99, 374.244155], [1524510000000, 8894.0, 8900.0, 8870.0, 8878.0, 448.731356], [1524511800000, 8878.0, 8888.0, 8800.6, 8847.37, 864.576628], [1524513600000, 8847.37, 8880.0, 8825.01, 8868.0, 438.373407], [1524515400000, 8868.0, 8928.0, 8867.01, 8924.11, 478.760411], [1524517200000, 8924.11, 8925.04, 8912.0, 8924.31, 302.143136], [1524519000000, 8924.31, 8926.76, 8903.93, 8922.0, 400.303583], [1524520800000, 8925.8, 8947.64, 8916.48, 8930.0, 569.113647], [1524522600000, 8930.53, 8938.22, 8909.59, 8920.02, 297.137411], [1524524400000, 8924.12, 8931.96, 8890.21, 8899.0, 337.904236], [1524526200000, 8897.84, 8949.98, 8888.0, 8934.01, 388.57814], [1524528000000, 8934.0, 8975.0, 8922.0, 8974.95, 733.826114], [1524529800000, 8973.02, 9219.0, 8972.99, 9169.97, 3231.116337], [1524531600000, 9169.97, 9170.0, 9109.81, 9167.98, 983.304073], [1524533400000, 9167.98, 9194.0, 9124.02, 9186.0, 721.11771], [1524535200000, 9186.01, 9230.15, 9177.0, 9177.01, 1010.777019], [1524537000000, 9183.0, 9200.01, 9150.0, 9189.86, 847.605662], [1524538800000, 9185.01, 9200.0, 9166.0, 9194.98, 576.324446], [1524540600000, 9194.98, 9211.47, 9186.91, 9192.47, 816.455364], [1524542400000, 9192.48, 9229.04, 9190.0, 9220.0, 827.706799], [1524544200000, 9219.99, 9279.98, 9215.0, 9266.3, 958.422273], [1524546000000, 9266.3, 9279.4, 9214.0, 9224.82, 737.024942], [1524547800000, 9222.0, 9300.0, 9220.0, 9271.11, 938.429667], [1524549600000, 9271.14, 9278.81, 9235.01, 9236.0, 573.998328], [1524551400000, 9242.53, 9257.99, 9221.01, 9227.37, 606.925901], [1524553200000, 9235.0, 9243.27, 9177.0, 9225.0, 1064.421816], [1524555000000, 9225.0, 9238.68, 9208.0, 9216.0, 435.437518], [1524556800000, 9217.98, 9263.27, 9216.0, 9254.0, 454.275629], [1524558600000, 9254.0, 9270.0, 9244.0, 9249.99, 402.255735], [1524560400000, 9246.6, 9285.0, 9217.03, 9245.79, 623.640297], [1524562200000, 9250.0, 9285.78, 9243.01, 9285.0, 581.111469], [1524564000000, 9285.0, 9317.0, 9275.0, 9301.65, 1266.559264], [1524565800000, 9301.65, 9349.0, 9280.0, 9292.15, 1071.100373], [1524567600000, 9292.15, 9332.79, 9292.01, 9314.74, 521.452399], [1524569400000, 9314.66, 9317.0, 9273.22, 9294.57, 632.512938], [1524571200000, 9294.59, 9329.8, 9290.0, 9324.87, 687.092864], [1524573000000, 9324.63, 9383.66, 9319.85, 9380.0, 716.65661], [1524574800000, 9376.01, 9385.0, 9327.18, 9380.01, 1017.604961], [1524576600000, 9380.0, 9420.0, 9221.0, 9259.99, 2387.486551], [1524578400000, 9259.99, 9291.0, 9155.0, 9279.0, 2410.820088], [1524580200000, 9280.0, 9331.0, 9270.15, 9289.69, 820.049066], [1524582000000, 9289.69, 9370.0, 9288.21, 9344.01, 727.140976], [1524583800000, 9344.0, 9360.0, 9301.0, 9347.77, 724.336892], [1524585600000, 9347.78, 9380.0, 9330.0, 9345.99, 736.683993], [1524587400000, 9345.99, 9368.8, 9309.0, 9350.19, 750.628991], [1524589200000, 9350.19, 9398.85, 9333.0, 9374.0, 517.096694], [1524591000000, 9374.98, 9415.95, 9370.87, 9409.97, 719.761198], [1524592800000, 9410.0, 9410.0, 9350.0, 9371.01, 711.40307], [1524594600000, 9371.02, 9411.0, 9365.0, 9410.99, 792.596812], [1524596400000, 9410.99, 9414.98, 9293.29, 9383.98, 1282.518164], [1524598200000, 9383.98, 9455.0, 9362.13, 9449.9, 1008.805803], [1524600000000, 9452.0, 9463.0, 9400.04, 9438.0, 759.966734], [1524601800000, 9438.0, 9459.0, 9409.95, 9450.79, 701.924418], [1524603600000, 9450.79, 9495.0, 9439.13, 9466.89, 1085.806761], [1524605400000, 9466.89, 9490.5, 9445.03, 9468.0, 735.408059], [1524607200000, 9469.0, 9559.82, 9463.1, 9550.89, 1319.176833], [1524609000000, 9552.01, 9583.61, 9425.01, 9559.75, 1641.424917], [1524610800000, 9559.75, 9636.47, 9511.0, 9635.05, 1290.03321], [1524612600000, 9635.0, 9731.01, 9589.78, 9619.99, 2108.564368], [1524614400000, 9618.96, 9680.0, 9551.79, 9580.01, 1954.964731], [1524616200000, 9584.96, 9591.05, 9440.0, 9529.94, 2221.752642], [1524618000000, 9529.21, 9593.48, 9466.01, 9590.0, 1124.753486], [1524619800000, 9590.0, 9638.68, 9583.59, 9628.0, 1037.581128], [1524621600000, 9628.0, 9720.0, 9530.0, 9665.99, 1377.245518], [1524623400000, 9665.99, 9759.82, 9659.04, 9687.05, 1548.797152], [1524625200000, 9675.01, 9729.88, 9580.96, 9624.24, 1253.507352], [1524627000000, 9630.0, 9649.99, 9323.02, 9347.99, 3496.750765], [1524628800000, 9349.99, 9500.0, 9323.02, 9363.0, 2766.019992], [1524630600000, 9365.55, 9402.0, 9110.0, 9200.0, 4583.047622], [1524632400000, 9200.22, 9411.0, 9190.0, 9364.26, 3076.824248], [1524634200000, 9364.23, 9396.0, 9303.0, 9370.0, 1394.926421], [1524636000000, 9370.0, 9476.23, 9355.0, 9441.1, 1512.24692], [1524637800000, 9441.1, 9453.56, 9377.0, 9415.06, 796.22783], [1524639600000, 9415.06, 9468.0, 9402.38, 9454.22, 749.132396], [1524641400000, 9450.02, 9460.0, 9322.0, 9416.39, 1057.038668], [1524643200000, 9415.0, 9438.54, 9338.0, 9366.87, 961.140116], [1524645000000, 9370.0, 9409.35, 9251.0, 9281.98, 1101.596362], [1524646800000, 9281.98, 9340.0, 9268.07, 9309.84, 907.394949], [1524648600000, 9309.1, 9310.11, 9200.1, 9272.0, 1525.332468], [1524650400000, 9271.09, 9280.0, 9086.0, 9090.0, 2488.98042], [1524652200000, 9090.0, 9160.1, 8960.0, 9140.68, 4324.782192], [1524654000000, 9140.0, 9154.39, 8980.0, 9012.95, 2236.591857], [1524655800000, 9012.98, 9189.39, 9004.36, 9144.03, 1866.293996], [1524657600000, 9137.0, 9210.21, 9071.0, 9083.54, 2148.932996], [1524659400000, 9088.12, 9205.0, 9086.2, 9129.89, 1124.87151], [1524661200000, 9129.84, 9159.03, 9020.0, 9051.76, 1200.798898], [1524663000000, 9054.98, 9100.0, 8925.8, 9011.78, 2464.57511], [1524664800000, 9011.79, 9042.93, 8840.07, 8845.0, 2889.43989], [1524666600000, 8844.66, 8917.0, 8730.0, 8880.0, 4464.260703], [1524668400000, 8874.33, 8975.0, 8825.0, 8889.0, 2336.027993], [1524670200000, 8882.79, 8975.0, 8854.02, 8972.09, 1548.054059], [1524672000000, 8972.09, 8977.0, 8846.0, 8860.48, 1638.186943], [1524673800000, 8865.22, 8946.0, 8847.0, 8910.0, 958.524198], [1524675600000, 8908.32, 9039.73, 8908.28, 9028.94, 1357.101364], [1524677400000, 9023.81, 9089.0, 8994.98, 9058.0, 1448.052785], [1524679200000, 9055.1, 9063.58, 8968.0, 9017.02, 1058.590166], [1524681000000, 9018.0, 9050.0, 8951.0, 8991.03, 758.05142], [1524682800000, 8991.04, 9025.0, 8966.0, 8969.02, 554.679382], [1524684600000, 8966.11, 9018.49, 8948.05, 8969.98, 755.826534], [1524686400000, 8969.55, 9068.85, 8963.54, 9068.85, 799.983379], [1524688200000, 9068.0, 9116.91, 9061.12, 9083.0, 867.952879], [1524690000000, 9085.16, 9159.9, 9076.01, 9128.01, 929.341987], [1524691800000, 9130.01, 9179.0, 9115.33, 9178.98, 905.381483], [1524693600000, 9178.98, 9185.01, 9062.02, 9099.82, 1245.675898], [1524695400000, 9099.8, 9104.4, 8926.0, 8955.0, 1343.249627], [1524697200000, 8950.0, 9007.6, 8820.0, 8830.01, 1382.669395], [1524699000000, 8831.57, 8889.63, 8770.0, 8869.99, 1566.879759], [1524700800000, 8869.99, 8869.99, 8667.01, 8701.34, 1892.837626], [1524702600000, 8693.55, 8839.0, 8660.0, 8800.02, 1964.876718], [1524704400000, 8808.17, 8860.0, 8720.13, 8850.0, 1078.682717], [1524706200000, 8854.66, 8863.85, 8750.95, 8752.82, 894.143076], [1524708000000, 8755.06, 8857.01, 8751.0, 8842.25, 907.719292], [1524709800000, 8842.25, 8899.0, 8823.0, 8850.15, 729.432148], [1524711600000, 8850.22, 8890.0, 8827.0, 8854.0, 727.435611], [1524713400000, 8853.99, 8859.98, 8763.14, 8808.02, 702.556907], [1524715200000, 8812.7, 8886.92, 8800.0, 8874.49, 797.106477], [1524717000000, 8873.8, 8940.01, 8862.49, 8935.0, 1341.230636], [1524718800000, 8936.0, 8977.0, 8901.46, 8904.93, 1114.071925], [1524720600000, 8904.9, 8937.0, 8874.0, 8916.56, 936.332477], [1524722400000, 8905.88, 8945.34, 8888.88, 8896.98, 622.814308], [1524724200000, 8888.91, 8906.94, 8771.0, 8841.0, 1519.531698], [1524726000000, 8841.04, 8853.5, 8803.0, 8825.33, 709.590244], [1524727800000, 8825.21, 8888.99, 8812.03, 8847.97, 651.465796], [1524729600000, 8847.97, 8887.8, 8701.01, 8750.0, 1295.579071], [1524731400000, 8750.0, 8772.0, 8680.0, 8720.5, 1468.110567], [1524733200000, 8720.58, 8773.0, 8716.01, 8724.87, 860.911334], [1524735000000, 8723.0, 8751.09, 8651.62, 8746.0, 1156.802163], [1524736800000, 8746.0, 8865.0, 8738.14, 8848.39, 862.040963], [1524738600000, 8848.39, 8881.0, 8816.0, 8845.02, 955.646991], [1524740400000, 8844.98, 8917.51, 8819.0, 8847.98, 810.930404], [1524742200000, 8845.04, 8874.6, 8835.01, 8857.01, 608.54356], [1524744000000, 8858.51, 8945.0, 8857.01, 8884.0, 870.377863], [1524745800000, 8880.2, 8925.04, 8871.55, 8900.01, 588.312064], [1524747600000, 8904.78, 8904.93, 8785.0, 8838.7, 825.28894], [1524749400000, 8839.0, 8875.0, 8801.0, 8829.63, 505.659452], [1524751200000, 8828.27, 8885.0, 8764.86, 8769.49, 846.007553], [1524753000000, 8763.99, 8840.0, 8740.01, 8829.99, 907.768516], [1524754800000, 8829.99, 8830.0, 8768.6, 8811.03, 578.771589], [1524756600000, 8811.03, 8832.0, 8782.06, 8806.1, 579.43739], [1524758400000, 8806.1, 8872.99, 8775.89, 8857.28, 795.364992], [1524760200000, 8856.22, 8908.53, 8841.14, 8900.51, 676.121512], [1524762000000, 8899.0, 8925.0, 8860.35, 8871.87, 618.120532], [1524763800000, 8875.0, 8898.92, 8845.03, 8866.43, 503.676119], [1524765600000, 8866.43, 8909.0, 8839.53, 8882.92, 368.423391], [1524767400000, 8882.92, 8893.9, 8834.02, 8845.09, 341.120924], [1524769200000, 8845.1, 8869.99, 8838.35, 8866.0, 368.850372], [1524771000000, 8866.0, 8895.21, 8860.0, 8881.54, 291.514513], [1524772800000, 8880.0, 9138.0, 8880.0, 9096.96, 2017.00098], [1524774600000, 9104.96, 9137.4, 9062.72, 9123.99, 987.793494], [1524776400000, 9123.99, 9168.98, 9090.0, 9167.02, 765.476075], [1524778200000, 9167.02, 9169.9, 9066.02, 9099.0, 899.695226], [1524780000000, 9100.0, 9174.11, 9096.01, 9158.05, 710.808321], [1524781800000, 9156.72, 9235.99, 9131.0, 9221.0, 1256.852296], [1524783600000, 9221.0, 9288.0, 9188.0, 9237.0, 1356.88049], [1524785400000, 9237.0, 9307.48, 9230.01, 9266.0, 1032.588932], [1524787200000, 9267.03, 9297.0, 9215.0, 9247.67, 987.512123], [1524789000000, 9249.01, 9249.5, 9177.0, 9210.32, 821.719749], [1524790800000, 9210.29, 9292.0, 9210.21, 9254.76, 812.568626], [1524792600000, 9250.0, 9270.0, 9214.0, 9249.97, 542.879686], [1524794400000, 9240.0, 9282.0, 9239.64, 9273.5, 614.538417], [1524796200000, 9272.32, 9277.0, 9233.51, 9255.49, 441.857163], [1524798000000, 9255.5, 9258.0, 9213.25, 9227.03, 549.638206], [1524799800000, 9227.03, 9232.06, 9123.25, 9143.01, 1500.394], [1524801600000, 9143.01, 9220.0, 9104.88, 9209.35, 898.783864], [1524803400000, 9209.35, 9235.0, 9175.59, 9204.99, 606.058741], [1524805200000, 9205.0, 9229.59, 9188.0, 9213.0, 399.361368], [1524807000000, 9217.54, 9229.0, 9160.0, 9180.82, 555.837796], [1524808800000, 9184.99, 9262.98, 9176.99, 9230.0, 1029.020932], [1524810600000, 9230.0, 9265.7, 9226.0, 9250.0, 624.645617], [1524812400000, 9249.99, 9250.0, 9188.0, 9188.0, 538.827118], [1524814200000, 9196.0, 9250.0, 9188.0, 9240.97, 468.720086], [1524816000000, 9240.97, 9296.0, 9231.01, 9271.0, 895.476516], [1524817800000, 9274.0, 9274.0, 9230.0, 9260.0, 441.530348], [1524819600000, 9260.0, 9279.88, 9241.2, 9265.0, 369.228775], [1524821400000, 9266.01, 9387.48, 9250.01, 9369.0, 1585.616474], [1524823200000, 9369.0, 9380.0, 9328.05, 9368.99, 815.749284], [1524825000000, 9368.99, 9395.0, 9350.0, 9365.0, 801.006912], [1524826800000, 9363.31, 9367.97, 9290.03, 9345.52, 736.366146], [1524828600000, 9343.0, 9345.54, 9280.59, 9309.0, 594.550677], [1524830400000, 9308.9, 9355.0, 9308.9, 9349.9, 550.69603], [1524832200000, 9349.9, 9350.0, 9253.68, 9290.07, 758.680758], [1524834000000, 9290.01, 9318.62, 9150.1, 9190.01, 1567.98852], [1524835800000, 9190.01, 9250.0, 9155.46, 9225.0, 957.083805], [1524837600000, 9226.97, 9270.36, 9202.0, 9260.15, 600.633881], [1524839400000, 9260.15, 9290.0, 9219.01, 9288.88, 800.424794], [1524841200000, 9280.14, 9288.88, 9210.01, 9235.0, 845.396351], [1524843000000, 9235.14, 9260.0, 9225.0, 9241.21, 514.562819], [1524844800000, 9241.2, 9328.26, 9241.0, 9297.0, 924.009212], [1524846600000, 9296.95, 9300.0, 9269.0, 9282.1, 471.502889], [1524848400000, 9286.01, 9319.99, 9266.0, 9301.33, 513.203372], [1524850200000, 9301.83, 9316.0, 9282.99, 9290.1, 609.02671], [1524852000000, 9290.1, 9296.31, 9225.0, 9244.93, 599.753227], [1524853800000, 9244.94, 9271.76, 9213.8, 9230.89, 402.153915], [1524855600000, 9230.89, 9250.56, 9168.0, 9190.0, 692.787716], [1524857400000, 9189.85, 9210.0, 9075.01, 9089.0, 1404.397724], [1524859200000, 9089.12, 9163.38, 9054.01, 9090.55, 990.072835], [1524861000000, 9090.55, 9098.68, 8940.0, 8970.0, 2093.993273], [1524862800000, 8969.99, 9053.0, 8909.83, 8991.0, 1315.07754], [1524864600000, 8991.0, 9042.09, 8966.44, 8975.35, 596.156114], [1524866400000, 8975.36, 9073.77, 8975.36, 9071.0, 535.045504], [1524868200000, 9071.0, 9093.09, 9030.01, 9031.0, 542.042472], [1524870000000, 9032.0, 9073.93, 9022.0, 9038.0, 405.127313], [1524871800000, 9038.0, 9038.0, 8889.0, 8915.35, 919.641638], [1524873600000, 8915.35, 8987.0, 8870.0, 8976.98, 977.935969], [1524875400000, 8976.99, 9049.76, 8976.04, 9010.11, 776.104351], [1524877200000, 9005.98, 9042.79, 9000.0, 9035.0, 527.583177], [1524879000000, 9036.0, 9126.81, 9025.01, 9126.81, 771.278271], [1524880800000, 9126.81, 9129.17, 9075.19, 9100.33, 810.250653], [1524882600000, 9100.33, 9119.0, 9050.0, 9055.78, 507.385405], [1524884400000, 9053.47, 9146.99, 9051.0, 9112.27, 478.252136], [1524886200000, 9112.0, 9196.32, 9100.0, 9155.0, 610.816533], [1524888000000, 9155.01, 9168.71, 9130.01, 9160.95, 445.38759], [1524889800000, 9160.92, 9165.47, 9111.21, 9138.53, 471.53274], [1524891600000, 9138.54, 9188.5, 9127.64, 9157.1, 521.319676], [1524893400000, 9157.0, 9169.0, 9140.67, 9164.49, 412.705647], [1524895200000, 9164.48, 9200.0, 9160.01, 9184.0, 698.447284], [1524897000000, 9184.01, 9215.66, 9150.67, 9163.03, 650.362491], [1524898800000, 9163.02, 9171.07, 9128.0, 9153.67, 582.617715], [1524900600000, 9153.67, 9154.08, 9108.99, 9126.22, 620.4831], [1524902400000, 9121.05, 9126.21, 9081.02, 9090.0, 627.404051], [1524904200000, 9090.0, 9330.0, 9088.96, 9217.48, 2421.349322], [1524906000000, 9227.49, 9288.0, 9155.06, 9276.13, 1270.903143], [1524907800000, 9270.0, 9300.4, 9224.11, 9273.0, 702.13194], [1524909600000, 9273.0, 9310.0, 9257.8, 9289.96, 427.867426]], "1h": [[1523113200000, 6858.99, 7033.99, 6852.03, 7010.0, 3005.47648], [1523116800000, 7003.98, 7070.0, 6990.11, 7030.0, 2344.519187], [1523120400000, 7034.99, 7041.47, 6976.01, 7004.96, 1521.415594], [1523124000000, 7003.0, 7017.0, 6952.05, 6985.71, 1129.793439], [1523127600000, 6985.73, 6990.9, 6961.0, 6988.99, 824.727294], [1523131200000, 6988.99, 7019.56, 6972.0, 7009.0, 925.207905], [1523134800000, 7009.0, 7009.0, 6950.0, 6975.0, 711.784024], [1523138400000, 6975.0, 6990.0, 6870.0, 6923.99, 1033.018138], [1523142000000, 6923.99, 6938.23, 6850.01, 6895.8, 1076.938301], [1523145600000, 6895.81, 6987.15, 6880.0, 6949.99, 906.510887], [1523149200000, 6950.0, 6980.45, 6892.95, 6930.09, 706.372913], [1523152800000, 6930.09, 6965.0, 6914.11, 6935.01, 626.724303], [1523156400000, 6938.5, 6965.0, 6925.01, 6964.98, 503.986845], [1523160000000, 6960.11, 7010.0, 6943.54, 6971.6, 884.550255], [1523163600000, 6975.97, 7050.0, 6925.73, 6952.0, 960.778642], [1523167200000, 6952.0, 6962.98, 6891.79, 6926.01, 698.245543], [1523170800000, 6926.0, 6957.0, 6921.01, 6939.0, 554.848251], [1523174400000, 6939.0, 6976.99, 6924.3, 6962.98, 620.140668], [1523178000000, 6962.87, 7028.0, 6953.1, 6999.0, 1069.845461], [1523181600000, 6999.0, 7027.02, 6982.66, 6994.15, 1408.881082], [1523185200000, 6996.89, 7100.0, 6976.02, 7099.85, 1708.899908], [1523188800000, 7100.0, 7109.13, 7060.0, 7084.97, 1498.707131], [1523192400000, 7084.98, 7084.99, 7048.0, 7060.01, 723.311013], [1523196000000, 7060.01, 7076.98, 7020.01, 7024.0, 960.935768], [1523199600000, 7024.0, 7075.0, 7019.09, 7049.93, 941.352556], [1523203200000, 7047.01, 7049.93, 6974.75, 6980.0, 1429.852469], [1523206800000, 6980.0, 7014.73, 6937.03, 6999.0, 995.404848], [1523210400000, 6995.02, 7014.86, 6952.0, 6999.99, 947.903875], [1523214000000, 6999.99, 7010.6, 6970.0, 6994.42, 723.260163], [1523217600000, 6989.97, 6997.99, 6945.68, 6947.01, 586.706575], [1523221200000, 6953.0, 6994.0, 6942.84, 6992.0, 582.758567], [1523224800000, 6993.99, 7053.09, 6990.01, 7027.0, 735.784812], [1523228400000, 7026.99, 7030.0, 6992.0, 7018.0, 651.91063], [1523232000000, 7011.04, 7098.17, 7011.02, 7060.0, 1363.163785], [1523235600000, 7062.0, 7139.0, 7057.06, 7120.0, 1388.978625], [1523239200000, 7120.0, 7165.21, 7097.31, 7104.66, 1662.830209], [1523242800000, 7104.66, 7133.99, 7055.0, 7131.85, 1139.434049], [1523246400000, 7131.78, 7160.0, 7093.69, 7139.92, 1218.279629], [1523250000000, 7136.7, 7142.99, 7104.99, 7113.94, 600.282944], [1523253600000, 7115.0, 7132.0, 7084.0, 7120.0, 890.696465], [1523257200000, 7116.16, 7145.0, 7112.0, 7125.0, 771.667829], [1523260800000, 7129.79, 7170.92, 7125.01, 7167.0, 1095.410127], [1523264400000, 7167.0, 7185.0, 7072.0, 7076.0, 1271.385522], [1523268000000, 7076.0, 7083.0, 6765.81, 6782.0, 5230.519345], [1523271600000, 6782.99, 6799.5, 6691.18, 6745.0, 2875.099201], [1523275200000, 6740.0, 6792.0, 6676.5, 6740.0, 2740.809797], [1523278800000, 6739.99, 6764.0, 6714.0, 6730.88, 1197.519479], [1523282400000, 6730.9, 6738.94, 6680.0, 6731.27, 1753.439293], [1523286000000, 6738.0, 6783.0, 6717.01, 6738.98, 1206.030319], [1523289600000, 6738.98, 6759.9, 6720.01, 6754.97, 805.609319], [1523293200000, 6754.99, 6755.0, 6722.56, 6746.0, 637.056342], [1523296800000, 6745.99, 6767.99, 6730.0, 6750.01, 655.05806], [1523300400000, 6750.01, 6758.0, 6650.01, 6672.08, 1487.329225], [1523304000000, 6677.04, 6685.79, 6611.0, 6671.09, 1597.536728], [1523307600000, 6671.97, 6741.62, 6671.09, 6723.67, 916.721946], [1523311200000, 6723.67, 6723.67, 6683.03, 6693.0, 646.100289], [1523314800000, 6694.34, 6795.0, 6692.86, 6782.72, 927.338679], [1523318400000, 6781.55, 6790.0, 6747.93, 6765.61, 667.332214], [1523322000000, 6768.99, 6769.0, 6706.02, 6740.11, 673.314234], [1523325600000, 6740.05, 6776.0, 6735.03, 6750.17, 752.711492], [1523329200000, 6750.17, 6809.55, 6745.0, 6805.63, 919.206413], [1523332800000, 6808.68, 6820.0, 6758.12, 6778.0, 851.908382], [1523336400000, 6778.0, 6786.54, 6724.68, 6759.92, 1175.998992], [1523340000000, 6759.93, 6774.71, 6670.25, 6696.0, 1247.831577], [1523343600000, 6692.16, 6737.87, 6680.0, 6715.51, 847.062947], [1523347200000, 6717.32, 6736.0, 6656.0, 6733.11, 1040.156479], [1523350800000, 6731.56, 6785.0, 6721.0, 6785.0, 826.799542], [1523354400000, 6773.93, 6788.62, 6711.8, 6730.02, 1021.474152], [1523358000000, 6731.0, 6749.5, 6702.0, 6735.0, 784.538424], [1523361600000, 6735.0, 6762.46, 6719.91, 6758.0, 747.035625], [1523365200000, 6755.01, 6772.99, 6743.0, 6761.99, 757.705148], [1523368800000, 6761.99, 6771.99, 6733.0, 6765.0, 760.892064], [1523372400000, 6765.0, 6870.99, 6761.0, 6837.54, 2259.94097], [1523376000000, 6835.65, 6851.0, 6809.6, 6837.87, 884.880193], [1523379600000, 6837.9, 6870.0, 6831.0, 6867.48, 1032.216631], [1523383200000, 6867.49, 6874.0, 6833.01, 6853.0, 955.896836], [1523386800000, 6853.0, 6855.0, 6825.0, 6844.93, 681.343464], [1523390400000, 6844.93, 6847.85, 6805.52, 6847.03, 672.311545], [1523394000000, 6845.18, 6865.0, 6833.01, 6860.0, 623.040718], [1523397600000, 6860.0, 6890.0, 6768.01, 6792.6, 1354.337253], [1523401200000, 6792.46, 6845.0, 6770.0, 6843.9, 788.7928], [1523404800000, 6839.56, 6872.71, 6827.69, 6860.2, 981.781876], [1523408400000, 6860.2, 6866.98, 6830.0, 6840.0, 870.945759], [1523412000000, 6840.0, 6860.3, 6835.0, 6847.99, 732.717347], [1523415600000, 6847.99, 6848.0, 6800.0, 6818.79, 793.986444], [1523419200000, 6818.79, 6840.03, 6806.44, 6830.86, 600.591341], [1523422800000, 6830.86, 6867.4, 6813.0, 6817.71, 855.590766], [1523426400000, 6817.71, 6846.02, 6787.0, 6833.07, 961.126866], [1523430000000, 6833.08, 6848.0, 6818.96, 6846.89, 714.40139], [1523433600000, 6846.89, 6864.7, 6830.51, 6857.93, 800.426308], [1523437200000, 6857.93, 6869.34, 6834.02, 6854.12, 1039.476022], [1523440800000, 6856.99, 6857.97, 6820.0, 6820.03, 945.837526], [1523444400000, 6820.2, 6857.92, 6800.0, 6851.97, 958.292198], [1523448000000, 6851.53, 6864.0, 6840.0, 6855.0, 546.166809], [1523451600000, 6855.0, 6990.0, 6849.29, 6944.89, 2465.107686], [1523455200000, 6944.89, 6968.02, 6931.0, 6934.99, 1167.952827], [1523458800000, 6932.48, 6950.0, 6901.0, 6927.06, 1308.729602], [1523462400000, 6927.06, 6936.0, 6889.42, 6914.0, 1504.051228], [1523466000000, 6913.98, 6923.0, 6862.6, 6904.99, 1127.728797], [1523469600000, 6904.99, 6913.34, 6890.03, 6899.75, 915.774738], [1523473200000, 6899.75, 6927.48, 6892.11, 6910.63, 880.98351], [1523476800000, 6914.97, 6926.95, 6881.97, 6888.0, 945.038675], [1523480400000, 6886.0, 6910.0, 6878.14, 6909.0, 572.63209], [1523484000000, 6908.53, 6934.97, 6904.61, 6931.0, 741.951888], [1523487600000, 6931.05, 6987.41, 6931.0, 6953.79, 1566.579484], [1523491200000, 6953.78, 6975.0, 6918.0, 6931.0, 1243.306301], [1523494800000, 6933.49, 6949.9, 6885.0, 6939.99, 1073.859867], [1523498400000, 6939.98, 6972.24, 6930.0, 6964.0, 869.221662], [1523502000000, 6965.0, 6980.0, 6936.92, 6965.2, 1177.90424], [1523505600000, 6965.21, 6980.0, 6935.0, 6979.0, 914.324267], [1523509200000, 6979.89, 6985.0, 6928.0, 6940.0, 892.335545], [1523512800000, 6940.01, 6967.02, 6765.0, 6776.4, 2351.039564], [1523516400000, 6767.17, 6850.85, 6743.2, 6826.61, 2888.081595], [1523520000000, 6826.62, 6860.01, 6802.7, 6843.0, 1179.407555], [1523523600000, 6842.99, 6865.71, 6818.8, 6850.99, 1305.530371], [1523527200000, 6850.99, 6951.89, 6840.01, 6935.1, 1270.913537], [1523530800000, 6935.11, 8012.23, 6935.02, 7690.0, 16480.893133], [1523534400000, 7685.55, 7780.0, 7569.83, 7686.93, 7501.3181], [1523538000000, 7686.93, 7739.8, 7627.0, 7683.18, 3525.785109], [1523541600000, 7683.18, 7735.94, 7577.0, 7644.0, 2964.576258], [1523545200000, 7644.0, 7650.0, 7582.31, 7614.21, 2132.633589], [1523548800000, 7618.0, 7625.0, 7542.0, 7619.0, 2314.600659], [1523552400000, 7619.0, 7775.0, 7607.36, 7688.0, 3034.18377], [1523556000000, 7688.0, 7709.95, 7642.01, 7689.89, 1373.067622], [1523559600000, 7688.67, 7768.0, 7680.0, 7700.0, 1525.62255], [1523563200000, 7699.97, 7778.0, 7694.05, 7738.01, 1201.266469], [1523566800000, 7739.0, 7945.0, 7720.0, 7851.0, 2833.551877], [1523570400000, 7853.0, 7890.3, 7716.19, 7890.0, 2272.454868], [1523574000000, 7890.0, 7986.1, 7851.2, 7923.0, 2535.717479], [1523577600000, 7922.99, 7994.96, 7790.0, 7900.94, 2952.467445], [1523581200000, 7900.0, 7909.0, 7732.0, 7793.22, 1828.480039], [1523584800000, 7793.22, 7916.87, 7791.68, 7895.0, 1847.895341], [1523588400000, 7895.0, 7932.0, 7832.78, 7832.99, 1279.583952], [1523592000000, 7832.99, 7846.62, 7790.87, 7827.41, 1304.156512], [1523595600000, 7827.4, 7835.0, 7751.0, 7783.4, 1762.821999], [1523599200000, 7788.96, 7880.51, 7779.99, 7829.73, 1374.443259], [1523602800000, 7825.34, 8195.84, 7820.97, 8093.01, 4044.292119], [1523606400000, 8100.0, 8160.0, 8033.0, 8133.01, 3666.960491], [1523610000000, 8133.0, 8170.0, 8055.0, 8066.96, 2747.847378], [1523613600000, 8066.96, 8108.0, 8005.0, 8062.09, 1960.716606], [1523617200000, 8062.01, 8141.0, 8052.54, 8091.0, 2253.011444], [1523620800000, 8091.4, 8233.39, 8088.0, 8193.49, 2379.429674], [1523624400000, 8194.0, 8220.67, 8020.0, 8096.0, 3672.936807], [1523628000000, 8096.51, 8124.63, 8013.27, 8099.0, 2548.197969], [1523631600000, 8100.0, 8133.0, 8068.46, 8125.0, 1717.723765], [1523635200000, 8125.41, 8157.0, 8083.99, 8130.0, 1427.46751], [1523638800000, 8132.41, 8168.0, 8060.0, 8114.79, 1737.613203], [1523642400000, 8115.0, 8124.49, 8079.0, 8117.84, 997.858936], [1523646000000, 8117.93, 8130.0, 8050.0, 8094.0, 1177.280019], [1523649600000, 8093.82, 8109.9, 7822.0, 7885.0, 4581.051377], [1523653200000, 7885.0, 7903.58, 7801.0, 7859.74, 2463.312841], [1523656800000, 7864.57, 7899.0, 7768.47, 7899.0, 3082.77873], [1523660400000, 7895.39, 7967.26, 7844.42, 7877.41, 2236.195732], [1523664000000, 7877.48, 7924.92, 7810.0, 7910.21, 1653.490851], [1523667600000, 7910.21, 8095.0, 7900.0, 8065.24, 2257.047709], [1523671200000, 8069.43, 8090.0, 8002.95, 8033.59, 1168.32637], [1523674800000, 8033.58, 8060.0, 8000.01, 8044.66, 1156.242601], [1523678400000, 8044.67, 8046.76, 7935.15, 7960.01, 1485.866664], [1523682000000, 7960.01, 8025.13, 7949.07, 7957.36, 951.323272], [1523685600000, 7963.99, 8023.28, 7955.0, 8018.0, 1208.709985], [1523689200000, 8019.88, 8186.0, 7986.13, 8127.74, 2141.855686], [1523692800000, 8129.99, 8175.0, 8071.01, 8100.07, 1387.233793], [1523696400000, 8100.12, 8119.98, 7992.9, 8040.0, 1521.763989], [1523700000000, 8035.22, 8065.9, 7915.0, 7936.34, 1579.093608], [1523703600000, 7940.0, 8015.0, 7920.81, 7965.32, 1210.707371], [1523707200000, 7965.0, 7987.83, 7849.46, 7878.0, 2182.206587], [1523710800000, 7878.0, 7970.0, 7867.11, 7965.18, 1744.497946], [1523714400000, 7964.0, 7978.51, 7905.63, 7975.01, 1263.320851], [1523718000000, 7975.08, 7993.99, 7945.24, 7955.01, 1157.646084], [1523721600000, 7955.02, 8010.0, 7917.0, 8000.0, 1334.045357], [1523725200000, 8004.28, 8004.28, 7936.02, 7972.55, 921.796593], [1523728800000, 7972.55, 8046.63, 7943.4, 8028.0, 873.547199], [1523732400000, 8028.0, 8045.0, 7978.0, 8022.0, 739.230361], [1523736000000, 8022.0, 8087.0, 8000.0, 8077.96, 912.786002], [1523739600000, 8077.96, 8090.23, 8030.0, 8058.47, 750.319398], [1523743200000, 8058.48, 8084.0, 8045.01, 8060.22, 800.955196], [1523746800000, 8060.14, 8063.99, 7941.0, 7999.01, 1219.272884], [1523750400000, 8004.0, 8133.0, 7999.02, 8067.87, 1819.446928], [1523754000000, 8067.86, 8131.0, 8037.94, 8113.02, 993.093294], [1523757600000, 8113.2, 8130.0, 8071.51, 8095.03, 899.678729], [1523761200000, 8097.55, 8105.37, 8059.47, 8083.99, 583.279814], [1523764800000, 8084.0, 8150.0, 8081.0, 8116.0, 957.949642], [1523768400000, 8116.14, 8130.0, 8050.0, 8128.0, 813.634143], [1523772000000, 8127.02, 8130.0, 8081.0, 8111.15, 820.075395], [1523775600000, 8118.84, 8120.86, 8066.39, 8074.99, 655.760082], [1523779200000, 8074.91, 8154.0, 8072.1, 8130.0, 964.224205], [1523782800000, 8135.88, 8142.64, 8080.1, 8116.23, 712.282161], [1523786400000, 8118.0, 8130.61, 8110.69, 8117.29, 713.669071], [1523790000000, 8120.8, 8429.54, 8117.29, 8330.0, 5015.535725], [1523793600000, 8330.0, 8359.76, 8286.0, 8350.53, 1773.940982], [1523797200000, 8350.53, 8380.0, 8330.0, 8353.0, 1363.76114], [1523800800000, 8352.01, 8375.96, 8316.0, 8337.71, 1175.696938], [1523804400000, 8337.71, 8337.72, 8230.0, 8269.99, 1991.412603], [1523808000000, 8269.0, 8349.0, 8254.95, 8261.0, 1109.920302], [1523811600000, 8269.48, 8321.9, 8258.59, 8300.0, 986.703397], [1523815200000, 8296.01, 8334.21, 8280.0, 8321.02, 763.765289], [1523818800000, 8321.5, 8326.63, 8272.57, 8300.01, 754.200027], [1523822400000, 8305.55, 8326.0, 8280.0, 8293.0, 723.748962], [1523826000000, 8293.0, 8308.0, 8287.1, 8295.99, 622.991453], [1523829600000, 8295.99, 8364.81, 8277.57, 8350.0, 900.678625], [1523833200000, 8350.0, 8365.87, 8306.52, 8355.0, 831.271537], [1523836800000, 8355.07, 8419.0, 8320.0, 8389.0, 1573.817624], [1523840400000, 8390.0, 8412.32, 8318.42, 8321.37, 1238.445147], [1523844000000, 8325.0, 8348.0, 8076.19, 8119.0, 3980.258847], [1523847600000, 8119.0, 8174.0, 8095.0, 8146.9, 1716.630587], [1523851200000, 8144.73, 8151.0, 8101.0, 8127.99, 1002.914555], [1523854800000, 8127.99, 8131.97, 8000.0, 8036.43, 2892.075103], [1523858400000, 8035.0, 8110.1, 8020.0, 8089.87, 1747.847386], [1523862000000, 8090.03, 8130.47, 8064.61, 8110.0, 1108.441562], [1523865600000, 8110.21, 8138.53, 8077.89, 8131.0, 913.656041], [1523869200000, 8129.23, 8134.99, 8030.0, 8096.83, 1583.756015], [1523872800000, 8096.83, 8119.85, 8048.0, 8074.44, 1234.646916], [1523876400000, 8074.44, 8097.28, 8016.33, 8086.0, 1084.080434], [1523880000000, 8086.0, 8087.11, 7888.0, 7935.37, 3380.810566], [1523883600000, 7930.06, 7965.0, 7867.0, 7964.34, 2704.86384], [1523887200000, 7964.34, 7999.0, 7907.0, 7973.98, 1401.78959], [1523890800000, 7973.98, 7999.0, 7950.0, 7971.99, 1098.630542], [1523894400000, 7971.98, 7974.94, 7924.65, 7957.07, 919.449382], [1523898000000, 7957.85, 8056.0, 7953.0, 8031.02, 1472.482132], [1523901600000, 8031.02, 8040.76, 7994.41, 8020.0, 1092.479066], [1523905200000, 8020.0, 8050.0, 7953.0, 7983.99, 1187.723513], [1523908800000, 7983.97, 8000.0, 7935.99, 7975.02, 741.748696], [1523912400000, 7973.9, 8036.5, 7973.9, 8018.98, 890.967686], [1523916000000, 8015.0, 8025.6, 7969.0, 8017.0, 727.009992], [1523919600000, 8018.0, 8086.01, 8014.2, 8064.92, 969.544493], [1523923200000, 8064.92, 8083.61, 8014.08, 8054.97, 916.981386], [1523926800000, 8052.56, 8075.0, 8015.0, 8041.0, 994.800426], [1523930400000, 8041.99, 8049.48, 7956.17, 8034.36, 1226.449185], [1523934000000, 8040.0, 8055.93, 8018.15, 8045.78, 896.132918], [1523937600000, 8049.9, 8049.9, 7993.0, 8030.0, 943.571685], [1523941200000, 8030.0, 8036.8, 7975.01, 7983.0, 1009.18411], [1523944800000, 7975.01, 8045.46, 7960.0, 8025.01, 1134.286385], [1523948400000, 8026.02, 8172.76, 8025.0, 8138.45, 1984.300465], [1523952000000, 8143.72, 8172.0, 8125.2, 8131.6, 1376.983721], [1523955600000, 8134.0, 8173.7, 8131.6, 8144.41, 1448.248194], [1523959200000, 8144.41, 8155.0, 8064.52, 8087.3, 1695.688255], [1523962800000, 8087.3, 8127.33, 8085.0, 8124.87, 905.419198], [1523966400000, 8124.87, 8156.0, 8090.23, 8105.13, 1400.959391], [1523970000000, 8105.13, 8125.0, 8051.0, 8100.0, 1076.557051], [1523973600000, 8100.0, 8133.38, 8080.0, 8114.98, 1577.415087], [1523977200000, 8114.98, 8117.0, 8070.0, 8088.63, 949.857843], [1523980800000, 8088.63, 8134.0, 8086.2, 8120.01, 1159.515032], [1523984400000, 8120.01, 8128.99, 8084.97, 8105.0, 761.516255], [1523988000000, 8104.47, 8106.6, 7912.08, 7945.17, 1979.357172], [1523991600000, 7941.97, 7947.0, 7836.4, 7874.01, 3212.402814], [1523995200000, 7874.0, 7951.49, 7825.4, 7920.69, 1867.962093], [1523998800000, 7920.69, 7945.73, 7901.0, 7915.96, 1266.55941], [1524002400000, 7915.97, 7926.88, 7873.0, 7917.43, 1368.487872], [1524006000000, 7917.43, 7923.03, 7860.0, 7885.02, 999.967619], [1524009600000, 7890.96, 7935.57, 7868.07, 7926.32, 806.838937], [1524013200000, 7926.0, 7979.0, 7920.01, 7952.42, 811.950674], [1524016800000, 7952.42, 7966.54, 7901.3, 7911.99, 772.01177], [1524020400000, 7905.69, 7949.82, 7905.69, 7947.71, 504.846999], [1524024000000, 7947.74, 7949.0, 7915.0, 7915.1, 717.247921], [1524027600000, 7915.1, 7949.99, 7907.05, 7928.99, 662.562781], [1524031200000, 7925.83, 8139.0, 7868.0, 8125.0, 2524.866454], [1524034800000, 8123.89, 8149.89, 8085.03, 8107.23, 1799.138889], [1524038400000, 8113.51, 8118.0, 8071.0, 8086.0, 1177.170187], [1524042000000, 8082.56, 8110.0, 8074.67, 8092.01, 919.011309], [1524045600000, 8092.02, 8120.0, 8077.08, 8095.01, 1018.129786], [1524049200000, 8095.0, 8110.0, 8067.02, 8103.0, 817.512167], [1524052800000, 8104.0, 8117.81, 8080.09, 8095.04, 722.689671], [1524056400000, 8095.03, 8114.0, 8075.06, 8095.89, 907.238051], [1524060000000, 8098.45, 8100.0, 7937.6, 7970.91, 1347.230173], [1524063600000, 7962.27, 8036.65, 7931.01, 7994.0, 1733.374868], [1524067200000, 7994.0, 8149.78, 7985.01, 8111.01, 1509.485167], [1524070800000, 8113.93, 8128.5, 8078.01, 8099.0, 1142.93488], [1524074400000, 8098.79, 8124.0, 8090.65, 8109.0, 881.322984], [1524078000000, 8109.0, 8126.79, 8095.0, 8116.65, 910.73602], [1524081600000, 8116.01, 8236.43, 8097.0, 8197.98, 2051.944763], [1524085200000, 8187.02, 8202.0, 8174.05, 8199.0, 806.060624], [1524088800000, 8199.0, 8220.1, 8105.0, 8155.01, 1500.99631], [1524092400000, 8156.5, 8186.59, 8141.01, 8173.0, 923.743185], [1524096000000, 8173.99, 8180.0, 8100.0, 8154.0, 1042.62032], [1524099600000, 8158.0, 8210.0, 8137.0, 8188.88, 1599.76514], [1524103200000, 8188.88, 8290.0, 8150.0, 8220.01, 1654.131073], [1524106800000, 8220.01, 8220.01, 8156.0, 8185.0, 1042.248024], [1524110400000, 8184.99, 8187.0, 8120.0, 8183.0, 1378.086117], [1524114000000, 8183.0, 8198.0, 8145.68, 8180.0, 1037.622209], [1524117600000, 8180.0, 8215.45, 8163.24, 8184.9, 922.276307], [1524121200000, 8184.9, 8249.0, 8080.0, 8166.97, 1709.494365], [1524124800000, 8166.97, 8239.99, 8150.52, 8177.98, 1158.920067], [1524128400000, 8175.82, 8240.0, 8143.02, 8230.89, 1393.015517], [1524132000000, 8231.0, 8250.0, 8202.83, 8240.63, 1307.559468], [1524135600000, 8240.64, 8259.0, 8191.47, 8207.01, 1025.079834], [1524139200000, 8207.0, 8248.5, 8181.7, 8237.68, 1073.409534], [1524142800000, 8235.33, 8248.49, 8218.0, 8234.84, 862.749548], [1524146400000, 8236.0, 8270.0, 8171.56, 8229.97, 1456.860324], [1524150000000, 8229.0, 8239.9, 8214.0, 8239.02, 776.10664], [1524153600000, 8235.45, 8288.37, 8230.01, 8244.99, 1437.589364], [1524157200000, 8244.66, 8296.0, 8236.0, 8259.08, 1144.154439], [1524160800000, 8257.61, 8290.0, 8245.02, 8274.57, 799.1657], [1524164400000, 8274.57, 8277.0, 8233.1, 8249.95, 796.843972], [1524168000000, 8249.95, 8250.01, 8189.0, 8226.7, 1148.577768], [1524171600000, 8226.69, 8280.0, 8222.0, 8272.28, 802.655075], [1524175200000, 8272.28, 8292.0, 8250.0, 8253.0, 876.254021], [1524178800000, 8259.93, 8294.99, 8230.0, 8278.0, 668.662638], [1524182400000, 8273.84, 8375.0, 8270.32, 8350.56, 1893.146913], [1524186000000, 8350.55, 8368.0, 8312.29, 8360.0, 1076.317439], [1524189600000, 8359.99, 8398.0, 8282.2, 8324.89, 1976.376443], [1524193200000, 8324.89, 8355.04, 8320.0, 8331.03, 757.535063], [1524196800000, 8331.3, 8336.38, 8222.55, 8240.99, 3077.033014], [1524200400000, 8240.99, 8300.0, 8177.09, 8272.99, 1776.667619], [1524204000000, 8272.99, 8321.19, 8253.0, 8309.89, 1323.818864], [1524207600000, 8309.89, 8348.98, 8293.49, 8319.97, 1294.266648], [1524211200000, 8319.92, 8349.01, 8281.0, 8294.1, 1338.841325], [1524214800000, 8294.18, 8323.96, 8267.01, 8308.87, 895.414979], [1524218400000, 8305.0, 8540.37, 8290.0, 8488.01, 3465.590847], [1524222000000, 8488.89, 8531.4, 8480.19, 8515.01, 1861.883926], [1524225600000, 8515.0, 8577.9, 8490.0, 8519.62, 2054.17534], [1524229200000, 8519.66, 8532.89, 8455.04, 8499.0, 1531.252806], [1524232800000, 8499.01, 8520.0, 8475.66, 8498.0, 1088.652938], [1524236400000, 8498.0, 8498.02, 8431.86, 8459.99, 1381.668476], [1524240000000, 8458.0, 8519.94, 8446.0, 8508.0, 1083.112533], [1524243600000, 8508.0, 8530.0, 8488.9, 8505.0, 968.115928], [1524247200000, 8505.0, 8525.95, 8485.0, 8505.01, 861.174968], [1524250800000, 8505.04, 8539.63, 8505.0, 8518.0, 809.601988], [1524254400000, 8518.0, 8529.0, 8490.0, 8525.83, 1053.324279], [1524258000000, 8525.85, 8560.0, 8508.01, 8508.04, 944.068001], [1524261600000, 8508.04, 8930.0, 8508.03, 8830.0, 4668.748385], [1524265200000, 8823.5, 8888.0, 8754.0, 8856.98, 2614.548763], [1524268800000, 8852.12, 8869.23, 8780.0, 8814.99, 2116.785291], [1524272400000, 8814.99, 8821.99, 8730.0, 8820.0, 2004.75896], [1524276000000, 8820.0, 8867.19, 8807.02, 8849.49, 1235.821427], [1524279600000, 8849.0, 8928.0, 8837.53, 8862.0, 1363.591697], [1524283200000, 8858.0, 8880.61, 8839.99, 8849.79, 878.963793], [1524286800000, 8848.39, 8884.9, 8840.0, 8878.07, 638.1182], [1524290400000, 8878.07, 8950.0, 8867.87, 8923.0, 1318.488198], [1524294000000, 8920.02, 9035.0, 8854.2, 8874.88, 2660.995664], [1524297600000, 8874.87, 8888.0, 8708.96, 8790.0, 3809.945473], [1524301200000, 8790.92, 8800.0, 8630.0, 8705.01, 3655.584136], [1524304800000, 8713.35, 8749.83, 8640.44, 8670.0, 2667.194572], [1524308400000, 8672.02, 8720.57, 8565.0, 8700.0, 3707.938917], [1524312000000, 8700.01, 8765.0, 8680.0, 8755.01, 1973.914432], [1524315600000, 8755.0, 8778.46, 8680.5, 8748.0, 1644.023489], [1524319200000, 8748.0, 8791.01, 8735.99, 8742.55, 1249.996397], [1524322800000, 8742.56, 8846.63, 8742.56, 8828.2, 1913.141564], [1524326400000, 8828.13, 8874.0, 8737.28, 8755.0, 1757.214612], [1524330000000, 8755.0, 8810.16, 8706.5, 8760.0, 1109.05856], [1524333600000, 8760.05, 8810.0, 8730.0, 8779.97, 842.438887], [1524337200000, 8780.0, 8818.16, 8760.0, 8792.47, 719.024373], [1524340800000, 8792.47, 8800.01, 8707.0, 8765.0, 1016.734644], [1524344400000, 8765.0, 8799.0, 8740.0, 8780.01, 558.330817], [1524348000000, 8780.01, 8834.99, 8762.32, 8806.29, 755.712799], [1524351600000, 8806.35, 8930.0, 8789.57, 8915.31, 1274.453007], [1524355200000, 8915.31, 8915.33, 8792.0, 8816.54, 1211.58133], [1524358800000, 8816.54, 8840.05, 8786.8, 8815.99, 907.108097], [1524362400000, 8815.99, 8874.0, 8801.01, 8852.05, 860.238475], [1524366000000, 8854.99, 8872.09, 8802.5, 8811.0, 673.495438], [1524369600000, 8814.0, 8851.0, 8794.62, 8843.6, 678.367019], [1524373200000, 8843.6, 8887.96, 8833.44, 8834.73, 595.747854], [1524376800000, 8834.73, 8888.0, 8834.5, 8887.07, 680.342982], [1524380400000, 8888.0, 8904.99, 8845.0, 8875.0, 814.481248], [1524384000000, 8875.0, 8963.0, 8865.0, 8940.03, 1593.818831], [1524387600000, 8940.0, 8979.5, 8862.22, 8910.0, 1535.548633], [1524391200000, 8910.0, 8949.0, 8902.12, 8942.0, 867.510752], [1524394800000, 8941.0, 9020.0, 8912.0, 8916.01, 1949.840453], [1524398400000, 8916.01, 8965.82, 8768.79, 8853.97, 2722.808649], [1524402000000, 8853.97, 8913.31, 8830.0, 8877.0, 1040.471244], [1524405600000, 8877.0, 8998.0, 8874.03, 8961.9, 1733.764294], [1524409200000, 8967.78, 8984.98, 8928.23, 8940.67, 1201.65432], [1524412800000, 8940.67, 9020.67, 8850.0, 8919.95, 2220.189424], [1524416400000, 8919.95, 8974.63, 8919.0, 8940.36, 906.83154], [1524420000000, 8940.36, 8957.84, 8921.02, 8948.8, 733.410209], [1524423600000, 8948.8, 8948.81, 8860.0, 8881.0, 1274.601093], [1524427200000, 8881.0, 8925.0, 8865.99, 8898.3, 810.375454], [1524430800000, 8898.3, 8928.0, 8870.0, 8920.02, 735.075953], [1524434400000, 8926.8, 8926.88, 8820.0, 8848.18, 1025.183612], [1524438000000, 8848.18, 8848.18, 8727.68, 8787.02, 2685.806576], [1524441600000, 8785.7, 8848.73, 8745.0, 8816.99, 1359.199257], [1524445200000, 8816.99, 8888.0, 8787.01, 8853.24, 965.589233], [1524448800000, 8844.24, 8888.0, 8821.83, 8849.92, 1047.05392], [1524452400000, 8849.91, 8888.0, 8847.01, 8861.52, 741.219267], [1524456000000, 8861.52, 8878.98, 8821.01, 8857.85, 653.705354], [1524459600000, 8857.84, 8883.0, 8827.66, 8879.0, 707.055087], [1524463200000, 8878.04, 8929.0, 8850.0, 8899.0, 1401.913646], [1524466800000, 8899.0, 8970.01, 8895.45, 8942.39, 1829.730291], [1524470400000, 8942.0, 8957.04, 8892.98, 8900.31, 1344.566766], [1524474000000, 8903.0, 8914.57, 8831.0, 8905.0, 1659.15766], [1524477600000, 8905.0, 8922.0, 8874.71, 8889.0, 1045.277671], [1524481200000, 8889.0, 8923.0, 8877.75, 8910.02, 876.657124], [1524484800000, 8910.02, 8985.0, 8897.75, 8940.74, 1676.023352], [1524488400000, 8940.0, 8945.0, 8900.0, 8929.0, 889.809898], [1524492000000, 8934.39, 8940.0, 8858.08, 8919.0, 1476.377999], [1524495600000, 8919.0, 8935.0, 8888.0, 8898.0, 943.094148], [1524499200000, 8898.0, 8938.21, 8892.02, 8911.54, 997.588794], [1524502800000, 8912.77, 8917.58, 8861.42, 8886.0, 986.554032], [1524506400000, 8887.67, 8915.0, 8877.01, 8893.99, 711.919255], [1524510000000, 8894.0, 8900.0, 8800.6, 8847.37, 1313.307984], [1524513600000, 8847.37, 8928.0, 8825.01, 8924.11, 917.133818], [1524517200000, 8924.11, 8926.76, 8903.93, 8922.0, 702.446719], [1524520800000, 8925.8, 8947.64, 8909.59, 8920.02, 866.251058], [1524524400000, 8924.12, 8949.98, 8888.0, 8934.01, 726.482376], [1524528000000, 8934.0, 9219.0, 8922.0, 9169.97, 3964.942451], [1524531600000, 9169.97, 9194.0, 9109.81, 9186.0, 1704.421783], [1524535200000, 9186.01, 9230.15, 9150.0, 9189.86, 1858.382681], [1524538800000, 9185.01, 9211.47, 9166.0, 9192.47, 1392.77981], [1524542400000, 9192.48, 9279.98, 9190.0, 9266.3, 1786.129072], [1524546000000, 9266.3, 9300.0, 9214.0, 9271.11, 1675.454609], [1524549600000, 9271.14, 9278.81, 9221.01, 9227.37, 1180.924229], [1524553200000, 9235.0, 9243.27, 9177.0, 9216.0, 1499.859334], [1524556800000, 9217.98, 9270.0, 9216.0, 9249.99, 856.531364], [1524560400000, 9246.6, 9285.78, 9217.03, 9285.0, 1204.751766], [1524564000000, 9285.0, 9349.0, 9275.0, 9292.15, 2337.659637], [1524567600000, 9292.15, 9332.79, 9273.22, 9294.57, 1153.965337], [1524571200000, 9294.59, 9383.66, 9290.0, 9380.0, 1403.749474], [1524574800000, 9376.01, 9420.0, 9221.0, 9259.99, 3405.091512], [1524578400000, 9259.99, 9331.0, 9155.0, 9289.69, 3230.869154], [1524582000000, 9289.69, 9370.0, 9288.21, 9347.77, 1451.477868], [1524585600000, 9347.78, 9380.0, 9309.0, 9350.19, 1487.312984], [1524589200000, 9350.19, 9415.95, 9333.0, 9409.97, 1236.857892], [1524592800000, 9410.0, 9411.0, 9350.0, 9410.99, 1503.999882], [1524596400000, 9410.99, 9455.0, 9293.29, 9449.9, 2291.323967], [1524600000000, 9452.0, 9463.0, 9400.04, 9450.79, 1461.891152], [1524603600000, 9450.79, 9495.0, 9439.13, 9468.0, 1821.21482], [1524607200000, 9469.0, 9583.61, 9425.01, 9559.75, 2960.60175], [1524610800000, 9559.75, 9731.01, 9511.0, 9619.99, 3398.597578], [1524614400000, 9618.96, 9680.0, 9440.0, 9529.94, 4176.717373], [1524618000000, 9529.21, 9638.68, 9466.01, 9628.0, 2162.334614], [1524621600000, 9628.0, 9759.82, 9530.0, 9687.05, 2926.04267], [1524625200000, 9675.01, 9729.88, 9323.02, 9347.99, 4750.258117], [1524628800000, 9349.99, 9500.0, 9110.0, 9200.0, 7349.067614], [1524632400000, 9200.22, 9411.0, 9190.0, 9370.0, 4471.750669], [1524636000000, 9370.0, 9476.23, 9355.0, 9415.06, 2308.47475], [1524639600000, 9415.06, 9468.0, 9322.0, 9416.39, 1806.171064], [1524643200000, 9415.0, 9438.54, 9251.0, 9281.98, 2062.736478], [1524646800000, 9281.98, 9340.0, 9200.1, 9272.0, 2432.727417], [1524650400000, 9271.09, 9280.0, 8960.0, 9140.68, 6813.762612], [1524654000000, 9140.0, 9189.39, 8980.0, 9144.03, 4102.885853], [1524657600000, 9137.0, 9210.21, 9071.0, 9129.89, 3273.804506], [1524661200000, 9129.84, 9159.03, 8925.8, 9011.78, 3665.374008], [1524664800000, 9011.79, 9042.93, 8730.0, 8880.0, 7353.700593], [1524668400000, 8874.33, 8975.0, 8825.0, 8972.09, 3884.082052], [1524672000000, 8972.09, 8977.0, 8846.0, 8910.0, 2596.711141], [1524675600000, 8908.32, 9089.0, 8908.28, 9058.0, 2805.154149], [1524679200000, 9055.1, 9063.58, 8951.0, 8991.03, 1816.641586], [1524682800000, 8991.04, 9025.0, 8948.05, 8969.98, 1310.505916], [1524686400000, 8969.55, 9116.91, 8963.54, 9083.0, 1667.936258], [1524690000000, 9085.16, 9179.0, 9076.01, 9178.98, 1834.72347], [1524693600000, 9178.98, 9185.01, 8926.0, 8955.0, 2588.925525], [1524697200000, 8950.0, 9007.6, 8770.0, 8869.99, 2949.549154], [1524700800000, 8869.99, 8869.99, 8660.0, 8800.02, 3857.714344], [1524704400000, 8808.17, 8863.85, 8720.13, 8752.82, 1972.825793], [1524708000000, 8755.06, 8899.0, 8751.0, 8850.15, 1637.15144], [1524711600000, 8850.22, 8890.0, 8763.14, 8808.02, 1429.992518], [1524715200000, 8812.7, 8940.01, 8800.0, 8935.0, 2138.337113], [1524718800000, 8936.0, 8977.0, 8874.0, 8916.56, 2050.404402], [1524722400000, 8905.88, 8945.34, 8771.0, 8841.0, 2142.346006], [1524726000000, 8841.04, 8888.99, 8803.0, 8847.97, 1361.05604], [1524729600000, 8847.97, 8887.8, 8680.0, 8720.5, 2763.689638], [1524733200000, 8720.58, 8773.0, 8651.62, 8746.0, 2017.713497], [1524736800000, 8746.0, 8881.0, 8738.14, 8845.02, 1817.687954], [1524740400000, 8844.98, 8917.51, 8819.0, 8857.01, 1419.473964], [1524744000000, 8858.51, 8945.0, 8857.01, 8900.01, 1458.689927], [1524747600000, 8904.78, 8904.93, 8785.0, 8829.63, 1330.948392], [1524751200000, 8828.27, 8885.0, 8740.01, 8829.99, 1753.776069], [1524754800000, 8829.99, 8832.0, 8768.6, 8806.1, 1158.208979], [1524758400000, 8806.1, 8908.53, 8775.89, 8900.51, 1471.486504], [1524762000000, 8899.0, 8925.0, 8845.03, 8866.43, 1121.796651], [1524765600000, 8866.43, 8909.0, 8834.02, 8845.09, 709.544315], [1524769200000, 8845.1, 8895.21, 8838.35, 8881.54, 660.364885], [1524772800000, 8880.0, 9138.0, 8880.0, 9123.99, 3004.794474], [1524776400000, 9123.99, 9169.9, 9066.02, 9099.0, 1665.171301], [1524780000000, 9100.0, 9235.99, 9096.01, 9221.0, 1967.660617], [1524783600000, 9221.0, 9307.48, 9188.0, 9266.0, 2389.469422], [1524787200000, 9267.03, 9297.0, 9177.0, 9210.32, 1809.231872], [1524790800000, 9210.29, 9292.0, 9210.21, 9249.97, 1355.448312], [1524794400000, 9240.0, 9282.0, 9233.51, 9255.49, 1056.39558], [1524798000000, 9255.5, 9258.0, 9123.25, 9143.01, 2050.032206], [1524801600000, 9143.01, 9235.0, 9104.88, 9204.99, 1504.842605], [1524805200000, 9205.0, 9229.59, 9160.0, 9180.82, 955.199164], [1524808800000, 9184.99, 9265.7, 9176.99, 9250.0, 1653.666549], [1524812400000, 9249.99, 9250.0, 9188.0, 9240.97, 1007.547204], [1524816000000, 9240.97, 9296.0, 9230.0, 9260.0, 1337.006864], [1524819600000, 9260.0, 9387.48, 9241.2, 9369.0, 1954.845249], [1524823200000, 9369.0, 9395.0, 9328.05, 9365.0, 1616.756196], [1524826800000, 9363.31, 9367.97, 9280.59, 9309.0, 1330.916823], [1524830400000, 9308.9, 9355.0, 9253.68, 9290.07, 1309.376788], [1524834000000, 9290.01, 9318.62, 9150.1, 9225.0, 2525.072325], [1524837600000, 9226.97, 9290.0, 9202.0, 9288.88, 1401.058675], [1524841200000, 9280.14, 9288.88, 9210.01, 9241.21, 1359.95917], [1524844800000, 9241.2, 9328.26, 9241.0, 9282.1, 1395.512101], [1524848400000, 9286.01, 9319.99, 9266.0, 9290.1, 1122.230082], [1524852000000, 9290.1, 9296.31, 9213.8, 9230.89, 1001.907142], [1524855600000, 9230.89, 9250.56, 9075.01, 9089.0, 2097.18544], [1524859200000, 9089.12, 9163.38, 8940.0, 8970.0, 3084.066108], [1524862800000, 8969.99, 9053.0, 8909.83, 8975.35, 1911.233654], [1524866400000, 8975.36, 9093.09, 8975.36, 9031.0, 1077.087976], [1524870000000, 9032.0, 9073.93, 8889.0, 8915.35, 1324.768951], [1524873600000, 8915.35, 9049.76, 8870.0, 9010.11, 1754.04032], [1524877200000, 9005.98, 9126.81, 9000.0, 9126.81, 1298.861448], [1524880800000, 9126.81, 9129.17, 9050.0, 9055.78, 1317.636058], [1524884400000, 9053.47, 9196.32, 9051.0, 9155.0, 1089.068669], [1524888000000, 9155.01, 9168.71, 9111.21, 9138.53, 916.92033], [1524891600000, 9138.54, 9188.5, 9127.64, 9164.49, 934.025323], [1524895200000, 9164.48, 9215.66, 9150.67, 9163.03, 1348.809775], [1524898800000, 9163.02, 9171.07, 9108.99, 9126.22, 1203.100815], [1524902400000, 9121.05, 9330.0, 9081.02, 9217.48, 3048.753373], [1524906000000, 9227.49, 9300.4, 9155.06, 9273.0, 1973.035083], [1524909600000, 9273.0, 9310.0, 9257.8, 9289.98, 427.889426]], "2h": [[1521316800000, 7820.0, 8050.0, 7745.18, 7919.56, 3491.272996], [1521324000000, 7919.56, 8025.15, 7800.0, 7824.8, 2695.049265], [1521331200000, 7824.01, 7857.24, 7669.92, 7695.0, 3192.340126], [1521338400000, 7695.0, 7730.0, 7539.99, 7666.35, 5278.192087], [1521345600000, 7666.33, 7740.0, 7519.84, 7658.0, 3412.657579], [1521352800000, 7656.62, 7771.0, 7632.6, 7659.99, 2127.972124], [1521360000000, 7659.0, 7793.81, 7640.07, 7691.0, 2622.676406], [1521367200000, 7692.0, 7810.97, 7532.09, 7760.09, 3924.881135], [1521374400000, 7761.19, 7829.0, 7534.9, 7606.0, 3889.076886], [1521381600000, 7606.0, 7622.36, 7322.0, 7385.0, 7919.604712], [1521388800000, 7385.0, 7511.81, 7330.0, 7485.0, 4821.928467], [1521396000000, 7489.29, 7584.0, 7379.82, 7463.53, 4137.213803], [1521403200000, 7473.86, 8317.4, 7453.59, 8225.01, 10446.532093], [1521410400000, 8225.01, 8259.01, 8026.0, 8189.99, 7715.156293], [1521417600000, 8189.0, 8456.0, 8088.4, 8238.65, 7663.056017], [1521424800000, 8238.65, 8300.0, 8101.0, 8169.25, 3160.534373], [1521432000000, 8157.01, 8340.0, 8140.54, 8326.87, 3325.461321], [1521439200000, 8317.11, 8367.97, 8236.0, 8289.01, 2665.790353], [1521446400000, 8292.92, 8400.81, 8158.0, 8184.13, 4260.363728], [1521453600000, 8186.54, 8360.07, 8089.0, 8330.0, 3879.504579], [1521460800000, 8330.0, 8594.99, 8205.01, 8529.02, 5608.076418], [1521468000000, 8534.28, 8705.23, 8485.0, 8550.0, 7682.535641], [1521475200000, 8550.0, 8630.0, 8230.7, 8305.0, 6987.063289], [1521482400000, 8304.99, 8474.93, 8260.0, 8395.81, 3658.986333], [1521489600000, 8395.0, 8518.12, 8360.26, 8374.01, 2984.527982], [1521496800000, 8373.01, 8630.07, 8365.0, 8600.0, 3421.184908], [1521504000000, 8595.01, 8605.3, 8410.0, 8459.91, 3462.439434], [1521511200000, 8459.92, 8667.0, 8435.0, 8599.97, 3485.746906], [1521518400000, 8600.0, 8600.0, 8372.0, 8475.95, 3147.007923], [1521525600000, 8475.95, 8544.0, 8340.0, 8385.12, 2364.854949], [1521532800000, 8385.12, 8467.0, 8280.0, 8436.83, 4722.840176], [1521540000000, 8436.74, 8555.0, 8410.0, 8516.0, 2455.391119], [1521547200000, 8517.44, 8588.03, 8444.0, 8462.0, 2571.531057], [1521554400000, 8468.88, 8600.0, 8429.0, 8513.97, 2927.931914], [1521561600000, 8513.97, 8891.3, 8513.88, 8870.0, 7543.582342], [1521568800000, 8870.01, 8968.95, 8784.01, 8950.0, 3987.911214], [1521576000000, 8950.0, 9050.0, 8822.24, 8987.01, 4881.398312], [1521583200000, 8989.0, 8997.96, 8810.96, 8909.98, 3314.470489], [1521590400000, 8909.96, 8984.0, 8860.01, 8972.0, 2565.890646], [1521597600000, 8974.0, 9078.0, 8923.0, 9042.23, 2228.543942], [1521604800000, 9042.23, 9145.3, 9025.17, 9041.84, 3434.5224], [1521612000000, 9047.93, 9096.02, 8900.0, 8931.01, 3079.065283], [1521619200000, 8931.0, 9079.99, 8880.0, 9040.0, 3006.002834], [1521626400000, 9035.6, 9125.0, 9035.3, 9063.0, 2153.888163], [1521633600000, 9063.0, 9093.0, 8956.0, 9016.07, 2658.750973], [1521640800000, 9020.0, 9177.01, 9001.0, 9039.99, 3560.881227], [1521648000000, 9039.99, 9069.99, 8750.6, 8832.26, 8637.581205], [1521655200000, 8832.26, 8965.0, 8777.57, 8862.92, 3761.515817], [1521662400000, 8862.78, 8950.0, 8820.02, 8908.0, 2195.629105], [1521669600000, 8908.03, 8934.22, 8777.0, 8885.0, 2690.133776], [1521676800000, 8884.82, 9090.0, 8860.0, 9067.43, 2682.344128], [1521684000000, 9067.43, 9100.0, 8980.0, 9017.01, 2213.402431], [1521691200000, 9019.0, 9052.9, 8968.08, 9004.99, 1566.411648], [1521698400000, 9002.25, 9042.12, 8889.0, 8955.09, 2473.498183], [1521705600000, 8955.0, 9020.0, 8724.68, 8785.01, 4071.16414], [1521712800000, 8785.31, 8799.86, 8620.0, 8642.01, 5877.195791], [1521720000000, 8645.0, 8753.54, 8556.98, 8588.14, 4079.724708], [1521727200000, 8588.15, 8650.0, 8465.1, 8611.51, 6759.255636], [1521734400000, 8611.51, 8694.7, 8550.01, 8672.89, 3854.357709], [1521741600000, 8672.9, 8695.28, 8534.0, 8610.99, 2551.152991], [1521748800000, 8610.0, 8640.0, 8510.2, 8600.12, 1918.151151], [1521756000000, 8607.6, 8770.0, 8598.0, 8722.9, 2570.898293], [1521763200000, 8720.0, 8729.5, 8545.94, 8580.0, 2376.168338], [1521770400000, 8580.0, 8599.98, 8330.0, 8410.05, 5311.181155], [1521777600000, 8400.65, 8485.0, 8351.0, 8429.07, 2822.666789], [1521784800000, 8429.07, 8505.0, 8345.0, 8398.65, 3009.782323], [1521792000000, 8398.58, 8554.0, 8378.03, 8481.51, 3236.18241], [1521799200000, 8488.25, 8523.0, 8398.0, 8510.0, 2187.843469], [1521806400000, 8509.99, 8510.71, 8269.0, 8369.0, 3918.984587], [1521813600000, 8369.0, 8687.98, 8360.0, 8613.0, 5186.745432], [1521820800000, 8618.0, 8685.0, 8570.0, 8639.79, 2902.665532], [1521828000000, 8639.79, 8749.5, 8559.25, 8623.99, 3705.468592], [1521835200000, 8623.99, 8731.97, 8559.25, 8677.0, 2308.935447], [1521842400000, 8677.15, 8909.0, 8620.21, 8898.03, 3024.383592], [1521849600000, 8898.04, 8969.0, 8815.07, 8817.99, 3701.84878], [1521856800000, 8817.99, 8925.99, 8805.01, 8880.02, 2065.398082], [1521864000000, 8885.95, 8987.97, 8834.29, 8845.0, 3081.467806], [1521871200000, 8841.5, 8960.37, 8841.5, 8930.0, 2138.628687], [1521878400000, 8931.7, 8931.89, 8840.0, 8887.99, 1917.95483], [1521885600000, 8887.99, 8887.99, 8683.0, 8723.0, 3612.661927], [1521892800000, 8723.0, 8905.35, 8666.3, 8870.0, 3147.763527], [1521900000000, 8865.6, 8999.95, 8829.86, 8950.0, 2962.134498], [1521907200000, 8950.0, 8954.63, 8822.91, 8860.04, 2475.189965], [1521914400000, 8867.0, 8942.0, 8840.27, 8892.56, 1934.382174], [1521921600000, 8884.08, 8968.0, 8607.23, 8663.36, 4326.00937], [1521928800000, 8663.36, 8718.0, 8491.0, 8546.86, 4103.169926], [1521936000000, 8531.25, 8599.0, 8461.0, 8518.0, 3304.59241], [1521943200000, 8519.99, 8570.0, 8433.93, 8555.58, 2564.338069], [1521950400000, 8550.0, 8592.59, 8480.01, 8521.0, 1375.13701], [1521957600000, 8521.0, 8587.52, 8379.23, 8466.53, 2395.038601], [1521964800000, 8468.85, 8575.0, 8445.51, 8503.0, 1824.874067], [1521972000000, 8508.0, 8531.54, 8365.77, 8407.0, 2732.63418], [1521979200000, 8408.0, 8580.07, 8380.41, 8574.58, 2680.476329], [1521986400000, 8574.58, 8643.0, 8454.26, 8480.0, 2922.202005], [1521993600000, 8480.0, 8579.01, 8470.99, 8529.0, 2082.089726], [1522000800000, 8529.0, 8669.85, 8517.64, 8612.09, 2626.677575], [1522008000000, 8620.97, 8630.0, 8520.07, 8625.0, 1583.357445], [1522015200000, 8625.0, 8645.53, 8388.0, 8470.15, 2910.351899], [1522022400000, 8470.14, 8514.89, 8353.18, 8417.0, 2003.574489], [1522029600000, 8417.0, 8483.8, 8394.88, 8440.92, 1707.728946], [1522036800000, 8440.92, 8491.25, 8420.0, 8461.0, 1296.173935], [1522044000000, 8461.0, 8480.0, 8364.57, 8405.88, 1933.713621], [1522051200000, 8400.5, 8426.99, 8230.88, 8290.04, 3714.166551], [1522058400000, 8290.02, 8330.47, 8050.0, 8089.0, 6801.337713], [1522065600000, 8089.0, 8165.0, 8000.01, 8095.0, 4930.885476], [1522072800000, 8095.0, 8116.0, 8012.02, 8057.16, 3332.845231], [1522080000000, 8057.16, 8099.04, 7860.0, 7905.0, 6014.239065], [1522087200000, 7900.21, 7971.65, 7850.01, 7910.03, 3355.80817], [1522094400000, 7910.04, 7941.0, 7831.0, 7880.0, 2562.903911], [1522101600000, 7880.01, 8268.5, 7866.05, 8134.23, 6380.218552], [1522108800000, 8134.22, 8215.94, 8012.24, 8016.45, 2792.855975], [1522116000000, 8016.42, 8030.0, 7820.0, 7866.42, 4366.027735], [1522123200000, 7866.42, 7949.8, 7730.0, 7920.03, 4337.753106], [1522130400000, 7920.66, 8050.05, 7832.88, 7917.09, 2955.757111], [1522137600000, 7917.09, 7997.0, 7820.0, 7900.0, 2657.075761], [1522144800000, 7900.0, 8040.0, 7855.0, 7934.22, 2556.542215], [1522152000000, 7932.2, 8150.0, 7878.58, 8088.01, 3090.614352], [1522159200000, 8094.9, 8150.17, 8036.0, 8066.87, 3364.33552], [1522166400000, 8066.5, 8126.03, 7860.0, 7892.86, 3553.197181], [1522173600000, 7895.0, 7939.5, 7820.0, 7886.0, 2625.444492], [1522180800000, 7886.0, 8050.0, 7875.0, 8005.97, 2420.602588], [1522188000000, 8000.52, 8011.0, 7755.58, 7795.51, 2707.442014], [1522195200000, 7795.51, 7843.12, 7740.0, 7815.52, 2334.885017], [1522202400000, 7815.51, 7885.0, 7728.0, 7874.98, 2023.869613], [1522209600000, 7870.05, 7875.0, 7811.02, 7860.01, 1352.562294], [1522216800000, 7860.01, 7965.6, 7850.1, 7873.99, 2423.517214], [1522224000000, 7865.0, 8100.0, 7852.0, 8079.0, 2986.355987], [1522231200000, 8079.0, 8109.0, 8003.01, 8040.0, 2501.637303], [1522238400000, 8040.0, 8055.99, 7970.1, 8029.18, 2552.621835], [1522245600000, 8029.18, 8042.64, 7825.0, 7860.01, 3513.469798], [1522252800000, 7860.21, 7947.0, 7843.5, 7935.99, 1869.884189], [1522260000000, 7935.47, 7952.44, 7880.0, 7899.94, 1489.480769], [1522267200000, 7890.63, 7941.21, 7836.0, 7876.95, 1238.772293], [1522274400000, 7875.0, 8009.0, 7864.06, 7949.3, 2114.275358], [1522281600000, 7949.3, 7975.0, 7871.01, 7885.87, 1523.359919], [1522288800000, 7885.65, 7919.74, 7855.0, 7880.94, 1674.402693], [1522296000000, 7870.12, 7880.95, 7550.0, 7565.0, 7688.515935], [1522303200000, 7567.99, 7650.0, 7500.0, 7541.98, 3730.147387], [1522310400000, 7541.98, 7587.0, 7451.98, 7517.01, 3570.459819], [1522317600000, 7517.0, 7540.0, 7425.4, 7466.97, 3256.071957], [1522324800000, 7466.89, 7566.0, 7441.01, 7470.0, 3108.100179], [1522332000000, 7464.99, 7484.56, 7334.0, 7474.01, 4656.499543], [1522339200000, 7481.94, 7580.0, 7402.89, 7433.0, 4325.789749], [1522346400000, 7433.09, 7478.94, 7338.0, 7341.0, 2287.221692], [1522353600000, 7341.0, 7380.0, 6941.11, 7095.0, 11990.43189], [1522360800000, 7081.34, 7388.33, 7057.81, 7090.14, 6809.914362], [1522368000000, 7090.16, 7165.08, 6741.0, 6950.0, 10095.003058], [1522375200000, 6950.0, 6980.0, 6740.0, 6861.01, 4929.914564], [1522382400000, 6867.19, 7210.0, 6666.66, 7103.07, 7742.466249], [1522389600000, 7103.07, 7272.78, 6955.92, 7222.25, 6657.194954], [1522396800000, 7222.29, 7292.43, 7031.0, 7031.69, 4147.254494], [1522404000000, 7032.0, 7114.61, 6880.0, 7027.72, 4006.064823], [1522411200000, 7027.73, 7040.01, 6832.12, 6881.13, 3761.487336], [1522418400000, 6881.13, 6922.98, 6679.01, 6839.98, 5976.730412], [1522425600000, 6839.97, 6911.69, 6600.1, 6720.08, 7407.547927], [1522432800000, 6720.08, 6870.45, 6652.6, 6800.63, 3884.191497], [1522440000000, 6816.58, 6951.0, 6735.0, 6928.17, 3622.368057], [1522447200000, 6928.17, 6928.19, 6735.0, 6840.23, 3075.808605], [1522454400000, 6840.24, 7120.0, 6837.71, 7082.0, 3928.716962], [1522461600000, 7082.0, 7117.07, 6950.07, 6959.02, 3361.458566], [1522468800000, 6954.06, 7050.0, 6850.0, 6905.96, 2953.604938], [1522476000000, 6898.26, 6920.0, 6777.0, 6805.76, 2788.552146], [1522483200000, 6810.0, 7014.99, 6805.77, 6997.16, 2782.763091], [1522490400000, 6996.99, 7148.2, 6950.0, 7073.63, 4448.393105], [1522497600000, 7079.72, 7223.36, 7020.0, 7033.8, 4110.099492], [1522504800000, 7033.8, 7085.25, 6978.98, 7064.98, 2588.006852], [1522512000000, 7063.83, 7172.0, 7055.1, 7114.21, 2629.30714], [1522519200000, 7114.22, 7137.0, 6985.0, 7048.23, 2189.044216], [1522526400000, 7054.99, 7059.01, 6842.97, 6932.79, 3469.631652], [1522533600000, 6923.02, 6990.84, 6888.53, 6923.91, 1618.960927], [1522540800000, 6922.0, 7049.98, 6922.0, 7000.01, 1763.981633], [1522548000000, 7001.01, 7014.0, 6892.0, 6922.12, 1465.328265], [1522555200000, 6926.0, 6969.0, 6907.0, 6914.99, 1103.150812], [1522562400000, 6914.99, 6918.16, 6670.0, 6713.81, 4483.092587], [1522569600000, 6713.81, 6775.0, 6623.97, 6763.86, 3564.772465], [1522576800000, 6763.84, 6770.0, 6643.7, 6685.1, 2198.513071], [1522584000000, 6688.53, 6735.0, 6525.0, 6543.97, 4201.051341], [1522591200000, 6543.97, 6543.97, 6430.0, 6445.0, 5219.770181], [1522598400000, 6445.0, 6869.0, 6432.65, 6824.99, 9794.752608], [1522605600000, 6824.99, 6961.83, 6737.47, 6900.99, 5069.481376], [1522612800000, 6900.98, 6955.0, 6792.0, 6819.0, 2912.736618], [1522620000000, 6819.0, 6841.0, 6753.0, 6813.01, 2294.799506], [1522627200000, 6813.01, 7018.0, 6765.0, 6919.92, 3610.210184], [1522634400000, 6918.0, 7020.0, 6900.0, 6980.72, 2112.993795], [1522641600000, 6982.44, 7016.0, 6833.0, 6892.0, 2240.996279], [1522648800000, 6892.0, 7102.02, 6862.57, 7060.22, 3300.15959], [1522656000000, 7065.01, 7099.0, 7022.0, 7062.96, 2576.776245], [1522663200000, 7062.96, 7125.0, 7007.72, 7046.01, 2922.256186], [1522670400000, 7046.0, 7061.4, 6961.0, 7011.0, 2730.726704], [1522677600000, 7011.0, 7050.0, 6873.32, 7020.72, 3634.369753], [1522684800000, 7020.72, 7048.89, 6941.0, 6977.75, 2516.348251], [1522692000000, 6981.43, 7020.0, 6945.38, 6989.8, 1968.290075], [1522699200000, 6989.8, 7007.01, 6890.0, 6981.36, 2218.509922], [1522706400000, 6981.36, 7070.0, 6968.0, 7056.0, 2291.923088], [1522713600000, 7063.97, 7099.0, 7011.01, 7026.0, 1828.782797], [1522720800000, 7026.0, 7188.99, 7023.1, 7180.01, 3361.091048], [1522728000000, 7183.01, 7390.08, 7180.01, 7320.8, 5588.24188], [1522735200000, 7321.01, 7447.99, 7310.0, 7395.0, 3132.863977], [1522742400000, 7396.94, 7422.63, 7315.66, 7359.7, 3094.441343], [1522749600000, 7359.69, 7397.98, 7252.0, 7307.48, 3241.966022], [1522756800000, 7302.03, 7432.4, 7287.25, 7335.91, 2889.227743], [1522764000000, 7335.9, 7417.0, 7277.0, 7370.01, 3103.975017], [1522771200000, 7370.01, 7439.99, 7353.0, 7426.01, 2856.257963], [1522778400000, 7426.01, 7520.0, 7407.76, 7467.11, 3734.392191], [1522785600000, 7467.12, 7499.0, 7356.0, 7431.0, 2912.525825], [1522792800000, 7431.0, 7439.78, 7345.0, 7405.21, 2043.566005], [1522800000000, 7405.21, 7427.52, 7292.02, 7322.27, 3080.586264], [1522807200000, 7322.0, 7337.88, 7223.0, 7295.71, 3580.124496], [1522814400000, 7295.72, 7382.31, 7261.41, 7345.0, 2400.496512], [1522821600000, 7344.99, 7380.14, 7304.0, 7304.31, 1674.420158], [1522828800000, 7304.26, 7338.0, 7053.0, 7085.12, 5053.289356], [1522836000000, 7085.12, 7130.0, 7001.0, 7058.0, 4350.405262], [1522843200000, 7055.0, 7123.98, 7003.0, 7071.0, 3182.847824], [1522850400000, 7075.0, 7075.0, 6766.0, 6785.0, 6549.019994], [1522857600000, 6785.0, 6918.0, 6785.0, 6838.23, 3271.93993], [1522864800000, 6843.96, 6886.52, 6721.0, 6854.41, 4178.457223], [1522872000000, 6857.86, 6900.0, 6750.0, 6818.78, 2399.303166], [1522879200000, 6818.78, 6830.0, 6707.0, 6796.1, 2506.293619], [1522886400000, 6796.1, 6825.0, 6566.69, 6609.91, 4162.291942], [1522893600000, 6603.01, 6807.99, 6585.01, 6776.99, 3476.849173], [1522900800000, 6776.99, 6870.0, 6745.0, 6865.0, 3831.999716], [1522908000000, 6857.99, 6865.0, 6709.0, 6792.52, 3448.081687], [1522915200000, 6792.49, 6902.0, 6761.0, 6837.99, 3417.97483], [1522922400000, 6833.36, 6838.36, 6750.0, 6779.0, 2321.634651], [1522929600000, 6778.99, 6850.0, 6612.11, 6823.73, 4912.658642], [1522936800000, 6834.94, 6899.0, 6680.0, 6749.53, 4053.87621], [1522944000000, 6747.99, 6790.0, 6660.0, 6695.0, 3006.907935], [1522951200000, 6694.99, 6800.0, 6675.02, 6760.96, 2177.396493], [1522958400000, 6760.96, 6783.0, 6671.0, 6713.0, 1998.504563], [1522965600000, 6713.0, 6840.0, 6710.0, 6770.76, 2221.555618], [1522972800000, 6770.0, 6850.0, 6754.12, 6800.0, 1698.534082], [1522980000000, 6800.01, 6827.98, 6718.0, 6760.0, 2421.313598], [1522987200000, 6755.24, 6848.0, 6745.0, 6754.09, 2066.650227], [1522994400000, 6753.99, 6755.08, 6529.68, 6622.05, 5539.528508], [1523001600000, 6621.04, 6622.05, 6545.0, 6571.98, 2510.522467], [1523008800000, 6571.69, 6657.86, 6500.0, 6600.0, 3062.857628], [1523016000000, 6600.0, 6634.88, 6540.0, 6608.0, 2108.055309], [1523023200000, 6607.0, 6629.0, 6551.0, 6580.01, 1861.770223], [1523030400000, 6583.0, 6623.94, 6575.28, 6609.75, 1672.011227], [1523037600000, 6609.75, 6627.0, 6565.83, 6618.39, 1593.178702], [1523044800000, 6618.37, 6622.72, 6572.0, 6590.97, 1122.616469], [1523052000000, 6591.74, 6610.0, 6516.67, 6601.39, 1797.97348], [1523059200000, 6601.39, 6878.9, 6586.28, 6830.0, 4377.247384], [1523066400000, 6824.5, 6880.0, 6745.73, 6864.32, 2708.308379], [1523073600000, 6866.52, 6880.79, 6818.0, 6839.03, 2208.144442], [1523080800000, 6835.05, 6888.0, 6834.01, 6864.08, 2343.430667], [1523088000000, 6864.08, 6929.86, 6821.0, 6849.85, 3020.325044], [1523095200000, 6848.56, 6879.0, 6837.0, 6862.04, 1566.430075], [1523102400000, 6862.04, 6888.0, 6760.0, 6840.0, 2727.398664], [1523109600000, 6840.0, 7033.99, 6828.33, 7010.0, 3750.88973], [1523116800000, 7003.98, 7070.0, 6976.01, 7004.96, 3865.934781], [1523124000000, 7003.0, 7017.0, 6952.05, 6988.99, 1954.520733], [1523131200000, 6988.99, 7019.56, 6950.0, 6975.0, 1636.991929], [1523138400000, 6975.0, 6990.0, 6850.01, 6895.8, 2109.956439], [1523145600000, 6895.81, 6987.15, 6880.0, 6930.09, 1612.8838], [1523152800000, 6930.09, 6965.0, 6914.11, 6964.98, 1130.711148], [1523160000000, 6960.11, 7050.0, 6925.73, 6952.0, 1845.328897], [1523167200000, 6952.0, 6962.98, 6891.79, 6939.0, 1253.093794], [1523174400000, 6939.0, 7028.0, 6924.3, 6999.0, 1689.986129], [1523181600000, 6999.0, 7100.0, 6976.02, 7099.85, 3117.78099], [1523188800000, 7100.0, 7109.13, 7048.0, 7060.01, 2222.018144], [1523196000000, 7060.01, 7076.98, 7019.09, 7049.93, 1902.288324], [1523203200000, 7047.01, 7049.93, 6937.03, 6999.0, 2425.257317], [1523210400000, 6995.02, 7014.86, 6952.0, 6994.42, 1671.164038], [1523217600000, 6989.97, 6997.99, 6942.84, 6992.0, 1169.465142], [1523224800000, 6993.99, 7053.09, 6990.01, 7018.0, 1387.695442], [1523232000000, 7011.04, 7139.0, 7011.02, 7120.0, 2752.14241], [1523239200000, 7120.0, 7165.21, 7055.0, 7131.85, 2802.264258], [1523246400000, 7131.78, 7160.0, 7093.69, 7113.94, 1818.562573], [1523253600000, 7115.0, 7145.0, 7084.0, 7125.0, 1662.364294], [1523260800000, 7129.79, 7185.0, 7072.0, 7076.0, 2366.795649], [1523268000000, 7076.0, 7083.0, 6691.18, 6745.0, 8105.618546], [1523275200000, 6740.0, 6792.0, 6676.5, 6730.88, 3938.329276], [1523282400000, 6730.9, 6783.0, 6680.0, 6738.98, 2959.469612], [1523289600000, 6738.98, 6759.9, 6720.01, 6746.0, 1442.665661], [1523296800000, 6745.99, 6767.99, 6650.01, 6672.08, 2142.387285], [1523304000000, 6677.04, 6741.62, 6611.0, 6723.67, 2514.258674], [1523311200000, 6723.67, 6795.0, 6683.03, 6782.72, 1573.438968], [1523318400000, 6781.55, 6790.0, 6706.02, 6740.11, 1340.646448], [1523325600000, 6740.05, 6809.55, 6735.03, 6805.63, 1671.917905], [1523332800000, 6808.68, 6820.0, 6724.68, 6759.92, 2027.907374], [1523340000000, 6759.93, 6774.71, 6670.25, 6715.51, 2094.894524], [1523347200000, 6717.32, 6785.0, 6656.0, 6785.0, 1866.956021], [1523354400000, 6773.93, 6788.62, 6702.0, 6735.0, 1806.012576], [1523361600000, 6735.0, 6772.99, 6719.91, 6761.99, 1504.740773], [1523368800000, 6761.99, 6870.99, 6733.0, 6837.54, 3020.833034], [1523376000000, 6835.65, 6870.0, 6809.6, 6867.48, 1917.096824], [1523383200000, 6867.49, 6874.0, 6825.0, 6844.93, 1637.2403], [1523390400000, 6844.93, 6865.0, 6805.52, 6860.0, 1295.352263], [1523397600000, 6860.0, 6890.0, 6768.01, 6843.9, 2143.130053], [1523404800000, 6839.56, 6872.71, 6827.69, 6840.0, 1852.727635], [1523412000000, 6840.0, 6860.3, 6800.0, 6818.79, 1526.703791], [1523419200000, 6818.79, 6867.4, 6806.44, 6817.71, 1456.182107], [1523426400000, 6817.71, 6848.0, 6787.0, 6846.89, 1675.528256], [1523433600000, 6846.89, 6869.34, 6830.51, 6854.12, 1839.90233], [1523440800000, 6856.99, 6857.97, 6800.0, 6851.97, 1904.129724], [1523448000000, 6851.53, 6990.0, 6840.0, 6944.89, 3011.274495], [1523455200000, 6944.89, 6968.02, 6901.0, 6927.06, 2476.682429], [1523462400000, 6927.06, 6936.0, 6862.6, 6904.99, 2631.780025], [1523469600000, 6904.99, 6927.48, 6890.03, 6910.63, 1796.758248], [1523476800000, 6914.97, 6926.95, 6878.14, 6909.0, 1517.670765], [1523484000000, 6908.53, 6987.41, 6904.61, 6953.79, 2308.531372], [1523491200000, 6953.78, 6975.0, 6885.0, 6939.99, 2317.166168], [1523498400000, 6939.98, 6980.0, 6930.0, 6965.2, 2047.125902], [1523505600000, 6965.21, 6985.0, 6928.0, 6940.0, 1806.659812], [1523512800000, 6940.01, 6967.02, 6743.2, 6826.61, 5239.121159], [1523520000000, 6826.62, 6865.71, 6802.7, 6850.99, 2484.937926], [1523527200000, 6850.99, 8012.23, 6840.01, 7690.0, 17751.80667], [1523534400000, 7685.55, 7780.0, 7569.83, 7683.18, 11027.103209], [1523541600000, 7683.18, 7735.94, 7577.0, 7614.21, 5097.209847], [1523548800000, 7618.0, 7775.0, 7542.0, 7688.0, 5348.784429], [1523556000000, 7688.0, 7768.0, 7642.01, 7700.0, 2898.690172], [1523563200000, 7699.97, 7945.0, 7694.05, 7851.0, 4034.818346], [1523570400000, 7853.0, 7986.1, 7716.19, 7923.0, 4808.172347], [1523577600000, 7922.99, 7994.96, 7732.0, 7793.22, 4780.947484], [1523584800000, 7793.22, 7932.0, 7791.68, 7832.99, 3127.479293], [1523592000000, 7832.99, 7846.62, 7751.0, 7783.4, 3066.978511], [1523599200000, 7788.96, 8195.84, 7779.99, 8093.01, 5418.735378], [1523606400000, 8100.0, 8170.0, 8033.0, 8066.96, 6414.807869], [1523613600000, 8066.96, 8141.0, 8005.0, 8091.0, 4213.72805], [1523620800000, 8091.4, 8233.39, 8020.0, 8096.0, 6052.366481], [1523628000000, 8096.51, 8133.0, 8013.27, 8125.0, 4265.921734], [1523635200000, 8125.41, 8168.0, 8060.0, 8114.79, 3165.080713], [1523642400000, 8115.0, 8130.0, 8050.0, 8094.0, 2175.138955], [1523649600000, 8093.82, 8109.9, 7801.0, 7859.74, 7044.364218], [1523656800000, 7864.57, 7967.26, 7768.47, 7877.41, 5318.974462], [1523664000000, 7877.48, 8095.0, 7810.0, 8065.24, 3910.53856], [1523671200000, 8069.43, 8090.0, 8000.01, 8044.66, 2324.568971], [1523678400000, 8044.67, 8046.76, 7935.15, 7957.36, 2437.189936], [1523685600000, 7963.99, 8186.0, 7955.0, 8127.74, 3350.565671], [1523692800000, 8129.99, 8175.0, 7992.9, 8040.0, 2908.997782], [1523700000000, 8035.22, 8065.9, 7915.0, 7965.32, 2789.800979], [1523707200000, 7965.0, 7987.83, 7849.46, 7965.18, 3926.704533], [1523714400000, 7964.0, 7993.99, 7905.63, 7955.01, 2420.966935], [1523721600000, 7955.02, 8010.0, 7917.0, 7972.55, 2255.84195], [1523728800000, 7972.55, 8046.63, 7943.4, 8022.0, 1612.77756], [1523736000000, 8022.0, 8090.23, 8000.0, 8058.47, 1663.1054], [1523743200000, 8058.48, 8084.0, 7941.0, 7999.01, 2020.22808], [1523750400000, 8004.0, 8133.0, 7999.02, 8113.02, 2812.540222], [1523757600000, 8113.2, 8130.0, 8059.47, 8083.99, 1482.958543], [1523764800000, 8084.0, 8150.0, 8050.0, 8128.0, 1771.583785], [1523772000000, 8127.02, 8130.0, 8066.39, 8074.99, 1475.835477], [1523779200000, 8074.91, 8154.0, 8072.1, 8116.23, 1676.506366], [1523786400000, 8118.0, 8429.54, 8110.69, 8330.0, 5729.204796], [1523793600000, 8330.0, 8380.0, 8286.0, 8353.0, 3137.702122], [1523800800000, 8352.01, 8375.96, 8230.0, 8269.99, 3167.109541], [1523808000000, 8269.0, 8349.0, 8254.95, 8300.0, 2096.623699], [1523815200000, 8296.01, 8334.21, 8272.57, 8300.01, 1517.965316], [1523822400000, 8305.55, 8326.0, 8280.0, 8295.99, 1346.740415], [1523829600000, 8295.99, 8365.87, 8277.57, 8355.0, 1731.950162], [1523836800000, 8355.07, 8419.0, 8318.42, 8321.37, 2812.262771], [1523844000000, 8325.0, 8348.0, 8076.19, 8146.9, 5696.889434], [1523851200000, 8144.73, 8151.0, 8000.0, 8036.43, 3894.989658], [1523858400000, 8035.0, 8130.47, 8020.0, 8110.0, 2856.288948], [1523865600000, 8110.21, 8138.53, 8030.0, 8096.83, 2497.412056], [1523872800000, 8096.83, 8119.85, 8016.33, 8086.0, 2318.72735], [1523880000000, 8086.0, 8087.11, 7867.0, 7964.34, 6085.674406], [1523887200000, 7964.34, 7999.0, 7907.0, 7971.99, 2500.420132], [1523894400000, 7971.98, 8056.0, 7924.65, 8031.02, 2391.931514], [1523901600000, 8031.02, 8050.0, 7953.0, 7983.99, 2280.202579], [1523908800000, 7983.97, 8036.5, 7935.99, 8018.98, 1632.716382], [1523916000000, 8015.0, 8086.01, 7969.0, 8064.92, 1696.554485], [1523923200000, 8064.92, 8083.61, 8014.08, 8041.0, 1911.781812], [1523930400000, 8041.99, 8055.93, 7956.17, 8045.78, 2122.582103], [1523937600000, 8049.9, 8049.9, 7975.01, 7983.0, 1952.755795], [1523944800000, 7975.01, 8172.76, 7960.0, 8138.45, 3118.58685], [1523952000000, 8143.72, 8173.7, 8125.2, 8144.41, 2825.231915], [1523959200000, 8144.41, 8155.0, 8064.52, 8124.87, 2601.107453], [1523966400000, 8124.87, 8156.0, 8051.0, 8100.0, 2477.516442], [1523973600000, 8100.0, 8133.38, 8070.0, 8088.63, 2527.27293], [1523980800000, 8088.63, 8134.0, 8084.97, 8105.0, 1921.031287], [1523988000000, 8104.47, 8106.6, 7836.4, 7874.01, 5191.759986], [1523995200000, 7874.0, 7951.49, 7825.4, 7915.96, 3134.521503], [1524002400000, 7915.97, 7926.88, 7860.0, 7885.02, 2368.455491], [1524009600000, 7890.96, 7979.0, 7868.07, 7952.42, 1618.789611], [1524016800000, 7952.42, 7966.54, 7901.3, 7947.71, 1276.858769], [1524024000000, 7947.74, 7949.99, 7907.05, 7928.99, 1379.810702], [1524031200000, 7925.83, 8149.89, 7868.0, 8107.23, 4324.005343], [1524038400000, 8113.51, 8118.0, 8071.0, 8092.01, 2096.181496], [1524045600000, 8092.02, 8120.0, 8067.02, 8103.0, 1835.641953], [1524052800000, 8104.0, 8117.81, 8075.06, 8095.89, 1629.927722], [1524060000000, 8098.45, 8100.0, 7931.01, 7994.0, 3080.605041], [1524067200000, 7994.0, 8149.78, 7985.01, 8099.0, 2652.420047], [1524074400000, 8098.79, 8126.79, 8090.65, 8116.65, 1792.059004], [1524081600000, 8116.01, 8236.43, 8097.0, 8199.0, 2858.005387], [1524088800000, 8199.0, 8220.1, 8105.0, 8173.0, 2424.739495], [1524096000000, 8173.99, 8210.0, 8100.0, 8188.88, 2642.38546], [1524103200000, 8188.88, 8290.0, 8150.0, 8185.0, 2696.379097], [1524110400000, 8184.99, 8198.0, 8120.0, 8180.0, 2415.708326], [1524117600000, 8180.0, 8249.0, 8080.0, 8166.97, 2631.770672], [1524124800000, 8166.97, 8240.0, 8143.02, 8230.89, 2551.935584], [1524132000000, 8231.0, 8259.0, 8191.47, 8207.01, 2332.639302], [1524139200000, 8207.0, 8248.5, 8181.7, 8234.84, 1936.159082], [1524146400000, 8236.0, 8270.0, 8171.56, 8239.02, 2232.966964], [1524153600000, 8235.45, 8296.0, 8230.01, 8259.08, 2581.743803], [1524160800000, 8257.61, 8290.0, 8233.1, 8249.95, 1596.009672], [1524168000000, 8249.95, 8280.0, 8189.0, 8272.28, 1951.232843], [1524175200000, 8272.28, 8294.99, 8230.0, 8278.0, 1544.916659], [1524182400000, 8273.84, 8375.0, 8270.32, 8360.0, 2969.464352], [1524189600000, 8359.99, 8398.0, 8282.2, 8331.03, 2733.911506], [1524196800000, 8331.3, 8336.38, 8177.09, 8272.99, 4853.700633], [1524204000000, 8272.99, 8348.98, 8253.0, 8319.97, 2618.085512], [1524211200000, 8319.92, 8349.01, 8267.01, 8308.87, 2234.256304], [1524218400000, 8305.0, 8540.37, 8290.0, 8515.01, 5327.474773], [1524225600000, 8515.0, 8577.9, 8455.04, 8499.0, 3585.428146], [1524232800000, 8499.01, 8520.0, 8431.86, 8459.99, 2470.321414], [1524240000000, 8458.0, 8530.0, 8446.0, 8505.0, 2051.228461], [1524247200000, 8505.0, 8539.63, 8485.0, 8518.0, 1670.776956], [1524254400000, 8518.0, 8560.0, 8490.0, 8508.04, 1997.39228], [1524261600000, 8508.04, 8930.0, 8508.03, 8856.98, 7283.297148], [1524268800000, 8852.12, 8869.23, 8730.0, 8820.0, 4121.544251], [1524276000000, 8820.0, 8928.0, 8807.02, 8862.0, 2599.413124], [1524283200000, 8858.0, 8884.9, 8839.99, 8878.07, 1517.081993], [1524290400000, 8878.07, 9035.0, 8854.2, 8874.88, 3979.483862], [1524297600000, 8874.87, 8888.0, 8630.0, 8705.01, 7465.529609], [1524304800000, 8713.35, 8749.83, 8565.0, 8700.0, 6375.133489], [1524312000000, 8700.01, 8778.46, 8680.0, 8748.0, 3617.937921], [1524319200000, 8748.0, 8846.63, 8735.99, 8828.2, 3163.137961], [1524326400000, 8828.13, 8874.0, 8706.5, 8760.0, 2866.273172], [1524333600000, 8760.05, 8818.16, 8730.0, 8792.47, 1561.46326], [1524340800000, 8792.47, 8800.01, 8707.0, 8780.01, 1575.065461], [1524348000000, 8780.01, 8930.0, 8762.32, 8915.31, 2030.165806], [1524355200000, 8915.31, 8915.33, 8786.8, 8815.99, 2118.689427], [1524362400000, 8815.99, 8874.0, 8801.01, 8811.0, 1533.733913], [1524369600000, 8814.0, 8887.96, 8794.62, 8834.73, 1274.114873], [1524376800000, 8834.73, 8904.99, 8834.5, 8875.0, 1494.82423], [1524384000000, 8875.0, 8979.5, 8862.22, 8910.0, 3129.367464], [1524391200000, 8910.0, 9020.0, 8902.12, 8916.01, 2817.351205], [1524398400000, 8916.01, 8965.82, 8768.79, 8877.0, 3763.279893], [1524405600000, 8877.0, 8998.0, 8874.03, 8940.67, 2935.418614], [1524412800000, 8940.67, 9020.67, 8850.0, 8940.36, 3127.020964], [1524420000000, 8940.36, 8957.84, 8860.0, 8881.0, 2008.011302], [1524427200000, 8881.0, 8928.0, 8865.99, 8920.02, 1545.451407], [1524434400000, 8926.8, 8926.88, 8727.68, 8787.02, 3710.990188], [1524441600000, 8785.7, 8888.0, 8745.0, 8853.24, 2324.78849], [1524448800000, 8844.24, 8888.0, 8821.83, 8861.52, 1788.273187], [1524456000000, 8861.52, 8883.0, 8821.01, 8879.0, 1360.760441], [1524463200000, 8878.04, 8970.01, 8850.0, 8942.39, 3231.643937], [1524470400000, 8942.0, 8957.04, 8831.0, 8905.0, 3003.724426], [1524477600000, 8905.0, 8923.0, 8874.71, 8910.02, 1921.934795], [1524484800000, 8910.02, 8985.0, 8897.75, 8929.0, 2565.83325], [1524492000000, 8934.39, 8940.0, 8858.08, 8898.0, 2419.472147], [1524499200000, 8898.0, 8938.21, 8861.42, 8886.0, 1984.142826], [1524506400000, 8887.67, 8915.0, 8800.6, 8847.37, 2025.227239], [1524513600000, 8847.37, 8928.0, 8825.01, 8922.0, 1619.580537], [1524520800000, 8925.8, 8949.98, 8888.0, 8934.01, 1592.733434], [1524528000000, 8934.0, 9219.0, 8922.0, 9186.0, 5669.364234], [1524535200000, 9186.01, 9230.15, 9150.0, 9192.47, 3251.162491], [1524542400000, 9192.48, 9300.0, 9190.0, 9271.11, 3461.583681], [1524549600000, 9271.14, 9278.81, 9177.0, 9216.0, 2680.783563], [1524556800000, 9217.98, 9285.78, 9216.0, 9285.0, 2061.28313], [1524564000000, 9285.0, 9349.0, 9273.22, 9294.57, 3491.624974], [1524571200000, 9294.59, 9420.0, 9221.0, 9259.99, 4808.840986], [1524578400000, 9259.99, 9370.0, 9155.0, 9347.77, 4682.347022], [1524585600000, 9347.78, 9415.95, 9309.0, 9409.97, 2724.170876], [1524592800000, 9410.0, 9455.0, 9293.29, 9449.9, 3795.323849], [1524600000000, 9452.0, 9495.0, 9400.04, 9468.0, 3283.105972], [1524607200000, 9469.0, 9731.01, 9425.01, 9619.99, 6359.199328], [1524614400000, 9618.96, 9680.0, 9440.0, 9628.0, 6339.051987], [1524621600000, 9628.0, 9759.82, 9323.02, 9347.99, 7676.300787], [1524628800000, 9349.99, 9500.0, 9110.0, 9370.0, 11820.818283], [1524636000000, 9370.0, 9476.23, 9322.0, 9416.39, 4114.645814], [1524643200000, 9415.0, 9438.54, 9200.1, 9272.0, 4495.463895], [1524650400000, 9271.09, 9280.0, 8960.0, 9144.03, 10916.648465], [1524657600000, 9137.0, 9210.21, 8925.8, 9011.78, 6939.178514], [1524664800000, 9011.79, 9042.93, 8730.0, 8972.09, 11237.782645], [1524672000000, 8972.09, 9089.0, 8846.0, 9058.0, 5401.86529], [1524679200000, 9055.1, 9063.58, 8948.05, 8969.98, 3127.147502], [1524686400000, 8969.55, 9179.0, 8963.54, 9178.98, 3502.659728], [1524693600000, 9178.98, 9185.01, 8770.0, 8869.99, 5538.474679], [1524700800000, 8869.99, 8869.99, 8660.0, 8752.82, 5830.540137], [1524708000000, 8755.06, 8899.0, 8751.0, 8808.02, 3067.143958], [1524715200000, 8812.7, 8977.0, 8800.0, 8916.56, 4188.741515], [1524722400000, 8905.88, 8945.34, 8771.0, 8847.97, 3503.402046], [1524729600000, 8847.97, 8887.8, 8651.62, 8746.0, 4781.403135], [1524736800000, 8746.0, 8917.51, 8738.14, 8857.01, 3237.161918], [1524744000000, 8858.51, 8945.0, 8785.0, 8829.63, 2789.638319], [1524751200000, 8828.27, 8885.0, 8740.01, 8806.1, 2911.985048], [1524758400000, 8806.1, 8925.0, 8775.89, 8866.43, 2593.283155], [1524765600000, 8866.43, 8909.0, 8834.02, 8881.54, 1369.9092], [1524772800000, 8880.0, 9169.9, 8880.0, 9099.0, 4669.965775], [1524780000000, 9100.0, 9307.48, 9096.01, 9266.0, 4357.130039], [1524787200000, 9267.03, 9297.0, 9177.0, 9249.97, 3164.680184], [1524794400000, 9240.0, 9282.0, 9123.25, 9143.01, 3106.427786], [1524801600000, 9143.01, 9235.0, 9104.88, 9180.82, 2460.041769], [1524808800000, 9184.99, 9265.7, 9176.99, 9240.97, 2661.213753], [1524816000000, 9240.97, 9387.48, 9230.0, 9369.0, 3291.852113], [1524823200000, 9369.0, 9395.0, 9280.59, 9309.0, 2947.673019], [1524830400000, 9308.9, 9355.0, 9150.1, 9225.0, 3834.449113], [1524837600000, 9226.97, 9290.0, 9202.0, 9241.21, 2761.017845], [1524844800000, 9241.2, 9328.26, 9241.0, 9290.1, 2517.742183], [1524852000000, 9290.1, 9296.31, 9075.01, 9089.0, 3099.092582], [1524859200000, 9089.12, 9163.38, 8909.83, 8975.35, 4995.299762], [1524866400000, 8975.36, 9093.09, 8889.0, 8915.35, 2401.856927], [1524873600000, 8915.35, 9126.81, 8870.0, 9126.81, 3052.901768], [1524880800000, 9126.81, 9196.32, 9050.0, 9155.0, 2406.704727], [1524888000000, 9155.01, 9188.5, 9111.21, 9164.49, 1850.945653], [1524895200000, 9164.48, 9215.66, 9108.99, 9126.22, 2551.91059], [1524902400000, 9121.05, 9330.0, 9081.02, 9273.0, 5021.788456], [1524909600000, 9273.0, 9310.0, 9257.8, 9289.98, 427.889426]], "4h": [[1517616000000, 8873.03, 8920.0, 8233.0, 8344.81, 5058.529043], [1517630400000, 8344.88, 8788.0, 8229.0, 8708.82, 4158.330198], [1517644800000, 8708.82, 9123.0, 8579.0, 9099.87, 5096.724114], [1517659200000, 9099.87, 9459.6, 8969.0, 9173.0, 7066.94034], [1517673600000, 9173.01, 9401.0, 9055.0, 9339.43, 4005.86702], [1517688000000, 9350.0, 9473.01, 9022.0, 9199.96, 3338.61002], [1517702400000, 9199.96, 9250.0, 8901.01, 9219.18, 2810.29891], [1517716800000, 9219.19, 9368.0, 9075.01, 9200.0, 2431.080396], [1517731200000, 9200.0, 9216.0, 8687.45, 8691.99, 5322.600063], [1517745600000, 8691.99, 8894.12, 8357.93, 8419.96, 7359.318385], [1517760000000, 8419.96, 8585.0, 8180.0, 8264.2, 5737.008025], [1517774400000, 8264.19, 8474.0, 7930.0, 8184.81, 8354.00267], [1517788800000, 8179.99, 8342.05, 7910.0, 8137.23, 6227.667474], [1517803200000, 8148.83, 8382.8, 7915.01, 7965.01, 4611.51149], [1517817600000, 7965.01, 8049.99, 7510.0, 7578.0, 8595.768963], [1517832000000, 7572.32, 7788.87, 7167.0, 7384.85, 12353.960734], [1517846400000, 7375.49, 7536.41, 6625.0, 6698.33, 13593.166209], [1517860800000, 6680.76, 7543.99, 6625.0, 6939.99, 18021.107709], [1517875200000, 6939.63, 7150.0, 6155.0, 6327.05, 14648.966602], [1517889600000, 6317.8, 6655.0, 6000.01, 6043.0, 18582.335371], [1517904000000, 6040.98, 6960.0, 6019.24, 6559.0, 17286.572574], [1517918400000, 6559.0, 7462.0, 6435.99, 7290.61, 21152.740399], [1517932800000, 7299.99, 7623.83, 6781.0, 7544.93, 14178.223996], [1517947200000, 7543.18, 7878.0, 7425.67, 7652.14, 14352.661365], [1517961600000, 7655.02, 7770.0, 7155.0, 7200.0, 10107.705384], [1517976000000, 7200.0, 7734.52, 7150.01, 7669.97, 7528.66848], [1517990400000, 7669.97, 8274.0, 7580.6, 8151.53, 12798.246042], [1518004800000, 8138.05, 8476.0, 8036.0, 8169.0, 11365.768436], [1518019200000, 8165.0, 8399.0, 7867.0, 8130.81, 8745.316193], [1518033600000, 8130.81, 8259.12, 7531.11, 7599.0, 10232.755962], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518163200000, 7789.9, 8395.0, 7789.9, 8280.11, 3483.805239], [1518177600000, 8288.03, 8540.0, 8201.95, 8333.91, 6043.02653], [1518192000000, 8333.98, 8738.0, 8312.0, 8633.15, 5944.072439], [1518206400000, 8638.05, 8720.04, 8403.0, 8683.92, 5012.006617], [1518220800000, 8683.93, 8997.0, 8601.0, 8905.84, 7993.502755], [1518235200000, 8905.84, 9065.78, 8760.0, 8915.15, 5592.523995], [1518249600000, 8915.15, 8920.17, 8470.0, 8635.99, 9309.608361], [1518264000000, 8626.12, 8800.0, 8231.0, 8263.51, 9669.496264], [1518278400000, 8271.0, 8448.0, 8120.0, 8419.0, 8887.712905], [1518292800000, 8420.0, 8572.0, 8125.0, 8533.98, 7928.668373], [1518307200000, 8533.99, 8549.0, 7956.0, 7969.05, 8046.326184], [1518321600000, 7976.73, 8169.13, 7800.0, 7850.72, 7751.617967], [1518336000000, 7851.2, 8190.0, 7726.53, 8140.0, 8613.791974], [1518350400000, 8139.99, 8449.9, 8110.0, 8449.86, 8650.395645], [1518364800000, 8445.06, 8500.85, 8151.2, 8285.0, 6996.107264], [1518379200000, 8285.0, 8342.21, 8015.0, 8063.88, 4966.948918], [1518393600000, 8063.82, 8570.0, 8053.0, 8479.99, 8080.333298], [1518408000000, 8479.0, 8550.0, 8337.0, 8473.76, 4804.245419], [1518422400000, 8470.01, 8840.82, 8457.03, 8640.01, 9193.850506], [1518436800000, 8640.01, 8774.9, 8502.0, 8670.0, 6716.413677], [1518451200000, 8669.99, 8799.42, 8620.0, 8792.76, 5349.247434], [1518465600000, 8793.0, 8989.0, 8700.0, 8903.0, 7843.760156], [1518480000000, 8903.0, 8950.0, 8640.33, 8760.59, 6814.370804], [1518494400000, 8763.2, 8786.3, 8554.87, 8669.39, 5427.889741], [1518508800000, 8656.26, 8669.42, 8351.0, 8531.47, 8785.092716], [1518523200000, 8525.08, 8680.0, 8450.0, 8489.91, 5800.85879], [1518537600000, 8486.05, 8647.03, 8486.05, 8616.04, 3677.962165], [1518552000000, 8616.11, 8725.0, 8461.0, 8539.9, 4948.79874], [1518566400000, 8535.17, 8724.0, 8533.0, 8709.0, 4445.536377], [1518580800000, 8709.0, 8888.85, 8705.01, 8870.17, 5376.398996], [1518595200000, 8870.17, 8930.65, 8757.5, 8927.0, 5163.13491], [1518609600000, 8929.96, 9350.0, 8924.87, 9330.08, 13307.603908], [1518624000000, 9329.22, 9400.0, 9170.0, 9239.36, 7252.578778], [1518638400000, 9232.04, 9489.6, 9190.0, 9449.99, 5266.699898], [1518652800000, 9449.98, 9710.0, 9301.5, 9636.58, 8082.558079], [1518667200000, 9643.0, 9817.2, 9620.0, 9810.01, 6689.084789], [1518681600000, 9810.01, 9925.17, 9371.56, 9566.56, 12804.399253], [1518696000000, 9560.01, 9856.61, 9560.01, 9811.01, 6549.377968], [1518710400000, 9811.01, 10219.5, 9742.01, 10110.75, 10823.630984], [1518724800000, 10114.1, 10167.5, 9832.95, 10000.09, 7478.545642], [1518739200000, 10000.89, 10323.37, 9980.0, 10104.7, 6414.819334], [1518753600000, 10108.0, 10141.5, 9679.16, 9688.5, 8406.254833], [1518768000000, 9688.5, 9973.86, 9666.0, 9799.43, 6739.054921], [1518782400000, 9796.01, 10132.0, 9740.0, 10039.98, 6504.214311], [1518796800000, 10035.05, 10150.0, 9865.0, 10030.66, 5669.167777], [1518811200000, 10030.65, 10213.3, 9927.93, 10159.98, 4427.694798], [1518825600000, 10156.07, 10489.66, 10050.0, 10459.04, 7305.962891], [1518840000000, 10459.04, 10760.0, 10418.01, 10727.91, 7959.297717], [1518854400000, 10727.87, 10877.91, 10580.0, 10683.0, 8235.004713], [1518868800000, 10683.0, 10869.0, 10499.86, 10731.48, 7095.960571], [1518883200000, 10731.48, 10835.0, 10674.0, 10722.99, 5013.956269], [1518897600000, 10720.0, 11075.07, 10675.1, 11039.55, 6271.926246], [1518912000000, 11039.55, 11274.0, 10751.5, 10800.0, 9106.720792], [1518926400000, 10808.99, 10940.0, 10323.0, 10589.76, 14082.968291], [1518940800000, 10593.62, 10599.93, 10080.0, 10550.0, 13349.983889], [1518955200000, 10550.0, 10850.0, 10350.0, 10633.73, 9858.360006], [1518969600000, 10620.01, 10874.99, 10411.71, 10831.26, 8047.716738], [1518984000000, 10835.62, 10837.1, 10331.0, 10383.43, 6691.631012], [1518998400000, 10375.01, 10639.0, 10270.33, 10499.0, 6375.826465], [1519012800000, 10498.86, 10843.0, 10334.0, 10815.62, 5879.536835], [1519027200000, 10815.61, 11031.31, 10672.01, 10918.84, 8631.624528], [1519041600000, 10918.84, 11219.0, 10855.0, 11171.71, 6801.519111], [1519056000000, 11171.71, 11250.0, 10881.0, 11126.06, 7744.962027], [1519070400000, 11126.17, 11212.0, 11005.0, 11153.0, 5397.948165], [1519084800000, 11147.11, 11516.51, 11141.0, 11424.1, 9097.96099], [1519099200000, 11424.1, 11650.0, 11379.99, 11535.0, 6119.690326], [1519113600000, 11530.92, 11585.0, 11156.0, 11400.0, 8485.455971], [1519128000000, 11408.88, 11595.0, 11378.0, 11516.99, 5071.930077], [1519142400000, 11517.0, 11748.01, 11494.29, 11668.0, 7241.339632], [1519156800000, 11668.0, 11786.01, 11100.59, 11200.99, 12136.977292], [1519171200000, 11195.07, 11304.03, 10811.7, 10915.34, 15536.14564], [1519185600000, 10919.0, 11140.0, 10620.0, 11125.0, 10734.182206], [1519200000000, 11128.0, 11185.19, 10850.0, 10948.0, 6891.12062], [1519214400000, 10948.02, 11109.0, 10407.09, 10540.31, 13297.646938], [1519228800000, 10542.64, 10675.51, 10312.12, 10385.5, 11935.417604], [1519243200000, 10385.5, 10562.0, 10200.0, 10437.6, 9719.305746], [1519257600000, 10439.02, 10799.0, 10296.0, 10711.84, 8119.957129], [1519272000000, 10711.84, 10933.44, 10520.0, 10600.0, 7929.57954], [1519286400000, 10606.99, 10670.0, 10076.0, 10259.87, 12298.252064], [1519300800000, 10260.0, 10318.0, 9711.0, 9980.98, 20953.441335], [1519315200000, 9972.12, 10048.33, 9679.0, 10027.7, 10725.330819], [1519329600000, 10027.71, 10127.0, 9789.0, 9811.04, 7033.605596], [1519344000000, 9815.55, 9825.91, 9570.19, 9807.89, 10060.305708], [1519358400000, 9802.14, 9989.0, 9656.0, 9865.66, 9112.577181], [1519372800000, 9865.67, 10230.0, 9857.34, 10180.06, 10914.106446], [1519387200000, 10180.06, 10435.0, 10088.1, 10292.0, 10982.849267], [1519401600000, 10292.0, 10300.92, 10004.09, 10033.0, 9089.17118], [1519416000000, 10037.9, 10230.0, 9857.75, 10131.04, 7043.692588], [1519430400000, 10131.04, 10468.0, 10081.41, 10400.0, 6591.551708], [1519444800000, 10395.74, 10496.97, 9938.98, 10119.16, 8360.107089], [1519459200000, 10119.13, 10155.0, 9669.94, 9757.0, 8044.812092], [1519473600000, 9757.0, 9839.0, 9556.0, 9752.07, 7026.974278], [1519488000000, 9751.62, 9821.96, 9515.0, 9570.0, 4626.454142], [1519502400000, 9570.0, 9737.0, 9352.0, 9694.51, 6238.25699], [1519516800000, 9694.51, 9779.0, 9487.0, 9559.01, 4066.783949], [1519531200000, 9558.78, 9847.0, 9534.5, 9727.3, 4408.057991], [1519545600000, 9722.64, 9787.6, 9534.82, 9665.99, 4486.209142], [1519560000000, 9663.98, 9700.0, 9300.0, 9390.0, 6595.834012], [1519574400000, 9390.0, 9512.0, 9274.8, 9473.09, 4783.952065], [1519588800000, 9470.75, 9670.0, 9432.34, 9590.0, 4032.680427], [1519603200000, 9590.0, 9754.98, 9510.06, 9590.0, 3768.864611], [1519617600000, 9584.72, 9676.0, 9379.01, 9454.49, 3687.885506], [1519632000000, 9454.49, 9745.83, 9350.0, 9715.99, 5066.728387], [1519646400000, 9708.0, 10344.0, 9640.01, 10260.92, 12005.286862], [1519660800000, 10261.0, 10400.0, 10121.0, 10238.62, 5706.657581], [1519675200000, 10235.94, 10444.32, 10160.0, 10324.0, 4642.869809], [1519689600000, 10321.0, 10419.7, 10121.0, 10270.0, 4556.642466], [1519704000000, 10270.0, 10650.0, 10217.0, 10600.0, 5191.21605], [1519718400000, 10600.0, 10780.0, 10556.91, 10695.0, 6876.349645], [1519732800000, 10698.97, 10870.0, 10463.18, 10568.01, 7593.743082], [1519747200000, 10570.0, 10769.0, 10559.32, 10697.0, 3408.705254], [1519761600000, 10697.0, 10792.4, 10560.01, 10569.04, 3078.728626], [1519776000000, 10584.33, 10977.95, 10551.0, 10919.9, 4494.997217], [1519790400000, 10915.03, 11098.0, 10669.0, 10748.86, 7095.42371], [1519804800000, 10741.01, 10828.0, 10476.28, 10570.95, 6099.791437], [1519819200000, 10574.13, 10619.35, 10375.54, 10506.85, 4978.684008], [1519833600000, 10505.0, 10570.89, 10400.0, 10560.02, 3348.343326], [1519848000000, 10563.79, 10722.0, 10300.0, 10326.76, 4783.744084], [1519862400000, 10325.64, 10464.99, 10240.0, 10356.03, 3901.729532], [1519876800000, 10356.01, 10592.85, 10335.96, 10549.33, 3245.157625], [1519891200000, 10549.96, 10745.0, 10549.96, 10671.93, 3990.376894], [1519905600000, 10671.93, 10831.0, 10591.16, 10717.0, 4580.854208], [1519920000000, 10717.0, 10945.0, 10700.01, 10880.0, 3897.41721], [1519934400000, 10880.0, 11060.41, 10789.26, 10920.0, 5477.018461], [1519948800000, 10923.36, 11200.0, 10920.0, 11117.97, 5895.815624], [1519963200000, 11117.97, 11159.01, 10901.01, 11080.42, 4372.756546], [1519977600000, 11080.42, 11139.1, 10826.52, 10898.95, 4214.44968], [1519992000000, 10898.95, 11050.0, 10770.0, 10855.34, 3711.743908], [1520006400000, 10855.0, 10950.0, 10780.0, 10937.0, 2406.192253], [1520020800000, 10937.0, 11130.0, 10890.81, 11039.0, 3309.752079], [1520035200000, 11038.99, 11396.7, 11015.01, 11324.0, 4821.320872], [1520049600000, 11320.0, 11415.16, 11301.1, 11317.0, 3312.115747], [1520064000000, 11317.0, 11382.32, 11245.5, 11287.21, 3328.415959], [1520078400000, 11287.21, 11530.0, 11287.0, 11483.77, 3819.506904], [1520092800000, 11477.02, 11544.0, 11452.0, 11505.21, 2376.83206], [1520107200000, 11510.0, 11526.0, 11268.0, 11464.48, 3628.961738], [1520121600000, 11464.47, 11470.0, 11129.49, 11163.0, 3539.376016], [1520136000000, 11163.0, 11259.71, 11050.02, 11140.3, 3163.335629], [1520150400000, 11142.01, 11273.7, 11080.97, 11159.68, 2222.940026], [1520164800000, 11159.68, 11259.0, 11090.01, 11150.01, 2035.650843], [1520179200000, 11150.0, 11429.99, 11125.92, 11378.89, 3231.81579], [1520193600000, 11378.19, 11565.0, 11361.69, 11515.0, 3102.800349], [1520208000000, 11515.0, 11589.0, 11415.01, 11568.03, 2248.094776], [1520222400000, 11558.47, 11608.0, 11458.43, 11539.87, 2502.641392], [1520236800000, 11539.87, 11556.57, 11435.0, 11515.0, 2184.873611], [1520251200000, 11515.0, 11585.53, 11441.78, 11515.61, 2341.969551], [1520265600000, 11515.62, 11680.0, 11489.97, 11669.08, 2533.355187], [1520280000000, 11666.0, 11710.0, 11454.0, 11454.0, 3333.296546], [1520294400000, 11455.0, 11455.0, 11181.5, 11280.01, 5168.748613], [1520308800000, 11280.01, 11360.0, 11229.8, 11270.0, 2469.657427], [1520323200000, 11275.11, 11333.0, 10840.01, 10937.0, 6299.689292], [1520337600000, 10936.0, 11046.24, 10777.78, 10966.0, 5250.521463], [1520352000000, 10974.08, 11013.5, 10555.48, 10707.0, 6073.660496], [1520366400000, 10707.0, 10839.0, 10566.0, 10716.48, 4253.295072], [1520380800000, 10716.48, 10899.0, 10660.0, 10724.99, 3790.751942], [1520395200000, 10724.98, 10830.01, 10400.0, 10510.0, 5354.090536], [1520409600000, 10509.99, 10635.03, 10411.11, 10635.03, 4080.911191], [1520424000000, 10635.6, 10747.88, 10502.76, 10679.56, 5597.000716], [1520438400000, 10679.56, 10716.66, 9389.31, 9844.18, 24387.590634], [1520452800000, 9837.84, 10138.04, 9707.07, 9910.0, 7437.326061], [1520467200000, 9910.0, 10037.99, 9470.0, 9500.0, 7536.442501], [1520481600000, 9508.0, 9991.0, 9489.39, 9936.98, 5008.093269], [1520496000000, 9936.98, 10099.0, 9820.0, 9910.09, 4586.879647], [1520510400000, 9902.98, 9968.75, 9624.0, 9909.29, 5340.811382], [1520524800000, 9909.3, 9914.96, 9060.0, 9357.86, 13329.056391], [1520539200000, 9349.04, 9471.0, 9182.41, 9271.64, 5308.190036], [1520553600000, 9267.07, 9410.0, 8835.37, 8953.01, 9488.929812], [1520568000000, 8953.01, 8960.0, 8329.0, 8686.43, 17058.985447], [1520582400000, 8685.0, 8948.0, 8388.0, 8923.0, 9812.884542], [1520596800000, 8933.91, 9165.18, 8822.99, 8927.0, 9669.80194], [1520611200000, 8925.93, 9049.01, 8630.0, 8770.0, 8803.719739], [1520625600000, 8770.01, 9333.33, 8704.31, 9227.0, 9277.969927], [1520640000000, 9230.0, 9400.79, 9073.66, 9210.0, 7883.405519], [1520654400000, 9210.0, 9490.0, 9174.44, 9327.43, 5768.10053], [1520668800000, 9327.43, 9403.09, 9150.1, 9345.0, 4155.68305], [1520683200000, 9345.0, 9468.88, 9180.7, 9346.14, 5062.819928], [1520697600000, 9340.0, 9418.17, 8947.27, 9089.93, 7045.550302], [1520712000000, 9089.93, 9092.3, 8667.07, 8770.22, 7264.453528], [1520726400000, 8770.22, 8774.76, 8450.0, 8617.0, 8255.546821], [1520740800000, 8617.0, 8844.07, 8568.1, 8704.0, 4267.178518], [1520755200000, 8700.0, 9100.66, 8532.38, 9027.68, 5112.719233], [1520769600000, 9025.03, 9335.0, 9015.11, 9036.04, 9700.010888], [1520784000000, 9049.96, 9711.0, 9037.01, 9639.57, 9947.231726], [1520798400000, 9637.0, 9740.0, 9431.26, 9533.57, 7043.2862], [1520812800000, 9533.57, 9713.0, 9356.02, 9416.09, 5472.440203], [1520827200000, 9416.09, 9688.0, 9370.05, 9599.92, 4184.352807], [1520841600000, 9599.92, 9888.88, 9512.0, 9837.03, 5701.1611], [1520856000000, 9837.04, 9838.0, 9110.0, 9170.01, 10701.285763], [1520870400000, 9174.22, 9309.57, 8850.0, 8927.0, 9329.071839], [1520884800000, 8934.99, 9234.07, 8780.0, 9131.34, 6842.466218], [1520899200000, 9131.34, 9264.1, 8933.0, 9037.71, 4849.518794], [1520913600000, 9037.72, 9474.0, 9012.9, 9205.17, 7727.497386], [1520928000000, 9205.17, 9349.0, 8870.0, 9044.9, 7829.727089], [1520942400000, 9049.47, 9250.0, 8823.0, 9051.0, 8753.866172], [1520956800000, 9060.93, 9275.0, 8941.45, 9069.3, 6899.609979], [1520971200000, 9072.57, 9249.99, 9000.0, 9150.0, 4131.189938], [1520985600000, 9151.92, 9333.78, 9137.0, 9249.93, 4204.115104], [1521000000000, 9249.94, 9251.0, 9050.0, 9079.92, 3851.038065], [1521014400000, 9067.09, 9129.99, 8631.78, 8675.08, 8888.803578], [1521028800000, 8675.08, 8791.49, 8570.0, 8725.83, 7265.584851], [1521043200000, 8718.0, 8726.82, 8201.0, 8285.97, 12877.938984], [1521057600000, 8285.97, 8340.64, 7900.28, 8170.0, 12620.613526], [1521072000000, 8184.01, 8250.0, 7717.0, 7870.15, 9398.447341], [1521086400000, 7870.15, 7950.36, 7650.0, 7888.94, 8941.144628], [1521100800000, 7887.19, 8299.0, 7790.73, 8235.0, 9841.891737], [1521115200000, 8235.0, 8430.0, 7925.15, 8099.0, 11181.237313], [1521129600000, 8098.76, 8310.0, 7943.9, 8203.03, 7549.23784], [1521144000000, 8210.0, 8363.21, 8129.79, 8240.98, 5379.063418], [1521158400000, 8240.98, 8324.96, 7900.0, 8040.74, 7647.392915], [1521172800000, 8040.74, 8287.0, 8026.0, 8233.0, 5280.866649], [1521187200000, 8233.0, 8280.0, 8060.0, 8192.94, 5219.538547], [1521201600000, 8182.07, 8598.77, 8139.02, 8539.0, 10498.155063], [1521216000000, 8539.0, 8611.64, 8431.01, 8536.17, 5537.336921], [1521230400000, 8536.17, 8566.08, 8257.2, 8260.0, 4632.119798], [1521244800000, 8260.0, 8322.49, 8078.0, 8199.92, 5709.067537], [1521259200000, 8199.91, 8233.0, 8082.5, 8186.02, 3507.904094], [1521273600000, 8197.7, 8348.62, 8145.62, 8158.0, 3754.301456], [1521288000000, 8158.01, 8177.93, 7852.2, 7887.11, 8102.115441], [1521302400000, 7887.99, 7968.0, 7721.99, 7820.0, 5850.49554], [1521316800000, 7820.0, 8050.0, 7745.18, 7824.8, 6186.322261], [1521331200000, 7824.01, 7857.24, 7539.99, 7666.35, 8470.532213], [1521345600000, 7666.33, 7771.0, 7519.84, 7659.99, 5540.629703], [1521360000000, 7659.0, 7810.97, 7532.09, 7760.09, 6547.557541], [1521374400000, 7761.19, 7829.0, 7322.0, 7385.0, 11808.681598], [1521388800000, 7385.0, 7584.0, 7330.0, 7463.53, 8959.14227], [1521403200000, 7473.86, 8317.4, 7453.59, 8189.99, 18161.688386], [1521417600000, 8189.0, 8456.0, 8088.4, 8169.25, 10823.59039], [1521432000000, 8157.01, 8367.97, 8140.54, 8289.01, 5991.251674], [1521446400000, 8292.92, 8400.81, 8089.0, 8330.0, 8139.868307], [1521460800000, 8330.0, 8705.23, 8205.01, 8550.0, 13290.612059], [1521475200000, 8550.0, 8630.0, 8230.7, 8395.81, 10646.049622], [1521489600000, 8395.0, 8630.07, 8360.26, 8600.0, 6405.71289], [1521504000000, 8595.01, 8667.0, 8410.0, 8599.97, 6948.18634], [1521518400000, 8600.0, 8600.0, 8340.0, 8385.12, 5511.862872], [1521532800000, 8385.12, 8555.0, 8280.0, 8516.0, 7178.231295], [1521547200000, 8517.44, 8600.0, 8429.0, 8513.97, 5499.462971], [1521561600000, 8513.97, 8968.95, 8513.88, 8950.0, 11531.493556], [1521576000000, 8950.0, 9050.0, 8810.96, 8909.98, 8195.868801], [1521590400000, 8909.96, 9078.0, 8860.01, 9042.23, 4794.434588], [1521604800000, 9042.23, 9145.3, 8900.0, 8931.01, 6513.587683], [1521619200000, 8931.0, 9125.0, 8880.0, 9063.0, 5159.890997], [1521633600000, 9063.0, 9177.01, 8956.0, 9039.99, 6219.6322], [1521648000000, 9039.99, 9069.99, 8750.6, 8862.92, 12399.097022], [1521662400000, 8862.78, 8950.0, 8777.0, 8885.0, 4885.762881], [1521676800000, 8884.82, 9100.0, 8860.0, 9017.01, 4895.746559], [1521691200000, 9019.0, 9052.9, 8889.0, 8955.09, 4039.909831], [1521705600000, 8955.0, 9020.0, 8620.0, 8642.01, 9948.359931], [1521720000000, 8645.0, 8753.54, 8465.1, 8611.51, 10838.980344], [1521734400000, 8611.51, 8695.28, 8534.0, 8610.99, 6405.5107], [1521748800000, 8610.0, 8770.0, 8510.2, 8722.9, 4489.049444], [1521763200000, 8720.0, 8729.5, 8330.0, 8410.05, 7687.349493], [1521777600000, 8400.65, 8505.0, 8345.0, 8398.65, 5832.449112], [1521792000000, 8398.58, 8554.0, 8378.03, 8510.0, 5424.025879], [1521806400000, 8509.99, 8687.98, 8269.0, 8613.0, 9105.730019], [1521820800000, 8618.0, 8749.5, 8559.25, 8623.99, 6608.134124], [1521835200000, 8623.99, 8909.0, 8559.25, 8898.03, 5333.319039], [1521849600000, 8898.04, 8969.0, 8805.01, 8880.02, 5767.246862], [1521864000000, 8885.95, 8987.97, 8834.29, 8930.0, 5220.096493], [1521878400000, 8931.7, 8931.89, 8683.0, 8723.0, 5530.616757], [1521892800000, 8723.0, 8999.95, 8666.3, 8950.0, 6109.898025], [1521907200000, 8950.0, 8954.63, 8822.91, 8892.56, 4409.572139], [1521921600000, 8884.08, 8968.0, 8491.0, 8546.86, 8429.179296], [1521936000000, 8531.25, 8599.0, 8433.93, 8555.58, 5868.930479], [1521950400000, 8550.0, 8592.59, 8379.23, 8466.53, 3770.175611], [1521964800000, 8468.85, 8575.0, 8365.77, 8407.0, 4557.508247], [1521979200000, 8408.0, 8643.0, 8380.41, 8480.0, 5602.678334], [1521993600000, 8480.0, 8669.85, 8470.99, 8612.09, 4708.767301], [1522008000000, 8620.97, 8645.53, 8388.0, 8470.15, 4493.709344], [1522022400000, 8470.14, 8514.89, 8353.18, 8440.92, 3711.303435], [1522036800000, 8440.92, 8491.25, 8364.57, 8405.88, 3229.887556], [1522051200000, 8400.5, 8426.99, 8050.0, 8089.0, 10515.504264], [1522065600000, 8089.0, 8165.0, 8000.01, 8057.16, 8263.730707], [1522080000000, 8057.16, 8099.04, 7850.01, 7910.03, 9370.047235], [1522094400000, 7910.04, 8268.5, 7831.0, 8134.23, 8943.122463], [1522108800000, 8134.22, 8215.94, 7820.0, 7866.42, 7158.88371], [1522123200000, 7866.42, 8050.05, 7730.0, 7917.09, 7293.510217], [1522137600000, 7917.09, 8040.0, 7820.0, 7934.22, 5213.617976], [1522152000000, 7932.2, 8150.17, 7878.58, 8066.87, 6454.949872], [1522166400000, 8066.5, 8126.03, 7820.0, 7886.0, 6178.641673], [1522180800000, 7886.0, 8050.0, 7755.58, 7795.51, 5128.044602], [1522195200000, 7795.51, 7885.0, 7728.0, 7874.98, 4358.75463], [1522209600000, 7870.05, 7965.6, 7811.02, 7873.99, 3776.079508], [1522224000000, 7865.0, 8109.0, 7852.0, 8040.0, 5487.99329], [1522238400000, 8040.0, 8055.99, 7825.0, 7860.01, 6066.091633], [1522252800000, 7860.21, 7952.44, 7843.5, 7899.94, 3359.364958], [1522267200000, 7890.63, 8009.0, 7836.0, 7949.3, 3353.047651], [1522281600000, 7949.3, 7975.0, 7855.0, 7880.94, 3197.762612], [1522296000000, 7870.12, 7880.95, 7500.0, 7541.98, 11418.663322], [1522310400000, 7541.98, 7587.0, 7425.4, 7466.97, 6826.531776], [1522324800000, 7466.89, 7566.0, 7334.0, 7474.01, 7764.599722], [1522339200000, 7481.94, 7580.0, 7338.0, 7341.0, 6613.011441], [1522353600000, 7341.0, 7388.33, 6941.11, 7090.14, 18800.346252], [1522368000000, 7090.16, 7165.08, 6740.0, 6861.01, 15024.917622], [1522382400000, 6867.19, 7272.78, 6666.66, 7222.25, 14399.661203], [1522396800000, 7222.29, 7292.43, 6880.0, 7027.72, 8153.319317], [1522411200000, 7027.73, 7040.01, 6679.01, 6839.98, 9738.217748], [1522425600000, 6839.97, 6911.69, 6600.1, 6800.63, 11291.739424], [1522440000000, 6816.58, 6951.0, 6735.0, 6840.23, 6698.176662], [1522454400000, 6840.24, 7120.0, 6837.71, 6959.02, 7290.175528], [1522468800000, 6954.06, 7050.0, 6777.0, 6805.76, 5742.157084], [1522483200000, 6810.0, 7148.2, 6805.77, 7073.63, 7231.156196], [1522497600000, 7079.72, 7223.36, 6978.98, 7064.98, 6698.106344], [1522512000000, 7063.83, 7172.0, 6985.0, 7048.23, 4818.351356], [1522526400000, 7054.99, 7059.01, 6842.97, 6923.91, 5088.592579], [1522540800000, 6922.0, 7049.98, 6892.0, 6922.12, 3229.309898], [1522555200000, 6926.0, 6969.0, 6670.0, 6713.81, 5586.243399], [1522569600000, 6713.81, 6775.0, 6623.97, 6685.1, 5763.285536], [1522584000000, 6688.53, 6735.0, 6430.0, 6445.0, 9420.821522], [1522598400000, 6445.0, 6961.83, 6432.65, 6900.99, 14864.233984], [1522612800000, 6900.98, 6955.0, 6753.0, 6813.01, 5207.536124], [1522627200000, 6813.01, 7020.0, 6765.0, 6980.72, 5723.203979], [1522641600000, 6982.44, 7102.02, 6833.0, 7060.22, 5541.155869], [1522656000000, 7065.01, 7125.0, 7007.72, 7046.01, 5499.032431], [1522670400000, 7046.0, 7061.4, 6873.32, 7020.72, 6365.096457], [1522684800000, 7020.72, 7048.89, 6941.0, 6989.8, 4484.638326], [1522699200000, 6989.8, 7070.0, 6890.0, 7056.0, 4510.43301], [1522713600000, 7063.97, 7188.99, 7011.01, 7180.01, 5189.873845], [1522728000000, 7183.01, 7447.99, 7180.01, 7395.0, 8721.105857], [1522742400000, 7396.94, 7422.63, 7252.0, 7307.48, 6336.407365], [1522756800000, 7302.03, 7432.4, 7277.0, 7370.01, 5993.20276], [1522771200000, 7370.01, 7520.0, 7353.0, 7467.11, 6590.650154], [1522785600000, 7467.12, 7499.0, 7345.0, 7405.21, 4956.09183], [1522800000000, 7405.21, 7427.52, 7223.0, 7295.71, 6660.71076], [1522814400000, 7295.72, 7382.31, 7261.41, 7304.31, 4074.91667], [1522828800000, 7304.26, 7338.0, 7001.0, 7058.0, 9403.694618], [1522843200000, 7055.0, 7123.98, 6766.0, 6785.0, 9731.867818], [1522857600000, 6785.0, 6918.0, 6721.0, 6854.41, 7450.397153], [1522872000000, 6857.86, 6900.0, 6707.0, 6796.1, 4905.596785], [1522886400000, 6796.1, 6825.0, 6566.69, 6776.99, 7639.141115], [1522900800000, 6776.99, 6870.0, 6709.0, 6792.52, 7280.081403], [1522915200000, 6792.49, 6902.0, 6750.0, 6779.0, 5739.609481], [1522929600000, 6778.99, 6899.0, 6612.11, 6749.53, 8966.534852], [1522944000000, 6747.99, 6800.0, 6660.0, 6760.96, 5184.304428], [1522958400000, 6760.96, 6840.0, 6671.0, 6770.76, 4220.060181], [1522972800000, 6770.0, 6850.0, 6718.0, 6760.0, 4119.84768], [1522987200000, 6755.24, 6848.0, 6529.68, 6622.05, 7606.178735], [1523001600000, 6621.04, 6657.86, 6500.0, 6600.0, 5573.380095], [1523016000000, 6600.0, 6634.88, 6540.0, 6580.01, 3969.825532], [1523030400000, 6583.0, 6627.0, 6565.83, 6618.39, 3265.189929], [1523044800000, 6618.37, 6622.72, 6516.67, 6601.39, 2920.589949], [1523059200000, 6601.39, 6880.0, 6586.28, 6864.32, 7085.555763], [1523073600000, 6866.52, 6888.0, 6818.0, 6864.08, 4551.575109], [1523088000000, 6864.08, 6929.86, 6821.0, 6862.04, 4586.755119], [1523102400000, 6862.04, 7033.99, 6760.0, 7010.0, 6478.288394], [1523116800000, 7003.98, 7070.0, 6952.05, 6988.99, 5820.455514], [1523131200000, 6988.99, 7019.56, 6850.01, 6895.8, 3746.948368], [1523145600000, 6895.81, 6987.15, 6880.0, 6964.98, 2743.594948], [1523160000000, 6960.11, 7050.0, 6891.79, 6939.0, 3098.422691], [1523174400000, 6939.0, 7100.0, 6924.3, 7099.85, 4807.767119], [1523188800000, 7100.0, 7109.13, 7019.09, 7049.93, 4124.306468], [1523203200000, 7047.01, 7049.93, 6937.03, 6994.42, 4096.421355], [1523217600000, 6989.97, 7053.09, 6942.84, 7018.0, 2557.160584], [1523232000000, 7011.04, 7165.21, 7011.02, 7131.85, 5554.406668], [1523246400000, 7131.78, 7160.0, 7084.0, 7125.0, 3480.926867], [1523260800000, 7129.79, 7185.0, 6691.18, 6745.0, 10472.414195], [1523275200000, 6740.0, 6792.0, 6676.5, 6738.98, 6897.798888], [1523289600000, 6738.98, 6767.99, 6650.01, 6672.08, 3585.052946], [1523304000000, 6677.04, 6795.0, 6611.0, 6782.72, 4087.697642], [1523318400000, 6781.55, 6809.55, 6706.02, 6805.63, 3012.564353], [1523332800000, 6808.68, 6820.0, 6670.25, 6715.51, 4122.801898], [1523347200000, 6717.32, 6788.62, 6656.0, 6735.0, 3672.968597], [1523361600000, 6735.0, 6870.99, 6719.91, 6837.54, 4525.573807], [1523376000000, 6835.65, 6874.0, 6809.6, 6844.93, 3554.337124], [1523390400000, 6844.93, 6890.0, 6768.01, 6843.9, 3438.482316], [1523404800000, 6839.56, 6872.71, 6800.0, 6818.79, 3379.431426], [1523419200000, 6818.79, 6867.4, 6787.0, 6846.89, 3131.710363], [1523433600000, 6846.89, 6869.34, 6800.0, 6851.97, 3744.032054], [1523448000000, 6851.53, 6990.0, 6840.0, 6927.06, 5487.956924], [1523462400000, 6927.06, 6936.0, 6862.6, 6910.63, 4428.538273], [1523476800000, 6914.97, 6987.41, 6878.14, 6953.79, 3826.202137], [1523491200000, 6953.78, 6980.0, 6885.0, 6965.2, 4364.29207], [1523505600000, 6965.21, 6985.0, 6743.2, 6826.61, 7045.780971], [1523520000000, 6826.62, 8012.23, 6802.7, 7690.0, 20236.744596], [1523534400000, 7685.55, 7780.0, 7569.83, 7614.21, 16124.313056], [1523548800000, 7618.0, 7775.0, 7542.0, 7700.0, 8247.474601], [1523563200000, 7699.97, 7986.1, 7694.05, 7923.0, 8842.990693], [1523577600000, 7922.99, 7994.96, 7732.0, 7832.99, 7908.426777], [1523592000000, 7832.99, 8195.84, 7751.0, 8093.01, 8485.713889], [1523606400000, 8100.0, 8170.0, 8005.0, 8091.0, 10628.535919], [1523620800000, 8091.4, 8233.39, 8013.27, 8125.0, 10318.288215], [1523635200000, 8125.41, 8168.0, 8050.0, 8094.0, 5340.219668], [1523649600000, 8093.82, 8109.9, 7768.47, 7877.41, 12363.33868], [1523664000000, 7877.48, 8095.0, 7810.0, 8044.66, 6235.107531], [1523678400000, 8044.67, 8186.0, 7935.15, 8127.74, 5787.755607], [1523692800000, 8129.99, 8175.0, 7915.0, 7965.32, 5698.798761], [1523707200000, 7965.0, 7993.99, 7849.46, 7955.01, 6347.671468], [1523721600000, 7955.02, 8046.63, 7917.0, 8022.0, 3868.61951], [1523736000000, 8022.0, 8090.23, 7941.0, 7999.01, 3683.33348], [1523750400000, 8004.0, 8133.0, 7999.02, 8083.99, 4295.498765], [1523764800000, 8084.0, 8150.0, 8050.0, 8074.99, 3247.419262], [1523779200000, 8074.91, 8429.54, 8072.1, 8330.0, 7405.711162], [1523793600000, 8330.0, 8380.0, 8230.0, 8269.99, 6304.811663], [1523808000000, 8269.0, 8349.0, 8254.95, 8300.01, 3614.589015], [1523822400000, 8305.55, 8365.87, 8277.57, 8355.0, 3078.690577], [1523836800000, 8355.07, 8419.0, 8076.19, 8146.9, 8509.152205], [1523851200000, 8144.73, 8151.0, 8000.0, 8110.0, 6751.278606], [1523865600000, 8110.21, 8138.53, 8016.33, 8086.0, 4816.139406], [1523880000000, 8086.0, 8087.11, 7867.0, 7971.99, 8586.094538], [1523894400000, 7971.98, 8056.0, 7924.65, 7983.99, 4672.134093], [1523908800000, 7983.97, 8086.01, 7935.99, 8064.92, 3329.270867], [1523923200000, 8064.92, 8083.61, 7956.17, 8045.78, 4034.363915], [1523937600000, 8049.9, 8172.76, 7960.0, 8138.45, 5071.342645], [1523952000000, 8143.72, 8173.7, 8064.52, 8124.87, 5426.339368], [1523966400000, 8124.87, 8156.0, 8051.0, 8088.63, 5004.789372], [1523980800000, 8088.63, 8134.0, 7836.4, 7874.01, 7112.791273], [1523995200000, 7874.0, 7951.49, 7825.4, 7885.02, 5502.976994], [1524009600000, 7890.96, 7979.0, 7868.07, 7947.71, 2895.64838], [1524024000000, 7947.74, 8149.89, 7868.0, 8107.23, 5703.816045], [1524038400000, 8113.51, 8120.0, 8067.02, 8103.0, 3931.823449], [1524052800000, 8104.0, 8117.81, 7931.01, 7994.0, 4710.532763], [1524067200000, 7994.0, 8149.78, 7985.01, 8116.65, 4444.479051], [1524081600000, 8116.01, 8236.43, 8097.0, 8173.0, 5282.744882], [1524096000000, 8173.99, 8290.0, 8100.0, 8185.0, 5338.764557], [1524110400000, 8184.99, 8249.0, 8080.0, 8166.97, 5047.478998], [1524124800000, 8166.97, 8259.0, 8143.02, 8207.01, 4884.574886], [1524139200000, 8207.0, 8270.0, 8171.56, 8239.02, 4169.126046], [1524153600000, 8235.45, 8296.0, 8230.01, 8249.95, 4177.753475], [1524168000000, 8249.95, 8294.99, 8189.0, 8278.0, 3496.149502], [1524182400000, 8273.84, 8398.0, 8270.32, 8331.03, 5703.375858], [1524196800000, 8331.3, 8348.98, 8177.09, 8319.97, 7471.786145], [1524211200000, 8319.92, 8540.37, 8267.01, 8515.01, 7561.731077], [1524225600000, 8515.0, 8577.9, 8431.86, 8459.99, 6055.74956], [1524240000000, 8458.0, 8539.63, 8446.0, 8518.0, 3722.005417], [1524254400000, 8518.0, 8930.0, 8490.0, 8856.98, 9280.689428], [1524268800000, 8852.12, 8928.0, 8730.0, 8862.0, 6720.957375], [1524283200000, 8858.0, 9035.0, 8839.99, 8874.88, 5496.565855], [1524297600000, 8874.87, 8888.0, 8565.0, 8700.0, 13840.663098], [1524312000000, 8700.01, 8846.63, 8680.0, 8828.2, 6781.075882], [1524326400000, 8828.13, 8874.0, 8706.5, 8792.47, 4427.736432], [1524340800000, 8792.47, 8930.0, 8707.0, 8915.31, 3605.231267], [1524355200000, 8915.31, 8915.33, 8786.8, 8811.0, 3652.42334], [1524369600000, 8814.0, 8904.99, 8794.62, 8875.0, 2768.939103], [1524384000000, 8875.0, 9020.0, 8862.22, 8916.01, 5946.718669], [1524398400000, 8916.01, 8998.0, 8768.79, 8940.67, 6698.698507], [1524412800000, 8940.67, 9020.67, 8850.0, 8881.0, 5135.032266], [1524427200000, 8881.0, 8928.0, 8727.68, 8787.02, 5256.441595], [1524441600000, 8785.7, 8888.0, 8745.0, 8861.52, 4113.061677], [1524456000000, 8861.52, 8970.01, 8821.01, 8942.39, 4592.404378], [1524470400000, 8942.0, 8957.04, 8831.0, 8910.02, 4925.659221], [1524484800000, 8910.02, 8985.0, 8858.08, 8898.0, 4985.305397], [1524499200000, 8898.0, 8938.21, 8800.6, 8847.37, 4009.370065], [1524513600000, 8847.37, 8949.98, 8825.01, 8934.01, 3212.313971], [1524528000000, 8934.0, 9230.15, 8922.0, 9192.47, 8920.526725], [1524542400000, 9192.48, 9300.0, 9177.0, 9216.0, 6142.367244], [1524556800000, 9217.98, 9349.0, 9216.0, 9294.57, 5552.908104], [1524571200000, 9294.59, 9420.0, 9155.0, 9347.77, 9491.188008], [1524585600000, 9347.78, 9455.0, 9293.29, 9449.9, 6519.494725], [1524600000000, 9452.0, 9731.01, 9400.04, 9619.99, 9642.3053], [1524614400000, 9618.96, 9759.82, 9323.02, 9347.99, 14015.352774], [1524628800000, 9349.99, 9500.0, 9110.0, 9416.39, 15935.464097], [1524643200000, 9415.0, 9438.54, 8960.0, 9144.03, 15412.11236], [1524657600000, 9137.0, 9210.21, 8730.0, 8972.09, 18176.961159], [1524672000000, 8972.09, 9089.0, 8846.0, 8969.98, 8529.012792], [1524686400000, 8969.55, 9185.01, 8770.0, 8869.99, 9041.134407], [1524700800000, 8869.99, 8899.0, 8660.0, 8808.02, 8897.684095], [1524715200000, 8812.7, 8977.0, 8771.0, 8847.97, 7692.143561], [1524729600000, 8847.97, 8917.51, 8651.62, 8857.01, 8018.565053], [1524744000000, 8858.51, 8945.0, 8740.01, 8806.1, 5701.623367], [1524758400000, 8806.1, 8925.0, 8775.89, 8881.54, 3963.192355], [1524772800000, 8880.0, 9307.48, 8880.0, 9266.0, 9027.095814], [1524787200000, 9267.03, 9297.0, 9123.25, 9143.01, 6271.10797], [1524801600000, 9143.01, 9265.7, 9104.88, 9240.97, 5121.255522], [1524816000000, 9240.97, 9395.0, 9230.0, 9309.0, 6239.525132], [1524830400000, 9308.9, 9355.0, 9150.1, 9241.21, 6595.466958], [1524844800000, 9241.2, 9328.26, 9075.01, 9089.0, 5616.834765], [1524859200000, 9089.12, 9163.38, 8889.0, 8915.35, 7397.156689], [1524873600000, 8915.35, 9196.32, 8870.0, 9155.0, 5459.606495], [1524888000000, 9155.01, 9215.66, 9108.99, 9126.22, 4402.856243], [1524902400000, 9121.05, 9330.0, 9081.02, 9289.98, 5449.677882]], "8h": [[1510444800000, 6245.05, 6310.0, 5325.01, 6060.0, 2390.026627], [1510473600000, 6089.77, 6630.0, 5784.22, 6200.02, 1686.29828], [1510502400000, 6219.8, 6219.96, 5600.0, 5811.03, 892.158162], [1510531200000, 5839.94, 6350.0, 5699.99, 6196.66, 943.89903], [1510560000000, 6200.14, 6697.47, 6150.33, 6589.99, 1017.869468], [1510588800000, 6582.01, 6599.61, 6190.0, 6465.99, 659.474541], [1510617600000, 6465.99, 6684.98, 6465.99, 6545.33, 491.559998], [1510646400000, 6545.33, 6563.08, 6311.07, 6436.0, 508.950024], [1510675200000, 6430.0, 6593.0, 6391.0, 6574.99, 253.782509], [1510704000000, 6575.99, 6908.0, 6575.99, 6850.23, 604.62428], [1510732800000, 6850.23, 7248.0, 6825.0, 7245.0, 634.429266], [1510761600000, 7248.98, 7298.0, 7057.0, 7240.06, 540.552299], [1510790400000, 7240.14, 7390.0, 7076.0, 7369.99, 419.78883], [1510819200000, 7369.99, 7546.7, 7313.0, 7427.0, 975.162346], [1510848000000, 7427.01, 7940.0, 7393.38, 7864.5, 937.005574], [1510876800000, 7876.98, 7989.0, 7472.31, 7498.0, 1277.303394], [1510905600000, 7497.98, 7948.99, 7451.0, 7928.96, 1404.313039], [1510934400000, 7928.96, 7950.0, 7608.0, 7699.19, 1300.779492], [1510963200000, 7680.01, 7699.96, 7422.0, 7674.97, 1317.784093], [1510992000000, 7674.97, 7759.48, 7602.02, 7676.09, 1245.310067], [1511020800000, 7676.81, 7819.99, 7603.0, 7761.94, 1391.172317], [1511049600000, 7761.94, 7818.93, 7650.33, 7690.01, 1125.666684], [1511078400000, 7690.06, 7789.24, 7675.62, 7750.02, 1257.819318], [1511107200000, 7750.06, 8123.15, 7737.17, 8038.0, 1483.854442], [1511136000000, 8057.11, 8083.49, 7954.0, 8014.01, 1247.462535], [1511164800000, 8014.02, 8239.98, 8014.01, 8217.31, 1350.819677], [1511193600000, 8217.98, 8319.99, 8177.3, 8212.0, 1288.352136], [1511222400000, 8212.49, 8290.0, 7801.0, 8165.55, 2109.81899], [1511251200000, 8165.38, 8400.0, 8125.0, 8370.01, 1383.480916], [1511280000000, 8383.44, 8384.98, 8070.0, 8119.51, 1051.17411], [1511308800000, 8091.09, 8289.94, 8091.09, 8289.88, 1169.05293], [1511337600000, 8289.89, 8322.68, 8108.0, 8205.02, 1514.01215], [1511366400000, 8200.54, 8258.73, 8108.0, 8205.92, 861.94063], [1511395200000, 8233.03, 8260.0, 8130.0, 8140.0, 1251.477464], [1511424000000, 8139.98, 8197.35, 8031.01, 8168.12, 1650.016498], [1511452800000, 8167.31, 8200.0, 8000.0, 8019.99, 1192.458725], [1511481600000, 8019.97, 8280.0, 7850.0, 8280.0, 1331.373645], [1511510400000, 8262.02, 8369.0, 7950.0, 8110.02, 2104.672853], [1511539200000, 8110.02, 8250.0, 8090.62, 8138.0, 975.742614], [1511568000000, 8138.99, 8296.83, 8090.0, 8280.89, 1275.981765], [1511596800000, 8280.0, 8550.55, 8276.0, 8542.99, 1631.600384], [1511625600000, 8542.98, 8734.78, 8500.0, 8700.01, 1385.041533], [1511654400000, 8700.04, 8978.9, 8604.72, 8864.0, 1307.632409], [1511683200000, 8884.0, 9078.0, 8786.45, 9075.01, 1417.307305], [1511712000000, 9078.0, 9350.0, 8952.04, 9128.02, 1422.440523], [1511740800000, 9128.0, 9645.55, 9112.04, 9645.55, 1421.34186], [1511769600000, 9640.02, 9654.28, 9166.0, 9568.94, 1745.56385], [1511798400000, 9567.99, 9650.0, 9355.01, 9650.0, 1354.719997], [1511827200000, 9650.0, 9869.84, 9570.5, 9817.0, 1500.754269], [1511856000000, 9816.98, 9939.0, 9658.0, 9822.33, 1979.934193], [1511884800000, 9833.98, 9925.0, 9820.12, 9896.8, 1436.522523], [1511913600000, 9896.79, 10800.0, 9873.68, 10429.98, 2663.794176], [1511942400000, 10429.98, 11300.03, 10326.05, 10770.89, 3745.252276], [1511971200000, 10764.49, 10975.0, 8520.0, 9687.88, 6943.492263], [1512000000000, 9687.88, 10900.0, 9532.88, 10070.0, 3559.810868], [1512028800000, 10051.56, 10296.0, 8850.8, 8980.0, 3536.579371], [1512057600000, 8979.99, 10089.99, 8910.01, 9838.96, 2293.18409], [1512086400000, 9837.0, 9924.99, 9380.0, 9540.0, 1820.405906], [1512115200000, 9540.0, 10740.0, 9540.0, 10460.0, 2648.230653], [1512144000000, 10460.0, 10898.0, 10354.01, 10782.99, 1666.287074], [1512172800000, 10775.04, 11100.0, 10650.0, 10931.04, 1882.053256], [1512201600000, 10926.38, 11190.0, 10620.0, 10709.73, 1916.6193], [1512230400000, 10709.76, 11050.0, 10689.07, 10890.01, 966.767201], [1512259200000, 10902.69, 11169.04, 10799.0, 11146.02, 1223.378364], [1512288000000, 11150.49, 11820.66, 11066.01, 11710.0, 1897.599144], [1512316800000, 11710.0, 11825.0, 10500.0, 11165.41, 2225.659016], [1512345600000, 11165.41, 11600.0, 11163.78, 11544.76, 1360.449499], [1512374400000, 11538.39, 11600.0, 10802.0, 11301.07, 1409.337933], [1512403200000, 11309.02, 11579.0, 11051.0, 11579.0, 1893.63713], [1512432000000, 11571.03, 11798.0, 11447.68, 11780.0, 1884.546455], [1512460800000, 11765.5, 11853.0, 11450.0, 11800.0, 1750.586426], [1512489600000, 11800.0, 11800.0, 11561.01, 11699.99, 1915.599174], [1512518400000, 11699.99, 12531.06, 11665.58, 12426.93, 2092.646433], [1512547200000, 12432.77, 12920.0, 12250.0, 12322.4, 2344.374359], [1512576000000, 12322.41, 13615.23, 12220.0, 13550.05, 2270.925527], [1512604800000, 13541.01, 14318.44, 13050.0, 14302.84, 2442.857574], [1512633600000, 14311.44, 15500.0, 13700.0, 15310.01, 2528.058158], [1512662400000, 15310.02, 16649.96, 14450.01, 16599.0, 2516.149963], [1512691200000, 16599.0, 17204.99, 14120.0, 15880.0, 5529.453313], [1512720000000, 15881.47, 15999.99, 14015.0, 15265.7, 6753.783587], [1512748800000, 15265.69, 15998.98, 14790.02, 15880.0, 5305.776236], [1512777600000, 15880.01, 16269.3, 15001.0, 15340.01, 4735.050851], [1512806400000, 15340.05, 15370.13, 14203.0, 14405.48, 4216.146178], [1512835200000, 14405.48, 14813.0, 12535.0, 14656.07, 4967.561658], [1512864000000, 14664.01, 14699.97, 12368.0, 13419.98, 5847.535697], [1512892800000, 13419.98, 15612.1, 12900.13, 15400.0, 5537.401264], [1512921600000, 15410.25, 15720.12, 14150.0, 14899.98, 5168.100212], [1512950400000, 14946.26, 16689.0, 14901.08, 16431.0, 4723.641885], [1512979200000, 16427.0, 16554.98, 16000.01, 16359.8, 3769.87386], [1513008000000, 16322.01, 17470.0, 16210.02, 16587.97, 3326.886017], [1513036800000, 16587.97, 16976.45, 16200.0, 16799.97, 3257.051725], [1513065600000, 16797.16, 16921.06, 15875.0, 16311.68, 3539.342996], [1513094400000, 16319.94, 16685.27, 16000.0, 16349.99, 2640.40769], [1513123200000, 16349.99, 16546.0, 14666.56, 16092.34, 3750.684435], [1513152000000, 16083.08, 16420.35, 15654.52, 15844.21, 3899.317219], [1513180800000, 15822.5, 16274.98, 14853.68, 16033.29, 4766.327147], [1513209600000, 16030.34, 16234.66, 15450.0, 15775.23, 4416.131702], [1513238400000, 15756.7, 16445.0, 15651.0, 16074.54, 4041.211921], [1513267200000, 16097.98, 16438.01, 15967.12, 16334.98, 3159.523528], [1513296000000, 16334.98, 17796.39, 16298.45, 17073.27, 3523.001874], [1513324800000, 17070.0, 17991.0, 16876.89, 17542.81, 3330.781933], [1513353600000, 17549.5, 17850.0, 17240.0, 17539.83, 2327.49014], [1513382400000, 17516.81, 17827.99, 17190.01, 17677.54, 1549.682533], [1513411200000, 17677.54, 18800.89, 17532.05, 18751.02, 1363.49789], [1513440000000, 18751.01, 19539.0, 18365.0, 19102.66, 1289.448286], [1513468800000, 19120.19, 19495.0, 18800.0, 19462.98, 2767.722129], [1513497600000, 19495.0, 19798.68, 18846.0, 19220.0, 3163.560747], [1513526400000, 19220.0, 19449.48, 18510.0, 18860.02, 3245.900558], [1513555200000, 18860.04, 19006.61, 17029.98, 18576.99, 4838.535858], [1513584000000, 18576.99, 19300.0, 18021.98, 18670.0, 3215.354855], [1513612800000, 18670.0, 18900.0, 18100.2, 18856.25, 2570.742358], [1513641600000, 18856.25, 18950.0, 18500.0, 18562.01, 2736.487406], [1513670400000, 18569.52, 18695.2, 16300.0, 17164.85, 7030.293008], [1513699200000, 17164.83, 18185.18, 16500.0, 17295.2, 3443.967806], [1513728000000, 17295.2, 17295.2, 14777.66, 16354.17, 7563.045792], [1513756800000, 16360.0, 17720.35, 16300.0, 16505.0, 3468.003402], [1513785600000, 16540.0, 16970.0, 15830.13, 16488.98, 2419.447499], [1513814400000, 16480.52, 17309.5, 16375.29, 17038.99, 4193.16538], [1513843200000, 17046.02, 17049.99, 14022.0, 14400.0, 8513.106168], [1513872000000, 14400.0, 15527.63, 14302.95, 15492.64, 7617.945752], [1513900800000, 15514.03, 15699.34, 12200.0, 12726.45, 14672.884068], [1513929600000, 12726.45, 14331.38, 10961.0, 12660.27, 13571.550721], [1513958400000, 12696.5, 14649.99, 11800.01, 13326.61, 7831.836386], [1513987200000, 13326.61, 14300.0, 12978.18, 13609.25, 4899.934528], [1514016000000, 13609.25, 14950.0, 13480.0, 14218.39, 4458.959609], [1514044800000, 14218.39, 14900.0, 13234.56, 13300.0, 3782.644738], [1514073600000, 13300.0, 13819.99, 12100.0, 13252.12, 10848.187516], [1514102400000, 13228.0, 13600.0, 11640.0, 12543.07, 10488.105968], [1514131200000, 12540.0, 13570.0, 12030.0, 13500.0, 7221.241504], [1514160000000, 13500.0, 13690.64, 12708.0, 13561.14, 6678.047169], [1514188800000, 13580.0, 14300.0, 13059.0, 13473.0, 5967.23898], [1514217600000, 13473.0, 13885.0, 13331.0, 13699.34, 3102.921458], [1514246400000, 13699.34, 15350.0, 13533.0, 15063.02, 6974.163573], [1514275200000, 15073.16, 15900.1, 14660.0, 15649.0, 5546.500832], [1514304000000, 15649.99, 16050.0, 15432.06, 15689.01, 2514.003699], [1514332800000, 15709.98, 16498.05, 15559.54, 16055.0, 3744.865117], [1514361600000, 16073.69, 16200.0, 14876.0, 15155.01, 5451.167201], [1514390400000, 15162.25, 15563.63, 14200.15, 15459.99, 5763.832405], [1514419200000, 15459.97, 15539.99, 13417.99, 13984.39, 9358.314914], [1514448000000, 13984.38, 14348.22, 13150.0, 14040.0, 6877.281123], [1514476800000, 14045.94, 14221.99, 13190.0, 14182.11, 5482.261977], [1514505600000, 14199.14, 14981.0, 14008.0, 14450.0, 5840.230379], [1514534400000, 14456.65, 14748.0, 13850.0, 14557.49, 6507.063822], [1514563200000, 14557.52, 14797.0, 14130.0, 14378.9, 5724.713915], [1514592000000, 14378.99, 14398.85, 12900.0, 13620.0, 6852.151806], [1514620800000, 13620.0, 13647.95, 11821.0, 12313.99, 7343.212952], [1514649600000, 12315.0, 13200.0, 11750.0, 12440.01, 5025.793281], [1514678400000, 12345.1, 13411.02, 12149.98, 12797.46, 4520.795682], [1514707200000, 12797.44, 13421.75, 12425.98, 13212.68, 3662.521716], [1514736000000, 13226.16, 14050.11, 13192.02, 13716.36, 3585.67232], [1514764800000, 13715.65, 13818.55, 13155.38, 13570.35, 2978.419643], [1514793600000, 13569.98, 13735.24, 12750.0, 13247.0, 3151.689084], [1514822400000, 13247.0, 13599.7, 12940.0, 13380.0, 2479.807117], [1514851200000, 13382.16, 13850.0, 12890.02, 13343.0, 5345.848979], [1514880000000, 13343.01, 13894.86, 13302.59, 13690.03, 5962.062182], [1514908800000, 13690.02, 15473.49, 13503.0, 14675.11, 8770.18095], [1514937600000, 14690.0, 15307.56, 14660.0, 15170.0, 6515.535657], [1514966400000, 15170.0, 15172.99, 14150.0, 15033.77, 6285.537067], [1514995200000, 15045.0, 15130.0, 14671.0, 14919.51, 3104.594915], [1515024000000, 14919.51, 15280.0, 14649.99, 14748.0, 5902.436088], [1515052800000, 14734.07, 14800.0, 13918.04, 14353.01, 8300.383236], [1515081600000, 14367.99, 15100.08, 14238.01, 15059.54, 7126.83025], [1515110400000, 15059.56, 15200.0, 14600.0, 14920.14, 7059.473469], [1515139200000, 14916.95, 16350.0, 14880.0, 16087.72, 8016.125797], [1515168000000, 16094.99, 17176.24, 16087.73, 16960.39, 8175.891859], [1515196800000, 16960.39, 17099.99, 16288.0, 16518.0, 6411.694072], [1515225600000, 16500.18, 16750.01, 16011.21, 16556.22, 6206.958682], [1515254400000, 16550.04, 17143.13, 16501.75, 17069.79, 5952.804754], [1515283200000, 17069.79, 17099.96, 16400.0, 16746.99, 5927.867851], [1515312000000, 16747.0, 16886.75, 16300.0, 16439.65, 2688.757985], [1515340800000, 16439.64, 16500.0, 15610.0, 16150.03, 3876.499722], [1515369600000, 16218.85, 16322.3, 15476.0, 15865.0, 6231.576701], [1515398400000, 15864.99, 15869.97, 12812.0, 14299.98, 13639.560217], [1515427200000, 14297.9, 15270.99, 14238.32, 14902.54, 6729.472994], [1515456000000, 14902.54, 15500.0, 14601.0, 15062.28, 4362.427696], [1515484800000, 15062.28, 15300.0, 14011.05, 14654.96, 6059.856338], [1515513600000, 14655.01, 14998.62, 14125.0, 14400.0, 3892.720219], [1515542400000, 14401.0, 14480.0, 13750.0, 13979.0, 5559.773062], [1515571200000, 13978.95, 14490.0, 13131.31, 14399.95, 8142.071446], [1515600000000, 14399.95, 14955.66, 14172.95, 14907.09, 3709.157147], [1515628800000, 14940.0, 14968.68, 11400.0, 13530.42, 17848.833439], [1515657600000, 13530.42, 14400.0, 13041.0, 13958.08, 8121.725233], [1515686400000, 13950.05, 14190.0, 12511.0, 13238.78, 7584.165079], [1515715200000, 13238.76, 13966.63, 12500.0, 13722.04, 7051.171715], [1515744000000, 13722.04, 14109.78, 13301.99, 13411.79, 5074.667455], [1515772800000, 13411.79, 13900.0, 13222.0, 13740.01, 4291.322967], [1515801600000, 13749.95, 14320.0, 13706.15, 14255.09, 4954.220722], [1515830400000, 14250.0, 14580.0, 13974.94, 14241.26, 4248.603144], [1515859200000, 14257.84, 14357.0, 13923.18, 14210.0, 3018.684662], [1515888000000, 14210.0, 14339.5, 13359.07, 13590.0, 3766.341124], [1515916800000, 13590.0, 13720.0, 12569.2, 12869.89, 9217.648313], [1515945600000, 12869.82, 13600.8, 12690.01, 13474.99, 4033.904892], [1515974400000, 13477.98, 13736.4, 13215.56, 13355.0, 4077.562364], [1516003200000, 13346.34, 14249.99, 13147.79, 13990.01, 6786.235892], [1516032000000, 13990.01, 14100.0, 13340.64, 13539.93, 3788.296449], [1516060800000, 13500.0, 13542.93, 12222.0, 12347.32, 10504.542635], [1516089600000, 12340.0, 12488.0, 10620.88, 11964.02, 25480.122246], [1516118400000, 11963.9, 11988.47, 9035.0, 10900.0, 27416.504294], [1516147200000, 10899.99, 11488.88, 9777.0, 10765.01, 21121.989615], [1516176000000, 10777.93, 10799.78, 9037.94, 9227.47, 23723.080675], [1516204800000, 9227.46, 11680.99, 9150.01, 10988.79, 27486.726356], [1516233600000, 10972.59, 11600.0, 10435.33, 10472.97, 17648.58108], [1516262400000, 10461.71, 11878.82, 10440.01, 11700.0, 15182.942901], [1516291200000, 11696.99, 11742.95, 10635.3, 10961.97, 15632.910956], [1516320000000, 10960.0, 11435.0, 10360.0, 11069.72, 13720.115072], [1516348800000, 11060.0, 11795.0, 10950.0, 11400.0, 12318.903702], [1516377600000, 11383.16, 11700.0, 11003.0, 11474.98, 8090.356647], [1516406400000, 11474.98, 12869.0, 11412.45, 12660.98, 13560.882936], [1516435200000, 12660.98, 12835.0, 12240.24, 12539.05, 7739.046398], [1516464000000, 12539.08, 13099.0, 12535.0, 12799.94, 7468.928493], [1516492800000, 12799.8, 12799.8, 11300.0, 11701.14, 15109.114304], [1516521600000, 11721.43, 12291.35, 11403.0, 11412.0, 12530.442989], [1516550400000, 11420.99, 11548.99, 10965.0, 11530.0, 13740.216133], [1516579200000, 11530.0, 11770.0, 11149.0, 11743.97, 9596.349212], [1516608000000, 11745.0, 11926.35, 10139.97, 10330.0, 18499.863449], [1516636800000, 10330.06, 10849.0, 9900.24, 10760.05, 15656.39413], [1516665600000, 10760.05, 10998.0, 10108.4, 10250.0, 11438.307536], [1516694400000, 10250.85, 10770.54, 9905.0, 10750.0, 12550.515837], [1516723200000, 10750.0, 11399.0, 10678.0, 10799.18, 13485.099179], [1516752000000, 10799.14, 11100.1, 10500.0, 10956.0, 8770.508874], [1516780800000, 10955.99, 11570.48, 10729.0, 11070.09, 11687.456975], [1516809600000, 11070.09, 11390.0, 10862.08, 11349.99, 6700.621913], [1516838400000, 11349.96, 11794.05, 11248.48, 11460.0, 8217.587847], [1516867200000, 11465.91, 11483.98, 10959.0, 10999.0, 7126.721072], [1516896000000, 10998.99, 11395.0, 10950.21, 11175.27, 5495.645264], [1516924800000, 11184.7, 11643.0, 11010.0, 11010.0, 6646.945878], [1516953600000, 11010.09, 11147.85, 10311.15, 11147.85, 19011.982935], [1516982400000, 11147.84, 11399.0, 10800.93, 11089.0, 7397.943147], [1517011200000, 11089.0, 11400.0, 10842.69, 11243.68, 6036.535084], [1517040000000, 11243.68, 11495.0, 10900.0, 11464.97, 6572.706105], [1517068800000, 11452.62, 11650.0, 11360.0, 11491.0, 6251.527156], [1517097600000, 11499.98, 12244.0, 11408.0, 11969.0, 7216.079808], [1517126400000, 11969.0, 12079.9, 11652.0, 11791.12, 5999.837519], [1517155200000, 11793.0, 11999.98, 11750.0, 11879.95, 3671.422197], [1517184000000, 11879.95, 11975.02, 11273.0, 11318.01, 6791.300322], [1517212800000, 11320.0, 11528.0, 11139.55, 11383.91, 4390.772596], [1517241600000, 11383.91, 11499.0, 11150.0, 11251.0, 2988.30462], [1517270400000, 11250.11, 11308.42, 10850.0, 11118.99, 4521.501601], [1517299200000, 11119.0, 11210.57, 10206.25, 10323.02, 7997.517734], [1517328000000, 10323.25, 10600.0, 9900.0, 10237.51, 13035.353611], [1517356800000, 10230.0, 10347.52, 9700.0, 10280.0, 9366.085519], [1517385600000, 10280.0, 10425.85, 9900.0, 10017.47, 5502.255293], [1517414400000, 10017.51, 10298.0, 9860.0, 10285.1, 3147.615993], [1517443200000, 10285.1, 10335.0, 9959.04, 10063.75, 4286.184581], [1517472000000, 10063.75, 10078.1, 9224.0, 9339.87, 14017.45132], [1517500800000, 9326.23, 9560.01, 8750.99, 9224.52, 15261.12841], [1517529600000, 9224.52, 9250.0, 8505.0, 8673.11, 12646.292314], [1517558400000, 8673.11, 9120.0, 8010.02, 9070.0, 25528.303697], [1517587200000, 9070.0, 9247.79, 8501.0, 8873.03, 11797.030964], [1517616000000, 8873.03, 8920.0, 8229.0, 8708.82, 9216.859241], [1517644800000, 8708.82, 9459.6, 8579.0, 9173.0, 12163.664454], [1517673600000, 9173.01, 9473.01, 9022.0, 9199.96, 7344.47704], [1517702400000, 9199.96, 9368.0, 8901.01, 9200.0, 5241.379306], [1517731200000, 9200.0, 9216.0, 8357.93, 8419.96, 12681.918448], [1517760000000, 8419.96, 8585.0, 7930.0, 8184.81, 14091.010695], [1517788800000, 8179.99, 8382.8, 7910.0, 7965.01, 10839.178964], [1517817600000, 7965.01, 8049.99, 7167.0, 7384.85, 20949.729697], [1517846400000, 7375.49, 7543.99, 6625.0, 6939.99, 31614.273918], [1517875200000, 6939.63, 7150.0, 6000.01, 6043.0, 33231.301973], [1517904000000, 6040.98, 7462.0, 6019.24, 7290.61, 38439.312973], [1517932800000, 7299.99, 7878.0, 6781.0, 7652.14, 28530.885361], [1517961600000, 7655.02, 7770.0, 7150.01, 7669.97, 17636.373864], [1517990400000, 7669.97, 8476.0, 7580.6, 8169.0, 24164.014478], [1518019200000, 8165.0, 8399.0, 7531.11, 7599.0, 18978.072155], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518163200000, 7789.9, 8540.0, 7789.9, 8333.91, 9526.831769], [1518192000000, 8333.98, 8738.0, 8312.0, 8683.92, 10956.079056], [1518220800000, 8683.93, 9065.78, 8601.0, 8915.15, 13586.02675], [1518249600000, 8915.15, 8920.17, 8231.0, 8263.51, 18979.104625], [1518278400000, 8271.0, 8572.0, 8120.0, 8533.98, 16816.381278], [1518307200000, 8533.99, 8549.0, 7800.0, 7850.72, 15797.944151], [1518336000000, 7851.2, 8449.9, 7726.53, 8449.86, 17264.187619], [1518364800000, 8445.06, 8500.85, 8015.0, 8063.88, 11963.056182], [1518393600000, 8063.82, 8570.0, 8053.0, 8473.76, 12884.578717], [1518422400000, 8470.01, 8840.82, 8457.03, 8670.0, 15910.264183], [1518451200000, 8669.99, 8989.0, 8620.0, 8903.0, 13193.00759], [1518480000000, 8903.0, 8950.0, 8554.87, 8669.39, 12242.260545], [1518508800000, 8656.26, 8680.0, 8351.0, 8489.91, 14585.951506], [1518537600000, 8486.05, 8725.0, 8461.0, 8539.9, 8626.760905], [1518566400000, 8535.17, 8888.85, 8533.0, 8870.17, 9821.935373], [1518595200000, 8870.17, 9350.0, 8757.5, 9330.08, 18470.738818], [1518624000000, 9329.22, 9489.6, 9170.0, 9449.99, 12519.278676], [1518652800000, 9449.98, 9817.2, 9301.5, 9810.01, 14771.642868], [1518681600000, 9810.01, 9925.17, 9371.56, 9811.01, 19353.777221], [1518710400000, 9811.01, 10219.5, 9742.01, 10000.09, 18302.176626], [1518739200000, 10000.89, 10323.37, 9679.16, 9688.5, 14821.074167], [1518768000000, 9688.5, 10132.0, 9666.0, 10039.98, 13243.269232], [1518796800000, 10035.05, 10213.3, 9865.0, 10159.98, 10096.862575], [1518825600000, 10156.07, 10760.0, 10050.0, 10727.91, 15265.260608], [1518854400000, 10727.87, 10877.91, 10499.86, 10731.48, 15330.965284], [1518883200000, 10731.48, 11075.07, 10674.0, 11039.55, 11285.882515], [1518912000000, 11039.55, 11274.0, 10323.0, 10589.76, 23189.689083], [1518940800000, 10593.62, 10850.0, 10080.0, 10633.73, 23208.343895], [1518969600000, 10620.01, 10874.99, 10331.0, 10383.43, 14739.34775], [1518998400000, 10375.01, 10843.0, 10270.33, 10815.62, 12255.3633], [1519027200000, 10815.61, 11219.0, 10672.01, 11171.71, 15433.143639], [1519056000000, 11171.71, 11250.0, 10881.0, 11153.0, 13142.910192], [1519084800000, 11147.11, 11650.0, 11141.0, 11535.0, 15217.651316], [1519113600000, 11530.92, 11595.0, 11156.0, 11516.99, 13557.386048], [1519142400000, 11517.0, 11786.01, 11100.59, 11200.99, 19378.316924], [1519171200000, 11195.07, 11304.03, 10620.0, 11125.0, 26270.327846], [1519200000000, 11128.0, 11185.19, 10407.09, 10540.31, 20188.767558], [1519228800000, 10542.64, 10675.51, 10200.0, 10437.6, 21654.72335], [1519257600000, 10439.02, 10933.44, 10296.0, 10600.0, 16049.536669], [1519286400000, 10606.99, 10670.0, 9711.0, 9980.98, 33251.693399], [1519315200000, 9972.12, 10127.0, 9679.0, 9811.04, 17758.936415], [1519344000000, 9815.55, 9989.0, 9570.19, 9865.66, 19172.882889], [1519372800000, 9865.67, 10435.0, 9857.34, 10292.0, 21896.955713], [1519401600000, 10292.0, 10300.92, 9857.75, 10131.04, 16132.863768], [1519430400000, 10131.04, 10496.97, 9938.98, 10119.16, 14951.658797], [1519459200000, 10119.13, 10155.0, 9556.0, 9752.07, 15071.78637], [1519488000000, 9751.62, 9821.96, 9352.0, 9694.51, 10864.711132], [1519516800000, 9694.51, 9847.0, 9487.0, 9727.3, 8474.84194], [1519545600000, 9722.64, 9787.6, 9300.0, 9390.0, 11082.043154], [1519574400000, 9390.0, 9670.0, 9274.8, 9590.0, 8816.632492], [1519603200000, 9590.0, 9754.98, 9379.01, 9454.49, 7456.750117], [1519632000000, 9454.49, 10344.0, 9350.0, 10260.92, 17072.015249], [1519660800000, 10261.0, 10444.32, 10121.0, 10324.0, 10349.52739], [1519689600000, 10321.0, 10650.0, 10121.0, 10600.0, 9747.858516], [1519718400000, 10600.0, 10870.0, 10463.18, 10568.01, 14470.092727], [1519747200000, 10570.0, 10792.4, 10559.32, 10569.04, 6487.43388], [1519776000000, 10584.33, 11098.0, 10551.0, 10748.86, 11590.420927], [1519804800000, 10741.01, 10828.0, 10375.54, 10506.85, 11078.475445], [1519833600000, 10505.0, 10722.0, 10300.0, 10326.76, 8132.08741], [1519862400000, 10325.64, 10592.85, 10240.0, 10549.33, 7146.887157], [1519891200000, 10549.96, 10831.0, 10549.96, 10717.0, 8571.231102], [1519920000000, 10717.0, 11060.41, 10700.01, 10920.0, 9374.435671], [1519948800000, 10923.36, 11200.0, 10901.01, 11080.42, 10268.57217], [1519977600000, 11080.42, 11139.1, 10770.0, 10855.34, 7926.193588], [1520006400000, 10855.0, 11130.0, 10780.0, 11039.0, 5715.944332], [1520035200000, 11038.99, 11415.16, 11015.01, 11317.0, 8133.436619], [1520064000000, 11317.0, 11530.0, 11245.5, 11483.77, 7147.922863], [1520092800000, 11477.02, 11544.0, 11268.0, 11464.48, 6005.793798], [1520121600000, 11464.47, 11470.0, 11050.02, 11140.3, 6702.711645], [1520150400000, 11142.01, 11273.7, 11080.97, 11150.01, 4258.590869], [1520179200000, 11150.0, 11565.0, 11125.92, 11515.0, 6334.616139], [1520208000000, 11515.0, 11608.0, 11415.01, 11539.87, 4750.736168], [1520236800000, 11539.87, 11585.53, 11435.0, 11515.61, 4526.843162], [1520265600000, 11515.62, 11710.0, 11454.0, 11454.0, 5866.651733], [1520294400000, 11455.0, 11455.0, 11181.5, 11270.0, 7638.40604], [1520323200000, 11275.11, 11333.0, 10777.78, 10966.0, 11550.210755], [1520352000000, 10974.08, 11013.5, 10555.48, 10716.48, 10326.955568], [1520380800000, 10716.48, 10899.0, 10400.0, 10510.0, 9144.842478], [1520409600000, 10509.99, 10747.88, 10411.11, 10679.56, 9677.911907], [1520438400000, 10679.56, 10716.66, 9389.31, 9910.0, 31824.916695], [1520467200000, 9910.0, 10037.99, 9470.0, 9936.98, 12544.53577], [1520496000000, 9936.98, 10099.0, 9624.0, 9909.29, 9927.691029], [1520524800000, 9909.3, 9914.96, 9060.0, 9271.64, 18637.246427], [1520553600000, 9267.07, 9410.0, 8329.0, 8686.43, 26547.915259], [1520582400000, 8685.0, 9165.18, 8388.0, 8927.0, 19482.686482], [1520611200000, 8925.93, 9333.33, 8630.0, 9227.0, 18081.689666], [1520640000000, 9230.0, 9490.0, 9073.66, 9327.43, 13651.506049], [1520668800000, 9327.43, 9468.88, 9150.1, 9346.14, 9218.502978], [1520697600000, 9340.0, 9418.17, 8667.07, 8770.22, 14310.00383], [1520726400000, 8770.22, 8844.07, 8450.0, 8704.0, 12522.725339], [1520755200000, 8700.0, 9335.0, 8532.38, 9036.04, 14812.730121], [1520784000000, 9049.96, 9740.0, 9037.01, 9533.57, 16990.517926], [1520812800000, 9533.57, 9713.0, 9356.02, 9599.92, 9656.79301], [1520841600000, 9599.92, 9888.88, 9110.0, 9170.01, 16402.446863], [1520870400000, 9174.22, 9309.57, 8780.0, 9131.34, 16171.538057], [1520899200000, 9131.34, 9474.0, 8933.0, 9205.17, 12577.01618], [1520928000000, 9205.17, 9349.0, 8823.0, 9051.0, 16583.593261], [1520956800000, 9060.93, 9275.0, 8941.45, 9150.0, 11030.799917], [1520985600000, 9151.92, 9333.78, 9050.0, 9079.92, 8055.153169], [1521014400000, 9067.09, 9129.99, 8570.0, 8725.83, 16154.388429], [1521043200000, 8718.0, 8726.82, 7900.28, 8170.0, 25498.55251], [1521072000000, 8184.01, 8250.0, 7650.0, 7888.94, 18339.591969], [1521100800000, 7887.19, 8430.0, 7790.73, 8099.0, 21023.12905], [1521129600000, 8098.76, 8363.21, 7943.9, 8240.98, 12928.301258], [1521158400000, 8240.98, 8324.96, 7900.0, 8233.0, 12928.259564], [1521187200000, 8233.0, 8598.77, 8060.0, 8539.0, 15717.69361], [1521216000000, 8539.0, 8611.64, 8257.2, 8260.0, 10169.456719], [1521244800000, 8260.0, 8322.49, 8078.0, 8186.02, 9216.971631], [1521273600000, 8197.7, 8348.62, 7852.2, 7887.11, 11856.416897], [1521302400000, 7887.99, 8050.0, 7721.99, 7824.8, 12036.817801], [1521331200000, 7824.01, 7857.24, 7519.84, 7659.99, 14011.161916], [1521360000000, 7659.0, 7829.0, 7322.0, 7385.0, 18356.239139], [1521388800000, 7385.0, 8317.4, 7330.0, 8189.99, 27120.830656], [1521417600000, 8189.0, 8456.0, 8088.4, 8289.01, 16814.842064], [1521446400000, 8292.92, 8705.23, 8089.0, 8550.0, 21430.480366], [1521475200000, 8550.0, 8630.07, 8230.7, 8600.0, 17051.762512], [1521504000000, 8595.01, 8667.0, 8340.0, 8385.12, 12460.049212], [1521532800000, 8385.12, 8600.0, 8280.0, 8513.97, 12677.694266], [1521561600000, 8513.97, 9050.0, 8513.88, 8909.98, 19727.362357], [1521590400000, 8909.96, 9145.3, 8860.01, 8931.01, 11308.022271], [1521619200000, 8931.0, 9177.01, 8880.0, 9039.99, 11379.523197], [1521648000000, 9039.99, 9069.99, 8750.6, 8885.0, 17284.859903], [1521676800000, 8884.82, 9100.0, 8860.0, 8955.09, 8935.65639], [1521705600000, 8955.0, 9020.0, 8465.1, 8611.51, 20787.340275], [1521734400000, 8611.51, 8770.0, 8510.2, 8722.9, 10894.560144], [1521763200000, 8720.0, 8729.5, 8330.0, 8398.65, 13519.798605], [1521792000000, 8398.58, 8687.98, 8269.0, 8613.0, 14529.755898], [1521820800000, 8618.0, 8909.0, 8559.25, 8898.03, 11941.453163], [1521849600000, 8898.04, 8987.97, 8805.01, 8930.0, 10987.343355], [1521878400000, 8931.7, 8999.95, 8666.3, 8950.0, 11640.514782], [1521907200000, 8950.0, 8968.0, 8491.0, 8546.86, 12838.751435], [1521936000000, 8531.25, 8599.0, 8379.23, 8466.53, 9639.10609], [1521964800000, 8468.85, 8643.0, 8365.77, 8480.0, 10160.186581], [1521993600000, 8480.0, 8669.85, 8388.0, 8470.15, 9202.476645], [1522022400000, 8470.14, 8514.89, 8353.18, 8405.88, 6941.190991], [1522051200000, 8400.5, 8426.99, 8000.01, 8057.16, 18779.234971], [1522080000000, 8057.16, 8268.5, 7831.0, 8134.23, 18313.169698], [1522108800000, 8134.22, 8215.94, 7730.0, 7917.09, 14452.393927], [1522137600000, 7917.09, 8150.17, 7820.0, 8066.87, 11668.567848], [1522166400000, 8066.5, 8126.03, 7755.58, 7795.51, 11306.686275], [1522195200000, 7795.51, 7965.6, 7728.0, 7873.99, 8134.834138], [1522224000000, 7865.0, 8109.0, 7825.0, 7860.01, 11554.084923], [1522252800000, 7860.21, 8009.0, 7836.0, 7949.3, 6712.412609], [1522281600000, 7949.3, 7975.0, 7500.0, 7541.98, 14616.425934], [1522310400000, 7541.98, 7587.0, 7334.0, 7474.01, 14591.131498], [1522339200000, 7481.94, 7580.0, 6941.11, 7090.14, 25413.357693], [1522368000000, 7090.16, 7272.78, 6666.66, 7222.25, 29424.578825], [1522396800000, 7222.29, 7292.43, 6679.01, 6839.98, 17891.537065], [1522425600000, 6839.97, 6951.0, 6600.1, 6840.23, 17989.916086], [1522454400000, 6840.24, 7120.0, 6777.0, 6805.76, 13032.332612], [1522483200000, 6810.0, 7223.36, 6805.77, 7064.98, 13929.26254], [1522512000000, 7063.83, 7172.0, 6842.97, 6923.91, 9906.943935], [1522540800000, 6922.0, 7049.98, 6670.0, 6713.81, 8815.553297], [1522569600000, 6713.81, 6775.0, 6430.0, 6445.0, 15184.107058], [1522598400000, 6445.0, 6961.83, 6432.65, 6813.01, 20071.770108], [1522627200000, 6813.01, 7102.02, 6765.0, 7060.22, 11264.359848], [1522656000000, 7065.01, 7125.0, 6873.32, 7020.72, 11864.128888], [1522684800000, 7020.72, 7070.0, 6890.0, 7056.0, 8995.071336], [1522713600000, 7063.97, 7447.99, 7011.01, 7395.0, 13910.979702], [1522742400000, 7396.94, 7432.4, 7252.0, 7370.01, 12329.610125], [1522771200000, 7370.01, 7520.0, 7345.0, 7405.21, 11546.741984], [1522800000000, 7405.21, 7427.52, 7223.0, 7304.31, 10735.62743], [1522828800000, 7304.26, 7338.0, 6766.0, 6785.0, 19135.562436], [1522857600000, 6785.0, 6918.0, 6707.0, 6796.1, 12355.993938], [1522886400000, 6796.1, 6870.0, 6566.69, 6792.52, 14919.222518], [1522915200000, 6792.49, 6902.0, 6612.11, 6749.53, 14706.144333], [1522944000000, 6747.99, 6840.0, 6660.0, 6770.76, 9404.364609], [1522972800000, 6770.0, 6850.0, 6529.68, 6622.05, 11726.026415], [1523001600000, 6621.04, 6657.86, 6500.0, 6580.01, 9543.205627], [1523030400000, 6583.0, 6627.0, 6516.67, 6601.39, 6185.779878], [1523059200000, 6601.39, 6888.0, 6586.28, 6864.08, 11637.130872], [1523088000000, 6864.08, 7033.99, 6760.0, 7010.0, 11065.043513], [1523116800000, 7003.98, 7070.0, 6850.01, 6895.8, 9567.403882], [1523145600000, 6895.81, 7050.0, 6880.0, 6939.0, 5842.017639], [1523174400000, 6939.0, 7109.13, 6924.3, 7049.93, 8932.073587], [1523203200000, 7047.01, 7053.09, 6937.03, 7018.0, 6653.581939], [1523232000000, 7011.04, 7165.21, 7011.02, 7125.0, 9035.333535], [1523260800000, 7129.79, 7185.0, 6676.5, 6738.98, 17370.213083], [1523289600000, 6738.98, 6795.0, 6611.0, 6782.72, 7672.750588], [1523318400000, 6781.55, 6820.0, 6670.25, 6715.51, 7135.366251], [1523347200000, 6717.32, 6870.99, 6656.0, 6837.54, 8198.542404], [1523376000000, 6835.65, 6890.0, 6768.01, 6843.9, 6992.81944], [1523404800000, 6839.56, 6872.71, 6787.0, 6846.89, 6511.141789], [1523433600000, 6846.89, 6990.0, 6800.0, 6927.06, 9231.988978], [1523462400000, 6927.06, 6987.41, 6862.6, 6953.79, 8254.74041], [1523491200000, 6953.78, 6985.0, 6743.2, 6826.61, 11410.073041], [1523520000000, 6826.62, 8012.23, 6802.7, 7614.21, 36361.057652], [1523548800000, 7618.0, 7986.1, 7542.0, 7923.0, 17090.465294], [1523577600000, 7922.99, 8195.84, 7732.0, 8093.01, 16394.140666], [1523606400000, 8100.0, 8233.39, 8005.0, 8125.0, 20946.824134], [1523635200000, 8125.41, 8168.0, 7768.47, 7877.41, 17703.558348], [1523664000000, 7877.48, 8186.0, 7810.0, 8127.74, 12022.863138], [1523692800000, 8129.99, 8175.0, 7849.46, 7955.01, 12046.470229], [1523721600000, 7955.02, 8090.23, 7917.0, 7999.01, 7551.95299], [1523750400000, 8004.0, 8150.0, 7999.02, 8074.99, 7542.918027], [1523779200000, 8074.91, 8429.54, 8072.1, 8269.99, 13710.522825], [1523808000000, 8269.0, 8365.87, 8254.95, 8355.0, 6693.279592], [1523836800000, 8355.07, 8419.0, 8000.0, 8110.0, 15260.430811], [1523865600000, 8110.21, 8138.53, 7867.0, 7971.99, 13402.233944], [1523894400000, 7971.98, 8086.01, 7924.65, 8064.92, 8001.40496], [1523923200000, 8064.92, 8172.76, 7956.17, 8138.45, 9105.70656], [1523952000000, 8143.72, 8173.7, 8051.0, 8088.63, 10431.12874], [1523980800000, 8088.63, 8134.0, 7825.4, 7885.02, 12615.768267], [1524009600000, 7890.96, 8149.89, 7868.0, 8107.23, 8599.464425], [1524038400000, 8113.51, 8120.0, 7931.01, 7994.0, 8642.356212], [1524067200000, 7994.0, 8236.43, 7985.01, 8173.0, 9727.223933], [1524096000000, 8173.99, 8290.0, 8080.0, 8166.97, 10386.243555], [1524124800000, 8166.97, 8270.0, 8143.02, 8239.02, 9053.700932], [1524153600000, 8235.45, 8296.0, 8189.0, 8278.0, 7673.902977], [1524182400000, 8273.84, 8398.0, 8177.09, 8319.97, 13175.162003], [1524211200000, 8319.92, 8577.9, 8267.01, 8459.99, 13617.480637], [1524240000000, 8458.0, 8930.0, 8446.0, 8856.98, 13002.694845], [1524268800000, 8852.12, 9035.0, 8730.0, 8874.88, 12217.52323], [1524297600000, 8874.87, 8888.0, 8565.0, 8828.2, 20621.73898], [1524326400000, 8828.13, 8930.0, 8706.5, 8915.31, 8032.967699], [1524355200000, 8915.31, 8915.33, 8786.8, 8875.0, 6421.362443], [1524384000000, 8875.0, 9020.0, 8768.79, 8940.67, 12645.417176], [1524412800000, 8940.67, 9020.67, 8727.68, 8787.02, 10391.473861], [1524441600000, 8785.7, 8970.01, 8745.0, 8942.39, 8705.466055], [1524470400000, 8942.0, 8985.0, 8831.0, 8898.0, 9910.964618], [1524499200000, 8898.0, 8949.98, 8800.6, 8934.01, 7221.684036], [1524528000000, 8934.0, 9300.0, 8922.0, 9216.0, 15062.893969], [1524556800000, 9217.98, 9420.0, 9155.0, 9347.77, 15044.096112], [1524585600000, 9347.78, 9731.01, 9293.29, 9619.99, 16161.800025], [1524614400000, 9618.96, 9759.82, 9110.0, 9416.39, 29950.816871], [1524643200000, 9415.0, 9438.54, 8730.0, 8972.09, 33589.073519], [1524672000000, 8972.09, 9185.01, 8770.0, 8869.99, 17570.147199], [1524700800000, 8869.99, 8977.0, 8660.0, 8847.97, 16589.827656], [1524729600000, 8847.97, 8945.0, 8651.62, 8806.1, 13720.18842], [1524758400000, 8806.1, 9307.48, 8775.89, 9266.0, 12990.288169], [1524787200000, 9267.03, 9297.0, 9104.88, 9240.97, 11392.363492], [1524816000000, 9240.97, 9395.0, 9150.1, 9241.21, 12834.99209], [1524844800000, 9241.2, 9328.26, 8889.0, 8915.35, 13013.991454], [1524873600000, 8915.35, 9215.66, 8870.0, 9126.22, 9862.462738], [1524902400000, 9121.05, 9330.0, 9081.02, 9289.98, 5449.677882]], "12h": [[1503273600000, 4069.13, 4119.62, 3953.4, 4023.11, 522.291586], [1503316800000, 4023.11, 4070.49, 3911.79, 4016.0, 169.451474], [1503360000000, 4016.0, 4016.0, 3400.0, 3866.48, 503.638101], [1503403200000, 3866.48, 4104.82, 3786.81, 4040.0, 463.046757], [1503446400000, 4040.0, 4242.32, 4013.89, 4237.99, 436.522009], [1503489600000, 4205.98, 4265.8, 4069.8, 4114.01, 564.614556], [1503532800000, 4147.0, 4250.94, 4085.01, 4202.0, 418.186098], [1503576000000, 4211.78, 4371.68, 4136.33, 4316.01, 369.232655], [1503619200000, 4316.01, 4370.0, 4267.5, 4361.27, 317.047129], [1503662400000, 4361.27, 4453.91, 4247.48, 4280.68, 256.565611], [1503705600000, 4280.71, 4319.7, 4228.99, 4288.72, 106.498937], [1503748800000, 4288.72, 4367.0, 4212.41, 4337.44, 121.609131], [1503792000000, 4332.51, 4400.0, 4285.56, 4323.37, 167.597269], [1503835200000, 4340.0, 4386.79, 4285.54, 4310.01, 183.095316], [1503878400000, 4310.01, 4365.4, 4124.54, 4308.0, 289.414587], [1503921600000, 4309.0, 4399.82, 4271.03, 4386.69, 314.427029], [1503964800000, 4353.65, 4417.61, 4313.55, 4368.5, 295.370462], [1504008000000, 4368.5, 4625.85, 4347.59, 4587.48, 308.174566], [1504051200000, 4564.52, 4647.51, 4416.01, 4498.35, 445.128309], [1504094400000, 4537.0, 4609.92, 4416.16, 4555.14, 363.340462], [1504137600000, 4555.14, 4678.57, 4555.14, 4656.67, 324.524617], [1504180800000, 4674.97, 4745.42, 4631.41, 4724.89, 232.432185], [1504224000000, 4689.89, 4798.46, 4654.88, 4775.0, 307.840767], [1504267200000, 4775.0, 4885.55, 4725.81, 4834.91, 252.825599], [1504310400000, 4796.16, 4939.19, 4473.35, 4630.01, 466.548012], [1504353600000, 4669.75, 4675.0, 4286.87, 4472.14, 462.600583], [1504396800000, 4508.5, 4714.76, 4456.8, 4486.0, 335.535161], [1504440000000, 4475.23, 4583.84, 4298.33, 4509.08, 355.681037], [1504483200000, 4505.0, 4527.49, 4052.0, 4153.0, 821.924754], [1504526400000, 4153.0, 4311.14, 3972.51, 4100.11, 572.71986], [1504569600000, 4106.97, 4248.6, 3603.0, 4246.82, 722.686125], [1504612800000, 4248.64, 4484.99, 4096.06, 4366.47, 506.252032], [1504656000000, 4366.49, 4597.79, 4335.26, 4548.13, 529.023331], [1504699200000, 4544.59, 4662.87, 4422.28, 4619.77, 278.340395], [1504742400000, 4619.77, 4661.93, 4438.19, 4613.94, 245.62961], [1504785600000, 4616.79, 4788.59, 4586.13, 4691.61, 254.800365], [1504828800000, 4691.66, 4735.39, 4586.13, 4647.53, 127.036328], [1504872000000, 4653.92, 4690.83, 4028.93, 4282.8, 1005.218718], [1504915200000, 4282.8, 4426.62, 4150.06, 4327.63, 383.100668], [1504958400000, 4331.82, 4400.6, 4159.64, 4258.81, 275.682284], [1505001600000, 4258.81, 4279.7, 3801.0, 4098.79, 412.544427], [1505044800000, 4069.43, 4283.0, 4043.17, 4130.37, 247.828848], [1505088000000, 4153.62, 4334.43, 4098.91, 4191.53, 494.720202], [1505131200000, 4191.54, 4313.18, 4158.84, 4208.47, 205.268863], [1505174400000, 4208.6, 4394.59, 4201.9, 4340.1, 344.964833], [1505217600000, 4343.01, 4345.92, 4040.8, 4163.72, 534.665486], [1505260800000, 4159.72, 4165.38, 3796.8, 3832.0, 515.871549], [1505304000000, 3831.01, 3991.01, 3760.0, 3944.69, 397.590996], [1505347200000, 3944.0, 3993.0, 3418.0, 3481.02, 697.680912], [1505390400000, 3481.02, 3666.0, 3165.13, 3189.02, 967.340631], [1505433600000, 3188.01, 3460.0, 2817.0, 2919.0, 921.291279], [1505476800000, 2870.9, 3856.0, 2870.9, 3700.0, 1047.575213], [1505520000000, 3674.01, 3950.0, 3470.66, 3630.06, 837.160812], [1505563200000, 3630.06, 3800.0, 3531.01, 3714.95, 460.403141], [1505606400000, 3685.23, 3709.94, 3499.02, 3499.03, 372.606569], [1505649600000, 3499.03, 3748.21, 3499.03, 3699.99, 309.564641], [1505692800000, 3690.0, 4000.0, 3690.0, 3929.33, 507.727306], [1505736000000, 3932.98, 4123.2, 3890.0, 4035.01, 522.279149], [1505779200000, 4060.0, 4089.97, 3830.91, 3969.01, 470.873596], [1505822400000, 3969.32, 4029.99, 3830.91, 3910.04, 431.458533], [1505865600000, 3910.04, 3988.83, 3820.0, 3927.77, 366.425565], [1505908800000, 3927.77, 4046.08, 3860.09, 3900.0, 354.509511], [1505952000000, 3889.99, 3910.0, 3800.0, 3864.95, 346.631619], [1505995200000, 3862.99, 3879.99, 3567.0, 3609.99, 655.022465], [1506038400000, 3592.84, 3750.0, 3522.22, 3539.97, 423.348129], [1506081600000, 3528.36, 3645.99, 3505.55, 3595.87, 415.618296], [1506124800000, 3595.88, 3798.9, 3542.91, 3798.0, 350.638464], [1506168000000, 3798.9, 3817.19, 3700.0, 3780.0, 402.154327], [1506211200000, 3779.54, 3789.99, 3622.76, 3683.36, 402.534833], [1506254400000, 3674.22, 3730.0, 3624.38, 3660.02, 259.101557], [1506297600000, 3660.02, 3815.74, 3653.69, 3781.05, 374.479434], [1506340800000, 3781.05, 3979.87, 3770.0, 3920.75, 353.515279], [1506384000000, 3928.0, 3959.56, 3850.05, 3949.45, 325.348531], [1506427200000, 3950.0, 3976.99, 3880.0, 3882.35, 201.379456], [1506470400000, 3882.36, 4099.95, 3872.81, 4073.0, 278.67384], [1506513600000, 4072.2, 4249.94, 4053.4, 4193.0, 349.497126], [1506556800000, 4192.11, 4300.0, 4136.0, 4180.0, 408.51714], [1506600000000, 4170.19, 4210.0, 4101.0, 4174.5, 441.268185], [1506643200000, 4178.98, 4248.0, 3952.01, 4220.01, 1087.887629], [1506686400000, 4234.99, 4263.86, 4101.01, 4174.69, 514.421936], [1506729600000, 4175.0, 4345.0, 4138.1, 4324.99, 402.256831], [1506772800000, 4320.21, 4380.0, 4275.35, 4378.51, 318.096352], [1506816000000, 4378.49, 4378.49, 4265.02, 4337.01, 306.462599], [1506859200000, 4337.01, 4406.52, 4240.04, 4378.48, 420.501086], [1506902400000, 4400.0, 4560.0, 4380.01, 4410.01, 340.959126], [1506945600000, 4419.99, 4561.63, 4360.0, 4380.0, 314.797848], [1506988800000, 4380.0, 4467.33, 4189.71, 4297.99, 616.898117], [1507032000000, 4290.0, 4329.86, 4180.8, 4310.0, 465.425446], [1507075200000, 4314.9, 4373.0, 4185.01, 4228.0, 431.429838], [1507118400000, 4230.0, 4248.97, 4142.0, 4208.59, 437.035263], [1507161600000, 4208.59, 4235.0, 4110.0, 4226.05, 457.50286], [1507204800000, 4226.05, 4355.0, 4226.05, 4292.43, 321.635778], [1507248000000, 4318.99, 4417.0, 4292.0, 4405.0, 272.798384], [1507291200000, 4391.11, 4416.78, 4312.57, 4369.0, 233.730792], [1507334400000, 4369.0, 4399.0, 4312.56, 4335.9, 163.201498], [1507377600000, 4335.9, 4479.5, 4326.0, 4423.0, 134.396002], [1507420800000, 4425.0, 4517.0, 4425.0, 4487.99, 224.988115], [1507464000000, 4487.99, 4658.0, 4460.02, 4640.0, 293.473889], [1507507200000, 4640.0, 4660.0, 4550.0, 4615.0, 225.114195], [1507550400000, 4615.0, 4889.98, 4615.0, 4786.95, 421.34895], [1507593600000, 4786.95, 4888.88, 4720.16, 4790.0, 354.689845], [1507636800000, 4790.01, 4960.0, 4680.59, 4783.06, 688.531928], [1507680000000, 4783.06, 4852.22, 4710.0, 4818.99, 612.082536], [1507723200000, 4804.93, 4881.61, 4751.01, 4821.43, 141.34686], [1507766400000, 4821.43, 5265.5, 4810.16, 5184.0, 540.763389], [1507809600000, 5184.0, 5439.99, 5173.1, 5430.0, 735.938093], [1507852800000, 5439.99, 5846.17, 5379.84, 5649.0, 1144.376539], [1507896000000, 5658.97, 5800.0, 5520.0, 5649.98, 735.451081], [1507939200000, 5650.0, 5779.0, 5580.01, 5720.02, 485.489902], [1507982400000, 5720.02, 5900.0, 5685.02, 5869.99, 485.269144], [1508025600000, 5855.03, 5922.3, 5400.01, 5400.01, 702.704233], [1508068800000, 5419.0, 5756.36, 5404.98, 5709.99, 640.819142], [1508112000000, 5710.0, 5749.99, 5585.19, 5728.99, 617.754631], [1508155200000, 5739.96, 5788.91, 5642.02, 5760.02, 911.241831], [1508198400000, 5760.0, 5774.98, 5540.02, 5579.98, 660.614057], [1508241600000, 5579.89, 5649.99, 5508.63, 5595.0, 769.255319], [1508284800000, 5595.0, 5596.0, 5226.0, 5273.25, 1232.016577], [1508328000000, 5283.98, 5588.0, 5037.95, 5512.06, 1085.787796], [1508371200000, 5513.0, 5706.09, 5490.26, 5690.12, 815.059989], [1508414400000, 5710.0, 5710.0, 5600.0, 5683.9, 1066.662118], [1508457600000, 5683.31, 5697.99, 5600.0, 5662.75, 725.609429], [1508500800000, 5662.75, 6110.0, 5602.86, 6010.01, 1247.367791], [1508544000000, 6013.72, 6167.99, 5960.0, 6116.98, 876.614657], [1508587200000, 6116.98, 6171.0, 5850.03, 6024.97, 787.693036], [1508630400000, 6003.27, 6060.0, 5720.03, 5819.98, 754.707379], [1508673600000, 5819.98, 6000.0, 5770.04, 5950.02, 607.384837], [1508716800000, 5975.0, 6080.0, 5787.98, 5881.99, 811.419218], [1508760000000, 5881.98, 5969.98, 5621.03, 5915.93, 1001.138497], [1508803200000, 5909.47, 5925.0, 5482.22, 5676.04, 1499.773901], [1508846400000, 5680.0, 5719.03, 5450.0, 5477.03, 1080.644866], [1508889600000, 5506.92, 5650.0, 5286.98, 5469.98, 1297.118019], [1508932800000, 5469.99, 5704.96, 5375.0, 5689.99, 985.695186], [1508976000000, 5670.1, 5853.99, 5650.0, 5853.99, 1018.49149], [1509019200000, 5845.03, 5939.99, 5757.0, 5861.77, 954.474392], [1509062400000, 5861.77, 5980.0, 5770.23, 5843.18, 730.566111], [1509105600000, 5843.03, 5843.04, 5649.24, 5768.83, 673.140305], [1509148800000, 5768.79, 5850.02, 5677.02, 5680.28, 536.136628], [1509192000000, 5680.27, 5733.03, 5630.03, 5719.64, 740.617784], [1509235200000, 5709.98, 5815.84, 5648.01, 5784.97, 683.493896], [1509278400000, 5784.99, 6189.88, 5730.0, 6169.98, 1121.284277], [1509321600000, 6133.01, 6248.68, 6075.5, 6181.98, 815.188764], [1509364800000, 6179.92, 6198.98, 6030.0, 6120.5, 658.498279], [1509408000000, 6120.52, 6223.33, 6100.0, 6223.33, 529.393847], [1509451200000, 6223.41, 6498.01, 6201.01, 6463.0, 982.381078], [1509494400000, 6463.0, 6645.32, 6338.02, 6614.97, 740.549041], [1509537600000, 6613.92, 6774.67, 6455.0, 6753.98, 935.066147], [1509580800000, 6753.98, 7300.0, 6685.1, 6887.81, 1250.153846], [1509624000000, 6887.66, 7132.0, 6700.0, 7019.98, 1253.456957], [1509667200000, 7010.31, 7346.34, 6923.0, 7230.95, 1017.712895], [1509710400000, 7230.95, 7299.99, 7032.0, 7115.04, 873.784697], [1509753600000, 7115.02, 7199.99, 6901.0, 7085.02, 755.013869], [1509796800000, 7085.02, 7480.99, 7085.0, 7357.09, 644.177898], [1509840000000, 7357.27, 7513.82, 7280.0, 7513.82, 504.870937], [1509883200000, 7513.8, 7590.25, 7279.02, 7345.01, 702.961393], [1509926400000, 7345.1, 7401.0, 7101.0, 7304.11, 738.820007], [1509969600000, 7324.97, 7400.98, 6906.0, 6960.12, 1024.199254], [1510012800000, 6981.72, 7198.49, 6909.01, 7160.55, 674.397443], [1510056000000, 7160.54, 7195.0, 6901.0, 7064.04, 765.862051], [1510099200000, 7070.0, 7420.0, 7035.02, 7396.0, 809.633436], [1510142400000, 7406.47, 7770.02, 6651.0, 7303.0, 2012.665366], [1510185600000, 7303.01, 7392.0, 7040.0, 7076.0, 1218.097358], [1510228800000, 7076.0, 7189.89, 7015.0, 7079.99, 695.30095], [1510272000000, 7079.0, 7279.91, 6800.0, 6831.2, 1093.026916], [1510315200000, 6831.2, 6910.0, 6255.01, 6506.98, 2161.677189], [1510358400000, 6503.0, 6797.98, 6402.01, 6410.02, 992.191823], [1510401600000, 6410.02, 6478.0, 6100.0, 6245.05, 1761.965038], [1510444800000, 6245.05, 6630.0, 5325.01, 6241.71, 3486.588714], [1510488000000, 6241.71, 6320.0, 5600.0, 5811.03, 1481.894355], [1510531200000, 5839.94, 6497.99, 5699.99, 6426.02, 1292.107243], [1510574400000, 6426.03, 6697.47, 6190.0, 6465.99, 1329.135796], [1510617600000, 6465.99, 6684.98, 6400.0, 6410.0, 757.301564], [1510660800000, 6410.03, 6593.0, 6311.07, 6574.99, 496.990967], [1510704000000, 6575.99, 6998.0, 6575.99, 6998.0, 830.705491], [1510747200000, 6998.0, 7298.0, 6998.0, 7240.06, 948.900354], [1510790400000, 7240.14, 7546.7, 7076.0, 7380.54, 941.384076], [1510833600000, 7380.53, 7940.0, 7313.0, 7864.5, 1390.572674], [1510876800000, 7876.98, 7989.0, 7451.0, 7765.08, 1896.764189], [1510920000000, 7769.17, 7950.0, 7608.0, 7699.19, 2085.631736], [1510963200000, 7680.01, 7759.48, 7422.0, 7747.96, 1953.540668], [1511006400000, 7747.0, 7819.99, 7602.02, 7761.94, 2000.725809], [1511049600000, 7761.94, 7818.93, 7650.33, 7753.83, 1800.329053], [1511092800000, 7735.49, 8123.15, 7700.0, 8038.0, 2067.011391], [1511136000000, 8057.11, 8083.49, 7954.0, 8057.01, 1932.803385], [1511179200000, 8066.98, 8319.99, 8057.53, 8212.0, 1953.830963], [1511222400000, 8212.49, 8290.0, 7801.0, 8241.06, 2810.165596], [1511265600000, 8252.25, 8400.0, 8070.0, 8119.51, 1734.30842], [1511308800000, 8091.09, 8322.68, 8091.09, 8270.02, 1942.335711], [1511352000000, 8270.12, 8290.0, 8108.0, 8205.92, 1602.669999], [1511395200000, 8233.03, 8260.0, 8031.01, 8099.97, 2047.828749], [1511438400000, 8099.95, 8200.0, 8000.0, 8019.99, 2046.123938], [1511481600000, 8019.97, 8369.0, 7850.0, 8130.73, 2624.665845], [1511524800000, 8165.0, 8250.0, 8079.0, 8138.0, 1787.123267], [1511568000000, 8138.99, 8448.99, 8090.0, 8419.54, 2008.973153], [1511611200000, 8419.54, 8734.78, 8394.49, 8700.01, 2283.650529], [1511654400000, 8700.04, 8978.9, 8604.72, 8903.01, 1962.589857], [1511697600000, 8903.03, 9350.0, 8870.01, 9128.02, 2184.79038], [1511740800000, 9128.0, 9654.28, 9112.04, 9498.99, 2426.564417], [1511784000000, 9485.02, 9650.0, 9355.01, 9650.0, 2095.06129], [1511827200000, 9650.0, 9930.0, 9570.5, 9915.0, 2421.672188], [1511870400000, 9919.61, 9939.0, 9658.0, 9896.8, 2495.538797], [1511913600000, 9896.79, 10900.0, 9873.68, 10776.3, 3615.669183], [1511956800000, 10798.53, 11300.03, 8520.0, 9687.88, 9736.869532], [1512000000000, 9687.88, 10900.0, 9402.15, 9600.0, 4973.888966], [1512043200000, 9610.01, 10089.99, 8850.8, 9838.96, 4415.685363], [1512086400000, 9837.0, 10000.0, 9380.0, 9956.24, 2794.545695], [1512129600000, 9960.01, 10898.0, 9960.01, 10782.99, 3340.377938], [1512172800000, 10775.04, 11190.0, 10650.0, 10940.98, 2897.011454], [1512216000000, 10949.0, 11111.1, 10620.0, 10890.01, 1868.428303], [1512259200000, 10902.69, 11620.0, 10799.0, 11615.99, 2082.801417], [1512302400000, 11601.97, 11825.0, 10500.0, 11165.41, 3263.835107], [1512345600000, 11165.41, 11600.0, 11003.0, 11120.82, 1931.412763], [1512388800000, 11120.7, 11579.0, 10802.0, 11579.0, 2732.011799], [1512432000000, 11571.03, 11798.0, 11447.68, 11664.0, 2746.33073], [1512475200000, 11652.0, 11853.0, 11561.01, 11699.99, 2804.401325], [1512518400000, 11699.99, 12920.0, 11665.58, 12593.96, 3283.270557], [1512561600000, 12620.0, 13615.23, 12220.0, 13550.05, 3424.675762], [1512604800000, 13541.01, 14788.0, 13050.0, 13799.98, 3645.983716], [1512648000000, 13799.95, 16649.96, 13702.0, 16599.0, 3841.081979], [1512691200000, 16599.0, 17204.99, 14015.0, 14834.98, 8866.297629], [1512734400000, 14849.99, 15998.98, 14412.65, 15880.0, 8722.715507], [1512777600000, 15880.01, 16269.3, 14203.0, 14700.01, 7006.778075], [1512820800000, 14700.03, 15100.0, 12535.0, 14656.07, 6911.980612], [1512864000000, 14664.01, 14699.97, 12368.0, 13560.55, 8306.689606], [1512907200000, 13560.55, 15720.12, 13357.98, 14899.98, 8246.347567], [1512950400000, 14946.26, 16689.0, 14901.08, 16052.02, 6747.066559], [1512993600000, 16052.05, 17470.0, 16000.01, 16587.97, 5073.335203], [1513036800000, 16587.97, 16976.45, 16200.0, 16600.0, 4863.781458], [1513080000000, 16600.0, 16839.67, 15875.0, 16349.99, 4573.020953], [1513123200000, 16349.99, 16546.0, 14666.56, 15842.17, 5514.687688], [1513166400000, 15851.07, 16420.35, 14853.68, 16033.29, 6901.641113], [1513209600000, 16030.34, 16445.0, 15450.0, 16099.0, 6473.841094], [1513252800000, 16098.95, 16439.99, 15651.0, 16334.98, 5143.026057], [1513296000000, 16334.98, 17982.22, 16298.45, 17900.0, 5189.895613], [1513339200000, 17900.0, 17991.0, 17240.0, 17539.83, 3991.378334], [1513382400000, 17516.81, 17898.0, 17190.01, 17829.99, 1874.835858], [1513425600000, 17830.0, 19539.0, 17800.01, 19102.66, 2327.792851], [1513468800000, 19120.19, 19710.0, 18800.0, 19709.5, 4126.735807], [1513512000000, 19709.5, 19798.68, 18510.0, 18860.02, 5050.447627], [1513555200000, 18860.04, 19200.1, 17029.98, 19126.66, 6318.378612], [1513598400000, 19116.11, 19300.0, 18021.98, 18856.25, 4306.254459], [1513641600000, 18856.25, 18950.0, 16300.0, 17250.0, 6638.2445], [1513684800000, 17214.2, 18185.18, 16500.0, 17295.2, 6572.50372], [1513728000000, 17295.2, 17450.0, 14777.66, 17253.0, 9466.01197], [1513771200000, 17253.0, 17720.35, 15830.13, 16488.98, 3984.484723], [1513814400000, 16480.52, 17309.5, 16249.98, 16490.99, 7320.419451], [1513857600000, 16491.0, 16658.03, 14022.0, 15492.64, 13003.797849], [1513900800000, 15514.03, 15699.34, 12200.0, 13456.0, 19700.157832], [1513944000000, 13449.1, 14649.99, 10961.0, 13326.61, 16376.113343], [1513987200000, 13326.61, 14650.0, 12978.18, 14642.99, 6852.421106], [1514030400000, 14640.0, 14950.0, 13234.56, 13300.0, 6289.117769], [1514073600000, 13300.0, 13819.99, 11866.38, 12345.89, 15729.830106], [1514116800000, 12345.89, 13570.0, 11640.0, 13500.0, 12827.704882], [1514160000000, 13500.0, 13970.0, 12708.0, 13800.0, 9938.999552], [1514203200000, 13808.11, 14300.0, 13059.0, 13699.34, 5809.208055], [1514246400000, 13699.34, 15350.0, 13533.0, 14849.98, 9907.340452], [1514289600000, 14844.0, 16050.0, 14660.0, 15689.01, 5127.327652], [1514332800000, 15709.98, 16498.05, 15250.59, 15570.13, 6191.208379], [1514376000000, 15570.11, 15978.0, 14200.15, 15459.99, 8768.656344], [1514419200000, 15459.97, 15539.99, 13150.0, 13578.98, 13129.568368], [1514462400000, 13578.98, 14305.0, 13190.0, 14182.11, 8588.289646], [1514505600000, 14199.14, 14981.0, 13850.0, 14280.01, 9044.444098], [1514548800000, 14290.0, 14797.0, 13900.0, 14378.9, 9027.564018], [1514592000000, 14378.99, 14398.85, 12810.0, 13150.0, 9046.238476], [1514635200000, 13119.03, 13200.0, 11750.0, 12440.01, 10174.919563], [1514678400000, 12345.1, 13411.02, 12149.98, 12989.94, 6044.632104], [1514721600000, 12956.49, 14050.11, 12870.01, 13716.36, 5724.357614], [1514764800000, 13715.65, 13818.55, 13001.13, 13220.56, 4298.175574], [1514808000000, 13220.56, 13599.7, 12750.0, 13380.0, 4311.74027], [1514851200000, 13382.16, 13850.0, 12890.02, 13490.0, 7942.031653], [1514894400000, 13490.0, 15473.49, 13450.46, 14675.11, 12136.060458], [1514937600000, 14690.0, 15307.56, 14150.0, 14730.05, 10718.338599], [1514980800000, 14764.73, 15130.0, 14400.04, 14919.51, 5187.32904], [1515024000000, 14919.51, 15280.0, 13918.04, 14539.97, 10241.988139], [1515067200000, 14539.99, 15100.08, 14181.88, 15059.54, 11087.661435], [1515110400000, 15059.56, 16350.0, 14600.0, 16090.69, 11294.798231], [1515153600000, 16090.7, 17176.24, 15750.0, 16960.39, 11956.692894], [1515196800000, 16960.39, 17099.99, 16288.0, 16529.89, 8981.698935], [1515240000000, 16505.16, 17143.13, 16011.21, 17069.79, 9589.758573], [1515283200000, 17069.79, 17099.96, 16400.0, 16607.0, 7403.574371], [1515326400000, 16611.0, 16649.05, 15610.0, 16150.03, 5089.551187], [1515369600000, 16218.85, 16322.3, 14551.0, 15400.0, 11135.487957], [1515412800000, 15414.0, 15499.0, 12812.0, 14902.54, 15465.121955], [1515456000000, 14902.54, 15500.0, 14170.33, 14726.0, 6915.746339], [1515499200000, 14726.0, 14998.62, 14011.05, 14400.0, 7399.257914], [1515542400000, 14401.0, 14480.0, 13131.31, 13919.08, 10480.794851], [1515585600000, 13919.09, 14955.66, 13500.0, 14907.09, 6930.206804], [1515628800000, 14940.0, 14968.68, 11400.0, 13385.1, 21529.06521], [1515672000000, 13385.1, 14400.0, 12511.0, 13238.78, 12025.658541], [1515715200000, 13238.76, 14109.78, 12500.0, 13900.02, 9484.14553], [1515758400000, 13900.02, 14059.48, 13222.0, 13740.01, 6933.016607], [1515801600000, 13749.95, 14320.0, 13706.15, 14178.0, 6634.900254], [1515844800000, 14166.0, 14580.0, 13923.18, 14210.0, 5586.608274], [1515888000000, 14210.0, 14339.5, 13120.0, 13280.15, 6730.424273], [1515931200000, 13280.16, 13600.8, 12569.2, 13474.99, 10287.470056], [1515974400000, 13477.98, 13740.27, 13147.79, 13644.9, 7164.920931], [1516017600000, 13645.0, 14249.99, 13340.64, 13539.93, 7487.173774], [1516060800000, 13500.0, 13542.93, 10620.88, 12127.16, 27884.803734], [1516104000000, 12140.0, 12200.0, 9035.0, 10900.0, 35516.365441], [1516147200000, 10899.99, 11488.88, 9587.99, 9808.14, 30824.333764], [1516190400000, 9850.76, 11680.99, 9037.94, 10988.79, 41507.462882], [1516233600000, 10972.59, 11600.0, 10435.33, 11413.78, 24374.244577], [1516276800000, 11413.78, 11878.82, 10635.3, 10961.97, 24090.19036], [1516320000000, 10960.0, 11596.0, 10360.0, 11530.22, 19618.529984], [1516363200000, 11535.18, 11795.0, 11003.0, 11474.98, 14510.845437], [1516406400000, 11474.98, 12869.0, 11412.45, 12320.01, 17827.410658], [1516449600000, 12320.05, 13099.0, 12240.24, 12799.94, 10941.447169], [1516492800000, 12799.8, 12799.8, 11300.0, 12194.18, 21797.525396], [1516536000000, 12194.18, 12291.35, 10965.0, 11530.0, 19582.24803], [1516579200000, 11530.0, 11926.35, 11149.0, 11240.0, 13986.752561], [1516622400000, 11240.0, 11380.0, 9900.24, 10760.05, 29765.85423], [1516665600000, 10760.05, 10998.0, 9905.0, 10143.1, 17256.600972], [1516708800000, 10143.01, 11399.0, 9987.02, 10799.18, 20217.32158], [1516752000000, 10799.14, 11234.0, 10500.0, 11111.0, 12876.304091], [1516795200000, 11111.0, 11570.48, 10862.08, 11349.99, 14282.283671], [1516838400000, 11349.96, 11794.05, 11147.07, 11215.0, 11488.793953], [1516881600000, 11215.0, 11395.0, 10950.21, 11175.27, 9351.16023], [1516924800000, 11184.7, 11643.0, 10311.15, 10513.97, 17937.807726], [1516968000000, 10510.0, 11399.0, 10410.0, 11089.0, 15119.064234], [1517011200000, 11089.0, 11400.0, 10842.69, 11020.0, 9190.499299], [1517054400000, 11018.0, 11650.0, 10968.18, 11491.0, 9670.269046], [1517097600000, 11499.98, 12244.0, 11408.0, 12012.62, 10060.951174], [1517140800000, 12001.94, 12079.9, 11652.0, 11879.95, 6826.38835], [1517184000000, 11879.95, 11975.02, 11139.55, 11279.99, 9258.759356], [1517227200000, 11272.01, 11499.0, 11150.0, 11251.0, 4911.618182], [1517270400000, 11250.11, 11308.42, 10850.0, 11047.34, 6459.968361], [1517313600000, 11050.34, 11096.0, 9900.0, 10237.51, 19094.404585], [1517356800000, 10230.0, 10363.0, 9700.0, 10290.05, 12092.427593], [1517400000000, 10294.97, 10425.85, 9860.0, 10285.1, 5923.529212], [1517443200000, 10285.1, 10335.0, 9500.0, 9591.44, 11690.981262], [1517486400000, 9591.45, 9665.58, 8750.99, 9224.52, 21873.783049], [1517529600000, 9224.52, 9250.0, 8250.92, 8299.75, 20221.802637], [1517572800000, 8299.75, 9247.79, 8010.02, 8873.03, 29749.824338], [1517616000000, 8873.03, 9123.0, 8229.0, 9099.87, 14313.583355], [1517659200000, 9099.87, 9473.01, 8969.0, 9199.96, 14411.41738], [1517702400000, 9199.96, 9368.0, 8687.45, 8691.99, 10563.979369], [1517745600000, 8691.99, 8894.12, 7930.0, 8184.81, 21450.32908], [1517788800000, 8179.99, 8382.8, 7510.0, 7578.0, 19434.947927], [1517832000000, 7572.32, 7788.87, 6625.0, 6939.99, 43968.234652], [1517875200000, 6939.63, 7150.0, 6000.01, 6559.0, 50517.874547], [1517918400000, 6559.0, 7878.0, 6435.99, 7652.14, 49683.62576], [1517961600000, 7655.02, 8274.0, 7150.01, 8151.53, 30434.619906], [1518004800000, 8138.05, 8476.0, 7531.11, 7599.0, 30343.840591], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518134400000, 7789.9, 8395.0, 7789.9, 8280.11, 3483.805239], [1518177600000, 8288.03, 8738.0, 8201.95, 8683.92, 16999.105586], [1518220800000, 8683.93, 9065.78, 8470.0, 8635.99, 22895.635111], [1518264000000, 8626.12, 8800.0, 8120.0, 8533.98, 26485.877542], [1518307200000, 8533.99, 8549.0, 7726.53, 8140.0, 24411.736125], [1518350400000, 8139.99, 8500.85, 8015.0, 8063.88, 20613.451827], [1518393600000, 8063.82, 8840.82, 8053.0, 8640.01, 22078.429223], [1518436800000, 8640.01, 8989.0, 8502.0, 8903.0, 19909.421267], [1518480000000, 8903.0, 8950.0, 8351.0, 8531.47, 21027.353261], [1518523200000, 8525.08, 8725.0, 8450.0, 8539.9, 14427.619695], [1518566400000, 8535.17, 8930.65, 8533.0, 8927.0, 14985.070283], [1518609600000, 8929.96, 9489.6, 8924.87, 9449.99, 25826.882584], [1518652800000, 9449.98, 9925.17, 9301.5, 9566.56, 27576.042121], [1518696000000, 9560.01, 10219.5, 9560.01, 10000.09, 24851.554594], [1518739200000, 10000.89, 10323.37, 9666.0, 9799.43, 21560.129088], [1518782400000, 9796.01, 10213.3, 9740.0, 10159.98, 16601.076886], [1518825600000, 10156.07, 10877.91, 10050.0, 10683.0, 23500.265321], [1518868800000, 10683.0, 11075.07, 10499.86, 11039.55, 18381.843086], [1518912000000, 11039.55, 11274.0, 10080.0, 10550.0, 36539.672972], [1518955200000, 10550.0, 10874.99, 10331.0, 10383.43, 24597.707756], [1518998400000, 10375.01, 11031.31, 10270.33, 10918.84, 20886.987828], [1519041600000, 10918.84, 11250.0, 10855.0, 11153.0, 19944.429303], [1519084800000, 11147.11, 11650.0, 11141.0, 11400.0, 23703.107287], [1519128000000, 11408.88, 11786.01, 11100.59, 11200.99, 24450.247001], [1519171200000, 11195.07, 11304.03, 10620.0, 10948.0, 33161.448466], [1519214400000, 10948.02, 11109.0, 10200.0, 10437.6, 34952.370288], [1519257600000, 10439.02, 10933.44, 10076.0, 10259.87, 28347.788733], [1519300800000, 10260.0, 10318.0, 9679.0, 9811.04, 38712.37775], [1519344000000, 9815.55, 10230.0, 9570.19, 10180.06, 30086.989335], [1519387200000, 10180.06, 10435.0, 9857.75, 10131.04, 27115.713035], [1519430400000, 10131.04, 10496.97, 9669.94, 9757.0, 22996.470889], [1519473600000, 9757.0, 9839.0, 9352.0, 9694.51, 17891.68541], [1519516800000, 9694.51, 9847.0, 9487.0, 9665.99, 12961.051082], [1519560000000, 9663.98, 9700.0, 9274.8, 9590.0, 15412.466504], [1519603200000, 9590.0, 9754.98, 9350.0, 9715.99, 12523.478504], [1519646400000, 9708.0, 10444.32, 9640.01, 10324.0, 22354.814252], [1519689600000, 10321.0, 10780.0, 10121.0, 10695.0, 16624.208161], [1519732800000, 10698.97, 10870.0, 10463.18, 10569.04, 14081.176962], [1519776000000, 10584.33, 11098.0, 10476.28, 10570.95, 17690.212364], [1519819200000, 10574.13, 10722.0, 10300.0, 10326.76, 13110.771418], [1519862400000, 10325.64, 10745.0, 10240.0, 10671.93, 11137.264051], [1519905600000, 10671.93, 11060.41, 10591.16, 10920.0, 13955.289879], [1519948800000, 10923.36, 11200.0, 10826.52, 10898.95, 14483.02185], [1519992000000, 10898.95, 11130.0, 10770.0, 11039.0, 9427.68824], [1520035200000, 11038.99, 11415.16, 11015.01, 11287.21, 11461.852578], [1520078400000, 11287.21, 11544.0, 11268.0, 11464.48, 9825.300702], [1520121600000, 11464.47, 11470.0, 11050.02, 11159.68, 8925.651671], [1520164800000, 11159.68, 11565.0, 11090.01, 11515.0, 8370.266982], [1520208000000, 11515.0, 11608.0, 11415.01, 11515.0, 6935.609779], [1520251200000, 11515.0, 11710.0, 11441.78, 11454.0, 8208.621284], [1520294400000, 11455.0, 11455.0, 10840.01, 10937.0, 13938.095332], [1520337600000, 10936.0, 11046.24, 10555.48, 10716.48, 15577.477031], [1520380800000, 10716.48, 10899.0, 10400.0, 10635.03, 13225.753669], [1520424000000, 10635.6, 10747.88, 9389.31, 9910.0, 37421.917411], [1520467200000, 9910.0, 10099.0, 9470.0, 9910.09, 17131.415417], [1520510400000, 9902.98, 9968.75, 9060.0, 9271.64, 23978.057809], [1520553600000, 9267.07, 9410.0, 8329.0, 8923.0, 36360.799801], [1520596800000, 8933.91, 9333.33, 8630.0, 9227.0, 27751.491606], [1520640000000, 9230.0, 9490.0, 9073.66, 9345.0, 17807.189099], [1520683200000, 9345.0, 9468.88, 8667.07, 8770.22, 19372.823758], [1520726400000, 8770.22, 9100.66, 8450.0, 9027.68, 17635.444572], [1520769600000, 9025.03, 9740.0, 9015.11, 9533.57, 26690.528814], [1520812800000, 9533.57, 9888.88, 9356.02, 9837.03, 15357.95411], [1520856000000, 9837.04, 9838.0, 8780.0, 9131.34, 26872.82382], [1520899200000, 9131.34, 9474.0, 8870.0, 9044.9, 20406.743269], [1520942400000, 9049.47, 9275.0, 8823.0, 9150.0, 19784.666089], [1520985600000, 9151.92, 9333.78, 8631.78, 8675.08, 16943.956747], [1521028800000, 8675.08, 8791.49, 7900.28, 8170.0, 32764.137361], [1521072000000, 8184.01, 8299.0, 7650.0, 8235.0, 28181.483706], [1521115200000, 8235.0, 8430.0, 7925.15, 8240.98, 24109.538571], [1521158400000, 8240.98, 8324.96, 7900.0, 8192.94, 18147.798111], [1521201600000, 8182.07, 8611.64, 8139.02, 8260.0, 20667.611782], [1521244800000, 8260.0, 8348.62, 8078.0, 8158.0, 12971.273087], [1521288000000, 8158.01, 8177.93, 7721.99, 7824.8, 20138.933242], [1521331200000, 7824.01, 7857.24, 7519.84, 7760.09, 20558.719457], [1521374400000, 7761.19, 8317.4, 7322.0, 8189.99, 38929.512254], [1521417600000, 8189.0, 8456.0, 8088.4, 8330.0, 24954.710371], [1521460800000, 8330.0, 8705.23, 8205.01, 8600.0, 30342.374571], [1521504000000, 8595.01, 8667.0, 8280.0, 8516.0, 19638.280507], [1521547200000, 8517.44, 9050.0, 8429.0, 8909.98, 25226.825328], [1521590400000, 8909.96, 9145.3, 8860.01, 9063.0, 16467.913268], [1521633600000, 9063.0, 9177.01, 8750.6, 8885.0, 23504.492103], [1521676800000, 8884.82, 9100.0, 8620.0, 8642.01, 18884.016321], [1521720000000, 8645.0, 8770.0, 8465.1, 8722.9, 21733.540488], [1521763200000, 8720.0, 8729.5, 8330.0, 8510.0, 18943.824484], [1521806400000, 8509.99, 8909.0, 8269.0, 8898.03, 21047.183182], [1521849600000, 8898.04, 8987.97, 8683.0, 8723.0, 16517.960112], [1521892800000, 8723.0, 8999.95, 8491.0, 8546.86, 18948.64946], [1521936000000, 8531.25, 8599.0, 8365.77, 8407.0, 14196.614337], [1521979200000, 8408.0, 8669.85, 8380.41, 8470.15, 14805.154979], [1522022400000, 8470.14, 8514.89, 8050.0, 8089.0, 17456.695255], [1522065600000, 8089.0, 8268.5, 7831.0, 8134.23, 26576.900405], [1522108800000, 8134.22, 8215.94, 7730.0, 7934.22, 19666.011903], [1522152000000, 7932.2, 8150.17, 7755.58, 7795.51, 17761.636147], [1522195200000, 7795.51, 8109.0, 7728.0, 8040.0, 13622.827428], [1522238400000, 8040.0, 8055.99, 7825.0, 7949.3, 12778.504242], [1522281600000, 7949.3, 7975.0, 7425.4, 7466.97, 21442.95771], [1522324800000, 7466.89, 7580.0, 6941.11, 7090.14, 33177.957415], [1522368000000, 7090.16, 7292.43, 6666.66, 7027.72, 37577.898142], [1522411200000, 7027.73, 7040.01, 6600.1, 6840.23, 27728.133834], [1522454400000, 6840.24, 7148.2, 6777.0, 7073.63, 20263.488808], [1522497600000, 7079.72, 7223.36, 6842.97, 6923.91, 16605.050279], [1522540800000, 6922.0, 7049.98, 6623.97, 6685.1, 14578.838833], [1522584000000, 6688.53, 6961.83, 6430.0, 6813.01, 29492.59163], [1522627200000, 6813.01, 7125.0, 6765.0, 7046.01, 16763.392279], [1522670400000, 7046.0, 7070.0, 6873.32, 7056.0, 15360.167793], [1522713600000, 7063.97, 7447.99, 7011.01, 7307.48, 20247.387067], [1522756800000, 7302.03, 7520.0, 7277.0, 7405.21, 17539.944744], [1522800000000, 7405.21, 7427.52, 7001.0, 7058.0, 20139.322048], [1522843200000, 7055.0, 7123.98, 6707.0, 6796.1, 22087.861756], [1522886400000, 6796.1, 6902.0, 6566.69, 6779.0, 20658.831999], [1522929600000, 6778.99, 6899.0, 6612.11, 6770.76, 18370.899461], [1522972800000, 6770.0, 6850.0, 6500.0, 6600.0, 17299.40651], [1523016000000, 6600.0, 6634.88, 6516.67, 6601.39, 10155.60541], [1523059200000, 6601.39, 6929.86, 6586.28, 6862.04, 16223.885991], [1523102400000, 6862.04, 7070.0, 6760.0, 6895.8, 16045.692276], [1523145600000, 6895.81, 7100.0, 6880.0, 7099.85, 10649.784758], [1523188800000, 7100.0, 7109.13, 6937.03, 7018.0, 10777.888407], [1523232000000, 7011.04, 7185.0, 6691.18, 6745.0, 19507.74773], [1523275200000, 6740.0, 6795.0, 6611.0, 6782.72, 14570.549476], [1523318400000, 6781.55, 6820.0, 6656.0, 6735.0, 10808.334848], [1523361600000, 6735.0, 6890.0, 6719.91, 6843.9, 11518.393247], [1523404800000, 6839.56, 6872.71, 6787.0, 6851.97, 10255.173843], [1523448000000, 6851.53, 6990.0, 6840.0, 6953.79, 13742.697334], [1523491200000, 6953.78, 8012.23, 6743.2, 7690.0, 31646.817637], [1523534400000, 7685.55, 7986.1, 7542.0, 7923.0, 33214.77835], [1523577600000, 7922.99, 8195.84, 7732.0, 8091.0, 27022.676585], [1523620800000, 8091.4, 8233.39, 7768.47, 7877.41, 28021.846563], [1523664000000, 7877.48, 8186.0, 7810.0, 7965.32, 17721.661899], [1523707200000, 7965.0, 8090.23, 7849.46, 7999.01, 13899.624458], [1523750400000, 8004.0, 8429.54, 7999.02, 8330.0, 14948.629189], [1523793600000, 8330.0, 8380.0, 8230.0, 8355.0, 12998.091255], [1523836800000, 8355.07, 8419.0, 8000.0, 8086.0, 20076.570217], [1523880000000, 8086.0, 8087.11, 7867.0, 8064.92, 16587.499498], [1523923200000, 8064.92, 8173.7, 7956.17, 8124.87, 14532.045928], [1523966400000, 8124.87, 8156.0, 7825.4, 7885.02, 17620.557639], [1524009600000, 7890.96, 8149.89, 7868.0, 8103.0, 12531.287874], [1524052800000, 8104.0, 8236.43, 7931.01, 8173.0, 14437.756696], [1524096000000, 8173.99, 8290.0, 8080.0, 8207.01, 15270.818441], [1524139200000, 8207.0, 8296.0, 8171.56, 8278.0, 11843.029023], [1524182400000, 8273.84, 8540.37, 8177.09, 8515.01, 20736.89308], [1524225600000, 8515.0, 8930.0, 8431.86, 8856.98, 19058.444405], [1524268800000, 8852.12, 9035.0, 8565.0, 8700.0, 26058.186328], [1524312000000, 8700.01, 8930.0, 8680.0, 8915.31, 14814.043581], [1524355200000, 8915.31, 9020.0, 8786.8, 8916.01, 12368.081112], [1524398400000, 8916.01, 9020.67, 8727.68, 8787.02, 17090.172368], [1524441600000, 8785.7, 8970.01, 8745.0, 8910.02, 13631.125276], [1524484800000, 8910.02, 8985.0, 8800.6, 8934.01, 12206.989433], [1524528000000, 8934.0, 9349.0, 8922.0, 9294.57, 20615.802073], [1524571200000, 9294.59, 9731.01, 9155.0, 9619.99, 25652.988033], [1524614400000, 9618.96, 9759.82, 8960.0, 9144.03, 45362.929231], [1524657600000, 9137.0, 9210.21, 8730.0, 8869.99, 35747.108358], [1524700800000, 8869.99, 8977.0, 8651.62, 8857.01, 24608.392709], [1524744000000, 8858.51, 9307.48, 8740.01, 9266.0, 18691.911536], [1524787200000, 9267.03, 9395.0, 9104.88, 9309.0, 17631.888624], [1524830400000, 9308.9, 9355.0, 8889.0, 8915.35, 19609.458412], [1524873600000, 8915.35, 9330.0, 8870.0, 9289.98, 15312.14062]], "1d": [[1502928000000, 4261.48, 4485.39, 4200.74, 4285.08, 795.150377], [1503014400000, 4285.08, 4371.52, 3938.77, 4108.37, 1199.888264], [1503100800000, 4108.37, 4184.69, 3850.0, 4139.98, 381.309763], [1503187200000, 4120.98, 4211.08, 4032.62, 4086.29, 467.083022], [1503273600000, 4069.13, 4119.62, 3911.79, 4016.0, 691.74306], [1503360000000, 4016.0, 4104.82, 3400.0, 4040.0, 966.684858], [1503446400000, 4040.0, 4265.8, 4013.89, 4114.01, 1001.136565], [1503532800000, 4147.0, 4371.68, 4085.01, 4316.01, 787.418753], [1503619200000, 4316.01, 4453.91, 4247.48, 4280.68, 573.61274], [1503705600000, 4280.71, 4367.0, 4212.41, 4337.44, 228.108068], [1503792000000, 4332.51, 4400.0, 4285.54, 4310.01, 350.692585], [1503878400000, 4310.01, 4399.82, 4124.54, 4386.69, 603.841616], [1503964800000, 4353.65, 4625.85, 4313.55, 4587.48, 603.545028], [1504051200000, 4564.52, 4647.51, 4416.01, 4555.14, 808.468771], [1504137600000, 4555.14, 4745.42, 4555.14, 4724.89, 556.956802], [1504224000000, 4689.89, 4885.55, 4654.88, 4834.91, 560.666366], [1504310400000, 4796.16, 4939.19, 4286.87, 4472.14, 929.148595], [1504396800000, 4508.5, 4714.76, 4298.33, 4509.08, 691.216198], [1504483200000, 4505.0, 4527.49, 3972.51, 4100.11, 1394.644614], [1504569600000, 4106.97, 4484.99, 3603.0, 4366.47, 1228.938157], [1504656000000, 4366.49, 4662.87, 4335.26, 4619.77, 807.363726], [1504742400000, 4619.77, 4788.59, 4438.19, 4691.61, 500.429975], [1504828800000, 4691.66, 4735.39, 4028.93, 4282.8, 1132.255046], [1504915200000, 4282.8, 4426.62, 4150.06, 4258.81, 658.782952], [1505001600000, 4258.81, 4283.0, 3801.0, 4130.37, 660.373275], [1505088000000, 4153.62, 4334.43, 4098.91, 4208.47, 699.989065], [1505174400000, 4208.6, 4394.59, 4040.8, 4163.72, 879.630319], [1505260800000, 4159.72, 4165.38, 3760.0, 3944.69, 913.462545], [1505347200000, 3944.0, 3993.0, 3165.13, 3189.02, 1665.021543], [1505433600000, 3188.01, 3856.0, 2817.0, 3700.0, 1968.866492], [1505520000000, 3674.01, 3950.0, 3470.66, 3714.95, 1297.563953], [1505606400000, 3685.23, 3748.21, 3499.02, 3699.99, 682.17121], [1505692800000, 3690.0, 4123.2, 3690.0, 4035.01, 1030.006455], [1505779200000, 4060.0, 4089.97, 3830.91, 3910.04, 902.332129], [1505865600000, 3910.04, 4046.08, 3820.0, 3900.0, 720.935076], [1505952000000, 3889.99, 3910.0, 3567.0, 3609.99, 1001.654084], [1506038400000, 3592.84, 3750.0, 3505.55, 3595.87, 838.966425], [1506124800000, 3595.88, 3817.19, 3542.91, 3780.0, 752.792791], [1506211200000, 3779.54, 3789.99, 3622.76, 3660.02, 661.63639], [1506297600000, 3660.02, 3979.87, 3653.69, 3920.75, 727.994713], [1506384000000, 3928.0, 3976.99, 3850.05, 3882.35, 526.727987], [1506470400000, 3882.36, 4249.94, 3872.81, 4193.0, 628.170966], [1506556800000, 4192.11, 4300.0, 4101.0, 4174.5, 849.785325], [1506643200000, 4178.98, 4263.86, 3952.01, 4174.69, 1602.309565], [1506729600000, 4175.0, 4380.0, 4138.1, 4378.51, 720.353183], [1506816000000, 4378.49, 4406.52, 4240.04, 4378.48, 726.963685], [1506902400000, 4400.0, 4561.63, 4360.0, 4380.0, 655.756974], [1506988800000, 4380.0, 4467.33, 4180.8, 4310.0, 1082.323563], [1507075200000, 4314.9, 4373.0, 4142.0, 4208.59, 868.465101], [1507161600000, 4208.59, 4355.0, 4110.0, 4292.43, 779.138638], [1507248000000, 4318.99, 4417.0, 4292.0, 4369.0, 506.529176], [1507334400000, 4369.0, 4479.5, 4312.56, 4423.0, 297.5975], [1507420800000, 4425.0, 4658.0, 4425.0, 4640.0, 518.462004], [1507507200000, 4640.0, 4889.98, 4550.0, 4786.95, 646.463145], [1507593600000, 4786.95, 4960.0, 4680.59, 4783.06, 1043.221773], [1507680000000, 4783.06, 4881.61, 4710.0, 4821.43, 753.429396], [1507766400000, 4821.43, 5439.99, 4810.16, 5430.0, 1276.701482], [1507852800000, 5439.99, 5846.17, 5379.84, 5649.98, 1879.82762], [1507939200000, 5650.0, 5900.0, 5580.01, 5869.99, 970.759046], [1508025600000, 5855.03, 5922.3, 5400.01, 5709.99, 1343.523375], [1508112000000, 5710.0, 5788.91, 5585.19, 5760.02, 1528.996462], [1508198400000, 5760.0, 5774.98, 5508.63, 5595.0, 1429.869376], [1508284800000, 5595.0, 5596.0, 5037.95, 5512.06, 2317.804373], [1508371200000, 5513.0, 5710.0, 5490.26, 5683.9, 1881.722107], [1508457600000, 5683.31, 6110.0, 5600.0, 6010.01, 1972.97722], [1508544000000, 6013.72, 6171.0, 5850.03, 6024.97, 1664.307693], [1508630400000, 6003.27, 6060.0, 5720.03, 5950.02, 1362.092216], [1508716800000, 5975.0, 6080.0, 5621.03, 5915.93, 1812.557715], [1508803200000, 5909.47, 5925.0, 5450.0, 5477.03, 2580.418767], [1508889600000, 5506.92, 5704.96, 5286.98, 5689.99, 2282.813205], [1508976000000, 5670.1, 5939.99, 5650.0, 5861.77, 1972.965882], [1509062400000, 5861.77, 5980.0, 5649.24, 5768.83, 1403.706416], [1509148800000, 5768.79, 5850.02, 5630.03, 5719.64, 1276.754412], [1509235200000, 5709.98, 6189.88, 5648.01, 6169.98, 1804.778173], [1509321600000, 6133.01, 6248.68, 6030.0, 6120.5, 1473.687043], [1509408000000, 6120.52, 6498.01, 6100.0, 6463.0, 1511.774925], [1509494400000, 6463.0, 6774.67, 6338.02, 6753.98, 1675.615188], [1509580800000, 6753.98, 7300.0, 6685.1, 7019.98, 2503.610803], [1509667200000, 7010.31, 7346.34, 6923.0, 7115.04, 1891.497592], [1509753600000, 7115.02, 7480.99, 6901.0, 7357.09, 1399.191767], [1509840000000, 7357.27, 7590.25, 7279.02, 7345.01, 1207.83233], [1509926400000, 7345.1, 7401.0, 6906.0, 6960.12, 1763.019261], [1510012800000, 6981.72, 7198.49, 6901.0, 7064.04, 1440.259494], [1510099200000, 7070.0, 7770.02, 6651.0, 7303.0, 2822.298802], [1510185600000, 7303.01, 7392.0, 7015.0, 7079.99, 1913.398308], [1510272000000, 7079.0, 7279.91, 6255.01, 6506.98, 3254.704105], [1510358400000, 6503.0, 6797.98, 6100.0, 6245.05, 2754.156861], [1510444800000, 6245.05, 6630.0, 5325.01, 5811.03, 4968.483069], [1510531200000, 5839.94, 6697.47, 5699.99, 6465.99, 2621.243039], [1510617600000, 6465.99, 6684.98, 6311.07, 6574.99, 1254.292531], [1510704000000, 6575.99, 7298.0, 6575.99, 7240.06, 1779.605845], [1510790400000, 7240.14, 7940.0, 7076.0, 7864.5, 2331.95675], [1510876800000, 7876.98, 7989.0, 7451.0, 7699.19, 3982.395925], [1510963200000, 7680.01, 7819.99, 7422.0, 7761.94, 3954.266477], [1511049600000, 7761.94, 8123.15, 7650.33, 8038.0, 3867.340444], [1511136000000, 8057.11, 8319.99, 7954.0, 8212.0, 3886.634348], [1511222400000, 8212.49, 8400.0, 7801.0, 8119.51, 4544.474016], [1511308800000, 8091.09, 8322.68, 8091.09, 8205.92, 3545.00571], [1511395200000, 8233.03, 8260.0, 8000.0, 8019.99, 4093.952687], [1511481600000, 8019.97, 8369.0, 7850.0, 8138.0, 4411.789112], [1511568000000, 8138.99, 8734.78, 8090.0, 8700.01, 4292.623682], [1511654400000, 8700.04, 9350.0, 8604.72, 9128.02, 4147.380237], [1511740800000, 9128.0, 9654.28, 9112.04, 9650.0, 4521.625707], [1511827200000, 9650.0, 9939.0, 9570.5, 9896.8, 4917.210985], [1511913600000, 9896.79, 11300.03, 8520.0, 9687.88, 13352.538715], [1512000000000, 9687.88, 10900.0, 8850.8, 9838.96, 9389.574329], [1512086400000, 9837.0, 10898.0, 9380.0, 10782.99, 6134.923633], [1512172800000, 10775.04, 11190.0, 10620.0, 10890.01, 4765.439757], [1512259200000, 10902.69, 11825.0, 10500.0, 11165.41, 5346.636524], [1512345600000, 11165.41, 11600.0, 10802.0, 11579.0, 4663.424562], [1512432000000, 11571.03, 11853.0, 11447.68, 11699.99, 5550.732055], [1512518400000, 11699.99, 13615.23, 11665.58, 13550.05, 6707.946319], [1512604800000, 13541.01, 16649.96, 13050.0, 16599.0, 7487.065695], [1512691200000, 16599.0, 17204.99, 14015.0, 15880.0, 17589.013136], [1512777600000, 15880.01, 16269.3, 12535.0, 14656.07, 13918.758687], [1512864000000, 14664.01, 15720.12, 12368.0, 14899.98, 16553.037173], [1512950400000, 14946.26, 17470.0, 14901.08, 16587.97, 11820.401762], [1513036800000, 16587.97, 16976.45, 15875.0, 16349.99, 9436.802411], [1513123200000, 16349.99, 16546.0, 14666.56, 16033.29, 12416.328801], [1513209600000, 16030.34, 16445.0, 15450.0, 16334.98, 11616.867151], [1513296000000, 16334.98, 17991.0, 16298.45, 17539.83, 9181.273947], [1513382400000, 17516.81, 19539.0, 17190.01, 19102.66, 4202.628709], [1513468800000, 19120.19, 19798.68, 18510.0, 18860.02, 9177.183434], [1513555200000, 18860.04, 19300.0, 17029.98, 18856.25, 10624.633071], [1513641600000, 18856.25, 18950.0, 16300.0, 17295.2, 13210.74822], [1513728000000, 17295.2, 17720.35, 14777.66, 16488.98, 13450.496693], [1513814400000, 16480.52, 17309.5, 14022.0, 15492.64, 20324.2173], [1513900800000, 15514.03, 15699.34, 10961.0, 13326.61, 36076.271175], [1513987200000, 13326.61, 14950.0, 12978.18, 13300.0, 13141.538875], [1514073600000, 13300.0, 13819.99, 11640.0, 13500.0, 28557.534988], [1514160000000, 13500.0, 14300.0, 12708.0, 13699.34, 15748.207607], [1514246400000, 13699.34, 16050.0, 13533.0, 15689.01, 15034.668104], [1514332800000, 15709.98, 16498.05, 14200.15, 15459.99, 14959.864723], [1514419200000, 15459.97, 15539.99, 13150.0, 14182.11, 21717.858014], [1514505600000, 14199.14, 14981.0, 13850.0, 14378.9, 18072.008116], [1514592000000, 14378.99, 14398.85, 11750.0, 12440.01, 19221.158039], [1514678400000, 12345.1, 14050.11, 12149.98, 13716.36, 11768.989718], [1514764800000, 13715.65, 13818.55, 12750.0, 13380.0, 8609.915844], [1514851200000, 13382.16, 15473.49, 12890.02, 14675.11, 20078.092111], [1514937600000, 14690.0, 15307.56, 14150.0, 14919.51, 15905.667639], [1515024000000, 14919.51, 15280.0, 13918.04, 15059.54, 21329.649574], [1515110400000, 15059.56, 17176.24, 14600.0, 16960.39, 23251.491125], [1515196800000, 16960.39, 17143.13, 16011.21, 17069.79, 18571.457508], [1515283200000, 17069.79, 17099.96, 15610.0, 16150.03, 12493.125558], [1515369600000, 16218.85, 16322.3, 12812.0, 14902.54, 26600.609912], [1515456000000, 14902.54, 15500.0, 14011.05, 14400.0, 14315.004253], [1515542400000, 14401.0, 14955.66, 13131.31, 14907.09, 17411.001655], [1515628800000, 14940.0, 14968.68, 11400.0, 13238.78, 33554.723751], [1515715200000, 13238.76, 14109.78, 12500.0, 13740.01, 16417.162137], [1515801600000, 13749.95, 14580.0, 13706.15, 14210.0, 12221.508528], [1515888000000, 14210.0, 14339.5, 12569.2, 13474.99, 17017.894329], [1515974400000, 13477.98, 14249.99, 13147.79, 13539.93, 14652.094705], [1516060800000, 13500.0, 13542.93, 9035.0, 10900.0, 63401.169175], [1516147200000, 10899.99, 11680.99, 9037.94, 10988.79, 72331.796646], [1516233600000, 10972.59, 11878.82, 10435.33, 10961.97, 48464.434937], [1516320000000, 10960.0, 11795.0, 10360.0, 11474.98, 34129.375421], [1516406400000, 11474.98, 13099.0, 11412.45, 12799.94, 28768.857827], [1516492800000, 12799.8, 12799.8, 10965.0, 11530.0, 41379.773426], [1516579200000, 11530.0, 11926.35, 9900.24, 10760.05, 43752.606791], [1516665600000, 10760.05, 11399.0, 9905.0, 10799.18, 37473.922552], [1516752000000, 10799.14, 11570.48, 10500.0, 11349.99, 27158.587762], [1516838400000, 11349.96, 11794.05, 10950.21, 11175.27, 20839.954183], [1516924800000, 11184.7, 11643.0, 10311.15, 11089.0, 33056.87196], [1517011200000, 11089.0, 11650.0, 10842.69, 11491.0, 18860.768345], [1517097600000, 11499.98, 12244.0, 11408.0, 11879.95, 16887.339524], [1517184000000, 11879.95, 11975.02, 11139.55, 11251.0, 14170.377538], [1517270400000, 11250.11, 11308.42, 9900.0, 10237.51, 25554.372946], [1517356800000, 10230.0, 10425.85, 9700.0, 10285.1, 18015.956805], [1517443200000, 10285.1, 10335.0, 8750.99, 9224.52, 33564.764311], [1517529600000, 9224.52, 9250.0, 8010.02, 8873.03, 49971.626975], [1517616000000, 8873.03, 9473.01, 8229.0, 9199.96, 28725.000735], [1517702400000, 9199.96, 9368.0, 7930.0, 8184.81, 32014.308449], [1517788800000, 8179.99, 8382.8, 6625.0, 6939.99, 63403.182579], [1517875200000, 6939.63, 7878.0, 6000.01, 7652.14, 100201.500307], [1517961600000, 7655.02, 8476.0, 7150.01, 7599.0, 60778.460497], [1518048000000, 7599.0, 7844.0, 7572.09, 7784.02, 1521.537318], [1518134400000, 7789.9, 8738.0, 7789.9, 8683.92, 20482.910825], [1518220800000, 8683.93, 9065.78, 8120.0, 8533.98, 49381.512653], [1518307200000, 8533.99, 8549.0, 7726.53, 8063.88, 45025.187952], [1518393600000, 8063.82, 8989.0, 8053.0, 8903.0, 41987.85049], [1518480000000, 8903.0, 8950.0, 8351.0, 8539.9, 35454.972956], [1518566400000, 8535.17, 9489.6, 8533.0, 9449.99, 40811.952867], [1518652800000, 9449.98, 10219.5, 9301.5, 10000.09, 52427.596715], [1518739200000, 10000.89, 10323.37, 9666.0, 10159.98, 38161.205974], [1518825600000, 10156.07, 11075.07, 10050.0, 11039.55, 41882.108407], [1518912000000, 11039.55, 11274.0, 10080.0, 10383.43, 61137.380728], [1518998400000, 10375.01, 11250.0, 10270.33, 11153.0, 40831.417131], [1519084800000, 11147.11, 11786.01, 11100.59, 11200.99, 48153.354288], [1519171200000, 11195.07, 11304.03, 10200.0, 10437.6, 68113.818754], [1519257600000, 10439.02, 10933.44, 9679.0, 9811.04, 67060.166483], [1519344000000, 9815.55, 10435.0, 9570.19, 10131.04, 57202.70237], [1519430400000, 10131.04, 10496.97, 9352.0, 9694.51, 40888.156299], [1519516800000, 9694.51, 9847.0, 9274.8, 9590.0, 28373.517586], [1519603200000, 9590.0, 10444.32, 9350.0, 10324.0, 34878.292756], [1519689600000, 10321.0, 10870.0, 10121.0, 10569.04, 30705.385123], [1519776000000, 10584.33, 11098.0, 10300.0, 10326.76, 30800.983782], [1519862400000, 10325.64, 11060.41, 10240.0, 10920.0, 25092.55393], [1519948800000, 10923.36, 11200.0, 10770.0, 11039.0, 23910.71009], [1520035200000, 11038.99, 11544.0, 11015.01, 11464.48, 21287.15328], [1520121600000, 11464.47, 11565.0, 11050.02, 11515.0, 17295.918653], [1520208000000, 11515.0, 11710.0, 11415.01, 11454.0, 15144.231063], [1520294400000, 11455.0, 11455.0, 10555.48, 10716.48, 29515.572363], [1520380800000, 10716.48, 10899.0, 9389.31, 9910.0, 50647.67108], [1520467200000, 9910.0, 10099.0, 9060.0, 9271.64, 41109.473226], [1520553600000, 9267.07, 9410.0, 8329.0, 9227.0, 64112.291407], [1520640000000, 9230.0, 9490.0, 8667.07, 8770.22, 37180.012857], [1520726400000, 8770.22, 9740.0, 8450.0, 9533.57, 44325.973386], [1520812800000, 9533.57, 9888.88, 8780.0, 9131.34, 42230.77793], [1520899200000, 9131.34, 9474.0, 8823.0, 9150.0, 40191.409358], [1520985600000, 9151.92, 9333.78, 7900.28, 8170.0, 49708.094108], [1521072000000, 8184.01, 8430.0, 7650.0, 8240.98, 52291.022277], [1521158400000, 8240.98, 8611.64, 7900.0, 8260.0, 38815.409893], [1521244800000, 8260.0, 8348.62, 7721.99, 7824.8, 33110.206329], [1521331200000, 7824.01, 8317.4, 7322.0, 8189.99, 59488.231711], [1521417600000, 8189.0, 8705.23, 8088.4, 8600.0, 55297.084942], [1521504000000, 8595.01, 9050.0, 8280.0, 8909.98, 44865.105835], [1521590400000, 8909.96, 9177.01, 8750.6, 8885.0, 39972.405371], [1521676800000, 8884.82, 9100.0, 8465.1, 8722.9, 40617.556809], [1521763200000, 8720.0, 8909.0, 8269.0, 8898.03, 39991.007666], [1521849600000, 8898.04, 8999.95, 8491.0, 8546.86, 35466.609572], [1521936000000, 8531.25, 8669.85, 8365.77, 8470.15, 29001.769316], [1522022400000, 8470.14, 8514.89, 7831.0, 8134.23, 44033.59566], [1522108800000, 8134.22, 8215.94, 7730.0, 7795.51, 37427.64805], [1522195200000, 7795.51, 8109.0, 7728.0, 7949.3, 26401.33167], [1522281600000, 7949.3, 7975.0, 6941.11, 7090.14, 54620.915125], [1522368000000, 7090.16, 7292.43, 6600.1, 6840.23, 65306.031976], [1522454400000, 6840.24, 7223.36, 6777.0, 6923.91, 36868.539087], [1522540800000, 6922.0, 7049.98, 6430.0, 6813.01, 44071.430463], [1522627200000, 6813.01, 7125.0, 6765.0, 7056.0, 32123.560072], [1522713600000, 7063.97, 7520.0, 7011.01, 7405.21, 37787.331811], [1522800000000, 7405.21, 7427.52, 6707.0, 6796.1, 42227.183804], [1522886400000, 6796.1, 6902.0, 6566.69, 6770.76, 39029.73146], [1522972800000, 6770.0, 6850.0, 6500.0, 6601.39, 27455.01192], [1523059200000, 6601.39, 7070.0, 6586.28, 6895.8, 32269.578267], [1523145600000, 6895.81, 7109.13, 6880.0, 7018.0, 21427.673165], [1523232000000, 7011.04, 7185.0, 6611.0, 6782.72, 34078.297206], [1523318400000, 6781.55, 6890.0, 6656.0, 6843.9, 22326.728095], [1523404800000, 6839.56, 6990.0, 6787.0, 6953.79, 23997.871177], [1523491200000, 6953.78, 8012.23, 6743.2, 7923.0, 64861.595987], [1523577600000, 7922.99, 8233.39, 7732.0, 7877.41, 55044.523148], [1523664000000, 7877.48, 8186.0, 7810.0, 7999.01, 31621.286357], [1523750400000, 8004.0, 8429.54, 7999.02, 8355.0, 27946.720444], [1523836800000, 8355.07, 8419.0, 7867.0, 8064.92, 36664.069715], [1523923200000, 8064.92, 8173.7, 7825.4, 7885.02, 32152.603567], [1524009600000, 7890.96, 8236.43, 7868.0, 8173.0, 26969.04457], [1524096000000, 8173.99, 8296.0, 8080.0, 8278.0, 27113.847464], [1524182400000, 8273.84, 8930.0, 8177.09, 8856.98, 39795.337485], [1524268800000, 8852.12, 9035.0, 8565.0, 8915.31, 40872.229909], [1524355200000, 8915.31, 9020.67, 8727.68, 8787.02, 29458.25348], [1524441600000, 8785.7, 8985.0, 8745.0, 8934.01, 25838.114709], [1524528000000, 8934.0, 9731.01, 8922.0, 9619.99, 46268.790106], [1524614400000, 9618.96, 9759.82, 8730.0, 8869.99, 81110.037589], [1524700800000, 8869.99, 9307.48, 8651.62, 9266.0, 43300.304245], [1524787200000, 9267.03, 9395.0, 8889.0, 8915.35, 37241.347036], [1524873600000, 8915.35, 9330.0, 8870.0, 9284.35, 15312.145401]], "3d": [[1502928000000, 4261.48, 4485.39, 3850.0, 4139.98, 2376.348404], [1503187200000, 4120.98, 4211.08, 3400.0, 4040.0, 2125.51094], [1503446400000, 4040.0, 4453.91, 4013.89, 4280.68, 2362.168058], [1503705600000, 4280.71, 4400.0, 4124.54, 4386.69, 1182.642269], [1503964800000, 4353.65, 4745.42, 4313.55, 4724.89, 1968.970601], [1504224000000, 4689.89, 4939.19, 4286.87, 4509.08, 2181.031159], [1504483200000, 4505.0, 4662.87, 3603.0, 4619.77, 3430.946497], [1504742400000, 4619.77, 4788.59, 4028.93, 4258.81, 2291.467973], [1505001600000, 4258.81, 4394.59, 3801.0, 4163.72, 2239.992659], [1505260800000, 4159.72, 4165.38, 2817.0, 3700.0, 4547.35058], [1505520000000, 3674.01, 4123.2, 3470.66, 4035.01, 3009.741618], [1505779200000, 4060.0, 4089.97, 3567.0, 3609.99, 2624.921289], [1506038400000, 3592.84, 3817.19, 3505.55, 3660.02, 2253.395606], [1506297600000, 3660.02, 4249.94, 3653.69, 4193.0, 1882.893666], [1506556800000, 4192.11, 4380.0, 3952.01, 4378.51, 3172.448073], [1506816000000, 4378.49, 4561.63, 4180.8, 4310.0, 2465.044222], [1507075200000, 4314.9, 4417.0, 4110.0, 4369.0, 2154.132915], [1507334400000, 4369.0, 4889.98, 4312.56, 4786.95, 1462.522649], [1507593600000, 4786.95, 5439.99, 4680.59, 5430.0, 3073.352651], [1507852800000, 5439.99, 5922.3, 5379.84, 5709.99, 4194.110041], [1508112000000, 5710.0, 5788.91, 5037.95, 5512.06, 5276.670211], [1508371200000, 5513.0, 6171.0, 5490.26, 6024.97, 5519.00702], [1508630400000, 6003.27, 6080.0, 5450.0, 5477.03, 5755.068698], [1508889600000, 5506.92, 5980.0, 5286.98, 5768.83, 5659.485503], [1509148800000, 5768.79, 6248.68, 5630.03, 6120.5, 4555.219628], [1509408000000, 6120.52, 7300.0, 6100.0, 7019.98, 5691.000916], [1509667200000, 7010.31, 7590.25, 6901.0, 7345.01, 4498.521689], [1509926400000, 7345.1, 7770.02, 6651.0, 7303.0, 6025.577557], [1510185600000, 7303.01, 7392.0, 6100.0, 6245.05, 7922.259274], [1510444800000, 6245.05, 6697.47, 5325.01, 6574.99, 8844.018639], [1510704000000, 6575.99, 7989.0, 6575.99, 7699.19, 8093.95852], [1510963200000, 7680.01, 8319.99, 7422.0, 8212.0, 11708.241269], [1511222400000, 8212.49, 8400.0, 7801.0, 8019.99, 12183.432413], [1511481600000, 8019.97, 9350.0, 7850.0, 9128.02, 12851.793031], [1511740800000, 9128.0, 11300.03, 8520.0, 9687.88, 22791.375407], [1512000000000, 9687.88, 11190.0, 8850.8, 10890.01, 20289.937719], [1512259200000, 10902.69, 11853.0, 10500.0, 11699.99, 15560.793141], [1512518400000, 11699.99, 17204.99, 11665.58, 15880.0, 31784.02515], [1512777600000, 15880.01, 17470.0, 12368.0, 16587.97, 42292.197622], [1513036800000, 16587.97, 16976.45, 14666.56, 16334.98, 33469.998363], [1513296000000, 16334.98, 19798.68, 16298.45, 18860.02, 22561.08609], [1513555200000, 18860.04, 19300.0, 14777.66, 16488.98, 37285.877984], [1513814400000, 16480.52, 17309.5, 10961.0, 13300.0, 69542.02735], [1514073600000, 13300.0, 16050.0, 11640.0, 15689.01, 59340.410699], [1514332800000, 15709.98, 16498.05, 13150.0, 14378.9, 54749.730853], [1514592000000, 14378.99, 14398.85, 11750.0, 13380.0, 39600.063601], [1514851200000, 13382.16, 15473.49, 12890.02, 15059.54, 57313.409324], [1515110400000, 15059.56, 17176.24, 14600.0, 16150.03, 54316.074191], [1515369600000, 16218.85, 16322.3, 12812.0, 14907.09, 58326.61582], [1515628800000, 14940.0, 14968.68, 11400.0, 14210.0, 62193.394416], [1515888000000, 14210.0, 14339.5, 9035.0, 10900.0, 95071.158209], [1516147200000, 10899.99, 11878.82, 9037.94, 11474.98, 154925.607004], [1516406400000, 11474.98, 13099.0, 9900.24, 10760.05, 113901.238044], [1516665600000, 10760.05, 11794.05, 9905.0, 11175.27, 85472.464497], [1516924800000, 11184.7, 12244.0, 10311.15, 11879.95, 68804.979829], [1517184000000, 11879.95, 11975.02, 9700.0, 10285.1, 57740.707289], [1517443200000, 10285.1, 10335.0, 8010.02, 9199.96, 112261.392021], [1517702400000, 9199.96, 9368.0, 6000.01, 7652.14, 195618.991335], [1517961600000, 7655.02, 8738.0, 7150.01, 8683.92, 82782.90864], [1518220800000, 8683.93, 9065.78, 7726.53, 8903.0, 136394.551095], [1518480000000, 8903.0, 10219.5, 8351.0, 10000.09, 128694.522538], [1518739200000, 10000.89, 11274.0, 9666.0, 10383.43, 141180.695109], [1518998400000, 10375.01, 11786.01, 10200.0, 10437.6, 157098.590173], [1519257600000, 10439.02, 10933.44, 9352.0, 9694.51, 165151.025152], [1519516800000, 9694.51, 10870.0, 9274.8, 10569.04, 93957.195465], [1519776000000, 10584.33, 11200.0, 10240.0, 11039.0, 79804.247802], [1520035200000, 11038.99, 11710.0, 11015.01, 11454.0, 53727.302996], [1520294400000, 11455.0, 11455.0, 9060.0, 9271.64, 121272.716669], [1520553600000, 9267.07, 9740.0, 8329.0, 9533.57, 145618.27765], [1520812800000, 9533.57, 9888.88, 7900.28, 8170.0, 132130.281396], [1521072000000, 8184.01, 8611.64, 7650.0, 7824.8, 124216.638499], [1521331200000, 7824.01, 9050.0, 7322.0, 8909.98, 159650.422488], [1521590400000, 8909.96, 9177.01, 8269.0, 8898.03, 120580.969846], [1521849600000, 8898.04, 8999.95, 7831.0, 8134.23, 108501.974548], [1522108800000, 8134.22, 8215.94, 6941.11, 7090.14, 118449.894845], [1522368000000, 7090.16, 7292.43, 6430.0, 6813.01, 146246.001526], [1522627200000, 6813.01, 7520.0, 6707.0, 6796.1, 112138.075687], [1522886400000, 6796.1, 7070.0, 6500.0, 6895.8, 98754.321647], [1523145600000, 6895.81, 7185.0, 6611.0, 6843.9, 77832.698466], [1523404800000, 6839.56, 8233.39, 6743.2, 7877.41, 143903.990312], [1523664000000, 7877.48, 8429.54, 7810.0, 8064.92, 96232.076516], [1523923200000, 8064.92, 8296.0, 7825.4, 8278.0, 86235.495601], [1524182400000, 8273.84, 9035.0, 8177.09, 8787.02, 110125.820874], [1524441600000, 8785.7, 9759.82, 8730.0, 8869.99, 153216.942404], [1524700800000, 8869.99, 9395.0, 8651.62, 9289.0, 95853.806724]], "1w": [[1502668800000, 4261.48, 4485.39, 3850.0, 4086.29, 2843.431426], [1503273600000, 4069.13, 4453.91, 3400.0, 4310.01, 4599.396629], [1503878400000, 4310.01, 4939.19, 4124.54, 4509.08, 4753.843376], [1504483200000, 4505.0, 4788.59, 3603.0, 4130.37, 6382.787745], [1505088000000, 4153.62, 4394.59, 2817.0, 3699.99, 8106.705127], [1505692800000, 3690.0, 4123.2, 3505.55, 3660.02, 5908.32335], [1506297600000, 3660.02, 4406.52, 3653.69, 4378.48, 5782.305424], [1506902400000, 4400.0, 4658.0, 4110.0, 4640.0, 4708.272956], [1507507200000, 4640.0, 5922.3, 4550.0, 5709.99, 7913.925837], [1508112000000, 5710.0, 6171.0, 5037.95, 5950.02, 12157.769447], [1508716800000, 5975.0, 6189.88, 5286.98, 6169.98, 13133.99457], [1509321600000, 6133.01, 7590.25, 6030.0, 7345.01, 11663.209648], [1509926400000, 7345.1, 7770.02, 5325.01, 5811.03, 18916.3199], [1510531200000, 5839.94, 8123.15, 5699.99, 8038.0, 19791.101011], [1511136000000, 8057.11, 9350.0, 7801.0, 9128.02, 28921.859792], [1511740800000, 9128.0, 11825.0, 8520.0, 11165.41, 48427.94965], [1512345600000, 11165.41, 17204.99, 10802.0, 14899.98, 72469.977627], [1512950400000, 14946.26, 19798.68, 14666.56, 18860.02, 67851.486215], [1513555200000, 18860.04, 19300.0, 10961.0, 13500.0, 135385.440322], [1514160000000, 13500.0, 16498.05, 11750.0, 13716.36, 116522.754321], [1514764800000, 13715.65, 17176.24, 12750.0, 16150.03, 120239.399359], [1515369600000, 16218.85, 16322.3, 11400.0, 13474.99, 137537.904565], [1515974400000, 13477.98, 14249.99, 9035.0, 11530.0, 303127.502137], [1516579200000, 11530.0, 12244.0, 9900.24, 11879.95, 198030.051117], [1517184000000, 11879.95, 11975.02, 7930.0, 8184.81, 202016.407759], [1517788800000, 8179.99, 9065.78, 6000.01, 8063.88, 340794.292131], [1518393600000, 8063.82, 11274.0, 8053.0, 10383.43, 311863.068137], [1518998400000, 10375.01, 11786.01, 9274.8, 9590.0, 350623.132911], [1519603200000, 9590.0, 11565.0, 9350.0, 11515.0, 183970.997614], [1520208000000, 11515.0, 11710.0, 8329.0, 9533.57, 282035.225382], [1520812800000, 9533.57, 9888.88, 7322.0, 8189.99, 315835.151606], [1521417600000, 8189.0, 9177.01, 8088.4, 8470.15, 285211.539511], [1522022400000, 8470.14, 8514.89, 6430.0, 6813.01, 308729.492031], [1522627200000, 6813.01, 7520.0, 6500.0, 7018.0, 232320.070499], [1523232000000, 7011.04, 8429.54, 6611.0, 8355.0, 259877.022414], [1523836800000, 8355.07, 9035.0, 7825.4, 8787.02, 233025.38619], [1524441600000, 8785.7, 9759.82, 8651.62, 9288.0, 249070.751984]], "1M": [[1501545600000, 4261.48, 4745.42, 3400.0, 4724.89, 10015.640272], [1504224000000, 4689.89, 4939.19, 2817.0, 4378.51, 27634.18912], [1506816000000, 4378.49, 6498.01, 4110.0, 6463.0, 41626.388463], [1509494400000, 6463.0, 11300.03, 5325.01, 9838.96, 108487.978119], [1512086400000, 9837.0, 19798.68, 9380.0, 13716.36, 408476.658399], [1514764800000, 13715.65, 17176.24, 9035.0, 10285.1, 816675.564467], [1517443200000, 10285.1, 11786.01, 6000.01, 10326.76, 1243940.85531], [1519862400000, 10325.64, 11710.0, 6600.1, 6923.91, 1235326.31402], [1522540800000, 6922.0, 9759.82, 6430.0, 9288.0, 1018364.661565]]} \ No newline at end of file diff --git a/docs/install/config_test.json b/tests/static/config.json similarity index 60% rename from docs/install/config_test.json rename to tests/static/config.json index e6c029577..a7e1d8087 100644 --- a/docs/install/config_test.json +++ b/tests/static/config.json @@ -1,4 +1,5 @@ { + "time_frame": ["1h", "4h", "1d"], "crypto_currencies":{ "Bitcoin": { "pairs" : ["BTC/USDT"] @@ -23,10 +24,16 @@ "mail_dest": "" }, "twitter": { - "api-key": "YOUR_TWITTER_API_KEY", - "api-secret": "YOUR_TWITTER_API_SECRET", - "access-token": "YOUR_TWITTER_ACCESS_TOKEN", - "access-token-secret": "YOUR_TWITTER_ACCESS_TOKEN_SECRET" + "api-key": "", + "api-secret": "", + "access-token": "", + "access-token-secret": "" + }, + "reddit":{ + "client_id": "", + "client_secret": "", + "password":"", + "username":"" } }, "notification":{ @@ -37,12 +44,16 @@ "enabled": false, "risk": 1 }, - "simulator":{ + "trader_simulator":{ "enabled": true, "risk": 1, "starting_portfolio": { "BTC": 10, - "USDT": 1000 + "USD": 1000 } + }, + "backtesting": { + "enabled": false, + "files": ["tests/static/binance_BTC_USDT_20180428_121156.data"] } } \ No newline at end of file diff --git a/tests/static/evaluator_config.json b/tests/static/evaluator_config.json new file mode 100644 index 000000000..a5b6c5b18 --- /dev/null +++ b/tests/static/evaluator_config.json @@ -0,0 +1,20 @@ +{ + "RSIMomentumEvaluator": true, + "DoubleMovingAverageTrendEvaluator": true, + "BBMomentumEvaluator": true, + "MACDMomentumEvaluator": true, + "CandlePatternMomentumEvaluator": true, + "ADXMomentumEvaluator": true, + + + "InstantFluctuationsEvaluator": false, + + + "TwitterNewsEvaluator": false, + "RedditForumEvaluator": false, + "GoogleTrendStatsEvaluator": true, + + + "FullMixedStrategiesEvaluator": true, + "InstantSocialReactionMixedStrategiesEvaluator": true +} \ No newline at end of file diff --git a/tests/test_utils/__init__.py b/tests/test_utils/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_utils/config.py b/tests/test_utils/config.py new file mode 100644 index 000000000..138151ca1 --- /dev/null +++ b/tests/test_utils/config.py @@ -0,0 +1,8 @@ +from config.config import load_config +from config.cst import CONFIG_EVALUATOR, CONFIG_EVALUATOR_FILE + + +def load_test_config(): + config = load_config("tests/static/config.json") + config[CONFIG_EVALUATOR] = load_config("tests/static/evaluator_config.json", False) + return config diff --git a/tests/test_utils/data_bank.py b/tests/test_utils/data_bank.py new file mode 100644 index 000000000..7974ee110 --- /dev/null +++ b/tests/test_utils/data_bank.py @@ -0,0 +1,86 @@ +import ccxt +import pandas + +from config.cst import TimeFrames +from trading.exchanges.exchange_manager import ExchangeManager + +""" +Class containing data with known moves +Moves are in the middle of the return data_frame + +TimeFrames.FIVE_MINUTES: 2018-04-26 17:00:00 -> 2018-04-27 02:00:00 +TimeFrames.FIFTEEN_MINUTES: 2018-04-23 06:15:00 -> 2018-04-24 07:00:00 +TimeFrames.ONE_HOUR: 2018-04-07 16:00:00 -> 2018-04-11 20:00:00 +TimeFrames.FOUR_HOURS: 2018-02-03 00:00:00 -> 2018-02-20 16:00:00 +TimeFrames.HEIGHT_HOURS: 2017-11-12 04:00:00 -> 2017-12-11 16:00:00 +TimeFrames.ONE_DAY: 2017-08-17 00:00:00 -> 2017-11-12 00:00:00 + +""" + + +class DataBank: + + def __init__(self, config, data_file=None, symbols=None): + self.config = config + self.data_file = data_file if data_file else "tests/static/binance_BTC_USDT_20180428_121156.data" + self.symbols = symbols if symbols else ["BTC"] + + exchange_manager = ExchangeManager(self.config, ccxt.binance, is_simulated=True) + self.exchange_inst = exchange_manager.get_exchange() + + self.data_by_symbol_by_data_frame = None + self._init_data() + + def get_all_data_for_all_available_time_frames_for_symbol(self, symbol): + return self.data_by_symbol_by_data_frame[symbol] + + # works only with default data file + # not started, selling started, selling maxed, buying starting, max: back normal: + def get_rise_after_over_sold(self): + return pandas.concat([self._get_bank_time_frame_data(TimeFrames.FOUR_HOURS)[35:61], + self._get_bank_time_frame_data(TimeFrames.FOUR_HOURS)])[0:49], \ + 35, 43, 46, 47 + + # works only with default data file + # not started, buying started, buying maxed, start dipping, super dip, max: back normal: + def get_dip_after_over_bought(self): + return self._get_bank_time_frame_data(TimeFrames.ONE_DAY)[0:90], \ + -18, -14, -10, -9, -2 + + # works only with default data file + # not started, started, heavy dump, very light dump, max: stopped dump: + def get_sudden_dump(self): + return self._get_bank_time_frame_data(TimeFrames.ONE_HOUR)[0:46], \ + -4, -3, -2, -1 + + # works only with default data file + # not started, started, heavy pump, max pump, change trend, dipping, max: dipped: + def get_sudden_pump(self): + return self._get_bank_time_frame_data(TimeFrames.HEIGHT_HOURS)[:83], \ + 71, 74, 76, 77, 78, 79 + + # works only with default data file + # long data_frame with flat then sudden big rise and then mostly flat for 120 values + # start move ending up in a rise, reaches flat trend, first micro up p1, first mirco up p2, micro down, micro up, + # micro down, micro up, micro down, back normal, micro down, back normal, micro down, back up, micro up, back down, + # back normal, micro down, back up, micro down, back up, micro down, back up + def get_overall_flat_trend(self): + return pandas.concat([self._get_bank_time_frame_data(TimeFrames.FIFTEEN_MINUTES)[6:72]*0.9, + self._get_bank_time_frame_data(TimeFrames.HEIGHT_HOURS)[25:43], + self._get_bank_time_frame_data(TimeFrames.FIFTEEN_MINUTES)[6:72], + self._get_bank_time_frame_data(TimeFrames.FIFTEEN_MINUTES)[6:72]]), \ + 67, 85, 87, 90, 95, 107, 116, 123, 138, 141, 151, 153, 161, 163, 173, 174, 175, 180, 183, 193, 198, 203, 207 + + def _get_bank_time_frame_data(self, time_frame): + return self.data_by_symbol_by_data_frame[self.symbols[0]][time_frame] + + def _init_data(self): + self.data_by_symbol_by_data_frame = {symbol: self._get_symbol_data(symbol) for symbol in self.symbols} + + def _get_symbol_data(self, symbol): + return {time_frame: self.exchange_inst.get_symbol_prices( + symbol, + time_frame, + data_frame=True) + for time_frame in TimeFrames + if self.exchange_inst.get_exchange().has_data_for_time_frame(symbol, time_frame.value)} diff --git a/tests/unit_tests/TA_evaluators_tests/__init__.py b/tests/unit_tests/TA_evaluators_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/TA_evaluators_tests/abstract_TA_test.py b/tests/unit_tests/TA_evaluators_tests/abstract_TA_test.py new file mode 100644 index 000000000..9a39fa767 --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/abstract_TA_test.py @@ -0,0 +1,291 @@ +from abc import * +import math + +from config.cst import * +from tests.test_utils.config import load_test_config +from tests.test_utils.data_bank import DataBank + +""" +Reference class for technical analysis black box testing. Defines tests to implement to test a TA analyser. +""" + + +class AbstractTATest: + __metaclass__ = ABCMeta + + def init(self, TA_evaluator_class, data_file=None, test_symbols=["BTC/USDT"]): + self.evaluator = TA_evaluator_class() + self.config = load_test_config() + self.test_symbols = test_symbols + self.data_bank = DataBank(self.config, data_file, test_symbols) + self._assert_init() + self.previous_move_stop = None + + # replays a whole dataframe set and assert no exceptions are raised + @staticmethod + @abstractmethod + def test_stress_test(evaluator_tester): + raise NotImplementedError("stress_test not implemented") + + # checks evaluations when a dump is happening + @staticmethod + @abstractmethod + def test_reactions_to_dump(evaluator_tester): + raise NotImplementedError("test_reactions_to_dump not implemented") + + # checks evaluations when a pump is happening + @staticmethod + @abstractmethod + def test_reactions_to_pump(evaluator_tester): + raise NotImplementedError("test_reactions_to_pump not implemented") + + # checks evaluations when an asset is over-sold + @staticmethod + @abstractmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + raise NotImplementedError("test_reaction_to_oversold not implemented") + + # checks evaluations when an asset is over-bought + @staticmethod + @abstractmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + raise NotImplementedError("test_reaction_to_over_bought_then_dip not implemented") + + # checks evaluations when an asset doing nothing + @staticmethod + @abstractmethod + def test_reaction_to_flat_trend(evaluator_tester): + raise NotImplementedError("test_reaction_to_flat_trend not implemented") + + # runs stress test and assert that neutral evaluation ratio is under required_not_neutral_evaluation_ratio and + # resets eval_note between each run if reset_eval_to_none_before_each_eval set to True + def run_stress_test_without_exceptions(self, + required_not_neutral_evaluation_ratio=0.75, + reset_eval_to_none_before_each_eval=True): + + for symbol in self.test_symbols: + time_framed_data_list = self.data_bank.get_all_data_for_all_available_time_frames_for_symbol(symbol) + for key, current_time_frame_data in time_framed_data_list.items(): + # start with 0 data dataframe and goes onwards the end of the data + not_neutral_evaluation_count = 0 + for current_time_in_frame in range(len(current_time_frame_data)): + + self.evaluator.set_data(current_time_frame_data[0:current_time_in_frame]) + if reset_eval_to_none_before_each_eval: + # force None value if possible to make sure eval_note is set during eval_impl() + self.evaluator.eval_note = None + self.evaluator.eval_impl() + + assert self.evaluator.eval_note is not None + if self.evaluator.eval_note != START_PENDING_EVAL_NOTE: + assert not math.isnan(self.evaluator.eval_note) + if self.evaluator.eval_note != START_PENDING_EVAL_NOTE: + not_neutral_evaluation_count += 1 + assert not_neutral_evaluation_count/len(current_time_frame_data) \ + >= required_not_neutral_evaluation_ratio + + # test reaction to dump + def run_test_reactions_to_dump(self, pre_dump_eval, + slight_dump_started_eval, + heavy_dump_started_eval, + end_dump_eval, + after_dump_eval): + + dump_data, pre_dump, start_dump, heavy_dump, end_dump = self.data_bank.get_sudden_dump() + + # not dumped yet + self._set_data_and_check_eval(dump_data[0:pre_dump], pre_dump_eval, False) + + # starts dumping + self._set_data_and_check_eval(dump_data[0:start_dump], slight_dump_started_eval, True) + + # real dumping + self._set_data_and_check_eval(dump_data[0:heavy_dump], heavy_dump_started_eval, True) + + # end dumping + self._set_data_and_check_eval(dump_data[0:end_dump], end_dump_eval, True) + + # stopped dumping + self._set_data_and_check_eval(dump_data, after_dump_eval, True) + + # test reaction to pump + def run_test_reactions_to_pump(self, pre_pump_eval, + start_pump_started_eval, + heavy_pump_started_eval, + max_pump_eval, + stop_pump_eval, + start_dip_eval, + dipped_eval): + + # not started, started, heavy pump, max pump, change trend, dipping, max: dipped: + pump_data, pre_pump, start_dump, heavy_pump, max_pump, change_trend, dipping = self.data_bank.get_sudden_pump() + + # not pumped yet + self._set_data_and_check_eval(pump_data[0:pre_pump], pre_pump_eval, False) + + # starts pumping + self._set_data_and_check_eval(pump_data[0:start_dump], start_pump_started_eval, False) + + # real pumping + self._set_data_and_check_eval(pump_data[0:heavy_pump], heavy_pump_started_eval, False) + + # max pumping + self._set_data_and_check_eval(pump_data[0:max_pump], max_pump_eval, False) + + # trend reversing + self._set_data_and_check_eval(pump_data[0:change_trend], stop_pump_eval, True) + + # starts dipping + self._set_data_and_check_eval(pump_data[0:dipping], start_dip_eval, True) + + # dipped + self._set_data_and_check_eval(pump_data, dipped_eval, True) + + # test reaction to over-sold + def run_test_reactions_to_rise_after_over_sold(self, pre_sell_eval, + started_sell_eval, + max_sell_eval, + start_rise_eval, + after_rise_eval): + + sell_then_buy_data, pre_sell, start_sell, max_sell, start_rise = self.data_bank.get_rise_after_over_sold() + + # not started + self._set_data_and_check_eval(sell_then_buy_data[0:pre_sell], pre_sell_eval, False) + + # starts selling + self._set_data_and_check_eval(sell_then_buy_data[0:start_sell], started_sell_eval, True) + + # max selling + self._set_data_and_check_eval(sell_then_buy_data[0:max_sell], max_sell_eval, True) + + # start buying + self._set_data_and_check_eval(sell_then_buy_data[0:start_rise], start_rise_eval, True) + + # bought + self._set_data_and_check_eval(sell_then_buy_data, after_rise_eval, True) + + # test reaction to over-bought + def run_test_reactions_to_over_bought_then_dip(self, pre_buy_eval, + started_buy_eval, + max_buy_eval, + start_dip_eval, + max_dip_eval, + after_dip_eval): + + # not started, buying started, buying maxed, start dipping, max dip, max: back normal: + buy_then_sell_data, pre_buy, start_buy, max_buy, start_dip, max_dip = \ + self.data_bank.get_dip_after_over_bought() + + # not started + self._set_data_and_check_eval(buy_then_sell_data[0:pre_buy], pre_buy_eval, False) + + # starts buying + self._set_data_and_check_eval(buy_then_sell_data[0:start_buy], started_buy_eval, False) + + # max buying + self._set_data_and_check_eval(buy_then_sell_data[0:max_buy], max_buy_eval, False) + + # start dipping + self._set_data_and_check_eval(buy_then_sell_data[0:start_dip], start_dip_eval, False) + + # max dip + self._set_data_and_check_eval(buy_then_sell_data[0:max_dip], max_dip_eval, True) + + # back normal + self._set_data_and_check_eval(buy_then_sell_data, after_dip_eval, False) + + # test reaction to flat trend + def run_test_reactions_to_flat_trend(self, eval_start_move_ending_up_in_a_rise, + eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + eval_back_up8, eval_micro_down9, eval_back_up9): + + # long data_frame with flat then sudden big rise and then mostly flat for 120 values + # start move ending up in a rise, reaches flat trend, first micro up p1, first mirco up p2, micro down, + # micro up, micro down, micro up, micro down, back normal, micro down, back normal, micro down, back up, + # micro up, back down, back normal, micro down, back up, micro down, back up, micro down, back up + up_then_flat_data, start_move_ending_up_in_a_rise, reaches_flat_trend, first_micro_up_p1, first_micro_up_p2, \ + micro_down1, micro_up1, micro_down2, micro_up2, micro_down3, back_normal3, micro_down4, back_normal4, \ + micro_down5, back_up5, micro_up6, back_down6, back_normal6, micro_down7, back_up7, micro_down8, back_up8, \ + micro_down9, back_up9 = self.data_bank.get_overall_flat_trend() + + # start_move_ending_up_in_a_rise + self._set_data_and_check_eval( + up_then_flat_data[0:start_move_ending_up_in_a_rise], eval_start_move_ending_up_in_a_rise, False) + # reaches_flat_trend + self._move_and_set_data_and_check_eval(up_then_flat_data, reaches_flat_trend, eval_reaches_flat_trend, False) + # first_micro_up_p1 + self._move_and_set_data_and_check_eval(up_then_flat_data, first_micro_up_p1, eval_first_micro_up_p1, False) + # first_micro_up_p2 + self._move_and_set_data_and_check_eval(up_then_flat_data, first_micro_up_p2, eval_first_micro_up_p2, False) + # micro_down1 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down1, eval_micro_down1, True) + # micro_up1 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_up1, eval_micro_up1, False) + # micro_down2 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down2, eval_micro_down2, True) + # micro_up2 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_up2, eval_micro_up2, False) + # micro_down3 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down3, eval_micro_down3, True) + # back_normal3 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_normal3, eval_back_normal3, False) + # micro_down4 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down4, eval_micro_down4, True) + # back_normal4 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_normal4, eval_back_normal4, False) + # micro_down5 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down5, eval_micro_down5, True) + # back_up5 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_up5, eval_back_up5, False) + # micro_up6 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_up6, eval_micro_up6, False) + # back_down6 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_down6, eval_back_down6, True) + # back_normal6 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_normal6, eval_back_normal6, False) + # micro_down7 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down7, eval_micro_down7, True) + # back_up7 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_up7, eval_back_up7, False) + # micro_down8 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down8, eval_micro_down8, True) + # back_up8 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_up8, eval_back_up8, False) + # micro_down9 + self._move_and_set_data_and_check_eval(up_then_flat_data, micro_down9, eval_micro_down9, True) + # back_up9 + self._move_and_set_data_and_check_eval(up_then_flat_data, back_up9, eval_back_up9, False) + + def _move_and_set_data_and_check_eval(self, data, eval_index, expected_eval_note, check_inferior): + if self.previous_move_stop is None: + self.previous_move_stop = 0 + + if eval_index > 0: + # move up to next evaluation + for i in range(eval_index - self.previous_move_stop - 1): + self.evaluator.set_data(data[0:self.previous_move_stop + i]) + self.evaluator.eval_impl() + + self._set_data_and_check_eval(data[0:eval_index], expected_eval_note, check_inferior) + self.previous_move_stop = eval_index + + def _set_data_and_check_eval(self, data, expected_eval_note, check_inferior): + self.evaluator.set_data(data) + self.evaluator.eval_impl() + if expected_eval_note != -2: + if check_inferior: + assert self.evaluator.eval_note == expected_eval_note \ + or self.evaluator.eval_note <= expected_eval_note + else: + assert self.evaluator.eval_note == expected_eval_note \ + or self.evaluator.eval_note >= expected_eval_note + + def _assert_init(self): + assert self.evaluator + assert self.config + assert self.data_bank diff --git a/tests/unit_tests/TA_evaluators_tests/test_adx_TA_evaluator.py b/tests/unit_tests/TA_evaluators_tests/test_adx_TA_evaluator.py new file mode 100644 index 000000000..cb1313ada --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/test_adx_TA_evaluator.py @@ -0,0 +1,52 @@ +import pytest + +from tests.unit_tests.TA_evaluators_tests.abstract_TA_test import AbstractTATest +from evaluator.TA import ADXMomentumEvaluator + + +@pytest.fixture() +def evaluator_tester(): + evaluator_tester_instance = TestADXTAEvaluator() + evaluator_tester_instance.init(ADXMomentumEvaluator) + return evaluator_tester_instance + + +class TestADXTAEvaluator(AbstractTATest): + + @staticmethod + def test_stress_test(evaluator_tester): + evaluator_tester.run_stress_test_without_exceptions(0.7) + + @staticmethod + def test_reactions_to_dump(evaluator_tester): + evaluator_tester.run_test_reactions_to_dump(0.2, 0.3, -0.1, -0.1, -0.4) + + @staticmethod + def test_reactions_to_pump(evaluator_tester): + evaluator_tester.run_test_reactions_to_pump(0, 0.1, 0.45, 0.7, 0.6, 0.65, 0.75) + + @staticmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + evaluator_tester.run_test_reactions_to_rise_after_over_sold(0.8, -0.1, -0.5, -0.52, -0.8) + + @staticmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + evaluator_tester.run_test_reactions_to_over_bought_then_dip(0.1, 0.1, 0.3, 0.4, -0.4, 0.2) + + @staticmethod + def test_reaction_to_flat_trend(evaluator_tester): + evaluator_tester.run_test_reactions_to_flat_trend( + # eval_start_move_ending_up_in_a_rise, + 0.4, + # eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + 0.1, 0.4, 0.45, + # eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + 1, 0.6, 0.1, 0.4, + # eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + -0.4, 0.5, -0.7, 0.8, + # eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + -0.1, -0.5, 0.25, 0.35, + # eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + 0.3, -0.5, -0.6, -0.45, + # eval_back_up8, eval_micro_down9, eval_back_up9 + -0.35, -0.1, 0.1) diff --git a/tests/unit_tests/TA_evaluators_tests/test_bollinger_bands_momentum_TA_evaluator.py b/tests/unit_tests/TA_evaluators_tests/test_bollinger_bands_momentum_TA_evaluator.py new file mode 100644 index 000000000..4c118a962 --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/test_bollinger_bands_momentum_TA_evaluator.py @@ -0,0 +1,52 @@ +import pytest + +from tests.unit_tests.TA_evaluators_tests.abstract_TA_test import AbstractTATest +from evaluator.TA import BBMomentumEvaluator + + +@pytest.fixture() +def evaluator_tester(): + evaluator_tester_instance = TestBollingerBandsMomentumTAEvaluator() + evaluator_tester_instance.init(BBMomentumEvaluator) + return evaluator_tester_instance + + +class TestBollingerBandsMomentumTAEvaluator(AbstractTATest): + + @staticmethod + def test_stress_test(evaluator_tester): + evaluator_tester.run_stress_test_without_exceptions() + + @staticmethod + def test_reactions_to_dump(evaluator_tester): + evaluator_tester.run_test_reactions_to_dump(0.7, 0.2, -1, -1, -1) + + @staticmethod + def test_reactions_to_pump(evaluator_tester): + evaluator_tester.run_test_reactions_to_pump(0.4, 0.5, 1, 1, 1, 1, 0.1) + + @staticmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + evaluator_tester.run_test_reactions_to_rise_after_over_sold(-0.1, -0.99, -0.99, -0.5, 1) + + @staticmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + evaluator_tester.run_test_reactions_to_over_bought_then_dip(0, 1, 1, 0.95, -0.3, -0.1) + + @staticmethod + def test_reaction_to_flat_trend(evaluator_tester): + evaluator_tester.run_test_reactions_to_flat_trend( + # eval_start_move_ending_up_in_a_rise, + 1, + # eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + 1, 0.8, 0.4, + # eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + 0.1, 1, -0.3, 0.1, + # eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + -0.6, 0.5, 0, 0.5, + # eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + -1, -0.15, 1, 0.1, + # eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + 0.4, -0.1, 0, -1, + # eval_back_up8, eval_micro_down9, eval_back_up9 + -0.05, -1, 0.5) diff --git a/tests/unit_tests/TA_evaluators_tests/test_candle_pattern_TA_evaluator.py b/tests/unit_tests/TA_evaluators_tests/test_candle_pattern_TA_evaluator.py new file mode 100644 index 000000000..66a7c1394 --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/test_candle_pattern_TA_evaluator.py @@ -0,0 +1,60 @@ +import pytest + +from tests.unit_tests.TA_evaluators_tests.abstract_TA_test import AbstractTATest +from evaluator.TA import CandlePatternMomentumEvaluator +from config.cst import START_PENDING_EVAL_NOTE + + +@pytest.fixture() +def evaluator_tester(): + evaluator_tester_instance = TestCandlePatternTAEvaluator() + evaluator_tester_instance.init(CandlePatternMomentumEvaluator) + return evaluator_tester_instance + + +class TestCandlePatternTAEvaluator(AbstractTATest): + + @staticmethod + def test_stress_test(evaluator_tester): + evaluator_tester.run_stress_test_without_exceptions(0.7, False) + + @staticmethod + def test_reactions_to_dump(evaluator_tester): + evaluator_tester.run_test_reactions_to_dump(START_PENDING_EVAL_NOTE, START_PENDING_EVAL_NOTE, START_PENDING_EVAL_NOTE, + START_PENDING_EVAL_NOTE, -0.5) + + @staticmethod + def test_reactions_to_pump(evaluator_tester): + evaluator_tester.run_test_reactions_to_pump(-0.5, -0.5, + -0.5, -0.5, + -0.5, -0.5, + -0.5) + + @staticmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + evaluator_tester.run_test_reactions_to_rise_after_over_sold(START_PENDING_EVAL_NOTE, START_PENDING_EVAL_NOTE, + -0.5, -0.5, -0.5) + + @staticmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + evaluator_tester.run_test_reactions_to_over_bought_then_dip(START_PENDING_EVAL_NOTE, START_PENDING_EVAL_NOTE, + START_PENDING_EVAL_NOTE, -0.5, + -0.5, -0.5) + + @staticmethod + def test_reaction_to_flat_trend(evaluator_tester): + evaluator_tester.run_test_reactions_to_flat_trend( + # eval_start_move_ending_up_in_a_rise, + START_PENDING_EVAL_NOTE, + # eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + -0.5, -1, -1, + # eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + -1, -1, -0.5, -1, + # eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + -1, -1, -1, -1, + # eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + -1, -1, -1, -1, + # eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + -1, -0.5, -1, -1, + # eval_back_up8, eval_micro_down9, eval_back_up9 + -1, -1, -1) diff --git a/tests/unit_tests/TA_evaluators_tests/test_double_moving_averages_TA_evaluator.py b/tests/unit_tests/TA_evaluators_tests/test_double_moving_averages_TA_evaluator.py new file mode 100644 index 000000000..0e5f505bf --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/test_double_moving_averages_TA_evaluator.py @@ -0,0 +1,52 @@ +import pytest + +from tests.unit_tests.TA_evaluators_tests.abstract_TA_test import AbstractTATest +from evaluator.TA import DoubleMovingAverageTrendEvaluator + + +@pytest.fixture() +def evaluator_tester(): + evaluator_tester_instance = TestDoubleMovingAveragesTAEvaluator() + evaluator_tester_instance.init(DoubleMovingAverageTrendEvaluator) + return evaluator_tester_instance + + +class TestDoubleMovingAveragesTAEvaluator(AbstractTATest): + + @staticmethod + def test_stress_test(evaluator_tester): + evaluator_tester.run_stress_test_without_exceptions(0.8) + + @staticmethod + def test_reactions_to_dump(evaluator_tester): + evaluator_tester.run_test_reactions_to_dump(0.15, 0.15, -0.35, -0.75, -1) + + @staticmethod + def test_reactions_to_pump(evaluator_tester): + evaluator_tester.run_test_reactions_to_pump(0.1, 0.4, 1, 1, 1, 0.96, -0.45) + + @staticmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + evaluator_tester.run_test_reactions_to_rise_after_over_sold(-0.7, -0.99, -0.99, -0.5, 0.85) + + @staticmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + evaluator_tester.run_test_reactions_to_over_bought_then_dip(0, 0.4, 0.7, 0.6, -0.9, -0.1) + + @staticmethod + def test_reaction_to_flat_trend(evaluator_tester): + evaluator_tester.run_test_reactions_to_flat_trend( + # eval_start_move_ending_up_in_a_rise, + 0.5, + # eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + 1, 0.65, 0.2, + # eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + -0.25, 0, -0.1, 0, + # eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + -0.1, 0, -0.1, 0, + # eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + 0.2, -0.10, 0, 0.1, + # eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + -0.05, -0.1, -0.1, -0.15, + # eval_back_up8, eval_micro_down9, eval_back_up9 + 0, -0.1, 0.1) diff --git a/tests/unit_tests/TA_evaluators_tests/test_macd_TA_evaluator.py b/tests/unit_tests/TA_evaluators_tests/test_macd_TA_evaluator.py new file mode 100644 index 000000000..ca230e5b4 --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/test_macd_TA_evaluator.py @@ -0,0 +1,52 @@ +import pytest + +from tests.unit_tests.TA_evaluators_tests.abstract_TA_test import AbstractTATest +from evaluator.TA import MACDMomentumEvaluator + + +@pytest.fixture() +def evaluator_tester(): + evaluator_tester_instance = TestMACDTAEvaluator() + evaluator_tester_instance.init(MACDMomentumEvaluator) + return evaluator_tester_instance + + +class TestMACDTAEvaluator(AbstractTATest): + + @staticmethod + def test_stress_test(evaluator_tester): + evaluator_tester.run_stress_test_without_exceptions(0.6) + + @staticmethod + def test_reactions_to_dump(evaluator_tester): + evaluator_tester.run_test_reactions_to_dump(0.3, 0.2, -0.5, -0.7, -0.7) + + @staticmethod + def test_reactions_to_pump(evaluator_tester): + evaluator_tester.run_test_reactions_to_pump(0.3, 0.4, 0.75, 0.75, 0.75, 0.75, 0.2) + + @staticmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + evaluator_tester.run_test_reactions_to_rise_after_over_sold(0, -0.5, -0.65, -0.4, -0.1) + + @staticmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + evaluator_tester.run_test_reactions_to_over_bought_then_dip(-0.6, 0.1, 0.7, 0.7, -0.4, -0.65) + + @staticmethod + def test_reaction_to_flat_trend(evaluator_tester): + evaluator_tester.run_test_reactions_to_flat_trend( + # eval_start_move_ending_up_in_a_rise, + 0.75, + # eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + 0.6, 0.7, 0.45, + # eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + -0.1, -0.6, -0.55, -0.4, + # eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + -0.25, -0.1, -0.1, 0.2, + # eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + -0.5, -0.6, 0.25, 0.3, + # eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + 0.5, -0.1, -0.4, -0.3, + # eval_back_up8, eval_micro_down9, eval_back_up9 + -0.3, -0.7, 0.1) diff --git a/tests/unit_tests/TA_evaluators_tests/test_rsi_TA_evaluator.py b/tests/unit_tests/TA_evaluators_tests/test_rsi_TA_evaluator.py new file mode 100644 index 000000000..bbbd1021e --- /dev/null +++ b/tests/unit_tests/TA_evaluators_tests/test_rsi_TA_evaluator.py @@ -0,0 +1,52 @@ +import pytest + +from tests.unit_tests.TA_evaluators_tests.abstract_TA_test import AbstractTATest +from evaluator.TA import RSIMomentumEvaluator + + +@pytest.fixture() +def evaluator_tester(): + evaluator_tester_instance = TestRSITAEvaluator() + evaluator_tester_instance.init(RSIMomentumEvaluator) + return evaluator_tester_instance + + +class TestRSITAEvaluator(AbstractTATest): + + @staticmethod + def test_stress_test(evaluator_tester): + evaluator_tester.run_stress_test_without_exceptions(0.7, False) + + @staticmethod + def test_reactions_to_dump(evaluator_tester): + evaluator_tester.run_test_reactions_to_dump(0.3, -0.2, -0.8, -1, -1) + + @staticmethod + def test_reactions_to_pump(evaluator_tester): + evaluator_tester.run_test_reactions_to_pump(0.3, 0.6, 1, 1, 1, 1, 0.5) + + @staticmethod + def test_reaction_to_rise_after_over_sold(evaluator_tester): + evaluator_tester.run_test_reactions_to_rise_after_over_sold(-1, -1, -1, -1, -1) + + @staticmethod + def test_reaction_to_over_bought_then_dip(evaluator_tester): + evaluator_tester.run_test_reactions_to_over_bought_then_dip(0.1, 0.4, 0.85, 1, 0.75, 0.8) + + @staticmethod + def test_reaction_to_flat_trend(evaluator_tester): + evaluator_tester.run_test_reactions_to_flat_trend( + # eval_start_move_ending_up_in_a_rise, + 0.4, + # eval_reaches_flat_trend, eval_first_micro_up_p1, eval_first_micro_up_p2, + 0.55, 1, 1, + # eval_micro_down1, eval_micro_up1, eval_micro_down2, eval_micro_up2, + -0.6, 1, 1, 0.7, + # eval_micro_down3, eval_back_normal3, eval_micro_down4, eval_back_normal4, + -0.8, -0.7, 0.75, 0.77, + # eval_micro_down5, eval_back_up5, eval_micro_up6, eval_back_down6, + 0.2, -0.45, -0.45, -0.1, + # eval_back_normal6, eval_micro_down7, eval_back_up7, eval_micro_down8, + 0.1, 0.75, 0.4, -1, + # eval_back_up8, eval_micro_down9, eval_back_up9 + -1, -1, -0.75) diff --git a/tests/unit_tests/__init__.py b/tests/unit_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/backtesting_tests/__init__.py b/tests/unit_tests/backtesting_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/dispatcher_tests/__init__.py b/tests/unit_tests/dispatcher_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/evaluator_tests/__init__.py b/tests/unit_tests/evaluator_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/evaluator_tests/test_abstract_evaluator.py b/tests/unit_tests/evaluator_tests/test_abstract_evaluator.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/evaluator_tests/test_cryptocurrency_evaluator.py b/tests/unit_tests/evaluator_tests/test_cryptocurrency_evaluator.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/evaluator_tests/test_evaluator.py b/tests/unit_tests/evaluator_tests/test_evaluator.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/evaluator_tests/test_evaluator_creator.py b/tests/unit_tests/evaluator_tests/test_evaluator_creator.py new file mode 100644 index 000000000..c2e52d248 --- /dev/null +++ b/tests/unit_tests/evaluator_tests/test_evaluator_creator.py @@ -0,0 +1,67 @@ +from evaluator.evaluator_creator import EvaluatorCreator +from evaluator.Strategies import StrategiesEvaluator +from tests.test_utils.config import load_test_config +from evaluator.Util.advanced_manager import AdvancedManager +from config.cst import TimeFrames +from evaluator.evaluator import Evaluator +from evaluator.TA import TAEvaluator +from evaluator.Social import SocialEvaluator +# from evaluator.RealTime import RealTimeEvaluator + + +def _get_tools(): + config = load_test_config() + AdvancedManager.create_class_list(config) + evaluator = Evaluator() + evaluator.set_config(config) + evaluator.set_symbol("BTC/USDT") + evaluator.set_time_frame(TimeFrames.ONE_HOUR) + return evaluator, config + + +def _assert_created_instances(instances_list, super_class, config): + class_list = [instance.__class__ for instance in instances_list] + for eval_class in AdvancedManager.create_advanced_evaluator_types_list(super_class, config): + eval_instance = eval_class() + eval_instance.set_config(config) + if eval_instance.get_is_enabled(): + assert eval_class in class_list + + +def test_create_dispatchers(): + _, config = _get_tools() + dispatchers = EvaluatorCreator.create_dispatchers(config) + assert len(dispatchers) == 0 # no dispatcher created because no config for associated services + + +def test_create_ta_eval_list(): + evaluator, config = _get_tools() + ta_list = EvaluatorCreator.create_ta_eval_list(evaluator) + _assert_created_instances(ta_list, TAEvaluator, config) + + +def test_create_social_eval_list(): + evaluator, config = _get_tools() + so_list = EvaluatorCreator.create_social_eval(config, evaluator.symbol, []) + _assert_created_instances(so_list, SocialEvaluator, config) + + +def test_create_social_not_threaded_list(): + evaluator, config = _get_tools() + so_list = EvaluatorCreator.create_social_eval(config, evaluator.symbol, []) + not_thread_so_list = EvaluatorCreator.create_social_not_threaded_list(so_list) + for evalator in not_thread_so_list: + assert not evalator.is_threaded + + +def test_create_strategies_eval_list(): + evaluator, config = _get_tools() + strat_list = EvaluatorCreator.create_strategies_eval_list(config) + _assert_created_instances(strat_list, StrategiesEvaluator, config) + + +# not tested for now +# def test_create_real_time_ta_evals(): +# evaluator, config = _get_tools() +# ta_list = EvaluatorCreator.create_real_time_ta_evals(config, evaluator.exchange, evaluator.symbol) +# _assert_created_instances(ta_list, RealTimeEvaluator, config) diff --git a/tests/unit_tests/evaluator_tests/test_evaluator_final.py b/tests/unit_tests/evaluator_tests/test_evaluator_final.py new file mode 100644 index 000000000..4c06fde0e --- /dev/null +++ b/tests/unit_tests/evaluator_tests/test_evaluator_final.py @@ -0,0 +1,126 @@ +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from evaluator.symbol_evaluator import SymbolEvaluator +from trading.trader.trader_simulator import TraderSimulator +from evaluator.cryptocurrency_evaluator import CryptocurrencyEvaluator +from evaluator.evaluator_final import FinalEvaluator +from evaluator.evaluator_creator import EvaluatorCreator +from tests.test_utils.config import load_test_config +from evaluator.Util.advanced_manager import AdvancedManager +from config.cst import EvaluatorStates, INIT_EVAL_NOTE +from trading.trader.portfolio import Portfolio + + +def _get_tools(): + symbol = "BTC/USDT" + exchange_traders = {} + exchange_traders2 = {} + config = load_test_config() + AdvancedManager.create_class_list(config) + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 0.3) + trader_inst.stop_order_manager() + trader_inst2 = TraderSimulator(config, exchange_inst, 0.3) + trader_inst2.stop_order_manager() + crypto_currency_evaluator = CryptocurrencyEvaluator(config, "Bitcoin", []) + symbol_evaluator = SymbolEvaluator(config, symbol, crypto_currency_evaluator) + exchange_traders[exchange_inst.get_name()] = trader_inst + exchange_traders2[exchange_inst.get_name()] = trader_inst2 + symbol_evaluator.set_trader_simulators(exchange_traders) + symbol_evaluator.set_traders(exchange_traders2) + symbol_evaluator.strategies_eval_lists[exchange_inst.get_name()] = EvaluatorCreator.create_strategies_eval_list(config) + final_evaluator = FinalEvaluator(symbol_evaluator, exchange_inst, symbol) + trader_inst.portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 2000 + } + return final_evaluator, trader_inst + + +def test_default_values(): + final_evaluator, trader_inst = _get_tools() + assert final_evaluator.state is None + assert final_evaluator.queue.empty() + final_evaluator.final_eval = 1211161 + assert final_evaluator.get_final_eval() == 1211161 + final_evaluator.state = "plop" + assert final_evaluator.get_state() == "plop" + + +def test_set_state(): + final_evaluator, trader_inst = _get_tools() + final_evaluator._set_state(EvaluatorStates.NEUTRAL) + assert final_evaluator.state == EvaluatorStates.NEUTRAL + final_evaluator._set_state(EvaluatorStates.VERY_LONG) + assert final_evaluator.state == EvaluatorStates.VERY_LONG + assert len(trader_inst.order_manager.order_list) == 1 + final_evaluator._set_state(EvaluatorStates.NEUTRAL) + final_evaluator._set_state(EvaluatorStates.VERY_SHORT) + assert final_evaluator.state == EvaluatorStates.VERY_SHORT + assert len(trader_inst.order_manager.order_list) == 1 + final_evaluator._set_state(EvaluatorStates.NEUTRAL) + final_evaluator._set_state(EvaluatorStates.LONG) + assert final_evaluator.state == EvaluatorStates.LONG + assert len(trader_inst.order_manager.order_list) == 1 + final_evaluator._set_state(EvaluatorStates.NEUTRAL) + final_evaluator._set_state(EvaluatorStates.SHORT) + assert final_evaluator.state == EvaluatorStates.SHORT + assert len(trader_inst.order_manager.order_list) == 2 # has stop loss + final_evaluator._set_state(EvaluatorStates.NEUTRAL) + assert final_evaluator.state == EvaluatorStates.NEUTRAL + assert len(trader_inst.order_manager.order_list) == 2 # has not reset + + +def test_get_delta_risk(): + final_evaluator, trader_inst = _get_tools() + for i in range(0, 100, 1): + final_evaluator.symbol_evaluator.get_trader(final_evaluator.exchange).risk = i/100 + assert round(final_evaluator._get_delta_risk(), 6) == round(final_evaluator.RISK_THRESHOLD*i/100, 6) + + +def test_create_state(): + final_evaluator, trader_inst = _get_tools() + delta_risk = final_evaluator._get_delta_risk() + for i in range(-100, 100, 1): + final_evaluator.final_eval = i/100 + final_evaluator._create_state() + if final_evaluator.final_eval < final_evaluator.VERY_LONG_THRESHOLD + delta_risk: + assert final_evaluator.state == EvaluatorStates.VERY_LONG + elif final_evaluator.final_eval < final_evaluator.LONG_THRESHOLD + delta_risk: + assert final_evaluator.state == EvaluatorStates.LONG + elif final_evaluator.final_eval < final_evaluator.NEUTRAL_THRESHOLD - delta_risk: + assert final_evaluator.state == EvaluatorStates.NEUTRAL + elif final_evaluator.final_eval < final_evaluator.SHORT_THRESHOLD - delta_risk: + assert final_evaluator.state == EvaluatorStates.SHORT + else: + assert final_evaluator.state == EvaluatorStates.VERY_SHORT + + +def test_prepare(): + final_evaluator, trader_inst = _get_tools() + final_evaluator._set_state(EvaluatorStates.SHORT) + assert final_evaluator.state == EvaluatorStates.SHORT + assert len(trader_inst.order_manager.order_list) == 2 # has stop loss + final_evaluator.final_eval = None + final_evaluator._prepare() + assert final_evaluator.state == EvaluatorStates.SHORT # ensure did not change EvaluatorStates + assert len(trader_inst.order_manager.order_list) == 2 # ensure did not change orders + assert final_evaluator.final_eval == INIT_EVAL_NOTE + + +def test_finalize(): + final_evaluator, trader_inst = _get_tools() + final_evaluator.final_eval = None + final_evaluator.finalize() + assert final_evaluator.final_eval == INIT_EVAL_NOTE + + final_evaluator._set_state(EvaluatorStates.SHORT) + assert final_evaluator.state == EvaluatorStates.SHORT + assert len(trader_inst.order_manager.order_list) == 2 # has stop loss + + final_evaluator.finalize() + assert final_evaluator.final_eval == INIT_EVAL_NOTE + assert final_evaluator.state == EvaluatorStates.NEUTRAL # ensure changed EvaluatorStates + assert len(trader_inst.order_manager.order_list) == 2 # ensure did not change orders because neutral state diff --git a/tests/unit_tests/evaluator_tests/test_evaluator_matrix.py b/tests/unit_tests/evaluator_tests/test_evaluator_matrix.py new file mode 100644 index 000000000..8e2d4aaa5 --- /dev/null +++ b/tests/unit_tests/evaluator_tests/test_evaluator_matrix.py @@ -0,0 +1,35 @@ +import math + +from evaluator.evaluator_matrix import EvaluatorMatrix +from tests.test_utils.config import load_test_config +from config.cst import EvaluatorMatrixTypes, TimeFrames + + +def _get_tools(): + config = load_test_config() + matrix_inst = EvaluatorMatrix(config) + matrix = matrix_inst.matrix + return matrix_inst, matrix, config + + +def test_init(): + matrix_inst, matrix, config = _get_tools() + assert EvaluatorMatrixTypes.TA in matrix + assert EvaluatorMatrixTypes.SOCIAL in matrix + assert EvaluatorMatrixTypes.REAL_TIME in matrix + assert EvaluatorMatrixTypes.STRATEGIES in matrix + + +def test_set_get_eval(): + time_frames = [None, TimeFrames.ONE_HOUR] + values = [1, 1.02, math.pi, math.nan] + for time_frame in time_frames: + matrix_inst, matrix, config = _get_tools() + for value in values: + for matrix_type in EvaluatorMatrixTypes: + key = "{}{}".format(matrix_type, value) + matrix_inst.set_eval(matrix_type, key, value, time_frame) + if math.isnan(value): + assert matrix_inst.get_eval_note(matrix, matrix_type, key, time_frame) is None + else: + assert matrix_inst.get_eval_note(matrix, matrix_type, key, time_frame) == value diff --git a/tests/unit_tests/evaluator_tests/test_evaluator_order_creator.py b/tests/unit_tests/evaluator_tests/test_evaluator_order_creator.py new file mode 100644 index 000000000..9402621e1 --- /dev/null +++ b/tests/unit_tests/evaluator_tests/test_evaluator_order_creator.py @@ -0,0 +1,619 @@ +import ccxt +import copy + +from evaluator.evaluator_order_creator import EvaluatorOrderCreator +from trading.exchanges.exchange_manager import ExchangeManager +from config.cst import EvaluatorStates +from tests.test_utils.config import load_test_config +from trading.trader.portfolio import Portfolio +from trading.trader.order import * +from trading.trader.trader_simulator import TraderSimulator +from config.cst import ExchangeConstantsMarketStatusColumns as Ecmsc + + +def _get_tools(): + config = load_test_config() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 0.3) + trader_inst.stop_order_manager() + trader_inst.portfolio.portfolio["SUB"] = { + Portfolio.TOTAL: 0.000000000000000000005, + Portfolio.AVAILABLE: 0.000000000000000000005 + } + trader_inst.portfolio.portfolio["BNB"] = { + Portfolio.TOTAL: 0.000000000000000000005, + Portfolio.AVAILABLE: 0.000000000000000000005 + } + trader_inst.portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 2000 + } + symbol = "BTC/USDT" + return config, exchange_inst, trader_inst, symbol + + +def test_can_create_order(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + # portfolio: "BTC": 10 "USD": 1000 + not_owned_symbol = "ETH/BTC" + not_owned_market = "BTC/ETH" + min_trigger_symbol = "SUB/BTC" + min_trigger_market = "ADA/BNB" + + # order from neutral state => false + assert not EvaluatorOrderCreator.can_create_order(symbol, exchange, EvaluatorStates.NEUTRAL, portfolio) + + # sell order using a currency with 0 available + assert not EvaluatorOrderCreator.can_create_order(not_owned_symbol, exchange, EvaluatorStates.SHORT, portfolio) + assert not EvaluatorOrderCreator.can_create_order(not_owned_symbol, exchange, EvaluatorStates.VERY_SHORT, portfolio) + + # sell order using a currency with < min available + assert not EvaluatorOrderCreator.can_create_order(min_trigger_symbol, exchange, EvaluatorStates.SHORT, portfolio) + assert not EvaluatorOrderCreator.can_create_order(min_trigger_symbol, exchange, EvaluatorStates.VERY_SHORT, portfolio) + + # sell order using a currency with > min available + assert EvaluatorOrderCreator.can_create_order(not_owned_market, exchange, EvaluatorStates.SHORT, portfolio) + assert EvaluatorOrderCreator.can_create_order(not_owned_market, exchange, EvaluatorStates.VERY_SHORT, portfolio) + + # buy order using a market with 0 available + assert not EvaluatorOrderCreator.can_create_order(not_owned_market, exchange, EvaluatorStates.LONG, portfolio) + assert not EvaluatorOrderCreator.can_create_order(not_owned_market, exchange, EvaluatorStates.VERY_LONG, portfolio) + + # buy order using a market with < min available + assert not EvaluatorOrderCreator.can_create_order(min_trigger_market, exchange, EvaluatorStates.LONG, portfolio) + assert not EvaluatorOrderCreator.can_create_order(min_trigger_market, exchange, EvaluatorStates.VERY_LONG, portfolio) + + # buy order using a market with > min available + assert EvaluatorOrderCreator.can_create_order(not_owned_symbol, exchange, EvaluatorStates.LONG, portfolio) + assert EvaluatorOrderCreator.can_create_order(not_owned_symbol, exchange, EvaluatorStates.VERY_LONG, portfolio) + + +def test_can_create_order_unknown_symbols(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + unknown_symbol = "VI?/BTC" + unknown_market = "BTC/*s?" + unknown_everything = "VI?/*s?" + + # buy order with unknown market + assert not EvaluatorOrderCreator.can_create_order(unknown_market, exchange, EvaluatorStates.LONG, portfolio) + assert not EvaluatorOrderCreator.can_create_order(unknown_market, exchange, EvaluatorStates.VERY_LONG, portfolio) + assert EvaluatorOrderCreator.can_create_order(unknown_market, exchange, EvaluatorStates.SHORT, portfolio) + assert EvaluatorOrderCreator.can_create_order(unknown_market, exchange, EvaluatorStates.VERY_SHORT, portfolio) + + # sell order with unknown symbol + assert not EvaluatorOrderCreator.can_create_order(unknown_symbol, exchange, EvaluatorStates.SHORT, portfolio) + assert not EvaluatorOrderCreator.can_create_order(unknown_symbol, exchange, EvaluatorStates.VERY_SHORT, portfolio) + assert EvaluatorOrderCreator.can_create_order(unknown_symbol, exchange, EvaluatorStates.LONG, portfolio) + assert EvaluatorOrderCreator.can_create_order(unknown_symbol, exchange, EvaluatorStates.VERY_LONG, portfolio) + + # neutral state with unknown symbol, market and everything + assert not EvaluatorOrderCreator.can_create_order(unknown_symbol, exchange, EvaluatorStates.NEUTRAL, portfolio) + assert not EvaluatorOrderCreator.can_create_order(unknown_market, exchange, EvaluatorStates.NEUTRAL, portfolio) + assert not EvaluatorOrderCreator.can_create_order(unknown_everything, exchange, EvaluatorStates.NEUTRAL, portfolio) + + +def _check_order_limits(order, market_status): + symbol_market_limits = market_status[Ecmsc.LIMITS.value] + limit_amount = symbol_market_limits[Ecmsc.LIMITS_AMOUNT.value] + limit_cost = symbol_market_limits[Ecmsc.LIMITS_COST.value] + limit_price = symbol_market_limits[Ecmsc.LIMITS_PRICE.value] + + min_quantity = limit_amount[Ecmsc.LIMITS_AMOUNT_MIN.value] + max_quantity = limit_amount[Ecmsc.LIMITS_AMOUNT_MAX.value] + min_cost = limit_cost[Ecmsc.LIMITS_COST_MIN.value] + max_cost = limit_cost[Ecmsc.LIMITS_COST_MAX.value] + min_price = limit_price[Ecmsc.LIMITS_PRICE_MIN.value] + max_price = limit_price[Ecmsc.LIMITS_PRICE_MAX.value] + maximal_price_digits = market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_PRICE.value] + maximal_volume_digits = market_status[Ecmsc.PRECISION.value][Ecmsc.PRECISION_AMOUNT.value] + order_cost = order.origin_price*order.origin_quantity + + assert order_cost <= max_cost + assert order_cost >= min_cost + assert order.origin_price <= max_price + assert order.origin_price >= min_price + assert str(order.origin_price)[::-1].find(".") <= maximal_price_digits + assert order.origin_quantity <= max_quantity + assert order.origin_quantity >= min_quantity + assert str(order.origin_quantity)[::-1].find(".") <= maximal_volume_digits + + +def _check_linked_order(order, linked_order, order_type, order_price, market_status): + assert linked_order.exchange == order.exchange + assert linked_order.trader == order.trader + assert linked_order.order_notifier == order.order_notifier + assert linked_order.order_type == order_type + assert linked_order.created_last_price == order.created_last_price + assert linked_order.origin_price == order_price + assert linked_order.linked_orders[0] == order + assert linked_order.created_last_price == order.created_last_price + assert linked_order.currency == order.currency + assert linked_order.currency_total_fees == order.currency_total_fees + assert linked_order.market_total_fees == order.market_total_fees + assert linked_order.filled_price == order.filled_price + assert linked_order.filled_quantity == order.filled_quantity + assert linked_order.linked_to == order + assert linked_order.status == order.status + assert linked_order.symbol == order.symbol + _check_order_limits(order, market_status) + + +def test_valid_create_new_order(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + order_creator = EvaluatorOrderCreator() + + market_status = exchange.get_market_status(symbol) + + # portfolio: "BTC": 10 "USD": 1000 + last_btc_price = 6943.01 + + # order from neutral state + assert order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) is None + assert order_creator.create_new_order(0.5, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) is None + assert order_creator.create_new_order(0, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) is None + assert order_creator.create_new_order(-0.5, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) is None + assert order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.NEUTRAL) is None + + # valid sell limit order (price adapted) + orders = order_creator.create_new_order(0.65, symbol, exchange, trader, portfolio, EvaluatorStates.SHORT) + assert len(orders) == 1 + order = orders[0] + assert isinstance(order, SellLimitOrder) + assert order.currency == "BTC" + assert order.symbol == "BTC/USDT" + assert order.origin_price == 6995.95045125 + assert order.created_last_price == last_btc_price + assert order.order_type == TraderOrderType.SELL_LIMIT + assert order.side == TradeOrderSide.SELL + assert order.status == OrderStatus.OPEN + assert order.exchange == exchange + assert order.trader == trader + assert order.currency_total_fees == 0 + assert order.market_total_fees == 0 + assert order.filled_price == 0 + assert order.origin_quantity == 7.6 + assert order.filled_quantity == order.origin_quantity + assert order.is_simulated is True + assert order.linked_to is None + + _check_order_limits(order, market_status) + + assert len(order.linked_orders) == 1 + _check_linked_order(order, order.linked_orders[0], TraderOrderType.STOP_LOSS, 6595.8595, market_status) + + # valid buy limit order with (price and quantity adapted) + orders = order_creator.create_new_order(-0.65, symbol, exchange, trader, portfolio, EvaluatorStates.LONG) + assert len(orders) == 1 + order = orders[0] + assert isinstance(order, BuyLimitOrder) + assert order.currency == "BTC" + assert order.symbol == "BTC/USDT" + assert order.origin_price == 6890.06954875 + assert order.created_last_price == last_btc_price + assert order.order_type == TraderOrderType.BUY_LIMIT + assert order.side == TradeOrderSide.BUY + assert order.status == OrderStatus.OPEN + assert order.exchange == exchange + assert order.trader == trader + assert order.currency_total_fees == 0 + assert order.market_total_fees == 0 + assert order.filled_price == 0 + assert order.origin_quantity == 0.21892522 + assert order.filled_quantity == order.origin_quantity + assert order.is_simulated is True + assert order.linked_to is None + + _check_order_limits(order, market_status) + + # assert len(order.linked_orders) == 1 # check linked orders when it will be developed + + # valid buy market order with (price and quantity adapted) + orders = order_creator.create_new_order(-1, symbol, exchange, trader, portfolio, EvaluatorStates.VERY_LONG) + assert len(orders) == 1 + order = orders[0] + assert isinstance(order, BuyMarketOrder) + assert order.currency == "BTC" + assert order.symbol == "BTC/USDT" + assert order.origin_price == last_btc_price + assert order.created_last_price == last_btc_price + assert order.order_type == TraderOrderType.BUY_MARKET + assert order.side == TradeOrderSide.BUY + assert order.status == OrderStatus.OPEN + assert order.exchange == exchange + assert order.trader == trader + assert order.currency_total_fees == 0 + assert order.market_total_fees == 0 + assert order.filled_price == 0 + assert order.origin_quantity == 0.03540179 + assert order.filled_quantity == order.origin_quantity + assert order.is_simulated is True + assert order.linked_to is None + + _check_order_limits(order, market_status) + + # valid buy market order with (price and quantity adapted) + orders = order_creator.create_new_order(1, symbol, exchange, trader, portfolio, EvaluatorStates.VERY_SHORT) + assert len(orders) == 1 + order = orders[0] + assert isinstance(order, SellMarketOrder) + assert order.currency == "BTC" + assert order.symbol == "BTC/USDT" + assert order.origin_price == last_btc_price + assert order.created_last_price == last_btc_price + assert order.order_type == TraderOrderType.SELL_MARKET + assert order.side == TradeOrderSide.SELL + assert order.status == OrderStatus.OPEN + assert order.exchange == exchange + assert order.trader == trader + assert order.currency_total_fees == 0 + assert order.market_total_fees == 0 + assert order.filled_price == 0 + assert order.origin_quantity == 2.4 + assert order.filled_quantity == order.origin_quantity + assert order.is_simulated is True + assert order.linked_to is None + + _check_order_limits(order, market_status) + + +def test_invalid_create_new_order(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + order_creator = EvaluatorOrderCreator() + + # portfolio: "BTC": 10 "USD": 1000 + min_trigger_market = "ADA/BNB" + + # invalid buy order with not trade data + orders = order_creator.create_new_order(0.6, min_trigger_market, exchange, trader, portfolio, EvaluatorStates.SHORT) + assert orders is None + + trader.portfolio.portfolio["BTC"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 0.000000000000000000005 + } + + # invalid buy order with not enough currency to sell + orders = order_creator.create_new_order(0.6, symbol, exchange, trader, portfolio, EvaluatorStates.SHORT) + assert len(orders) == 0 + + trader.portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 0.000000000000000000005 + } + + # invalid buy order with not enough currency to buy + orders = order_creator.create_new_order(-0.6, symbol, exchange, trader, portfolio, EvaluatorStates.LONG) + assert len(orders) == 0 + + +def test_split_create_new_order(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + order_creator = EvaluatorOrderCreator() + last_btc_price = 6943.01 + + market_status = exchange.get_market_status(symbol) + trader.portfolio.portfolio["BTC"] = { + Portfolio.TOTAL: 2000000001, + Portfolio.AVAILABLE: 2000000001 + } + # split orders because order too big and coin price too high + orders = order_creator.create_new_order(0.6, symbol, exchange, trader, portfolio, EvaluatorStates.SHORT) + assert len(orders) == 11 + adapted_order = orders[0] + identical_orders = orders[1:] + + assert isinstance(adapted_order, SellLimitOrder) + assert adapted_order.currency == "BTC" + assert adapted_order.symbol == "BTC/USDT" + assert adapted_order.origin_price == 6998.55407999 + assert adapted_order.created_last_price == last_btc_price + assert adapted_order.order_type == TraderOrderType.SELL_LIMIT + assert adapted_order.side == TradeOrderSide.SELL + assert adapted_order.status == OrderStatus.OPEN + assert adapted_order.exchange == exchange + assert adapted_order.trader == trader + assert adapted_order.currency_total_fees == 0 + assert adapted_order.market_total_fees == 0 + assert adapted_order.filled_price == 0 + assert adapted_order.origin_quantity == 51133425.486746 + assert adapted_order.filled_quantity == adapted_order.origin_quantity + assert adapted_order.is_simulated is True + assert adapted_order.linked_to is None + + _check_order_limits(adapted_order, market_status) + + assert len(adapted_order.linked_orders) == 1 + _check_linked_order(adapted_order, adapted_order.linked_orders[0], TraderOrderType.STOP_LOSS, 6595.8595, market_status) + + for order in identical_orders: + assert isinstance(order, SellLimitOrder) + assert order.currency == adapted_order.currency + assert order.symbol == adapted_order.symbol + assert order.origin_price == adapted_order.origin_price + assert order.created_last_price == adapted_order.created_last_price + assert order.order_type == adapted_order.order_type + assert order.side == adapted_order.side + assert order.status == adapted_order.status + assert order.exchange == adapted_order.exchange + assert order.trader == adapted_order.trader + assert order.currency_total_fees == adapted_order.currency_total_fees + assert order.market_total_fees == adapted_order.market_total_fees + assert order.filled_price == adapted_order.filled_price + assert order.origin_quantity == 142886657.52532542 + assert order.origin_quantity > adapted_order.origin_quantity + assert order.filled_quantity > adapted_order.filled_quantity + assert order.is_simulated == adapted_order.is_simulated + assert order.linked_to == adapted_order.linked_to + assert len(order.linked_orders) == 1 + + _check_order_limits(order, market_status) + _check_linked_order(order, order.linked_orders[0], TraderOrderType.STOP_LOSS, 6595.8595, market_status) + + trader.portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 20000000000, + Portfolio.AVAILABLE: 20000000000 + } + + # set btc last price to 6998.55407999 * 0.000001 = 0.00699855408 + exchange.get_exchange().set_recent_trades_multiplier_factor(0.000001) + # split orders because order too big and too many coins + orders = order_creator.create_new_order(-0.6, symbol, exchange, trader, portfolio, EvaluatorStates.LONG) + assert len(orders) == 3 + adapted_order = orders[0] + identical_orders = orders[1:] + + assert isinstance(adapted_order, BuyLimitOrder) + assert adapted_order.currency == "BTC" + assert adapted_order.symbol == "BTC/USDT" + assert adapted_order.origin_price == 0.00688746 + assert adapted_order.created_last_price == 0.0069430099999999995 + assert adapted_order.order_type == TraderOrderType.BUY_LIMIT + assert adapted_order.side == TradeOrderSide.BUY + assert adapted_order.status == OrderStatus.OPEN + assert adapted_order.exchange == exchange + assert adapted_order.trader == trader + assert adapted_order.currency_total_fees == 0 + assert adapted_order.market_total_fees == 0 + assert adapted_order.filled_price == 0 + assert adapted_order.origin_quantity == 131640311622.76904 + assert adapted_order.filled_quantity == adapted_order.origin_quantity + assert adapted_order.is_simulated is True + assert adapted_order.linked_to is None + + _check_order_limits(adapted_order, market_status) + + # assert len(order.linked_orders) == 1 # check linked orders when it will be developed + + for order in identical_orders: + assert isinstance(order, BuyLimitOrder) + assert order.currency == adapted_order.currency + assert order.symbol == adapted_order.symbol + assert order.origin_price == adapted_order.origin_price + assert order.created_last_price == adapted_order.created_last_price + assert order.order_type == adapted_order.order_type + assert order.side == adapted_order.side + assert order.status == adapted_order.status + assert order.exchange == adapted_order.exchange + assert order.trader == adapted_order.trader + assert order.currency_total_fees == adapted_order.currency_total_fees + assert order.market_total_fees == adapted_order.market_total_fees + assert order.filled_price == adapted_order.filled_price + assert order.origin_quantity == 1000000000000.0 + assert order.origin_quantity > adapted_order.origin_quantity + assert order.filled_quantity > adapted_order.filled_quantity + assert order.is_simulated == adapted_order.is_simulated + assert order.linked_to == adapted_order.linked_to + + _check_order_limits(order, market_status) + + # assert len(order.linked_orders) == 1 # check linked orders when it will be developed + + +def _get_evaluations_gradient(step): + nb_steps = 1/step + return [i/nb_steps for i in range(int(-nb_steps), int(nb_steps+1), 1)] + + +def _get_states_gradient_with_invald_states(): + states = [state for state in EvaluatorStates] + states += [None, 1, {'toto': 1}, math.nan] + return states + + +def _get_irrationnal_numbers(): + irrationals = [math.pi, math.sqrt(2), math.sqrt(3), math.sqrt(5), math.sqrt(7), math.sqrt(11), math.sqrt(73), 10/3] + return [1/i for i in irrationals] + + +def _reset_portfolio(portfolio): + portfolio.set_starting_simulated_portfolio() + portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 2000 + } + + +def _check_orders(orders, evaluation, state, nb_orders, market_status): + + if state == EvaluatorStates.NEUTRAL: + assert orders is None + else: + if math.isnan(evaluation): + assert orders is None + elif math.isnan(evaluation): + assert orders is None + elif state not in EvaluatorStates: + assert orders is None + else: + assert (not orders and nb_orders == 0) or (len(orders) == nb_orders) \ + or ((len(orders) == 0 or len(orders) == 1) and nb_orders == "unknown") + if orders: + order = orders[0] + assert order.status == OrderStatus.OPEN + assert order.is_simulated is True + assert order.linked_to is None + assert order.currency_total_fees == 0 + assert order.market_total_fees == 0 + assert order.filled_price == 0 + assert order.filled_quantity == order.origin_quantity + + if state == EvaluatorStates.VERY_SHORT: + assert isinstance(order, SellMarketOrder) + assert order.side == TradeOrderSide.SELL + assert order.order_type == TraderOrderType.SELL_MARKET + elif state == EvaluatorStates.SHORT: + assert isinstance(order, SellLimitOrder) + assert order.side == TradeOrderSide.SELL + assert order.order_type == TraderOrderType.SELL_LIMIT + elif state == EvaluatorStates.VERY_LONG: + assert isinstance(order, BuyMarketOrder) + assert order.side == TradeOrderSide.BUY + assert order.order_type == TraderOrderType.BUY_MARKET + elif state == EvaluatorStates.LONG: + assert isinstance(order, BuyLimitOrder) + assert order.side == TradeOrderSide.BUY + assert order.order_type == TraderOrderType.BUY_LIMIT + + _check_order_limits(order, market_status) + + +def _check_portfolio(portfolio, initial_portfolio, orders, only_positivity=False): + if orders: + orders_market_amount = 0 + orders_currency_amount = 0 + market = orders[0].market + order_symbol = orders[0].currency + for order in orders: + assert order.market == market + assert order.currency == order_symbol + if order.side == TradeOrderSide.BUY: + orders_market_amount += order.origin_quantity * order.origin_price + else: + orders_currency_amount += order.origin_quantity + for symbol in portfolio.portfolio: + assert portfolio.portfolio[symbol][Portfolio.TOTAL] >= 0 + assert portfolio.portfolio[symbol][Portfolio.AVAILABLE] >= 0 + if not only_positivity: + if order_symbol == symbol: + assert initial_portfolio[symbol][Portfolio.TOTAL] == portfolio.portfolio[symbol][Portfolio.TOTAL] + assert "{:f}".format(initial_portfolio[symbol][Portfolio.AVAILABLE] - orders_currency_amount) \ + == "{:f}".format(portfolio.portfolio[symbol][Portfolio.AVAILABLE]) + elif market == symbol: + assert initial_portfolio[market][Portfolio.TOTAL] == portfolio.portfolio[market][Portfolio.TOTAL] + assert "{:f}".format(initial_portfolio[market][Portfolio.AVAILABLE] - orders_market_amount) \ + == "{:f}".format(portfolio.portfolio[market][Portfolio.AVAILABLE]) + + +def test_create_order_using_a_lot_of_different_inputs_with_portfolio_reset(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + order_creator = EvaluatorOrderCreator() + gradient_step = 0.001 + nb_orders = 1 + market_status = exchange.get_market_status(symbol) + initial_portfolio = copy.deepcopy(portfolio.portfolio) + # portfolio: "BTC": 10 "USD": 1000 + min_trigger_market = "ADA/BNB" + + for state in _get_states_gradient_with_invald_states(): + for evaluation in _get_evaluations_gradient(gradient_step): + _reset_portfolio(portfolio) + # orders are possible + orders = order_creator.create_new_order(evaluation, symbol, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, nb_orders, market_status) + _check_portfolio(portfolio, initial_portfolio, orders) + # orders are impossible + orders = order_creator.create_new_order(evaluation, min_trigger_market, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, 0, market_status) + _check_portfolio(portfolio, initial_portfolio, orders) + + for evaluation in _get_irrationnal_numbers(): + # orders are possible + _reset_portfolio(portfolio) + orders = order_creator.create_new_order(evaluation, symbol, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, nb_orders, market_status) + _check_portfolio(portfolio, initial_portfolio, orders) + # orders are impossible + orders = order_creator.create_new_order(evaluation, min_trigger_market, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, 0, market_status) + _check_portfolio(portfolio, initial_portfolio, orders) + + _reset_portfolio(portfolio) + # orders are possible + orders = order_creator.create_new_order(math.nan, symbol, exchange, trader, portfolio, state) + _check_orders(orders, math.nan, state, nb_orders, market_status) + _check_portfolio(portfolio, initial_portfolio, orders) + # orders are impossible + orders = order_creator.create_new_order(math.nan, min_trigger_market, exchange, trader, portfolio, state) + _check_orders(orders, math.nan, state, 0, market_status) + _check_portfolio(portfolio, initial_portfolio, orders) + + +def _fill_orders(orders, trader): + if orders: + for order in orders: + order.filled_price = order.origin_price + order.filled_quantity = order.origin_quantity + trader.notify_order_close(order) + _check_portfolio(trader.portfolio, None, orders, True) + + +def test_create_order_using_a_lot_of_different_inputs_without_portfolio_reset(): + config, exchange, trader, symbol = _get_tools() + portfolio = trader.get_portfolio() + order_creator = EvaluatorOrderCreator() + gradient_step = 0.001 + nb_orders = "unknown" + market_status = exchange.get_market_status(symbol) + # portfolio: "BTC": 10 "USD": 1000 + min_trigger_market = "ADA/BNB" + + _reset_portfolio(portfolio) + initial_portfolio = portfolio.portfolio + for state in _get_states_gradient_with_invald_states(): + for evaluation in _get_evaluations_gradient(gradient_step): + # orders are possible + orders = order_creator.create_new_order(evaluation, symbol, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, nb_orders, market_status) + _check_portfolio(portfolio, initial_portfolio, orders, True) + _fill_orders(orders, trader) + # orders are impossible + orders = order_creator.create_new_order(evaluation, min_trigger_market, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, 0, market_status) + _check_portfolio(portfolio, initial_portfolio, orders, True) + _fill_orders(orders, trader) + + _reset_portfolio(portfolio) + initial_portfolio = portfolio.portfolio + for state in _get_states_gradient_with_invald_states(): + for evaluation in _get_irrationnal_numbers(): + # orders are possible + orders = order_creator.create_new_order(evaluation, symbol, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, nb_orders, market_status) + _check_portfolio(portfolio, initial_portfolio, orders, True) + _fill_orders(orders, trader) + # orders are impossible + orders = order_creator.create_new_order(evaluation, min_trigger_market, exchange, trader, portfolio, state) + _check_orders(orders, evaluation, state, 0, market_status) + _check_portfolio(portfolio, initial_portfolio, orders, True) + _fill_orders(orders, trader) + + _reset_portfolio(portfolio) + initial_portfolio = portfolio.portfolio + for state in _get_states_gradient_with_invald_states(): + # orders are possible + orders = order_creator.create_new_order(math.nan, symbol, exchange, trader, portfolio, state) + _check_orders(orders, math.nan, state, nb_orders, market_status) + _check_portfolio(portfolio, initial_portfolio, orders, True) + _fill_orders(orders, trader) + # orders are impossible + orders = order_creator.create_new_order(math.nan, min_trigger_market, exchange, trader, portfolio, state) + _check_orders(orders, math.nan, state, 0, market_status) + _check_portfolio(portfolio, initial_portfolio, orders, True) + _fill_orders(orders, trader) diff --git a/tests/unit_tests/evaluator_tests/test_evaluator_threads_manager.py b/tests/unit_tests/evaluator_tests/test_evaluator_threads_manager.py new file mode 100644 index 000000000..a0f7f278d --- /dev/null +++ b/tests/unit_tests/evaluator_tests/test_evaluator_threads_manager.py @@ -0,0 +1,65 @@ +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from evaluator.symbol_evaluator import SymbolEvaluator +from trading.trader.trader_simulator import TraderSimulator +from evaluator.cryptocurrency_evaluator import CryptocurrencyEvaluator +from evaluator.evaluator_creator import EvaluatorCreator +from evaluator.evaluator import Evaluator +from tests.test_utils.config import load_test_config +from evaluator.Util.advanced_manager import AdvancedManager +from trading.trader.portfolio import Portfolio +from evaluator.Updaters.symbol_time_frames_updater import SymbolTimeFramesDataUpdaterThread +from evaluator.evaluator_threads_manager import EvaluatorThreadsManager +from config.cst import TimeFrames + + +def _get_tools(): + symbol = "BTC/USDT" + exchange_traders = {} + exchange_traders2 = {} + config = load_test_config() + time_frame = TimeFrames.ONE_HOUR + AdvancedManager.create_class_list(config) + symbol_time_frame_updater_thread = SymbolTimeFramesDataUpdaterThread() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 0.3) + trader_inst.stop_order_manager() + trader_inst2 = TraderSimulator(config, exchange_inst, 0.3) + trader_inst2.stop_order_manager() + crypto_currency_evaluator = CryptocurrencyEvaluator(config, "Bitcoin", []) + symbol_evaluator = SymbolEvaluator(config, symbol, crypto_currency_evaluator) + exchange_traders[exchange_inst.get_name()] = trader_inst + exchange_traders2[exchange_inst.get_name()] = trader_inst2 + symbol_evaluator.set_trader_simulators(exchange_traders) + symbol_evaluator.set_traders(exchange_traders2) + symbol_evaluator.strategies_eval_lists[exchange_inst.get_name()] = EvaluatorCreator.create_strategies_eval_list(config) + evaluator_thread_manager = EvaluatorThreadsManager(config, symbol, time_frame, symbol_time_frame_updater_thread, + symbol_evaluator, exchange_inst, []) + trader_inst.portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 2000 + } + return evaluator_thread_manager, time_frame, symbol_time_frame_updater_thread, symbol_evaluator + + +def test_default_values(): + evaluator_thread_manager, time_frame, symbol_time_frame_updater_thread, symbol_evaluator = _get_tools() + assert symbol_evaluator.evaluator_thread_managers[evaluator_thread_manager.exchange.get_name()][time_frame] \ + == evaluator_thread_manager + assert symbol_time_frame_updater_thread.evaluator_threads_manager_by_time_frame[time_frame] \ + == evaluator_thread_manager + assert isinstance(evaluator_thread_manager.evaluator, Evaluator) + assert evaluator_thread_manager.evaluator.get_config() == evaluator_thread_manager.config + assert evaluator_thread_manager.evaluator.get_symbol() == evaluator_thread_manager.symbol + assert evaluator_thread_manager.evaluator.get_time_frame() == evaluator_thread_manager.time_frame + assert evaluator_thread_manager.evaluator.get_exchange() == evaluator_thread_manager.exchange + assert evaluator_thread_manager.evaluator.get_symbol_evaluator() == evaluator_thread_manager.symbol_evaluator + + +def test_refresh_matrix(): + evaluator_thread_manager, time_frame, symbol_time_frame_updater_thread, symbol_evaluator = _get_tools() + evaluator_thread_manager.matrix = None + evaluator_thread_manager._refresh_matrix() + assert evaluator_thread_manager.matrix is not None diff --git a/tests/unit_tests/evaluator_tests/test_symbol_evaluator.py b/tests/unit_tests/evaluator_tests/test_symbol_evaluator.py new file mode 100644 index 000000000..f1b8b264f --- /dev/null +++ b/tests/unit_tests/evaluator_tests/test_symbol_evaluator.py @@ -0,0 +1,51 @@ +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from evaluator.symbol_evaluator import SymbolEvaluator +from trading.trader.trader_simulator import TraderSimulator +from evaluator.cryptocurrency_evaluator import CryptocurrencyEvaluator +from evaluator.evaluator_creator import EvaluatorCreator +from tests.test_utils.config import load_test_config +from evaluator.Util.advanced_manager import AdvancedManager +from trading.trader.portfolio import Portfolio +from evaluator.Updaters.symbol_time_frames_updater import SymbolTimeFramesDataUpdaterThread +from evaluator.evaluator_threads_manager import EvaluatorThreadsManager +from config.cst import TimeFrames + + +def _get_tools(): + symbol = "BTC/USDT" + exchange_traders = {} + exchange_traders2 = {} + config = load_test_config() + time_frame = TimeFrames.ONE_HOUR + AdvancedManager.create_class_list(config) + symbol_time_frame_updater_thread = SymbolTimeFramesDataUpdaterThread() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 0.3) + trader_inst.stop_order_manager() + trader_inst2 = TraderSimulator(config, exchange_inst, 0.3) + trader_inst2.stop_order_manager() + crypto_currency_evaluator = CryptocurrencyEvaluator(config, "Bitcoin", []) + symbol_evaluator = SymbolEvaluator(config, symbol, crypto_currency_evaluator) + exchange_traders[exchange_inst.get_name()] = trader_inst + exchange_traders2[exchange_inst.get_name()] = trader_inst2 + symbol_evaluator.set_trader_simulators(exchange_traders) + symbol_evaluator.set_traders(exchange_traders2) + symbol_evaluator.strategies_eval_lists[exchange_inst.get_name()] = EvaluatorCreator.create_strategies_eval_list( + config) + evaluator_thread_manager = EvaluatorThreadsManager(config, symbol, time_frame, symbol_time_frame_updater_thread, + symbol_evaluator, exchange_inst, []) + trader_inst.portfolio.portfolio["USDT"] = { + Portfolio.TOTAL: 2000, + Portfolio.AVAILABLE: 2000 + } + symbol_evaluator.add_evaluator_thread_manager(exchange_inst, symbol, time_frame, evaluator_thread_manager) + return symbol_evaluator, exchange_inst, time_frame, evaluator_thread_manager + + +def test_init(): + symbol_evaluator, exchange_inst, time_frame, evaluator_thread_manager = _get_tools() + assert symbol_evaluator.evaluator_order_creator + assert symbol_evaluator.evaluator_thread_managers[exchange_inst.get_name()][time_frame] == evaluator_thread_manager diff --git a/tests/unit_tests/services_tests/__init__.py b/tests/unit_tests/services_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/test_start_bot.py b/tests/unit_tests/test_start_bot.py similarity index 67% rename from tests/test_start_bot.py rename to tests/unit_tests/test_start_bot.py index e481ad0ee..ba5a42e80 100644 --- a/tests/test_start_bot.py +++ b/tests/unit_tests/test_start_bot.py @@ -1,19 +1,21 @@ import time from config.cst import * -from bot import Crypto_Bot +from octobot import OctoBot +from tests.test_utils.config import load_test_config def test_create_bot(): # launch a bot - bot = Crypto_Bot() - bot.create_exchange_traders() + config = load_test_config() + bot = OctoBot(config) bot.stop_threads() def test_run_bot(): # launch a bot - bot = Crypto_Bot() + config = load_test_config() + bot = OctoBot(config) bot.time_frames = [TimeFrames.ONE_MINUTE] bot.create_exchange_traders() bot.create_evaluation_threads() @@ -21,7 +23,7 @@ def test_run_bot(): # let it run 2 minutes: test will fail if an exception is raised # 1.9 to stop threads before the next time frame - time.sleep(1.9*60) + time.sleep(1.9 * 60) # stop the bot bot.stop_threads() diff --git a/tests/unit_tests/tools_tests/__init__.py b/tests/unit_tests/tools_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/trading_tests/__init__.py b/tests/unit_tests/trading_tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/trading_tests/implementations/__init__.py b/tests/unit_tests/trading_tests/implementations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tests/unit_tests/trading_tests/implementations/test_binance_websocket.py b/tests/unit_tests/trading_tests/implementations/test_binance_websocket.py new file mode 100644 index 000000000..9f7f8c535 --- /dev/null +++ b/tests/unit_tests/trading_tests/implementations/test_binance_websocket.py @@ -0,0 +1,256 @@ +import time +from copy import deepcopy + +from config.cst import TimeFrames +from tests.test_utils.config import load_test_config +from tools.data_frame_util import DataFrameUtil +from trading.exchanges.websockets_exchanges import BinanceWebSocketClient + + +class TestBinanceWebSocketClient: + @staticmethod + def init_default(): + config = load_test_config() + binance_web_socket = BinanceWebSocketClient(config) + return config, binance_web_socket + + @staticmethod + def price_message_header(stream, data): + return { + "stream": stream, + "data": data + } + + @staticmethod + def _ticker_message(symbol): + return TestBinanceWebSocketClient.price_message_header("@ticker", { + "e": "24hrTicker", # Event type + "E": 123456789, # Event time + "s": symbol, # Symbol + "p": "0.0015", # Price change + "P": "250.00", # Price change percent + "w": "0.0018", # Weighted average price + "x": "0.0009", # Previous day's close price + "c": "0.0025", # Current day's close price + "Q": "10", # Close trade's quantity + "b": "0.0024", # Best bid price + "B": "10", # Best bid quantity + "a": "0.0026", # Best ask price + "A": "100", # Best ask quantity + "o": "0.0010", # Open price + "h": "0.0025", # High price + "l": "0.0010", # Low price + "v": "10000", # Total traded base asset volume + "q": "18", # Total traded quote asset volume + "O": 0, # Statistics open time + "C": 86400000, # Statistics close time + "F": 0, # First trade ID + "L": 18150, # Last trade Id + "n": 18151 # Total number of trades + }) + + @staticmethod + def _kline_message(symbol, open_price, close_price, high_price, low_price, start_time, interval): + return TestBinanceWebSocketClient.price_message_header("@kline", { + "e": "kline", # Event type + "E": 123456789, # Event time + "s": symbol, # Symbol + "k": { + "t": start_time, # Kline start time + "T": 123460000, # Kline close time + "s": "BNBBTC", # Symbol + "i": interval, # Interval + "f": 100, # First trade ID + "L": 200, # Last trade ID + "o": open_price, # Open price + "c": close_price, # Close price + "h": high_price, # High price + "l": low_price, # Low price + "v": "1000", # Base asset volume + "n": 100, # Number of trades + "x": False, # Is this kline closed? + "q": "1.0000", # Quote asset volume + "V": "500", # Taker buy base asset volume + "Q": "0.500", # Taker buy quote asset volume + "B": "123456" # Ignore + } + }) + + @staticmethod + def _update_order_message(symbol, side, price, quantity, type, filled_qty, status): + return { + "e": "executionReport", # Event type + "E": 1499405658658, # Event time + "s": symbol, # Symbol + "c": "mUvoqJxFIILMdfAW5iGSOW", # Client order ID + "S": side, # Side + "o": type, # Order type + "f": "GTC", # Time in force + "q": quantity, # Order quantity + "p": price, # Order price + "P": "0.00000000", # Stop price + "F": "0.00000000", # Iceberg quantity + "g": -1, # Ignore + "C": "null", # Original client order ID; This is the ID of the order being canceled + "x": "NEW", # Current execution type + "X": status, # Current order status + "r": "NONE", # Order reject reason; will be an error code. + "i": 4293153, # Order ID + "l": "0.00000000", # Last executed quantity + "z": filled_qty, # Cumulative filled quantity + "L": "0.00000000", # Last executed price + "n": "0", # Commission amount + "N": None, # Commission asset + "T": 1499405658657, # Transaction time + "t": -1, # Trade ID + "I": 8641984, # Ignore + "w": True, # Is the order working? Stops will have + "m": False, # Is this trade the maker side? + "M": False # Ignore + } + + @staticmethod + def _update_portfolio_message(symbols_data): + msg = { + "e": "outboundAccountInfo", + "E": 1499405658849, + "m": 0, + "t": 0, + "b": 0, # Buyer commission rate (bips) + "s": 0, # Seller commission rate (bips) + "T": True, # Can trade? + "W": True, # Can withdraw? + "D": True, # Can deposit? + "u": 1499405658848, # Time of last account update + "B": [] + } + + for symbol_data in symbols_data: + msg["B"].append({ + "a": symbol_data["asset"], + "f": symbol_data["free"], + "l": symbol_data["locked"], + }) + + return msg + + def test_update_portfolio(self): + _, binance_web_socket = self.init_default() + + origin_pf = deepcopy(binance_web_socket.get_portfolio()) + + # test with empty request + binance_web_socket.user_callback(self._update_portfolio_message([])) + new_pf = binance_web_socket.get_portfolio() + assert origin_pf == new_pf + + # test with not empty request + binance_web_socket.user_callback(self._update_portfolio_message([{ + "asset": "BTC", + "free": 0.5, + "locked": 1, + }])) + new_pf = binance_web_socket.get_portfolio() + assert origin_pf != new_pf + + new_origin_pf = deepcopy(binance_web_socket.get_portfolio()) + + # test with empty request + binance_web_socket.user_callback(self._update_portfolio_message([])) + new_pf = binance_web_socket.get_portfolio() + assert new_origin_pf == new_pf + + # test with not empty request and not empty pf + binance_web_socket.user_callback(self._update_portfolio_message([{ + "asset": "BTC", + "free": 0.2, + "locked": 15, + }])) + new_pf = binance_web_socket.get_portfolio() + assert new_origin_pf != new_pf + new_origin_pf = deepcopy(binance_web_socket.get_portfolio()) + + # test with not empty request and diff symbol + binance_web_socket.user_callback(self._update_portfolio_message([{ + "asset": "ETH", + "free": 25.69, + "locked": 31547, + }])) + new_pf = binance_web_socket.get_portfolio() + assert new_origin_pf["BTC"] == new_pf["BTC"] + new_origin_pf = deepcopy(binance_web_socket.get_portfolio()) + + # test with not empty request and multiple symbol + binance_web_socket.user_callback(self._update_portfolio_message([{ + "asset": "XRP", + "free": 25978, + "locked": 315047, + }, { + "asset": "LTC", + "free": 25478.5877, + "locked": 14875.1445, + }, { + "asset": "BCH", + "free": 0.00015, + "locked": 0.1055456, + }])) + new_pf = binance_web_socket.get_portfolio() + assert new_origin_pf["BTC"] == new_pf["BTC"] + assert new_origin_pf["ETH"] == new_pf["ETH"] + assert new_pf["XRP"]["free"] == 25978 + assert new_pf["LTC"]["used"] == 14875.1445 + assert new_pf["BCH"]["total"] == 0.00015 + 0.1055456 + + def test_update_order(self): + _, binance_web_socket = self.init_default() + + # msg = self._update_order_message(None, None, None, None, None, None, None) + # binance_web_socket.user_callback(msg) + + def test_add_price(self): + _, binance_web_socket = self.init_default() + + # # fake candle data + # symbol_candle_data = [[time.time(), 100, 150, 90, 120, 1000]] + # symbol_candle_data_frame = DataFrameUtil.candles_array_to_data_frame(symbol_candle_data) + # + # exchange_data = binance_web_socket.exchange_data + # + # exchange_data.symbol_prices = {"BTCUSDT": {TimeFrames.ONE_MINUTE.value: [], + # TimeFrames.THIRTY_MINUTES.value: []}, + # "ETHBTC": {TimeFrames.ONE_HOUR.value: [], + # TimeFrames.TWO_HOURS.value: [], + # TimeFrames.FOUR_HOURS.value: []}, + # "XRPETH": {TimeFrames.ONE_DAY.value: []}} + # + # exchange_data.initialize_candles_data("BTCUSDT", + # TimeFrames.ONE_MINUTE, + # symbol_candle_data, + # symbol_candle_data_frame) + # + # msg = self._kline_message("BTCUSDT", 60, 70, 80, 50, 100000, TimeFrames.ONE_MINUTE.value) + # binance_web_socket.all_currencies_prices_callback(msg) + + def test_set_ticker(self): + _, binance_web_socket = self.init_default() + + exchange_data = binance_web_socket.exchange_data + + msg = self._ticker_message("BTCUSDT") + binance_web_socket.all_currencies_prices_callback(msg) + + assert "BTCUSDT" in exchange_data.symbol_tickers + assert exchange_data.symbol_tickers["BTCUSDT"] == msg["data"] + + def test_close_and_restart_socket(self): + _, binance_web_socket = self.init_default() + + # TODO + # old_socket_manager = deepcopy(binance_web_socket.get_socket_manager()) + + msg = {"data": {"e": "error"}} + binance_web_socket.all_currencies_prices_callback(msg) + + # new_socket_manager = binance_web_socket.get_socket_manager() + + # assert old_socket_manager != new_socket_manager diff --git a/tests/unit_tests/trading_tests/test_exchange_simulator.py b/tests/unit_tests/trading_tests/test_exchange_simulator.py new file mode 100644 index 000000000..70512c833 --- /dev/null +++ b/tests/unit_tests/trading_tests/test_exchange_simulator.py @@ -0,0 +1,174 @@ +import ccxt +from pandas import DataFrame + +from config.cst import CONFIG_ENABLED_OPTION, CONFIG_BACKTESTING, TimeFrames, HOURS_TO_MSECONDS +from tests.test_utils.config import load_test_config +from trading.exchanges.exchange_manager import ExchangeManager +from trading.trader.trader_simulator import TraderSimulator + + +class TestExchangeSimulator: + DEFAULT_SYMBOL = "BTC/USDT" + DEFAULT_TF = TimeFrames.ONE_HOUR + + @staticmethod + def init_default(): + config = load_test_config() + config[CONFIG_BACKTESTING][CONFIG_ENABLED_OPTION] = True + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + exchange_simulator = exchange_inst.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 1) + return config, exchange_inst, exchange_simulator, trader_inst + + @staticmethod + def stop(trader): + trader.stop_order_manager() + + def test_get_symbol_prices_data_frame(self): + _, exchange_inst, _, trader_inst = self.init_default() + + test_df = exchange_inst.get_symbol_prices( + self.DEFAULT_SYMBOL, + TimeFrames.ONE_HOUR, + data_frame=True) + + assert type(test_df) is DataFrame + + self.stop(trader_inst) + + def test_get_symbol_prices_list(self): + _, exchange_inst, _, trader_inst = self.init_default() + + test_list = exchange_inst.get_symbol_prices( + self.DEFAULT_SYMBOL, + TimeFrames.ONE_HOUR, + data_frame=False) + + assert isinstance(test_list, list) + + self.stop(trader_inst) + + def test_multiple_get_symbol_prices(self): + _, exchange_inst, _, trader_inst = self.init_default() + + first_data = exchange_inst.get_symbol_prices( + self.DEFAULT_SYMBOL, + self.DEFAULT_TF, + data_frame=False) + + second_data = exchange_inst.get_symbol_prices( + self.DEFAULT_SYMBOL, + self.DEFAULT_TF, + data_frame=False) + + # different arrays + assert first_data != second_data + + # second is first with DEFAULT_TF difference + assert first_data[1] == second_data[0] + assert first_data[0][0] + HOURS_TO_MSECONDS == second_data[0][0] + + # end is end -1 with DEFAULT_TF difference + assert first_data[-1] == second_data[-2] + assert first_data[-1][0] + HOURS_TO_MSECONDS == second_data[-1][0] + + self.stop(trader_inst) + + def test_get_recent_trades(self): + _, exchange_inst, _, trader_inst = self.init_default() + + exchange_inst.get_recent_trades(self.DEFAULT_SYMBOL) + + self.stop(trader_inst) + + def test_get_all_currencies_price_ticker(self): + _, exchange_inst, _, trader_inst = self.init_default() + + exchange_inst.get_all_currencies_price_ticker() + + self.stop(trader_inst) + + def test_should_update_data(self): + _, exchange_inst, exchange_simulator, trader_inst = self.init_default() + + # first call + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + # call get prices + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR) + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS) + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY) + + # call with trader without order + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR) + + trader_inst.get_order_manager().order_list = [1] + # call with trader with order and not recent trade + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + # call with trader with order and not enough recent trade + exchange_simulator.fetched_trades_counter[self.DEFAULT_SYMBOL] += 1 + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + # call with trader with order and enough recent trade + exchange_simulator.fetched_trades_counter[self.DEFAULT_SYMBOL] += 2 + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR) + + # call with trader with order and not enough recent trade + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + # call with trader with order and enough recent trade + exchange_simulator.fetched_trades_counter[self.DEFAULT_SYMBOL] += 1 + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR) + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + exchange_inst.get_symbol_prices(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + # call with trader with order and not enough recent trade + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + # call with trader with order and enough recent trade + exchange_simulator.fetched_trades_counter[self.DEFAULT_SYMBOL] += 1 + assert exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_HOUR, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.FOUR_HOURS, trader_inst) + assert not exchange_simulator.should_update_data(self.DEFAULT_SYMBOL, TimeFrames.ONE_DAY, trader_inst) + + self.stop(trader_inst) + + def test_should_update_recent_trades(self): + _, exchange_inst, exchange_simulator, trader_inst = self.init_default() + + assert exchange_simulator.should_update_recent_trades(self.DEFAULT_SYMBOL) + exchange_simulator.time_frame_get_times[self.DEFAULT_TF.value] += 1 + + assert exchange_simulator.should_update_recent_trades(self.DEFAULT_SYMBOL) + + # call with not enough time frame refresh + assert not exchange_simulator.should_update_recent_trades(self.DEFAULT_SYMBOL) + + exchange_simulator.time_frame_get_times[self.DEFAULT_TF.value] += 1 + assert exchange_simulator.should_update_recent_trades(self.DEFAULT_SYMBOL) + + # call with not enough time frame refresh + assert not exchange_simulator.should_update_recent_trades(self.DEFAULT_SYMBOL) + assert not exchange_simulator.should_update_recent_trades(self.DEFAULT_SYMBOL) + + self.stop(trader_inst) diff --git a/tests/unit_tests/trading_tests/test_order.py b/tests/unit_tests/trading_tests/test_order.py new file mode 100644 index 000000000..01f4ac4e2 --- /dev/null +++ b/tests/unit_tests/trading_tests/test_order.py @@ -0,0 +1,169 @@ +import random + +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from config.cst import TradeOrderSide, SIMULATOR_LAST_PRICES_TO_CHECK, TraderOrderType, OrderStatus +from tests.test_utils.config import load_test_config +from trading.trader.order import Order, OrderConstants +from trading.trader.trader_simulator import TraderSimulator + + +class TestOrder: + @staticmethod + def init_default(): + config = load_test_config() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 2) + order_inst = Order(trader_inst) + return config, order_inst, trader_inst, exchange_inst + + @staticmethod + def stop(trader): + trader.stop_order_manager() + + def test_get_profitability(self): + _, order_inst, trader_inst, _ = self.init_default() + + # Test filled_price > create_last_price + # test side SELL + order_filled_sup_side_sell_inst = Order(trader_inst) + order_filled_sup_side_sell_inst.side = TradeOrderSide.SELL + order_filled_sup_side_sell_inst.filled_price = 10 + order_filled_sup_side_sell_inst.created_last_price = 9 + assert order_filled_sup_side_sell_inst.get_profitability() == (-(1 - 10 / 9)) + + # test side BUY + order_filled_sup_side_sell_inst = Order(trader_inst) + order_filled_sup_side_sell_inst.side = TradeOrderSide.BUY + order_filled_sup_side_sell_inst.filled_price = 15.114778 + order_filled_sup_side_sell_inst.created_last_price = 7.265 + assert order_filled_sup_side_sell_inst.get_profitability() == (1 - 15.114778 / 7.265) + + # Test filled_price < create_last_price + # test side SELL + order_filled_sup_side_sell_inst = Order(trader_inst) + order_filled_sup_side_sell_inst.side = TradeOrderSide.SELL + order_filled_sup_side_sell_inst.filled_price = 11.556877 + order_filled_sup_side_sell_inst.created_last_price = 20 + assert order_filled_sup_side_sell_inst.get_profitability() == (1 - 20 / 11.556877) + + # test side BUY + order_filled_sup_side_sell_inst = Order(trader_inst) + order_filled_sup_side_sell_inst.side = TradeOrderSide.BUY + order_filled_sup_side_sell_inst.filled_price = 8 + order_filled_sup_side_sell_inst.created_last_price = 14.35 + assert order_filled_sup_side_sell_inst.get_profitability() == (-(1 - 14.35 / 8)) + + # Test filled_price == create_last_price + # test side SELL + order_filled_sup_side_sell_inst = Order(trader_inst) + order_filled_sup_side_sell_inst.side = TradeOrderSide.SELL + order_filled_sup_side_sell_inst.filled_price = 1517374.4567 + order_filled_sup_side_sell_inst.created_last_price = 1517374.4567 + assert order_filled_sup_side_sell_inst.get_profitability() == 0 + + # test side BUY + order_filled_sup_side_sell_inst = Order(trader_inst) + order_filled_sup_side_sell_inst.side = TradeOrderSide.BUY + order_filled_sup_side_sell_inst.filled_price = 0.4275587387858527 + order_filled_sup_side_sell_inst.created_last_price = 0.4275587387858527 + assert order_filled_sup_side_sell_inst.get_profitability() == 0 + + self.stop(trader_inst) + + def test_check_last_prices(self): + _, order_inst, trader_inst, _ = self.init_default() + + # test price in last trades + # test inferior TRUE + max_price = 10 + min_price = 4 + recent_trades = [{"price": random.uniform(min_price, max_price)} + for _ in range(0, SIMULATOR_LAST_PRICES_TO_CHECK)] + + # append validating trade + recent_trades.append({"price": min_price}) + order_inst.last_prices = recent_trades + assert order_inst.check_last_prices(max_price, inferior=True) + + # test inferior FALSE + max_price = 10.454677 + min_price = 2.4273 + recent_trades = [{"price": random.uniform(min_price, max_price)} + for _ in range(0, SIMULATOR_LAST_PRICES_TO_CHECK)] + + # append validating trade + recent_trades.append({"price": max_price}) + order_inst.last_prices = recent_trades + assert order_inst.check_last_prices(random.uniform(min_price, max_price - 1), inferior=False) + + # test price not in last trades + # test inferior TRUE + max_price = 7456.15555632315 + min_price = 1421.1488845 + recent_trades = [{"price": random.uniform(min_price, max_price)} + for _ in range(0, SIMULATOR_LAST_PRICES_TO_CHECK)] + + order_inst.last_prices = recent_trades + assert not order_inst.check_last_prices(min_price, inferior=True) + + # test inferior FALSE + max_price = 0.0001243753 + min_price = 0.000012557753 + recent_trades = [{"price": random.uniform(min_price, max_price)} + for _ in range(0, SIMULATOR_LAST_PRICES_TO_CHECK)] + + order_inst.last_prices = recent_trades + assert not order_inst.check_last_prices(max_price, inferior=False) + + self.stop(trader_inst) + + def test_new(self): + config, order_inst, trader_inst, exchange_inst = self.init_default() + + # with real trader + order_inst.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "BTC/USDT", + 10000, + 1, + price=None, + stop_price=None, + order_notifier=None) + + assert order_inst.get_order_type() == OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET] + assert order_inst.get_order_symbol() == "BTC/USDT" + assert order_inst.get_create_last_price() == 10000 + assert order_inst.get_origin_quantity() == 1 + assert order_inst.get_creation_time() != 0 + assert order_inst.get_currency_and_market() == ('BTC', 'USDT') + assert order_inst.get_side() is None + assert order_inst.get_status() == OrderStatus.OPEN + + order_inst.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS_LIMIT], + "ETH/BTC", + 0.1, + 5.2, + price=0.12, + stop_price=0.9, + order_notifier=None) + assert order_inst.origin_stop_price == 0.9 + assert order_inst.last_prices is None + assert order_inst.origin_price == 0.12 + + # with simulated trader + trader_sim_inst = TraderSimulator(config, exchange_inst, 1) + order_sim_inst = Order(trader_sim_inst) + + order_sim_inst.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_MARKET], + "LTC/USDT", + 100, + 3.22, + price=None, + stop_price=None, + order_notifier=None) + assert order_sim_inst.get_status() == OrderStatus.OPEN + + self.stop(trader_inst) + self.stop(trader_sim_inst) diff --git a/tests/unit_tests/trading_tests/test_orders_manager.py b/tests/unit_tests/trading_tests/test_orders_manager.py new file mode 100644 index 000000000..784419729 --- /dev/null +++ b/tests/unit_tests/trading_tests/test_orders_manager.py @@ -0,0 +1,35 @@ +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from tests.test_utils.config import load_test_config +from trading.trader.trader import Trader + + +class TestOrdersManagers: + @staticmethod + def init_default(): + config = load_test_config() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = Trader(config, exchange_inst, 1) + order_manager_inst = trader_inst.get_order_manager() + return config, exchange_inst, trader_inst, order_manager_inst + + @staticmethod + def stop(trader): + trader.stop_order_manager() + + def test_add_order_to_list(self): + pass + + def test_remove_order_from_list(self): + pass + + def test_update_last_symbol_list(self): + pass + + def test_update_last_symbol_prices(self): + pass + + def test_in_run(self): + pass diff --git a/tests/unit_tests/trading_tests/test_portfolio.py b/tests/unit_tests/trading_tests/test_portfolio.py new file mode 100644 index 000000000..cef687b96 --- /dev/null +++ b/tests/unit_tests/trading_tests/test_portfolio.py @@ -0,0 +1,754 @@ +import random + +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from config.cst import TraderOrderType, SIMULATOR_LAST_PRICES_TO_CHECK +from tests.test_utils.config import load_test_config +from trading.trader.order import BuyMarketOrder, OrderConstants, SellLimitOrder, BuyLimitOrder, SellMarketOrder, \ + StopLossOrder +from trading.trader.portfolio import Portfolio +from trading.trader.trader_simulator import TraderSimulator + + +class TestPortfolio: + @staticmethod + def init_default(): + config = load_test_config() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 1) + portfolio_inst = Portfolio(config, trader_inst) + trader_inst.stop_order_manager() + return config, portfolio_inst, exchange_inst, trader_inst + + @staticmethod + def fill_limit_or_stop_order(limit_or_stop_order, min_price, max_price): + last_prices = [] + for i in range(0, SIMULATOR_LAST_PRICES_TO_CHECK): + last_prices.insert(i, {}) + last_prices[i]["price"] = random.uniform(min_price, max_price) + + limit_or_stop_order.last_prices = last_prices + limit_or_stop_order.update_order_status() + + @staticmethod + def fill_market_order(market_order, price): + last_prices = [{ + "price": price + }] + + market_order.last_prices = last_prices + market_order.update_order_status() + + def test_load_portfolio(self): + _, portfolio_inst, _, trader_inst = self.init_default() + portfolio_inst._load_portfolio() + assert portfolio_inst.portfolio == {'BTC': {'available': 10, 'total': 10}, + 'USD': {'available': 1000, 'total': 1000} + } + + def test_get_currency_portfolio(self): + _, portfolio_inst, _, trader_inst = self.init_default() + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("NANO", Portfolio.TOTAL) == 0 + + def test_update_portfolio_data(self): + _, portfolio_inst, _, trader_inst = self.init_default() + portfolio_inst._update_portfolio_data("BTC", -5) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 5 + portfolio_inst._update_portfolio_data("BTC", -6, total=False, available=True) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 4 + portfolio_inst._update_portfolio_data("XRP", 4.5, total=True, available=True) + assert portfolio_inst.get_currency_portfolio("XRP", Portfolio.AVAILABLE) == 4.5 + + def test_update_portfolio_available(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "BTC/USD", + 70, + 10, + 70) + # test buy order creation + portfolio_inst.update_portfolio_available(market_buy, True) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 300 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # test buy order canceled --> return to init state and the update_portfolio will sync TOTAL with AVAILABLE + portfolio_inst.update_portfolio_available(market_buy, False) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1000 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # Test sell order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 60, + 8, + 60) + # test sell order creation + portfolio_inst.update_portfolio_available(limit_sell, True) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 2 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1000 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # test sell order canceled --> return to init state and the update_portfolio will sync TOTAL with AVAILABLE + portfolio_inst.update_portfolio_available(limit_sell, False) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1000 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + def test_update_portfolio(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 70, + 10, + 70) + + # update portfolio with creations + portfolio_inst.update_portfolio_available(limit_buy, True) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 300 + + self.fill_limit_or_stop_order(limit_buy, 69, 71) + + portfolio_inst.update_portfolio(limit_buy) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 20 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 300 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 20 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 300 + + # Test buy order + market_sell = SellMarketOrder(trader_inst) + market_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_MARKET], + "BTC/USD", + 80, + 8, + 80) + + # update portfolio with creations + portfolio_inst.update_portfolio_available(market_sell, True) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 12 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 300 + + self.fill_market_order(market_sell, 80) + + # when filling market sell + portfolio_inst.update_portfolio(market_sell) + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 12 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 940 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 12 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 940 + + def test_update_portfolio_with_filled_orders(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + market_sell = SellMarketOrder(trader_inst) + market_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_MARKET], + "BTC/USD", + 70, + 3, + 70) + + self.fill_market_order(market_sell, 70) + + # Test sell order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 100, + 4.2, + 100) + + # Test stop loss order + stop_loss = StopLossOrder(trader_inst) + stop_loss.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 80, + 4.2, + 80) + + limit_sell.add_linked_order(stop_loss) + stop_loss.add_linked_order(limit_sell) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 50, + 2, + 50) + + self.fill_limit_or_stop_order(limit_buy, 49, 51) + + # update portfolio with creations + portfolio_inst.update_portfolio_available(market_sell, True) + portfolio_inst.update_portfolio_available(limit_sell, True) + portfolio_inst.update_portfolio_available(stop_loss, True) + portfolio_inst.update_portfolio_available(limit_buy, True) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 2.8 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 900 + + # when cancelling limit sell, market sell and stop orders + portfolio_inst.update_portfolio_available(stop_loss, False) + portfolio_inst.update_portfolio_available(limit_sell, False) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 7 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 900 + + # when filling limit buy + portfolio_inst.update_portfolio(limit_buy) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 9 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 900 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 12 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 900 + + # when filling market sell + portfolio_inst.update_portfolio(market_sell) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 9 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1110 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 9 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1110 + + def test_update_portfolio_with_cancelled_orders(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + market_sell = SellMarketOrder(trader_inst) + market_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_MARKET], + "BTC/USD", + 80, + 4.1, + 80) + + # Test sell order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 10, + 4.2, + 10) + + # Test stop loss order + stop_loss = StopLossOrder(trader_inst) + stop_loss.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 80, + 3.6, + 80) + + portfolio_inst.update_portfolio_available(stop_loss, True) + portfolio_inst.update_portfolio_available(limit_sell, True) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 50, + 4, + 50) + + portfolio_inst.update_portfolio_available(limit_buy, True) + portfolio_inst.update_portfolio_available(market_sell, True) + + assert round(portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE), 1) == 1.7 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 800 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # with no filled orders + portfolio_inst.update_portfolio_available(stop_loss, False) + portfolio_inst.update_portfolio_available(limit_sell, False) + portfolio_inst.update_portfolio_available(limit_buy, False) + portfolio_inst.update_portfolio_available(market_sell, False) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1000 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + def test_update_portfolio_with_stop_loss_orders(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 90, + 4, + 90) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 50, + 4, + 50) + + # Test stop loss order + stop_loss = StopLossOrder(trader_inst) + stop_loss.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 60, + 4, + 60) + + self.fill_limit_or_stop_order(stop_loss, 59, 61) + + portfolio_inst.update_portfolio_available(stop_loss, True) + portfolio_inst.update_portfolio_available(limit_sell, True) + portfolio_inst.update_portfolio_available(limit_buy, True) + + assert round(portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE), 1) == 6 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 800 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # cancel limits + portfolio_inst.update_portfolio_available(limit_buy, False) + portfolio_inst.update_portfolio_available(limit_sell, False) + + # filling stop loss + # typical stop loss behavior --> update available before update portfolio + portfolio_inst.update_portfolio(stop_loss) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 6 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1240 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 6 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1240 + + def test_update_portfolio_with_some_filled_orders(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 90, + 4, + 90) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 60, + 2, + 60) + + # Test buy order + limit_buy_2 = BuyLimitOrder(trader_inst) + limit_buy_2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 50, + 4, + 50) + + # Test sell order + limit_sell_2 = SellLimitOrder(trader_inst) + limit_sell_2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 10, + 2, + 10) + + # Test stop loss order + stop_loss_2 = StopLossOrder(trader_inst) + stop_loss_2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 10, + 2, + 10) + + # Test sell order + limit_sell_3 = SellLimitOrder(trader_inst) + limit_sell_3.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 20, + 1, + 20) + + # Test stop loss order + stop_loss_3 = StopLossOrder(trader_inst) + stop_loss_3.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 20, + 1, + 20) + + portfolio_inst.update_portfolio_available(stop_loss_2, True) + portfolio_inst.update_portfolio_available(stop_loss_3, True) + portfolio_inst.update_portfolio_available(limit_sell, True) + portfolio_inst.update_portfolio_available(limit_sell_2, True) + portfolio_inst.update_portfolio_available(limit_sell_3, True) + portfolio_inst.update_portfolio_available(limit_buy, True) + portfolio_inst.update_portfolio_available(limit_buy_2, True) + + assert round(portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE), 1) == 3 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 680 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # cancels + portfolio_inst.update_portfolio_available(stop_loss_3, False) + portfolio_inst.update_portfolio_available(limit_sell_2, False) + portfolio_inst.update_portfolio_available(limit_buy, False) + + # filling + self.fill_limit_or_stop_order(stop_loss_2, 9, 11) + self.fill_limit_or_stop_order(limit_sell, 89, 91) + self.fill_limit_or_stop_order(limit_sell_3, 19, 21) + self.fill_limit_or_stop_order(limit_buy_2, 49, 51) + + portfolio_inst.update_portfolio(stop_loss_2) + portfolio_inst.update_portfolio(limit_sell) + portfolio_inst.update_portfolio(limit_sell_3) + portfolio_inst.update_portfolio(limit_buy_2) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 7 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1200 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 7 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1200 + + def test_update_portfolio_with_multiple_filled_orders(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 90, + 4, + 90) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 60, + 2, + 60) + + # Test buy order + limit_buy_2 = BuyLimitOrder(trader_inst) + limit_buy_2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 50, + 4, + 50) + + # Test buy order + limit_buy_3 = BuyLimitOrder(trader_inst) + limit_buy_3.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 46, + 2, + 46) + + # Test buy order + limit_buy_4 = BuyLimitOrder(trader_inst) + limit_buy_4.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 41, + 1.78, + 41) + + # Test buy order + limit_buy_5 = BuyLimitOrder(trader_inst) + limit_buy_5.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 0.2122427, + 3.72448, + 0.2122427) + + # Test buy order + limit_buy_6 = BuyLimitOrder(trader_inst) + limit_buy_6.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 430, + 1.05, + 430) + + # Test sell order + limit_sell_2 = SellLimitOrder(trader_inst) + limit_sell_2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 10, + 2, + 10) + + # Test stop loss order + stop_loss_2 = StopLossOrder(trader_inst) + stop_loss_2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 10, + 2, + 10) + + # Test sell order + limit_sell_3 = SellLimitOrder(trader_inst) + limit_sell_3.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 20, + 1, + 20) + + # Test stop loss order + stop_loss_3 = StopLossOrder(trader_inst) + stop_loss_3.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 20, + 1, + 20) + + # Test sell order + limit_sell_4 = SellLimitOrder(trader_inst) + limit_sell_4.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 50, + 0.2, + 50) + + # Test stop loss order + stop_loss_4 = StopLossOrder(trader_inst) + stop_loss_4.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 45, + 0.2, + 45) + + # Test sell order + limit_sell_5 = SellLimitOrder(trader_inst) + limit_sell_5.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 11, + 0.7, + 11) + + # Test stop loss order + stop_loss_5 = StopLossOrder(trader_inst) + stop_loss_5.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 9, + 0.7, + 9) + + portfolio_inst.update_portfolio_available(stop_loss_2, True) + portfolio_inst.update_portfolio_available(stop_loss_3, True) + portfolio_inst.update_portfolio_available(stop_loss_4, True) + portfolio_inst.update_portfolio_available(stop_loss_5, True) + portfolio_inst.update_portfolio_available(limit_sell, True) + portfolio_inst.update_portfolio_available(limit_sell_2, True) + portfolio_inst.update_portfolio_available(limit_sell_3, True) + portfolio_inst.update_portfolio_available(limit_sell_4, True) + portfolio_inst.update_portfolio_available(limit_sell_5, True) + portfolio_inst.update_portfolio_available(limit_buy, True) + portfolio_inst.update_portfolio_available(limit_buy_2, True) + portfolio_inst.update_portfolio_available(limit_buy_3, True) + portfolio_inst.update_portfolio_available(limit_buy_4, True) + portfolio_inst.update_portfolio_available(limit_buy_5, True) + portfolio_inst.update_portfolio_available(limit_buy_6, True) + + assert round(portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE), 1) == 2.1 + assert round(portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE), 7) == 62.7295063 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # cancels + portfolio_inst.update_portfolio_available(stop_loss_3, False) + portfolio_inst.update_portfolio_available(stop_loss_5, False) + portfolio_inst.update_portfolio_available(limit_sell_2, False) + portfolio_inst.update_portfolio_available(limit_buy, False) + portfolio_inst.update_portfolio_available(limit_buy_3, False) + portfolio_inst.update_portfolio_available(limit_buy_5, False) + portfolio_inst.update_portfolio_available(limit_sell_4, False) + + # filling + self.fill_limit_or_stop_order(stop_loss_2, 9, 11) + self.fill_limit_or_stop_order(limit_sell, 89, 91) + self.fill_limit_or_stop_order(limit_sell_3, 19, 21) + self.fill_limit_or_stop_order(limit_buy_2, 49, 51) + self.fill_limit_or_stop_order(limit_sell_5, 9, 12) + self.fill_limit_or_stop_order(stop_loss_4, 44, 46) + self.fill_limit_or_stop_order(limit_buy_4, 40, 42) + self.fill_limit_or_stop_order(limit_buy_5, 0.2122426, 0.2122428) + self.fill_limit_or_stop_order(limit_buy_6, 429, 431) + + portfolio_inst.update_portfolio(stop_loss_2) + portfolio_inst.update_portfolio(limit_buy_4) + portfolio_inst.update_portfolio(limit_sell) + portfolio_inst.update_portfolio(limit_sell_3) + portfolio_inst.update_portfolio(limit_buy_2) + portfolio_inst.update_portfolio(limit_sell_5) + portfolio_inst.update_portfolio(stop_loss_4) + portfolio_inst.update_portfolio(limit_buy_5) + portfolio_inst.update_portfolio(limit_buy_6) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 12.65448 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 692.22 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 12.65448 + assert round(portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL), 7) == 691.4295063 + + def test_update_portfolio_with_multiple_symbols_orders(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "ETH/USD", + 7, + 100, + 7) + + # test buy order creation + portfolio_inst.update_portfolio_available(market_buy, True) + assert portfolio_inst.get_currency_portfolio("ETH", Portfolio.AVAILABLE) == 0 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 300 + assert portfolio_inst.get_currency_portfolio("ETH", Portfolio.TOTAL) == 0 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + self.fill_market_order(market_buy, 7) + + portfolio_inst.update_portfolio(market_buy) + assert portfolio_inst.get_currency_portfolio("ETH", Portfolio.AVAILABLE) == 100 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 300 + assert portfolio_inst.get_currency_portfolio("ETH", Portfolio.TOTAL) == 100 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 300 + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "LTC/BTC", + 0.0135222, + 100, + 0.0135222) + + # test buy order creation + portfolio_inst.update_portfolio_available(market_buy, True) + assert portfolio_inst.get_currency_portfolio("LTC", Portfolio.AVAILABLE) == 0 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 8.647780000000001 + assert portfolio_inst.get_currency_portfolio("LTC", Portfolio.TOTAL) == 0 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + + self.fill_market_order(market_buy, 0.0135222) + + portfolio_inst.update_portfolio(market_buy) + assert portfolio_inst.get_currency_portfolio("LTC", Portfolio.AVAILABLE) == 100 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 8.647780000000001 + assert portfolio_inst.get_currency_portfolio("LTC", Portfolio.TOTAL) == 100 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 8.647780000000001 + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "XRP/BTC", + 0.00012232132312312, + 3000.1214545, + 0.00012232132312312) + + # test buy order creation + portfolio_inst.update_portfolio_available(limit_buy, True) + assert portfolio_inst.get_currency_portfolio("XRP", Portfolio.AVAILABLE) == 0 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 8.280801174155501 + assert portfolio_inst.get_currency_portfolio("XRP", Portfolio.TOTAL) == 0 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 8.647780000000001 + + # cancel + portfolio_inst.update_portfolio_available(limit_buy, False) + assert portfolio_inst.get_currency_portfolio("XRP", Portfolio.AVAILABLE) == 0 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 8.647780000000001 + assert portfolio_inst.get_currency_portfolio("XRP", Portfolio.TOTAL) == 0 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 8.647780000000001 + + def test_reset_portfolio_available(self): + config, portfolio_inst, _, trader_inst = self.init_default() + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 90, + 4, + 90) + + portfolio_inst.update_portfolio_available(limit_sell, True) + portfolio_inst.reset_portfolio_available() + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1000 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # Test sell order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "BTC/USD", + 90, + 4, + 90) + + portfolio_inst.update_portfolio_available(limit_sell, True) + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "VEN/BTC", + 0.5, + 4, + 0.5) + + portfolio_inst.update_portfolio_available(limit_buy, True) + + # Test buy order + btc_limit_buy = BuyLimitOrder(trader_inst) + btc_limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 10, + 50, + 10) + + portfolio_inst.update_portfolio_available(btc_limit_buy, True) + + # Test buy order + btc_limit_buy2 = BuyLimitOrder(trader_inst) + btc_limit_buy2.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + "BTC/USD", + 10, + 50, + 10) + + portfolio_inst.update_portfolio_available(btc_limit_buy2, True) + + # reset equivalent of the ven buy order + portfolio_inst.reset_portfolio_available("BTC", 4*0.5) + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 6 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 0 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 + + # reset equivalent of the btc buy orders 1 and 2 + portfolio_inst.reset_portfolio_available("USD") + + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.AVAILABLE) == 6 + assert portfolio_inst.get_currency_portfolio("BTC", Portfolio.TOTAL) == 10 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.AVAILABLE) == 1000 + assert portfolio_inst.get_currency_portfolio("USD", Portfolio.TOTAL) == 1000 diff --git a/tests/unit_tests/trading_tests/test_trader.py b/tests/unit_tests/trading_tests/test_trader.py new file mode 100644 index 000000000..cbc0b0595 --- /dev/null +++ b/tests/unit_tests/trading_tests/test_trader.py @@ -0,0 +1,362 @@ +import ccxt +import copy + +from trading.exchanges.exchange_manager import ExchangeManager +from config.cst import * +from tests.test_utils.config import load_test_config +from trading.trader.order import * +from trading.trader.order_notifier import OrderNotifier +from trading.trader.trader import Trader +from trading.trader.trader_simulator import TraderSimulator +from trading.trader.portfolio import Portfolio + + +class TestTrader: + DEFAULT_SYMBOL = "BTC/USDT" + + @staticmethod + def init_default(): + config = load_test_config() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = TraderSimulator(config, exchange_inst, 2) + return config, exchange_inst, trader_inst + + @staticmethod + def stop(trader): + trader.stop_order_manager() + + def test_enabled(self): + config, _, trader_inst = self.init_default() + self.stop(trader_inst) + + config[CONFIG_TRADER][CONFIG_ENABLED_OPTION] = True + assert Trader.enabled(config) + + config[CONFIG_TRADER][CONFIG_ENABLED_OPTION] = False + assert not Trader.enabled(config) + + def test_get_risk(self): + config, exchange_inst, trader_inst = self.init_default() + self.stop(trader_inst) + + config[CONFIG_TRADER][CONFIG_TRADER_RISK] = 0 + trader_1 = Trader(config, exchange_inst) + assert trader_1.get_risk() == CONFIG_TRADER_RISK_MIN + self.stop(trader_1) + + config[CONFIG_TRADER][CONFIG_TRADER_RISK] = 2 + trader_2 = Trader(config, exchange_inst) + assert trader_2.get_risk() == CONFIG_TRADER_RISK_MAX + self.stop(trader_2) + + config[CONFIG_TRADER][CONFIG_TRADER_RISK] = 0.5 + trader_2 = Trader(config, exchange_inst) + assert trader_2.get_risk() == 0.5 + self.stop(trader_2) + + def test_cancel_order(self): + _, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + self.DEFAULT_SYMBOL, + 70, + 10, + 70) + + assert market_buy not in trader_inst.get_open_orders() + + trader_inst.get_order_manager().add_order_to_list(market_buy) + + assert market_buy in trader_inst.get_open_orders() + + trader_inst.cancel_order(market_buy) + + assert market_buy not in trader_inst.get_open_orders() + + self.stop(trader_inst) + + def test_cancel_open_orders_default_symbol(self): + config, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + self.DEFAULT_SYMBOL, + 70, + 10, + 70) + + # Test sell order + market_sell = SellMarketOrder(trader_inst) + market_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_MARKET], + self.DEFAULT_SYMBOL, + 70, + 10, + 70) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + self.DEFAULT_SYMBOL, + 70, + 10, + 70) + + # create order notifier to prevent None call + market_buy.order_notifier = OrderNotifier(config, market_buy) + market_sell.order_notifier = OrderNotifier(config, market_sell) + limit_buy.order_notifier = OrderNotifier(config, limit_buy) + + trader_inst.get_order_manager().add_order_to_list(market_buy) + trader_inst.get_order_manager().add_order_to_list(market_sell) + trader_inst.get_order_manager().add_order_to_list(limit_buy) + + assert market_buy in trader_inst.get_open_orders() + assert market_sell in trader_inst.get_open_orders() + assert limit_buy in trader_inst.get_open_orders() + + trader_inst.cancel_open_orders(self.DEFAULT_SYMBOL) + + assert market_buy not in trader_inst.get_open_orders() + assert market_sell not in trader_inst.get_open_orders() + assert limit_buy not in trader_inst.get_open_orders() + + self.stop(trader_inst) + + def test_cancel_open_orders_multi_symbol(self): + config, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "BTC/EUR", + 70, + 10, + 70) + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "NANO/USDT", + 70, + 10, + 70) + + # Test sell order + market_sell = SellMarketOrder(trader_inst) + market_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_MARKET], + self.DEFAULT_SYMBOL, + 70, + 10, + 70) + + # Test buy order + limit_buy = BuyLimitOrder(trader_inst) + limit_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_LIMIT], + self.DEFAULT_SYMBOL, + 70, + 10, + 70) + + # create order notifier to prevent None call + market_buy.order_notifier = OrderNotifier(config, market_buy) + market_sell.order_notifier = OrderNotifier(config, market_sell) + limit_buy.order_notifier = OrderNotifier(config, limit_buy) + limit_sell.order_notifier = OrderNotifier(config, limit_sell) + + trader_inst.get_order_manager().add_order_to_list(market_buy) + trader_inst.get_order_manager().add_order_to_list(market_sell) + trader_inst.get_order_manager().add_order_to_list(limit_buy) + trader_inst.get_order_manager().add_order_to_list(limit_sell) + + assert market_buy in trader_inst.get_open_orders() + assert market_sell in trader_inst.get_open_orders() + assert limit_buy in trader_inst.get_open_orders() + assert limit_sell in trader_inst.get_open_orders() + + trader_inst.cancel_open_orders(self.DEFAULT_SYMBOL) + + assert market_buy in trader_inst.get_open_orders() + assert market_sell not in trader_inst.get_open_orders() + assert limit_buy not in trader_inst.get_open_orders() + assert limit_sell in trader_inst.get_open_orders() + + self.stop(trader_inst) + + def test_notify_order_close(self): + config, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "BTC/EUR", + 70, + 10, + 70) + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "NANO/USDT", + 70, + 10, + 70) + + # Test stop loss order + stop_loss = StopLossOrder(trader_inst) + stop_loss.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 60, + 10, + 60) + + # create order notifier to prevent None call + market_buy.order_notifier = OrderNotifier(config, market_buy) + limit_sell.order_notifier = OrderNotifier(config, limit_sell) + stop_loss.order_notifier = OrderNotifier(config, stop_loss) + + trader_inst.get_order_manager().add_order_to_list(market_buy) + trader_inst.get_order_manager().add_order_to_list(stop_loss) + trader_inst.get_order_manager().add_order_to_list(limit_sell) + + trader_inst.notify_order_close(limit_sell, True) + trader_inst.notify_order_close(market_buy, True) + + assert market_buy not in trader_inst.get_open_orders() + assert limit_sell not in trader_inst.get_open_orders() + assert stop_loss in trader_inst.get_open_orders() + + self.stop(trader_inst) + + def test_notify_sell_limit_order_cancel(self): + config, _, trader_inst = self.init_default() + initial_portfolio = copy.deepcopy(trader_inst.portfolio.portfolio) + + # Test buy order + limit_buy = trader_inst.create_order_instance(order_type=TraderOrderType.BUY_LIMIT, + symbol="BQX/BTC", + current_price=4, + quantity=2, + price=4) + + trader_inst.create_order(limit_buy, trader_inst.portfolio) + + trader_inst.notify_order_close(limit_buy, True) + + assert limit_buy not in trader_inst.get_open_orders() + + assert initial_portfolio == trader_inst.portfolio.portfolio + + self.stop(trader_inst) + + def test_notify_sell_limit_order_cancel_one_in_two(self): + config, _, trader_inst = self.init_default() + initial_portfolio = copy.deepcopy(trader_inst.portfolio.portfolio) + + # Test buy order + limit_buy = trader_inst.create_order_instance(order_type=TraderOrderType.BUY_LIMIT, + symbol="BQX/BTC", + current_price=4, + quantity=2, + price=4) + + trader_inst.create_order(limit_buy, trader_inst.portfolio) + + # Test second buy order + second_limit_buy = trader_inst.create_order_instance(order_type=TraderOrderType.BUY_LIMIT, + symbol="VEN/BTC", + current_price=1, + quantity=1.5, + price=1) + + trader_inst.create_order(second_limit_buy, trader_inst.portfolio) + + # Cancel only 1st one + trader_inst.notify_order_close(limit_buy, True) + + assert limit_buy not in trader_inst.get_open_orders() + assert second_limit_buy in trader_inst.get_open_orders() + + assert initial_portfolio != trader_inst.portfolio.portfolio + assert trader_inst.portfolio.portfolio["BTC"][Portfolio.AVAILABLE] == 8.5 + assert trader_inst.portfolio.portfolio["BTC"][Portfolio.TOTAL] == 10 + + self.stop(trader_inst) + + def test_notify_sell_limit_order_fill(self): + config, _, trader_inst = self.init_default() + initial_portfolio = copy.deepcopy(trader_inst.portfolio.portfolio) + + # Test buy order + limit_buy = trader_inst.create_order_instance(order_type=TraderOrderType.BUY_LIMIT, + symbol="BQX/BTC", + current_price=0.1, + quantity=10, + price=0.1) + + trader_inst.create_order(limit_buy, trader_inst.portfolio) + + limit_buy.filled_price = limit_buy.origin_price + limit_buy.filled_quantity = limit_buy.origin_quantity + + trader_inst.notify_order_close(limit_buy) + + assert limit_buy not in trader_inst.get_open_orders() + + assert initial_portfolio != trader_inst.portfolio.portfolio + assert trader_inst.portfolio.portfolio["BTC"][Portfolio.AVAILABLE] == 9 + assert trader_inst.portfolio.portfolio["BTC"][Portfolio.TOTAL] == 9 + assert trader_inst.portfolio.portfolio["BQX"][Portfolio.AVAILABLE] == 10 + assert trader_inst.portfolio.portfolio["BQX"][Portfolio.TOTAL] == 10 + + self.stop(trader_inst) + + def test_notify_order_close_with_linked_orders(self): + config, _, trader_inst = self.init_default() + + # Test buy order + market_buy = BuyMarketOrder(trader_inst) + market_buy.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.BUY_MARKET], + "BTC/EUR", + 70, + 10, + 70) + + # Test buy order + limit_sell = SellLimitOrder(trader_inst) + limit_sell.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.SELL_LIMIT], + "NANO/USDT", + 70, + 10, + 70) + + # Test stop loss order + stop_loss = StopLossOrder(trader_inst) + stop_loss.new(OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + "BTC/USD", + 60, + 10, + 60) + + stop_loss.add_linked_order(limit_sell) + limit_sell.add_linked_order(stop_loss) + + # create order notifier to prevent None call + market_buy.order_notifier = OrderNotifier(config, market_buy) + stop_loss.order_notifier = OrderNotifier(config, stop_loss) + limit_sell.order_notifier = OrderNotifier(config, limit_sell) + + trader_inst.get_order_manager().add_order_to_list(market_buy) + trader_inst.get_order_manager().add_order_to_list(stop_loss) + trader_inst.get_order_manager().add_order_to_list(limit_sell) + + trader_inst.notify_order_close(limit_sell) + + assert market_buy in trader_inst.get_open_orders() + assert stop_loss not in trader_inst.get_open_orders() + assert limit_sell not in trader_inst.get_open_orders() + + self.stop(trader_inst) diff --git a/tests/unit_tests/trading_tests/test_trades_manager.py b/tests/unit_tests/trading_tests/test_trades_manager.py new file mode 100644 index 000000000..803819edd --- /dev/null +++ b/tests/unit_tests/trading_tests/test_trades_manager.py @@ -0,0 +1,46 @@ +import ccxt + +from trading.exchanges.exchange_manager import ExchangeManager +from config.cst import * +from tests.test_utils.config import load_test_config +from trading.trader.trader import Trader +from trading.trader.trades_manager import TradesManager + + +class TestTradesManager: + @staticmethod + def init_default(): + config = load_test_config() + exchange_manager = ExchangeManager(config, ccxt.binance, is_simulated=True) + exchange_inst = exchange_manager.get_exchange() + trader_inst = Trader(config, exchange_inst, 1) + trades_manager_inst = trader_inst.get_trades_manager() + return config, exchange_inst, trader_inst, trades_manager_inst + + @staticmethod + def stop(trader): + trader.stop_order_manager() + + def test_get_reference_market(self): + config, _, trader_inst, _ = self.init_default() + assert TradesManager.get_reference_market(config) == DEFAULT_REFERENCE_MARKET + + config[CONFIG_TRADER][CONFIG_TRADER_REFERENCE_MARKET] = "ETH" + assert TradesManager.get_reference_market(config) == "ETH" + + self.stop(trader_inst) + + def test_get_portfolio_current_value(self): + pass + + def test_get_portfolio_origin_value(self): + pass + + def test_get_profitability_without_update(self): + pass + + def test_get_profitability(self): + pass + + def test_add_new_trade_in_history(self): + pass diff --git a/tools/__init__.py b/tools/__init__.py index fcd7a0e40..e69de29bb 100644 --- a/tools/__init__.py +++ b/tools/__init__.py @@ -1 +0,0 @@ -from .notifications import * \ No newline at end of file diff --git a/tools/asynchronous_client.py b/tools/asynchronous_server.py similarity index 74% rename from tools/asynchronous_client.py rename to tools/asynchronous_server.py index d1df5f57a..6b38a3cbc 100644 --- a/tools/asynchronous_client.py +++ b/tools/asynchronous_server.py @@ -1,8 +1,9 @@ import threading +import logging from queue import Queue -class AsynchronousClient: +class AsynchronousServer: def __init__(self, callback_method): self.is_computing = False @@ -22,5 +23,7 @@ def process_queue(self): try: while not self.queue.empty(): self.callback_method(*self.queue.get()) + except Exception as e: + logging.getLogger(self.__class__.__name__).error("Error while processing queue: {0}".format(e)) finally: - self.is_computing = False \ No newline at end of file + self.is_computing = False diff --git a/tools/benchmarks/__init__.py b/tools/benchmarks/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/tools/benchmarks/pandas_dataframes_benchmark.py b/tools/benchmarks/pandas_dataframes_benchmark.py new file mode 100644 index 000000000..3db877535 --- /dev/null +++ b/tools/benchmarks/pandas_dataframes_benchmark.py @@ -0,0 +1,99 @@ +import pandas +import random +import time + +from config.cst import * +from tools.data_frame_util import DataFrameUtil + + +# candle list: time, open, high, low, close, vol +def gen_candle(val, index): + return [index+1000, val*0.9, val*1.1, val*0.85, val, val/10] + + +def print_result(description, exec_time, iterations_count, container_size): + print("{}: {}ms for: {} iterations on a container of {} elements" + .format(description, exec_time, iterations_count, container_size) + ) + + +candles = [ + gen_candle(val, int(index)) + for index, val in enumerate([float(100*random.random()) for i in range(50000)]) +] + +start_time = time.time() +df = DataFrameUtil.candles_array_to_data_frame(candles) +print_result("candles_array_to_data_frame", time.time()-start_time, len(candles), len(df)) + +new_candles = [ + gen_candle(val, int(index)) + for index, val in enumerate([float(100*random.random()) for i in range(1000)]) +] + +start_time = time.time() +for c in new_candles: + df.append(pandas.DataFrame(data=c), ignore_index=True) +print_result("append to df", time.time()-start_time, len(candles), len(df)) + +start_time = time.time() +for c in new_candles: + pandas.concat([df,pandas.DataFrame(data=c)], ignore_index=True) +print_result("concat to df", time.time()-start_time, len(candles), len(df)) + +candles2 = candles +start_time = time.time() +for c in new_candles: + candles2.append(c) +print_result("append to list", time.time()-start_time, len(candles), len(candles2)) + + +start_time = time.time() +df3 = DataFrameUtil.candles_array_to_data_frame(candles2) +print_result("list to df", time.time()-start_time, len(candles2), len(df3)) + + +mega_candles = [ + gen_candle(val, int(index)) + for index, val in enumerate([float(100*random.random()) for i in range(200000)]) +] +start_time = time.time() +df = DataFrameUtil.candles_array_to_data_frame(mega_candles) +print_result("candles_array_to_data_frame", time.time()-start_time, len(mega_candles), len(df)) + +start_time = time.time() +for c in new_candles: + pandas.concat([df,pandas.DataFrame(data=c)], ignore_index=True) +print_result("concat to df", time.time()-start_time, len(new_candles), len(df)) + +start_time = time.time() +for c in new_candles: + df.loc[len(df)] = c +print_result("add row with loc", time.time()-start_time, len(new_candles), len(df)) + +start_time = time.time() +for c in new_candles: + df[PriceStrings.STR_PRICE_VOL.value].iloc[-1] = 8 +print_result("EDIT df", time.time()-start_time, len(new_candles), len(df)) + +start_time = time.time() +for c in new_candles: + mega_candles[-1][-1] = 8 +print_result("EDIT list", time.time()-start_time, len(new_candles), len(mega_candles)) + +start_time = time.time() +for c in new_candles: + df.drop(0) +print_result("drop head", time.time()-start_time, len(new_candles), len(df)) + +start_time = time.time() +for c in new_candles: + df.drop(0) + df.reset_index(drop=True, inplace=True) +print_result("drop head with reset-index", time.time()-start_time, len(new_candles), len(df)) + +start_time = time.time() +for c in new_candles: + df.drop(0, inplace=True) + df.reset_index(drop=True, inplace=True) +print_result("inplace drop head with re-index", time.time()-start_time, len(new_candles), len(df)) diff --git a/tools/commands.py b/tools/commands.py new file mode 100644 index 000000000..a442af2ba --- /dev/null +++ b/tools/commands.py @@ -0,0 +1,66 @@ +import os +import subprocess + +from backtesting.collector.data_collector import DataCollector +from config.cst import ORIGIN_URL +from tools.tentacle_manager import TentacleManager + + +class Commands: + @staticmethod + def update(logger, catch=False): + logger.info("Updating...") + try: + process_set_remote = subprocess.Popen(["git", "remote", "set-url", "origin", ORIGIN_URL], + stdout=subprocess.PIPE) + _ = process_set_remote.communicate()[0] + + process_pull = subprocess.Popen(["git", "pull", "origin"], stdout=subprocess.PIPE) + _ = process_pull.communicate()[0] + + process_checkout = subprocess.Popen(["git", "checkout", "beta"], stdout=subprocess.PIPE) + _ = process_checkout.communicate()[0] + + logger.info("Updated") + except Exception as e: + logger.info("Exception raised during updating process...") + if not catch: + raise e + + @staticmethod + def data_collector(config, catch=False): + data_collector_inst = None + try: + data_collector_inst = DataCollector(config) + data_collector_inst.join() + except Exception as e: + data_collector_inst.stop() + if not catch: + raise e + + @staticmethod + def package_manager(config, commands, catch=False): + try: + package_manager_inst = TentacleManager(config) + package_manager_inst.parse_commands(commands) + except Exception as e: + if not catch: + raise e + + @staticmethod + def start_bot(bot, logger, catch=False): + bot.create_exchange_traders() + bot.create_evaluation_threads() + try: + bot.start_threads() + bot.join_threads() + except Exception as e: + logger.exception("CryptBot Exception : {0}".format(e)) + if not catch: + raise e + Commands.stop_bot(bot) + + @staticmethod + def stop_bot(bot): + bot.stop_threads() + os._exit(0) diff --git a/tools/data_frame_util.py b/tools/data_frame_util.py new file mode 100644 index 000000000..6ac3fb9f7 --- /dev/null +++ b/tools/data_frame_util.py @@ -0,0 +1,35 @@ +import pandas +from config.cst import PriceStrings, PriceIndexes + + +class DataFrameUtil: + + @staticmethod + def normalize_data_frame(data_frame): + return (data_frame - data_frame.mean()) / (data_frame.max() - data_frame.min()) + + @staticmethod + def drop_nan_and_reset_index(data_frame): + result = data_frame.dropna() + result.reset_index(drop=True, inplace=True) + return result + + # Candles to dataframe + @staticmethod + def candles_array_to_data_frame(candles_array): + prices = {PriceStrings.STR_PRICE_HIGH.value: [], + PriceStrings.STR_PRICE_LOW.value: [], + PriceStrings.STR_PRICE_OPEN.value: [], + PriceStrings.STR_PRICE_CLOSE.value: [], + PriceStrings.STR_PRICE_VOL.value: [], + PriceStrings.STR_PRICE_TIME.value: []} + + for c in candles_array: + prices[PriceStrings.STR_PRICE_TIME.value].append(float(c[PriceIndexes.IND_PRICE_TIME.value])) + prices[PriceStrings.STR_PRICE_OPEN.value].append(float(c[PriceIndexes.IND_PRICE_OPEN.value])) + prices[PriceStrings.STR_PRICE_HIGH.value].append(float(c[PriceIndexes.IND_PRICE_HIGH.value])) + prices[PriceStrings.STR_PRICE_LOW.value].append(float(c[PriceIndexes.IND_PRICE_LOW.value])) + prices[PriceStrings.STR_PRICE_CLOSE.value].append(float(c[PriceIndexes.IND_PRICE_CLOSE.value])) + prices[PriceStrings.STR_PRICE_VOL.value].append(float(c[PriceIndexes.IND_PRICE_VOL.value])) + + return pandas.DataFrame(data=prices) diff --git a/tools/data_visualiser.py b/tools/data_visualiser.py new file mode 100644 index 000000000..7190585a7 --- /dev/null +++ b/tools/data_visualiser.py @@ -0,0 +1,139 @@ +import matplotlib.pyplot as plt +from matplotlib import ticker +from mpl_finance import candlestick_ohlc + +from config.cst import PriceStrings + + +# TO USE THIS TOOL PLEASE USE THIS SCRIPT +# bash ./docs/install/install-matplotlib.sh +class DataVisualiser: + @staticmethod + def show_dataframe_graph(dataframe, column): + plt.scatter(dataframe.index, dataframe[column]) + + @staticmethod + def show_candlesticks_dataframe(data_frame): + fig, ax = plt.subplots() + + DataVisualiser.get_plot_candlesticks_dataframe(data_frame, ax) + + fig.autofmt_xdate() + fig.tight_layout() + + plt.show() + + @staticmethod + def show_candlesticks_dataframe_with_indicator(prices_data_frame, indicator_data_frame, in_graph=True): + if in_graph: + n_rows = 1 + else: + n_rows = 2 + + fig, axes = plt.subplots(nrows=n_rows, sharex=True) + + if in_graph: + DataVisualiser.get_plot_candlesticks_dataframe(prices_data_frame, axes) + axe = fig.add_subplot(111, frameon=False) + axe.get_yaxis().set_ticks([]) + DataVisualiser.add_indicator_to_plot(indicator_data_frame, axe) + else: + DataVisualiser.get_plot_candlesticks_dataframe(prices_data_frame, axes[0]) + DataVisualiser.add_indicator_to_plot(indicator_data_frame, axes[1]) + + fig.autofmt_xdate() + fig.tight_layout() + + plt.show() + + @staticmethod + def show_candlesticks_dataframe_with_indicators(prices_data_frame, indicator_data_frames): + count_in_graph = 1 + for indicator_data_frame in indicator_data_frames: + if not indicator_data_frame["in_graph"]: + count_in_graph += 1 + + fig, axes = plt.subplots(nrows=count_in_graph, sharex=True) + + if count_in_graph > 1: + ref_axe = axes[0] + DataVisualiser.get_plot_candlesticks_dataframe(prices_data_frame, axes[0]) + axes[0].set_title('Symbol prices') + else: + ref_axe = axes + DataVisualiser.get_plot_candlesticks_dataframe(prices_data_frame, axes) + axes.set_title('Symbol prices') + + row = 1 + for indicator_data_frame in indicator_data_frames: + if indicator_data_frame["in_graph"]: + if indicator_data_frame["points"]: + + if indicator_data_frame["share_x"]: + share_x = ref_axe + else: + share_x = None + + if indicator_data_frame["share_y"]: + share_y = ref_axe + else: + share_y = None + + axe = fig.add_subplot(count_in_graph * 100 + 10 + row, frameon=False, + sharey=share_y, sharex=share_x) + axe.get_yaxis().set_ticks([]) + DataVisualiser.add_indicator_to_plot(indicator_data_frame["data"], + axe, + points=True) + else: + axe = fig.add_subplot(count_in_graph * 100 + 10 + row, frameon=False) + axe.get_yaxis().set_ticks([]) + DataVisualiser.add_indicator_to_plot(indicator_data_frame["data"], + axe) + else: + DataVisualiser.add_indicator_to_plot(indicator_data_frame["data"], + axes[row], + indicator_data_frame["title"]) + row += 1 + + fig.autofmt_xdate() + fig.tight_layout() + plt.show() + + @staticmethod + def add_indicator_to_plot(indicator_data_frame, ax, points=False, title=None): + DataVisualiser.get_plot_indicator_dataframe(indicator_data_frame, ax, points) + if title is not None: + ax.set_title('Axe {0}'.format(title)) + + @staticmethod + def get_plot_candlesticks_dataframe(data_frame, ax): + candlestick_ohlc(ax, + data_frame[PriceStrings.STR_PRICE_OPEN.value], + data_frame[PriceStrings.STR_PRICE_HIGH.value], + data_frame[PriceStrings.STR_PRICE_LOW.value], + data_frame[PriceStrings.STR_PRICE_CLOSE.value], + width=0.8, + colorup='#008000', + colordown='#FF0000', + alpha=1) + + # xdate = [datetime.datetime.fromtimestamp(i) for i in dataframe[PriceStrings.STR_PRICE_TIME.value]] + xdate = data_frame[PriceStrings.STR_PRICE_TIME.value].values + + ax.xaxis.set_major_locator(ticker.MaxNLocator(6)) + + def get_date(x, _): + try: + return xdate[int(x)] + except IndexError: + return '' + + ax.xaxis.set_major_formatter(ticker.FuncFormatter(get_date)) + + @staticmethod + def get_plot_indicator_dataframe(indicator_data_frame, ax, points): + if points: + ax.plot(*zip(*indicator_data_frame), marker='o', color='r', ls='') + else: + ax.plot(indicator_data_frame.values) diff --git a/tools/evaluator_divergence_analyser.py b/tools/evaluator_divergence_analyser.py new file mode 100644 index 000000000..62c2bb482 --- /dev/null +++ b/tools/evaluator_divergence_analyser.py @@ -0,0 +1,112 @@ +import logging + +from config.cst import START_PENDING_EVAL_NOTE +from tools.evaluators_util import check_valid_eval_note + + +class EvaluatorDivergenceAnalyser: + def __init__(self): + self.average_note = None + self.average_counter = None + self.matrix = None + + self.DIVERGENCE_THRESHOLD = 0.25 + + self.logger = logging.getLogger(self.__class__.__name__) + + def update(self, matrix): + self.average_note = 0 + self.average_counter = 0 + self.matrix = matrix + + self._calculate_matrix_evaluators_average() + + if self.average_counter > 0: + self.average_note /= self.average_counter + + self._check_matrix_divergence() + + # get all notes and call _add_to_average to perform the average calc + def _calculate_matrix_evaluators_average(self): + for matrix_type in self.matrix: + for evaluator_name in self.matrix[matrix_type]: + if isinstance(self.matrix[matrix_type][evaluator_name], dict): + for time_frame in self.matrix[matrix_type][evaluator_name]: + self._add_to_average(self.matrix[matrix_type][evaluator_name][time_frame]) + else: + self._add_to_average(self.matrix[matrix_type][evaluator_name]) + + def _add_to_average(self, value): + # Todo check evaluator pertinence + self.average_note += value + self.average_counter += 1 + + # Will raise a warning if calc_evaluator_divergence detect a divergence > +- DIVERGENCE_THRESHOLD + def _check_matrix_divergence(self): + for matrix_type in self.matrix: + for evaluator_name in self.matrix[matrix_type]: + if isinstance(self.matrix[matrix_type][evaluator_name], dict): + for time_frame in self.matrix[matrix_type][evaluator_name]: + if check_valid_eval_note( + self.matrix[matrix_type][evaluator_name][time_frame]): + if self._calc_eval_note_divergence(self.matrix[matrix_type][evaluator_name][time_frame]) \ + is not START_PENDING_EVAL_NOTE: + self._log_divergence(matrix_type, + evaluator_name, + self.matrix[matrix_type][evaluator_name][time_frame], + time_frame) + else: + if check_valid_eval_note(self.matrix[matrix_type][evaluator_name]): + if self._calc_eval_note_divergence(self.matrix[matrix_type][evaluator_name]) \ + is not START_PENDING_EVAL_NOTE: + self._log_divergence(matrix_type, + evaluator_name, + self.matrix[matrix_type][evaluator_name]) + + # Will be called to calculate localized divergence note calc for an evaluator name, for each time frame or a + # specific one + def calc_evaluator_divergence(self, matrix_type, evaluator_name, time_frame=None): + if time_frame is not None: + if check_valid_eval_note(self.matrix[matrix_type][evaluator_name][time_frame]): + return self._calc_eval_note_divergence(self.matrix[matrix_type][evaluator_name][time_frame]) + else: + return START_PENDING_EVAL_NOTE + + elif isinstance(self.matrix[matrix_type][evaluator_name], dict): + local_divergence_average = 0 + local_divergence_counter = 0 + for time_frame_iteration in self.matrix[matrix_type][evaluator_name]: + if check_valid_eval_note(self.matrix[matrix_type][evaluator_name][time_frame_iteration]): + result = self._calc_eval_note_divergence(self.matrix[matrix_type][evaluator_name] + [time_frame_iteration]) + if result is not START_PENDING_EVAL_NOTE: + local_divergence_average += result + local_divergence_counter += 1 + + if local_divergence_counter > 0: + return local_divergence_average / local_divergence_counter + else: + return START_PENDING_EVAL_NOTE + + else: + if check_valid_eval_note(self.matrix[matrix_type][evaluator_name]): + return self._calc_eval_note_divergence(self.matrix[matrix_type][evaluator_name]) + else: + return START_PENDING_EVAL_NOTE + + # check if the eval note is between average_note - DIVERGENCE_THRESHOLD and average_note + DIVERGENCE_THRESHOLD + def _calc_eval_note_divergence(self, eval_note): + if self.average_note <= 0: + if self.average_note + self.DIVERGENCE_THRESHOLD < eval_note < self.average_note - self.DIVERGENCE_THRESHOLD: + return START_PENDING_EVAL_NOTE + else: + if self.average_note + self.DIVERGENCE_THRESHOLD > eval_note > self.average_note - self.DIVERGENCE_THRESHOLD: + return START_PENDING_EVAL_NOTE + return eval_note + + def _log_divergence(self, matrix_type, evaluator_name, eval_note, time_frame=None): + self.logger.warning("Divergence detected on {0} {1} {2} | Average : {3} -> Eval : {4} ".format(matrix_type, + evaluator_name, + time_frame, + self.average_note, + eval_note)) diff --git a/tools/evaluators_util.py b/tools/evaluators_util.py new file mode 100644 index 000000000..37ebfb00c --- /dev/null +++ b/tools/evaluators_util.py @@ -0,0 +1,7 @@ +import math + +from config.cst import START_PENDING_EVAL_NOTE + + +def check_valid_eval_note(eval_note): + return eval_note and eval_note is not START_PENDING_EVAL_NOTE and not math.isnan(eval_note) diff --git a/tools/notifications.py b/tools/notifications.py index fe28eb9cc..4a8af010b 100644 --- a/tools/notifications.py +++ b/tools/notifications.py @@ -4,11 +4,10 @@ from enum import Enum from config.cst import CONFIG_ENABLED_OPTION, CONFIG_CATEGORY_NOTIFICATION, CONFIG_CATEGORY_SERVICES, CONFIG_GMAIL, \ - CONFIG_SERVICE_INSTANCE, CONFIG_TWITTER -from services import TwitterService + CONFIG_SERVICE_INSTANCE, CONFIG_TWITTER, CONFIG_TELEGRAM +from services import TwitterService, TelegramService from services.gmail_service import GmailService -from trading import Exchange -from trading.trader.order import OrderConstants +from tools.pretty_printer import PrettyPrinter from trading.trader.trades_manager import TradesManager @@ -28,11 +27,17 @@ def enabled(self): return False def notify_with_all(self, message): - # gmail - self.gmail_notification_factory(message, message) + try: + # gmail + self.gmail_notification_factory(message, message) - # twitter - self.twitter_notification_factory(message) + # twitter + self.twitter_notification_factory(message) + + # telegram + self.telegram_notification_factory(message) + except Exception as e: + self.logger.error("Failed to notify all : {0}".format(e)) def gmail_notification_available(self): if self.enable and NotificationTypes.MAIL.value in self.notification_type: @@ -49,6 +54,21 @@ def gmail_notification_factory(self, subject, mail): else: self.logger.debug("Mail disabled") + def telegram_notification_available(self): + if self.enable and NotificationTypes.TELEGRAM.value in self.notification_type: + if TelegramService.is_setup_correctly(self.config): + return True + return False + + def telegram_notification_factory(self, message): + if self.telegram_notification_available(): + telegram_service = self.config[CONFIG_CATEGORY_SERVICES][CONFIG_TELEGRAM][CONFIG_SERVICE_INSTANCE] + result = telegram_service.send_message(message) + if result: + self.logger.info("Telegram message sent") + else: + self.logger.debug("Telegram disabled") + def twitter_notification_available(self): if self.enable and NotificationTypes.TWITTER.value in self.notification_type: if TwitterService.is_setup_correctly(self.config): @@ -83,33 +103,34 @@ def __init__(self, config): super().__init__(config) self.tweet_instance = None - def notify_state_changed(self, final_eval, symbol_evaluator, trader, result, matrix): + def notify_state_changed(self, final_eval, crypto_currency_evaluator, symbol, trader, result, matrix): if self.gmail_notification_available(): profitability, profitability_percent, _ = trader.get_trades_manager().get_profitability() - self.gmail_notification_factory("CRYPTO BOT ALERT : {0} / {1}".format(symbol_evaluator.crypto_currency, - result), - "CRYPTO BOT ALERT : {0} / {1} \n {2} \n Current portfolio " - "profitability : {3} " - "{4} ({5}%)".format( - symbol_evaluator.crypto_currency, - result, - pprint.pformat(matrix), - round(profitability, 2), - TradesManager.get_reference_market(self.config), - round(profitability_percent, 2))) + self.gmail_notification_factory( + "CRYPTO BOT ALERT : {0} / {1}".format(crypto_currency_evaluator.crypto_currency, + result), + "CRYPTO BOT ALERT : {0} / {1} \n {2} \n Current portfolio " + "profitability : {3} " + "{4} ({5}%)".format( + crypto_currency_evaluator.crypto_currency, + result, + pprint.pformat(matrix), + round(profitability, 2), + TradesManager.get_reference_market(self.config), + round(profitability_percent, 2))) + + alert_content = PrettyPrinter.cryptocurrency_alert( + crypto_currency_evaluator.crypto_currency, + symbol, + result, + final_eval) if self.twitter_notification_available(): - # + "\n see more at https://github.com/Trading-Bot/CryptoBot" - formatted_pairs = [p.replace("/", "") for p in symbol_evaluator.get_symbol_pairs()] - self.tweet_instance = self.twitter_notification_factory("CryptoBot ALERT : #{0} " - "\n Cryptocurrency : #{1}" - "\n Result : {2}" - "\n Evaluation : {3}".format( - symbol_evaluator.crypto_currency, - " #".join(formatted_pairs), - str(result).split(".")[1], - final_eval)) + self.tweet_instance = self.twitter_notification_factory(alert_content) + + if self.telegram_notification_available(): + self.telegram_notification_factory(alert_content) return self @@ -122,69 +143,68 @@ def __init__(self, config): super().__init__(config) self.evaluator_notification = None - @staticmethod - def twitter_order_description(order_type, quantity, currency, price, market): - return "{0} : {1} {2} at {3} {4}".format( - OrderConstants.TraderOrderTypeClasses[order_type].__name__, - round(quantity, 7), - currency, - round(price, 7), - market) + def notify_create(self, evaluator_notification, orders): + if orders: + content = orders[0].trader.trader_type_str + if evaluator_notification is not None: + self.evaluator_notification = evaluator_notification - def notify_create(self, evaluator_notification, orders, symbol): - if evaluator_notification is not None: - self.evaluator_notification = evaluator_notification - - if self.twitter_notification_available() \ - and self.evaluator_notification is not None \ - and self.evaluator_notification.get_tweet_instance() is not None: - - tweet_instance = self.evaluator_notification.get_tweet_instance() - currency, market = Exchange.split_symbol(symbol) - content = "Order creation " + content += "Order(s) creation " for order in orders: - content += "\n {0}".format(OrdersNotification.twitter_order_description(order.get_order_type(), - order.get_origin_quantity(), - currency, - order.get_origin_price(), - market)) - self.twitter_response_factory(tweet_instance, content) + content += "\n- {0}".format(PrettyPrinter.open_order_pretty_printer(order)) + + if self.twitter_notification_available() \ + and self.evaluator_notification is not None \ + and self.evaluator_notification.get_tweet_instance() is not None: + tweet_instance = self.evaluator_notification.get_tweet_instance() + self.twitter_response_factory(tweet_instance, content) + + if self.telegram_notification_available(): + self.telegram_notification_factory(content) + + def notify_end(self, + order_filled, + orders_canceled, + trade_profitability, + portfolio_profitability, + portfolio_diff, + profitability=False): + + content = "" + + if order_filled is not None: + content += "\n{0}Order(s) filled : \n- {1}".format( + order_filled.trader.trader_type_str, + PrettyPrinter.open_order_pretty_printer(order_filled)) + + if orders_canceled is not None and len(orders_canceled) > 0: + content += "\n{0}Order(s) canceled :".format(orders_canceled[0].trader.trader_type_str) + for order in orders_canceled: + content += "\n- {0}".format(PrettyPrinter.open_order_pretty_printer(order)) + + if trade_profitability is not None and profitability: + content += "\n\nTrade profitability : {0}{1}%".format( + "+" if trade_profitability >= 0 else "", + round(trade_profitability * 100, 7)) + + if portfolio_profitability is not None and profitability: + content += "\nGlobal Portfolio profitability : {0}% {1}{2}%".format( + round(portfolio_profitability, 5), + "+" if portfolio_diff >= 0 else "", + round(portfolio_diff, 7)) - def notify_end(self, order_filled, orders_canceled, symbol, trade_profitability, portfolio_profitability): if self.twitter_notification_available() \ and self.evaluator_notification is not None \ and self.evaluator_notification.get_tweet_instance() is not None: - currency, market = Exchange.split_symbol(symbol) tweet_instance = self.evaluator_notification.get_tweet_instance() - content = "" - - if order_filled is not None: - content += "\nOrder(s) filled : \n- {0}".format( - OrdersNotification.twitter_order_description(order_filled.get_order_type(), - order_filled.get_origin_quantity(), - currency, - order_filled.get_origin_price(), - market)) - - if orders_canceled is not None and len(orders_canceled) > 0: - content += "\nOrder(s) canceled :" - for order in orders_canceled: - content += "\n- {0}".format(OrdersNotification.twitter_order_description(order.get_order_type(), - order.get_origin_quantity(), - currency, - order.get_origin_price(), - market)) - - if trade_profitability is not None: - content += "\n\nTrade profitability : {0} {1}".format(round(trade_profitability, 7), - TradesManager.get_reference_market(self.config)) - - if portfolio_profitability is not None: - content += "\nGlobal Portfolio profitability : {0}%".format(round(portfolio_profitability, 5)) self.twitter_response_factory(tweet_instance, content) + if self.telegram_notification_available(): + self.telegram_notification_factory(content) + class NotificationTypes(Enum): MAIL = 1 TWITTER = 2 + TELEGRAM = 3 diff --git a/tools/performance_analyser.py b/tools/performance_analyser.py index 637a2879b..96a4e82ee 100644 --- a/tools/performance_analyser.py +++ b/tools/performance_analyser.py @@ -19,7 +19,7 @@ def __init__(self): def run(self): while self.keep_running: - self.logger.info("CPU : " + str(self._get_cpu()) + "% RAM : " + str(self._get_ram_go()) + " Go") + self.logger.info("CPU : {0}% RAM : {1} Go".format(self._get_cpu(), self._get_ram_go())) time.sleep(self.interval) def stop(self): diff --git a/tools/pretty_printer.py b/tools/pretty_printer.py new file mode 100644 index 000000000..20f83c42e --- /dev/null +++ b/tools/pretty_printer.py @@ -0,0 +1,91 @@ +import datetime + +from trading.trader.order import OrderConstants +from trading.trader.portfolio import Portfolio + + +class PrettyPrinter: + @staticmethod + def open_order_pretty_printer(order): + currency, market = order.get_currency_and_market() + + try: + order_type_name = order.get_order_type().name + except AttributeError: + try: + order_type_name = OrderConstants.TraderOrderTypeClasses[order.get_order_type()].__name__ + except KeyError: + order_type_name = order.get_order_type().__class__.__name__ + + return "{0}: {1} {2} at {3} {4} on {5}: {6} ".format( + order_type_name, + PrettyPrinter.get_min_string_from_number(order.get_origin_quantity()), + currency, + PrettyPrinter.get_min_string_from_number(order.get_origin_price()), + market, + order.get_exchange().get_name(), + datetime.datetime.fromtimestamp( + order.get_creation_time() + ).strftime('%d/%m/%y %H:%M')) + + @staticmethod + def trade_pretty_printer(trade): + currency = trade.get_currency() + market = trade.get_market() + + try: + order_type_name = trade.get_order_type().name + except AttributeError: + try: + order_type_name = OrderConstants.TraderOrderTypeClasses[trade.get_order_type()].__name__ + except KeyError: + order_type_name = trade.get_order_type().__class__.__name__ + + return "{0}: {1} {2} at {3} {4} on {5}: {6} ".format( + order_type_name, + PrettyPrinter.get_min_string_from_number(trade.get_quantity()), + currency, + PrettyPrinter.get_min_string_from_number(trade.get_price()), + market, + trade.get_exchange_name(), + datetime.datetime.fromtimestamp( + trade.get_filled_time() + ).strftime('%d/%m/%y %H:%M')) + + @staticmethod + def cryptocurrency_alert(crypto_currency, symbol, result, final_eval): + return "OctoBot ALERT : #{0}\n Symbol : #{1}\n Result : {2}\n Evaluation : {3}".format( + crypto_currency, + symbol.replace("/", ""), + str(result).split(".")[1], + final_eval) + + @staticmethod + def global_portfolio_pretty_print(global_portfolio, separator="\n"): + result = ["{0} ({1}) {2}".format( + PrettyPrinter.get_min_string_from_number(amounts[Portfolio.TOTAL]), + PrettyPrinter.get_min_string_from_number(amounts[Portfolio.AVAILABLE]), + currency) + for currency, amounts in global_portfolio.items() if amounts[Portfolio.TOTAL] > 0] + + return separator.join(result) + + @staticmethod + def portfolio_profitability_pretty_print(profitability, profitability_percent, reference): + difference = "({0}%)".format(PrettyPrinter.get_min_string_from_number(profitability_percent, 5)) \ + if profitability_percent is not None else "" + return "{0} {1} {2}".format(PrettyPrinter.get_min_string_from_number(profitability, 5), + reference, difference) + + @staticmethod + def get_min_string_from_number(number, max_digits=8): + if round(number, max_digits) == 0.0: + return "0" + else: + if number % 1 != 0: + number_str = "{:.{}f}".format(round(number, max_digits), max_digits) + if "." in number_str: + number_str = number_str.rstrip("0.") + return number_str + else: + return "{:f}".format(number).split(".")[0] diff --git a/tools/symbol_util.py b/tools/symbol_util.py new file mode 100644 index 000000000..479af6ee1 --- /dev/null +++ b/tools/symbol_util.py @@ -0,0 +1,17 @@ +from config.cst import MARKET_SEPARATOR + + +# Return currency, market +def split_symbol(symbol): + splitted = symbol.split(MARKET_SEPARATOR) + return splitted[0], splitted[1] + + +# Return merged currency and market without / +def merge_symbol(symbol): + return symbol.replace(MARKET_SEPARATOR, "") + + +# Merge currency and market +def merge_currencies(currency, market): + return "{0}/{1}".format(currency, market) diff --git a/tools/tentacle_manager.py b/tools/tentacle_manager.py new file mode 100644 index 000000000..367ddd8bd --- /dev/null +++ b/tools/tentacle_manager.py @@ -0,0 +1,190 @@ +import json +import logging +import os + +import requests + +from config.cst import TENTACLES_PUBLIC_LIST, TENTACLES_DEFAULT_BRANCH, TENTACLES_PUBLIC_REPOSITORY, TENTACLE_DESCRIPTION,\ + GITHUB_RAW_CONTENT_URL, CONFIG_EVALUATOR, EVALUATOR_DEFAULT_FOLDER, CONFIG_TENTACLES_KEY, GITHUB_BASE_URL, GITHUB, \ + TENTACLE_DESCRIPTION_LOCALISATION, TENTACLE_DESCRIPTION_IS_URL, EVALUATOR_ADVANCED_FOLDER + + +class TentacleManager: + def __init__(self, config): + self.config = config + self.default_package = None + self.advanced_package_list = [] + self.logger = logging.getLogger(self.__class__.__name__) + + def update_list(self): + default_package_list_url = "{0}/{1}/{2}/{3}".format(GITHUB_BASE_URL, + TENTACLES_PUBLIC_REPOSITORY, + TENTACLES_DEFAULT_BRANCH, + TENTACLES_PUBLIC_LIST) + + self.default_package = self._get_package_description(default_package_list_url) + + if CONFIG_TENTACLES_KEY in self.config: + for package in self.config[CONFIG_TENTACLES_KEY]: + # try with package as in configuration + try: + self.advanced_package_list.append(self._get_package_description(package)) + except Exception: + try: + self.advanced_package_list.append(self._get_package_description(package, True)) + except Exception: + self.logger.error("Impossible to get a OctoBot Tentacle at : {0}".format(package)) + + @staticmethod + def _add_package_description_metadata(package_description, localisation, is_url): + to_save_loc = str(localisation) + if localisation.endswith(TENTACLES_PUBLIC_LIST): + to_save_loc = localisation[0:-len(TENTACLES_PUBLIC_LIST)] + while to_save_loc.endswith("/") or to_save_loc.endswith("\\"): + to_save_loc = to_save_loc[0:-1] + package_description[TENTACLE_DESCRIPTION] = { + TENTACLE_DESCRIPTION_LOCALISATION: to_save_loc, + TENTACLE_DESCRIPTION_IS_URL: is_url + } + + @staticmethod + def _get_package_description(url_or_path, try_to_adapt=False): + package_url_or_path = str(url_or_path) + # if its an url: download with requests.get and return text + if package_url_or_path.startswith("https://") \ + or package_url_or_path.startswith("http://") \ + or package_url_or_path.startswith("ftp://"): + if try_to_adapt: + if not package_url_or_path.endswith("/"): + package_url_or_path += "/" + # if checking on github, try adding branch and file + if GITHUB in package_url_or_path: + package_url_or_path += "{0}/{1}".format(TENTACLES_DEFAULT_BRANCH, TENTACLES_PUBLIC_LIST) + # else try adding file + else: + package_url_or_path += TENTACLES_PUBLIC_LIST + downloaded_result = json.loads(requests.get(package_url_or_path).text) + if "error" in downloaded_result and GITHUB_BASE_URL in package_url_or_path: + package_url_or_path = package_url_or_path.replace(GITHUB_BASE_URL, GITHUB_RAW_CONTENT_URL) + downloaded_result = json.loads(requests.get(package_url_or_path).text) + # add package metadata + TentacleManager._add_package_description_metadata(downloaded_result, package_url_or_path, True) + return downloaded_result + + # if its a local path: return file content + else: + if try_to_adapt: + if not package_url_or_path.endswith("/"): + package_url_or_path += "/" + package_url_or_path += TENTACLES_PUBLIC_LIST + with open(package_url_or_path, "r") as package_description: + read_result = json.loads(package_description.read()) + # add package metadata + TentacleManager._add_package_description_metadata(read_result, package_url_or_path, False) + return read_result + + @staticmethod + def _get_package_from_url(url): + package_file = requests.get(url).text + + if package_file.find("404: Not Found") != -1: + raise Exception(package_file) + + return package_file + + def _apply_module(self, module_type, module_name, module_version, module_file, target_folder): + file_dir = "{0}/{1}/{2}".format(CONFIG_EVALUATOR, module_type, target_folder) + + # Install package in evaluator + with open("{0}/{1}.py".format(file_dir, module_name), "w") as installed_package: + installed_package.write(module_file) + + # Update local __init__ + new_line_in_init = "from .{0} import *\n".format(module_name) + init_content = "" + init_file = "{0}/{1}/{2}/__init__.py".format(CONFIG_EVALUATOR, module_type, target_folder) + + if os.path.isfile(init_file): + with open(init_file, "r") as init_file_r: + init_content = init_file_r.read() + + # check if line already exists + if init_content.find(new_line_in_init) == -1: + with open(init_file, "w") as init_file_w: + # add new package to init + init_file_w.write(init_content + new_line_in_init) + + self.logger.info("{0} {1} successfully installed in: {2}" + .format(module_name, module_version, file_dir)) + + def install_module(self, package, module_name, package_localisation, is_url, target_folder): + package_type = package[module_name]["type"] + module_loc = "{0}/{1}/{2}.py".format(package_localisation, package_type, module_name) + module_version = package[module_name]["version"] + + if is_url: + module_file = self._get_package_from_url(module_loc) + else: + with open(module_loc, "r") as module: + module_file = module.read() + + self._apply_module(package_type, module_name, module_version, module_file, target_folder) + + def _try_to_install_package(self, package, target_folder): + package_description = package[TENTACLE_DESCRIPTION] + package_localisation = package_description[TENTACLE_DESCRIPTION_LOCALISATION] + is_url = package_description[TENTACLE_DESCRIPTION_IS_URL] + for module in package: + try: + if module != TENTACLE_DESCRIPTION: + self.install_module(package, module, package_localisation, is_url, target_folder) + except Exception as e: + self.logger.error("Installation failed for module '{0}' ({1})".format(module, e)) + + @staticmethod + def parse_version(version): + return int(version.replace(".", "")) + + def parse_commands(self, commands): + self.update_list() + if commands: + if commands[0] == "install": + + if commands[1] == "all": + self._try_to_install_package(self.default_package, EVALUATOR_DEFAULT_FOLDER) + for package in self.advanced_package_list: + self._try_to_install_package(package, EVALUATOR_ADVANCED_FOLDER) + else: + commands.pop(0) + for component in commands: + if component in self.default_package: + package_description = self.default_package[TENTACLE_DESCRIPTION] + package_localisation = package_description[TENTACLE_DESCRIPTION_LOCALISATION] + is_url = package_description[TENTACLE_DESCRIPTION_IS_URL] + try: + self.install_module(self.default_package, component, package_localisation, is_url, + EVALUATOR_DEFAULT_FOLDER) + except Exception: + self.logger.error("Installation failed for module '{0}'".format(component)) + else: + found = False + for advanced_package in self.advanced_package_list: + if component in advanced_package: + found = True + package_description = advanced_package[TENTACLE_DESCRIPTION] + package_localisation = package_description[TENTACLE_DESCRIPTION_LOCALISATION] + is_url = package_description[TENTACLE_DESCRIPTION_IS_URL] + try: + self.install_module(advanced_package, component, package_localisation, is_url, + EVALUATOR_ADVANCED_FOLDER) + break + except Exception: + self.logger.error("Installation failed for module '{0}'".format(component)) + if not found: + self.logger.error("Cannot find installation for module '{0}'".format(component)) + + if commands[0] == "update": + if commands[1] == "all": + pass + else: + commands.pop(0) diff --git a/tools/time_frame_manager.py b/tools/time_frame_manager.py new file mode 100644 index 000000000..d86e63fa4 --- /dev/null +++ b/tools/time_frame_manager.py @@ -0,0 +1,54 @@ +import logging + +from config.cst import TimeFramesMinutes, TimeFrames, CONFIG_TIME_FRAME + + +class TimeFrameManager: + TimeFramesRank = sorted(TimeFramesMinutes, key=TimeFramesMinutes.__getitem__) + + @staticmethod + def get_config_time_frame(config): + if CONFIG_TIME_FRAME in config: + result = [] + for time_frame in config[CONFIG_TIME_FRAME]: + try: + result.append(TimeFrames(time_frame)) + except ValueError: + logging.warning("Time frame not found : {0}".format(time_frame)) + return result + else: + return TimeFrames + + @staticmethod + def get_previous_time_frame(config_time_frames, time_frame, origin_time_frame): + current_time_frame_index = TimeFrameManager.TimeFramesRank.index(time_frame) + + if current_time_frame_index > 0: + previous = TimeFrameManager.TimeFramesRank[current_time_frame_index - 1] + if previous in config_time_frames: + return previous + else: + return TimeFrameManager.get_previous_time_frame(config_time_frames, previous, origin_time_frame) + else: + if time_frame in config_time_frames: + return time_frame + else: + return origin_time_frame + + @staticmethod + def find_min_time_frame(time_frames, min_time_frame=None): + tf_list = time_frames + if time_frames and isinstance(next(iter(time_frames)), TimeFrames): + tf_list = [t.value for t in time_frames] + min_index = 0 + if min_time_frame: + min_index = TimeFrameManager.TimeFramesRank.index(min_time_frame) + # TimeFramesRank is the ordered list of timeframes + for index, tf in enumerate(TimeFrameManager.TimeFramesRank): + tf_val = tf.value + if index >= min_index and tf_val in tf_list: + try: + return TimeFrames(tf_val) + except ValueError: + pass + return min_time_frame diff --git a/tox.ini b/tox.ini new file mode 100644 index 000000000..f9ed2686f --- /dev/null +++ b/tox.ini @@ -0,0 +1,10 @@ +[tox] +envlist = py36 + +[testenv] +commands = pytest +deps = + pytest-pep8 + pytest-cov + pytest + coverage \ No newline at end of file diff --git a/trading/__init__.py b/trading/__init__.py index 1c0fa428b..f921ceb3e 100644 --- a/trading/__init__.py +++ b/trading/__init__.py @@ -1 +1,2 @@ -from trading.exchanges.exchange import * \ No newline at end of file +from trading.exchanges.rest_exchanges.rest_exchange import * +from trading.exchanges.websockets_exchanges.websocket_exchange import * diff --git a/trading/exchanges/abstract_exchange.py b/trading/exchanges/abstract_exchange.py new file mode 100644 index 000000000..7c7de8b77 --- /dev/null +++ b/trading/exchanges/abstract_exchange.py @@ -0,0 +1,94 @@ +import logging +from abc import ABCMeta, abstractmethod + + +class AbstractExchange: + __metaclass__ = ABCMeta + + def __init__(self, config, exchange_type): + self.config = config + self.exchange_type = exchange_type + self.name = self.exchange_type.__name__ + self.logger = logging.getLogger("{0} - {1}".format(self.__class__.__name__, self.name)) + + self.exchange_manager = None + + def get_name(self): + return self.name + + def get_config(self): + return self.config + + def get_exchange_type(self): + return self.exchange_type + + def get_exchange_manager(self): + return self.exchange_manager + + @abstractmethod + def get_balance(self): + pass + + @abstractmethod + def get_symbol_prices(self, symbol, time_frame, limit=None, data_frame=True): + pass + + @abstractmethod + def get_order_book(self, symbol, limit=50): + pass + + @abstractmethod + def get_recent_trades(self, symbol): + pass + + @abstractmethod + def get_market_price(self, symbol): + pass + + @abstractmethod + def get_last_price_ticker(self, symbol): + pass + + @abstractmethod + def get_price_ticker(self, symbol): + pass + + @abstractmethod + def get_all_currencies_price_ticker(self): + pass + + @abstractmethod + def get_order(self, order_id, symbol=None): + pass + + @abstractmethod + def get_all_orders(self, symbol=None, since=None, limit=None): + pass + + @abstractmethod + def get_open_orders(self, symbol=None, since=None, limit=None): + pass + + @abstractmethod + def get_closed_orders(self, symbol=None, since=None, limit=None): + pass + + @abstractmethod + def get_my_recent_trades(self, symbol=None, since=None, limit=None): + pass + + @abstractmethod + def cancel_order(self, order_id, symbol=None): + pass + + @abstractmethod + def create_order(self, order_type, symbol, quantity, price=None, stop_price=None): + pass + + @abstractmethod + def get_market_status(self, symbol): + pass + + @abstractmethod + def get_uniform_timestamp(self, timestamp): + pass diff --git a/trading/exchanges/exchange.py b/trading/exchanges/exchange.py deleted file mode 100644 index 9a5c4a947..000000000 --- a/trading/exchanges/exchange.py +++ /dev/null @@ -1,209 +0,0 @@ -import asyncio -import logging - -import pandas -from ccxt import OrderNotFound, BaseError - -from config.cst import PriceStrings, MARKET_SEPARATOR, TraderOrderType, CONFIG_EXCHANGES - - -# https://github.com/ccxt/ccxt/wiki/Manual#api-methods--endpoints -class Exchange: - def __init__(self, config, exchange_type): - self.exchange_type = exchange_type - self.client = None - self.config = config - self.name = self.exchange_type.__name__ - self.create_client() - self.client.load_markets() - - self.all_currencies_price_ticker = None - - self.logger = logging.getLogger(self.name) - - def enabled(self): - # if we can get candlestick data - if self.name in self.config[CONFIG_EXCHANGES] and self.client.has['fetchOHLCV']: - return True - else: - self.logger.warning("Exchange {0} is currently disabled".format(self.name)) - return False - - def create_client(self): - if self.check_config(): - self.client = self.exchange_type({ - 'apiKey': self.config["exchanges"][self.name]["api-key"], - 'secret': self.config["exchanges"][self.name]["api-secret"], - 'verbose': False, - 'enableRateLimit': True - }) - else: - self.client = self.exchange_type({'verbose': False}) - self.client.logger.setLevel(logging.INFO) - - def check_config(self): - if not self.config["exchanges"][self.name]["api-key"] \ - and not self.config["exchanges"][self.name]["api-secret"]: - return False - else: - return True - - def get_name(self): - return self.name - - # 'free': { // money, available for trading, by currency - # 'BTC': 321.00, // floats... - # 'USD': 123.00, - # ... - # }, - # - # 'used': { ... }, // money on hold, locked, frozen, or pending, by currency - # - # 'total': { ... }, // total (free + used), by currency - def get_balance(self): - return self.client.fetchBalance() - - def get_symbol_prices(self, symbol, time_frame): - candles = self.client.fetch_ohlcv(symbol, time_frame.value) - - prices = {PriceStrings.STR_PRICE_HIGH.value: [], - PriceStrings.STR_PRICE_LOW.value: [], - PriceStrings.STR_PRICE_OPEN.value: [], - PriceStrings.STR_PRICE_CLOSE.value: [], - PriceStrings.STR_PRICE_VOL.value: [], - PriceStrings.STR_PRICE_TIME.value: []} - - for c in candles: - prices[PriceStrings.STR_PRICE_TIME.value].append(float(c[0])) - prices[PriceStrings.STR_PRICE_OPEN.value].append(float(c[1])) - prices[PriceStrings.STR_PRICE_HIGH.value].append(float(c[2])) - prices[PriceStrings.STR_PRICE_LOW.value].append(float(c[3])) - prices[PriceStrings.STR_PRICE_CLOSE.value].append(float(c[4])) - prices[PriceStrings.STR_PRICE_VOL.value].append(float(c[5])) - - return pandas.DataFrame(data=prices) - - # return up to ten bidasks on each side of the order book stack - def get_order_book(self, symbol, limit=30): - return self.client.fetchOrderBook(symbol, limit) - - def get_recent_trades(self, symbol): - try: - return self.client.fetch_trades(symbol) - except BaseError as e: - self.logger.error("Failed to get recent trade {0}".format(e)) - return None - - def get_market_price(self, symbol): - order_book = self.get_order_book(symbol) - bid = order_book['bids'][0][0] if len(order_book['bids']) > 0 else None - ask = order_book['asks'][0][0] if len(order_book['asks']) > 0 else None - spread = (ask - bid) if (bid and ask) else None - return {'bid': bid, 'ask': ask, 'spread': spread} - - # A price ticker contains statistics for a particular market/symbol for some period of time in recent past (24h) - def get_price_ticker(self, symbol): - try: - return self.client.fetch_ticker(symbol) - except BaseError as e: - self.logger.error("Failed to get_price_ticker {0}".format(e)) - return None - - def get_all_currencies_price_ticker(self): - try: - self.all_currencies_price_ticker = self.client.fetch_tickers() - return self.all_currencies_price_ticker - except BaseError as e: - self.logger.error("Failed to get_all_currencies_price_ticker {0}".format(e)) - return None - - # ORDERS - # { - # 'id': '12345-67890:09876/54321', // string - # 'datetime': '2017-08-17 12:42:48.000', // ISO8601 datetime with milliseconds - # 'timestamp': 1502962946216, // order placing/opening Unix timestamp in milliseconds - # 'status': 'open', // 'open', 'closed', 'canceled' - # 'symbol': 'ETH/BTC', // symbol - # 'type': 'limit', // 'market', 'limit' - # 'side': 'buy', // 'buy', 'sell' - # 'price': 0.06917684, // float price in quote currency - # 'amount': 1.5, // ordered amount of base currency - # 'filled': 1.1, // filled amount of base currency - # 'remaining': 0.4, // remaining amount to fill - # 'cost': 0.076094524, // 'filled' * 'price' - # 'trades': [ ... ], // a list of order trades/executions - # 'fee': { // fee info, if available - # 'currency': 'BTC', // which currency the fee is (usually quote) - # 'cost': 0.0009, // the fee amount in that currency - # 'rate': 0.002, // the fee rate (if available) - # }, - # 'info': { ... }, // the original unparsed order structure as is - # } - def get_order(self, order_id): - if self.client.has['fetchOrder']: - return asyncio.get_event_loop().run_until_complete(self.client.fetch_order(order_id)) - else: - return None - - def get_all_orders(self, symbol=None, since=None, limit=None): - if self.client.has['fetchOrders']: - return self.client.fetchOrders(symbol=symbol, since=since, limit=limit, params={}) - else: - return None - - def get_open_orders(self, symbol=None, since=None, limit=None): - if self.client.has['fetchClosedOrders']: - return self.client.fetchClosedOrders(symbol=symbol, since=since, limit=limit, params={}) - else: - return None - - def get_my_recent_trades(self, symbol=None, since=None, limit=None): - return self.client.fetchMyTrades(symbol=symbol, since=since, limit=limit, params={}) - - def cancel_order(self, order_id): - try: - self.client.cancel_order(order_id) - return True - except OrderNotFound: - return False - - def create_order(self, order_type, symbol, quantity, price=None, stop_price=None): - if order_type == TraderOrderType.BUY_MARKET: - self.client.create_market_buy_order(symbol, quantity) - elif order_type == TraderOrderType.BUY_LIMIT: - self.client.create_limit_buy_order(symbol, quantity, price) - elif order_type == TraderOrderType.SELL_MARKET: - self.client.create_market_sell_order(symbol, quantity) - elif order_type == TraderOrderType.SELL_LIMIT: - self.client.create_limit_sell_order(symbol, quantity, price) - elif order_type == TraderOrderType.STOP_LOSS: - pass - elif order_type == TraderOrderType.STOP_LOSS_LIMIT: - pass - elif order_type == TraderOrderType.TAKE_PROFIT: - pass - elif order_type == TraderOrderType.TAKE_PROFIT_LIMIT: - pass - - def symbol_exists(self, symbol): - if symbol in self.client.symbols: - return True - else: - return False - - def time_frame_exists(self, time_frame): - if time_frame in self.client.timeframes: - return True - else: - return False - - # Return currency, market - @staticmethod - def split_symbol(symbol): - splitted = symbol.split(MARKET_SEPARATOR) - return splitted[0], splitted[1] - - # Merge currency and market - @staticmethod - def merge_currencies(currency, market): - return "{0}/{1}".format(currency, market) \ No newline at end of file diff --git a/trading/exchanges/exchange_dispatcher.py b/trading/exchanges/exchange_dispatcher.py new file mode 100644 index 000000000..b48252986 --- /dev/null +++ b/trading/exchanges/exchange_dispatcher.py @@ -0,0 +1,195 @@ +from trading import AbstractExchange +from tools.data_frame_util import DataFrameUtil +from trading.exchanges.exchange_simulator.exchange_simulator import ExchangeSimulator + + +class ExchangeDispatcher(AbstractExchange): + def __init__(self, config, exchange_type, exchange, exchange_web_socket): + super().__init__(config, exchange_type) + + self.exchange = exchange + self.exchange_web_socket = exchange_web_socket + + self.logger.info("online with {0}".format( + "REST api{0}".format( + " and websocket api" if self.exchange_web_socket else "" + ) + )) + + def _web_socket_available(self): + return self.exchange_web_socket + + def get_name(self): + return self.exchange.get_name() + + def get_exchange_manager(self): + return self.exchange.get_exchange_manager() + + def get_exchange(self): + return self.exchange + + # total (free + used), by currency + def get_balance(self): + if self._web_socket_available() and self.exchange_web_socket.get_client().portfolio_is_initialized(): + return self.exchange_web_socket.get_balance() + else: + return self.exchange.get_balance() + + def get_symbol_prices(self, symbol, time_frame, limit=None, data_frame=True): + # if websocket is available --> get symbol price from WS + if self._web_socket_available() and self.exchange_web_socket.candles_are_initialized(symbol, time_frame): + + candles = self.exchange_web_socket.get_symbol_prices(symbol=symbol, + time_frame=time_frame, + limit=limit, + data_frame=data_frame) + return candles + + # else get price from REST exchange and init websocket (if enabled) + needs_to_init_candles = self._web_socket_available() and not \ + self.exchange_web_socket.candles_are_initialized(symbol, time_frame) + + candles = self.exchange.get_symbol_prices(symbol=symbol, + time_frame=time_frame, + limit=None if needs_to_init_candles else limit) + + if needs_to_init_candles or data_frame: + candle_data_frame = DataFrameUtil.candles_array_to_data_frame(candles) + + if needs_to_init_candles: + self.exchange_web_socket.init_candle_data(symbol, time_frame, candles, candle_data_frame) + + if data_frame: + return candle_data_frame.tail(limit) if limit is not None else candle_data_frame + + return candles[-limit:] if limit else candles + + # return bid and asks on each side of the order book stack + # careful here => can be for binance limit > 100 has a 5 weight and > 500 a 10 weight ! + def get_order_book(self, symbol, limit=50): + # websocket service not implemented yet + if self._web_socket_available(): + pass + + return self.exchange.get_order_book(symbol, limit) + + def get_recent_trades(self, symbol): + if self._web_socket_available() and self.exchange_web_socket.handles_recent_trades(): + return self.exchange_web_socket.get_recent_trades(symbol=symbol) + + return self.exchange.get_recent_trades(symbol=symbol) + + def get_market_price(self, symbol): + if self._web_socket_available(): + pass + + return self.exchange.get_market_price(symbol=symbol) + + # A price ticker contains statistics for a particular market/symbol for the last instant + def get_last_price_ticker(self, symbol): + if self._web_socket_available() and self.exchange_web_socket.get_client().last_price_ticker_is_initialized( + symbol): + return self.exchange_web_socket.get_last_price_ticker(symbol=symbol) + else: + return self.exchange.get_last_price_ticker(symbol=symbol) + + # A price ticker contains statistics for a particular market/symbol for some period of time in recent past (24h) + def get_price_ticker(self, symbol): + if self._web_socket_available(): + pass + + return self.exchange.get_price_ticker(symbol=symbol) + + def get_all_currencies_price_ticker(self): + if self._web_socket_available(): + pass + + return self.exchange.get_all_currencies_price_ticker() + + def get_market_status(self, symbol): + return self.exchange.get_market_status(symbol) + + # ORDERS + def get_order(self, order_id, symbol=None): + if self._web_socket_available() and self.exchange_web_socket.get_client().has_order(order_id): + return self.exchange_web_socket.get_order(order_id, symbol=symbol) + else: + order = self.exchange.get_order(order_id=order_id, symbol=symbol) + if self._web_socket_available(): + self.exchange_web_socket.init_orders_for_ws_if_possible([order]) + return order + + def get_all_orders(self, symbol=None, since=None, limit=None): + if self._web_socket_available() and self.exchange_web_socket.orders_are_initialized(): + return self.exchange_web_socket.get_all_orders(symbol=symbol, + since=since, + limit=limit) + else: + orders = self.exchange.get_all_orders(symbol=symbol, + since=since, + limit=limit) + if self._web_socket_available(): + self.exchange_web_socket.init_orders_for_ws_if_possible(orders) + return orders + + def get_open_orders(self, symbol=None, since=None, limit=None): + if self._web_socket_available() and self.exchange_web_socket.orders_are_initialized(): + return self.exchange_web_socket.get_open_orders(symbol=symbol, + since=since, + limit=limit) + else: + orders = self.exchange.get_open_orders(symbol=symbol, + since=since, + limit=limit) + if self._web_socket_available(): + self.exchange_web_socket.init_orders_for_ws_if_possible(orders) + return orders + + def get_closed_orders(self, symbol=None, since=None, limit=None): + if self._web_socket_available() and self.exchange_web_socket.orders_are_initialized(): + return self.exchange_web_socket.get_closed_orders(symbol=symbol, + since=since, + limit=limit) + else: + orders = self.exchange.get_closed_orders(symbol=symbol, + since=since, + limit=limit) + if self._web_socket_available(): + self.exchange_web_socket.init_orders_for_ws_if_possible(orders) + return orders + + def get_my_recent_trades(self, symbol=None, since=None, limit=None): + if self._web_socket_available(): + pass + + return self.exchange.get_my_recent_trades(symbol=symbol, + since=since, + limit=limit) + + def cancel_order(self, order_id, symbol=None): + if self._web_socket_available(): + pass + + return self.exchange.cancel_order(symbol=symbol, + order_id=order_id) + + def create_order(self, order_type, symbol, quantity, price=None, stop_price=None): + if self._web_socket_available(): + pass + + return self.exchange.create_order(symbol=symbol, + order_type=order_type, + quantity=quantity, + price=price, + stop_price=stop_price) + + def set_orders_are_initialized(self, value): + if self._web_socket_available(): + self.exchange_web_socket.set_orders_are_initialized(value) + + def stop(self): + if self._web_socket_available(): + self.exchange_web_socket.stop() + + def get_uniform_timestamp(self, timestamp): + return self.exchange.get_uniform_timestamp(timestamp) diff --git a/trading/exchanges/exchange_manager.py b/trading/exchanges/exchange_manager.py new file mode 100644 index 000000000..210db793f --- /dev/null +++ b/trading/exchanges/exchange_manager.py @@ -0,0 +1,140 @@ +import logging + +from config.cst import * +from tools.time_frame_manager import TimeFrameManager +from trading.exchanges.rest_exchanges.rest_exchange import RESTExchange +from trading import WebSocketExchange +from trading.exchanges.exchange_dispatcher import ExchangeDispatcher +from trading.exchanges.exchange_simulator.exchange_simulator import ExchangeSimulator +from trading.exchanges.websockets_exchanges import AbstractWebSocketManager + + +class ExchangeManager: + def __init__(self, config, exchange_type, is_simulated=False): + self.config = config + self.exchange_type = exchange_type + self.logger = logging.getLogger(self.__class__.__name__) + + self.is_ready = False + self.is_simulated = is_simulated + + self.exchange = None + self.exchange_web_socket = None + self.exchange_dispatcher = None + + self.client_symbols = [] + self.client_time_frames = [] + + self.traded_pairs = [] + self.time_frames = [] + + self.create_exchanges() + + def _load_constants(self): + self._load_config_symbols_and_time_frames() + self._set_config_time_frame() + self._set_config_traded_pairs() + + def websocket_available(self): + return self.exchange_web_socket + + def create_exchanges(self): + if not self.is_simulated: + # create REST based on ccxt exchange + self.exchange = RESTExchange(self.config, self.exchange_type, self) + + self._load_constants() + + # create Websocket exchange if possible + if self.check_web_socket_config(self.exchange.get_name()): + for socket_manager in AbstractWebSocketManager.__subclasses__(): + if socket_manager.get_name() == self.exchange.get_name(): + self.exchange_web_socket = WebSocketExchange(self.config, self.exchange_type, + self, socket_manager) + break + + # if simulated : create exchange simulator instance + else: + self.exchange = ExchangeSimulator(self.config, self.exchange_type, self) + + self.exchange_dispatcher = ExchangeDispatcher(self.config, self.exchange_type, + self.exchange, self.exchange_web_socket) + + self.is_ready = True + + def get_exchange(self): + return self.exchange_dispatcher + + # Exchange configuration functions + def check_config(self, exchange_name): + if CONFIG_EXCHANGE_KEY not in self.config[CONFIG_EXCHANGES][exchange_name] \ + or CONFIG_EXCHANGE_SECRET not in self.config[CONFIG_EXCHANGES][exchange_name]: + return False + else: + return True + + def check_web_socket_config(self, exchange_name): + return self.check_config(exchange_name) \ + and CONFIG_EXCHANGE_WEB_SOCKET in self.config[CONFIG_EXCHANGES][exchange_name] \ + and self.config[CONFIG_EXCHANGES][exchange_name][CONFIG_EXCHANGE_WEB_SOCKET] + + def enabled(self): + # if we can get candlestick data + if self.is_simulated or self.exchange.get_name() in self.config[CONFIG_EXCHANGES]: + return True + else: + self.logger.warning("Exchange {0} is currently disabled".format(self.exchange.get_name())) + return False + + def _set_config_time_frame(self): + for time_frame in TimeFrameManager.get_config_time_frame(self.config): + if self.time_frame_exists(time_frame.value): + self.time_frames.append(time_frame) + # add shortest timeframe for realtime evaluators + client_shortest_time_frame = TimeFrameManager.find_min_time_frame(self.client_time_frames, MIN_EVAL_TIME_FRAME) + if client_shortest_time_frame not in self.time_frames: + self.time_frames.append(client_shortest_time_frame) + + def get_config_time_frame(self): + return self.time_frames + + def _set_config_traded_pairs(self): + for cryptocurrency in self.config[CONFIG_CRYPTO_CURRENCIES]: + for symbol in self.config[CONFIG_CRYPTO_CURRENCIES][cryptocurrency][CONFIG_CRYPTO_PAIRS]: + if self.symbol_exists(symbol): + self.traded_pairs.append(symbol) + + def get_traded_pairs(self): + return self.traded_pairs + + def _load_config_symbols_and_time_frames(self): + client = self.exchange.get_client() + if client: + self.client_symbols = client.symbols + self.client_time_frames = client.timeframes + else: + self.logger.error("Failed to load client from REST exchange") + self._raise_exchange_load_error() + + def symbol_exists(self, symbol): + return symbol in self.client_symbols + + def time_frame_exists(self, time_frame): + return time_frame in self.client_time_frames + + def get_client_symbols(self): + return self.client_symbols + + def get_client_timeframes(self): + return self.client_time_frames + + def get_rate_limit(self): + return self.exchange_type.rateLimit / 1000 + + # Getters + def get_is_simulated(self): + return self.is_simulated + + # Exceptions + def _raise_exchange_load_error(self): + raise Exception("{0} - Failed to load exchange instances".format(self.exchange)) diff --git a/trading/exchanges/exchange_simulator/__init__.py b/trading/exchanges/exchange_simulator/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/trading/exchanges/exchange_simulator/exchange_simulator.py b/trading/exchanges/exchange_simulator/exchange_simulator.py new file mode 100644 index 000000000..12d9ba111 --- /dev/null +++ b/trading/exchanges/exchange_simulator/exchange_simulator.py @@ -0,0 +1,263 @@ +from backtesting import get_bot +from backtesting.backtesting import Backtesting +from backtesting.collector.data_parser import DataCollectorParser +from backtesting.collector.exchange_collector import ExchangeDataCollector +from config.cst import * +from tools.time_frame_manager import TimeFrameManager +from trading import AbstractExchange + + +class ExchangeSimulator(AbstractExchange): + def __init__(self, config, exchange_type, exchange_manager): + super().__init__(config, exchange_type) + self.exchange_manager = exchange_manager + + if CONFIG_BACKTESTING not in self.config: + raise Exception("Backtesting config not found") + + self.symbols = None + self.data = None + self._get_symbol_list() + + self.config_time_frames = TimeFrameManager.get_config_time_frame(self.config) + + # set exchange manager attributes + self.exchange_manager.client_symbols = self.symbols + self.exchange_manager.traded_pairs = self.symbols + self.exchange_manager.client_time_frames = [tf.value for tf in self.config_time_frames] + self.exchange_manager.time_frames = self.config_time_frames + + self.time_frame_get_times = {} + self.fetched_trades_counter = {} + + self.DEFAULT_LIMIT = 100 + self.MIN_LIMIT = 20 + + # used to force price movement + self.recent_trades_multiplier_factor = 1 + + self.MIN_ENABLED_TIME_FRAME = TimeFrameManager.find_min_time_frame(self.config_time_frames) + self.DEFAULT_TIME_FRAME_RECENT_TRADE_CREATOR = self.MIN_ENABLED_TIME_FRAME + self.DEFAULT_TIME_FRAME_TICKERS_CREATOR = self.MIN_ENABLED_TIME_FRAME + self.RECENT_TRADES_TO_CREATE = max(SIMULATOR_LAST_PRICES_TO_CHECK, ORDER_CREATION_LAST_TRADES_TO_USE) + + self.backtesting = Backtesting(self.config, self) + self._prepare() + + # todo merge multiple file with the same symbol + def _get_symbol_list(self): + self.symbols = [] + self.data = {} + symbols_appended = {} + + # parse files + for file in self.config[CONFIG_BACKTESTING][CONFIG_BACKTESTING_DATA_FILES]: + exchange_name, symbol, timestamp = ExchangeDataCollector.get_file_name(file) + if exchange_name is not None and symbol is not None and timestamp is not None: + + # check if symbol data already in symbols + # TODO check exchanges ? + if symbol not in symbols_appended: + symbols_appended[symbol] = 0 + if symbols_appended[symbol] < int(timestamp): + symbols_appended[symbol] = int(timestamp) + self.symbols.append(symbol) + data = DataCollectorParser.parse(file) + self.data[symbol] = self.fix_timestamps(data) + + @staticmethod + def fix_timestamps(data): + if get_bot() is not None: + for time_frame in data: + time_delta = get_bot().get_start_time() * 1000 - data[time_frame][0][PriceIndexes.IND_PRICE_TIME.value] + for data_list in data[time_frame]: + data_list[PriceIndexes.IND_PRICE_TIME.value] += time_delta + return data + + # returns price data for a given symbol + def _get_symbol_data(self, symbol): + return self.data[symbol] + + def symbol_exists(self, symbol): + return symbol in self.symbols + + def time_frame_exists(self, time_frame): + return time_frame in self.time_frame_get_times + + def has_data_for_time_frame(self, symbol, time_frame): + return time_frame in self.data[symbol] \ + and len(self.data[symbol][time_frame]) >= self.DEFAULT_LIMIT + self.MIN_LIMIT + + def get_symbols(self): + return self.symbols + + def get_name(self): + return self.__class__.__name__ + str(self.symbols) + + def _prepare(self): + # create get times + for time_frame in TimeFrames: + self.time_frame_get_times[time_frame.value] = 0 + + for symbol in self.symbols: + # create symbol last trades counter + self.fetched_trades_counter[symbol] = 0 + + def should_update_data(self, symbol, time_frame, trader): + previous_time_frame = TimeFrameManager.get_previous_time_frame(self.config_time_frames, time_frame, time_frame) + previous_time_frame_sec = TimeFramesMinutes[previous_time_frame] + previous_time_frame_updated_times = self.time_frame_get_times[previous_time_frame.value] + current_time_frame_sec = TimeFramesMinutes[time_frame] + current_time_frame_updated_times = self.time_frame_get_times[time_frame.value] + + time_refresh_condition = (previous_time_frame_updated_times - ( + current_time_frame_updated_times * (current_time_frame_sec / previous_time_frame_sec)) >= 0) + + recent_trades_condition = trader.get_open_orders() and ( + self.fetched_trades_counter[symbol] > current_time_frame_updated_times) + + return time_refresh_condition and (not trader.get_open_orders() or recent_trades_condition) + + def should_update_recent_trades(self, symbol): + if symbol in self.fetched_trades_counter: + if self.time_frame_get_times[self.MIN_ENABLED_TIME_FRAME.value] >= self.fetched_trades_counter[symbol]: + self.fetched_trades_counter[symbol] += 1 + return True + return False + + # Will use the One Minute time frame + def _create_ticker(self, symbol, index): + tf = self._get_symbol_data(symbol)[self.DEFAULT_TIME_FRAME_TICKERS_CREATOR.value][index] + return tf[PriceIndexes.IND_PRICE_CLOSE.value] + + def _create_recent_trades(self, symbol, index): + tf = self._get_symbol_data(symbol)[self.DEFAULT_TIME_FRAME_RECENT_TRADE_CREATOR.value][index] + trades = [] + created_trades = [] + + max_price = tf[PriceIndexes.IND_PRICE_HIGH.value] + min_price = tf[PriceIndexes.IND_PRICE_LOW.value] + + for _ in range(0, self.RECENT_TRADES_TO_CREATE - 2): + trades.append((max_price + min_price) / 2) + + # add very max and very min + trades.append(max_price) + trades.append(min_price) + + for trade in trades: + created_trades.append( + { + "price": trade*self.recent_trades_multiplier_factor + } + ) + + return created_trades + + def _extract_indexes(self, array, index, factor=1, max_value=None): + max_limit = len(array) + index *= factor + max_count = max_value if max_value is not None else self.DEFAULT_LIMIT + min_count = max_value if max_value is not None else self.MIN_LIMIT + + if max_limit - (index + max_count) <= min_count: + self.backtesting.end() + + elif index + max_count >= max_limit: + return array[index::] + else: + return array[index:index + max_count] + + def _extract_data_with_limit(self, symbol, time_frame): + return self._extract_indexes(self.data[symbol][time_frame.value], self.time_frame_get_times[time_frame.value]) + + def get_symbol_prices(self, symbol, time_frame, limit=None, data_frame=True): + result = self._extract_data_with_limit(symbol, time_frame) + self.time_frame_get_times[time_frame.value] += 1 + + return result + + def get_recent_trades(self, symbol): + return self._create_recent_trades(symbol, + self.time_frame_get_times[self.DEFAULT_TIME_FRAME_RECENT_TRADE_CREATOR.value]) + + def get_data(self): + return self.data + + def get_price_ticker(self, symbol): + return { + "symbol": symbol, + ExchangeConstantsTickersColumns.LAST.value: self._create_ticker( + symbol, + self.time_frame_get_times[self.DEFAULT_TIME_FRAME_TICKERS_CREATOR.value]) + } + + def get_last_price_ticker(self, symbol): + return self.get_price_ticker(symbol)[ExchangeConstantsTickersColumns.LAST.value] + + def get_all_currencies_price_ticker(self): + return { + symbol: { + "symbol": symbol, + ExchangeConstantsTickersColumns.LAST.value: self.get_price_ticker(symbol) + } + for symbol in self.symbols + } + + def get_market_status(self, symbol): + return { + # number of decimal digits "after the dot" + ExchangeConstantsMarketStatusColumns.PRECISION.value: { + ExchangeConstantsMarketStatusColumns.PRECISION_AMOUNT.value: 8, + ExchangeConstantsMarketStatusColumns.PRECISION_COST.value: 8, + ExchangeConstantsMarketStatusColumns.PRECISION_PRICE.value: 8, + }, + ExchangeConstantsMarketStatusColumns.LIMITS.value: { + ExchangeConstantsMarketStatusColumns.LIMITS_AMOUNT.value: { + ExchangeConstantsMarketStatusColumns.LIMITS_AMOUNT_MIN.value: 0.00000000001, + ExchangeConstantsMarketStatusColumns.LIMITS_AMOUNT_MAX.value: 1000000000000, + }, + ExchangeConstantsMarketStatusColumns.LIMITS_PRICE.value: { + ExchangeConstantsMarketStatusColumns.LIMITS_PRICE_MIN.value: 0.00000000001, + ExchangeConstantsMarketStatusColumns.LIMITS_PRICE_MAX.value: 1000000000000, + }, + ExchangeConstantsMarketStatusColumns.LIMITS_COST.value: { + ExchangeConstantsMarketStatusColumns.LIMITS_COST_MIN.value: 0.00000000001, + ExchangeConstantsMarketStatusColumns.LIMITS_COST_MAX.value: 1000000000000, + }, + }, + } + + def set_recent_trades_multiplier_factor(self, factor): + self.recent_trades_multiplier_factor = factor + + # Unimplemented methods from AbstractExchange + def cancel_order(self, order_id, symbol=None): + return True + + def create_order(self, order_type, symbol, quantity, price=None, stop_price=None): + pass + + def get_all_orders(self, symbol=None, since=None, limit=None): + return [] + + def get_balance(self): + return None + + def get_closed_orders(self, symbol=None, since=None, limit=None): + return [] + + def get_market_price(self, symbol): + raise NotImplementedError("get_market_price not implemented") + + def get_my_recent_trades(self, symbol=None, since=None, limit=None): + return [] + + def get_open_orders(self, symbol=None, since=None, limit=None): + return [] + + def get_order(self, order_id): + raise NotImplementedError("get_order not implemented") + + def get_order_book(self, symbol, limit=30): + raise NotImplementedError("get_order_book not implemented") diff --git a/trading/exchanges/rest_exchanges/__init__.py b/trading/exchanges/rest_exchanges/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/trading/exchanges/rest_exchanges/rest_exchange.py b/trading/exchanges/rest_exchanges/rest_exchange.py new file mode 100644 index 000000000..d6767c91a --- /dev/null +++ b/trading/exchanges/rest_exchanges/rest_exchange.py @@ -0,0 +1,182 @@ +import logging + +from ccxt import OrderNotFound, BaseError +from ccxt.binance import binance + +from config.cst import * +from trading.exchanges.abstract_exchange import AbstractExchange + + +class RESTExchange(AbstractExchange): + def __init__(self, config, exchange_type, exchange_manager): + super().__init__(config, exchange_type) + self.exchange_manager = exchange_manager + + # ccxt client + self.client = None + + # balance additional info + self.info_list = None + self.free = None + self.used = None + self.total = None + + # We will need to create the rest client and fetch exchange config + self.create_client() + self.client.load_markets() + + self.all_currencies_price_ticker = None + + # ccxt exchange instance creation + def create_client(self): + if self.exchange_manager.check_config(self.get_name()): + self.client = self.exchange_type({ + 'apiKey': self.config[CONFIG_EXCHANGES][self.name][CONFIG_EXCHANGE_KEY], + 'secret': self.config[CONFIG_EXCHANGES][self.name][CONFIG_EXCHANGE_SECRET], + 'verbose': False, + 'enableRateLimit': True + }) + else: + self.client = self.exchange_type({'verbose': False}) + self.logger.error("configuration issue: missing login information !") + self.client.logger.setLevel(logging.INFO) + + def get_market_status(self, symbol): + if symbol in self.client.markets: + return self.client.markets[symbol] + else: + self.logger.error("Fail to get market status of {0}".format(symbol)) + return [] + + def get_client(self): + return self.client + + # total (free + used), by currency + def get_balance(self): + balance = self.client.fetchBalance() + + # store portfolio global info + self.info_list = balance[CONFIG_PORTFOLIO_INFO] + self.free = balance[CONFIG_PORTFOLIO_FREE] + self.used = balance[CONFIG_PORTFOLIO_USED] + self.total = balance[CONFIG_PORTFOLIO_TOTAL] + + # remove not currency specific keys + balance.pop(CONFIG_PORTFOLIO_INFO, None) + balance.pop(CONFIG_PORTFOLIO_FREE, None) + balance.pop(CONFIG_PORTFOLIO_USED, None) + balance.pop(CONFIG_PORTFOLIO_TOTAL, None) + + return balance + + def get_symbol_prices(self, symbol, time_frame, limit=None, data_frame=True): + if limit: + return self.client.fetch_ohlcv(symbol, time_frame.value, limit=limit) + else: + return self.client.fetch_ohlcv(symbol, time_frame.value) + + # return up to ten bidasks on each side of the order book stack + def get_order_book(self, symbol, limit=30): + return self.client.fetchOrderBook(symbol, limit) + + def get_recent_trades(self, symbol): + try: + return self.client.fetch_trades(symbol) + except BaseError as e: + self.logger.error("Failed to get recent trade {0}".format(e)) + return None + + def get_market_price(self, symbol): + order_book = self.get_order_book(symbol) + bid = order_book['bids'][0][0] if order_book['bids'] else None + ask = order_book['asks'][0][0] if order_book['asks'] else None + spread = (ask - bid) if (bid and ask) else None + return {'bid': bid, 'ask': ask, 'spread': spread} + + # A price ticker contains statistics for a particular market/symbol for the last instant + def get_last_price_ticker(self, symbol): + try: + return self.client.fetch_ticker(symbol)[ExchangeConstantsTickersColumns.LAST.value] + except BaseError as e: + self.logger.error("Failed to get_price_ticker {0}".format(e)) + return None + + # A price ticker contains statistics for a particular market/symbol for some period of time in recent past (24h) + def get_price_ticker(self, symbol): + try: + return self.client.fetch_ticker(symbol) + except BaseError as e: + self.logger.error("Failed to get_price_ticker {0}".format(e)) + return None + + def get_all_currencies_price_ticker(self): + try: + self.all_currencies_price_ticker = self.client.fetch_tickers() + return self.all_currencies_price_ticker + except BaseError as e: + self.logger.error("Failed to get_all_currencies_price_ticker {0}".format(e)) + return None + + # ORDERS + def get_order(self, order_id, symbol=None): + if self.client.has['fetchOrder']: + return self.client.fetch_order(order_id, symbol) + else: + raise Exception("This exchange doesn't support fetchOrder") + + def get_all_orders(self, symbol=None, since=None, limit=None): + if self.client.has['fetchOrders']: + return self.client.fetchOrders(symbol=symbol, since=since, limit=limit, params={}) + else: + raise Exception("This exchange doesn't support fetchOrders") + + def get_open_orders(self, symbol=None, since=None, limit=None): + if self.client.has['fetchOpenOrders']: + return self.client.fetchOpenOrders(symbol=symbol, since=since, limit=limit, params={}) + else: + raise Exception("This exchange doesn't support fetchOpenOrders") + + def get_closed_orders(self, symbol=None, since=None, limit=None): + if self.client.has['fetchClosedOrders']: + return self.client.fetchClosedOrders(symbol=symbol, since=since, limit=limit, params={}) + else: + raise Exception("This exchange doesn't support fetchClosedOrders") + + def get_my_recent_trades(self, symbol=None, since=None, limit=None): + return self.client.fetchMyTrades(symbol=symbol, since=since, limit=limit, params={}) + + def cancel_order(self, order_id, symbol=None): + try: + self.client.cancel_order(order_id, symbol=symbol) + return True + except OrderNotFound: + self.logger.error("Order {0} was not found".format(order_id)) + return False + + # todo { 'type': 'trailing-stop' } + def create_order(self, order_type, symbol, quantity, price=None, stop_price=None): + try: + if order_type == TraderOrderType.BUY_MARKET: + return self.client.create_market_buy_order(symbol, quantity) + elif order_type == TraderOrderType.BUY_LIMIT: + return self.client.create_limit_buy_order(symbol, quantity, price) + elif order_type == TraderOrderType.SELL_MARKET: + return self.client.create_market_sell_order(symbol, quantity) + elif order_type == TraderOrderType.SELL_LIMIT: + return self.client.create_limit_sell_order(symbol, quantity, price) + elif order_type == TraderOrderType.STOP_LOSS: + return None + elif order_type == TraderOrderType.STOP_LOSS_LIMIT: + return None + elif order_type == TraderOrderType.TAKE_PROFIT: + return None + elif order_type == TraderOrderType.TAKE_PROFIT_LIMIT: + return None + except Exception as e: + order_desc = "order_type: {0}, symbol: {1}, quantity: {2}, price: {3}, stop_price: {4}".format( + str(order_type), str(symbol), str(quantity), str(price), str(stop_price)) + self.logger.error("Failed to create order : {0} ({1})".format(e, order_desc)) + return None + + def get_uniform_timestamp(self, timestamp): + return timestamp / 1000 diff --git a/trading/exchanges/websockets_exchanges/__init__.py b/trading/exchanges/websockets_exchanges/__init__.py new file mode 100644 index 000000000..a776a1936 --- /dev/null +++ b/trading/exchanges/websockets_exchanges/__init__.py @@ -0,0 +1,2 @@ +from trading.exchanges.websockets_exchanges.implementations.binance_websocket import BinanceWebSocketClient +from .abstract_websocket_manager import AbstractWebSocketManager diff --git a/trading/exchanges/websockets_exchanges/abstract_websocket_manager.py b/trading/exchanges/websockets_exchanges/abstract_websocket_manager.py new file mode 100644 index 000000000..0ee605d5d --- /dev/null +++ b/trading/exchanges/websockets_exchanges/abstract_websocket_manager.py @@ -0,0 +1,140 @@ +from abc import * +import logging + +from ccxt.base.exchange import Exchange as ccxtExchange + +from tools.symbol_util import merge_symbol +from trading.exchanges.websockets_exchanges.exchange_data import ExchangeData + + +class AbstractWebSocketManager: + + def __init__(self, config): + self.config = config + self.client = None + self.exchange_data = ExchangeData() + self.name = self.get_name() + self.logger = logging.getLogger(self.name) + + # Abstract methods + @classmethod + @abstractmethod + def get_name(cls): + raise NotImplementedError("get_name not implemented") + + @staticmethod + @abstractmethod + def convert_into_ccxt_order(order): + raise NotImplementedError("convert_into_ccxt_order not implemented") + + @abstractmethod + def get_last_price_ticker(self, symbol): + raise NotImplementedError("get_last_price_ticker not implemented") + + @classmethod + @abstractmethod + def handles_recent_trades(cls): + raise NotImplementedError("handles_recent_trades not implemented") + + @abstractmethod + def start_sockets(self): + raise NotImplementedError("start_sockets not implemented") + + @abstractmethod + def stop_sockets(self): + raise NotImplementedError("stop_sockets not implemented") + + @staticmethod + @abstractmethod + def get_websocket_client(config): + raise NotImplementedError("get_websocket_client not implemented") + + @abstractmethod + def init_web_sockets(self, time_frames, trader_pairs): + raise NotImplementedError("init_web_sockets not implemented") + + def initialize_candles_data(self, symbol, time_frame, symbol_candle_data, symbol_candle_data_frame): + self.exchange_data.initialize_candles_data(symbol, time_frame, symbol_candle_data, symbol_candle_data_frame) + + # Initialized methods + def last_price_ticker_is_initialized(self, symbol): + return merge_symbol(symbol) in self.exchange_data.symbol_tickers + + def candles_are_initialized(self, symbol, time_frame): + return self.exchange_data.candles_are_initialized(symbol, time_frame) + + def portfolio_is_initialized(self): + return self.exchange_data.portfolio + + def orders_are_initialized(self): + return self.exchange_data.is_initialized[ExchangeData.ORDERS_KEY] + + def set_orders_are_initialized(self, value): + self.exchange_data.is_initialized[ExchangeData.ORDERS_KEY] = value + + # Abstract exchange + + def get_portfolio(self): + return self.exchange_data.portfolio + + def get_symbol_prices(self, symbol, time_frame, limit=None, data_frame=True): + return self.exchange_data.get_candles(symbol, time_frame, limit, data_frame) + + def get_recent_trades(self, symbol, since=None, limit=None): + if self.handles_recent_trades(): + return self.exchange_data.get_recent_trades(symbol, since, limit) + else: + raise NotImplementedError("get_recent_trades is not handled for this websocket exchange implementation") + + def get_order(self, order_id, symbol=None): + return self.exchange_data.orders[order_id] + + def get_all_orders(self, symbol=None, since=None, limit=None): + return self.exchange_data.get_all_orders(symbol, since, limit) + + def get_open_orders(self, symbol=None, since=None, limit=None): + return self.exchange_data.get_open_orders(symbol, since, limit) + + def get_closed_orders(self, symbol=None, since=None, limit=None): + return self.exchange_data.get_closed_orders(symbol, since, limit) + + # specific methods + + def has_order(self, order_id): + return order_id in self.exchange_data.orders + + # ============== ccxt adaptation methods ============== + def init_ccxt_order_from_other_source(self, ccxt_order): + self.exchange_data.upsert_order(ccxt_order["id"], ccxt_order) + + def _update_order(self, msg): + ccxt_order = self.convert_into_ccxt_order(msg) + self.exchange_data.upsert_order(ccxt_order["id"], ccxt_order) + + @staticmethod + @abstractmethod + def parse_order_status(status): + raise NotImplementedError("parse_order_status not implemented") + + @staticmethod + def safe_lower_string(dictionary, key, default_value=None): + value = AbstractWebSocketManager.safe_string(dictionary, key, default_value) + if value is not None: + value = value.lower() + return value + + @staticmethod + def safe_string(dictionary, key, default_value=None): + return ccxtExchange.safe_string(dictionary, key, default_value) + + @staticmethod + def safe_float(dictionary, key, default_value=None): + return ccxtExchange.safe_float(dictionary, key, default_value) + + @staticmethod + def safe_value(dictionary, key, default_value=None): + return ccxtExchange.safe_value(dictionary, key, default_value) + + @staticmethod + def iso8601(value): + return ccxtExchange.iso8601(value) diff --git a/trading/exchanges/websockets_exchanges/exchange_data.py b/trading/exchanges/websockets_exchanges/exchange_data.py new file mode 100644 index 000000000..2a669c3ed --- /dev/null +++ b/trading/exchanges/websockets_exchanges/exchange_data.py @@ -0,0 +1,149 @@ +import pandas + +from config.cst import * +from tools.data_frame_util import DataFrameUtil + + +class ExchangeData: + + ORDERS_KEY = "orders" + TIME_FRAME_CANDLE_TIME = "candle_time" + CANDLE_LIST = "data_list" + CANDLE_DATAFRAME = "dataframe" + TIME_FRAME_HAS_REACH_MAX_CANDLE_COUNT = "reached_max_candle_count" + + _MAX_STORED_CANDLE_COUNT = 1000 + + # note: symbol keys are without / + def __init__(self): + self.symbol_prices = {} + self.symbol_tickers = {} + self.portfolio = {} + self.orders = {} + self.is_initialized = { + self.ORDERS_KEY: False + } + + # insert methods + + def add_price(self, symbol, time_frame, start_candle_time, candle_data): + + # add price only if candles have been initialized by rest exchange + if symbol in self.symbol_prices and time_frame in self.symbol_prices[symbol]: + time_frame_data = self.symbol_prices[symbol][time_frame] + + # add new candle if previous candle is done + if time_frame_data[self.CANDLE_LIST][-1][PriceIndexes.IND_PRICE_TIME.value] < start_candle_time: + + # remove most ancient candle if max candle count reached + if time_frame_data[self.TIME_FRAME_HAS_REACH_MAX_CANDLE_COUNT]: + time_frame_data[self.CANDLE_LIST].pop(0) + time_frame_data[self.CANDLE_DATAFRAME].drop(0, inplace=True) + time_frame_data[self.CANDLE_DATAFRAME].reset_index(drop=True, inplace=True) + elif len(time_frame_data[self.CANDLE_LIST])+1 >= self._MAX_STORED_CANDLE_COUNT: + time_frame_data[self.TIME_FRAME_HAS_REACH_MAX_CANDLE_COUNT] = True + + # add new candle + time_frame_data[self.CANDLE_LIST].append(candle_data) + + # refresh dataframe + time_frame_data[self.CANDLE_DATAFRAME] = pandas.concat( + [time_frame_data[self.CANDLE_DATAFRAME], DataFrameUtil.candles_array_to_data_frame([candle_data])], + ignore_index=True) + + # else update current candle + else: + time_frame_data[self.CANDLE_LIST][-1] = candle_data + time_frame_data[self.CANDLE_DATAFRAME][PriceStrings.STR_PRICE_HIGH.value].iloc[-1] = \ + candle_data[PriceIndexes.IND_PRICE_HIGH.value] + time_frame_data[self.CANDLE_DATAFRAME][PriceStrings.STR_PRICE_LOW.value].iloc[-1] = \ + candle_data[PriceIndexes.IND_PRICE_LOW.value] + time_frame_data[self.CANDLE_DATAFRAME][PriceStrings.STR_PRICE_CLOSE.value].iloc[-1] = \ + candle_data[PriceIndexes.IND_PRICE_CLOSE.value] + time_frame_data[self.CANDLE_DATAFRAME][PriceStrings.STR_PRICE_VOL.value].iloc[-1] = \ + candle_data[PriceIndexes.IND_PRICE_VOL.value] + + def update_portfolio(self, currency, total, available, in_order): + self.portfolio[currency] = { + CONFIG_PORTFOLIO_FREE: available, + CONFIG_PORTFOLIO_USED: in_order, + CONFIG_PORTFOLIO_TOTAL: total + } + + def set_ticker(self, symbol, ticker_data): + self.symbol_tickers[symbol] = ticker_data + + # maybe later add an order remover to free up memory ? + def upsert_order(self, order_id, ccxt_order): + self.orders[order_id] = ccxt_order + + def initialize_candles_data(self, symbol, time_frame, symbol_candle_data, symbol_candle_data_frame): + self._initialize_price_candles(self._adapt_symbol(symbol), time_frame.value, + symbol_candle_data, symbol_candle_data_frame) + + # select methods + + def candles_are_initialized(self, symbol, time_frame): + adapted_symbol = self._adapt_symbol(symbol) + return adapted_symbol in self.symbol_prices and time_frame.value in self.symbol_prices[adapted_symbol] + + def get_candles(self, symbol, time_frame, limit=None, data_frame=True): + adapted_symbol = self._adapt_symbol(symbol) + candles_data = self.symbol_prices[adapted_symbol][time_frame.value] + wanted_candles = candles_data[self.CANDLE_DATAFRAME] if data_frame else candles_data[self.CANDLE_LIST] + if limit is not None: + actual_limit = min(limit, len(wanted_candles)) + return wanted_candles[-actual_limit:].reset_index(drop=True) if data_frame \ + else wanted_candles[-actual_limit:] + return wanted_candles + + # maybe implement later if required but can be very resource costly + def get_recent_trades(self, symbol, since=None, limit=None): + raise NotImplementedError("get_recent_trades not implemented") + + def get_all_orders(self, symbol, since, limit): + return self._select_orders(None, symbol, since, limit) + + def get_open_orders(self, symbol, since, limit): + return self._select_orders("open", symbol, since, limit) + + def get_closed_orders(self, symbol, since, limit): + return self._select_orders("closed", symbol, since, limit) + + # private methods + + def _select_orders(self, state, symbol, since, limit): + orders = [ + order + for order in self.orders.values() + if ( + (state is None or order["status"] == state) and + (symbol is None or (symbol and order["symbol"] == symbol)) and + (since is None or (since and order['timestamp'] < since)) + ) + ] + if limit is not None: + return orders[0:limit] + else: + return orders + + def _initialize_price_candles(self, symbol, time_frame, candle_data, candle_data_frame=None): + if symbol not in self.symbol_prices: + self.symbol_prices[symbol] = {} + prices_per_time_frames = self.symbol_prices[symbol] + + # if no data from this timeframe => create new database + if time_frame not in prices_per_time_frames: + prices_per_time_frames[time_frame] = { + self.CANDLE_LIST: candle_data, + self.CANDLE_DATAFRAME: + candle_data_frame if candle_data_frame is not None else + DataFrameUtil.candles_array_to_data_frame(candle_data), + self.TIME_FRAME_HAS_REACH_MAX_CANDLE_COUNT: + len(candle_data) >= self._MAX_STORED_CANDLE_COUNT + } + + # TODO temporary method awaiting for symbol "/" reconstruction in ws + @staticmethod + def _adapt_symbol(symbol): + return symbol.replace("/", "") diff --git a/trading/exchanges/websockets_exchanges/implementations/__init__.py b/trading/exchanges/websockets_exchanges/implementations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/trading/exchanges/websockets_exchanges/implementations/binance_websocket.py b/trading/exchanges/websockets_exchanges/implementations/binance_websocket.py new file mode 100644 index 000000000..ded379a1d --- /dev/null +++ b/trading/exchanges/websockets_exchanges/implementations/binance_websocket.py @@ -0,0 +1,185 @@ +from config.cst import * +from trading.exchanges.websockets_exchanges.abstract_websocket_manager import AbstractWebSocketManager +from binance.websockets import BinanceSocketManager +from binance.client import Client, BinanceAPIException +from twisted.internet import reactor + +from tools.symbol_util import merge_symbol + + +class BinanceWebSocketClient(AbstractWebSocketManager): + _TICKER_KEY = "@ticker" + _KLINE_KEY = "@kline" + _MULTIPLEX_SOCKET_NAME = "multiplex" + _USER_SOCKET_NAME = "user" + _STATUSES = { + 'NEW': 'open', + 'PARTIALLY_FILLED': 'open', + 'FILLED': 'closed', + 'CANCELED': 'canceled', + } + + def __init__(self, config): + super().__init__(config) + self.client = Client(self.config[CONFIG_EXCHANGES][self.name][CONFIG_EXCHANGE_KEY], + self.config[CONFIG_EXCHANGES][self.name][CONFIG_EXCHANGE_SECRET]) + self.socket_manager = None + self.open_sockets_keys = {} + + @staticmethod + def get_websocket_client(config): + ws_client = BinanceWebSocketClient(config) + ws_client.socket_manager = BinanceSocketManager(ws_client.client) + return ws_client + + def get_last_price_ticker(self, symbol): + return float(self.exchange_data.symbol_tickers[merge_symbol(symbol)]["c"]) + + def init_web_sockets(self, time_frames, trader_pairs): + try: + self._init_price_sockets(time_frames, trader_pairs) + self._init_user_socket() + except BinanceAPIException as e: + self.logger.error("error when connecting to binance websockets: {0}".format(e)) + + def start_sockets(self): + if self.socket_manager: + self.socket_manager.start() + + def stop_sockets(self): + if self.socket_manager: + self.socket_manager.close() + reactor.stop() + + def get_socket_manager(self): + return self.socket_manager + + @classmethod + def get_name(cls): + return "binance" + + # Binance rest API documentation + # (https://github.com/binance-exchange/binance-official-api-docs/blob/master/rest-api.md): + # + # Recent trades list + # GET /api/v1/trades + # Get recent trades(up to last 500). + # + # Weight: 1 + # + # and: + # + # Compressed/Aggregate trades list + # GET /api/v1/aggTrades + # Get compressed, aggregate trades. Trades that fill at the time, from the same order, with the same price will + # have the quantity aggregated. + # + # Weight: 1 + # + # => Better using rest exchange services to save cpu resources (minimal rest request weigh). + @classmethod + def handles_recent_trades(cls): + return False + + @staticmethod + def parse_order_status(status): + return BinanceWebSocketClient._STATUSES[status] if status in BinanceWebSocketClient._STATUSES \ + else status.lower() + + @staticmethod + def convert_into_ccxt_order(order): + status = AbstractWebSocketManager.safe_value(order, 'X') + if status is not None: + status = BinanceWebSocketClient.parse_order_status(status) + price = AbstractWebSocketManager.safe_float(order, "p") + amount = AbstractWebSocketManager.safe_float(order, "q") + filled = AbstractWebSocketManager.safe_float(order, "z", 0.0) + cost = None + remaining = None + if filled is not None: + if amount is not None: + remaining = max(amount - filled, 0.0) + if price is not None: + cost = price * filled + return { + 'info': order, + 'id': AbstractWebSocketManager.safe_string(order, "i"), + 'timestamp': order["T"], + 'datetime': AbstractWebSocketManager.iso8601(order["T"]), + 'lastTradeTimestamp': None, + # TODO string has no / between currency and market => need to add it !!! + 'symbol': AbstractWebSocketManager.safe_string(order, "s"), + 'type': AbstractWebSocketManager.safe_lower_string(order, "o"), + 'side': AbstractWebSocketManager.safe_lower_string(order, "S"), + 'price': price, + 'amount': amount, + 'cost': cost, + 'filled': filled, + 'remaining': remaining, + 'status': status, + 'fee': AbstractWebSocketManager.safe_float(order, "n", None), + } + + def all_currencies_prices_callback(self, msg): + if msg['data']['e'] == 'error': + # close and restart the socket + # self.close_sockets() + self.start_sockets() + else: + msg_stream_type = msg["stream"] + if self._TICKER_KEY in msg_stream_type: + self.exchange_data.set_ticker(msg["data"]["s"], + msg["data"]) + elif self._KLINE_KEY in msg_stream_type: + self.exchange_data.add_price(msg["data"]["s"], + msg["data"]["k"]["i"], + msg["data"]["k"]["t"], + self._create_candle(msg["data"]["k"])) + + def user_callback(self, msg): + if msg["e"] == "outboundAccountInfo": + self._update_portfolio(msg) + elif msg["e"] == "executionReport": + self._update_order(msg) + + def _init_price_sockets(self, time_frames, trader_pairs): + # add klines + prices = ["{}{}_{}".format(merge_symbol(symbol).lower(), self._KLINE_KEY, time_frame.value) + for time_frame in time_frames + for symbol in trader_pairs] + # add tickers + for symbol in trader_pairs: + prices.append("{}{}".format(merge_symbol(symbol).lower(), self._TICKER_KEY)) + connection_key = self.socket_manager.start_multiplex_socket(prices, self.all_currencies_prices_callback) + self.open_sockets_keys[self._MULTIPLEX_SOCKET_NAME] = connection_key + + def _init_user_socket(self): + connection_key = self.socket_manager.start_user_socket(self.user_callback) + self.open_sockets_keys[self._USER_SOCKET_NAME] = connection_key + + # candle: list[0:5] #time, open, high, low, close, vol + @staticmethod + def _create_candle(kline_data): + return [ + kline_data["t"], # time + AbstractWebSocketManager.safe_float(kline_data, "o"), # open + AbstractWebSocketManager.safe_float(kline_data, "h"), # high + AbstractWebSocketManager.safe_float(kline_data, "l"), # low + AbstractWebSocketManager.safe_float(kline_data, "c"), # close + AbstractWebSocketManager.safe_float(kline_data, "v"), # vol + ] + + def _update_portfolio(self, msg): + for currency in msg['B']: + free = float(currency['f']) + locked = float(currency['l']) + total = free + locked + self.exchange_data.update_portfolio(currency['a'], total, free, locked) + + # unimplemented methods + @staticmethod + def format_price_ticker(price_ticker): + pass + + def init_all_currencies_prices_web_socket(self, time_frames, trader_pairs): + pass diff --git a/trading/exchanges/websockets_exchanges/websocket_exchange.py b/trading/exchanges/websockets_exchanges/websocket_exchange.py new file mode 100644 index 000000000..52814fc96 --- /dev/null +++ b/trading/exchanges/websockets_exchanges/websocket_exchange.py @@ -0,0 +1,113 @@ +from trading.exchanges.abstract_exchange import AbstractExchange + + +class WebSocketExchange(AbstractExchange): + def __init__(self, config, exchange_type, exchange_manager, socket_manager): + super().__init__(config, exchange_type) + self.exchange_manager = exchange_manager + self.socket_manager = socket_manager + self._time_frames = [] + self._traded_pairs = [] + + # websocket client + self.client = None + + # We will need to create the rest client and fetch exchange config + self.create_client() + + # websocket exchange startup + def create_client(self): + self.client = self.socket_manager.get_websocket_client(self.config) + + # init websocket + self.client.init_web_sockets(self.exchange_manager.get_config_time_frame(), + self.exchange_manager.get_traded_pairs()) + + # start the websocket + self.client.start_sockets() + + def get_client(self): + return self.client + + def stop(self): + self.client.stop_sockets() + + # total (free + used), by currency + def get_balance(self): + return self.client.get_portfolio() + + def get_symbol_prices(self, symbol, time_frame, limit=None, data_frame=True): + return self.client.get_symbol_prices(symbol, time_frame, limit, data_frame) + + # A price ticker contains statistics for a particular market/symbol for the last instant + def get_last_price_ticker(self, symbol): + return self.client.get_last_price_ticker(symbol) + + # implementation depends on the websocket exchange implementation + def get_recent_trades(self, symbol): + since = None + limit = 500 + return self.client.get_recent_trades(symbol, since, limit) + + # ORDERS + def get_order(self, order_id, symbol=None): + return self.client.get_order(order_id, symbol=symbol) + + def get_all_orders(self, symbol=None, since=None, limit=None): + return self.client.get_all_orders(symbol, since, limit) + + def get_open_orders(self, symbol=None, since=None, limit=None): + return self.client.get_open_orders(symbol, since, limit) + + def get_closed_orders(self, symbol=None, since=None, limit=None): + return self.client.get_closed_orders(symbol, since, limit) + + # TODO method list + + def get_order_book(self, symbol, limit=50): + raise NotImplementedError("get_order_book not implemented") + + def get_market_price(self, symbol): + raise NotImplementedError("get_market_price not implemented") + + def get_price_ticker(self, symbol): + raise NotImplementedError("get_price_ticker not implemented") + + def get_all_currencies_price_ticker(self): + raise NotImplementedError("get_all_currencies_price_ticker not implemented") + + def get_my_recent_trades(self, symbol=None, since=None, limit=None): + raise NotImplementedError("get_my_recent_trades not implemented") + + def cancel_order(self, order_id, symbol=None): + raise NotImplementedError("cancel_order not implemented") + + def create_order(self, order_type, symbol, quantity, price=None, stop_price=None): + raise NotImplementedError("create_order not implemented") + + def get_market_status(self, symbol): + pass + + def get_uniform_timestamp(self, timestamp): + pass + + # utility methods + def init_orders_for_ws_if_possible(self, orders): + if not self.client.orders_are_initialized(): + for order in orders: + self.client.init_ccxt_order_from_other_source(order) + + def init_candle_data(self, symbol, time_frame, symbol_candle_data, symbol_candle_data_frame): + self.client.initialize_candles_data(symbol, time_frame, symbol_candle_data, symbol_candle_data_frame) + + def set_orders_are_initialized(self, value): + self.client.set_orders_are_initialized(value) + + def candles_are_initialized(self, symbol, time_frame): + return self.client.candles_are_initialized(symbol, time_frame) + + def orders_are_initialized(self): + return self.client.orders_are_initialized() + + def handles_recent_trades(self): + return self.client.handles_recent_trades() diff --git a/trading/trader/order.py b/trading/trader/order.py index c219387be..20a6802ba 100644 --- a/trading/trader/order.py +++ b/trading/trader/order.py @@ -1,6 +1,9 @@ import time +import math from abc import * +from threading import Lock +from tools.symbol_util import split_symbol from config.cst import TradeOrderSide, OrderStatus, TraderOrderType, SIMULATOR_LAST_PRICES_TO_CHECK """ Order class will represent an open order in the specified exchange @@ -15,6 +18,7 @@ def __init__(self, trader): super().__init__() self.trader = trader self.exchange = self.trader.get_exchange() + self.is_simulated = self.trader.simulate self.side = None self.symbol = None self.origin_price = 0 @@ -28,29 +32,63 @@ def __init__(self, trader): self.order_id = None self.status = None self.order_type = None + self.creation_time = 0 + self.canceled_time = 0 self.executed_time = 0 self.last_prices = None + self.created_last_price = None + self.order_profitability = None + self.linked_to = None self.order_notifier = None self.linked_orders = [] + self.lock = Lock() + + # Disposable design pattern + def __enter__(self): + self.lock.acquire() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.lock.release() # create the order by setting all the required values - def new(self, order_type, symbol, quantity, price=None, stop_price=None, order_notifier=None): + def new(self, order_type, symbol, current_price, quantity, + price=None, + stop_price=None, + status=None, + order_notifier=None, + order_id=None, + quantity_filled=None, + timestamp=None, + linked_to=None): + + self.order_id = order_id self.origin_price = price - self.last_prices = price + self.status = status + self.created_last_price = current_price self.origin_quantity = quantity self.origin_stop_price = stop_price self.symbol = symbol self.order_type = order_type self.order_notifier = order_notifier - self.currency, self.market = self.exchange.split_symbol(symbol) + self.currency, self.market = split_symbol(symbol) + self.filled_quantity = quantity_filled + self.linked_to = linked_to - if not self.trader.simulate: - # self.status, self.order_id, self.filled_price, self.filled_quantity, self.ex_time - self.exchange.create_order(order_type, symbol, quantity, price, stop_price) + if timestamp is None: + self.creation_time = time.time() + else: + # if we have a timestamp, it's a real trader => need to format timestamp if necessary + self.creation_time = self.exchange.get_uniform_timestamp(timestamp) + + if status is None: + self.status = OrderStatus.OPEN else: - self.status = OrderStatus.PENDING + self.status = status + + if self.trader.simulate: self.filled_quantity = quantity # update_order_status will define the rules for a simulated order to be filled / canceled @@ -60,23 +98,32 @@ def update_order_status(self): # check_last_prices is used to collect data to perform the order update_order_status process def check_last_prices(self, price, inferior): - # TODO : use timestamp - prices = [p["price"] for p in self.last_prices[-SIMULATOR_LAST_PRICES_TO_CHECK:]] + if self.last_prices is not None: + prices = [p["price"] + for p in self.last_prices[-SIMULATOR_LAST_PRICES_TO_CHECK:] + if not math.isnan(p["price"])] - if inferior: - if float(min(prices)) < price: - return True - else: - return False - else: - if float(max(prices)) > price: - return True + if inferior: + return float(min(prices)) < price else: - return False + return float(max(prices)) > price + return False def cancel_order(self): - # TODO exchange + self.status = OrderStatus.CANCELED + self.canceled_time = time.time() + + # if real order + if not self.is_simulated: + self.exchange.cancel_order(self.order_id, self.symbol) + + self.trader.notify_order_cancel(self) + + def cancel_from_exchange(self): + self.status = OrderStatus.CANCELED + self.canceled_time = time.time() self.trader.notify_order_cancel(self) + self.trader.get_order_manager().remove_order_from_list(self) def close_order(self): self.trader.notify_order_close(self) @@ -117,6 +164,9 @@ def get_order_type(self): def get_order_symbol(self): return self.symbol + def get_exchange(self): + return self.exchange + def get_origin_quantity(self): return self.origin_quantity @@ -126,13 +176,45 @@ def get_origin_price(self): def get_order_notifier(self): return self.order_notifier + def get_canceled_time(self): + return self.canceled_time + + def get_executed_time(self): + return self.executed_time + + def get_creation_time(self): + return self.creation_time + def set_last_prices(self, last_prices): self.last_prices = last_prices + def get_create_last_price(self): + return self.created_last_price + + def get_profitability(self): + if self.get_filled_price() is not 0 and self.get_create_last_price() is not 0: + if self.get_filled_price() >= self.get_create_last_price(): + self.order_profitability = 1 - self.get_filled_price() / self.get_create_last_price() + if self.side == TradeOrderSide.SELL: + self.order_profitability *= -1 + else: + self.order_profitability = 1 - self.get_create_last_price() / self.get_filled_price() + if self.side == TradeOrderSide.BUY: + self.order_profitability *= -1 + return self.order_profitability + @classmethod def get_name(cls): return cls.__name__ + def default_exchange_update_order_status(self): + result = self.exchange.get_order(self.order_id, self.symbol) + new_status = self.trader.parse_status(result) + if new_status == OrderStatus.FILLED: + self.trader.parse_exchange_order_to_trade_instance(result, self) + elif new_status == OrderStatus.CANCELED: + self.cancel_from_exchange() + class BuyMarketOrder(Order): def __init__(self, exchange): @@ -141,12 +223,12 @@ def __init__(self, exchange): def update_order_status(self): if not self.trader.simulate: - # self.status, self.order_id, self.total_fees, self.filled_price, self.filled_quantity, self.executed_time = - self.exchange.get_order(self.order_id) + self.default_exchange_update_order_status() else: # ONLY FOR SIMULATION self.status = OrderStatus.FILLED self.filled_price = float(self.last_prices[-1]["price"]) + self.filled_quantity = self.origin_quantity self.executed_time = time.time() @@ -157,13 +239,13 @@ def __init__(self, exchange): def update_order_status(self): if not self.trader.simulate: - # self.status, self.order_id, self.total_fees, self.filled_price, self.filled_quantity, self.executed_time = - self.exchange.get_order(self.order_id) + self.default_exchange_update_order_status() else: # ONLY FOR SIMULATION if self.check_last_prices(self.origin_price, True): self.status = OrderStatus.FILLED self.filled_price = self.origin_price + self.filled_quantity = self.origin_quantity self.executed_time = time.time() @@ -174,12 +256,12 @@ def __init__(self, exchange): def update_order_status(self): if not self.trader.simulate: - # self.status, self.order_id, self.total_fees, self.filled_price, self.filled_quantity, self.executed_time = - self.exchange.get_order(self.order_id) + self.default_exchange_update_order_status() else: # ONLY FOR SIMULATION self.status = OrderStatus.FILLED self.filled_price = float(self.last_prices[-1]["price"]) + self.filled_quantity = self.origin_quantity self.executed_time = time.time() @@ -190,13 +272,13 @@ def __init__(self, exchange): def update_order_status(self): if not self.trader.simulate: - # self.status, self.order_id, self.total_fees, self.filled_price, self.filled_quantity, self.executed_time = - self.exchange.get_order(self.order_id) + self.default_exchange_update_order_status() else: # ONLY FOR SIMULATION if self.check_last_prices(self.origin_price, False): self.status = OrderStatus.FILLED self.filled_price = self.origin_price + self.filled_quantity = self.origin_quantity self.executed_time = time.time() @@ -206,15 +288,19 @@ def __init__(self, exchange): self.side = TradeOrderSide.SELL def update_order_status(self): - if not self.trader.simulate: - # self.status, self.order_id, self.total_fees, self.filled_price, self.filled_quantity, self.executed_time = - self.exchange.get_order(self.order_id) - else: - # ONLY FOR SIMULATION - if self.check_last_prices(self.origin_price, True): - self.status = OrderStatus.FILLED - self.filled_price = self.origin_price - self.executed_time = time.time() + if self.check_last_prices(self.origin_price, True): + self.status = OrderStatus.FILLED + self.filled_price = self.origin_price + self.filled_quantity = self.origin_quantity + self.executed_time = time.time() + if not self.trader.simulate: + market_sell = self.trader.create_order_instance(order_type=TraderOrderType.SELL_MARKET, + symbol=self.symbol, + current_price=self.origin_price, + quantity=self.origin_quantity, + price=self.origin_price) + with self.trader.get_portfolio() as pf: + self.trader.create_order(market_sell, pf) # TODO diff --git a/trading/trader/order_notifier.py b/trading/trader/order_notifier.py index f7a8fa372..9e1df9f30 100644 --- a/trading/trader/order_notifier.py +++ b/trading/trader/order_notifier.py @@ -1,4 +1,4 @@ -from tools import OrdersNotification +from tools.notifications import OrdersNotification class OrderNotifier: @@ -12,11 +12,19 @@ def notify(self, evaluator_notification): self.evaluator_notification = evaluator_notification orders = [order for order in self.order.get_linked_orders()] orders.append(self.order) - self.notifier.notify_create(evaluator_notification, orders, self.order.get_order_symbol()) + self.notifier.notify_create(evaluator_notification, orders) + + def end(self, + order_filled, + orders_canceled, + trade_profitability, + portfolio_profitability, + portfolio_diff, + profitability=False): - def end(self, order_filled, orders_canceled, trade_profitability, portfolio_profitability): self.notifier.notify_end(order_filled, orders_canceled, - self.order.get_order_symbol(), trade_profitability, - portfolio_profitability) + portfolio_profitability, + portfolio_diff, + profitability) diff --git a/trading/trader/orders_manager.py b/trading/trader/orders_manager.py index ad3976c58..300392e09 100644 --- a/trading/trader/orders_manager.py +++ b/trading/trader/orders_manager.py @@ -2,9 +2,9 @@ import threading from time import sleep -import ccxt - +from backtesting.backtesting import Backtesting from config.cst import ORDER_REFRESHER_TIME, OrderStatus +from trading.trader.order import Order """ OrdersManager class will perform the supervision of each open order of the exchange trader Data updating process is generic but a specific implementation is called for each type of order (TraderOrderTypeClasses) @@ -21,6 +21,7 @@ def __init__(self, config, trader): self.trader = trader self.order_list = [] self.last_symbol_prices = {} + self.order_refresh_time = ORDER_REFRESHER_TIME self.logger = logging.getLogger(self.__class__.__name__) def add_order_to_list(self, order): @@ -28,11 +29,14 @@ def add_order_to_list(self, order): # Remove the specified order of the current open_order list (when the order is filled or canceled) def remove_order_from_list(self, order): - self.order_list.remove(order) - self.logger.debug("{0} {1} (ID : {2}) removed on {3}".format(order.get_order_symbol(), - order.get_name(), - order.get_id(), - self.trader.get_exchange().get_name())) + try: + self.order_list.remove(order) + self.logger.debug("{0} {1} (ID : {2}) removed on {3}".format(order.get_order_symbol(), + order.get_name(), + order.get_id(), + self.trader.get_exchange().get_name())) + except ValueError: + pass def stop(self): self.keep_running = False @@ -41,16 +45,23 @@ def stop(self): def _update_last_symbol_list(self): updated = [] for order in self.order_list: - if order.get_order_symbol() not in updated: - try: - self._update_last_symbol_prices(order.get_order_symbol()) - except ccxt.base.errors.RequestTimeout as e: - self.logger.error(str(e)) + if isinstance(order, Order) and order.get_order_symbol() not in updated: + self._update_last_symbol_prices(order.get_order_symbol()) + updated.append(order.get_order_symbol()) # Ask to update a specific symbol with exchange data def _update_last_symbol_prices(self, symbol): - last_symbol_price = self.trader.get_exchange().get_recent_trades(symbol) + last_symbol_price = None + + # optimize exchange simulator calls when backtesting + if Backtesting.enabled(self.config): + if self.trader.get_exchange().get_exchange().should_update_recent_trades(symbol): + last_symbol_price = self.trader.get_exchange().get_recent_trades(symbol) + + # Exchange call when not backtesting + else: + last_symbol_price = self.trader.get_exchange().get_recent_trades(symbol) # Check if exchange request failed if last_symbol_price is not None: @@ -59,31 +70,52 @@ def _update_last_symbol_prices(self, symbol): def get_open_orders(self): return self.order_list - """ Threading method that will periodically update the data with update_last_symbol_list - Then ask orders to check their status - Finally ask cancellation and filling process if it is required + def set_order_refresh_time(self, seconds): + self.order_refresh_time = seconds + + # Will be called by Websocket to perform order status update if new data available + # TODO : currently blocking, may implement queue if needed + def force_update_order_status(self): + self._update_orders_status() + + """ prepare order status updating by getting price data + then ask orders to check their status + Finally ask cancellation and filling process if it is required """ + def _update_orders_status(self): + # update all prices + self._update_last_symbol_list() + for order in self.order_list: + # symbol prices from exchange + if order.get_order_symbol() in self.last_symbol_prices: + with order as odr: + odr.set_last_prices(self.last_symbol_prices[odr.get_order_symbol()]) + + # ask orders to update their status + with order as odr: + odr.update_order_status() + + if odr.get_status() == OrderStatus.FILLED: + self.logger.info("{0} {1} (ID : {2}) filled on {3} at {4}".format(odr.get_order_symbol(), + odr.get_name(), + odr.get_id(), + self.trader.get_exchange().get_name(), + odr.get_filled_price())) + odr.close_order() + + # Threading method that will periodically update orders status with update_orders_status def run(self): while self.keep_running: - # update all prices only if simulate - if self.trader.simulate: - self._update_last_symbol_list() - - for order in self.order_list: - # update symbol prices from exchange only if simulate - if self.trader.simulate: - if order.get_order_symbol() in self.last_symbol_prices: - order.set_last_prices(self.last_symbol_prices[order.get_order_symbol()]) - - # ask orders to update their status - order.update_order_status() - if order.get_status() == OrderStatus.FILLED: - self.logger.info("{0} {1} (ID : {2}) filled on {3} at {4}".format(order.get_order_symbol(), - order.get_name(), - order.get_id(), - self.trader.get_exchange().get_name(), - order.get_filled_price())) - order.close_order() - sleep(ORDER_REFRESHER_TIME) + try: + # call update status + self._update_orders_status() + + except Exception as e: + self.logger.error("Error when updating orders: {0}".format(e)) + + if not Backtesting.enabled(self.config): + sleep(self.order_refresh_time) + else: + sleep(0) diff --git a/trading/trader/portfolio.py b/trading/trader/portfolio.py index e5f0fc75c..49782fa8e 100644 --- a/trading/trader/portfolio.py +++ b/trading/trader/portfolio.py @@ -1,4 +1,5 @@ import logging +from threading import Lock from config.cst import * from trading.trader.order import OrderConstants @@ -17,17 +18,40 @@ class Portfolio: def __init__(self, config, trader): self.config = config + self.trader = trader + self.is_simulated = trader.simulate + self.is_enabled = trader.enable self.portfolio = {} self._load_portfolio() self.logger = logging.getLogger(self.__class__.__name__) - self.trader = trader - self.exchange = self.trader.get_exchange() + self.lock = Lock() + + # Disposable design pattern + def __enter__(self): + self.lock.acquire() + return self + + def __exit__(self, exc_type, exc_val, exc_tb): + self.lock.release() # Load exchange portfolio / simulated portfolio from config def _load_portfolio(self): - if CONFIG_SIMULATOR in self.config and CONFIG_STARTING_PORTFOLIO in self.config[CONFIG_SIMULATOR]: - for currency, total in self.config[CONFIG_SIMULATOR][CONFIG_STARTING_PORTFOLIO].items(): - self.portfolio[currency] = {Portfolio.AVAILABLE: total, Portfolio.TOTAL: total} + if self.is_enabled: + if self.is_simulated: + self.set_starting_simulated_portfolio() + else: + self.update_portfolio_balance() + + def set_starting_simulated_portfolio(self): + for currency, total in self.config[CONFIG_SIMULATOR][CONFIG_STARTING_PORTFOLIO].items(): + self.portfolio[currency] = {Portfolio.AVAILABLE: total, Portfolio.TOTAL: total} + + def update_portfolio_balance(self): + if not self.is_simulated and self.is_enabled: + balance = self.trader.get_exchange().get_balance() + for currency in balance: + self.portfolio[currency] = {Portfolio.AVAILABLE: balance[currency][CONFIG_PORTFOLIO_FREE], + Portfolio.TOTAL: balance[currency][CONFIG_PORTFOLIO_TOTAL]} def get_portfolio(self): return self.portfolio @@ -57,71 +81,99 @@ def _update_portfolio_data(self, currency, value, total=True, available=False): It is called only when an order is filled to update the real quantity of the currency to be set in "total" field Returns get_profitability() return """ - def update_portfolio(self, order): - currency, market = order.get_currency_and_market() - - # update currency - if order.get_side() == TradeOrderSide.BUY: - new_quantity = order.get_filled_quantity() - order.get_currency_total_fees() - else: - new_quantity = -(order.get_filled_quantity() - order.get_currency_total_fees()) - self._update_portfolio_data(currency, new_quantity, True, True) - - # update market - if order.get_side() == TradeOrderSide.BUY: - new_quantity = -((order.get_filled_quantity() * order.get_filled_price()) - order.get_market_total_fees()) - else: - new_quantity = (order.get_filled_quantity() * order.get_filled_price()) - order.get_market_total_fees() - self._update_portfolio_data(market, new_quantity, True, True) - # Only for log purpose - if order.get_side() == TradeOrderSide.BUY: - currency_portfolio_num = order.get_filled_quantity() - market_portfolio_num = -self.portfolio[market][Portfolio.TOTAL] - else: - currency_portfolio_num = -order.get_filled_quantity() - market_portfolio_num = self.portfolio[market][Portfolio.TOTAL] + def update_portfolio(self, order): + if self.is_simulated: + # stop losses and take profits aren't using available portfolio + if not self._check_available_should_update(order): + self._update_portfolio_available(order) - self.logger.info("Portfolio updated | {0} {1} | {2} {3} | Current Portfolio : {4}".format(currency, - currency_portfolio_num, - market, - market_portfolio_num, - self.portfolio)) + currency, market = order.get_currency_and_market() - # debug purpose - profitability, profitability_percent, profitability_diff = self.trader.get_trades_manager().get_profitability() + # update currency + if order.get_side() == TradeOrderSide.BUY: + new_quantity = order.get_filled_quantity() - order.get_currency_total_fees() + self._update_portfolio_data(currency, new_quantity, True, True) + else: + new_quantity = -(order.get_filled_quantity() - order.get_currency_total_fees()) + self._update_portfolio_data(currency, new_quantity, True, False) - self.logger.debug("Current portfolio profitability : {0} {1} ({2}%)".format(round(profitability, 2), - self.trader.get_trades_manager().get_reference(), - round(profitability_percent, 2))) + # update market + if order.get_side() == TradeOrderSide.BUY: + new_quantity = -( + (order.get_filled_quantity() * order.get_filled_price()) - order.get_market_total_fees()) + self._update_portfolio_data(market, new_quantity, True, False) + else: + new_quantity = (order.get_filled_quantity() * order.get_filled_price()) - order.get_market_total_fees() + self._update_portfolio_data(market, new_quantity, True, True) - return profitability, profitability_percent, profitability_diff + # Only for log purpose + if order.get_side() == TradeOrderSide.BUY: + currency_portfolio_num = order.get_filled_quantity() + market_portfolio_num = -order.get_filled_quantity() * \ + order.get_filled_price() - order.get_market_total_fees() + else: + currency_portfolio_num = -order.get_filled_quantity() + market_portfolio_num = order.get_filled_quantity() * \ + order.get_filled_price() - order.get_market_total_fees() + + self.logger.info("Portfolio updated | {0} {1} | {2} {3} | Current Portfolio : {4}" + .format(currency, + currency_portfolio_num, + market, + market_portfolio_num, + self.portfolio)) + else: + self.update_portfolio_balance() + self.logger.info("Portfolio updated | Current Portfolio : {0}".format(self.portfolio)) """ update_portfolio_available performs the availability update of the concerned currency in the current portfolio It is called when an order is filled, created or canceled to update the "available" filed of the portfolio + is_new_order is True when portfolio needs an update after a new order and False when portfolio needs a rollback + after an order is cancelled """ - def update_portfolio_available(self, order, is_new_order=True): - # stop losses and take profits aren't using available portfolio - if order.__class__ not in [OrderConstants.TraderOrderTypeClasses[TraderOrderType.TAKE_PROFIT], - OrderConstants.TraderOrderTypeClasses[TraderOrderType.TAKE_PROFIT_LIMIT], - OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], - OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS_LIMIT]]: - currency, market = order.get_currency_and_market() + def update_portfolio_available(self, order, is_new_order=False): + if self._check_available_should_update(order): + self._update_portfolio_available(order, 1 if is_new_order else -1) - if is_new_order: - inverse = 1 - else: - inverse = -1 + # debug purpose + # self.logger.debug("Portfolio available updated after order on {0} | Current Portfolio : {1}".format( + # order.get_order_symbol(), + # self.portfolio)) - if order.get_side() == TradeOrderSide.BUY: - new_quantity = -order.get_origin_quantity() * order.get_origin_price() * inverse - self._update_portfolio_data(market, new_quantity, False, True) - else: - new_quantity = -order.get_origin_quantity() * inverse - self._update_portfolio_data(currency, new_quantity, False, True) + # Check if the order has impact on availability + @staticmethod + def _check_available_should_update(order): + # stop losses and take profits aren't using available portfolio + return order.__class__ not in [OrderConstants.TraderOrderTypeClasses[TraderOrderType.TAKE_PROFIT], + OrderConstants.TraderOrderTypeClasses[TraderOrderType.TAKE_PROFIT_LIMIT], + OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS], + OrderConstants.TraderOrderTypeClasses[TraderOrderType.STOP_LOSS_LIMIT]] - # debug purpose - self.logger.debug("Portfolio available updated after order on {0} | Current Portfolio : {1}".format( - order.get_order_symbol(), - self.portfolio)) + # Realise portfolio availability update + def _update_portfolio_available(self, order, factor=1): + currency, market = order.get_currency_and_market() + + # when buy order + if order.get_side() == TradeOrderSide.BUY: + new_quantity = - order.get_origin_quantity() * order.get_origin_price() * factor + self._update_portfolio_data(market, new_quantity, False, True) + + # when sell order + else: + new_quantity = - order.get_origin_quantity() * factor + self._update_portfolio_data(currency, new_quantity, False, True) + + # Resets available amount with total amount CAREFUL: if no currency is give, resets all the portfolio ! + def reset_portfolio_available(self, reset_currency=None, reset_quantity=None): + if not reset_currency: + for currency in self.portfolio: + self.portfolio[currency][Portfolio.AVAILABLE] = self.portfolio[currency][Portfolio.TOTAL] + else: + if reset_currency in self.portfolio: + if reset_quantity is None: + self.portfolio[reset_currency][Portfolio.AVAILABLE] = \ + self.portfolio[reset_currency][Portfolio.TOTAL] + else: + self.portfolio[reset_currency][Portfolio.AVAILABLE] += reset_quantity diff --git a/trading/trader/trade.py b/trading/trader/trade.py index 96f0acdbe..7ab8a1384 100644 --- a/trading/trader/trade.py +++ b/trading/trader/trade.py @@ -8,6 +8,12 @@ def __init__(self, exchange, order): self.market_fees = order.get_market_total_fees() self.currency_fees = order.get_currency_total_fees() + self.creation_time = order.get_creation_time() + self.canceled_time = order.get_canceled_time() + self.filled_time = order.get_executed_time() + + self.simulated = order.trader.simulate + self.exchange = exchange def get_price(self): @@ -33,3 +39,18 @@ def get_currency_fees(self): def get_final_status(self): return self.final_status + + def get_canceled_time(self): + return self.canceled_time + + def get_filled_time(self): + return self.filled_time + + def get_creation_time(self): + return self.creation_time + + def get_order_type(self): + return self.order_type + + def get_simulated(self): + return self.simulated diff --git a/trading/trader/trader.py b/trading/trader/trader.py index c34f9d331..113b8b53c 100644 --- a/trading/trader/trader.py +++ b/trading/trader/trader.py @@ -1,7 +1,10 @@ import logging from config.cst import CONFIG_ENABLED_OPTION, CONFIG_TRADER, CONFIG_TRADER_RISK, CONFIG_TRADER_RISK_MIN, \ - CONFIG_TRADER_RISK_MAX + CONFIG_TRADER_RISK_MAX, OrderStatus, TradeOrderSide, TraderOrderType, REAL_TRADER_STR +from tools.pretty_printer import PrettyPrinter +from trading.trader.order import OrderConstants +from trading.trader.order_notifier import OrderNotifier from trading.trader.orders_manager import OrdersManager from trading.trader.portfolio import Portfolio from trading.trader.trade import Trade @@ -9,38 +12,62 @@ class Trader: - def __init__(self, config, exchange): + def __init__(self, config, exchange, order_refresh_time=None): self.exchange = exchange self.config = config - self.risk = self.config[CONFIG_TRADER][CONFIG_TRADER_RISK] + self.risk = None + self.set_risk(self.config[CONFIG_TRADER][CONFIG_TRADER_RISK]) self.logger = logging.getLogger(self.__class__.__name__) - self.simulate = False + + if not hasattr(self, 'simulate'): + self.simulate = False + + self.enable = self.enabled(self.config) self.portfolio = Portfolio(self.config, self) self.trades_manager = TradesManager(config, self) self.order_manager = OrdersManager(config, self) - self.order_manager.start() - # Debug - if self.enabled(): - self.logger.debug("Enabled on " + self.exchange.get_name()) - else: - self.logger.debug("Disabled on " + self.exchange.get_name()) + self.trader_type_str = REAL_TRADER_STR - def enabled(self): - if self.config[CONFIG_TRADER][CONFIG_ENABLED_OPTION]: - return True + if order_refresh_time is not None: + self.order_manager.set_order_refresh_time(order_refresh_time) + + if self.enable: + if not self.simulate: + self.update_open_orders() + # self.update_close_orders() + + # can current orders received: start using websocket for orders if available + self.exchange.set_orders_are_initialized(True) + + self.order_manager.start() + self.logger.debug("Enabled on {0}".format(self.exchange.get_name())) else: - return False + self.logger.debug("Disabled on {0}".format(self.exchange.get_name())) + + @staticmethod + def enabled(config): + return config[CONFIG_TRADER][CONFIG_ENABLED_OPTION] + + def is_enabled(self): + return self.enable + + def set_enabled(self, enable): + self.enable = enable def get_risk(self): - if self.risk < CONFIG_TRADER_RISK_MIN: + return self.risk + + def set_risk(self, risk): + if risk < CONFIG_TRADER_RISK_MIN: self.risk = CONFIG_TRADER_RISK_MIN - elif self.risk > CONFIG_TRADER_RISK_MAX: + elif risk > CONFIG_TRADER_RISK_MAX: self.risk = CONFIG_TRADER_RISK_MAX - return self.risk + else: + self.risk = risk def get_exchange(self): return self.exchange @@ -48,28 +75,113 @@ def get_exchange(self): def get_portfolio(self): return self.portfolio - def create_order(self, order_type, symbol, quantity, price=None, stop_price=None, linked_to=None): - # update_portfolio_available - # - # if linked_to is not None: - # linked_to.add_linked_order(order) - # order.add_linked_order(linked_to) + def create_order_instance(self, order_type, symbol, current_price, quantity, + price=None, + stop_price=None, + linked_to=None, + status=None, + order_id=None, + quantity_filled=None, + timestamp=None): + + # create new order instance + order_class = OrderConstants.TraderOrderTypeClasses[order_type] + order = order_class(self) + + # manage order notifier + if linked_to is None: + order_notifier = OrderNotifier(self.config, order) + else: + order_notifier = linked_to.get_order_notifier() + + order.new(order_type=order_type, + symbol=symbol, + current_price=current_price, + quantity=quantity, + price=price, + stop_price=stop_price, + order_notifier=order_notifier, + order_id=order_id, + status=status, + quantity_filled=quantity_filled, + timestamp=timestamp, + linked_to=linked_to) + + return order + + def create_order(self, order, portfolio, loaded=False): + linked_to = None + + new_order = order + + # if this order is linked to another (ex : a sell limit order with a stop loss order) + if new_order.linked_to is not None: + new_order.linked_to.add_linked_order(new_order) + linked_to = new_order.linked_to + + if not loaded: + if not self.simulate and not self.check_if_self_managed(new_order.get_order_type()): + created_order = self.exchange.create_order(new_order.get_order_type(), + new_order.get_order_symbol(), + new_order.get_origin_quantity(), + new_order.get_origin_price(), + new_order.origin_stop_price) - pass + # get real order from exchange + new_order = self.parse_exchange_order_to_order_instance(created_order) + + # rebind order notifier to new order instance + new_order.order_notifier = order.get_order_notifier() + + # update the availability of the currency in the portfolio + portfolio.update_portfolio_available(new_order, is_new_order=True) + + title = "Order creation" + else: + title = "Order loaded" + + self.logger.info("{0} : {1} | {2} | Price : {3} | Quantity : {4}".format(title, + new_order.get_order_symbol(), + new_order.get_order_type(), + new_order.get_origin_price(), + new_order.get_origin_quantity())) + + # notify order manager of a new open order + self.order_manager.add_order_to_list(new_order) + + # if this order is linked to another + if linked_to is not None: + new_order.add_linked_order(linked_to) + + return new_order def cancel_order(self, order): - order.cancel_order() + with order as odr: + odr.cancel_order() + self.logger.info("{0} {1} at {2} (ID : {3}) cancelled on {4}".format(odr.get_order_symbol(), + odr.get_name(), + odr.get_origin_price(), + odr.get_id(), + self.get_exchange().get_name())) self.order_manager.remove_order_from_list(order) # Should be called only if we want to cancel all symbol open orders (no filled) def cancel_open_orders(self, symbol): - for order in self.get_open_orders(): - if order.get_order_symbol() == symbol: + # use a copy of the list (not the reference) + for order in list(self.get_open_orders()): + if order.get_order_symbol() == symbol and order.get_status() is not OrderStatus.CANCELED: + self.notify_order_close(order, True) + + def cancel_all_open_orders(self): + # use a copy of the list (not the reference) + for order in list(self.get_open_orders()): + if order.get_status() is not OrderStatus.CANCELED: self.notify_order_close(order, True) def notify_order_cancel(self, order): # update portfolio with ended order - self.portfolio.update_portfolio_available(order, False) + with self.portfolio as pf: + pf.update_portfolio_available(order, is_new_order=False) def notify_order_close(self, order, cancel=False): # Cancel linked orders @@ -83,13 +195,22 @@ def notify_order_close(self, order, cancel=False): self.cancel_order(order) _, profitability_percent, profitability_diff = self.get_trades_manager().get_profitability_without_update() + else: order_closed = order orders_canceled = order.get_linked_orders() # update portfolio with ended order - self.portfolio.update_portfolio_available(order, False) - _, profitability_percent, profitability_diff = self.portfolio.update_portfolio(order) + with self.portfolio as pf: + pf.update_portfolio(order) + + # debug purpose + profitability, profitability_percent, profitability_diff = self.get_trades_manager().get_profitability() + + self.logger.info("Current portfolio profitability : {0}".format( + PrettyPrinter.portfolio_profitability_pretty_print(profitability, + profitability_percent, + self.get_trades_manager().get_reference()))) # add to trade history self.trades_manager.add_new_trade_in_history(Trade(self.exchange, order)) @@ -97,19 +218,77 @@ def notify_order_close(self, order, cancel=False): # remove order to open_orders self.order_manager.remove_order_from_list(order) + profitability_activated = order_closed is not None + + # update current order list with exchange + if not self.simulate: + self.update_open_orders() + # notification - order.get_order_notifier().end(order_closed, orders_canceled, profitability_diff, profitability_percent) + order.get_order_notifier().end(order_closed, + orders_canceled, + order.get_profitability(), + profitability_percent, + profitability_diff, + profitability_activated) def get_open_orders(self): return self.order_manager.get_open_orders() - def close_open_orders(self): - pass + def update_close_orders(self): + for symbol in self.exchange.get_exchange_manager().get_traded_pairs(): + for close_order in self.exchange.get_closed_orders(symbol): + self.parse_exchange_order_to_trade_instance(close_order) def update_open_orders(self): - # see exchange - # -> update order manager - pass + for symbol in self.exchange.get_exchange_manager().get_traded_pairs(): + orders = self.exchange.get_open_orders(symbol=symbol) + for open_order in orders: + order = self.parse_exchange_order_to_order_instance(open_order) + with self.portfolio as pf: + self.create_order(order, pf, True) + + def parse_exchange_order_to_order_instance(self, order): + return self.create_order_instance(order_type=self.parse_order_type(order), + symbol=order["symbol"], + current_price=0, + quantity=order["amount"], + stop_price=None, + linked_to=None, + quantity_filled=order["filled"], + order_id=order["id"], + status=self.parse_status(order), + price=order["price"], + timestamp=order["timestamp"]) + + @staticmethod + def update_order_with_exchange_order(exchange_order, order): + order.status = Trader.parse_status(exchange_order) + order.filled_quantity = exchange_order["filled"] + order.filled_price = exchange_order["price"] + order.executed_time = order.trader.exchange.get_uniform_timestamp(exchange_order["timestamp"]) # to confirm + + def parse_exchange_order_to_trade_instance(self, exchange_order, order): + self.update_order_with_exchange_order(exchange_order, order) + + @staticmethod + def parse_status(order): + return OrderStatus(order["status"]) + + @staticmethod + def parse_order_type(order): + side = TradeOrderSide(order["side"]) + order_type = order["type"] + if side == TradeOrderSide.BUY: + if order_type == "limit": + return TraderOrderType.BUY_LIMIT + elif order_type == "market": + return TraderOrderType.BUY_MARKET + elif side == TradeOrderSide.SELL: + if order_type == "limit": + return TraderOrderType.SELL_LIMIT + elif order_type == "market": + return TraderOrderType.SELL_MARKET def get_order_manager(self): return self.order_manager @@ -120,5 +299,19 @@ def get_trades_manager(self): def stop_order_manager(self): self.order_manager.stop() - def join_order_listeners(self): - self.order_manager.join() + def join_order_manager(self): + if self.order_manager.isAlive(): + self.order_manager.join() + + def get_simulate(self): + return self.simulate + + @staticmethod + def check_if_self_managed(order_type): + # stop losses and take profits are self managed by the bot + if order_type in [TraderOrderType.TAKE_PROFIT, + TraderOrderType.TAKE_PROFIT_LIMIT, + TraderOrderType.STOP_LOSS, + TraderOrderType.STOP_LOSS_LIMIT]: + return True + return False diff --git a/trading/trader/trader_simulator.py b/trading/trader/trader_simulator.py index 4aafe3ee8..9c167545d 100644 --- a/trading/trader/trader_simulator.py +++ b/trading/trader/trader_simulator.py @@ -1,8 +1,4 @@ -import logging - -from config.cst import CONFIG_ENABLED_OPTION, CONFIG_SIMULATOR, CONFIG_TRADER_RISK -from trading.trader.order import OrderConstants -from trading.trader.order_notifier import OrderNotifier +from config.cst import CONFIG_ENABLED_OPTION, CONFIG_SIMULATOR, SIMULATOR_TRADER_STR from trading.trader.trader import Trader """ TraderSimulator has a role of exchange response simulator @@ -10,41 +6,12 @@ class TraderSimulator(Trader): - def __init__(self, config, exchange): - super().__init__(config, exchange) - self.logger = logging.getLogger(self.__class__.__name__) + def __init__(self, config, exchange, order_refresh_time=None): self.simulate = True + super().__init__(config, exchange, order_refresh_time) - def enabled(self): - if self.config["simulator"][CONFIG_ENABLED_OPTION]: - return True - else: - return False - - def create_order(self, order_type, symbol, quantity, price=None, stop_price=None, linked_to=None): - self.logger.info("Order creation : {0} | {1} | Price : {2}".format(symbol, order_type, price)) - - # create new order instance - order_class = OrderConstants.TraderOrderTypeClasses[order_type] - order = order_class(self) - - # manage order notifier - if linked_to is None: - order_notifier = OrderNotifier(self.config, order) - else: - order_notifier = linked_to.get_order_notifier() - - order.new(order_type, symbol, quantity, price, stop_price, order_notifier) - - # notify order manager of a new open order - self.order_manager.add_order_to_list(order) - - # update the availability of the currency in the portfolio - self.portfolio.update_portfolio_available(order, True) - - # if this order is linked to another (ex : a sell limit order with a stop loss order) - if linked_to is not None: - linked_to.add_linked_order(order) - order.add_linked_order(linked_to) + self.trader_type_str = SIMULATOR_TRADER_STR - return order + @staticmethod + def enabled(config): + return config[CONFIG_SIMULATOR][CONFIG_ENABLED_OPTION] diff --git a/trading/trader/trades_manager.py b/trading/trader/trades_manager.py index 02d5e79bf..44e2219a1 100644 --- a/trading/trader/trades_manager.py +++ b/trading/trader/trades_manager.py @@ -2,6 +2,7 @@ from config.cst import CONFIG_TRADER, CONFIG_TRADER_REFERENCE_MARKET, DEFAULT_REFERENCE_MARKET from trading.trader.portfolio import Portfolio, ExchangeConstantsTickersColumns +from tools.symbol_util import merge_currencies """ TradesManager will store all trades performed by the exchange trader Another feature of TradesManager is the profitability calculation @@ -21,7 +22,7 @@ def __init__(self, config, trader): self.profitability_percent = 0 self.profitability_diff = 0 - self.currencies_prices = None + self.currencies_last_prices = {} self.origin_portfolio = None self.last_portfolio = None @@ -44,6 +45,9 @@ def get_reference_market(config): def get_reference(self): return self.reference_market + def get_trade_history(self): + return self.trade_history + def add_new_trade_in_history(self, trade): if trade not in self.trade_history: self.trade_history.append(trade) @@ -52,8 +56,8 @@ def add_new_trade_in_history(self, trade): and set currencies_prices attribute """ - def _update_currencies_prices(self): - self.currencies_prices = self.exchange.get_all_currencies_price_ticker() + def _update_currencies_prices(self, symbol): + self.currencies_last_prices[symbol] = self.exchange.get_last_price_ticker(symbol) """ Get profitability calls get_currencies_prices to update required data Then calls get_portfolio_current_value to set the current value of portfolio_current_value attribute @@ -61,18 +65,21 @@ def _update_currencies_prices(self): """ def get_profitability(self): - self.profitability_diff = self.profitability + self.profitability_diff = self.profitability_percent self.profitability = 0 self.profitability_percent = 0 try: - self._update_currencies_prices() self._update_portfolio_current_value() self.profitability = self.portfolio_current_value - self.portfolio_origin_value - self.profitability_percent = (100 * self.portfolio_current_value / self.portfolio_origin_value) - 100 + + if self.portfolio_origin_value > 0: + self.profitability_percent = (100 * self.portfolio_current_value / self.portfolio_origin_value) - 100 + else: + self.profitability_percent = 0 # calculate difference with the last current portfolio - self.profitability_diff -= self.profitability + self.profitability_diff = self.profitability_percent - self.profitability_diff except Exception as e: self.logger.error(str(e)) @@ -81,6 +88,12 @@ def get_profitability(self): def get_profitability_without_update(self): return self.profitability, self.profitability_percent, self.profitability_diff + def get_portfolio_current_value(self): + return self.portfolio_current_value + + def get_portfolio_origin_value(self): + return self.portfolio_origin_value + # Currently unused method def get_trades_value(self): self.trades_value = 0 @@ -89,28 +102,30 @@ def get_trades_value(self): return self.trades_value def _update_portfolio_current_value(self): - self.last_portfolio = self.portfolio.get_portfolio() + with self.portfolio as pf: + self.last_portfolio = pf.get_portfolio() self.portfolio_current_value = self._evaluate_portfolio_value(self.last_portfolio) def _get_portfolio_origin_value(self): - self._update_currencies_prices() - self.origin_portfolio = self.portfolio.get_portfolio() + with self.portfolio as pf: + self.origin_portfolio = pf.get_portfolio() self.portfolio_origin_value += self._evaluate_portfolio_value(self.origin_portfolio) """ try_get_value_of_currency will try to obtain the current value of the currency quantity in the reference currency It will try to create the symbol that fit with the exchange logic Returns the value found of this currency quantity, if not found returns 0 """ - # TODO : use ccxt method def _try_get_value_of_currency(self, currency, quantity): - symbol = self.exchange.merge_currencies(currency, self.reference_market) - symbol_inverted = self.exchange.merge_currencies(self.reference_market, currency) - if symbol in self.currencies_prices: - return self.currencies_prices[symbol][ExchangeConstantsTickersColumns.LAST.value] * quantity - elif symbol_inverted in self.currencies_prices: - return quantity / self.currencies_prices[symbol_inverted][ExchangeConstantsTickersColumns.LAST.value] + symbol = merge_currencies(currency, self.reference_market) + symbol_inverted = merge_currencies(self.reference_market, currency) + if self.exchange.get_exchange_manager().symbol_exists(symbol): + self._update_currencies_prices(symbol) + return self.currencies_last_prices[symbol] * quantity + elif self.exchange.get_exchange_manager().symbol_exists(symbol_inverted): + self._update_currencies_prices(symbol_inverted) + return quantity / self.currencies_last_prices[symbol_inverted] else: - # TODO : manage if currency/market does not exist + # TODO : manage if currency/market doesn't exist return 0 """ evaluate_portfolio_value performs evaluate_value with a portfolio configuration @@ -120,7 +135,8 @@ def _try_get_value_of_currency(self, currency, quantity): def _evaluate_portfolio_value(self, portfolio): value = 0 for currency in portfolio: - value += self._evaluate_value(currency, portfolio[currency][Portfolio.TOTAL]) + if portfolio[currency][Portfolio.TOTAL] != 0: + value += self._evaluate_value(currency, portfolio[currency][Portfolio.TOTAL]) return value # Evaluate value returns the currency quantity value in the reference (attribute) currency