From d598ff37d6d1044784b674d25359482daec9b7fe Mon Sep 17 00:00:00 2001 From: Andrii Petrynchyn Date: Sat, 22 Mar 2025 20:36:42 +0200 Subject: [PATCH 1/3] fix delete drawing when multiple charts is present & fix save drawing after del, drag or resize --- src/context-menu/context-menu.ts | 15 ++++++++++----- src/drawing/drawing-tool.ts | 19 +++++++++++++++---- src/drawing/drawing.ts | 2 +- src/general/global-params.ts | 1 + src/general/toolbox.ts | 4 +++- 5 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/context-menu/context-menu.ts b/src/context-menu/context-menu.ts index 15c58cfc..4d4c3195 100644 --- a/src/context-menu/context-menu.ts +++ b/src/context-menu/context-menu.ts @@ -28,20 +28,23 @@ declare const window: GlobalParams; export class ContextMenu { + private container: HTMLDivElement; private div: HTMLDivElement private hoverItem: Item | null; private items: HTMLElement[] = [] constructor( + private handlerID: string, private saveDrawings: Function, private drawingTool: DrawingTool, ) { this._onRightClick = this._onRightClick.bind(this); this.div = document.createElement('div'); this.div.classList.add('context-menu'); - document.body.appendChild(this.div); + this.container = window[this.handlerID.split('.')[1]].div; + this.container.appendChild(this.div); this.hoverItem = null; - document.body.addEventListener('contextmenu', this._onRightClick); + this.container.addEventListener('contextmenu', this._onRightClick); } _handleClick = (ev: MouseEvent) => this._onClick(ev); @@ -58,7 +61,7 @@ export class ContextMenu { if (!Drawing.hoveredObject) return; for (const item of this.items) { - this.div.removeChild(item); + item.remove(); } this.items = []; @@ -70,6 +73,8 @@ export class ContextMenu { subMenu = new StylePicker(this.saveDrawings) } else continue; + this.items.push(subMenu._div) + let onClick = (rect: DOMRect) => subMenu.openMenu(rect) this.menuItem(camelToTitle(optionName), onClick, () => { document.removeEventListener('click', subMenu.closeMenu) @@ -101,8 +106,8 @@ export class ContextMenu { ev.preventDefault(); - this.div.style.left = ev.clientX + 'px'; - this.div.style.top = ev.clientY + 'px'; + this.div.style.left = ev.offsetX + 'px'; + this.div.style.top = ev.offsetY + 'px'; this.div.style.display = 'block'; document.body.addEventListener('click', this._handleClick); } diff --git a/src/drawing/drawing-tool.ts b/src/drawing/drawing-tool.ts index 0f6f91d5..732c9875 100644 --- a/src/drawing/drawing-tool.ts +++ b/src/drawing/drawing-tool.ts @@ -12,8 +12,8 @@ import { HorizontalLine } from '../horizontal-line/horizontal-line'; export class DrawingTool { private _chart: IChartApi; private _series: ISeriesApi; - private _finishDrawingCallback: Function | null = null; - + private _finishDrawingCallback: Function = () => {}; + private _mouseIsDown: boolean = false; private _drawings: Drawing[] = []; private _activeDrawing: Drawing | null = null; private _isDrawing: boolean = false; @@ -22,7 +22,9 @@ export class DrawingTool { constructor(chart: IChartApi, series: ISeriesApi, finishDrawingCallback: Function | null = null) { this._chart = chart; this._series = series; - this._finishDrawingCallback = finishDrawingCallback; + + if (finishDrawingCallback) + this._finishDrawingCallback = finishDrawingCallback; this._chart.subscribeClick(this._clickHandler); this._chart.subscribeCrosshairMove(this._moveHandler); @@ -56,6 +58,8 @@ export class DrawingTool { if (idx == -1) return; this._drawings.splice(idx, 1) d.detach(); + + this._finishDrawingCallback(); } clearDrawings() { @@ -102,7 +106,6 @@ export class DrawingTool { this._drawings.push(this._activeDrawing); this.stopDrawing(); - if (!this._finishDrawingCallback) return; this._finishDrawingCallback(); } } @@ -112,6 +115,14 @@ export class DrawingTool { for (const t of this._drawings) t._handleHoverInteraction(param); + if (Drawing._mouseIsDown && !this._mouseIsDown) + this._mouseIsDown = true; + + if (!Drawing._mouseIsDown && this._mouseIsDown) { + this._finishDrawingCallback(); + this._mouseIsDown = false; + } + if (!this._isDrawing || !this._activeDrawing) return; const point = Drawing._eventToPoint(param, this._series); diff --git a/src/drawing/drawing.ts b/src/drawing/drawing.ts index 60e71511..6183e616 100644 --- a/src/drawing/drawing.ts +++ b/src/drawing/drawing.ts @@ -32,7 +32,7 @@ export abstract class Drawing extends PluginBase { protected _startDragPoint: Point | null = null; protected _latestHoverPoint: any | null = null; - protected static _mouseIsDown: boolean = false; + public static _mouseIsDown: boolean = false; public static hoveredObject: Drawing | null = null; public static lastHoveredObject: Drawing | null = null; diff --git a/src/general/global-params.ts b/src/general/global-params.ts index dfc57174..362f4986 100644 --- a/src/general/global-params.ts +++ b/src/general/global-params.ts @@ -6,6 +6,7 @@ export interface GlobalParams extends Window { containerDiv: HTMLElement; setCursor: Function; cursor: string; + [key: string]: any; } interface paneStyle { diff --git a/src/general/toolbox.ts b/src/general/toolbox.ts index 73640dc2..feea61fa 100644 --- a/src/general/toolbox.ts +++ b/src/general/toolbox.ts @@ -26,6 +26,8 @@ export class ToolBox { private static readonly VERT_SVG: string = ToolBox.RAY_SVG; div: HTMLDivElement; + contextMenu: ContextMenu; + private activeIcon: Icon | null = null; private buttons: HTMLDivElement[] = []; @@ -40,7 +42,7 @@ export class ToolBox { this._commandFunctions = commandFunctions; this._drawingTool = new DrawingTool(chart, series, () => this.removeActiveAndSave()); this.div = this._makeToolBox() - new ContextMenu(this.saveDrawings, this._drawingTool); + this.contextMenu = new ContextMenu(this._handlerID, this.saveDrawings, this._drawingTool); commandFunctions.push((event: KeyboardEvent) => { if ((event.metaKey || event.ctrlKey) && event.code === 'KeyZ') { From ca1588825d408d4a345a13947288421f9a501bd1 Mon Sep 17 00:00:00 2001 From: Andrii Petrynchyn Date: Sat, 22 Mar 2025 21:39:19 +0200 Subject: [PATCH 2/3] Features/lightweight charts v5 (#1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Migrate lightweight-charts to version 5.0.3 * Update package v5 * lightweight_charts v5 - Fix comments --------- Co-authored-by: Phong Trần --- examples/1_setting_data/setting_data.py | 7 +- examples/7_panes/ohlcv.csv | 2982 +++ examples/7_panes/pane.py | 55 + examples/7_panes/panes.png | Bin 0 -> 21951 bytes lightweight_charts/abstract.py | 717 +- lightweight_charts/chart.py | 140 +- lightweight_charts/js/bundle.js | 2 +- lightweight_charts/js/index.html | 2 +- lightweight_charts/js/lightweight-charts.js | 7 - ...ghtweight-charts.standalone.development.js | 15183 ++++++++++++++++ package.json | 2 +- pyproject.toml | 32 + setup.py | 22 +- src/drawing/pane-renderer.ts | 116 +- src/drawing/pane-view.ts | 85 +- src/general/handler.ts | 768 +- src/general/legend.ts | 445 +- src/horizontal-line/axis-view.ts | 71 +- src/vertical-line/axis-view.ts | 62 +- test/test_chart.py | 24 +- test/util.py | 11 +- 21 files changed, 19685 insertions(+), 1048 deletions(-) create mode 100644 examples/7_panes/ohlcv.csv create mode 100644 examples/7_panes/pane.py create mode 100644 examples/7_panes/panes.png delete mode 100644 lightweight_charts/js/lightweight-charts.js create mode 100644 lightweight_charts/js/lightweight-charts.standalone.development.js create mode 100644 pyproject.toml diff --git a/examples/1_setting_data/setting_data.py b/examples/1_setting_data/setting_data.py index c0f0cd4d..03a5cab3 100644 --- a/examples/1_setting_data/setting_data.py +++ b/examples/1_setting_data/setting_data.py @@ -1,11 +1,14 @@ import pandas as pd from lightweight_charts import Chart +import os -if __name__ == '__main__': +if __name__ == "__main__": chart = Chart() + path = os.path.join(os.path.dirname(__file__), "ohlcv.csv") + # Columns: time | open | high | low | close | volume - df = pd.read_csv('ohlcv.csv') + df = pd.read_csv(path) chart.set(df) chart.show(block=True) diff --git a/examples/7_panes/ohlcv.csv b/examples/7_panes/ohlcv.csv new file mode 100644 index 00000000..57e4739b --- /dev/null +++ b/examples/7_panes/ohlcv.csv @@ -0,0 +1,2982 @@ +,date,open,high,low,close,volume +0,2010-06-29,1.2667,1.6667,1.1693,1.5927,277519500.0 +1,2010-06-30,1.6713,2.028,1.5533,1.5887,253039500.0 +2,2010-07-01,1.6627,1.728,1.3513,1.464,121461000.0 +3,2010-07-02,1.47,1.55,1.2473,1.28,75871500.0 +4,2010-07-06,1.2867,1.3333,1.0553,1.074,101664000.0 +5,2010-07-07,1.0933,1.1087,0.9987,1.0533,102645000.0 +6,2010-07-08,1.0567,1.1793,1.038,1.164,114526500.0 +7,2010-07-09,1.18,1.1933,1.1033,1.16,60061500.0 +8,2010-07-12,1.1533,1.2047,1.1233,1.1413,32487000.0 +9,2010-07-13,1.1533,1.2427,1.1267,1.2093,39439500.0 +10,2010-07-14,1.2067,1.3433,1.184,1.3227,62097000.0 +11,2010-07-15,1.32,1.4333,1.2667,1.326,55222500.0 +12,2010-07-16,1.3267,1.42,1.326,1.376,37939500.0 +13,2010-07-19,1.4,1.4893,1.3867,1.4367,36303000.0 +14,2010-07-20,1.466,1.4853,1.328,1.3533,26229000.0 +15,2010-07-21,1.36,1.41,1.3,1.348,18214500.0 +16,2010-07-22,1.3507,1.4167,1.35,1.4,13924500.0 +17,2010-07-23,1.416,1.4373,1.4013,1.4193,9603000.0 +18,2010-07-26,1.4187,1.4513,1.3533,1.3953,13416000.0 +19,2010-07-27,1.3973,1.412,1.3507,1.37,8658000.0 +20,2010-07-28,1.3673,1.3933,1.3673,1.3813,6801000.0 +21,2010-07-29,1.3847,1.392,1.3333,1.3567,8734500.0 +22,2010-07-30,1.3567,1.3627,1.3033,1.3293,6258000.0 +23,2010-08-02,1.338,1.4,1.338,1.3807,10417500.0 +24,2010-08-03,1.384,1.4633,1.3593,1.4633,17827500.0 +25,2010-08-04,1.4867,1.4867,1.3407,1.4173,13594500.0 +26,2010-08-05,1.3967,1.442,1.3367,1.3633,11722500.0 +27,2010-08-06,1.336,1.35,1.3013,1.306,10542000.0 +28,2010-08-09,1.302,1.3333,1.2967,1.3053,10684500.0 +29,2010-08-10,1.3067,1.31,1.2547,1.2687,17506500.0 +30,2010-08-11,1.2447,1.26,1.1833,1.1933,11340000.0 +31,2010-08-12,1.1933,1.2133,1.1593,1.1733,10168500.0 +32,2010-08-13,1.1847,1.24,1.1773,1.2213,9385500.0 +33,2010-08-16,1.2333,1.2533,1.2173,1.25,7186500.0 +34,2010-08-17,1.25,1.2933,1.25,1.2767,6597000.0 +35,2010-08-18,1.28,1.306,1.2333,1.2513,8905500.0 +36,2010-08-19,1.236,1.2833,1.222,1.2527,8290500.0 +37,2010-08-20,1.2333,1.2787,1.2333,1.2733,4381500.0 +38,2010-08-23,1.2727,1.3593,1.2667,1.3467,16048500.0 +39,2010-08-24,1.3267,1.3267,1.2633,1.28,9973500.0 +40,2010-08-25,1.2667,1.332,1.2373,1.3267,7372500.0 +41,2010-08-26,1.316,1.3513,1.3067,1.3167,6189000.0 +42,2010-08-27,1.3333,1.334,1.3,1.3133,5628000.0 +43,2010-08-30,1.3133,1.346,1.3073,1.32,10831500.0 +44,2010-08-31,1.292,1.3193,1.2887,1.2987,2956500.0 +45,2010-09-01,1.308,1.3793,1.3067,1.3633,7306500.0 +46,2010-09-02,1.3633,1.416,1.354,1.404,7159500.0 +47,2010-09-03,1.4067,1.4327,1.3773,1.4033,6402000.0 +48,2010-09-07,1.388,1.4,1.3667,1.3693,3612000.0 +49,2010-09-08,1.372,1.3967,1.372,1.3933,4281000.0 +50,2010-09-09,1.3953,1.4033,1.3347,1.3807,5586000.0 +51,2010-09-10,1.3833,1.3953,1.3173,1.3447,5706000.0 +52,2010-09-13,1.3733,1.3933,1.3667,1.386,5361000.0 +53,2010-09-14,1.3693,1.44,1.3687,1.408,9564000.0 +54,2010-09-15,1.3987,1.4667,1.386,1.4653,9990000.0 +55,2010-09-16,1.4867,1.544,1.3873,1.396,38347500.0 +56,2010-09-17,1.4213,1.4233,1.32,1.3487,17478000.0 +57,2010-09-20,1.35,1.4233,1.344,1.4,13968000.0 +58,2010-09-21,1.4193,1.4367,1.378,1.3847,11749500.0 +59,2010-09-22,1.3913,1.3967,1.32,1.3247,13227000.0 +60,2010-09-23,1.32,1.3427,1.3,1.304,9856500.0 +61,2010-09-24,1.33,1.346,1.31,1.34,8590500.0 +62,2010-09-27,1.3467,1.3873,1.3333,1.386,6181500.0 +63,2010-09-28,1.398,1.4327,1.384,1.4267,17905500.0 +64,2010-09-29,1.3667,1.4733,1.3667,1.4653,27925500.0 +65,2010-09-30,1.466,1.4767,1.346,1.3603,31186500.0 +66,2010-10-01,1.3867,1.4167,1.346,1.3733,7783500.0 +67,2010-10-04,1.34,1.4113,1.34,1.4,9444000.0 +68,2010-10-05,1.41,1.4187,1.4007,1.408,4914000.0 +69,2010-10-06,1.404,1.4173,1.3547,1.364,4617000.0 +70,2010-10-07,1.3713,1.376,1.354,1.362,2064000.0 +71,2010-10-08,1.362,1.386,1.3573,1.362,3973500.0 +72,2010-10-11,1.3667,1.38,1.338,1.34,2497500.0 +73,2010-10-12,1.3467,1.352,1.3353,1.3493,3405000.0 +74,2010-10-13,1.3507,1.4233,1.3507,1.3693,4728000.0 +75,2010-10-14,1.4333,1.4333,1.36,1.3833,4314000.0 +76,2010-10-15,1.3927,1.3933,1.35,1.3693,4189500.0 +77,2010-10-18,1.376,1.376,1.348,1.3487,2374500.0 +78,2010-10-19,1.3467,1.3607,1.3333,1.3367,3601500.0 +79,2010-10-20,1.344,1.3793,1.336,1.3767,4608000.0 +80,2010-10-21,1.374,1.3967,1.3633,1.3833,6166500.0 +81,2010-10-22,1.3787,1.3953,1.37,1.3813,2374500.0 +82,2010-10-25,1.3947,1.3987,1.382,1.3987,1737000.0 +83,2010-10-26,1.3867,1.458,1.3673,1.424,9744000.0 +84,2010-10-27,1.4,1.4,1.4,1.4,0.0 +85,2011-01-06,1.7907,1.8667,1.7873,1.8467,28846500.0 +86,2011-01-07,1.8533,1.9053,1.8533,1.876,33460500.0 +87,2011-01-10,1.8773,1.912,1.87,1.91,19849500.0 +88,2011-01-11,1.9073,1.914,1.782,1.7973,25282500.0 +89,2011-01-12,1.8007,1.8267,1.768,1.7973,13564500.0 +90,2011-01-13,1.7967,1.7993,1.744,1.7533,10503000.0 +91,2011-01-14,1.7553,1.772,1.7073,1.7193,17412000.0 +92,2011-01-18,1.74,1.74,1.65,1.7093,23950500.0 +93,2011-01-19,1.6847,1.698,1.5833,1.602,35040000.0 +94,2011-01-20,1.6133,1.63,1.4913,1.5167,33759000.0 +95,2011-01-21,1.5247,1.5727,1.514,1.5333,18036000.0 +96,2011-01-24,1.5567,1.654,1.5487,1.6333,24352500.0 +97,2011-01-25,1.6433,1.6593,1.6013,1.6453,18924000.0 +98,2011-01-26,1.66,1.66,1.6067,1.65,16050000.0 +99,2011-01-27,1.6567,1.672,1.6353,1.6647,12790500.0 +100,2011-01-28,1.6533,1.6613,1.5833,1.6,15490500.0 +101,2011-01-31,1.6393,1.6393,1.5667,1.6007,11974500.0 +102,2011-02-01,1.6367,1.6487,1.5693,1.594,10473000.0 +103,2011-02-02,1.594,1.612,1.578,1.596,8454000.0 +104,2011-02-03,1.588,1.5933,1.5433,1.5807,7540500.0 +105,2011-02-04,1.5647,1.578,1.548,1.5753,8067000.0 +106,2011-02-07,1.556,1.5567,1.5253,1.538,13209000.0 +107,2011-02-08,1.534,1.6833,1.5333,1.6327,51768000.0 +108,2011-02-09,1.6173,1.6327,1.5193,1.5473,37779000.0 +109,2011-02-10,1.5333,1.576,1.5207,1.5513,12324000.0 +110,2011-02-11,1.55,1.5833,1.5293,1.5333,9424500.0 +111,2011-02-14,1.5487,1.6093,1.5367,1.546,18984000.0 +112,2011-02-15,1.546,1.5667,1.4973,1.5227,14146500.0 +113,2011-02-16,1.5333,1.6647,1.5273,1.6487,60928500.0 +114,2011-02-17,1.6667,1.6993,1.558,1.5833,38383500.0 +115,2011-02-18,1.5733,1.5733,1.5307,1.5353,35118000.0 +116,2011-02-22,1.5807,1.5807,1.452,1.458,30369000.0 +117,2011-02-23,1.496,1.5,1.4073,1.4553,23451000.0 +118,2011-02-24,1.4667,1.5053,1.4333,1.4813,15372000.0 +119,2011-02-25,1.5067,1.59,1.5053,1.5687,19941000.0 +120,2011-02-28,1.5827,1.6067,1.5667,1.574,15580500.0 +121,2011-03-01,1.5927,1.6213,1.58,1.596,16422000.0 +122,2011-03-02,1.596,1.6187,1.582,1.6013,9826500.0 +123,2011-03-03,1.632,1.6527,1.604,1.6207,9478500.0 +124,2011-03-04,1.628,1.666,1.5853,1.646,22677000.0 +125,2011-03-07,1.67,1.6933,1.6467,1.6587,30210000.0 +126,2011-03-08,1.6587,1.664,1.6,1.644,20715000.0 +127,2011-03-09,1.644,1.666,1.618,1.648,13692000.0 +128,2011-03-10,1.6293,1.648,1.582,1.6133,14049000.0 +129,2011-03-11,1.6047,1.6167,1.5687,1.6033,13821000.0 +130,2011-03-14,1.5733,1.608,1.5467,1.5507,17205000.0 +131,2011-03-15,1.4927,1.5307,1.4533,1.53,19534500.0 +132,2011-03-16,1.524,1.55,1.5127,1.5213,17208000.0 +133,2011-03-17,1.5433,1.562,1.5093,1.5207,12612000.0 +134,2011-03-18,1.546,1.546,1.5007,1.522,10195500.0 +135,2011-03-21,1.5333,1.5467,1.5027,1.516,6057000.0 +136,2011-03-22,1.5153,1.524,1.4667,1.4793,8097000.0 +137,2011-03-23,1.4707,1.4847,1.4513,1.4807,5943000.0 +138,2011-03-24,1.48,1.5,1.4653,1.5,6564000.0 +139,2011-03-25,1.4953,1.5333,1.4933,1.5167,8416500.0 +140,2011-03-28,1.5307,1.5693,1.5033,1.528,15309000.0 +141,2011-03-29,1.5533,1.6,1.5473,1.5947,11188500.0 +142,2011-03-30,1.5933,1.6327,1.534,1.5807,18003000.0 +143,2011-03-31,1.6093,1.914,1.6093,1.842,163869000.0 +144,2011-04-01,1.8667,1.8787,1.7713,1.7793,42078000.0 +145,2011-04-04,1.7687,1.8,1.682,1.7207,38563500.0 +146,2011-04-05,1.7567,1.8,1.7127,1.78,46600500.0 +147,2011-04-06,1.778,1.8007,1.72,1.7633,18907500.0 +148,2011-04-07,1.772,1.8627,1.7633,1.8273,41496000.0 +149,2011-04-08,1.846,1.846,1.7573,1.7667,28378500.0 +150,2011-04-11,1.7833,1.7833,1.6667,1.6667,20121000.0 +151,2011-04-12,1.6707,1.6827,1.62,1.65,20044500.0 +152,2011-04-13,1.662,1.7127,1.6533,1.6533,17970000.0 +153,2011-04-14,1.6527,1.6853,1.6133,1.6767,14481000.0 +154,2011-04-15,1.7,1.7453,1.69,1.6913,13975500.0 +155,2011-04-18,1.678,1.708,1.624,1.6653,15267000.0 +156,2011-04-19,1.668,1.684,1.6433,1.6833,8127000.0 +157,2011-04-20,1.7013,1.7393,1.6867,1.72,12396000.0 +158,2011-04-21,1.72,1.7987,1.706,1.7647,19473000.0 +159,2011-04-25,1.78,1.79,1.7313,1.762,11760000.0 +160,2011-04-26,1.7647,1.8167,1.754,1.7953,20268000.0 +161,2011-04-27,1.8007,1.824,1.7753,1.8013,14770500.0 +162,2011-04-28,1.8167,1.846,1.7813,1.83,23356500.0 +163,2011-04-29,1.846,1.858,1.82,1.82,9780000.0 +164,2011-05-02,1.8467,1.8533,1.804,1.816,11614500.0 +165,2011-05-03,1.8267,1.83,1.7667,1.82,13510500.0 +166,2011-05-04,1.7853,1.9333,1.7167,1.8467,15252000.0 +167,2011-05-05,1.8167,1.864,1.7447,1.7987,17584500.0 +168,2011-05-06,1.7833,1.8467,1.7747,1.808,13941000.0 +169,2011-05-09,1.8527,1.8667,1.79,1.828,13521000.0 +170,2011-05-10,1.8733,1.93,1.8607,1.8873,22632000.0 +171,2011-05-11,1.892,1.892,1.78,1.79,14250000.0 +172,2011-05-12,1.7833,1.85,1.7567,1.85,9286500.0 +173,2011-05-13,1.86,1.8793,1.82,1.8333,9783000.0 +174,2011-05-16,1.85,1.866,1.77,1.7787,11152500.0 +175,2011-05-17,1.85,1.85,1.7147,1.722,18295500.0 +176,2011-05-18,1.6967,1.7647,1.6967,1.7567,10804500.0 +177,2011-05-19,1.7793,1.896,1.7733,1.8533,38518500.0 +178,2011-05-20,1.8867,1.8867,1.8233,1.8653,12024000.0 +179,2011-05-23,1.8333,1.8413,1.7747,1.776,12774000.0 +180,2011-05-24,1.8107,1.8333,1.77,1.77,9003000.0 +181,2011-05-25,1.7987,1.934,1.7447,1.926,69592500.0 +182,2011-05-26,1.9307,1.984,1.8733,1.9667,48706500.0 +183,2011-05-27,1.9707,1.978,1.9213,1.964,24933000.0 +184,2011-05-31,1.9747,2.0187,1.9667,2.0127,48790500.0 +185,2011-06-01,2.0093,2.0093,1.884,1.904,22666500.0 +186,2011-06-02,1.908,1.9547,1.8893,1.95,14418000.0 +187,2011-06-03,1.9367,2.1,1.9327,2.0,92074500.0 +188,2011-06-06,2.012,2.0253,1.884,1.9167,34503000.0 +189,2011-06-07,1.928,1.9593,1.884,1.89,17590500.0 +190,2011-06-08,1.8813,1.9067,1.8,1.8073,25230000.0 +191,2011-06-09,1.8313,1.8733,1.8067,1.8553,23793000.0 +192,2011-06-10,1.8313,1.8867,1.8233,1.868,22432500.0 +193,2011-06-13,1.8713,1.9253,1.8587,1.8967,25342500.0 +194,2011-06-14,1.928,1.98,1.9,1.9,23337000.0 +195,2011-06-15,1.9,1.9,1.8047,1.8533,19891500.0 +196,2011-06-16,1.8447,1.8667,1.716,1.7487,26997000.0 +197,2011-06-17,1.778,1.8467,1.7427,1.766,25465500.0 +198,2011-06-20,1.7733,1.7733,1.7,1.734,22590000.0 +199,2011-06-21,1.7513,1.8487,1.7333,1.8447,22168500.0 +200,2011-06-22,1.828,1.8833,1.802,1.802,21912000.0 +201,2011-06-23,1.8053,1.856,1.7473,1.856,17314500.0 +202,2011-06-24,1.8427,1.8647,1.8173,1.8373,49531500.0 +203,2011-06-27,1.8487,1.8853,1.8207,1.8307,16056000.0 +204,2011-06-28,1.852,1.8833,1.8447,1.874,13153500.0 +205,2011-06-29,1.8887,1.9393,1.8713,1.8873,21499500.0 +206,2011-06-30,1.9,1.9553,1.886,1.912,13981500.0 +207,2011-07-01,1.938,1.9733,1.92,1.9347,12570000.0 +208,2011-07-05,1.9347,1.968,1.914,1.942,14746500.0 +209,2011-07-06,1.9633,1.9633,1.9033,1.926,13030500.0 +210,2011-07-07,1.9427,2.0,1.934,1.982,19233000.0 +211,2011-07-08,1.9733,1.9927,1.906,1.916,18363000.0 +212,2011-07-11,1.9073,1.9073,1.8667,1.8893,14514000.0 +213,2011-07-12,1.8667,1.9393,1.8667,1.8667,15451500.0 +214,2011-07-13,1.8953,1.9353,1.86,1.9113,15813000.0 +215,2011-07-14,1.902,1.9307,1.8167,1.8407,17193000.0 +216,2011-07-15,1.8527,1.8553,1.8267,1.8353,10407000.0 +217,2011-07-18,1.832,1.85,1.7753,1.7953,12657000.0 +218,2011-07-19,1.8153,1.874,1.8153,1.86,14488500.0 +219,2011-07-20,1.8667,2.0293,1.8533,1.9187,45171000.0 +220,2011-07-21,1.9,1.944,1.8733,1.914,14995500.0 +221,2011-07-22,1.9133,1.9693,1.9033,1.9507,8658000.0 +222,2011-07-25,1.8913,1.9527,1.8733,1.9173,9960000.0 +223,2011-07-26,1.86,1.918,1.86,1.878,11218500.0 +224,2011-07-27,1.9,1.9,1.8273,1.842,13981500.0 +225,2011-07-28,1.846,1.9033,1.836,1.8653,13846500.0 +226,2011-07-29,1.8533,1.8933,1.8333,1.878,13464000.0 +227,2011-08-01,1.9233,1.932,1.8807,1.918,16134000.0 +228,2011-08-02,1.9127,1.9467,1.8,1.8,21258000.0 +229,2011-08-03,1.8333,1.9333,1.75,1.75,25755000.0 +230,2011-08-04,1.7567,1.7927,1.6447,1.6833,44475000.0 +231,2011-08-05,1.6433,1.692,1.522,1.6167,28983000.0 +232,2011-08-08,1.5167,1.6293,1.496,1.572,38667000.0 +233,2011-08-09,1.5727,1.6967,1.5667,1.6707,19720500.0 +234,2011-08-10,1.6907,1.696,1.5753,1.6707,22410000.0 +235,2011-08-11,1.63,1.7167,1.6,1.6867,12295500.0 +236,2011-08-12,1.7067,1.8093,1.6907,1.754,14947500.0 +237,2011-08-15,1.77,1.7833,1.7287,1.7493,10935000.0 +238,2011-08-16,1.7467,1.7693,1.722,1.7393,7972500.0 +239,2011-08-17,1.7573,1.7767,1.6847,1.6867,9489000.0 +240,2011-08-18,1.7,1.7,1.5647,1.6173,15598500.0 +241,2011-08-19,1.564,1.6173,1.4667,1.49,18744000.0 +242,2011-08-22,1.498,1.5867,1.4453,1.4633,14208000.0 +243,2011-08-23,1.48,1.5407,1.4333,1.4633,12903000.0 +244,2011-08-24,1.5333,1.5953,1.508,1.5307,10108500.0 +245,2011-08-25,1.5913,1.5913,1.5267,1.55,10123500.0 +246,2011-08-26,1.514,1.5967,1.4713,1.582,11325000.0 +247,2011-08-29,1.596,1.6567,1.596,1.6473,11877000.0 +248,2011-08-30,1.6333,1.652,1.606,1.64,5392500.0 +249,2011-08-31,1.6453,1.7,1.6187,1.646,12174000.0 +250,2011-09-01,1.644,1.658,1.5893,1.6,12555000.0 +251,2011-09-02,1.6,1.6,1.512,1.5713,11379000.0 +252,2011-09-06,1.5067,1.5467,1.486,1.51,11688000.0 +253,2011-09-07,1.6,1.6,1.552,1.5893,6774000.0 +254,2011-09-08,1.572,1.602,1.552,1.5893,6633000.0 +255,2011-09-09,1.558,1.574,1.5033,1.5313,9963000.0 +256,2011-09-12,1.4987,1.554,1.4967,1.5253,8395500.0 +257,2011-09-13,1.5527,1.6067,1.5167,1.6053,10750500.0 +258,2011-09-14,1.6133,1.656,1.586,1.6227,12340500.0 +259,2011-09-15,1.6387,1.662,1.622,1.6227,8277000.0 +260,2011-09-16,1.6533,1.73,1.6327,1.73,20959500.0 +261,2011-09-19,1.7113,1.7207,1.588,1.7173,17196000.0 +262,2011-09-20,1.7133,1.7733,1.7113,1.7267,16471500.0 +263,2011-09-21,1.73,1.7967,1.7133,1.7233,14565000.0 +264,2011-09-22,1.6933,1.7407,1.6187,1.7093,11467500.0 +265,2011-09-23,1.6993,1.7747,1.69,1.7547,16702500.0 +266,2011-09-26,1.768,1.768,1.66,1.7133,13869000.0 +267,2011-09-27,1.7133,1.7993,1.7013,1.746,9808500.0 +268,2011-09-28,1.75,1.7667,1.634,1.6393,10636500.0 +269,2011-09-29,1.6667,1.7213,1.57,1.608,12891000.0 +270,2011-09-30,1.6533,1.6593,1.566,1.6253,19627500.0 +271,2011-10-03,1.6127,1.6667,1.55,1.582,15189000.0 +272,2011-10-04,1.5493,1.6213,1.5287,1.5773,17628000.0 +273,2011-10-05,1.5967,1.7227,1.5567,1.692,17782500.0 +274,2011-10-06,1.6913,1.84,1.668,1.7973,24651000.0 +275,2011-10-07,1.7447,1.84,1.7367,1.7993,19497000.0 +276,2011-10-10,1.816,1.8787,1.8,1.8587,12903000.0 +277,2011-10-11,1.834,1.8513,1.8,1.8,8533500.0 +278,2011-10-12,1.8427,1.8667,1.8133,1.8533,16698000.0 +279,2011-10-13,1.8353,1.898,1.8293,1.8327,15391500.0 +280,2011-10-14,1.88,1.9033,1.8173,1.87,20578500.0 +281,2011-10-17,1.8727,1.8733,1.8173,1.828,11227500.0 +282,2011-10-18,1.82,1.8953,1.7807,1.89,14308500.0 +283,2011-10-19,1.8667,1.872,1.82,1.838,11691000.0 +284,2011-10-20,1.8333,1.8333,1.8,1.8133,14899500.0 +285,2011-10-21,1.718,1.8867,1.718,1.8687,14001000.0 +286,2011-10-24,1.8593,1.926,1.85,1.904,13860000.0 +287,2011-10-25,1.882,1.924,1.8533,1.9033,9043500.0 +288,2011-10-26,1.882,1.8913,1.8267,1.8653,7510500.0 +289,2011-10-27,1.892,1.9333,1.8653,1.9333,12655500.0 +290,2011-10-28,1.9473,2.0167,1.8673,2.0167,18213000.0 +291,2011-10-31,1.9667,1.9673,1.9167,1.958,16635000.0 +292,2011-11-01,1.9167,1.958,1.8667,1.9033,9394500.0 +293,2011-11-02,1.948,2.0553,1.8833,2.0167,12871500.0 +294,2011-11-03,1.9993,2.1667,1.9687,2.1473,36706500.0 +295,2011-11-04,2.1167,2.164,2.034,2.1533,43872000.0 +296,2011-11-07,2.1367,2.1487,2.05,2.09,18619500.0 +297,2011-11-08,2.0867,2.1333,2.048,2.0947,15342000.0 +298,2011-11-09,2.08,2.0993,2.02,2.0567,14122500.0 +299,2011-11-10,2.0747,2.1,2.0433,2.074,11065500.0 +300,2011-11-11,2.16,2.3,2.038,2.2667,56487000.0 +301,2011-11-14,2.2347,2.2427,2.1747,2.214,18837000.0 +302,2011-11-15,2.2,2.2933,2.182,2.2547,13186500.0 +303,2011-11-16,2.2533,2.3333,2.2267,2.318,26086500.0 +304,2011-11-17,2.318,2.3267,2.2127,2.2453,20025000.0 +305,2011-11-18,2.2667,2.274,2.1633,2.1633,13359000.0 +306,2011-11-21,2.1733,2.1733,2.07,2.108,15288000.0 +307,2011-11-22,2.1173,2.186,2.07,2.138,10806000.0 +308,2011-11-23,2.1173,2.1367,2.0833,2.0967,6690000.0 +309,2011-11-25,2.092,2.1607,2.072,2.1333,3430500.0 +310,2011-11-28,2.1267,2.2187,2.1207,2.1707,10074000.0 +311,2011-11-29,2.1707,2.2047,2.1087,2.1707,8560500.0 +312,2011-11-30,2.1333,2.1953,2.1333,2.182,11122500.0 +313,2011-12-01,2.1713,2.266,2.132,2.194,14413500.0 +314,2011-12-02,2.1773,2.246,2.16,2.2053,10338000.0 +315,2011-12-05,2.236,2.3333,2.2287,2.294,15996000.0 +316,2011-12-06,2.28,2.332,2.2687,2.3173,14083500.0 +317,2011-12-07,2.3107,2.326,2.2533,2.2793,9607500.0 +318,2011-12-08,2.236,2.236,1.974,2.0633,48607500.0 +319,2011-12-09,2.0867,2.09,2.0187,2.07,18294000.0 +320,2011-12-12,2.03,2.0413,2.0013,2.0273,11262000.0 +321,2011-12-13,2.0353,2.062,1.9273,2.0273,14616000.0 +322,2011-12-14,1.9667,1.9787,1.8667,1.9,17221500.0 +323,2011-12-15,1.9073,1.9447,1.8747,1.908,10383000.0 +324,2011-12-16,2.0627,2.0627,1.8653,1.8667,14853000.0 +325,2011-12-19,1.872,1.9,1.8247,1.85,14272500.0 +326,2011-12-20,1.8667,1.8967,1.8467,1.888,12039000.0 +327,2011-12-21,1.88,1.88,1.7353,1.8667,25294500.0 +328,2011-12-22,1.8327,1.87,1.8,1.866,14973000.0 +329,2011-12-23,1.8653,1.8667,1.8347,1.8633,8787000.0 +330,2011-12-27,1.86,1.918,1.8367,1.86,10927500.0 +331,2011-12-28,1.9267,1.9493,1.8693,1.9047,8535000.0 +332,2011-12-29,1.906,1.956,1.9007,1.9007,7056000.0 +333,2011-12-30,1.8993,1.932,1.8833,1.904,4962000.0 +334,2012-01-03,1.9233,1.9667,1.8433,1.872,13644000.0 +335,2012-01-04,1.9053,1.9113,1.8333,1.8473,9174000.0 +336,2012-01-05,1.8507,1.862,1.79,1.808,14919000.0 +337,2012-01-06,1.814,1.8527,1.7607,1.808,14559000.0 +338,2012-01-09,1.8,1.8327,1.7413,1.8127,13207500.0 +339,2012-01-10,1.8293,1.8507,1.8167,1.85,9924000.0 +340,2012-01-11,1.8587,1.9113,1.82,1.9113,9738000.0 +341,2012-01-12,1.8987,1.908,1.8533,1.8833,9886500.0 +342,2012-01-13,1.8933,1.9,1.5093,1.6373,80587500.0 +343,2012-01-17,1.7033,1.8227,1.6767,1.7667,68454000.0 +344,2012-01-18,1.7667,1.7993,1.75,1.7873,17664000.0 +345,2012-01-19,1.8,1.8493,1.774,1.7787,18375000.0 +346,2012-01-20,1.7933,1.8,1.7507,1.7507,9475500.0 +347,2012-01-23,1.79,1.814,1.7733,1.788,8737500.0 +348,2012-01-24,1.7753,1.8453,1.7627,1.8133,12381000.0 +349,2012-01-25,1.8133,1.8673,1.8033,1.8647,8737500.0 +350,2012-01-26,1.8667,1.972,1.8647,1.8647,17626500.0 +351,2012-01-27,1.9,1.9813,1.9,1.9487,10332000.0 +352,2012-01-30,1.966,1.974,1.902,1.974,10779000.0 +353,2012-01-31,2.0,2.0333,1.9247,1.9387,13840500.0 +354,2012-02-01,1.9333,1.98,1.9207,1.964,7369500.0 +355,2012-02-02,1.9813,2.0587,1.9727,1.9727,11790000.0 +356,2012-02-03,2.032,2.0887,2.0167,2.074,11242500.0 +357,2012-02-06,2.0667,2.1267,2.066,2.12,9498000.0 +358,2012-02-07,2.1167,2.142,2.0547,2.1067,14199000.0 +359,2012-02-08,2.1333,2.134,2.086,2.1207,9072000.0 +360,2012-02-09,2.1287,2.2467,2.0953,2.1853,17317500.0 +361,2012-02-10,2.158,2.1613,1.9893,2.0733,27693000.0 +362,2012-02-13,2.0907,2.1373,2.06,2.094,16954500.0 +363,2012-02-14,2.13,2.2633,2.0933,2.2633,26682000.0 +364,2012-02-15,2.2667,2.3953,2.1513,2.29,40675500.0 +365,2012-02-16,2.2667,2.3007,2.1693,2.3007,32883000.0 +366,2012-02-17,2.3253,2.334,2.2333,2.316,20112000.0 +367,2012-02-21,2.32,2.3433,2.254,2.3033,16618500.0 +368,2012-02-22,2.3,2.3147,2.1667,2.27,23985000.0 +369,2012-02-23,2.266,2.3313,2.2373,2.3013,11665500.0 +370,2012-02-24,2.2933,2.3013,2.218,2.2533,14241000.0 +371,2012-02-27,2.244,2.2667,2.2,2.2413,8934000.0 +372,2012-02-28,2.2427,2.296,2.2113,2.2607,9070500.0 +373,2012-02-29,2.254,2.2747,2.2087,2.2087,7635000.0 +374,2012-03-01,2.2373,2.3,2.22,2.294,8875500.0 +375,2012-03-02,2.2933,2.3,2.2473,2.2727,7927500.0 +376,2012-03-05,2.2733,2.2933,2.2307,2.2513,6894000.0 +377,2012-03-06,2.2267,2.2267,2.1747,2.1987,7669500.0 +378,2012-03-07,2.208,2.2213,2.194,2.208,5398500.0 +379,2012-03-08,2.2073,2.2327,2.2027,2.2047,8953500.0 +380,2012-03-09,2.2133,2.354,2.2133,2.3307,22969500.0 +381,2012-03-12,2.3127,2.4193,2.3067,2.4067,28791000.0 +382,2012-03-13,2.4007,2.4393,2.3667,2.3793,14412000.0 +383,2012-03-14,2.4,2.4007,2.32,2.3553,12595500.0 +384,2012-03-15,2.352,2.3653,2.3187,2.3387,8461500.0 +385,2012-03-16,2.3287,2.3927,2.322,2.3533,10819500.0 +386,2012-03-19,2.3507,2.3547,2.3027,2.332,14856000.0 +387,2012-03-20,2.332,2.3467,2.3047,2.3307,8392500.0 +388,2012-03-21,2.3293,2.354,2.3067,2.336,8650500.0 +389,2012-03-22,2.3467,2.3467,2.2867,2.3173,7563000.0 +390,2012-03-23,2.2833,2.3087,2.21,2.29,16336500.0 +391,2012-03-26,2.3333,2.5393,2.3333,2.4833,46437000.0 +392,2012-03-27,2.4833,2.6633,2.4687,2.588,36403500.0 +393,2012-03-28,2.5547,2.5627,2.474,2.506,13975500.0 +394,2012-03-29,2.4707,2.546,2.4667,2.4887,10455000.0 +395,2012-03-30,2.5013,2.5293,2.4453,2.48,11152500.0 +396,2012-04-02,2.4733,2.5313,2.4353,2.44,13074000.0 +397,2012-04-03,2.4433,2.5647,2.396,2.4,16107000.0 +398,2012-04-04,2.41,2.41,2.3127,2.33,66337500.0 +399,2012-04-05,2.3507,2.3627,2.2927,2.2927,21292500.0 +400,2012-04-09,2.2733,2.308,2.2,2.2,24487500.0 +401,2012-04-10,2.2127,2.2567,2.14,2.1653,25423500.0 +402,2012-04-11,2.1953,2.2193,2.134,2.2007,16089000.0 +403,2012-04-12,2.2333,2.2987,2.1947,2.2387,14713500.0 +404,2012-04-13,2.2267,2.2693,2.19,2.2533,9622500.0 +405,2012-04-16,2.2273,2.2467,2.1393,2.1633,15481500.0 +406,2012-04-17,2.15,2.2047,2.136,2.1493,16413000.0 +407,2012-04-18,2.1407,2.188,2.102,2.1773,12088500.0 +408,2012-04-19,2.1087,2.2287,2.1087,2.198,11424000.0 +409,2012-04-20,2.2433,2.2567,2.196,2.2107,12180000.0 +410,2012-04-23,2.2113,2.2113,2.114,2.1293,13161000.0 +411,2012-04-24,2.1493,2.1493,2.0667,2.1233,9708000.0 +412,2012-04-25,2.1267,2.1993,2.1267,2.194,10542000.0 +413,2012-04-26,2.194,2.2367,2.194,2.2367,6229500.0 +414,2012-04-27,2.3013,2.3013,2.194,2.2227,8539500.0 +415,2012-04-30,2.218,2.224,2.172,2.22,6088500.0 +416,2012-05-01,2.216,2.2807,2.2087,2.252,9690000.0 +417,2012-05-02,2.2233,2.2927,2.2233,2.2627,7291500.0 +418,2012-05-03,2.2747,2.2747,2.14,2.14,12472500.0 +419,2012-05-04,2.1573,2.164,2.0933,2.12,18291000.0 +420,2012-05-07,2.1233,2.172,2.1073,2.1647,16948500.0 +421,2012-05-08,2.1647,2.186,1.958,2.038,45520500.0 +422,2012-05-09,2.004,2.1933,1.9667,2.1173,28653000.0 +423,2012-05-10,2.12,2.312,2.1173,2.1973,82389000.0 +424,2012-05-11,2.1867,2.2293,2.144,2.18,18039000.0 +425,2012-05-14,2.1333,2.142,2.0007,2.0107,20400000.0 +426,2012-05-15,2.024,2.064,1.948,1.9827,22992000.0 +427,2012-05-16,1.9933,2.012,1.9253,1.9627,18601500.0 +428,2012-05-17,1.9613,1.986,1.8827,1.8987,16810500.0 +429,2012-05-18,1.8933,1.8973,1.7887,1.8487,22939500.0 +430,2012-05-21,1.856,1.9507,1.808,1.918,21505500.0 +431,2012-05-22,1.974,2.0893,1.966,2.0527,35101500.0 +432,2012-05-23,2.0527,2.07,1.9667,2.014,18036000.0 +433,2012-05-24,2.0833,2.0833,1.9793,2.0053,15760500.0 +434,2012-05-25,2.0267,2.0273,1.9467,1.9753,11173500.0 +435,2012-05-29,2.0007,2.1287,2.0007,2.1127,23724000.0 +436,2012-05-30,2.072,2.0947,2.016,2.0267,19323000.0 +437,2012-05-31,2.0493,2.05,1.9167,1.9913,15906000.0 +438,2012-06-01,1.94,1.9467,1.8507,1.886,13029000.0 +439,2012-06-04,1.8533,1.894,1.8073,1.8567,15243000.0 +440,2012-06-05,1.8607,1.8927,1.8373,1.8607,9331500.0 +441,2012-06-06,1.872,1.9887,1.872,1.9887,13300500.0 +442,2012-06-07,1.9993,2.0,1.9233,1.9293,7242000.0 +443,2012-06-08,1.9267,2.0127,1.8767,2.0053,12514500.0 +444,2012-06-11,2.0547,2.0667,1.9227,1.9227,9043500.0 +445,2012-06-12,1.9413,1.9893,1.9207,1.952,8221500.0 +446,2012-06-13,1.97,2.0427,1.9647,1.9847,12510000.0 +447,2012-06-14,2.014,2.0433,1.908,1.9593,12885000.0 +448,2012-06-15,1.9593,1.9967,1.9207,1.988,8910000.0 +449,2012-06-18,2.0167,2.1553,1.9667,2.004,17913000.0 +450,2012-06-19,2.12,2.1773,2.1,2.1507,13380000.0 +451,2012-06-20,2.1807,2.3,2.1807,2.252,50334000.0 +452,2012-06-21,2.24,2.2853,2.1227,2.1507,25275000.0 +453,2012-06-22,2.1733,2.2653,2.1527,2.252,44323500.0 +454,2012-06-25,2.2927,2.2927,2.1207,2.1267,22111500.0 +455,2012-06-26,2.138,2.1567,2.092,2.0933,37164000.0 +456,2012-06-27,2.1307,2.1633,2.1047,2.1307,14725500.0 +457,2012-06-28,2.1413,2.1413,2.0413,2.094,13173000.0 +458,2012-06-29,2.1213,2.262,2.0667,2.086,15910500.0 +459,2012-07-02,2.086,2.12,2.0127,2.0267,19246500.0 +460,2012-07-03,2.0333,2.0667,2.0267,2.0393,13993500.0 +461,2012-07-05,2.0733,2.1113,2.0467,2.0833,18108000.0 +462,2012-07-06,2.088,2.1153,2.0473,2.0473,10950000.0 +463,2012-07-09,2.0627,2.122,2.0447,2.0993,13303500.0 +464,2012-07-10,2.094,2.1653,2.0593,2.08,10500000.0 +465,2012-07-11,2.0907,2.112,2.0673,2.0887,8515500.0 +466,2012-07-12,2.086,2.2007,2.0533,2.18,15897000.0 +467,2012-07-13,2.1907,2.2933,2.18,2.2667,19225500.0 +468,2012-07-16,2.2667,2.4,2.26,2.3973,25431000.0 +469,2012-07-17,2.354,2.3827,2.1587,2.218,37756500.0 +470,2012-07-18,2.1967,2.2447,2.0553,2.1333,42406500.0 +471,2012-07-19,2.1333,2.21,2.1333,2.1433,21282000.0 +472,2012-07-20,2.1267,2.158,2.0833,2.1207,23131500.0 +473,2012-07-23,2.1227,2.1227,2.0413,2.1193,20463000.0 +474,2012-07-24,2.0467,2.0693,1.9747,2.0073,21778500.0 +475,2012-07-25,1.9733,2.0167,1.8353,1.8827,37428000.0 +476,2012-07-26,1.932,2.004,1.8427,1.8833,33084000.0 +477,2012-07-27,1.9107,1.9773,1.8733,1.9673,24735000.0 +478,2012-07-30,1.9713,2.0167,1.814,1.8367,29761500.0 +479,2012-07-31,1.8367,1.8647,1.8233,1.8527,20505000.0 +480,2012-08-01,1.8567,1.866,1.7327,1.7327,21585000.0 +481,2012-08-02,1.7507,1.79,1.7013,1.74,19086000.0 +482,2012-08-03,1.7553,1.8367,1.74,1.74,17092500.0 +483,2012-08-06,1.8227,1.9133,1.8227,1.8873,17017500.0 +484,2012-08-07,1.8893,2.06,1.8847,2.0167,28341000.0 +485,2012-08-08,2.0493,2.0527,1.906,1.9393,17298000.0 +486,2012-08-09,1.9633,2.0,1.9393,1.9533,9636000.0 +487,2012-08-10,1.9533,1.996,1.9533,1.996,10066500.0 +488,2012-08-13,1.9827,2.0867,1.94,2.0633,12691500.0 +489,2012-08-14,2.0667,2.078,1.9467,1.9467,11076000.0 +490,2012-08-15,1.9593,1.98,1.9207,1.96,7506000.0 +491,2012-08-16,1.9687,2.026,1.96,1.96,8028000.0 +492,2012-08-17,2.0,2.0473,1.9987,2.0,7033500.0 +493,2012-08-20,2.01,2.026,1.94,1.982,13743000.0 +494,2012-08-21,1.9727,2.0,1.9333,1.9407,10840500.0 +495,2012-08-22,1.9453,2.0167,1.93,2.0167,10396500.0 +496,2012-08-23,2.0,2.0567,1.9767,2.034,21502500.0 +497,2012-08-24,2.018,2.0487,1.9607,1.9727,20377500.0 +498,2012-08-27,1.972,1.98,1.878,1.8833,18559500.0 +499,2012-08-28,1.8947,1.9587,1.8667,1.9127,20662500.0 +500,2012-08-29,1.918,1.92,1.868,1.894,12213000.0 +501,2012-08-30,1.8673,1.916,1.8673,1.894,9609000.0 +502,2012-08-31,1.8993,1.9227,1.88,1.9007,7690500.0 +503,2012-09-04,1.9013,1.9327,1.86,1.876,10840500.0 +504,2012-09-05,1.8767,1.9,1.854,1.8627,9276000.0 +505,2012-09-06,1.8673,1.9267,1.86,1.9033,12036000.0 +506,2012-09-07,1.8933,1.9713,1.8933,1.9567,13315500.0 +507,2012-09-10,1.9467,1.9667,1.82,1.8233,20403000.0 +508,2012-09-11,1.874,1.8773,1.8267,1.85,12136500.0 +509,2012-09-12,1.86,1.9053,1.8533,1.9053,16017000.0 +510,2012-09-13,1.9053,1.9773,1.88,1.9493,20878500.0 +511,2012-09-14,1.9667,2.0433,1.9653,2.024,21982500.0 +512,2012-09-17,2.0453,2.2013,2.0453,2.1667,46476000.0 +513,2012-09-18,2.134,2.1693,2.0453,2.0893,26220000.0 +514,2012-09-19,2.09,2.116,2.0627,2.07,15385500.0 +515,2012-09-20,2.08,2.1,2.0453,2.0613,10585500.0 +516,2012-09-21,2.06,2.1,1.9693,2.0013,24996000.0 +517,2012-09-24,2.0,2.0687,1.96,2.044,18555000.0 +518,2012-09-25,2.0533,2.0533,1.7133,1.8553,78354000.0 +519,2012-09-26,1.85,1.8933,1.8,1.8427,22567500.0 +520,2012-09-27,1.85,1.9027,1.84,1.8893,26001000.0 +521,2012-09-28,1.92,1.9927,1.8667,1.956,64419000.0 +522,2012-10-01,1.9533,1.9927,1.9333,1.944,12910500.0 +523,2012-10-02,1.95,1.9927,1.9333,1.9867,10389000.0 +524,2012-10-03,1.9767,2.0,1.9493,2.0,12870000.0 +525,2012-10-04,1.9793,2.0133,1.91,1.9567,18454500.0 +526,2012-10-05,1.9733,1.9873,1.9067,1.9253,12109500.0 +527,2012-10-08,1.9267,1.96,1.9073,1.9467,13128000.0 +528,2012-10-09,1.9413,1.9413,1.8833,1.91,17464500.0 +529,2012-10-10,1.9,1.9333,1.8673,1.9133,7413000.0 +530,2012-10-11,1.906,1.932,1.8833,1.888,6646500.0 +531,2012-10-12,1.8953,1.9153,1.8333,1.8433,13588500.0 +532,2012-10-15,1.8473,1.87,1.7907,1.8067,20388000.0 +533,2012-10-16,1.8447,1.8727,1.8227,1.8707,7063500.0 +534,2012-10-17,1.8833,1.9227,1.8533,1.9213,9720000.0 +535,2012-10-18,1.9327,1.9327,1.852,1.8667,9792000.0 +536,2012-10-19,1.8527,1.88,1.82,1.8493,10015500.0 +537,2012-10-22,1.8493,1.8667,1.824,1.866,5101500.0 +538,2012-10-23,1.8267,1.904,1.8247,1.8833,8620500.0 +539,2012-10-24,1.9053,1.9053,1.812,1.82,12669000.0 +540,2012-10-25,1.8573,1.8573,1.83,1.8347,8308500.0 +541,2012-10-26,1.8333,1.8533,1.8013,1.8253,6726000.0 +542,2012-10-31,1.8333,1.89,1.8247,1.8753,11193000.0 +543,2012-11-01,1.8833,1.966,1.88,1.9527,14761500.0 +544,2012-11-02,1.9513,1.97,1.9033,1.9133,14913000.0 +545,2012-11-05,1.964,2.11,1.9553,2.1,29164500.0 +546,2012-11-06,2.1033,2.1033,1.9967,2.0813,34033500.0 +547,2012-11-07,2.09,2.1367,2.054,2.1033,25089000.0 +548,2012-11-08,2.0947,2.1253,2.0627,2.0873,18096000.0 +549,2012-11-09,2.068,2.0807,1.99,2.02,12726000.0 +550,2012-11-12,2.0193,2.1547,2.0107,2.15,8142000.0 +551,2012-11-13,2.0987,2.1333,2.048,2.1107,14413500.0 +552,2012-11-14,2.1307,2.1413,2.08,2.1,12508500.0 +553,2012-11-15,2.1133,2.1133,2.0333,2.06,13594500.0 +554,2012-11-16,2.06,2.156,2.0393,2.156,12493500.0 +555,2012-11-19,2.1333,2.2167,2.118,2.2,19404000.0 +556,2012-11-20,2.2,2.2073,2.1273,2.2073,13012500.0 +557,2012-11-21,2.1833,2.2313,2.1527,2.1613,12994500.0 +558,2012-11-23,2.1733,2.1887,2.1133,2.1413,6234000.0 +559,2012-11-26,2.1433,2.156,2.108,2.156,6823500.0 +560,2012-11-27,2.1553,2.1773,2.1013,2.1433,10090500.0 +561,2012-11-28,2.1533,2.286,2.1273,2.26,22344000.0 +562,2012-11-29,2.2433,2.2667,2.1913,2.234,15483000.0 +563,2012-11-30,2.24,2.2853,2.2007,2.2533,20268000.0 +564,2012-12-03,2.2667,2.3333,2.2333,2.316,26139000.0 +565,2012-12-04,2.3593,2.36,2.2367,2.2633,18213000.0 +566,2012-12-05,2.2567,2.2793,2.2387,2.2473,7434000.0 +567,2012-12-06,2.2667,2.32,2.2333,2.2933,9687000.0 +568,2012-12-07,2.2667,2.2993,2.2567,2.28,9814500.0 +569,2012-12-10,2.274,2.32,2.274,2.3047,13413000.0 +570,2012-12-11,2.3067,2.37,2.2973,2.3667,22396500.0 +571,2012-12-12,2.3427,2.3953,2.33,2.35,29326500.0 +572,2012-12-13,2.3487,2.3553,2.1833,2.25,31737000.0 +573,2012-12-14,2.252,2.2933,2.2393,2.2553,14131500.0 +574,2012-12-17,2.2667,2.3,2.25,2.2933,12079500.0 +575,2012-12-18,2.294,2.338,2.284,2.306,23095500.0 +576,2012-12-19,2.3267,2.3507,2.3013,2.3073,18744000.0 +577,2012-12-20,2.32,2.3207,2.27,2.2953,13641000.0 +578,2012-12-21,2.3,2.3,2.2387,2.2667,21853500.0 +579,2012-12-24,2.2,2.29,2.2,2.2853,5562000.0 +580,2012-12-26,2.264,2.3,2.2333,2.2333,8796000.0 +581,2012-12-27,2.234,2.2607,2.2,2.246,8053500.0 +582,2012-12-28,2.2413,2.2433,2.2,2.2,6033000.0 +583,2012-12-31,2.2027,2.2647,2.2,2.2567,8590500.0 +584,2013-01-02,2.3253,2.3633,2.3067,2.3567,16518000.0 +585,2013-01-03,2.3453,2.3633,2.3127,2.3127,10825500.0 +586,2013-03-14,2.5673,2.6,2.4027,2.4327,29146500.0 +587,2013-03-15,2.4333,2.4433,2.3473,2.3607,42304500.0 +588,2013-03-18,2.36,2.404,2.322,2.3467,17931000.0 +589,2013-03-19,2.366,2.3993,2.3293,2.3313,15828000.0 +590,2013-03-20,2.3507,2.4167,2.344,2.4147,16198500.0 +591,2013-03-21,2.4047,2.4707,2.3827,2.4007,15042000.0 +592,2013-03-22,2.4133,2.4533,2.4013,2.4413,6421500.0 +593,2013-03-25,2.4467,2.568,2.4467,2.5313,34368000.0 +594,2013-03-26,2.5067,2.548,2.5067,2.524,22050000.0 +595,2013-03-27,2.5133,2.5587,2.4873,2.5467,18799500.0 +596,2013-03-28,2.534,2.5707,2.5167,2.526,11656500.0 +597,2013-04-01,2.6067,3.112,2.6067,2.9667,201547500.0 +598,2013-04-02,2.94,3.046,2.846,2.8733,94021500.0 +599,2013-04-03,2.88,2.9467,2.6807,2.7253,82765500.0 +600,2013-04-04,2.7633,2.8167,2.7207,2.8,32724000.0 +601,2013-04-05,2.8,2.816,2.7,2.758,20602500.0 +602,2013-04-08,2.77,2.8367,2.7673,2.7887,23578500.0 +603,2013-04-09,2.7927,2.7927,2.6887,2.6933,22929000.0 +604,2013-04-10,2.714,2.8007,2.7013,2.7907,29934000.0 +605,2013-04-11,2.8093,2.97,2.7833,2.8667,50419500.0 +606,2013-04-12,2.906,3.0093,2.8673,2.9167,43282500.0 +607,2013-04-15,2.8673,2.9213,2.834,2.92,23191500.0 +608,2013-04-16,2.942,3.076,2.9273,3.032,41016000.0 +609,2013-04-17,3.0267,3.0633,2.9693,3.03,29680500.0 +610,2013-04-18,3.0653,3.1733,3.026,3.1627,45765000.0 +611,2013-04-19,3.1627,3.3253,3.138,3.1633,43929000.0 +612,2013-04-22,3.2133,3.3467,3.1667,3.346,56449500.0 +613,2013-04-23,3.346,3.528,3.346,3.3967,53149500.0 +614,2013-04-24,3.446,3.446,3.2653,3.38,36709500.0 +615,2013-04-25,3.4,3.4933,3.3653,3.48,40113000.0 +616,2013-04-26,3.5,3.5827,3.3747,3.3873,52822500.0 +617,2013-04-29,3.4,3.6667,3.3933,3.6653,52944000.0 +618,2013-04-30,3.6667,3.8787,3.5767,3.634,79696500.0 +619,2013-05-01,3.6447,3.7327,3.5333,3.596,37645500.0 +620,2013-05-02,3.5933,3.6847,3.5333,3.64,44152500.0 +621,2013-05-03,3.6833,3.7647,3.6233,3.6387,49215000.0 +622,2013-05-06,3.6727,4.0273,3.6727,4.0127,63787500.0 +623,2013-05-07,4.0,4.1893,3.6747,3.7707,145771500.0 +624,2013-05-08,3.7067,4.866,3.7,4.6,97968000.0 +625,2013-05-09,4.54,5.0513,4.246,4.59,416440500.0 +626,2013-05-10,4.6267,5.4,4.5447,5.1267,362424000.0 +627,2013-05-13,5.104,6.0133,5.0333,6.0007,324441000.0 +628,2013-05-14,6.0773,6.4747,5.41,5.4667,540166500.0 +629,2013-05-15,5.4673,6.2253,5.154,6.1333,245694000.0 +630,2013-05-16,6.1367,6.4267,5.9107,6.14,314040000.0 +631,2013-05-17,6.2493,6.3333,5.8333,6.0833,275742000.0 +632,2013-05-20,6.0933,6.1967,5.9087,5.9533,116409000.0 +633,2013-05-21,5.954,6.0533,5.6853,5.838,129556500.0 +634,2013-05-22,5.814,6.064,5.7,5.8187,124705500.0 +635,2013-05-23,5.7673,6.212,5.5367,6.2,173866500.0 +636,2013-05-24,6.16,6.53,6.1333,6.4967,234340500.0 +637,2013-05-28,6.53,7.4687,6.53,7.4533,286362000.0 +638,2013-05-29,7.4667,7.7,6.6,6.9133,365599500.0 +639,2013-05-30,7.0667,7.3027,6.7467,7.0,232486500.0 +640,2013-05-31,6.934,7.096,6.4893,6.4893,216676500.0 +641,2013-06-03,6.4533,6.7193,5.8833,6.16,279295500.0 +642,2013-06-04,6.1727,6.428,6.1427,6.3227,128937000.0 +643,2013-06-05,6.2667,6.5313,5.9407,6.3633,178788000.0 +644,2013-06-06,6.2867,6.618,6.2867,6.446,139008000.0 +645,2013-06-07,6.4767,6.86,6.4227,6.8,154503000.0 +646,2013-06-10,6.7227,6.8347,6.476,6.6,134262000.0 +647,2013-06-11,6.5713,6.5787,6.27,6.2893,107361000.0 +648,2013-06-12,6.298,6.6987,6.298,6.522,133843500.0 +649,2013-06-13,6.4073,6.6333,6.3413,6.5733,87330000.0 +650,2013-06-14,6.6193,6.8347,6.54,6.69,95694000.0 +651,2013-06-17,6.8467,6.9833,6.7467,6.794,103032000.0 +652,2013-06-18,6.8273,6.932,6.6133,6.9073,129123000.0 +653,2013-06-19,6.8547,7.1113,6.6527,6.934,125938500.0 +654,2013-06-20,6.9667,7.142,6.63,6.7333,148359000.0 +655,2013-06-21,6.8667,6.9293,6.5,6.58,171208500.0 +656,2013-06-24,6.5533,6.858,6.3533,6.8033,104620500.0 +657,2013-06-25,6.784,6.9467,6.7033,6.7967,85672500.0 +658,2013-06-26,6.8567,7.0993,6.844,7.0667,95920500.0 +659,2013-06-27,7.08,7.35,7.0587,7.2833,127455000.0 +660,2013-06-28,7.3333,7.372,7.114,7.1707,84156000.0 +661,2013-07-01,7.1973,7.8667,7.1973,7.85,159403500.0 +662,2013-07-02,7.9,8.126,7.7,7.8667,177274500.0 +663,2013-07-03,7.834,7.95,7.618,7.6733,70027500.0 +664,2013-07-05,7.8,8.03,7.6913,8.03,99724500.0 +665,2013-07-08,7.9847,8.1827,7.9213,8.13,113974500.0 +666,2013-07-09,8.1587,8.432,8.1273,8.2453,121951500.0 +667,2013-07-10,8.22,8.3033,8.0527,8.2733,81409500.0 +668,2013-07-11,8.3333,8.406,8.1567,8.3787,107755500.0 +669,2013-07-12,8.3127,8.6653,8.3007,8.6547,166258500.0 +670,2013-07-15,8.6667,8.92,8.4547,8.5153,144150000.0 +671,2013-07-16,8.5153,8.5833,7.096,7.1133,469743000.0 +672,2013-07-17,7.1833,8.1493,6.9667,8.1,379722000.0 +673,2013-07-18,8.114,8.22,7.7453,7.8707,166929000.0 +674,2013-07-19,8.0,8.0367,7.7673,7.9813,85578000.0 +675,2013-07-22,8.0453,8.4453,7.986,8.14,143059500.0 +676,2013-07-23,8.2133,8.3707,8.1213,8.1867,111156000.0 +677,2013-07-24,8.2667,8.316,7.9707,8.126,99454500.0 +678,2013-07-25,8.1,8.3167,8.0127,8.2847,76276500.0 +679,2013-07-26,8.424,8.8633,8.3,8.6273,139750500.0 +680,2013-07-29,8.7013,9.0247,8.5273,8.9773,141123000.0 +681,2013-07-30,9.0133,9.166,8.5453,8.8,190620000.0 +682,2013-07-31,8.8593,8.998,8.7633,8.9793,92283000.0 +683,2013-08-01,9.0,9.1087,8.842,9.0673,77371500.0 +684,2013-08-02,9.1,9.26,8.9073,9.2467,90321000.0 +685,2013-08-05,9.2587,9.666,9.1533,9.6467,148099500.0 +686,2013-08-06,9.71,9.78,9.4067,9.4833,133714500.0 +687,2013-08-07,9.5167,10.3667,8.824,10.2133,264238500.0 +688,2013-08-08,10.2953,10.592,9.9467,10.2167,387346500.0 +689,2013-08-09,10.26,10.3967,10.0833,10.2,129208500.0 +690,2013-08-12,10.21,10.21,9.47,9.8633,215790000.0 +691,2013-08-13,9.916,10.0,9.614,9.62,124554000.0 +692,2013-08-14,9.65,9.6953,9.2033,9.2347,166930500.0 +693,2013-08-15,9.3333,9.5733,9.0,9.3533,147001500.0 +694,2013-08-16,9.3333,9.594,9.3067,9.462,101158500.0 +695,2013-08-19,9.4667,9.8253,9.4667,9.7133,116574000.0 +696,2013-08-20,9.7667,10.01,9.7667,9.9873,90135000.0 +697,2013-08-21,9.998,10.0727,9.75,9.7867,89446500.0 +698,2013-08-22,9.8267,10.4987,9.8267,10.496,151780500.0 +699,2013-08-23,10.4947,10.82,10.3333,10.7833,187560000.0 +700,2013-08-26,10.7867,11.5333,10.6833,11.0707,350391000.0 +701,2013-08-27,11.0967,11.2533,10.712,11.1873,248074500.0 +702,2013-08-28,11.1867,11.4333,10.8833,11.0173,209382000.0 +703,2013-08-29,11.1573,11.1867,10.834,11.0333,134815500.0 +704,2013-08-30,11.1167,11.2967,10.9307,11.2893,161145000.0 +705,2013-09-03,11.3333,11.6587,11.0933,11.272,174235500.0 +706,2013-09-04,11.3333,11.4413,11.0373,11.3987,164263500.0 +707,2013-09-05,11.458,11.4993,11.2167,11.3333,95404500.0 +708,2013-09-06,11.3267,11.3333,11.01,11.0933,122739000.0 +709,2013-09-09,11.1333,11.1333,10.5673,10.6113,207159000.0 +710,2013-09-10,10.6487,11.1667,10.632,11.1053,128748000.0 +711,2013-09-11,11.1367,11.2073,10.8087,10.9247,83227500.0 +712,2013-09-12,10.934,11.1173,10.5273,10.8267,90027000.0 +713,2013-09-13,10.9267,11.0913,10.8107,11.0393,75963000.0 +714,2013-09-16,11.2,11.39,11.036,11.06,109735500.0 +715,2013-09-17,11.066,11.228,10.8907,11.0933,78295500.0 +716,2013-09-18,11.094,11.3233,10.9467,11.3,78660000.0 +717,2013-09-19,11.31,12.0313,11.1,11.8793,224395500.0 +718,2013-09-20,11.8333,12.3887,11.7947,12.2593,194923500.0 +719,2013-09-23,12.33,12.3653,11.8073,12.0073,119229000.0 +720,2013-09-24,12.074,12.3307,11.8433,12.144,90906000.0 +721,2013-09-25,12.1067,12.42,12.02,12.3727,117744000.0 +722,2013-09-26,12.4087,12.6453,12.3333,12.5647,95916000.0 +723,2013-09-27,12.5867,12.7533,12.4287,12.7467,84856500.0 +724,2013-09-30,12.6933,12.9667,12.5207,12.87,129867000.0 +725,2013-10-01,12.9067,12.9933,12.558,12.8713,112054500.0 +726,2013-10-02,12.8167,12.8733,11.6933,11.9033,298063500.0 +727,2013-10-03,11.7913,11.9793,11.2,11.5193,342652500.0 +728,2013-10-04,11.5333,12.2333,11.51,12.2307,209007000.0 +729,2013-10-07,12.3107,12.4487,12.0173,12.1927,166999500.0 +730,2013-10-08,12.2667,12.3953,11.5333,11.6833,198939000.0 +731,2013-10-09,11.7,11.8,10.7667,11.2533,220770000.0 +732,2013-10-10,11.2533,11.7167,11.22,11.5327,129027000.0 +733,2013-10-11,11.578,11.9993,11.4,11.98,119569500.0 +734,2013-10-14,11.8033,12.1667,11.61,12.022,112860000.0 +735,2013-10-15,12.022,12.586,12.022,12.3133,159427500.0 +736,2013-10-16,12.3333,12.4867,12.1393,12.2133,119692500.0 +737,2013-10-17,12.2667,12.3333,12.066,12.24,97383000.0 +738,2013-10-18,12.2873,12.3973,12.0733,12.1627,85054500.0 +739,2013-10-21,12.2933,12.3127,11.4,11.5593,165351000.0 +740,2013-10-22,11.6,11.852,11.074,11.396,166023000.0 +741,2013-10-23,11.38,11.454,10.6767,10.8887,190072500.0 +742,2013-10-24,10.92,11.8307,10.8553,11.8167,158160000.0 +743,2013-10-25,11.5407,11.814,11.12,11.2833,110428500.0 +744,2013-10-28,11.3107,11.4967,10.8073,10.84,112183500.0 +745,2013-10-29,10.84,11.06,10.2,10.934,205161000.0 +746,2013-10-30,11.0467,11.1787,10.5333,10.5333,121746000.0 +747,2013-10-31,10.52,10.8293,10.22,10.71,131301000.0 +748,2013-11-01,10.75,11.06,10.6627,10.8667,104220000.0 +749,2013-11-04,10.8667,11.7987,10.8667,11.7533,188814000.0 +750,2013-11-05,11.68,12.1313,10.2667,10.3333,319066500.0 +751,2013-11-06,10.44,10.7153,9.7573,10.0,442978500.0 +752,2013-11-07,9.8667,10.1333,9.1747,9.2007,319876500.0 +753,2013-11-08,9.1667,9.3833,8.8213,9.2553,316498500.0 +754,2013-11-11,9.1,9.6947,9.1,9.66,202396500.0 +755,2013-11-12,9.7667,9.8,9.0787,9.3933,213652500.0 +756,2013-11-13,9.39,9.4913,9.0893,9.2707,175584000.0 +757,2013-11-14,9.3333,9.3847,8.9407,9.1573,175161000.0 +758,2013-11-15,9.2,9.2627,8.9567,9.0013,143160000.0 +759,2013-11-18,9.0327,9.1,7.974,7.9893,333507000.0 +760,2013-11-19,8.0293,8.6,7.7033,8.52,282606000.0 +761,2013-11-20,8.5,8.5067,7.9373,8.0567,199353000.0 +762,2013-11-21,8.0727,8.3253,8.0067,8.11,172042500.0 +763,2013-11-22,8.1533,8.1833,7.862,8.1,162112500.0 +764,2013-11-25,8.0893,8.3893,8.02,8.046,150082500.0 +765,2013-11-26,8.098,8.1813,7.74,8.066,201268500.0 +766,2013-11-27,8.1313,8.5327,7.968,8.5253,178762500.0 +767,2013-11-29,8.6207,8.706,8.4333,8.4413,142236000.0 +768,2013-12-02,8.48,8.57,8.258,8.43,110358000.0 +769,2013-12-03,8.4447,9.6627,8.2867,9.62,374767500.0 +770,2013-12-04,9.7673,9.7993,9.142,9.2567,191470500.0 +771,2013-12-05,9.3773,9.5567,9.3,9.334,134154000.0 +772,2013-12-06,9.412,9.5293,9.0867,9.1387,115554000.0 +773,2013-12-09,9.2067,9.4947,8.9473,9.45,150270000.0 +774,2013-12-10,9.3993,9.7247,9.2413,9.4973,172441500.0 +775,2013-12-11,9.4807,9.5767,9.298,9.32,111934500.0 +776,2013-12-12,9.37,9.8827,9.2353,9.8133,173362500.0 +777,2013-12-13,9.8553,10.12,9.8,9.816,174357000.0 +778,2013-12-16,9.8433,10.03,9.74,9.8227,109501500.0 +779,2013-12-17,9.822,10.3087,9.7533,10.18,174391500.0 +780,2013-12-18,10.18,10.3267,9.73,9.8633,182674500.0 +781,2013-12-19,9.8667,9.9993,9.2733,9.3733,202656000.0 +782,2013-12-20,9.4007,9.624,9.3767,9.516,123055500.0 +783,2013-12-23,9.6327,9.7493,9.5067,9.6433,88005000.0 +784,2013-12-24,9.7567,10.3327,9.686,10.068,159850500.0 +785,2013-12-26,10.21,10.5333,10.1767,10.4067,118942500.0 +786,2013-12-27,10.368,10.4527,10.0333,10.0333,93999000.0 +787,2013-12-30,10.0747,10.3207,10.0333,10.1533,74286000.0 +788,2013-12-31,10.1993,10.2627,9.9107,10.0327,72408000.0 +789,2014-01-02,10.04,10.1653,9.77,10.0093,102918000.0 +790,2014-01-03,10.0067,10.1467,9.9067,9.932,78061500.0 +791,2014-01-06,10.0,10.032,9.682,9.776,89131500.0 +792,2014-01-07,9.8,10.0267,9.6833,9.9207,83844000.0 +793,2014-01-08,9.9573,10.2467,9.8673,10.1,101304000.0 +794,2014-01-09,10.0933,10.2287,9.79,9.8567,88711500.0 +795,2014-01-10,9.874,9.9667,9.4833,9.73,126364500.0 +796,2014-01-13,9.76,9.8,9.188,9.3167,84717000.0 +797,2014-01-14,9.2933,11.172,9.1113,11.0167,379350000.0 +798,2014-01-15,10.98,11.4907,10.8067,10.942,274327500.0 +799,2014-01-16,11.026,11.5133,10.7773,11.452,160425000.0 +800,2014-01-17,11.4147,11.5467,11.1967,11.36,124987500.0 +801,2014-01-21,11.3333,11.8193,11.3,11.7867,130549500.0 +802,2014-01-22,11.9833,12.0213,11.6507,11.904,90628500.0 +803,2014-01-23,11.8133,12.1587,11.5613,12.0,104628000.0 +804,2014-01-24,11.862,12.0333,11.554,11.5667,101746500.0 +805,2014-01-27,11.7,11.8613,10.9807,11.1867,115896000.0 +806,2014-01-28,11.308,11.9593,11.2927,11.9593,80989500.0 +807,2014-01-29,11.9287,11.9393,11.542,11.7867,77025000.0 +808,2014-01-30,11.6833,12.3187,11.6833,12.2333,107673000.0 +809,2014-01-31,12.3333,12.4,11.9007,12.0773,84319500.0 +810,2014-02-03,11.6667,12.3253,11.6667,11.8187,89644500.0 +811,2014-02-04,11.8,12.1067,11.7467,11.922,62623500.0 +812,2014-02-05,11.87,12.0393,11.2907,11.6533,93388500.0 +813,2014-02-06,11.668,12.0073,11.628,11.8953,73384500.0 +814,2014-02-07,12.032,12.488,11.9,12.4733,117148500.0 +815,2014-02-10,12.5627,13.2867,12.42,13.1027,164770500.0 +816,2014-02-11,13.2,13.48,12.8467,12.9733,140068500.0 +817,2014-02-12,13.1067,13.218,12.9547,13.0007,66439500.0 +818,2014-02-13,12.9333,13.5147,12.684,13.1313,105280500.0 +819,2014-02-14,13.2073,13.4587,13.1273,13.1933,80040000.0 +820,2014-02-18,13.1333,13.8833,13.1333,13.5567,117477000.0 +821,2014-02-19,13.6893,15.0,12.8867,14.5393,202486500.0 +822,2014-02-20,14.446,14.5667,13.7513,13.968,231760500.0 +823,2014-02-21,14.0327,14.2653,13.946,13.9947,102037500.0 +824,2014-02-24,13.98,14.5573,13.876,14.4867,108903000.0 +825,2014-02-25,14.6533,17.28,14.6533,16.8467,420369000.0 +826,2014-02-26,16.9333,17.6667,16.3693,17.44,312486000.0 +827,2014-02-27,17.5333,17.83,16.5553,16.804,223077000.0 +828,2014-02-28,16.9333,16.94,16.17,16.2567,180037500.0 +829,2014-03-03,15.4667,16.7767,15.4667,16.6667,165219000.0 +830,2014-03-04,16.91,17.386,16.8553,16.964,108879000.0 +831,2014-03-05,17.2,17.2653,16.7867,16.82,72594000.0 +832,2014-03-06,16.9333,17.1667,16.63,16.86,94290000.0 +833,2014-03-07,16.8667,16.99,16.294,16.3767,95437500.0 +834,2014-03-10,16.27,16.4387,15.7373,15.8193,97983000.0 +835,2014-03-11,15.8333,16.3067,15.4953,15.5033,109213500.0 +836,2014-03-12,15.4733,16.2993,15.2647,16.1927,123525000.0 +837,2014-03-13,16.248,16.33,15.6,15.7667,79090500.0 +838,2014-03-14,15.6467,15.8527,15.2213,15.3333,103077000.0 +839,2014-03-17,15.51,15.862,15.3667,15.7067,76896000.0 +840,2014-03-18,15.7047,16.1,15.6,16.0467,78610500.0 +841,2014-03-19,16.1613,16.2133,15.5673,15.72,62955000.0 +842,2014-03-20,15.7333,15.95,15.5573,15.6133,47638500.0 +843,2014-03-21,15.7333,15.76,15.1667,15.18,104617500.0 +844,2014-03-24,15.3867,15.4173,14.018,14.7233,142279500.0 +845,2014-03-25,14.746,15.1367,14.5267,14.7193,99859500.0 +846,2014-03-26,14.8113,14.9333,14.09,14.1793,87933000.0 +847,2014-03-27,14.1347,14.252,13.5333,13.7153,120972000.0 +848,2014-03-28,13.7367,14.448,13.734,14.294,125509500.0 +849,2014-03-31,14.3267,14.4513,13.7593,13.8533,106504500.0 +850,2014-04-01,13.88,14.544,13.8667,14.528,93630000.0 +851,2014-04-02,14.5847,15.4787,14.5367,15.4727,138853500.0 +852,2014-04-03,15.5253,15.7153,14.8,15.0153,140214000.0 +853,2014-04-04,15.14,15.218,14.0493,14.0867,146892000.0 +854,2014-04-07,13.954,14.4133,13.5673,13.8593,126373500.0 +855,2014-04-08,13.9667,14.4327,13.708,14.3327,87385500.0 +856,2014-04-09,14.4667,14.5633,14.0593,14.5033,65019000.0 +857,2014-04-10,14.4747,14.5333,13.5067,13.546,89880000.0 +858,2014-04-11,13.546,13.8,13.24,13.6067,115252500.0 +859,2014-04-14,13.56,13.9667,12.9607,13.2233,96993000.0 +860,2014-04-15,13.2067,13.4,12.288,13.0127,174859500.0 +861,2014-04-16,13.182,13.3327,12.7213,13.1333,87391500.0 +862,2014-04-17,13.1667,13.486,12.9387,13.2,75393000.0 +863,2014-04-21,13.234,13.7467,12.9333,13.6933,67105500.0 +864,2014-04-22,13.7687,14.622,13.6067,14.5073,123586500.0 +865,2014-04-23,14.6,14.6653,13.8,14.04,91764000.0 +866,2014-04-24,14.0333,14.1867,13.5467,13.8333,67018500.0 +867,2014-04-25,13.8507,13.8867,13.1767,13.3027,88900500.0 +868,2014-04-28,13.2667,13.586,12.7,13.28,90400500.0 +869,2014-04-29,13.3387,13.81,13.0353,13.7,74610000.0 +870,2014-04-30,13.666,13.924,13.4187,13.9067,55795500.0 +871,2014-05-01,13.878,14.268,13.7127,13.8167,68469000.0 +872,2014-05-02,13.9727,14.1033,13.768,14.0867,51756000.0 +873,2014-05-05,14.1327,14.5127,13.8673,14.4467,62872500.0 +874,2014-05-06,14.5333,14.5773,13.7867,13.8173,71347500.0 +875,2014-05-07,13.8867,14.05,12.254,12.406,127287000.0 +876,2014-05-08,12.53,12.96,11.8147,11.8427,257352000.0 +877,2014-05-09,11.95,12.2267,11.8147,12.1333,109512000.0 +878,2014-05-12,12.1333,12.4793,11.992,12.332,91471500.0 +879,2014-05-13,12.3873,12.756,12.16,12.6793,91531500.0 +880,2014-05-14,12.7007,12.8987,12.4733,12.73,70441500.0 +881,2014-05-15,12.6207,12.844,12.3533,12.5787,79266000.0 +882,2014-05-16,12.5333,12.8027,12.474,12.77,57685500.0 +883,2014-05-19,12.7707,13.1333,12.6667,13.1333,59709000.0 +884,2014-05-20,13.08,13.2887,12.8713,12.9793,72919500.0 +885,2014-05-21,13.0,13.3333,12.986,13.326,67347000.0 +886,2014-05-22,13.348,13.792,13.3033,13.6507,77029500.0 +887,2014-05-23,13.6867,13.8507,13.5,13.826,49992000.0 +888,2014-05-27,13.9333,14.258,13.8,14.078,68053500.0 +889,2014-05-28,14.0387,14.1847,13.684,14.0,68530500.0 +890,2014-05-29,14.0133,14.166,13.848,14.0,46740000.0 +891,2014-05-30,14.0213,14.32,13.7833,13.8227,72352500.0 +892,2014-06-02,13.8213,13.9567,13.4447,13.5667,59125500.0 +893,2014-06-03,13.59,13.8667,13.506,13.64,50698500.0 +894,2014-06-04,13.6473,13.7507,13.36,13.5433,44190000.0 +895,2014-06-05,13.5827,13.9467,13.5507,13.8,50929500.0 +896,2014-06-06,13.9267,14.054,13.812,13.858,39301500.0 +897,2014-06-09,13.8993,13.9993,13.5867,13.602,34545000.0 +898,2014-06-10,13.5853,13.798,13.4367,13.484,43896000.0 +899,2014-06-11,13.44,13.6667,13.2833,13.6333,52020000.0 +900,2014-06-12,13.6493,13.992,13.514,13.5627,78660000.0 +901,2014-06-13,13.596,13.816,13.4387,13.7227,91671000.0 +902,2014-06-16,13.8,15.0327,13.694,15.0,171028500.0 +903,2014-06-17,14.9767,15.7027,14.8567,15.3667,169213500.0 +904,2014-06-18,15.3713,15.4993,15.0747,15.12,89343000.0 +905,2014-06-19,15.1547,15.6873,15.0667,15.0687,114487500.0 +906,2014-06-20,15.202,15.4193,15.08,15.2667,63924000.0 +907,2014-06-23,15.264,15.9327,15.2147,15.846,100888500.0 +908,2014-06-24,15.82,16.1253,15.442,15.5133,104314500.0 +909,2014-06-25,15.472,15.8367,15.3493,15.7833,74611500.0 +910,2014-06-26,15.7853,16.0267,15.614,15.6733,65886000.0 +911,2014-06-27,15.6667,16.0,15.5667,15.9573,75367500.0 +912,2014-06-30,15.868,16.2993,15.868,16.0233,61995000.0 +913,2014-07-01,16.066,16.2293,15.9133,15.9633,53196000.0 +914,2014-07-02,15.9667,16.1553,15.138,15.32,102298500.0 +915,2014-07-03,15.3333,15.5933,14.9333,15.2327,66034500.0 +916,2014-07-07,15.2113,15.3333,14.6933,14.7833,74419500.0 +917,2014-07-08,14.8667,14.8667,14.2847,14.598,101098500.0 +918,2014-07-09,14.6107,14.948,14.5993,14.8667,50980500.0 +919,2014-07-10,14.8347,14.8667,14.4027,14.62,63258000.0 +920,2014-07-11,14.6587,14.7927,14.4667,14.502,41347500.0 +921,2014-07-14,14.6827,15.2527,14.3633,15.1333,92257500.0 +922,2014-07-15,15.1707,15.2,14.54,14.62,71305500.0 +923,2014-07-16,14.6533,14.9867,14.4273,14.4387,51513000.0 +924,2014-07-17,14.4467,14.7033,14.2333,14.3247,57648000.0 +925,2014-07-18,14.35,14.7473,14.3333,14.68,53826000.0 +926,2014-07-21,14.6813,14.8807,14.448,14.6993,49165500.0 +927,2014-07-22,14.836,14.8867,14.6073,14.6407,35058000.0 +928,2014-07-23,14.628,14.9833,14.628,14.906,39615000.0 +929,2014-07-24,14.9053,15.0067,14.72,14.8347,39552000.0 +930,2014-07-25,14.824,15.1313,14.77,14.914,39411000.0 +931,2014-07-28,14.894,15.4667,14.76,14.9767,84943500.0 +932,2014-07-29,15.024,15.22,14.944,15.0533,41269500.0 +933,2014-07-30,15.0333,15.3067,14.6833,15.2867,60807000.0 +934,2014-07-31,15.3573,15.4713,13.9147,14.8727,96696000.0 +935,2014-08-01,14.8333,15.8333,14.388,15.54,153400500.0 +936,2014-08-04,15.6653,16.0333,15.4667,15.8867,75952500.0 +937,2014-08-05,15.9087,16.1993,15.7127,15.9287,67884000.0 +938,2014-08-06,15.9467,16.7613,15.8167,16.536,118677000.0 +939,2014-08-07,16.5667,17.1127,16.5067,16.8033,95010000.0 +940,2014-08-08,16.752,16.826,16.4333,16.5473,64384500.0 +941,2014-08-11,16.8327,17.5827,16.5333,17.2627,101056500.0 +942,2014-08-12,17.3587,17.3813,16.972,17.3333,74634000.0 +943,2014-08-13,17.39,17.7093,17.3073,17.532,88335000.0 +944,2014-08-14,17.5867,17.5927,17.236,17.41,51877500.0 +945,2014-08-15,17.4953,17.5193,17.2333,17.4667,47685000.0 +946,2014-08-18,17.5333,17.8173,17.2833,17.2833,71943000.0 +947,2014-08-19,17.3313,17.4,16.7747,17.0787,66840000.0 +948,2014-08-20,17.0153,17.2493,16.8667,17.0167,38166000.0 +949,2014-08-21,17.0667,17.2533,16.884,16.96,37018500.0 +950,2014-08-22,16.9267,17.1413,16.8407,17.116,35620500.0 +951,2014-08-25,17.2,17.5787,17.1333,17.51,55287000.0 +952,2014-08-26,17.5333,17.706,17.44,17.468,47110500.0 +953,2014-08-27,17.5,17.616,17.3527,17.55,38287500.0 +954,2014-08-28,17.4273,17.632,17.41,17.606,36576000.0 +955,2014-08-29,17.666,18.1333,17.666,17.9833,82822500.0 +956,2014-09-02,18.0067,18.9927,18.0067,18.9733,122932500.0 +957,2014-09-03,18.9967,19.2513,18.6733,18.7067,83658000.0 +958,2014-09-04,18.8133,19.428,18.62,19.1133,104331000.0 +959,2014-09-05,19.198,19.2607,18.1673,18.442,136144500.0 +960,2014-09-08,18.5433,18.992,18.4927,18.8,69922500.0 +961,2014-09-09,18.8313,19.0327,18.4667,18.5933,57493500.0 +962,2014-09-10,18.6,18.7647,18.244,18.7533,46741500.0 +963,2014-09-11,18.8,18.986,18.5753,18.6767,48127500.0 +964,2014-09-12,18.7193,18.826,18.4667,18.59,41457000.0 +965,2014-09-15,18.5413,18.5413,16.6087,17.0,209746500.0 +966,2014-09-16,17.1153,17.4973,16.828,17.38,106606500.0 +967,2014-09-17,17.4967,17.6467,17.3,17.434,65944500.0 +968,2014-09-18,17.5413,17.7067,17.4253,17.55,47353500.0 +969,2014-09-19,17.6,17.6333,17.0087,17.2307,87552000.0 +970,2014-09-22,17.2187,17.3133,16.314,16.5333,104559000.0 +971,2014-09-23,16.4327,16.92,16.2333,16.66,73747500.0 +972,2014-09-24,16.63,16.856,16.4693,16.7967,48142500.0 +973,2014-09-25,16.918,16.9973,16.4067,16.48,61905000.0 +974,2014-09-26,16.4707,16.6487,16.4047,16.4367,49257000.0 +975,2014-09-29,16.3587,16.576,16.0467,16.3133,61668000.0 +976,2014-09-30,16.3673,16.51,16.008,16.1933,54453000.0 +977,2014-10-01,16.1667,16.2333,15.71,16.0573,75615000.0 +978,2014-10-02,16.0973,16.9867,16.0413,16.724,118692000.0 +979,2014-10-03,16.8667,17.1,16.7353,17.0667,70530000.0 +980,2014-10-06,17.0767,17.4993,17.014,17.35,102403500.0 +981,2014-10-07,17.3547,17.4307,17.0487,17.3267,59218500.0 +982,2014-10-08,17.3267,17.5253,16.8427,17.352,63711000.0 +983,2014-10-09,17.466,17.7027,16.96,17.2373,94407000.0 +984,2014-10-10,16.7993,16.8667,15.68,15.8133,167515500.0 +985,2014-10-13,15.8067,16.0193,14.6667,14.87,145405500.0 +986,2014-10-14,15.0,15.498,14.8667,15.2493,89052000.0 +987,2014-10-15,15.2013,15.3993,14.488,14.8993,116542500.0 +988,2014-10-16,14.8667,15.328,14.5,15.1053,66036000.0 +989,2014-10-17,15.286,15.6513,15.09,15.1633,146335500.0 +990,2014-10-20,15.2693,15.4933,14.8747,15.388,43081500.0 +991,2014-10-21,15.4667,15.7167,15.226,15.6333,49818000.0 +992,2014-10-22,15.6107,15.826,15.3707,15.4567,50922000.0 +993,2014-10-23,15.554,15.752,15.4067,15.69,44418000.0 +994,2014-10-24,15.6573,15.8533,15.4133,15.7067,44964000.0 +995,2014-10-27,15.7107,15.7333,14.6873,14.792,122512500.0 +996,2014-10-28,14.9333,16.3067,14.9333,16.0307,136755000.0 +997,2014-10-29,16.1653,16.2667,15.7093,15.8607,64392000.0 +998,2014-10-30,15.8667,16.0333,15.6407,15.9107,41557500.0 +999,2014-10-31,16.1267,16.2333,15.9167,16.1127,95433000.0 +1000,2014-11-03,16.1533,16.504,16.088,16.152,53284500.0 +1001,2014-11-04,16.2013,16.2267,15.7687,15.9993,45828000.0 +1002,2014-11-05,16.0967,16.6267,14.4667,16.46,110295000.0 +1003,2014-11-06,16.4,16.446,15.2333,16.12,199843500.0 +1004,2014-11-07,16.332,16.332,15.8133,15.9907,66370500.0 +1005,2014-11-10,16.036,16.192,15.7867,16.152,60531000.0 +1006,2014-11-11,16.1347,16.788,16.0973,16.74,104346000.0 +1007,2014-11-12,16.7467,16.8227,16.372,16.6593,74176500.0 +1008,2014-11-13,16.6767,17.05,16.6067,16.8,83121000.0 +1009,2014-11-14,16.7813,17.2567,16.4467,17.2233,80746500.0 +1010,2014-11-17,17.1833,17.2667,16.8013,16.93,106527000.0 +1011,2014-11-18,16.9573,17.3327,16.8667,17.1733,59107500.0 +1012,2014-11-19,17.1833,17.1973,16.3733,16.5687,102915000.0 +1013,2014-11-20,16.4367,16.7287,16.4,16.6327,46186500.0 +1014,2014-11-21,16.656,16.8667,16.12,16.1513,98868000.0 +1015,2014-11-24,16.3153,16.5567,16.0427,16.4253,62733000.0 +1016,2014-11-25,16.5053,16.648,16.4,16.566,41280000.0 +1017,2014-11-26,16.582,16.6,16.44,16.592,25401000.0 +1018,2014-11-28,16.486,16.6433,16.168,16.2733,26473500.0 +1019,2014-12-01,16.162,16.3647,15.2673,15.4993,111850500.0 +1020,2014-12-02,15.5733,15.8127,15.2,15.4653,77887500.0 +1021,2014-12-03,15.4933,15.512,15.0333,15.3327,68868000.0 +1022,2014-12-04,15.3327,15.5033,15.154,15.1913,50370000.0 +1023,2014-12-05,15.234,15.3653,14.7893,14.9667,79653000.0 +1024,2014-12-08,14.9193,14.9907,14.1333,14.3193,121050000.0 +1025,2014-12-09,14.1333,14.5153,13.618,14.4167,124179000.0 +1026,2014-12-10,14.4833,14.5233,13.8467,13.9407,96352500.0 +1027,2014-12-11,13.9833,14.362,13.8193,13.8667,86691000.0 +1028,2014-12-12,13.8387,14.112,13.602,13.86,93274500.0 +1029,2014-12-15,14.05,14.05,13.5113,13.5667,67555500.0 +1030,2014-12-16,13.6,13.6,13.0247,13.1667,109290000.0 +1031,2014-12-17,13.1873,13.7793,12.8333,13.77,95917500.0 +1032,2014-12-18,13.9627,14.5913,13.9627,14.5507,95482500.0 +1033,2014-12-19,14.7273,14.8113,14.3,14.6127,91818000.0 +1034,2014-12-22,14.6667,14.9373,14.5507,14.8367,63783000.0 +1035,2014-12-23,14.8653,14.9667,14.6347,14.7,58047000.0 +1036,2014-12-24,14.7313,14.8333,14.6167,14.8307,17316000.0 +1037,2014-12-26,14.8267,15.2333,14.7647,15.1893,43195500.0 +1038,2014-12-29,15.1433,15.194,14.9347,15.046,35398500.0 +1039,2014-12-30,14.9247,15.0667,14.76,14.838,38286000.0 +1040,2014-12-31,14.838,15.0453,14.8153,14.8267,30895500.0 +1041,2015-01-02,14.886,14.9333,14.2173,14.62,60666000.0 +1042,2015-01-05,14.57,14.57,13.8107,13.908,68766000.0 +1043,2015-01-06,13.9333,14.28,13.614,14.0933,81739500.0 +1044,2015-01-07,14.1867,14.3187,13.9853,14.0733,38506500.0 +1045,2015-01-08,14.1613,14.3213,14.0007,14.0633,43804500.0 +1046,2015-01-09,13.8607,14.0533,13.664,13.75,60375000.0 +1047,2015-01-12,13.7047,13.7047,13.2833,13.4873,77257500.0 +1048,2015-01-13,13.4267,13.8407,12.5333,12.7967,56380500.0 +1049,2015-01-14,12.8013,13.0133,12.2333,12.8533,149176500.0 +1050,2015-01-15,12.936,13.05,12.6367,12.74,68364000.0 +1051,2015-01-16,12.7047,12.966,12.3367,12.8953,46059000.0 +1052,2015-01-20,12.89,13.0193,12.4693,12.84,57217500.0 +1053,2015-01-21,12.652,13.2453,12.3333,13.104,54037500.0 +1054,2015-01-22,13.2387,13.5493,13.0133,13.5167,53611500.0 +1055,2015-01-23,13.4833,13.5667,13.222,13.4093,43978500.0 +1056,2015-01-26,13.3913,13.908,13.3667,13.782,41752500.0 +1057,2015-01-27,13.8,13.8687,13.48,13.7933,35581500.0 +1058,2015-01-28,13.8253,13.8633,13.228,13.3333,40210500.0 +1059,2015-01-29,13.2673,13.732,13.1,13.6907,42373500.0 +1060,2015-01-30,13.7333,13.8313,13.5333,13.5667,39295500.0 +1061,2015-02-02,13.574,14.13,13.5533,14.0007,54160500.0 +1062,2015-02-03,14.2,14.6913,14.0333,14.5733,62689500.0 +1063,2015-02-04,14.4907,14.7653,14.4533,14.5167,40846500.0 +1064,2015-02-05,14.5853,15.032,14.57,14.73,45030000.0 +1065,2015-02-06,14.6673,14.8933,14.4333,14.45,41568000.0 +1066,2015-02-09,14.4333,14.5533,14.1327,14.5007,45162000.0 +1067,2015-02-10,14.4747,14.7,14.268,14.32,70638000.0 +1068,2015-02-11,14.3267,14.5227,13.4,13.6333,122290500.0 +1069,2015-02-12,13.6327,13.6327,12.8747,13.5233,202587000.0 +1070,2015-02-13,13.6667,13.7327,13.394,13.5213,77947500.0 +1071,2015-02-17,13.7333,13.8087,13.4333,13.6567,48615000.0 +1072,2015-02-18,13.6627,13.7447,13.5067,13.6,66528000.0 +1073,2015-02-19,13.626,14.1627,13.5833,14.1067,65745000.0 +1074,2015-02-20,14.106,14.5067,13.98,14.4767,78301500.0 +1075,2015-02-23,14.4,14.5467,13.7553,13.7767,112644000.0 +1076,2015-02-24,13.792,13.8573,13.4467,13.5633,87600000.0 +1077,2015-02-25,13.5667,13.8093,13.5053,13.59,52257000.0 +1078,2015-02-26,13.6147,14.0727,13.4813,13.824,86088000.0 +1079,2015-02-27,13.8267,13.9033,13.52,13.5567,50161500.0 +1080,2015-03-02,13.5333,13.5733,13.0547,13.1533,101004000.0 +1081,2015-03-03,13.1867,13.35,13.0213,13.2933,57592500.0 +1082,2015-03-04,13.2447,13.5013,13.1473,13.45,57156000.0 +1083,2015-03-05,13.5353,13.746,13.3407,13.3573,65712000.0 +1084,2015-03-06,13.3347,13.4,12.81,12.978,87417000.0 +1085,2015-03-09,12.898,12.974,12.55,12.75,87274500.0 +1086,2015-03-10,12.6667,12.9,12.5067,12.688,69730500.0 +1087,2015-03-11,12.7,13.0787,12.6953,12.9007,64245000.0 +1088,2015-03-12,12.9167,12.9633,12.65,12.7573,53023500.0 +1089,2015-03-13,12.7573,12.7867,12.4733,12.58,67867500.0 +1090,2015-05-26,16.4667,16.8,16.4333,16.5,43978500.0 +1091,2015-05-27,16.5733,16.6593,16.37,16.5013,43153500.0 +1092,2015-05-28,16.4907,16.79,16.3367,16.7773,44253000.0 +1093,2015-05-29,16.7587,16.858,16.6287,16.7167,49329570.0 +1094,2015-06-01,16.7987,16.8,16.498,16.63,31530225.0 +1095,2015-06-02,16.616,16.6667,16.42,16.5467,26885745.0 +1096,2015-06-03,16.6,16.7147,16.4673,16.6033,22884615.0 +1097,2015-06-04,16.4807,16.62,16.3667,16.3667,30814980.0 +1098,2015-06-05,16.384,16.6467,16.3533,16.61,40628865.0 +1099,2015-06-08,16.6873,17.25,16.58,17.1233,65460270.0 +1100,2015-06-09,17.0333,17.1827,16.9427,16.9807,32805165.0 +1101,2015-06-10,17.0667,17.1033,16.5487,16.7133,43567065.0 +1102,2015-06-11,16.8333,16.9793,16.6953,16.7167,26028345.0 +1103,2015-06-12,16.7073,16.8973,16.6767,16.7307,18391890.0 +1104,2015-06-15,16.6947,16.752,16.4007,16.6973,27654165.0 +1105,2015-06-16,16.6287,16.896,16.606,16.882,24904965.0 +1106,2015-06-17,16.8833,17.624,16.8,17.4207,70233015.0 +1107,2015-06-18,17.3647,17.564,17.3333,17.46,35891805.0 +1108,2015-06-19,17.5147,17.5867,17.34,17.5,32618625.0 +1109,2015-06-22,17.7,17.7313,17.046,17.3233,60604575.0 +1110,2015-06-23,17.3713,17.8667,17.238,17.84,50767455.0 +1111,2015-06-24,17.8547,17.8547,17.5813,17.66,29859885.0 +1112,2015-06-25,17.732,18.094,17.68,17.9133,37257870.0 +1113,2015-06-26,17.9067,17.9673,17.7333,17.8173,46306020.0 +1114,2015-06-29,17.6,17.73,17.3267,17.4833,44892210.0 +1115,2015-06-30,17.482,18.0613,17.482,17.9167,40032600.0 +1116,2015-07-01,17.9667,18.2333,17.8567,17.9567,26522145.0 +1117,2015-07-02,17.956,18.8453,17.9067,18.6507,89596185.0 +1118,2015-07-06,18.5993,18.7913,18.42,18.6867,51407370.0 +1119,2015-07-07,18.4233,18.4933,17.3847,17.71,76788555.0 +1120,2015-07-08,17.5673,17.5993,16.954,17.0147,77151690.0 +1121,2015-07-09,17.24,17.532,17.1193,17.2667,42350805.0 +1122,2015-07-10,17.294,17.6467,17.188,17.2787,32995410.0 +1123,2015-07-13,17.4133,17.5227,17.07,17.46,37339440.0 +1124,2015-07-14,17.536,17.7867,17.3673,17.6833,23937300.0 +1125,2015-07-15,17.7853,17.9033,17.4067,17.5213,24810810.0 +1126,2015-07-16,17.6873,18.0587,17.544,17.9667,19932795.0 +1127,2015-07-17,18.0193,18.3693,17.8833,18.31,64817235.0 +1128,2015-07-20,18.4333,19.11,18.1693,18.8267,62984370.0 +1129,2015-07-21,18.8313,18.8313,17.608,17.6667,76316850.0 +1130,2015-07-22,17.6333,17.9627,17.3333,17.858,38555175.0 +1131,2015-07-23,18.0067,18.0067,17.6847,17.8533,28486500.0 +1132,2015-07-24,17.9267,18.0727,17.5947,17.7067,37048095.0 +1133,2015-07-27,17.682,17.682,16.7193,16.88,60568065.0 +1134,2015-07-28,17.0113,17.6933,16.7887,17.6933,48846450.0 +1135,2015-07-29,17.7187,17.8593,17.4667,17.5753,34009380.0 +1136,2015-07-30,17.6133,17.8293,17.474,17.7987,26370390.0 +1137,2015-07-31,17.8767,17.9573,17.674,17.6933,27594270.0 +1138,2015-08-03,17.7333,17.842,17.138,17.3433,32603745.0 +1139,2015-08-04,17.338,17.7813,17.2227,17.6833,28507875.0 +1140,2015-08-05,17.7933,18.4667,16.3333,17.0,68174265.0 +1141,2015-08-06,17.0133,17.0493,15.7413,16.3833,189249225.0 +1142,2015-08-07,16.3533,16.4087,15.8927,16.1673,67028235.0 +1143,2015-08-10,16.1333,16.198,15.7367,16.04,53537460.0 +1144,2015-08-11,15.9033,15.9533,15.6293,15.8247,52796445.0 +1145,2015-08-12,15.7073,15.9847,15.4913,15.9347,46502790.0 +1146,2015-08-13,16.0133,16.432,15.9267,16.208,58656540.0 +1147,2015-08-14,16.1967,16.6147,16.118,16.2567,53596260.0 +1148,2015-08-17,16.3333,17.2587,16.3333,17.02,88423530.0 +1149,2015-08-18,17.1,17.4,16.904,17.3733,53375535.0 +1150,2015-08-19,17.4673,17.4673,16.964,16.9867,46379340.0 +1151,2015-08-20,16.8687,16.9707,16.0007,16.034,62651175.0 +1152,2015-08-21,16.044,16.2533,15.314,15.3433,83421645.0 +1153,2015-08-24,14.5667,15.4267,13.0,14.6667,120938985.0 +1154,2015-08-25,15.2667,15.5333,14.5667,14.5667,53007090.0 +1155,2015-08-26,15.1493,15.3333,14.3673,15.02,63997230.0 +1156,2015-08-27,15.318,16.3167,15.2593,16.2173,98315805.0 +1157,2015-08-28,16.1307,16.7633,15.9333,16.592,71507475.0 +1158,2015-08-31,16.2647,16.9967,16.236,16.474,122503890.0 +1159,2015-09-01,16.3333,16.4,15.798,15.9733,71484615.0 +1160,2015-09-02,15.9453,17.0327,15.9453,16.9333,61671885.0 +1161,2015-09-03,16.9167,17.0033,16.2067,16.2333,53779770.0 +1162,2015-09-04,16.1453,16.2727,15.88,16.1287,47893560.0 +1163,2015-09-08,16.53,16.75,16.27,16.686,40088835.0 +1164,2015-09-09,16.6867,16.9627,16.5333,16.6053,43224345.0 +1165,2015-09-10,16.7107,16.8007,16.3553,16.5933,33505485.0 +1166,2015-09-11,16.4667,16.6927,16.3153,16.69,30261885.0 +1167,2015-09-14,16.7313,16.95,16.6033,16.876,37000215.0 +1168,2015-09-15,16.82,16.9733,16.6333,16.93,37735680.0 +1169,2015-09-16,16.9453,17.5253,16.8587,17.4993,53034555.0 +1170,2015-09-17,17.4547,17.7,17.3793,17.4607,44743740.0 +1171,2015-09-18,17.4533,17.588,17.16,17.3327,46208550.0 +1172,2015-09-21,17.3153,18.1047,17.0533,17.6667,78873465.0 +1173,2015-09-22,17.5853,17.5853,17.058,17.3973,47461185.0 +1174,2015-09-23,17.2933,17.5313,17.172,17.3973,33568950.0 +1175,2015-09-24,17.3867,17.5667,17.0807,17.5667,43135980.0 +1176,2015-09-25,17.6,17.8167,17.0767,17.13,49134375.0 +1177,2015-09-28,17.1893,17.3193,16.4407,16.6053,127229130.0 +1178,2015-09-29,16.7333,16.982,16.364,16.4467,47435895.0 +1179,2015-09-30,16.6247,16.926,16.156,16.5633,62164515.0 +1180,2015-10-01,16.6433,16.6433,15.8087,15.9667,56504925.0 +1181,2015-10-02,16.038,16.7333,15.5333,16.5667,54307740.0 +1182,2015-10-05,16.6673,16.7333,16.2753,16.354,48077100.0 +1183,2015-10-06,16.3327,16.3327,15.7053,15.95,65567505.0 +1184,2015-10-07,15.7947,15.8667,15.2747,15.46,89247075.0 +1185,2015-10-08,15.378,15.424,14.754,15.0,77791965.0 +1186,2015-10-09,14.7333,14.958,14.5333,14.6933,79845975.0 +1187,2015-10-12,14.8,14.9067,14.2793,14.3,49668135.0 +1188,2015-10-13,14.3067,14.8353,14.0753,14.6,67942260.0 +1189,2015-10-14,14.6173,14.7433,14.362,14.4933,39930165.0 +1190,2015-10-15,14.59,14.8627,14.2467,14.8627,36025155.0 +1191,2015-10-16,14.788,15.366,14.788,15.11,56215725.0 +1192,2015-10-19,15.2293,15.41,14.996,15.15,31590870.0 +1193,2015-10-20,15.1667,15.24,13.4667,14.1107,197281935.0 +1194,2015-10-21,14.2267,14.3207,13.92,14.0667,53924745.0 +1195,2015-10-22,14.134,14.3833,13.96,14.2,35633430.0 +1196,2015-10-23,14.4527,14.5333,13.846,14.0,54594090.0 +1197,2015-10-26,14.0327,14.4667,13.9267,14.38,42132645.0 +1198,2015-10-27,14.372,14.4733,13.834,14.0233,45352560.0 +1199,2015-10-28,14.0473,14.23,13.8867,14.1867,34321920.0 +1200,2015-10-29,14.1333,14.25,13.94,14.0007,23203560.0 +1201,2015-10-30,14.0933,14.1087,13.5927,13.7927,55364160.0 +1202,2015-11-02,13.7933,14.3867,13.7933,14.2633,49048695.0 +1203,2015-11-03,14.26,15.5967,13.5,15.1713,81725865.0 +1204,2015-11-04,14.998,15.516,14.8,15.4233,164936790.0 +1205,2015-11-05,15.442,15.6393,15.2793,15.46,57396345.0 +1206,2015-11-06,15.4333,15.5573,15.3,15.5,62338770.0 +1207,2015-11-09,15.4507,15.5327,14.954,14.9993,49130655.0 +1208,2015-11-10,14.99,15.0,14.4053,14.44,58650945.0 +1209,2015-11-11,14.5527,14.632,14.242,14.6267,42948015.0 +1210,2015-11-12,14.5953,14.6,14.16,14.1667,37479450.0 +1211,2015-11-13,14.16,14.22,13.6947,13.702,42982740.0 +1212,2015-11-16,13.7667,14.332,13.7,14.28,37396095.0 +1213,2015-11-17,14.3447,14.4,14.0933,14.2667,27685005.0 +1214,2015-11-18,14.3267,14.7587,14.168,14.68,36768795.0 +1215,2015-11-19,14.864,15.0793,14.6867,14.74,30967155.0 +1216,2015-11-20,14.7867,15.0,14.2387,14.664,57603405.0 +1217,2015-11-23,14.6673,14.6673,14.3113,14.4933,31581555.0 +1218,2015-11-24,14.4,14.7333,14.3333,14.4733,31788765.0 +1219,2015-11-25,14.5667,15.3887,14.5667,15.3533,51472185.0 +1220,2015-11-27,15.3913,15.4833,15.134,15.3353,24905370.0 +1221,2015-11-30,15.4367,15.6187,15.272,15.3667,33631095.0 +1222,2015-12-01,15.404,15.8667,15.32,15.82,47844060.0 +1223,2015-12-02,15.81,15.9067,15.4153,15.532,37548885.0 +1224,2015-12-03,15.56,15.83,15.3333,15.5667,37645980.0 +1225,2015-12-04,15.6,15.63,15.1773,15.3933,32882220.0 +1226,2015-12-07,15.3587,15.7087,15.0767,15.3933,40632900.0 +1227,2015-12-08,15.2667,15.2667,14.9467,15.18,34195545.0 +1228,2015-12-09,15.0667,15.1667,14.7147,14.9873,39684090.0 +1229,2015-12-10,14.9993,15.2327,14.9093,15.1653,26159520.0 +1230,2015-12-11,15.0053,15.05,14.36,14.432,42714765.0 +1231,2015-12-14,14.6587,14.728,14.3247,14.572,35973795.0 +1232,2015-12-15,14.7333,14.8287,14.5333,14.7267,28405860.0 +1233,2015-12-16,14.8333,15.6587,14.7153,15.5833,64146990.0 +1234,2015-12-17,15.69,15.8507,15.3207,15.4733,40449015.0 +1235,2015-12-18,15.4,15.7267,15.286,15.3833,38668740.0 +1236,2015-12-21,15.4667,15.722,15.4,15.5333,24367620.0 +1237,2015-12-22,15.5333,15.77,15.3087,15.3467,25559175.0 +1238,2015-12-23,15.4667,15.5633,15.2087,15.3133,18879060.0 +1239,2015-12-24,15.3133,15.4587,15.2187,15.3713,8807865.0 +1240,2015-12-28,15.3573,15.4653,15.036,15.2667,22891215.0 +1241,2015-12-29,15.3167,15.86,15.3027,15.86,31348185.0 +1242,2015-12-30,15.7387,16.2427,15.7113,15.9133,47373570.0 +1243,2015-12-31,16.0,16.23,15.8913,16.0,35687385.0 +1244,2016-01-04,15.5733,15.9667,14.6,14.9727,84687525.0 +1245,2016-01-05,14.934,15.126,14.6667,14.85,39873360.0 +1246,2016-01-06,14.6047,14.7167,14.3987,14.7167,45644085.0 +1247,2016-01-07,14.5333,14.5627,14.144,14.334,44442075.0 +1248,2016-01-08,14.4133,14.696,14.03,14.0753,42351450.0 +1249,2016-01-11,14.0633,14.2967,13.5333,13.8287,51419670.0 +1250,2016-01-12,13.9893,14.2493,13.6873,14.066,37346910.0 +1251,2016-01-13,14.17,14.1767,13.3333,13.4,45447780.0 +1252,2016-01-14,13.3667,14.0,12.892,13.8033,78481125.0 +1253,2016-01-15,13.4667,13.6793,13.1333,13.65,65273250.0 +1254,2016-01-19,13.992,14.0313,13.3853,13.6647,49873515.0 +1255,2016-01-20,13.5,13.5,12.75,13.346,71760615.0 +1256,2016-01-21,13.2,13.5487,13.0013,13.2733,39395805.0 +1257,2016-01-22,13.56,13.7667,13.2687,13.5033,36423510.0 +1258,2016-01-25,13.5033,13.5713,13.034,13.0667,32746890.0 +1259,2016-01-26,13.0767,13.2187,12.592,12.79,61887765.0 +1260,2016-01-27,12.8007,12.884,12.3847,12.6033,43610685.0 +1261,2016-01-28,12.6333,12.7933,12.1607,12.4327,58177335.0 +1262,2016-01-29,12.5853,12.916,12.5193,12.7787,36289005.0 +1263,2016-02-01,12.7167,13.3013,12.1833,13.088,67881600.0 +1264,2016-02-02,13.09,13.09,12.0153,12.18,72660375.0 +1265,2016-02-03,12.2467,12.3267,11.3453,11.572,102199185.0 +1266,2016-02-04,11.6373,11.732,11.1327,11.37,55556535.0 +1267,2016-02-05,11.4867,11.5627,10.516,10.8333,121217820.0 +1268,2016-02-08,10.6,10.6,9.7333,9.75,117036630.0 +1269,2016-02-09,9.798,10.6527,9.34,9.6667,111349140.0 +1270,2016-02-10,9.7533,10.9933,9.0,10.502,114878790.0 +1271,2016-02-11,10.2,10.884,9.6013,10.1333,187276440.0 +1272,2016-02-12,10.1333,10.4673,9.58,9.9967,95316150.0 +1273,2016-02-16,10.0993,10.8633,10.0993,10.3307,72728055.0 +1274,2016-02-17,10.4987,11.3447,10.4453,11.3447,76193205.0 +1275,2016-02-18,11.3533,11.5833,10.9847,11.1333,49621590.0 +1276,2016-02-19,11.0333,11.166,10.8333,11.1233,36965385.0 +1277,2016-02-22,11.3,11.9273,11.3,11.7967,66003810.0 +1278,2016-02-23,11.648,12.1153,11.5787,11.7667,69213390.0 +1279,2016-02-24,11.6733,12.0,11.1893,11.9993,69879090.0 +1280,2016-02-25,11.8887,12.568,11.68,12.4907,67942905.0 +1281,2016-02-26,12.6067,12.8,12.3333,12.6507,78149805.0 +1282,2016-02-29,12.6,13.09,12.6,12.7533,115657890.0 +1283,2016-03-01,12.9527,13.0633,12.18,12.3167,87616590.0 +1284,2016-03-02,12.3953,12.568,12.1,12.458,62262495.0 +1285,2016-03-03,12.556,13.1613,12.2813,13.0267,63760695.0 +1286,2016-03-04,13.04,13.602,13.04,13.3833,86046540.0 +1287,2016-03-07,13.3333,13.98,13.16,13.7,67046235.0 +1288,2016-03-08,13.6667,13.8333,13.48,13.5233,53949945.0 +1289,2016-03-09,13.5667,13.9587,13.5193,13.93,41877810.0 +1290,2016-03-10,13.93,14.2333,13.378,13.6787,67059180.0 +1291,2016-03-11,13.918,13.9613,13.6887,13.8347,42624135.0 +1292,2016-03-14,13.88,14.448,13.88,14.3667,50652270.0 +1293,2016-03-15,14.2667,14.598,14.1,14.5333,80336310.0 +1294,2016-03-16,14.556,14.8387,14.4533,14.8113,45207405.0 +1295,2016-03-17,14.8,15.2333,14.6267,15.21,48334365.0 +1296,2016-03-18,15.1333,15.632,15.1067,15.4733,59588040.0 +1297,2016-03-21,15.5333,15.992,15.516,15.9,66283815.0 +1298,2016-03-22,15.9,15.9327,15.5033,15.5333,53471670.0 +1299,2016-03-23,15.6333,15.68,14.6867,14.6893,62026500.0 +1300,2016-03-24,14.5127,15.2593,14.2987,15.22,64368510.0 +1301,2016-03-28,15.226,15.654,15.0,15.3333,49788900.0 +1302,2016-03-29,15.4333,15.492,15.022,15.3533,51507480.0 +1303,2016-03-30,15.46,15.7,15.1,15.1,52204845.0 +1304,2016-03-31,15.1333,15.828,15.0007,15.54,103025805.0 +1305,2016-04-01,15.6667,16.7493,15.318,15.83,205378890.0 +1306,2016-04-04,16.3333,16.808,15.7133,15.76,169088775.0 +1307,2016-04-05,15.8567,17.1667,15.7767,17.1667,127513170.0 +1308,2016-04-06,16.86,17.8493,16.8533,17.7533,143856135.0 +1309,2016-04-07,17.8667,17.956,16.9673,17.0647,111640635.0 +1310,2016-04-08,17.04,17.434,16.5347,16.6333,92146575.0 +1311,2016-04-11,16.7847,17.266,16.3533,16.62,119938500.0 +1312,2016-04-12,16.6333,16.8,16.242,16.49,73495020.0 +1313,2016-04-13,16.5667,17.0333,16.4887,16.9913,63754965.0 +1314,2016-04-14,16.8747,17.1227,16.7367,16.788,53539065.0 +1315,2016-04-15,16.8007,17.004,16.608,16.9267,47150220.0 +1316,2016-04-18,16.9,17.2207,16.7773,16.848,56465895.0 +1317,2016-04-19,17.0267,17.0393,16.0833,16.3333,80956815.0 +1318,2016-04-20,16.5193,16.9107,16.1,16.66,67998930.0 +1319,2016-04-21,16.6553,16.7313,16.4,16.4887,36160305.0 +1320,2016-04-22,16.5133,16.9333,16.3807,16.9233,50184240.0 +1321,2016-04-25,17.02,17.1587,16.7173,16.7667,46018590.0 +1322,2016-04-26,16.8007,17.0487,16.626,16.772,41643750.0 +1323,2016-04-27,16.83,17.0,16.6267,16.7853,41368650.0 +1324,2016-04-28,16.696,16.8953,16.496,16.5433,31875060.0 +1325,2016-04-29,16.5167,16.666,15.854,15.9533,67850040.0 +1326,2016-05-02,16.1167,16.2127,15.6547,16.12,48718935.0 +1327,2016-05-03,15.9907,16.12,15.4207,15.4387,54099555.0 +1328,2016-05-04,15.3467,16.1753,14.6933,15.2333,101952825.0 +1329,2016-05-05,15.3647,15.6,13.986,14.0347,140309865.0 +1330,2016-05-06,14.0667,14.4247,13.874,14.3267,74756025.0 +1331,2016-05-09,14.4333,14.534,13.7867,13.8167,62450460.0 +1332,2016-05-10,14.026,14.0413,13.6667,13.88,51794940.0 +1333,2016-05-11,13.874,14.3653,13.7367,13.894,61181340.0 +1334,2016-05-12,13.9933,14.1533,13.5767,13.7767,46360335.0 +1335,2016-05-13,13.7793,14.08,13.7473,13.82,35990505.0 +1336,2016-05-16,13.9327,14.21,13.8587,13.888,37083990.0 +1337,2016-05-17,13.9327,13.988,13.6013,13.6867,34568325.0 +1338,2016-05-18,13.902,14.354,13.2007,14.0333,69813285.0 +1339,2016-05-19,14.0467,14.7333,13.82,14.574,86109435.0 +1340,2016-05-20,14.7313,14.7313,14.194,14.6547,113611050.0 +1341,2016-05-23,14.726,14.84,14.38,14.38,66618810.0 +1342,2016-05-24,14.4993,14.5827,14.3453,14.53,37793115.0 +1343,2016-05-25,14.6327,14.7573,14.41,14.5933,37445070.0 +1344,2016-05-26,14.666,15.0327,14.6033,15.0327,53304360.0 +1345,2016-05-27,15.0667,15.0667,14.7167,14.8433,47011290.0 +1346,2016-05-31,14.926,14.9833,14.7667,14.8733,31549200.0 +1347,2016-06-01,14.8267,14.8267,14.4593,14.6,38188845.0 +1348,2016-06-02,14.632,14.7327,14.474,14.702,24582015.0 +1349,2016-06-03,14.7,14.796,14.534,14.5673,28329450.0 +1350,2016-06-06,14.6047,14.7267,14.3633,14.7053,28419060.0 +1351,2016-06-07,14.748,15.6293,14.7327,15.5127,80287470.0 +1352,2016-06-08,15.5333,16.0567,15.4567,15.7233,76060455.0 +1353,2016-06-09,15.6467,15.6887,15.07,15.09,58262070.0 +1354,2016-06-10,14.8733,15.2667,14.4787,14.674,78597060.0 +1355,2016-06-13,14.5533,15.0513,14.4653,14.5133,53577120.0 +1356,2016-06-14,14.582,14.8133,14.1687,14.28,44983245.0 +1357,2016-06-15,14.4333,14.7933,14.342,14.532,36963330.0 +1358,2016-06-16,14.51,14.658,14.2333,14.5333,31423200.0 +1359,2016-06-17,14.5353,14.666,14.3,14.33,38441865.0 +1360,2016-06-20,14.5,14.9167,14.5,14.696,44990895.0 +1361,2016-06-21,14.7667,14.838,12.608,12.8533,41360595.0 +1362,2016-06-22,14.0,14.0,12.8807,13.1867,288062460.0 +1363,2016-06-23,13.196,13.196,12.8087,13.0,122422515.0 +1364,2016-06-24,12.96,13.008,12.476,12.7333,83003595.0 +1365,2016-06-27,12.9067,13.254,12.5247,13.22,90248895.0 +1366,2016-06-28,13.27,13.6033,13.2633,13.4527,69636630.0 +1367,2016-06-29,13.5467,14.1187,13.5333,14.0167,70308465.0 +1368,2016-06-30,14.0827,14.2373,13.668,13.7333,56418435.0 +1369,2016-07-01,13.6393,14.5493,13.5967,14.4133,63605955.0 +1370,2016-07-05,14.0367,14.3033,13.7,14.0933,64103865.0 +1371,2016-07-06,13.9587,14.3487,13.9327,14.2433,56001630.0 +1372,2016-07-07,14.2867,14.5413,14.1667,14.4,41651820.0 +1373,2016-07-08,14.3667,14.654,14.3,14.4,45595800.0 +1374,2016-07-11,14.5633,15.1187,14.5633,14.82,66368370.0 +1375,2016-07-12,14.792,15.1667,14.7667,14.9667,56701455.0 +1376,2016-07-13,15.0,15.0667,14.686,14.8667,44640195.0 +1377,2016-07-14,14.9,15.0667,14.7367,14.7687,32683545.0 +1378,2016-07-15,14.8333,14.85,14.6067,14.6067,28054815.0 +1379,2016-07-18,14.6667,15.1393,14.5533,15.0433,43574475.0 +1380,2016-07-19,15.034,15.2733,14.9833,15.08,36414315.0 +1381,2016-07-20,15.1347,15.32,15.0,15.28,31636800.0 +1382,2016-07-21,15.342,15.3667,14.6067,14.6667,55197015.0 +1383,2016-07-22,14.714,14.9667,14.592,14.7933,32939685.0 +1384,2016-07-25,14.8333,15.426,14.758,15.3333,57810465.0 +1385,2016-07-26,15.4,15.4,15.02,15.2833,39602580.0 +1386,2016-07-27,15.31,15.5573,15.128,15.22,35585460.0 +1387,2016-07-28,15.2607,15.3853,15.1067,15.3853,29429970.0 +1388,2016-07-29,15.3507,15.6853,15.3333,15.6147,38264985.0 +1389,2016-08-01,15.6907,15.7753,15.276,15.4113,51807975.0 +1390,2016-08-02,15.3453,15.3453,14.76,15.1333,48089565.0 +1391,2016-08-03,15.1167,15.5333,14.4333,14.94,49846905.0 +1392,2016-08-04,15.2,15.3907,14.8033,15.3367,52533225.0 +1393,2016-08-05,15.3187,15.4667,15.15,15.1653,38675430.0 +1394,2016-08-08,15.1653,15.3067,15.0667,15.1,27615555.0 +1395,2016-08-09,15.02,15.436,15.0,15.2333,26310885.0 +1396,2016-08-10,15.2953,15.3247,14.9747,15.0667,28483890.0 +1397,2016-08-11,15.0727,15.1713,14.894,15.0,24076710.0 +1398,2016-08-12,14.9993,15.11,14.936,15.0393,20300850.0 +1399,2016-08-15,15.0667,15.3,14.9867,15.0007,25273980.0 +1400,2016-08-16,14.9813,15.146,14.8887,14.9067,26379855.0 +1401,2016-08-17,14.7053,14.9887,14.7053,14.892,21790455.0 +1402,2016-08-18,14.8827,15.044,14.8193,14.8667,20870070.0 +1403,2016-08-19,14.8667,15.0133,14.8353,15.0,19653315.0 +1404,2016-08-22,15.0067,15.0527,14.8453,14.87,26019900.0 +1405,2016-08-23,14.9067,15.2327,14.8533,15.1087,63281610.0 +1406,2016-08-24,15.1067,15.1433,14.8147,14.8147,30888090.0 +1407,2016-08-25,14.802,14.9327,14.7167,14.7327,21926385.0 +1408,2016-08-26,14.7567,14.8633,14.588,14.634,28345545.0 +1409,2016-08-29,14.6,14.6933,14.3333,14.3413,41806380.0 +1410,2016-08-30,14.3667,14.4073,14.0347,14.064,39825960.0 +1411,2016-08-31,14.066,14.1733,13.91,14.1,40418205.0 +1412,2016-09-01,14.1647,14.206,13.35,13.4167,102308160.0 +1413,2016-09-02,13.5233,13.5467,13.08,13.22,74876685.0 +1414,2016-09-06,13.3333,13.5667,13.2513,13.5493,54042450.0 +1415,2016-09-07,13.5627,13.7667,13.3807,13.4633,44694975.0 +1416,2016-09-08,13.4953,13.4993,13.0907,13.1767,41787750.0 +1417,2016-09-09,13.144,13.3487,12.9133,12.95,48325905.0 +1418,2016-09-12,12.8667,13.4247,12.812,13.2567,45839700.0 +1419,2016-09-13,13.2113,13.25,12.8967,12.9807,44783100.0 +1420,2016-09-14,13.0233,13.1953,12.99,13.0667,28667115.0 +1421,2016-09-15,13.1247,13.5013,13.0333,13.3507,36054000.0 +1422,2016-09-16,13.354,13.7167,13.258,13.694,38842110.0 +1423,2016-09-19,13.7007,13.962,13.6667,13.766,28640355.0 +1424,2016-09-20,13.756,13.85,13.594,13.6233,24932340.0 +1425,2016-09-21,13.6667,13.8,13.4373,13.712,31800480.0 +1426,2016-09-22,13.7093,13.8187,13.5333,13.6733,29451975.0 +1427,2016-09-23,13.716,14.012,13.6667,13.8667,33538245.0 +1428,2016-09-26,13.7833,14.0667,13.7047,13.93,28243755.0 +1429,2016-09-27,13.9533,14.0133,13.64,13.7253,39862860.0 +1430,2016-09-28,13.7553,13.8833,13.6333,13.76,27330960.0 +1431,2016-09-29,13.7353,13.822,13.35,13.3767,35370465.0 +1432,2016-09-30,13.38,13.6653,13.3033,13.6,33940980.0 +1433,2016-10-03,13.7933,14.378,13.602,14.2333,80238360.0 +1434,2016-10-04,14.232,14.3,13.9213,14.1333,45776940.0 +1435,2016-10-05,14.0927,14.21,13.8747,13.94,23797215.0 +1436,2016-10-06,13.9107,13.9107,13.3473,13.3773,61862850.0 +1437,2016-10-07,13.3973,13.4633,13.0533,13.1133,44352930.0 +1438,2016-10-10,13.4067,13.6093,13.1073,13.4133,43733445.0 +1439,2016-10-11,13.4133,13.48,13.2207,13.35,30339060.0 +1440,2016-10-12,13.3367,13.592,13.32,13.426,24088650.0 +1441,2016-10-13,13.334,13.3933,13.1367,13.3653,28215435.0 +1442,2016-10-14,13.4013,13.4333,13.0867,13.1327,57088020.0 +1443,2016-10-17,13.114,13.2307,12.8,12.9833,59920515.0 +1444,2016-10-18,13.0513,13.298,12.884,13.2867,77545620.0 +1445,2016-10-19,13.2867,13.7773,13.178,13.6333,94281555.0 +1446,2016-10-20,13.4667,13.5493,13.1367,13.2367,65298930.0 +1447,2016-10-21,13.2487,13.438,13.1493,13.3507,37628655.0 +1448,2016-10-24,13.3667,13.5967,13.35,13.4673,35458005.0 +1449,2016-10-25,13.522,13.646,13.4047,13.42,28966155.0 +1450,2016-10-26,13.4707,14.432,13.3333,14.0667,75116040.0 +1451,2016-10-27,14.0367,14.2467,13.4433,13.5533,175683330.0 +1452,2016-10-28,13.6007,13.688,13.322,13.366,57461385.0 +1453,2016-10-31,13.3333,13.556,13.054,13.1667,56721510.0 +1454,2016-11-01,13.192,13.2667,12.5007,12.5893,89997060.0 +1455,2016-11-02,12.6487,12.8467,12.4147,12.4827,54515745.0 +1456,2016-11-03,12.5307,12.7647,12.4693,12.5,32900445.0 +1457,2016-11-04,12.4747,12.8973,12.3973,12.7467,65781930.0 +1458,2016-11-07,12.93,12.996,12.67,12.89,50097405.0 +1459,2016-11-08,12.8893,13.166,12.7507,13.0333,42242490.0 +1460,2016-11-09,12.232,12.8,12.1333,12.678,103742010.0 +1461,2016-11-10,12.8,12.8733,12.028,12.3667,84858330.0 +1462,2016-11-11,12.306,12.592,12.2,12.57,51611205.0 +1463,2016-11-14,12.648,12.648,11.8793,12.1233,85608450.0 +1464,2016-11-15,12.2167,12.4287,12.1253,12.2787,50682225.0 +1465,2016-11-16,12.2433,12.3153,12.0807,12.2167,41321985.0 +1466,2016-11-17,12.2773,12.9,12.1407,12.6467,57600180.0 +1467,2016-11-18,12.634,12.8667,12.3273,12.3273,67142955.0 +1468,2016-11-21,12.3467,12.5927,12.294,12.312,57124485.0 +1469,2016-11-22,12.3853,12.7647,12.2473,12.7633,73593240.0 +1470,2016-11-23,12.74,13.0433,12.6,12.8667,62876265.0 +1471,2016-11-25,12.9,13.1493,12.9,13.11,30619665.0 +1472,2016-11-28,13.0233,13.29,12.97,13.0847,58714410.0 +1473,2016-11-29,13.068,13.1333,12.6333,12.6347,57520620.0 +1474,2016-11-30,12.7273,12.8,12.5,12.6233,45849390.0 +1475,2016-12-01,12.5927,12.6307,12.0667,12.1533,65228070.0 +1476,2016-12-02,12.1407,12.3253,12.0,12.1,51604950.0 +1477,2016-12-05,12.1673,12.5927,12.1667,12.4667,50948565.0 +1478,2016-12-06,12.4993,12.5067,12.1787,12.3833,44166465.0 +1479,2016-12-07,12.43,12.8933,12.3333,12.8167,71439045.0 +1480,2016-12-08,12.8427,12.8667,12.636,12.8,40960065.0 +1481,2016-12-09,12.7807,12.9227,12.6833,12.7833,33890505.0 +1482,2016-12-12,12.7867,12.9613,12.686,12.8287,31229640.0 +1483,2016-12-13,12.87,13.4187,12.8667,13.2133,89130030.0 +1484,2016-12-14,13.23,13.5333,13.1173,13.3,54654495.0 +1485,2016-12-15,13.2493,13.3827,13.1593,13.1653,41365305.0 +1486,2016-12-16,13.2027,13.506,13.1733,13.4933,49030395.0 +1487,2016-12-19,13.51,13.63,13.3227,13.4967,45378420.0 +1488,2016-12-20,13.5593,13.9333,13.5,13.9193,62280810.0 +1489,2016-12-21,13.8893,14.1487,13.8273,13.852,69526095.0 +1490,2016-12-22,13.8093,13.9993,13.7667,13.91,40609665.0 +1491,2016-12-23,13.8667,14.2667,13.8473,14.2533,57488535.0 +1492,2016-12-27,14.2033,14.8167,14.1867,14.6533,76603605.0 +1493,2016-12-28,14.6667,14.92,14.48,14.616,48715005.0 +1494,2016-12-29,14.65,14.6667,14.2747,14.3107,53864715.0 +1495,2016-12-30,14.338,14.5,14.112,14.236,61296165.0 +1496,2017-01-03,14.2507,14.6887,13.8,14.1893,76751040.0 +1497,2017-01-04,14.2,15.2,14.0747,15.1067,148240920.0 +1498,2017-01-05,14.9253,15.1653,14.7967,15.13,48295200.0 +1499,2017-01-06,15.1167,15.354,15.03,15.264,72480600.0 +1500,2017-01-09,15.2667,15.4613,15.2,15.4187,51153120.0 +1501,2017-01-10,15.4007,15.4667,15.126,15.3,47673600.0 +1502,2017-01-11,15.2667,15.334,15.112,15.31,45848955.0 +1503,2017-01-12,15.2687,15.38,15.0387,15.2933,47768535.0 +1504,2017-01-13,15.3333,15.8567,15.2733,15.85,80412510.0 +1505,2017-01-17,15.7607,15.9973,15.6247,15.7053,59745210.0 +1506,2017-01-18,15.7027,15.9807,15.7027,15.9147,48709860.0 +1507,2017-01-19,16.4073,16.5787,16.05,16.1767,101214150.0 +1508,2017-01-20,16.3167,16.4,16.2007,16.32,49923165.0 +1509,2017-01-23,16.31,16.726,16.2733,16.598,78557610.0 +1510,2017-01-24,16.5553,16.9993,16.5553,16.9993,62280870.0 +1511,2017-01-25,17.0667,17.2307,16.7867,16.96,65941140.0 +1512,2017-01-26,16.9887,17.0493,16.7167,16.742,39469215.0 +1513,2017-01-27,16.798,16.9853,16.568,16.9267,39775995.0 +1514,2017-01-30,16.8633,17.0193,16.4733,16.688,48218610.0 +1515,2017-01-31,16.67,17.0593,16.5133,16.8133,52682265.0 +1516,2017-02-01,16.8767,16.9327,16.6033,16.6167,51352470.0 +1517,2017-02-02,16.5333,16.828,16.4993,16.684,31979490.0 +1518,2017-02-03,16.7533,16.8527,16.6453,16.764,24938490.0 +1519,2017-02-06,16.7907,17.2027,16.6807,17.2027,45616860.0 +1520,2017-02-07,17.1667,17.3333,17.0947,17.1653,52628640.0 +1521,2017-02-08,17.1833,17.666,17.08,17.6493,50357010.0 +1522,2017-02-09,17.638,18.3333,17.472,17.95,101696130.0 +1523,2017-02-10,18.0,18.0887,17.7407,17.934,46664505.0 +1524,2017-02-13,18.0067,18.7333,17.9807,18.73,91768200.0 +1525,2017-02-14,18.7333,19.1593,18.574,18.732,94881045.0 +1526,2017-02-15,18.6747,18.816,18.4293,18.6467,63557535.0 +1527,2017-02-16,18.5707,18.6667,17.734,17.8333,89172345.0 +1528,2017-02-17,17.5933,18.1927,17.51,18.124,81886155.0 +1529,2017-02-21,18.22,18.76,18.1487,18.6,71768040.0 +1530,2017-02-22,18.5333,18.8967,18.1733,18.5113,113085195.0 +1531,2017-02-23,18.6067,18.6467,17.0,17.0,193472580.0 +1532,2017-02-24,17.0,17.2167,16.68,17.1133,107111355.0 +1533,2017-02-27,17.4007,17.4333,16.134,16.3867,150069720.0 +1534,2017-02-28,16.2933,16.7333,16.26,16.692,78670740.0 +1535,2017-03-01,16.7927,17.0,16.6073,16.6553,61044060.0 +1536,2017-03-02,16.7,16.8853,16.5513,16.6707,44183175.0 +1537,2017-03-03,16.62,16.8,16.6,16.75,38606160.0 +1538,2017-03-06,16.7033,16.78,16.3593,16.7567,43940415.0 +1539,2017-03-07,16.726,16.926,16.4807,16.5333,43656195.0 +1540,2017-03-08,16.5793,16.6713,16.3547,16.4593,47784270.0 +1541,2017-03-09,16.4833,16.5773,16.2,16.3533,50291415.0 +1542,2017-03-10,16.4,16.4933,16.2,16.2473,40420680.0 +1543,2017-03-13,16.1907,16.506,16.1853,16.4533,38125545.0 +1544,2017-03-14,16.4373,17.2867,16.38,17.2667,100832040.0 +1545,2017-03-15,17.2533,17.6467,16.7073,17.402,69533460.0 +1546,2017-03-16,17.4067,17.7167,17.2707,17.4667,90819975.0 +1547,2017-03-17,17.48,17.6887,17.4053,17.41,80565870.0 +1548,2017-03-20,17.4167,17.6367,17.2547,17.4633,46284510.0 +1549,2017-03-21,17.4867,17.6533,16.6827,16.7253,90363240.0 +1550,2017-03-22,16.6667,17.0327,16.6333,16.9853,50458350.0 +1551,2017-03-23,17.0367,17.1787,16.8867,16.972,42898545.0 +1552,2017-03-24,17.0067,17.5927,17.0007,17.5913,74085210.0 +1553,2017-03-27,17.5333,18.1267,17.3167,18.1,80728845.0 +1554,2017-03-28,18.0667,18.712,17.8667,18.5833,102388365.0 +1555,2017-03-29,18.5947,18.64,18.3693,18.4833,46356210.0 +1556,2017-03-30,18.484,18.8,18.4807,18.5333,53993670.0 +1557,2017-03-31,18.512,18.6593,18.4207,18.542,41612610.0 +1558,2017-04-03,18.75,19.9333,18.5533,19.9013,180777570.0 +1559,2017-04-04,19.9333,20.3207,19.6353,20.1333,129370695.0 +1560,2017-04-05,20.2467,20.3253,19.6133,19.6833,99987900.0 +1561,2017-04-06,19.5933,20.1293,19.534,19.9247,71159910.0 +1562,2017-04-07,19.9233,20.1967,19.674,20.1753,57513600.0 +1563,2017-04-10,20.3067,20.9153,20.3067,20.8147,97980315.0 +1564,2017-04-11,20.8907,20.902,20.3667,20.5533,72841680.0 +1565,2017-04-12,20.6,20.6433,19.744,19.8187,76993785.0 +1566,2017-04-13,19.6587,20.4927,19.5667,20.2713,124106325.0 +1567,2017-04-17,20.2833,20.2833,19.912,20.008,53491485.0 +1568,2017-04-18,20.0327,20.056,19.8393,20.0,38393445.0 +1569,2017-04-19,20.0133,20.4413,20.0133,20.3373,49679670.0 +1570,2017-04-20,20.4,20.61,20.0153,20.15,78870705.0 +1571,2017-04-21,20.1867,20.4593,20.028,20.4447,57667530.0 +1572,2017-04-24,20.6667,20.7033,20.4013,20.5153,65769240.0 +1573,2017-04-25,20.5667,20.932,20.3907,20.9167,85255320.0 +1574,2017-04-26,20.876,20.9667,20.6,20.6673,54209820.0 +1575,2017-04-27,20.66,20.8727,20.5,20.6067,44895480.0 +1576,2017-04-28,20.6527,21.0073,20.5333,20.9733,58899975.0 +1577,2017-05-01,20.9993,21.8167,20.938,21.5967,108803550.0 +1578,2017-05-02,21.492,21.844,21.1,21.1667,67132200.0 +1579,2017-05-03,21.2167,21.4353,20.0733,20.2467,88490685.0 +1580,2017-05-04,20.34,20.56,19.384,19.7253,178937325.0 +1581,2017-05-05,19.7907,20.6,19.7373,20.6,103262310.0 +1582,2017-05-08,20.6433,20.9193,20.388,20.5053,91822080.0 +1583,2017-05-09,20.55,21.466,20.55,21.3467,124801560.0 +1584,2017-05-10,21.6,21.7067,21.208,21.6807,72771405.0 +1585,2017-05-11,21.7533,21.7533,21.23,21.5327,60381360.0 +1586,2017-05-12,21.54,21.8,21.4353,21.6653,52982295.0 +1587,2017-05-15,21.2587,21.3467,20.8353,21.06,98139675.0 +1588,2017-05-16,21.1133,21.3373,21.0027,21.0333,53030295.0 +1589,2017-05-17,21.0267,21.0267,20.352,20.4133,84943980.0 +1590,2017-05-18,20.396,20.9293,20.1667,20.8233,73016490.0 +1591,2017-05-19,20.8733,21.1167,20.6587,20.6913,59414115.0 +1592,2017-05-22,20.71,20.958,20.4533,20.6473,53613555.0 +1593,2017-05-23,20.732,20.732,20.232,20.262,53430645.0 +1594,2017-08-02,21.4,23.736,20.748,23.334,158508465.0 +1595,2017-08-03,23.114,23.34,22.8667,23.18,169206135.0 +1596,2017-08-04,23.1873,23.84,22.8867,23.8187,118611315.0 +1597,2017-08-07,24.0,24.0,23.5167,23.6667,76922280.0 +1598,2017-08-08,23.6333,24.572,23.6207,24.2547,92226420.0 +1599,2017-08-09,24.208,24.6667,23.8747,24.2773,86519625.0 +1600,2017-08-10,24.22,24.444,23.5533,23.5667,88535805.0 +1601,2017-08-11,23.5447,24.084,23.3333,23.8667,54039555.0 +1602,2017-08-14,24.0667,24.5107,24.0667,24.28,55720770.0 +1603,2017-08-15,24.3433,24.38,23.958,24.1307,36768285.0 +1604,2017-08-16,24.1533,24.4333,24.068,24.2067,39519210.0 +1605,2017-08-17,24.258,24.26,23.4267,23.4333,59729325.0 +1606,2017-08-18,23.3333,23.6167,23.0007,23.0707,64878945.0 +1607,2017-08-21,23.144,23.1867,22.1233,22.4547,80873040.0 +1608,2017-08-22,22.7793,22.816,22.4913,22.7707,53835240.0 +1609,2017-08-23,22.72,23.566,22.5413,23.46,59650080.0 +1610,2017-08-24,23.5327,23.7773,23.316,23.5467,53365110.0 +1611,2017-08-25,23.6,23.7127,23.1533,23.1813,42063270.0 +1612,2017-08-28,23.1707,23.2267,22.648,22.8873,43703055.0 +1613,2017-08-29,22.7333,23.27,22.5627,23.1987,47693040.0 +1614,2017-08-30,23.2707,23.5653,23.1093,23.5653,39211260.0 +1615,2017-08-31,23.5733,23.896,23.5213,23.68,47533125.0 +1616,2017-09-01,23.7333,23.8393,23.5793,23.6673,36370140.0 +1617,2017-09-05,23.6433,23.6993,23.0593,23.3267,46009875.0 +1618,2017-09-06,23.3707,23.5,22.7707,22.9773,49117995.0 +1619,2017-09-07,23.0727,23.4987,22.8967,23.3787,50711130.0 +1620,2017-09-08,23.3093,23.3187,22.82,22.8953,38831370.0 +1621,2017-09-11,23.2,24.266,23.2,24.234,93792450.0 +1622,2017-09-12,24.2733,24.584,24.0267,24.1667,71484885.0 +1623,2017-09-13,24.19,24.538,23.9727,24.4,51254190.0 +1624,2017-09-14,24.3333,25.1973,24.1753,24.8987,88268760.0 +1625,2017-09-15,24.9793,25.36,24.8467,25.3553,65391495.0 +1626,2017-09-18,25.4,25.974,25.1787,25.6533,88693770.0 +1627,2017-09-19,25.48,25.4927,24.9047,24.9547,77656125.0 +1628,2017-09-20,25.0133,25.2167,24.738,24.944,60187995.0 +1629,2017-09-21,24.928,25.122,24.3007,24.432,58301040.0 +1630,2017-09-22,24.4,24.66,23.37,23.38,100120800.0 +1631,2017-09-25,23.378,23.8313,22.8587,23.002,95209215.0 +1632,2017-09-26,23.08,23.416,22.7267,23.0267,89596305.0 +1633,2017-09-27,23.2633,23.4327,22.7,22.74,73275165.0 +1634,2017-09-28,22.7333,22.85,22.36,22.7133,63105405.0 +1635,2017-09-29,22.768,22.9787,22.5733,22.72,62996130.0 +1636,2017-10-02,22.872,23.2067,22.34,22.4,63673905.0 +1637,2017-10-03,22.4667,23.476,22.0853,23.422,127915005.0 +1638,2017-10-04,23.4,23.908,23.282,23.7253,102388050.0 +1639,2017-10-05,23.6327,23.8293,23.4233,23.6967,49240515.0 +1640,2017-10-06,23.6973,24.0067,23.4833,23.5867,52458270.0 +1641,2017-10-09,23.5587,23.6,22.8407,23.0467,91929060.0 +1642,2017-10-10,23.086,23.744,23.0353,23.7167,85714425.0 +1643,2017-10-11,23.7,23.84,23.41,23.6333,54369930.0 +1644,2017-10-12,23.5793,23.9853,23.4667,23.6633,49478250.0 +1645,2017-10-13,23.7033,23.8993,23.5787,23.7467,42626325.0 +1646,2017-10-16,23.5833,23.6667,23.144,23.3833,63696315.0 +1647,2017-10-17,23.4167,23.748,23.3333,23.69,39478785.0 +1648,2017-10-18,23.6267,24.2,23.6087,23.9767,58906215.0 +1649,2017-10-19,23.8,23.8533,23.2133,23.416,60596670.0 +1650,2017-10-20,23.45,23.6367,22.956,22.9933,58987380.0 +1651,2017-10-23,23.3133,23.4833,22.4167,22.534,69079140.0 +1652,2017-10-24,22.4667,22.8533,22.4107,22.5,54037110.0 +1653,2017-10-25,22.5013,22.53,21.5707,21.75,84060840.0 +1654,2017-10-26,22.1,22.1,21.5467,21.886,59895495.0 +1655,2017-10-27,21.6667,21.8893,21.1107,21.3667,82456560.0 +1656,2017-10-30,21.4073,21.5853,21.15,21.2733,50183595.0 +1657,2017-10-31,21.3667,22.2,21.3453,22.2,67143015.0 +1658,2017-11-01,22.2633,22.2667,20.14,20.3267,98873415.0 +1659,2017-11-02,20.3,21.4053,19.5087,19.9627,239871705.0 +1660,2017-11-03,19.8573,20.434,19.6753,20.4133,106874280.0 +1661,2017-11-06,20.4533,20.626,19.934,20.1333,75212505.0 +1662,2017-11-07,20.1667,20.4333,19.634,20.378,64488030.0 +1663,2017-11-08,20.334,20.4593,20.0867,20.31,58790550.0 +1664,2017-11-09,20.2873,20.326,19.7533,20.14,64908075.0 +1665,2017-11-10,20.1227,20.5573,20.1227,20.1867,55910415.0 +1666,2017-11-13,20.2667,21.12,19.9067,21.0533,92643630.0 +1667,2017-11-14,21.08,21.0933,20.46,20.5933,69989505.0 +1668,2017-11-15,20.548,20.8327,20.1,20.78,74143695.0 +1669,2017-11-16,20.8833,21.2093,20.7533,20.8373,70739175.0 +1670,2017-11-17,21.1,21.8333,20.8767,21.0167,170145555.0 +1671,2017-11-20,21.0333,21.0333,20.3167,20.5567,103487040.0 +1672,2017-11-21,20.6133,21.2153,20.534,21.1733,91762275.0 +1673,2017-11-22,21.2067,21.266,20.7893,20.812,62022240.0 +1674,2017-11-24,20.9,21.094,20.7333,21.0013,41299770.0 +1675,2017-11-27,21.0367,21.1567,20.634,21.0747,55527705.0 +1676,2017-11-28,21.0747,21.3333,20.928,21.1227,59546580.0 +1677,2017-11-29,21.0907,21.2133,20.082,20.4633,101149335.0 +1678,2017-11-30,20.5033,20.7133,20.3027,20.5333,53600970.0 +1679,2017-12-01,20.4667,20.688,20.2,20.43,52615485.0 +1680,2017-12-04,20.52,20.618,20.0407,20.3107,73463115.0 +1681,2017-12-05,20.2667,20.5333,20.0667,20.22,56832825.0 +1682,2017-12-06,20.196,20.8927,20.0,20.8867,78075690.0 +1683,2017-12-07,20.9,21.2427,20.7333,20.75,56477175.0 +1684,2017-12-08,20.8,21.132,20.7507,21.0093,42380790.0 +1685,2017-12-11,20.9067,22.0067,20.8993,22.0067,99929295.0 +1686,2017-12-12,21.9933,22.7627,21.84,22.746,108343800.0 +1687,2017-12-13,22.6833,22.948,22.4333,22.6,74635725.0 +1688,2017-12-14,22.54,23.1627,22.46,22.5113,71098425.0 +1689,2017-12-15,22.5333,22.9333,22.384,22.8673,85651935.0 +1690,2017-12-18,22.9667,23.1333,22.5053,22.5933,67302900.0 +1691,2017-12-19,22.6333,22.7933,22.02,22.0773,79694640.0 +1692,2017-12-20,22.2067,22.34,21.6693,21.9767,72798450.0 +1693,2017-12-21,21.924,22.2493,21.814,22.11,54460410.0 +1694,2017-12-22,22.1333,22.1333,21.6547,21.6573,51109455.0 +1695,2017-12-26,21.6807,21.6807,21.1053,21.154,52441845.0 +1696,2017-12-27,21.1867,21.2,20.7167,20.7367,57229200.0 +1697,2017-12-28,20.7507,21.0547,20.636,21.032,53772345.0 +1698,2017-12-29,20.9667,21.1333,20.6667,20.7033,45971790.0 +1699,2018-01-02,20.8,21.474,20.7167,21.37,51439980.0 +1700,2018-01-03,21.4333,21.6833,20.6,20.7127,53039445.0 +1701,2018-01-04,20.6827,21.2367,20.34,21.0,119513085.0 +1702,2018-01-05,21.04,21.1493,20.8,21.1167,54689490.0 +1703,2018-01-08,21.1667,22.4907,21.026,22.4173,120026880.0 +1704,2018-01-09,22.4333,22.5867,21.8267,22.1627,85692555.0 +1705,2018-01-10,22.0667,22.4667,21.9333,22.3333,46271310.0 +1706,2018-01-11,22.33,22.9873,22.2173,22.54,80395725.0 +1707,2018-01-12,22.6627,22.694,22.2447,22.3533,57715995.0 +1708,2018-01-16,22.3533,23.0,22.32,22.6333,79779555.0 +1709,2018-01-17,22.6867,23.2667,22.65,23.1333,83660295.0 +1710,2018-01-18,23.2,23.4867,22.916,22.9767,67304595.0 +1711,2018-01-19,23.008,23.4,22.84,23.4,58015335.0 +1712,2018-01-22,23.3347,23.8553,23.2333,23.4647,76691625.0 +1713,2018-01-23,23.68,24.1867,23.4,23.5787,66095520.0 +1714,2018-01-24,23.56,23.7333,22.9013,23.17,62762115.0 +1715,2018-01-25,23.17,23.324,22.4267,22.7,82199130.0 +1716,2018-01-26,22.7993,22.9333,22.3807,22.8567,52383270.0 +1717,2018-01-29,22.76,23.39,22.552,23.2667,55837245.0 +1718,2018-01-30,23.2167,23.35,22.8113,23.052,51916335.0 +1719,2018-01-31,23.1653,23.746,23.0127,23.7,68225850.0 +1720,2018-02-01,23.72,23.9773,23.242,23.3667,48808785.0 +1721,2018-02-02,23.2467,23.4633,22.7007,22.84,42620370.0 +1722,2018-02-05,22.6,22.9647,22.0,22.0333,49498560.0 +1723,2018-02-06,22.0367,22.4147,21.542,22.3953,58819215.0 +1724,2018-02-07,22.3327,23.778,22.1893,22.9,81471840.0 +1725,2018-02-08,22.896,23.2413,20.8667,21.0667,122580555.0 +1726,2018-02-09,21.4,21.5933,19.6507,20.75,157762590.0 +1727,2018-02-12,21.066,21.2747,20.4167,21.0487,74060220.0 +1728,2018-02-13,21.128,21.7327,20.834,21.6333,53357370.0 +1729,2018-02-14,21.612,21.7447,21.2347,21.5333,46124280.0 +1730,2018-02-15,21.64,22.324,21.4933,22.3,68946270.0 +1731,2018-02-16,22.3333,22.8747,22.0867,22.3667,67143360.0 +1732,2018-02-20,22.3073,22.7227,22.1,22.34,47355345.0 +1733,2018-02-21,22.3407,22.6427,22.1767,22.1813,37654230.0 +1734,2018-02-22,22.138,23.1627,22.1333,23.1033,80854995.0 +1735,2018-02-23,23.2,23.666,23.14,23.4627,69096450.0 +1736,2018-02-26,23.62,23.9333,23.49,23.8667,52423515.0 +1737,2018-02-27,23.7893,23.9993,23.334,23.4067,55899915.0 +1738,2018-02-28,23.4,23.6827,22.8147,22.9467,74032890.0 +1739,2018-03-01,22.8867,23.2447,22.0047,22.1,82409115.0 +1740,2018-03-02,22.1333,22.348,21.5313,22.34,59703135.0 +1741,2018-03-05,22.2813,22.5167,21.9527,22.2633,44503275.0 +1742,2018-03-06,22.28,22.4247,21.5333,21.5333,51460950.0 +1743,2018-03-07,21.6133,22.1667,21.4493,22.0967,59825250.0 +1744,2018-03-08,22.1333,22.3,21.5267,21.7067,41452350.0 +1745,2018-03-09,21.7673,21.8993,21.4913,21.8053,63614580.0 +1746,2018-03-12,21.92,23.1473,21.7667,22.9967,100808145.0 +1747,2018-03-13,22.886,23.0987,22.4173,22.6833,71138010.0 +1748,2018-03-14,22.758,22.7813,21.5953,21.8333,94350375.0 +1749,2018-03-15,21.8333,22.19,21.4067,21.6653,76010130.0 +1750,2018-03-16,21.6973,21.8267,21.2713,21.4367,74099280.0 +1751,2018-03-19,21.3533,21.3833,20.6447,20.9107,89344530.0 +1752,2018-03-20,20.9733,21.0833,20.584,20.734,53260785.0 +1753,2018-03-21,20.73,21.496,20.6127,21.1333,71613060.0 +1754,2018-03-22,21.05,21.2547,20.5333,20.5333,52637865.0 +1755,2018-03-23,20.5393,20.8667,20.03,20.15,75360090.0 +1756,2018-03-26,20.268,20.6,19.424,20.3267,97042815.0 +1757,2018-03-27,20.3333,20.5,18.074,18.3,158944560.0 +1758,2018-03-28,18.264,18.5933,16.8067,16.9667,243796575.0 +1759,2018-03-29,17.0807,18.064,16.5473,17.3,177807180.0 +1760,2018-04-02,17.0,17.742,16.306,16.8067,195963285.0 +1761,2018-04-03,17.0133,18.2233,16.9067,17.88,230425485.0 +1762,2018-04-04,17.7733,19.2247,16.8,19.2133,246546495.0 +1763,2018-04-05,19.26,20.4173,19.1333,19.8667,226914720.0 +1764,2018-04-06,19.8667,20.6187,19.7,19.88,164396325.0 +1765,2018-04-09,19.9927,20.6333,19.2267,19.4267,124936080.0 +1766,2018-04-10,19.8933,20.4733,19.5787,20.22,133247355.0 +1767,2018-04-11,20.1833,20.5987,19.9333,20.1133,84874725.0 +1768,2018-04-12,19.9853,20.3333,19.5787,19.6667,86663775.0 +1769,2018-04-13,19.68,20.2653,19.68,19.98,87163425.0 +1770,2018-04-16,20.0,20.1,19.2547,19.3667,76768875.0 +1771,2018-04-17,19.2467,19.6933,18.834,19.584,84747060.0 +1772,2018-04-18,19.574,20.016,19.2107,19.6413,79921260.0 +1773,2018-04-19,19.5767,20.0673,19.2367,19.93,71637165.0 +1774,2018-04-20,19.8667,19.9987,19.3073,19.3167,67236780.0 +1775,2018-04-23,19.38,19.5533,18.822,18.9333,57966930.0 +1776,2018-04-24,19.1,19.1927,18.564,18.8667,63192825.0 +1777,2018-04-25,18.9,19.0107,18.4833,18.8527,45042330.0 +1778,2018-04-26,18.8253,19.1333,18.4333,19.0853,50144700.0 +1779,2018-04-27,19.0333,19.6313,18.7867,19.5,49810530.0 +1780,2018-04-30,19.5513,19.9153,19.454,19.5893,47944485.0 +1781,2018-05-01,19.5967,20.0767,19.548,20.0667,46620600.0 +1782,2018-05-02,20.0267,20.7733,18.8147,19.164,100044315.0 +1783,2018-05-03,19.2667,19.3667,18.3487,18.8667,200230050.0 +1784,2018-05-04,18.9333,19.7907,18.6347,19.55,97219695.0 +1785,2018-05-07,19.6107,20.3973,19.55,20.2653,100077990.0 +1786,2018-05-08,20.2033,20.5167,19.9333,20.12,69679140.0 +1787,2018-05-09,20.1333,20.4673,19.9533,20.3987,65864130.0 +1788,2018-05-10,20.4567,20.866,20.2367,20.2367,65703270.0 +1789,2018-05-11,20.3213,20.592,19.9387,20.04,52073175.0 +1790,2018-05-14,20.3333,20.4667,19.4,19.4,83199000.0 +1791,2018-05-15,19.3333,19.3333,18.7,18.8667,109926450.0 +1792,2018-05-16,18.9153,19.254,18.7707,19.0933,65149395.0 +1793,2018-05-17,19.0527,19.2793,18.92,19.0367,50506260.0 +1794,2018-05-18,19.0073,19.0633,18.2667,18.4533,82659480.0 +1795,2018-05-21,18.7,19.4327,18.6467,18.9333,110223840.0 +1796,2018-05-22,19.0267,19.2333,18.228,18.342,104515395.0 +1797,2018-05-23,18.3333,18.6607,18.1653,18.56,68248245.0 +1798,2018-05-24,18.6047,18.7407,18.326,18.5653,48098295.0 +1799,2018-05-25,18.5667,18.6427,18.374,18.6,43134090.0 +1800,2018-05-29,18.6,19.1,18.41,18.8333,68391420.0 +1801,2018-05-30,18.8667,19.6673,18.7407,19.4133,86829480.0 +1802,2018-05-31,19.4007,19.4267,18.862,18.9667,65445975.0 +1803,2018-06-01,18.9873,19.4667,18.922,19.4667,60092265.0 +1804,2018-06-04,19.47,19.9333,19.466,19.7167,56356245.0 +1805,2018-06-05,19.7,19.8667,19.116,19.6,67469700.0 +1806,2018-06-06,19.6067,21.478,19.574,21.2667,223350765.0 +1807,2018-06-07,21.22,22.0,20.9053,21.12,173810055.0 +1808,2018-06-08,21.0407,21.632,20.9,21.1773,97360800.0 +1809,2018-06-11,21.1773,22.3107,21.1773,22.2153,159962145.0 +1810,2018-06-12,22.238,23.6647,22.238,22.8413,268792350.0 +1811,2018-06-13,23.0,23.3387,22.6,23.1987,115255125.0 +1812,2018-06-14,23.06,23.9167,22.9993,23.8,133885455.0 +1813,2018-06-15,23.7167,24.3113,23.4167,23.9,128061330.0 +1814,2018-06-18,23.7087,24.9153,23.4,24.494,145368480.0 +1815,2018-06-19,24.3333,24.6667,23.0833,23.414,155148825.0 +1816,2018-06-20,23.6,24.292,23.4667,24.1833,99665430.0 +1817,2018-06-21,24.1733,24.4147,23.0673,23.0673,94828470.0 +1818,2018-06-22,23.0667,23.6807,22.1333,22.2167,120476655.0 +1819,2018-06-25,22.17,22.5647,21.8333,22.2287,80040690.0 +1820,2018-06-26,22.15,22.9033,21.7193,22.82,90073035.0 +1821,2018-06-27,22.6667,23.386,22.4507,23.026,101165250.0 +1822,2018-06-28,23.16,23.8013,22.932,23.35,100403235.0 +1823,2018-06-29,23.4467,23.728,22.8207,22.9333,79185540.0 +1824,2018-07-02,23.8067,24.4467,21.99,22.456,233595795.0 +1825,2018-07-03,22.4567,22.4667,20.62,20.654,149002155.0 +1826,2018-07-05,20.7333,21.0,19.748,20.5007,213613665.0 +1827,2018-07-06,20.6,20.8047,20.1333,20.6,110289180.0 +1828,2018-07-09,20.7933,21.2347,20.5333,21.2193,89890020.0 +1829,2018-07-10,21.2667,21.9653,21.0707,21.1267,113676510.0 +1830,2018-07-11,21.1733,21.4627,20.9427,21.2333,58766760.0 +1831,2018-07-12,21.3667,21.562,20.8513,21.076,67817835.0 +1832,2018-07-13,21.1733,21.306,20.6167,21.2267,73379730.0 +1833,2018-07-16,21.124,21.1433,20.4167,20.48,96201240.0 +1834,2018-07-17,20.5733,21.6493,20.4667,21.49,84189390.0 +1835,2018-07-18,21.5067,21.7267,21.0833,21.612,69456900.0 +1836,2018-07-19,21.4667,21.5693,20.934,21.3667,72958365.0 +1837,2018-07-20,21.408,21.5493,20.78,20.904,62980500.0 +1838,2018-07-23,20.666,20.666,19.524,20.2667,129825210.0 +1839,2018-07-24,20.266,20.5147,19.5027,19.7987,115360290.0 +1840,2018-07-25,19.8287,20.6413,19.5333,20.1333,86301735.0 +1841,2018-07-26,20.214,20.7133,20.214,20.5,56522880.0 +1842,2018-07-27,20.5667,20.5667,19.6893,19.7993,52540545.0 +1843,2018-07-30,19.6667,19.8013,19.0753,19.3333,79959210.0 +1844,2018-07-31,19.27,19.9907,19.27,19.854,60069180.0 +1845,2018-08-01,19.9567,22.3833,19.3333,21.9327,117020970.0 +1846,2018-08-02,21.77,23.3333,21.544,23.3213,279512445.0 +1847,2018-08-03,23.0667,23.6667,22.8353,23.1367,159452790.0 +1848,2018-08-06,23.0567,23.6653,22.6013,22.6667,102678015.0 +1849,2018-08-07,22.7373,25.8307,22.61,25.1333,381052725.0 +1850,2018-08-08,25.266,25.5093,24.4347,24.6333,280429020.0 +1851,2018-08-09,24.5067,24.5867,23.0487,23.874,199309800.0 +1852,2018-08-10,23.7333,24.1933,23.0667,23.48,137798880.0 +1853,2018-08-13,23.54,24.5327,23.268,23.6393,121692615.0 +1854,2018-08-14,23.8253,23.9467,23.1133,23.1333,82835430.0 +1855,2018-08-15,23.246,23.3227,22.1427,22.3733,105751815.0 +1856,2018-08-16,22.5533,22.9567,22.2547,22.34,66955965.0 +1857,2018-08-17,22.2067,22.2667,20.2033,20.2033,224153370.0 +1858,2018-08-20,20.2333,20.5993,18.8193,20.4933,202795425.0 +1859,2018-08-21,20.56,21.6527,20.534,21.2,156089955.0 +1860,2018-08-22,21.372,21.592,20.978,21.4867,73769700.0 +1861,2018-08-23,21.4867,21.8213,21.2067,21.3587,63324510.0 +1862,2018-08-24,21.3593,21.59,21.2933,21.4793,42289110.0 +1863,2018-08-27,20.6667,21.496,20.2347,21.2273,164076645.0 +1864,2018-08-28,21.3067,21.3067,20.746,20.8333,94857345.0 +1865,2018-08-29,20.776,20.8233,20.2333,20.2413,90330150.0 +1866,2018-08-30,20.2333,20.38,19.848,20.1533,87190275.0 +1867,2018-08-31,20.1667,20.354,19.9067,20.09,64315245.0 +1868,2018-09-04,20.0,20.0,19.1507,19.1507,100324125.0 +1869,2018-09-05,19.2,19.2213,18.4787,18.8167,87707505.0 +1870,2018-09-06,18.83,19.4113,18.592,18.7667,88452450.0 +1871,2018-09-07,18.7333,18.7333,16.8167,17.6353,264414765.0 +1872,2018-09-10,17.8667,19.1333,17.866,18.9793,176956905.0 +1873,2018-09-11,19.0,19.0327,18.2367,18.62,110538330.0 +1874,2018-09-12,18.7333,19.5,18.576,19.35,118337070.0 +1875,2018-09-13,19.3567,19.6667,19.012,19.3167,73748235.0 +1876,2018-09-14,19.4233,19.822,19.1013,19.6587,79030395.0 +1877,2018-09-17,19.6467,20.058,19.0813,19.5267,81452700.0 +1878,2018-09-18,19.8527,20.176,18.3667,18.8067,201292170.0 +1879,2018-09-19,18.954,20.0,18.56,19.8833,96540390.0 +1880,2018-09-20,19.9647,20.3987,19.5553,19.9187,87191865.0 +1881,2018-09-21,19.8653,20.0387,19.6913,19.828,55254180.0 +1882,2018-09-24,19.6667,20.2,19.572,19.912,56511855.0 +1883,2018-09-25,19.9333,20.3067,19.7667,20.0,52293330.0 +1884,2018-09-26,20.1333,20.926,20.0667,20.7,91873710.0 +1885,2018-09-27,20.6333,21.0,17.6667,18.06,95037525.0 +1886,2018-09-28,18.2007,18.5333,17.37,17.7333,403081170.0 +1887,2018-10-01,19.726,21.03,19.4333,20.3333,260729640.0 +1888,2018-10-02,20.5847,21.166,19.9433,20.2733,139184115.0 +1889,2018-10-03,20.3333,20.4333,19.438,19.654,96930465.0 +1890,2018-10-04,19.68,19.68,18.1333,18.35,114758670.0 +1891,2018-10-05,18.2673,18.35,17.3333,17.53,208825890.0 +1892,2018-10-08,17.5333,17.8507,16.6,17.03,153828015.0 +1893,2018-10-09,17.0,17.7847,16.8347,17.6507,141231210.0 +1894,2018-10-10,17.6507,17.766,16.518,16.8133,148776810.0 +1895,2018-10-11,17.0,17.4833,16.602,17.0,94547865.0 +1896,2018-10-12,17.0667,17.466,16.8007,17.2333,83192580.0 +1897,2018-10-15,17.148,17.552,16.9687,17.3,74660160.0 +1898,2018-10-16,17.3333,18.6,17.2747,18.6,107659140.0 +1899,2018-10-17,18.5833,18.8667,17.72,17.9347,101049495.0 +1900,2018-10-18,18.0,18.0667,17.5333,17.7213,62268090.0 +1901,2018-10-19,17.8333,17.99,16.9,17.304,110253090.0 +1902,2018-10-22,17.3993,17.5133,16.8393,17.3533,61455330.0 +1903,2018-10-23,17.2667,19.9,17.108,19.8467,224905620.0 +1904,2018-10-24,19.8,22.1333,19.0,21.12,235572405.0 +1905,2018-10-25,21.1333,21.666,20.0673,20.748,246957480.0 +1906,2018-10-26,20.4867,22.66,20.1247,21.7993,331244850.0 +1907,2018-10-29,21.6667,23.144,21.596,22.1013,177468000.0 +1908,2018-10-30,22.1013,22.5267,21.484,22.0333,111830760.0 +1909,2018-10-31,22.12,22.8,21.94,22.486,88997550.0 +1910,2018-11-01,22.6433,23.1893,22.3147,22.8,98076885.0 +1911,2018-11-02,23.1333,23.28,22.7273,23.034,96029265.0 +1912,2018-11-05,23.0,23.0,22.0093,22.7793,93116505.0 +1913,2018-11-06,22.6733,23.2533,22.406,22.8753,83178450.0 +1914,2018-11-07,22.9333,23.412,22.72,23.2053,82208655.0 +1915,2018-11-08,23.2667,23.8387,23.134,23.426,83512380.0 +1916,2018-11-09,23.2453,23.6,23.0153,23.3667,62071020.0 +1917,2018-11-12,23.3333,23.372,21.9,21.9,85421925.0 +1918,2018-11-13,22.1667,22.98,22.1467,22.7167,61718760.0 +1919,2018-11-14,22.52,23.1407,22.4733,22.8947,61075260.0 +1920,2018-11-15,23.0,23.2387,22.6027,23.1333,55608810.0 +1921,2018-11-16,23.0767,23.7133,22.9333,23.6267,83323110.0 +1922,2018-11-19,23.6833,24.45,23.4867,23.5933,117911925.0 +1923,2018-11-20,23.5,23.5,22.2367,23.1653,96513690.0 +1924,2018-11-21,23.3333,23.6,22.4767,22.56,55336395.0 +1925,2018-11-23,22.3333,22.5,21.6,21.6,50440110.0 +1926,2018-11-26,21.7333,23.0813,21.6533,22.8867,98172615.0 +1927,2018-11-27,22.8333,23.1307,22.3667,23.03,76446435.0 +1928,2018-11-28,23.0,23.2187,22.814,23.1327,50226975.0 +1929,2018-11-29,23.0333,23.1667,22.6367,22.7333,36297450.0 +1930,2018-11-30,22.6667,23.44,22.5507,23.38,67724880.0 +1931,2018-12-03,23.8,24.4,23.4667,23.8133,101594700.0 +1932,2018-12-04,23.7333,24.5787,23.4667,24.168,103683075.0 +1933,2018-12-06,23.8333,24.492,23.384,24.22,93603030.0 +1934,2018-12-07,24.522,25.2993,23.8333,24.0667,135610470.0 +1935,2018-12-10,23.9993,24.4,23.5413,24.2333,78864630.0 +1936,2018-12-11,24.3133,24.84,24.0153,24.5667,76196595.0 +1937,2018-12-12,24.638,24.794,24.344,24.526,60857985.0 +1938,2018-12-13,24.5333,25.1807,24.45,25.03,87478575.0 +1939,2018-12-14,24.96,25.1913,24.2887,24.4333,75673965.0 +1940,2018-12-17,24.4733,24.59,22.9253,23.3333,90968295.0 +1941,2018-12-18,23.5253,23.554,22.246,22.452,85943745.0 +1942,2018-12-19,22.4707,23.134,21.9827,22.0927,91612320.0 +1943,2018-12-20,22.08,22.2873,20.7907,20.97,112096500.0 +1944,2018-12-21,21.1033,21.5647,20.8293,21.1333,97661730.0 +1945,2018-12-24,21.5333,21.6,19.5333,19.5407,66350835.0 +1946,2018-12-26,19.4667,21.798,19.4667,21.6233,98012415.0 +1947,2018-12-27,21.478,21.5967,20.1,20.9,104624100.0 +1948,2018-12-28,20.9333,22.416,20.9333,22.2,121384305.0 +1949,2018-12-31,22.3067,22.706,21.684,22.2,78022320.0 +1950,2019-01-02,21.7333,22.1867,19.92,20.3767,138488085.0 +1951,2019-01-03,20.4327,20.6267,19.8253,19.9333,85079760.0 +1952,2019-01-04,20.3,21.2,20.182,21.2,89212035.0 +1953,2019-01-07,21.3333,22.4493,21.1833,22.3267,89667855.0 +1954,2019-01-08,22.3333,23.0,21.8013,22.3793,86465175.0 +1955,2019-01-09,22.344,22.9007,22.0667,22.5333,63893385.0 +1956,2019-01-10,22.386,23.026,22.1193,22.9333,72991995.0 +1957,2019-01-11,22.9333,23.2273,22.5847,23.1167,60942345.0 +1958,2019-01-14,22.9,22.9,22.228,22.316,63718830.0 +1959,2019-01-15,22.4267,23.2533,22.3,23.04,73060710.0 +1960,2019-01-16,22.9927,23.4667,22.9,23.0067,53209815.0 +1961,2019-01-17,22.95,23.4333,22.92,23.2133,44328525.0 +1962,2019-01-18,23.3333,23.3333,19.982,20.3133,289579830.0 +1963,2019-01-22,20.2667,20.5667,19.7,19.9407,146101185.0 +1964,2019-01-23,19.6267,19.7193,18.7793,19.1713,148002600.0 +1965,2019-01-24,19.1833,19.5787,18.6187,19.2667,92497140.0 +1966,2019-01-25,19.4653,19.9013,19.3033,19.7413,83032155.0 +1967,2019-01-28,19.6867,19.85,19.1833,19.6407,75093600.0 +1968,2019-01-29,19.6,19.9293,19.4533,19.8727,55303035.0 +1969,2019-01-30,19.9527,21.2,19.3673,19.6,128510025.0 +1970,2019-01-31,19.7407,20.7713,19.4767,20.3073,150214920.0 +1971,2019-02-01,20.396,21.0733,20.2333,20.8,88314525.0 +1972,2019-02-04,20.7327,21.02,20.1253,20.8213,91278885.0 +1973,2019-02-05,20.8327,21.496,20.7707,21.4327,80787765.0 +1974,2019-02-06,21.4233,21.616,21.0413,21.1333,61091385.0 +1975,2019-02-07,21.0667,21.0807,20.2,20.4027,79000440.0 +1976,2019-02-08,20.308,20.53,19.9,20.3433,69815910.0 +1977,2019-02-11,20.3887,21.24,20.3887,20.8333,88060125.0 +1978,2019-02-12,21.0667,21.2127,20.6413,20.7,65880930.0 +1979,2019-02-13,20.8147,20.9,20.3713,20.48,59951655.0 +1980,2019-02-14,20.5147,20.58,20.0667,20.2333,61683570.0 +1981,2019-02-15,20.3,20.5587,20.26,20.5293,46719975.0 +1982,2019-02-19,20.4667,20.77,20.3007,20.44,48097965.0 +1983,2019-02-20,20.4833,20.614,19.9167,20.1467,84401340.0 +1984,2019-02-21,20.1927,20.24,19.3667,19.4933,107646420.0 +1985,2019-02-22,19.6,19.7667,19.4153,19.6667,68671965.0 +1986,2019-02-25,19.7793,20.194,18.8327,19.2,81461385.0 +1987,2019-02-26,19.2333,20.134,19.164,19.868,104134410.0 +1988,2019-02-27,19.8307,21.0867,19.8307,21.0307,137486940.0 +1989,2019-02-28,21.0307,21.578,20.4533,20.6267,128665170.0 +1990,2019-03-01,20.6667,20.6667,19.46,19.6027,274694670.0 +1991,2019-03-04,19.8,20.0513,18.852,19.062,200186820.0 +1992,2019-03-05,19.1587,19.2333,18.0067,18.4833,224784825.0 +1993,2019-03-06,18.5333,18.7673,18.2927,18.4533,130688295.0 +1994,2019-03-07,18.4,18.98,18.2833,18.6333,117750495.0 +1995,2019-03-08,18.5867,19.0393,18.222,18.96,109426785.0 +1996,2019-03-11,19.0667,19.4187,18.64,19.35,91647090.0 +1997,2019-03-12,19.35,19.4433,18.7373,18.8567,94183110.0 +1998,2019-03-13,18.7673,19.466,18.74,19.29,84463050.0 +1999,2019-03-14,19.3327,19.6927,19.076,19.2467,87638685.0 +2000,2019-03-15,19.1333,19.1333,18.2933,18.358,181501410.0 +2001,2019-03-18,18.5,18.5367,17.82,17.9,126356685.0 +2002,2019-03-19,17.8733,18.22,17.564,17.8767,147554025.0 +2003,2019-03-20,17.926,18.3313,17.7533,18.2633,87481035.0 +2004,2019-03-21,18.2607,18.43,17.8967,18.3267,73793190.0 +2005,2019-03-22,18.324,18.3933,17.6,17.6233,107444580.0 +2006,2019-03-25,17.5753,17.6,16.964,17.424,125519295.0 +2007,2019-03-26,17.5153,18.0173,17.5153,17.8833,90114720.0 +2008,2019-03-27,17.9,18.358,17.764,18.3173,111765915.0 +2009,2019-03-28,18.322,18.6887,18.2753,18.6267,84429480.0 +2010,2019-03-29,18.608,18.6773,18.3,18.6533,74496975.0 +2011,2019-04-01,18.8133,19.28,18.7333,19.2133,100487535.0 +2012,2019-04-02,19.2067,19.296,18.9253,19.1567,67021665.0 +2013,2019-04-03,19.252,19.7447,19.0733,19.428,98939940.0 +2014,2019-04-04,18.322,18.4,17.34,17.8667,265556415.0 +2015,2019-04-05,17.9733,18.4067,17.7407,18.3267,155499960.0 +2016,2019-04-08,18.4333,18.744,18.0293,18.2667,129487440.0 +2017,2019-04-09,18.314,18.3333,17.974,18.154,72568875.0 +2018,2019-04-10,18.2333,18.65,18.184,18.44,87333435.0 +2019,2019-04-11,18.3953,18.45,17.5467,17.9267,115465245.0 +2020,2019-04-12,17.9467,18.13,17.7887,17.8347,83273295.0 +2021,2019-04-15,17.8333,17.93,17.242,17.7667,121678560.0 +2022,2019-04-16,17.7973,18.3333,17.648,18.1867,89589750.0 +2023,2019-04-17,18.3133,18.3267,17.902,18.08,61218300.0 +2024,2019-04-18,18.0,18.3227,17.8993,18.1987,65756700.0 +2025,2019-04-22,17.9933,17.9933,17.4813,17.5033,150683310.0 +2026,2019-04-23,17.5867,17.7067,17.05,17.5867,131710980.0 +2027,2019-04-24,17.5733,17.7333,16.7027,17.2167,127073520.0 +2028,2019-04-25,17.0467,17.2667,16.4047,16.486,265586880.0 +2029,2019-04-26,16.5467,16.636,15.4087,15.866,272603400.0 +2030,2019-04-29,15.9127,16.2653,15.478,16.0313,211597680.0 +2031,2019-04-30,16.0487,16.2807,15.8,15.9233,114634905.0 +2032,2019-05-01,15.9133,16.0,15.4333,15.5833,130472910.0 +2033,2019-05-02,15.596,16.6367,15.3667,16.3667,221207520.0 +2034,2019-05-03,16.4653,17.1073,16.0667,17.0,285771600.0 +2035,2019-05-06,16.6667,17.2233,16.4913,16.9407,129715710.0 +2036,2019-05-07,17.022,17.2833,16.34,16.4733,121401255.0 +2037,2019-05-08,16.6487,16.7067,16.208,16.2207,70776975.0 +2038,2019-05-09,16.1733,16.2453,15.796,16.0773,79827930.0 +2039,2019-05-10,16.132,16.1973,15.7347,15.9333,85723890.0 +2040,2019-05-13,15.8213,16.0073,14.9667,15.0833,123465510.0 +2041,2019-05-14,15.1833,15.6333,15.1653,15.4833,83553315.0 +2042,2019-05-15,15.5333,15.5727,15.0167,15.4067,87076290.0 +2043,2019-05-16,15.39,15.5327,15.1,15.18,85589625.0 +2044,2019-05-17,15.1333,15.1467,13.928,14.0007,213667560.0 +2045,2019-05-20,14.0,14.1187,13.0167,13.622,241324890.0 +2046,2019-05-21,13.5987,13.8267,13.0693,13.4467,221423400.0 +2047,2019-05-22,13.3867,13.6667,12.7073,12.71,223585785.0 +2048,2019-05-23,12.6533,13.3067,12.1253,13.0633,313514490.0 +2049,2019-05-24,13.1993,13.5807,12.5833,12.6467,172574760.0 +2050,2019-05-28,12.7907,13.0,12.5233,12.6327,121369680.0 +2051,2019-05-29,12.5573,12.826,12.336,12.6773,147665835.0 +2052,2019-05-30,12.6,12.8173,12.468,12.484,96234330.0 +2053,2019-05-31,12.4533,12.662,12.2,12.396,126511080.0 +2054,2019-06-03,12.2773,12.4453,11.7993,11.9633,162149595.0 +2055,2019-06-04,11.9933,12.9867,11.974,12.9473,168287700.0 +2056,2019-06-05,13.0773,13.4187,12.7893,13.0387,170547300.0 +2057,2019-06-06,13.2133,14.0667,13.106,13.76,239261910.0 +2058,2019-06-07,13.8293,14.0567,13.566,13.6107,185291190.0 +2059,2019-06-10,13.6753,14.4627,13.6753,14.35,120507465.0 +2060,2019-06-11,14.4333,15.2493,14.2333,15.0207,136661955.0 +2061,2019-06-12,15.0207,15.0967,13.9067,13.9867,182775390.0 +2062,2019-06-13,14.0,14.3267,13.834,14.1653,101617290.0 +2063,2019-06-14,14.2147,14.4433,13.9413,14.3327,88657065.0 +2064,2019-06-17,14.4193,15.1333,14.2733,15.0333,149330235.0 +2065,2019-06-18,15.0833,15.6493,14.8373,15.0133,152172840.0 +2066,2019-06-19,15.0887,15.1847,14.7373,15.1307,79817250.0 +2067,2019-06-20,15.2,15.3493,14.4233,14.6333,145668465.0 +2068,2019-06-21,14.6267,14.812,14.3667,14.7667,91318920.0 +2069,2019-06-24,14.7667,15.0573,14.7347,14.9533,69803340.0 +2070,2019-06-25,14.9007,15.0227,14.6327,14.6733,71846805.0 +2071,2019-06-26,14.7993,15.1487,14.4353,14.5587,101637405.0 +2072,2019-06-27,14.5593,14.8793,14.4747,14.8533,73779210.0 +2073,2019-06-28,14.814,15.0113,14.6753,14.93,76459620.0 +2074,2019-07-01,15.1133,15.54,15.0853,15.2,102639255.0 +2075,2019-07-02,15.2,16.3327,14.8147,16.0333,112517325.0 +2076,2019-07-03,15.9333,16.1333,15.6,15.6233,171219210.0 +2077,2019-07-05,15.6913,15.7147,15.3867,15.5167,85099530.0 +2078,2019-07-08,15.5333,15.5333,15.244,15.35,71488095.0 +2079,2019-07-09,15.28,15.4,15.152,15.35,74145135.0 +2080,2019-07-10,15.4,15.9333,15.3753,15.92,109079265.0 +2081,2019-07-11,15.9393,16.1,15.72,15.8733,87319530.0 +2082,2019-07-12,15.902,16.4127,15.902,16.4127,95006310.0 +2083,2019-07-15,16.4667,16.9613,16.324,16.8533,129415845.0 +2084,2019-07-16,16.8333,16.902,16.5287,16.7833,94476000.0 +2085,2019-07-17,16.8253,17.2207,16.8253,16.96,105617190.0 +2086,2019-07-18,16.972,17.05,16.792,16.9667,56868000.0 +2087,2019-07-19,16.9973,17.3307,16.9747,17.1913,85749975.0 +2088,2019-07-22,17.2,17.48,16.946,17.0667,83095470.0 +2089,2019-07-23,17.1,17.3653,16.9667,17.3127,54661110.0 +2090,2019-07-24,17.3167,17.88,15.5333,15.7133,130306335.0 +2091,2019-07-25,15.72,15.8,15.0367,15.1693,270950850.0 +2092,2019-07-26,15.2453,15.3507,14.8167,15.1407,118829130.0 +2093,2019-07-29,15.1667,15.7293,15.0,15.6747,113923785.0 +2094,2019-07-30,15.6747,16.224,15.4467,16.102,96458760.0 +2095,2019-07-31,16.1347,16.4453,15.7767,16.0727,111596460.0 +2096,2019-08-01,16.154,16.3007,15.4513,15.5467,98159715.0 +2097,2019-10-10,16.2667,16.6187,16.1053,16.3933,71848110.0 +2098,2019-10-11,16.438,16.7387,16.316,16.5667,99881625.0 +2099,2019-10-14,16.4853,17.2367,16.4667,17.1507,120297450.0 +2100,2019-10-15,17.1433,17.3333,16.9413,17.1667,74867415.0 +2101,2019-10-16,17.1333,17.4733,17.0667,17.32,76111920.0 +2102,2019-10-17,17.3587,17.652,17.2667,17.46,54637350.0 +2103,2019-10-18,17.42,17.52,17.0067,17.1067,67372005.0 +2104,2019-10-21,17.2,17.3,16.6787,16.964,59437185.0 +2105,2019-10-22,16.9133,17.222,16.7233,17.0,51015450.0 +2106,2019-10-23,16.928,20.5667,16.7567,20.4,126354015.0 +2107,2019-10-24,20.074,20.3287,19.28,19.9333,333785415.0 +2108,2019-10-25,19.816,22.0,19.7407,21.828,346900110.0 +2109,2019-10-28,21.82,22.7227,21.5067,21.8533,217401990.0 +2110,2019-10-29,21.8,21.8,20.9333,20.972,148391235.0 +2111,2019-10-30,20.8,21.2527,20.6647,21.0267,110357760.0 +2112,2019-10-31,21.0,21.2667,20.85,20.968,57293355.0 +2113,2019-11-01,21.01,21.158,20.6533,20.87,74996490.0 +2114,2019-11-04,20.9333,21.4627,20.6173,21.19,107054385.0 +2115,2019-11-05,21.268,21.5673,21.074,21.1407,80141085.0 +2116,2019-11-06,21.1267,21.8033,20.9667,21.742,94473615.0 +2117,2019-11-07,21.8373,22.7667,21.8373,22.412,170876115.0 +2118,2019-11-08,22.3333,22.4973,22.1667,22.45,70916190.0 +2119,2019-11-11,22.3873,23.2793,22.3667,23.0087,115064865.0 +2120,2019-11-12,23.0333,23.358,22.936,23.3133,83768280.0 +2121,2019-11-13,23.4,23.7867,23.012,23.0667,95754555.0 +2122,2019-11-14,23.0073,23.5893,22.8607,23.28,73642995.0 +2123,2019-11-15,23.3467,23.52,23.224,23.4547,53228490.0 +2124,2019-11-18,23.4547,23.6467,23.0733,23.3327,47569800.0 +2125,2019-11-19,23.3373,23.9993,23.1867,23.934,88743975.0 +2126,2019-11-20,23.8533,24.1807,23.3047,23.4733,73837815.0 +2127,2019-11-21,23.4813,24.056,23.4813,23.8067,67119255.0 +2128,2019-11-22,23.3933,23.6553,22.0,22.2067,185281845.0 +2129,2019-11-25,22.84,23.3073,22.2973,22.4293,136063125.0 +2130,2019-11-26,22.4613,22.4613,21.8067,21.9867,85639260.0 +2131,2019-11-27,21.9867,22.262,21.9047,22.0,60248265.0 +2132,2019-11-29,22.0713,22.2,21.8333,22.0027,26162310.0 +2133,2019-12-02,22.0933,22.426,21.9,22.25,65817750.0 +2134,2019-12-03,22.4087,22.5667,22.0333,22.4253,71516535.0 +2135,2019-12-04,22.4327,22.5747,22.186,22.2187,52213935.0 +2136,2019-12-05,22.2347,22.3333,21.8167,22.26,39315060.0 +2137,2019-12-06,22.2667,22.5907,22.2667,22.3927,87443550.0 +2138,2019-12-09,22.4,22.9633,22.3387,22.6527,97238610.0 +2139,2019-12-10,22.6353,23.382,22.4667,23.2667,94475535.0 +2140,2019-12-11,23.276,23.8127,23.276,23.6387,75745965.0 +2141,2019-12-12,23.6667,24.1827,23.5487,24.04,86341350.0 +2142,2019-12-13,24.08,24.3473,23.6427,23.9187,73028070.0 +2143,2019-12-16,23.9333,25.574,23.9333,25.204,196900605.0 +2144,2019-12-17,25.3127,25.7,25.06,25.268,88895370.0 +2145,2019-12-18,25.1333,26.348,25.1333,26.24,159076170.0 +2146,2019-12-19,26.1447,27.1233,26.12,26.992,195368595.0 +2147,2019-12-20,27.0,27.5333,26.6787,27.0667,162292950.0 +2148,2019-12-23,27.2007,28.134,27.2007,27.9793,147161505.0 +2149,2019-12-24,28.0653,28.392,27.512,28.3533,92001720.0 +2150,2019-12-26,28.3533,28.8987,28.3533,28.7667,118997565.0 +2151,2019-12-27,28.772,29.1453,28.4073,28.7167,110319030.0 +2152,2019-12-30,28.7847,28.89,27.2833,27.4833,140912100.0 +2153,2019-12-31,27.6,28.086,26.8053,27.9,115227540.0 +2154,2020-01-02,28.0607,28.7993,27.8887,28.7867,105742830.0 +2155,2020-01-03,28.4267,30.2667,28.1007,29.4607,201368895.0 +2156,2020-01-06,29.2007,30.1333,29.1667,30.1333,114317175.0 +2157,2020-01-07,30.2633,31.442,30.1673,30.5,200288085.0 +2158,2020-01-08,31.06,33.2327,30.9187,33.07,348554655.0 +2159,2020-01-09,32.68,33.2867,31.5247,32.008,308683530.0 +2160,2020-01-10,32.2667,32.6167,31.58,31.866,142140990.0 +2161,2020-01-13,32.206,35.496,32.206,35.4413,296673120.0 +2162,2020-01-14,35.428,36.5,34.9933,35.7653,313603800.0 +2163,2020-01-15,35.8667,35.8667,34.452,34.65,189689685.0 +2164,2020-01-16,33.5533,34.2973,32.8113,34.174,234395160.0 +2165,2020-01-17,34.2687,34.5533,33.2587,33.6067,149312700.0 +2166,2020-01-21,33.8733,37.0067,33.7733,36.95,189698280.0 +2167,2020-01-22,37.134,39.6333,37.134,38.1333,324324630.0 +2168,2020-01-23,37.97,38.8,37.0367,38.0407,203213130.0 +2169,2020-01-24,38.296,38.6533,36.9507,37.2667,148648650.0 +2170,2020-01-27,36.92,37.6293,35.9207,37.3333,139065495.0 +2171,2020-01-28,37.442,38.454,37.2053,38.1,125302140.0 +2172,2020-01-29,38.148,43.9867,37.8287,43.2333,183743490.0 +2173,2020-01-30,42.74,43.392,41.2,42.9407,273085440.0 +2174,2020-01-31,42.6667,43.5333,42.0013,43.05,158981265.0 +2175,2020-02-03,43.2667,52.4533,43.0067,51.0667,475263390.0 +2176,2020-02-04,52.3667,64.5993,52.3667,60.2667,552886995.0 +2177,2020-02-05,56.6667,58.9333,46.9407,48.5,464742915.0 +2178,2020-02-06,49.0,53.0553,45.8,49.4,383700900.0 +2179,2020-02-07,49.2,51.3167,48.2,49.7073,168028710.0 +2180,2020-02-10,50.3333,54.666,50.16,51.5733,240893220.0 +2181,2020-02-11,52.2,52.432,50.5333,51.3333,115196955.0 +2182,2020-02-12,51.9993,52.65,49.55,50.1333,117541665.0 +2183,2020-02-13,50.0667,54.5333,47.4667,53.3333,259599570.0 +2184,2020-02-14,53.6,54.2,51.6667,53.5,160881435.0 +2185,2020-02-18,52.5333,59.3193,51.6673,58.8007,168671805.0 +2186,2020-02-19,59.3333,62.9853,59.3333,60.47,249771750.0 +2187,2020-02-20,60.6333,61.08,57.3287,59.3333,181159170.0 +2188,2020-02-21,60.3133,61.2,58.6,59.9213,149621535.0 +2189,2020-02-24,58.2327,58.234,54.8133,56.2667,148606905.0 +2190,2020-02-25,56.3333,57.1067,52.4667,52.7333,168777675.0 +2191,2020-02-26,52.1707,54.2207,50.6467,51.2667,136474050.0 +2192,2020-02-27,51.2,51.532,42.8333,43.668,249019995.0 +2193,2020-02-28,43.0,46.0347,40.768,44.9987,257814675.0 +2194,2020-03-02,47.1507,51.3333,44.1333,51.2667,206093775.0 +2195,2020-03-03,51.8447,54.6793,47.7407,48.7333,250127055.0 +2196,2020-03-04,50.3333,52.734,48.3153,49.62,154058295.0 +2197,2020-03-05,49.0733,49.7167,47.4673,48.0,108482445.0 +2198,2020-03-06,47.2,47.4667,45.1327,46.05,123425130.0 +2199,2020-03-09,43.6447,44.2,40.0,42.3867,175009290.0 +2200,2020-03-10,42.8873,45.4,40.5333,41.6867,161919360.0 +2201,2020-03-11,41.6,43.572,40.8667,42.2067,140357565.0 +2202,2020-03-12,40.566,40.7433,34.08,34.6,197614035.0 +2203,2020-03-13,37.4667,40.5307,33.4667,35.6,239295285.0 +2204,2020-03-16,33.7667,33.7667,28.6667,30.2,221492175.0 +2205,2020-03-17,31.4667,32.1333,26.4,27.1707,261417435.0 +2206,2020-03-18,26.8667,26.9907,23.3673,24.8667,265132005.0 +2207,2020-03-19,24.3333,30.1333,23.4,26.2667,328591200.0 +2208,2020-03-20,28.0,31.8,27.8387,28.252,307001235.0 +2209,2020-03-23,27.66,30.2,27.0667,29.692,178044150.0 +2210,2020-03-24,30.3333,35.6,30.1467,33.9987,237852525.0 +2211,2020-03-25,36.5333,37.9333,33.9933,36.0007,218541390.0 +2212,2020-03-26,35.2433,37.3333,34.15,35.1333,179456955.0 +2213,2020-03-27,34.5307,35.0533,32.9353,33.9333,148377030.0 +2214,2020-03-30,33.6667,34.76,32.7487,33.5333,119682195.0 +2215,2020-03-31,33.9333,36.1973,33.0067,34.3667,188997660.0 +2216,2020-04-01,33.7253,34.264,31.6733,32.3727,138967425.0 +2217,2020-04-02,32.6,36.5313,29.76,35.6667,203988075.0 +2218,2020-04-03,35.2,35.4,31.226,31.6667,241104990.0 +2219,2020-04-06,33.6667,34.7333,33.1973,34.2,150877275.0 +2220,2020-04-07,35.3333,37.6667,35.2227,36.658,187243695.0 +2221,2020-04-08,36.5847,37.7333,35.5553,36.7293,135389595.0 +2222,2020-04-09,37.036,39.8,36.094,39.6333,140315520.0 +2223,2020-04-13,39.2,45.22,38.414,44.8987,232627920.0 +2224,2020-04-14,45.3433,49.9993,45.0733,49.7667,300642825.0 +2225,2020-04-15,49.3993,50.8,47.3333,47.5667,231622050.0 +2226,2020-04-16,48.7773,52.7333,47.114,51.6667,211446420.0 +2227,2020-04-17,51.8,52.3587,49.844,50.102,132770940.0 +2228,2020-04-20,50.08,51.038,47.4807,49.8667,152149290.0 +2229,2020-04-21,49.2,50.222,44.9193,46.0007,202718685.0 +2230,2020-04-22,46.8,49.344,45.2327,48.2533,145122495.0 +2231,2020-04-23,48.4,49.1267,46.4,46.4613,136673115.0 +2232,2020-04-24,46.4667,48.7153,46.4667,48.3333,139092495.0 +2233,2020-04-27,49.07,53.7787,48.9673,52.1373,202881945.0 +2234,2020-04-28,52.4733,53.6667,50.446,51.786,155158260.0 +2235,2020-04-29,52.1333,59.126,51.0067,58.0667,158846565.0 +2236,2020-04-30,57.6333,58.4,50.6667,51.0,272728890.0 +2237,2020-05-01,50.9733,51.518,45.536,47.2,325839930.0 +2238,2020-05-04,47.2,51.2667,45.4667,51.2667,191118300.0 +2239,2020-05-05,52.1333,53.2613,50.812,51.6333,175710750.0 +2240,2020-05-06,51.9967,52.6533,50.7407,51.9667,113329740.0 +2241,2020-05-07,52.3407,53.0933,51.1333,52.2333,118667010.0 +2242,2020-05-08,52.4333,55.0667,52.4327,54.6,160369815.0 +2243,2020-05-11,54.0333,54.9333,52.3333,54.0807,171898425.0 +2244,2020-05-12,53.8573,56.2193,52.9933,53.0267,163140435.0 +2245,2020-05-13,53.5773,55.1733,50.8867,53.3193,197153685.0 +2246,2020-05-14,53.3333,53.9333,50.9333,53.5333,134271540.0 +2247,2020-05-15,53.7333,53.7333,52.1633,53.24,107025660.0 +2248,2020-05-18,54.018,55.6487,53.592,54.1,119931690.0 +2249,2020-05-19,54.5333,54.8047,53.6667,54.0733,98436405.0 +2250,2020-05-20,54.4,55.0667,54.12,54.3007,70987260.0 +2251,2020-05-21,54.078,55.5,53.0667,55.0333,125158530.0 +2252,2020-05-22,54.4667,55.452,54.1333,54.5067,102896430.0 +2253,2020-05-26,55.6293,55.92,54.38,54.6653,77548890.0 +2254,2020-05-27,54.4667,55.1807,52.3333,54.2933,115787835.0 +2255,2020-05-28,54.2833,54.9833,53.446,53.8,73302210.0 +2256,2020-05-29,54.1587,56.1833,53.614,56.1833,122263095.0 +2257,2020-06-01,56.6667,60.2,56.6,59.1333,145189200.0 +2258,2020-06-02,59.2333,60.5773,58.0667,58.8,132256140.0 +2259,2020-06-03,58.8,59.8627,58.6733,58.8747,80101050.0 +2260,2020-06-04,59.0513,59.7167,57.2293,57.7333,88832985.0 +2261,2020-06-05,58.2907,59.1227,57.7467,58.99,78301965.0 +2262,2020-06-08,58.6667,63.8327,58.6,62.9667,141366735.0 +2263,2020-06-09,62.6667,63.6293,61.5953,62.466,115863015.0 +2264,2020-06-10,62.6,68.8,62.3333,67.3,174956610.0 +2265,2020-06-11,66.6667,67.9307,64.276,65.0,156858300.0 +2266,2020-06-12,63.8627,66.134,60.8373,61.2367,162138555.0 +2267,2020-06-15,60.2,66.5893,59.7607,66.2707,155522580.0 +2268,2020-06-16,66.6,67.99,64.1593,65.2667,133777140.0 +2269,2020-06-17,65.8667,67.0,65.134,65.7667,100027320.0 +2270,2020-06-18,66.4,67.9467,66.298,67.466,97189380.0 +2271,2020-06-19,67.5653,67.9833,66.0667,66.1267,83171715.0 +2272,2020-06-22,66.7827,67.2587,66.0013,66.6,64500420.0 +2273,2020-06-23,66.846,67.4667,66.2673,66.4667,64613580.0 +2274,2020-06-24,66.2673,66.726,63.4,63.4,106925520.0 +2275,2020-06-25,63.3333,66.1867,62.4767,66.1333,92884695.0 +2276,2020-06-26,65.7753,66.5333,63.658,63.7267,83687025.0 +2277,2020-06-29,64.2667,67.4267,63.2347,67.1667,85269270.0 +2278,2020-06-30,66.9087,72.5127,66.7333,71.6867,166442490.0 +2279,2020-07-01,72.194,75.95,71.0667,75.866,123111735.0 +2280,2020-07-02,76.3847,82.1333,76.3847,80.88,154935240.0 +2281,2020-07-06,83.34,95.7967,82.8673,95.484,175538805.0 +2282,2020-07-07,95.1933,95.3,89.114,92.0667,167984835.0 +2283,2020-07-08,92.0773,94.484,87.4227,90.7353,137422935.0 +2284,2020-07-09,91.6667,93.9047,90.0853,92.9,99822150.0 +2285,2020-07-10,92.5333,103.5327,91.734,102.8,196613790.0 +2286,2020-07-13,105.6433,119.666,96.6667,101.9333,293325390.0 +2287,2020-07-14,102.5353,107.5247,95.4,104.402,191646180.0 +2288,2020-07-15,105.0667,106.332,97.1327,100.7333,128684670.0 +2289,2020-07-16,100.32,102.114,96.2673,99.2027,124492275.0 +2290,2020-07-17,99.8593,102.5007,99.3333,100.452,78639675.0 +2291,2020-07-20,99.8293,111.7267,99.2,110.8667,137656275.0 +2292,2020-07-21,112.0,113.2,103.8667,105.3333,131882220.0 +2293,2020-07-22,105.6667,114.4313,103.5933,110.4667,106352115.0 +2294,2020-07-23,112.0013,112.6,98.706,98.966,187476870.0 +2295,2020-07-24,98.0973,98.132,91.1027,93.4667,157381425.0 +2296,2020-07-27,94.7667,103.2667,91.6667,102.8667,129609780.0 +2297,2020-07-28,101.0667,104.314,98.0053,98.084,135868020.0 +2298,2020-07-29,99.2013,102.3207,98.4327,100.0767,81939615.0 +2299,2020-07-30,99.52,100.8833,98.008,100.4,65301720.0 +2300,2020-07-31,99.9733,101.8667,94.732,95.0333,103662660.0 +2301,2020-08-03,96.6667,100.6547,96.2,99.0,73760145.0 +2302,2020-08-04,99.01,101.8273,97.4667,99.4667,72451020.0 +2303,2020-08-05,100.0,100.5333,97.8873,98.8,40635945.0 +2304,2020-08-06,98.5333,101.154,98.1727,99.4933,49976850.0 +2305,2020-08-07,99.0,100.1987,94.334,96.7333,72015780.0 +2306,2020-08-10,96.9987,97.2653,92.3893,94.2,60084135.0 +2307,2020-08-11,95.1993,99.3333,90.9993,97.5487,67698210.0 +2308,2020-08-12,97.7433,105.6667,95.6667,104.3333,173744580.0 +2309,2020-08-13,104.7333,110.0,104.132,109.0,165591105.0 +2310,2020-08-14,108.8667,112.2667,108.4427,109.754,101037135.0 +2311,2020-08-17,110.82,123.0573,110.82,122.4,156188385.0 +2312,2020-08-18,123.9253,129.2673,122.376,126.3333,123741405.0 +2313,2020-08-19,127.2,127.8,122.7473,124.6667,94184685.0 +2314,2020-08-20,124.6,134.7993,123.7333,133.9993,159074805.0 +2315,2020-08-21,135.9967,139.6993,134.2013,136.1667,166461210.0 +2316,2020-08-24,138.6673,142.6667,128.5313,133.3347,150696765.0 +2317,2020-08-25,135.4667,136.6,130.9333,136.5333,80517750.0 +2318,2020-08-26,136.9333,144.8833,135.7333,142.8,105153030.0 +2319,2020-08-27,143.6,153.04,142.5333,149.8,180878220.0 +2320,2020-08-28,150.666,154.566,145.8373,147.7993,145062675.0 +2321,2020-08-31,156.0333,172.6667,146.0333,171.5833,248705622.0 +2322,2020-09-01,176.68,179.5833,156.8367,160.33,177822417.0 +2323,2020-09-02,162.0067,164.2667,135.04,145.7533,188849097.0 +2324,2020-09-03,146.0,146.1,126.6667,126.8,180565761.0 +2325,2020-09-04,131.5,142.6667,124.0067,130.5,231814941.0 +2326,2020-09-08,130.3333,131.6667,102.6667,108.05,247260840.0 +2327,2020-09-09,113.3,125.2667,112.5767,124.9933,168193332.0 +2328,2020-09-10,122.0,132.9967,120.1667,125.2,188312610.0 +2329,2020-09-11,127.3333,129.52,120.1667,124.5833,137663229.0 +2330,2020-09-14,127.7333,142.9167,124.4333,141.15,181388055.0 +2331,2020-09-15,142.7733,153.98,141.75,148.6667,210951363.0 +2332,2020-09-16,151.6667,152.6167,144.4467,148.2467,165125403.0 +2333,2020-09-17,142.88,147.2533,136.0,141.2333,170581353.0 +2334,2020-09-18,142.6667,150.3333,142.1533,149.8333,191458605.0 +2335,2020-09-21,148.2333,151.9,135.69,141.0133,235264287.0 +2336,2020-09-22,143.5767,149.3333,130.5033,131.6933,168209415.0 +2337,2020-09-23,132.9267,141.3767,121.67,122.61,197688879.0 +2338,2020-09-24,124.62,133.1667,117.1,131.25,219102480.0 +2339,2020-09-25,130.5,136.4733,128.3667,135.2667,148599174.0 +2340,2020-09-28,138.68,142.7567,138.3333,139.9333,102743079.0 +2341,2020-09-29,139.6967,142.8167,135.3333,139.4033,105701094.0 +2342,2020-09-30,138.0,144.6433,137.0033,143.9,101027403.0 +2343,2020-10-01,144.6667,149.6267,144.4467,147.6,108278334.0 +2344,2020-10-02,143.3233,146.3767,135.8333,137.0667,153489573.0 +2345,2020-10-05,141.41,144.5467,138.7067,140.7267,95763156.0 +2346,2020-10-06,140.6667,142.9267,135.35,137.74,106731042.0 +2347,2020-10-07,139.65,143.3,137.95,142.45,93197385.0 +2348,2020-10-08,143.5,146.3967,141.7667,143.25,87453252.0 +2349,2020-10-09,143.25,144.8633,142.1533,144.8233,62810682.0 +2350,2020-10-12,145.49,149.58,145.0267,147.3967,83716995.0 +2351,2020-10-13,147.1667,149.63,145.5333,149.3067,73758798.0 +2352,2020-10-14,149.3333,155.3,148.5,153.45,103619673.0 +2353,2020-10-15,150.9833,153.3333,147.34,148.9167,76002600.0 +2354,2020-10-16,149.6267,151.9833,145.6667,146.0667,70403769.0 +2355,2020-10-19,148.6667,149.5833,142.9567,144.4833,79414086.0 +2356,2020-10-20,145.3,146.2767,139.6833,141.5333,66908925.0 +2357,2020-10-21,141.6,147.2833,140.0033,145.4367,65343702.0 +2358,2020-10-22,145.65,148.6667,141.5033,142.1633,85645152.0 +2359,2020-10-23,142.28,142.28,135.7933,140.1667,68631111.0 +2360,2020-10-26,137.6667,141.92,136.6667,138.8333,60391515.0 +2361,2020-10-27,139.0,143.5,139.0,140.55,47481831.0 +2362,2020-10-28,140.0,140.4,134.3733,135.8367,50498646.0 +2363,2020-10-29,137.1333,139.3533,135.1,135.5333,46622136.0 +2364,2020-10-30,134.3433,136.9433,126.37,129.0,87711978.0 +2365,2020-11-02,130.2667,135.66,129.0,133.6667,62289972.0 +2366,2020-11-03,134.1033,142.59,134.1033,141.5333,74676897.0 +2367,2020-11-04,141.3,145.8833,139.0333,140.8,66091209.0 +2368,2020-11-05,143.0333,146.6667,141.3333,144.1333,59458839.0 +2369,2020-11-06,142.7867,146.03,141.4267,143.3,47468925.0 +2370,2020-11-09,146.47,150.8333,140.3333,141.3333,72391911.0 +2371,2020-11-10,141.3333,141.3433,132.01,136.3333,62105277.0 +2372,2020-11-11,138.3333,139.5667,136.7833,138.9367,36576201.0 +2373,2020-11-12,138.8333,141.0,136.5067,137.0,39151536.0 +2374,2020-11-13,136.0233,137.9833,133.8867,136.04,39364200.0 +2375,2020-11-16,136.6667,155.8333,134.6933,153.9733,52552809.0 +2376,2020-11-17,150.5667,155.5667,144.3367,146.1,126524304.0 +2377,2020-11-18,150.4033,165.3333,147.26,160.6633,163818360.0 +2378,2020-11-19,160.0233,169.54,159.3367,164.3333,130075530.0 +2379,2020-11-20,166.1167,167.5,163.0033,163.5333,68026170.0 +2380,2020-11-23,165.16,177.4467,165.16,176.6667,103891680.0 +2381,2020-11-24,178.0,188.27,173.7333,187.4667,111214107.0 +2382,2020-11-25,189.3333,192.1533,181.0,191.6667,100834929.0 +2383,2020-11-27,191.3333,199.5933,187.27,194.9233,76762173.0 +2384,2020-11-30,196.3333,202.6,184.8367,197.3667,131103393.0 +2385,2020-12-01,197.3667,199.7667,190.6833,191.8267,81546585.0 +2386,2020-12-02,191.6667,196.8367,180.4033,194.31,96274566.0 +2387,2020-12-03,195.0,199.6567,189.6067,197.7233,86454540.0 +2388,2020-12-04,198.72,200.8967,195.1667,199.5667,59674344.0 +2389,2020-12-07,199.0,216.4833,198.3333,216.4133,116487387.0 +2390,2020-12-08,218.2533,223.0,204.93,215.4,132180669.0 +2391,2020-12-09,215.3967,219.64,196.0,197.0067,137626977.0 +2392,2020-12-10,199.0333,212.0367,188.78,208.3,139451475.0 +2393,2020-12-11,205.4333,208.0,198.9333,202.5467,95785260.0 +2394,2020-12-14,203.3333,214.25,203.3333,212.0,110166885.0 +2395,2020-12-15,213.1,216.0667,207.9333,209.1333,97244397.0 +2396,2020-12-16,211.6667,211.6667,201.6667,206.8667,87571866.0 +2397,2020-12-17,206.9,219.6067,205.8333,216.0,117472365.0 +2398,2020-12-18,217.1,231.6667,209.5667,225.6667,453121770.0 +2399,2020-12-21,218.3333,231.6667,215.2033,216.6,115350915.0 +2400,2020-12-22,217.45,219.5,204.7433,211.4433,104906727.0 +2401,2020-12-23,212.55,217.1667,207.5233,214.1667,67952889.0 +2402,2020-12-24,214.1667,222.03,213.6667,220.0,46317783.0 +2403,2020-12-28,220.6667,227.1333,219.9,220.0,66460887.0 +2404,2020-12-29,221.6667,223.3,218.3333,221.7967,46040676.0 +2405,2020-12-30,221.7933,232.2,221.3333,231.1333,89297991.0 +2406,2020-12-31,231.1667,239.5733,230.1633,234.8333,103795989.0 +2407,2021-01-04,236.3333,248.1633,236.3333,244.5333,100289490.0 +2408,2021-01-05,243.3767,251.4667,239.7333,250.9667,63907479.0 +2409,2021-01-06,249.3333,258.0,248.8867,254.5333,92182257.0 +2410,2021-01-07,256.3333,278.24,255.7333,276.5,102648621.0 +2411,2021-01-08,281.6667,294.9633,279.4633,289.1667,150111201.0 +2412,2021-01-11,288.7933,290.1667,267.8733,272.8333,115961742.0 +2413,2021-01-12,274.0,289.3333,274.0,284.0,94456524.0 +2414,2021-01-13,285.0,287.0,277.3333,281.0333,66342027.0 +2415,2021-01-14,280.0,287.6667,279.22,282.65,63056748.0 +2416,2021-01-15,283.23,286.6333,273.0333,274.59,78848139.0 +2417,2021-01-19,279.0,283.3333,277.6667,281.0833,46853928.0 +2418,2021-01-20,280.9967,286.7267,279.0933,283.9567,49166334.0 +2419,2021-01-21,286.0,286.33,280.3333,280.6633,38889873.0 +2420,2021-01-22,280.2733,282.6667,276.2067,282.5,37781574.0 +2421,2021-01-25,283.9633,300.1333,279.6067,291.5,76459485.0 +2422,2021-01-26,293.16,298.6333,290.5333,295.97,44113677.0 +2423,2021-01-27,296.11,297.17,266.1433,273.4633,44969781.0 +2424,2021-01-28,272.8333,282.6667,264.6667,276.4833,43576764.0 +2425,2021-01-29,274.55,280.8033,260.0333,262.6333,59973315.0 +2426,2021-02-01,270.6967,280.6667,265.1867,280.0,44447226.0 +2427,2021-02-02,281.6667,293.4067,277.3333,292.6667,42602496.0 +2428,2021-02-03,292.6667,293.2133,283.3333,283.6667,32335680.0 +2429,2021-02-04,286.2333,286.7433,277.8067,282.1667,28538979.0 +2430,2021-02-05,283.6133,288.2567,279.6567,284.4967,32859015.0 +2431,2021-02-08,285.73,292.6267,280.18,286.2067,36266742.0 +2432,2021-02-09,287.7933,287.8067,280.6667,281.83,25635285.0 +2433,2021-02-10,283.3333,283.6267,266.6733,269.9633,64580658.0 +2434,2021-02-11,272.82,276.6267,267.2633,270.3333,38372664.0 +2435,2021-02-12,269.8767,272.8333,261.7767,272.5167,40260147.0 +2436,2021-02-16,273.6667,275.0,263.7333,263.8067,34891947.0 +2437,2021-02-17,263.3333,266.6133,254.0033,264.55,45436740.0 +2438,2021-02-18,263.57,264.8967,258.6667,261.0333,32746779.0 +2439,2021-02-19,260.9267,267.5567,259.1233,260.8333,33005790.0 +2440,2021-02-22,254.5,256.1667,236.3333,236.87,66209229.0 +2441,2021-02-23,231.7333,240.0,206.3333,238.8333,120777558.0 +2442,2021-02-24,240.0,248.3333,231.39,246.0667,69555915.0 +2443,2021-02-25,247.1667,247.34,218.3333,222.6667,69715503.0 +2444,2021-02-26,226.0067,235.5667,219.8367,223.6,77062926.0 +2445,2021-03-01,230.8367,241.8133,228.35,241.75,48766533.0 +2446,2021-03-02,238.8333,241.1167,228.3333,229.5967,40553202.0 +2447,2021-03-03,233.0,234.1667,216.3733,217.9767,52144758.0 +2448,2021-03-04,218.27,222.8167,200.0,200.0333,120709596.0 +2449,2021-03-05,203.5,210.74,179.83,198.75,166008762.0 +2450,2021-03-08,194.4,206.71,184.6667,189.0,99075645.0 +2451,2021-03-09,193.72,231.3,192.3333,229.7367,126304164.0 +2452,2021-03-10,230.5233,239.2833,218.6067,221.52,115159767.0 +2453,2021-03-11,229.0,235.2633,225.7267,232.8333,66966033.0 +2454,2021-03-12,225.0,232.0,222.0433,230.9967,60956052.0 +2455,2021-03-15,229.9667,237.7267,228.0133,234.0,55377972.0 +2456,2021-03-16,236.9233,237.0,223.6667,224.7,59068035.0 +2457,2021-03-17,224.8667,234.5767,216.67,233.2467,77101338.0 +2458,2021-03-18,229.2567,230.93,216.8333,216.8533,59758062.0 +2459,2021-03-19,216.6667,222.8333,208.2067,217.4,81737448.0 +2460,2021-03-22,220.6667,233.2067,218.29,223.1167,75553839.0 +2461,2021-03-23,223.0,227.2,219.17,221.0,53724156.0 +2462,2021-03-24,221.3333,225.3333,210.0,211.3,63886878.0 +2463,2021-03-25,211.3667,215.1667,201.48,214.2,75643422.0 +2464,2021-03-26,214.0167,217.0767,200.0,207.1,59529975.0 +2465,2021-03-29,203.15,207.36,198.6733,202.6,48334989.0 +2466,2021-03-30,202.0,213.3333,197.0033,213.0033,77555175.0 +2467,2021-03-31,211.5667,224.0,209.1667,221.1033,64970841.0 +2468,2021-04-01,225.1833,230.81,219.3333,219.3333,68217258.0 +2469,2021-04-05,233.3333,238.9,228.2333,230.9,82286721.0 +2470,2021-04-06,230.1667,232.1833,227.1233,230.8333,57601257.0 +2471,2021-04-07,230.9567,231.1167,222.6133,224.1333,53050818.0 +2472,2021-04-08,226.33,229.85,223.88,228.9233,48333639.0 +2473,2021-04-09,228.2433,229.1667,223.1433,225.6667,39606963.0 +2474,2021-04-12,228.5667,234.9333,226.2367,233.8367,54284880.0 +2475,2021-04-13,234.6667,254.5,234.5767,252.5667,86973186.0 +2476,2021-04-14,254.9067,262.23,242.6767,244.2933,93136587.0 +2477,2021-04-15,248.3333,249.1133,240.4367,246.0833,53544411.0 +2478,2021-04-16,245.8767,249.8033,241.5333,246.4167,53036541.0 +2479,2021-04-19,244.6667,247.21,230.6,240.5333,75574374.0 +2480,2021-04-20,240.07,245.75,233.9,237.4633,70814043.0 +2481,2021-04-21,237.2067,248.28,232.6667,246.8667,58436706.0 +2482,2021-04-22,247.24,251.2567,237.6667,239.5,68573160.0 +2483,2021-04-23,239.04,245.7867,237.51,243.3667,55616598.0 +2484,2021-04-26,244.6667,249.7667,238.39,239.9533,56943357.0 +2485,2021-04-27,240.0,241.9467,233.63,233.86,54962673.0 +2486,2021-04-28,233.3333,236.1667,230.5133,231.5,40961961.0 +2487,2021-04-29,233.84,234.6,222.8667,223.6267,53380290.0 +2488,2021-04-30,224.3367,238.49,221.0467,236.6667,76883430.0 +2489,2021-05-03,236.0067,236.21,226.8333,227.1,51935973.0 +2490,2021-05-04,227.0633,229.5,219.2333,225.1,55854111.0 +2491,2021-05-05,225.7667,228.4333,222.1667,222.17,42513225.0 +2492,2021-05-06,224.4567,230.0767,216.6667,221.6667,54950481.0 +2493,2021-05-07,222.1667,227.84,218.5433,223.1667,45285756.0 +2494,2021-05-10,223.0,223.3333,206.7033,206.7033,59311011.0 +2495,2021-05-11,206.67,209.0333,192.6667,205.25,89671815.0 +2496,2021-05-12,206.1,206.8033,193.3333,194.1667,64890921.0 +2497,2021-05-13,193.6667,202.1533,186.6667,191.1667,83126715.0 +2498,2021-05-14,193.67,199.6267,190.1533,199.3333,65228229.0 +2499,2021-05-17,196.58,197.6667,187.0667,190.6467,63467550.0 +2500,2021-05-18,193.0467,198.75,187.7933,190.3333,75257196.0 +2501,2021-05-19,188.56,189.2833,181.6667,186.0033,77524299.0 +2502,2021-05-20,187.6667,196.3333,186.6333,196.3,64313097.0 +2503,2021-05-21,196.7667,201.57,192.7933,192.8333,49913517.0 +2504,2021-05-24,195.0333,204.8267,191.2167,202.5,72762678.0 +2505,2021-05-25,203.5,204.6633,198.57,202.4267,57594786.0 +2506,2021-05-26,203.0,208.7233,200.5,206.3367,59423178.0 +2507,2021-05-27,205.5433,210.3767,204.47,209.7433,53587350.0 +2508,2021-05-28,210.0,211.8633,207.46,208.1667,45708411.0 +2509,2021-06-01,208.73,211.2667,206.85,207.2333,35538018.0 +2510,2021-06-02,206.9967,207.9667,199.7133,200.6733,43231854.0 +2511,2021-06-03,200.3367,201.5167,190.0,190.7167,57641328.0 +2512,2021-06-04,191.9333,200.2033,190.4667,200.0,47932023.0 +2513,2021-06-07,199.4967,203.3333,194.2933,200.0,43852587.0 +2514,2021-06-08,198.6833,209.0,198.5,200.4833,52664493.0 +2515,2021-06-09,201.24,203.93,199.0067,199.3333,34338024.0 +2516,2021-06-10,199.2733,205.53,197.3333,202.6667,49835202.0 +2517,2021-06-11,203.0,205.3333,200.5067,203.5,31935483.0 +2518,2021-06-14,203.9967,208.42,203.06,205.3333,41926515.0 +2519,2021-06-15,205.81,206.3367,198.6667,198.7667,36347325.0 +2520,2021-06-16,199.6267,202.8333,197.67,200.8333,44065245.0 +2521,2021-06-17,200.3033,207.1567,199.6567,205.53,44940105.0 +2522,2021-06-18,205.6367,209.45,203.5433,206.9833,50973756.0 +2523,2021-06-21,207.33,210.4633,202.96,207.0833,50577285.0 +2524,2021-06-22,206.1333,209.5233,205.1667,208.0167,39783501.0 +2525,2021-06-23,208.3333,221.5467,208.3333,221.0,63081165.0 +2526,2021-06-24,221.6667,232.54,219.4033,227.3333,95330490.0 +2527,2021-06-25,227.3333,231.27,222.6767,223.0,68989917.0 +2528,2021-06-28,222.9,231.5667,222.4333,228.8,43411218.0 +2529,2021-06-29,229.33,229.3333,225.2967,226.67,35486958.0 +2530,2021-06-30,227.0,230.9367,224.6667,226.4667,38338683.0 +2531,2021-07-01,227.1667,229.5733,224.2667,225.3,35654799.0 +2532,2021-07-02,225.3,233.3333,224.09,225.7,54561240.0 +2533,2021-07-06,225.4867,228.0,217.1333,218.7,41297160.0 +2534,2021-07-07,220.0,221.9,212.7733,214.6333,37118532.0 +2535,2021-07-08,210.0,218.3333,206.82,216.8667,44881728.0 +2536,2021-07-09,217.5967,220.0,214.8967,218.5933,34968744.0 +2537,2021-07-12,219.0,229.1667,218.9833,229.0033,51243600.0 +2538,2021-07-13,228.1333,231.58,220.5067,220.8,42033159.0 +2539,2021-07-14,223.3333,226.2033,217.6,218.2833,46162458.0 +2540,2021-07-15,219.0633,222.0467,212.6267,216.4,41483562.0 +2541,2021-07-16,217.5,218.92,213.66,214.0667,31873818.0 +2542,2021-07-19,213.6467,216.33,207.0967,215.9267,40264497.0 +2543,2021-07-20,216.6667,220.8,213.5,220.6667,29554182.0 +2544,2021-07-21,220.6667,221.62,216.7633,218.2333,26824704.0 +2545,2021-07-22,219.6333,220.7233,214.8667,216.1667,29336946.0 +2546,2021-07-23,217.3333,217.3367,212.4333,214.44,27217935.0 +2547,2021-07-26,215.2,226.1167,213.21,221.3867,50556135.0 +2548,2021-07-27,222.4967,224.7967,209.08,213.0033,64392234.0 +2549,2021-07-28,214.3,218.3233,213.1333,215.3333,29813055.0 +2550,2021-07-29,215.66,227.8967,215.66,222.9967,59894136.0 +2551,2021-07-30,221.8333,232.51,220.99,229.1933,55456236.0 +2552,2021-08-02,230.7333,242.3133,230.6667,238.33,65648568.0 +2553,2021-08-03,238.3333,240.8833,233.67,235.6667,42860139.0 +2554,2021-08-04,237.0,241.6333,235.5167,237.0,32493825.0 +2555,2021-08-05,237.6667,240.3167,236.94,238.2,24828657.0 +2556,2021-08-06,238.3367,239.0,232.2833,232.3333,28781466.0 +2557,2021-08-09,236.0,239.6767,234.9633,237.9,29672529.0 +2558,2021-08-10,238.1,238.8633,233.96,236.1667,26595642.0 +2559,2021-08-11,236.2167,238.3933,234.7367,235.8033,17842452.0 +2560,2021-08-12,235.3333,242.0033,233.1333,240.1133,34809909.0 +2561,2021-08-13,239.97,243.3,238.18,238.9067,32477205.0 +2562,2021-08-16,238.7267,238.7267,226.02,227.2333,42453582.0 +2563,2021-08-17,226.8,226.8,216.28,221.0,43246251.0 +2564,2021-08-18,223.0033,231.9233,222.7767,228.3333,39414696.0 +2565,2021-08-19,227.0,228.85,222.53,224.3333,27499356.0 +2566,2021-08-20,224.6667,230.71,223.6667,226.7667,27058611.0 +2567,2021-08-23,228.0,237.3767,226.9167,236.1,40378269.0 +2568,2021-08-24,236.8,238.4033,234.2133,235.4333,24506721.0 +2569,2021-08-25,235.5967,238.99,234.6667,237.0,24902058.0 +2570,2021-08-26,236.3367,238.4667,232.54,233.3,24901170.0 +2571,2021-08-27,235.0,238.3333,234.0333,237.4667,25801872.0 +2572,2021-08-30,238.0,245.7833,237.44,244.6667,35205261.0 +2573,2021-08-31,244.6667,246.78,242.1467,244.6667,41367243.0 +2574,2021-09-01,245.5667,247.33,243.3333,243.7333,23279241.0 +2575,2021-09-02,244.33,246.99,242.0033,244.4333,24648756.0 +2576,2021-09-03,245.7,245.8333,241.4,244.8333,29042418.0 +2577,2021-09-07,245.12,253.4,245.0,250.4367,38376276.0 +2578,2021-09-08,252.0,254.8167,246.9233,250.5167,37344477.0 +2579,2021-09-09,250.0,254.0333,249.0067,251.2833,27285180.0 +2580,2021-09-10,251.8533,254.2033,243.7233,244.1667,28766106.0 +2581,2021-09-13,245.4233,248.26,236.3933,247.6667,45762033.0 +2582,2021-09-14,246.3333,251.49,245.4067,248.5,35848818.0 +2583,2021-09-15,248.48,252.2867,246.12,251.93,30442302.0 +2584,2021-09-16,250.6667,252.97,249.2033,251.8333,26342049.0 +2585,2021-09-17,252.0033,253.68,250.0,253.04,59345472.0 +2586,2021-09-20,250.0,250.0,239.54,242.9867,44764014.0 +2587,2021-09-21,247.3333,248.2467,243.48,245.6667,31419141.0 +2588,2021-09-22,246.37,251.5333,246.3167,251.5333,28690833.0 +2589,2021-09-23,252.0133,253.2667,249.3067,250.9333,21861891.0 +2590,2021-09-24,250.0,258.3333,248.01,257.9167,41849742.0 +2591,2021-09-27,258.0,266.3333,256.1633,262.3267,56626173.0 +2592,2021-09-28,260.48,265.2133,255.3933,258.0,50707452.0 +2593,2021-09-29,261.6667,264.5,256.8933,259.9667,42686520.0 +2594,2021-09-30,261.6667,263.0467,258.0,258.3767,36607635.0 +2595,2021-10-01,256.6667,260.6667,254.53,258.3333,33948654.0 +2596,2021-10-04,261.6833,268.99,257.76,260.5,62392521.0 +2597,2021-10-05,261.1233,265.77,258.17,260.0,36630258.0 +2598,2021-10-06,257.1267,262.22,255.0533,261.2467,28747782.0 +2599,2021-10-07,262.75,268.3333,260.2633,263.3333,35731074.0 +2600,2021-10-08,264.5033,266.1133,260.3033,261.7,31890201.0 +2601,2021-10-11,261.92,267.08,261.0,264.2,27505347.0 +2602,2021-10-12,263.68,270.7733,263.32,268.5,40789215.0 +2603,2021-10-13,270.0067,271.8033,267.9,271.1667,27633120.0 +2604,2021-10-14,272.3867,273.4167,269.6833,273.2333,21017235.0 +2605,2021-10-15,273.3333,283.2633,272.09,283.0,37482756.0 +2606,2021-10-18,281.15,291.6767,280.3067,290.6667,46397166.0 +2607,2021-10-19,291.5667,293.3333,287.5033,287.5533,34256370.0 +2608,2021-10-20,286.7067,291.8,283.8633,283.9333,26102676.0 +2609,2021-10-21,285.53,300.0,283.4333,296.2933,63007014.0 +2610,2021-10-22,297.1667,303.4067,296.9867,303.0833,44809167.0 +2611,2021-10-25,304.66,348.34,303.3367,343.3333,120727032.0 +2612,2021-10-26,342.99,364.98,333.8133,337.9667,116972874.0 +2613,2021-10-27,340.0667,356.96,336.55,353.67,71864214.0 +2614,2021-10-28,353.6,362.9333,345.9533,360.0,51902868.0 +2615,2021-10-29,360.0,376.5833,357.7333,376.05,58173909.0 +2616,2021-11-01,377.4,408.2967,372.26,406.4,103645668.0 +2617,2021-11-02,397.0367,402.8633,375.1033,387.0,73600182.0 +2618,2021-11-03,388.5433,406.33,383.55,405.83,62335545.0 +2619,2021-11-04,407.7333,416.6667,405.6667,407.4,44871267.0 +2620,2021-11-05,407.41,413.29,402.6667,405.5,38407929.0 +2621,2021-11-08,383.6667,399.0,376.8333,383.3367,55734987.0 +2622,2021-11-09,388.2333,395.9267,337.1733,341.3333,99305115.0 +2623,2021-11-10,345.1667,366.3333,329.1033,365.3333,72635043.0 +2624,2021-11-11,364.5733,373.2433,351.56,353.3333,37079193.0 +2625,2021-11-12,355.11,357.3333,339.88,343.1667,40773651.0 +2626,2021-11-15,340.0,345.3367,326.2,334.0,55007415.0 +2627,2021-11-16,334.3333,353.0,332.0033,352.7333,45724431.0 +2628,2021-11-17,354.47,373.2133,351.8333,362.6667,54335913.0 +2629,2021-11-18,366.2567,371.6667,358.34,362.4167,38152728.0 +2630,2021-11-19,367.07,381.4133,363.3333,380.0,40460397.0 +2631,2021-11-22,382.8367,400.65,377.4767,387.02,61802889.0 +2632,2021-11-23,384.9233,393.5,354.2333,366.9333,66676008.0 +2633,2021-11-24,371.0833,377.59,354.0,372.5,40844445.0 +2634,2021-11-26,363.1667,369.5967,357.05,360.0,20116359.0 +2635,2021-11-29,368.3333,380.89,364.3367,380.6567,35464650.0 +2636,2021-11-30,375.9,389.3333,372.3333,381.67,49770600.0 +2637,2021-12-01,384.6633,390.9467,361.2567,365.9167,40769319.0 +2638,2021-12-02,369.79,371.9967,352.2167,357.9967,42563499.0 +2639,2021-12-03,359.9833,366.0,333.4033,336.0,52544382.0 +2640,2021-12-06,342.3267,343.4633,316.8333,336.6667,46148676.0 +2641,2021-12-07,345.1267,352.9333,336.3367,352.6633,35199075.0 +2642,2021-12-08,349.8333,357.46,344.3333,354.2433,24624063.0 +2643,2021-12-09,352.67,357.2133,332.3333,332.5167,36719553.0 +2644,2021-12-10,333.03,340.6,324.3333,337.5067,34100466.0 +2645,2021-12-13,339.6767,341.15,317.17,318.3333,42878616.0 +2646,2021-12-14,320.4233,322.9433,310.0,317.78,40971606.0 +2647,2021-12-15,318.4067,331.6333,309.4167,329.6667,42256527.0 +2648,2021-12-16,331.9233,334.6067,305.5,306.6,44465637.0 +2649,2021-12-17,306.4933,320.22,301.6667,310.5,59531019.0 +2650,2021-12-20,303.6667,307.23,297.81,301.0133,31028196.0 +2651,2021-12-21,304.3567,313.1667,295.3733,310.1333,40021422.0 +2652,2021-12-22,314.3333,338.5533,312.1333,334.3333,53675220.0 +2653,2021-12-23,336.4933,357.66,332.52,356.4333,53221719.0 +2654,2021-12-27,356.9333,372.3333,356.9033,364.0,39116811.0 +2655,2021-12-28,368.6033,373.0,359.4733,364.5,33759246.0 +2656,2021-12-29,367.6667,371.8733,354.7133,360.6667,33236880.0 +2657,2021-12-30,362.9967,365.1833,351.05,355.3333,26776320.0 +2658,2021-12-31,355.3333,360.6667,351.53,354.3,21442167.0 +2659,2022-01-03,369.9133,403.3333,368.6667,403.3333,59739450.0 +2660,2022-01-04,400.3267,403.4033,374.35,380.0,55300041.0 +2661,2022-01-05,377.3833,390.1133,357.9333,361.1667,45923958.0 +2662,2022-01-06,362.0,362.6667,340.1667,358.67,50920653.0 +2663,2022-01-07,355.57,367.0,336.6667,342.3,48486174.0 +2664,2022-01-10,341.0533,357.7833,326.6667,355.93,50742453.0 +2665,2022-01-11,356.2667,359.7533,346.2733,353.0,37721568.0 +2666,2022-01-12,352.9667,371.6133,352.6667,369.6667,47720787.0 +2667,2022-01-13,368.0867,371.8667,341.9633,341.9633,56243877.0 +2668,2022-01-14,346.7333,350.6667,332.53,348.6667,40407246.0 +2669,2022-01-18,344.0,356.93,338.6867,341.67,37357950.0 +2670,2022-01-19,341.57,351.5567,329.7,333.0,41641410.0 +2671,2022-01-20,337.0,347.22,327.4,329.9667,40021428.0 +2672,2022-01-21,331.9567,334.85,311.6667,312.0,54432708.0 +2673,2022-01-24,317.2233,317.45,283.8233,303.3333,83257308.0 +2674,2022-01-25,301.6667,317.0,298.1067,307.28,47386206.0 +2675,2022-01-26,313.4,329.23,293.29,309.9667,59069976.0 +2676,2022-01-27,310.4333,316.46,273.5967,279.0,78316839.0 +2677,2022-01-28,279.3033,285.8333,264.0033,284.0,73422666.0 +2678,2022-01-31,286.8633,313.3333,283.7,312.6667,60666141.0 +2679,2022-02-01,315.01,315.6667,301.6667,312.8333,40608771.0 +2680,2022-02-02,313.3333,315.0,293.5333,293.6667,37054980.0 +2681,2022-02-03,296.6733,312.3333,291.76,302.6,45404325.0 +2682,2022-02-04,302.7033,312.1667,293.7233,308.6667,41669502.0 +2683,2022-02-07,308.5967,315.9233,300.9,303.17,34018512.0 +2684,2022-02-08,303.6667,308.7633,298.2667,308.0,28583517.0 +2685,2022-02-09,309.3367,315.4233,306.6667,310.0,30368949.0 +2686,2022-02-10,309.48,314.6033,298.9,300.0667,37176897.0 +2687,2022-02-11,299.9967,305.32,283.5667,285.6667,44144829.0 +2688,2022-02-14,281.3333,299.6267,277.8867,293.3333,38758287.0 +2689,2022-02-15,299.33,307.6667,297.79,306.0,32850735.0 +2690,2022-02-16,306.0,309.4967,300.4033,306.2667,28010172.0 +2691,2022-02-17,304.6667,307.03,290.33,290.4033,30422382.0 +2692,2022-02-18,294.7067,296.0633,279.2033,284.0,40040778.0 +2693,2022-02-22,276.5133,285.58,267.0333,277.0,47556666.0 +2694,2022-02-23,280.0,281.5967,249.3333,249.3333,53536245.0 +2695,2022-02-24,241.2133,267.6667,230.54,263.8333,81729354.0 +2696,2022-02-25,266.0633,275.5,260.8,270.3667,43164210.0 +2697,2022-02-28,263.49,292.2867,262.33,290.8867,59203599.0 +2698,2022-03-01,289.3333,296.6267,283.6667,288.1967,43701348.0 +2699,2022-03-02,286.6667,295.4933,281.4233,290.2,41124426.0 +2700,2022-03-03,290.0,295.4933,272.8333,273.1833,34345506.0 +2701,2022-03-04,277.0667,285.2167,275.0533,281.3333,39490536.0 +2702,2022-03-07,276.0,288.7133,264.4067,266.6633,41203665.0 +2703,2022-03-08,268.3333,283.33,260.7233,275.5833,47495559.0 +2704,2022-03-09,278.7133,288.2133,274.8,285.3333,34494873.0 +2705,2022-03-10,283.3333,284.8167,270.12,277.33,33274095.0 +2706,2022-03-11,279.6667,285.3333,264.12,264.6433,37045917.0 +2707,2022-03-14,265.1167,267.69,252.0133,259.8333,39402378.0 +2708,2022-03-15,256.0667,268.5233,251.6667,267.2833,37676769.0 +2709,2022-03-16,268.6667,282.6667,267.2967,279.6667,46220172.0 +2710,2022-03-17,281.0,291.6667,275.2367,288.5,37029492.0 +2711,2022-03-18,288.0267,302.6167,287.5033,302.5433,61952121.0 +2712,2022-03-21,302.3333,314.2833,299.2233,306.09,46753863.0 +2713,2022-03-22,306.2967,332.62,306.2967,330.7433,62365338.0 +2714,2022-03-23,331.0,346.9,325.37,332.85,68725848.0 +2715,2022-03-24,334.34,341.4967,329.6,336.5067,39163167.0 +2716,2022-03-25,337.3333,340.6,332.44,337.05,36286704.0 +2717,2022-03-28,335.3333,365.96,334.0733,365.2667,56465760.0 +2718,2022-03-29,366.6133,374.8667,357.7033,364.6867,39172281.0 +2719,2022-03-30,364.3233,371.3167,361.3333,365.2933,33436668.0 +2720,2022-03-31,367.1933,368.3333,358.3333,358.5,26907888.0 +2721,2022-04-01,360.0333,364.9167,355.5467,363.6667,29717751.0 +2722,2022-04-04,364.3333,383.3033,357.51,380.0,46320690.0 +2723,2022-04-05,380.5367,384.29,361.45,362.6667,43596441.0 +2724,2022-04-06,362.0,364.6633,342.5667,347.6667,50559519.0 +2725,2022-04-07,351.8133,358.8633,340.5133,355.5,44438853.0 +2726,2022-04-08,357.67,359.05,340.3433,340.6667,30800952.0 +2727,2022-04-11,336.51,337.0,320.6667,320.6667,32727522.0 +2728,2022-04-12,322.7767,340.4,320.9667,330.5933,38553336.0 +2729,2022-04-13,333.2267,342.08,324.3633,341.0,31495641.0 +2730,2022-04-14,342.0667,343.3433,327.3967,329.8167,32337318.0 +2731,2022-04-18,329.0833,338.3067,324.47,337.6733,28905387.0 +2732,2022-04-19,336.06,344.98,331.7733,339.3333,27618669.0 +2733,2022-04-20,338.4133,348.9967,324.4967,343.7267,37622106.0 +2734,2022-04-21,343.87,364.0733,332.1367,337.1333,57751845.0 +2735,2022-04-22,337.1333,344.95,331.3333,333.4333,37934373.0 +2736,2022-04-25,333.4,336.2067,320.3333,332.7667,37647819.0 +2737,2022-04-26,330.0,334.3333,287.1667,291.67,74006871.0 +2738,2022-04-27,298.3333,306.0,292.4533,298.6667,38960505.0 +2739,2022-04-28,300.4967,305.0,273.9,284.8333,67646268.0 +2740,2022-04-29,299.6667,311.4667,289.3333,292.5,48944871.0 +2741,2022-05-02,296.1567,303.25,281.3333,302.3333,42804726.0 +2742,2022-05-03,301.0067,308.0267,296.1967,302.3333,37183326.0 +2743,2022-05-04,302.3333,318.5,295.0933,316.02,49005195.0 +2744,2022-05-05,314.3,316.91,285.9,292.6667,52158030.0 +2745,2022-05-06,291.9667,296.6267,281.0333,288.0,41014902.0 +2746,2022-05-09,284.4133,284.4133,260.3833,262.2333,49423431.0 +2747,2022-05-10,269.3333,275.12,258.0833,265.9167,48430737.0 +2748,2022-05-11,271.0133,272.6667,242.4,244.7,53134143.0 +2749,2022-05-12,243.8633,253.22,226.6667,247.0,85963638.0 +2750,2022-05-13,249.6667,262.45,249.6667,258.5667,55949757.0 +2751,2022-05-16,255.0,258.09,239.6933,240.74,52901019.0 +2752,2022-05-17,248.49,254.8267,242.95,253.6833,47844489.0 +2753,2022-05-18,250.54,253.5,233.3333,233.3333,52252599.0 +2754,2022-05-19,232.9367,244.6667,229.8333,238.3333,55037787.0 +2755,2022-05-20,242.5967,243.52,211.0,221.8333,85888587.0 +2756,2022-05-23,227.5267,228.0,212.6867,219.0,51265281.0 +2757,2022-05-24,217.8867,219.6667,206.8567,211.3333,52180665.0 +2758,2022-05-25,212.2567,223.1067,205.81,218.4333,58653768.0 +2759,2022-05-26,221.76,239.5567,217.8867,237.6667,66064707.0 +2760,2022-05-27,236.93,255.9667,235.81,255.0833,56435403.0 +2761,2022-05-31,253.9067,259.6,244.7433,253.23,64379274.0 +2762,2022-06-01,253.2533,257.3267,243.64,244.6667,47765442.0 +2763,2022-06-02,248.4833,264.21,242.0667,261.0667,59789013.0 +2764,2022-06-03,251.3333,260.3333,233.3333,233.43,70047213.0 +2765,2022-06-06,241.6667,245.0,234.35,237.8367,52758504.0 +2766,2022-06-07,236.7667,239.9967,230.0933,238.3333,46067151.0 +2767,2022-06-08,237.6,249.9633,237.6,242.7667,47875032.0 +2768,2022-06-09,248.1567,255.5467,239.3267,239.5033,60465090.0 +2769,2022-06-10,241.3333,244.1833,227.9133,236.4167,60624126.0 +2770,2022-06-13,229.63,232.33,214.2167,214.4333,61920003.0 +2771,2022-06-14,221.0,226.33,211.7367,223.1167,63877368.0 +2772,2022-06-15,222.6667,235.6633,218.15,235.4133,76913121.0 +2773,2022-06-16,227.64,231.9967,208.6933,211.8333,65683083.0 +2774,2022-06-17,215.3333,220.97,211.48,216.1,61196430.0 +2775,2022-06-21,222.3333,243.58,219.6833,237.5167,79742895.0 +2776,2022-06-22,229.8633,246.8233,228.3733,234.1833,67988037.0 +2777,2022-06-23,234.3333,241.1667,228.6367,234.2333,69978438.0 +2778,2022-06-24,238.25,246.0667,235.5533,245.4667,62441367.0 +2779,2022-06-27,248.9433,252.07,242.5633,245.27,56900979.0 +2780,2022-06-28,245.3333,249.97,231.0067,232.3,58576794.0 +2781,2022-06-29,232.3333,233.3333,222.2733,227.4667,53105913.0 +2782,2022-06-30,223.3,229.4567,218.8633,224.3333,61716366.0 +2783,2022-07-01,222.0,230.23,220.8367,226.4867,48110886.0 +2784,2022-07-05,228.3,233.9933,216.1667,232.9733,54336840.0 +2785,2022-07-06,232.9333,234.5633,227.1867,231.6667,45489657.0 +2786,2022-07-07,233.6333,245.3633,232.21,243.6667,52164897.0 +2787,2022-07-08,242.7667,259.3333,240.73,256.4667,66933489.0 +2788,2022-07-11,250.97,254.6,233.6267,234.0,61863519.0 +2789,2022-07-12,231.8467,239.7733,228.3667,232.1,56026785.0 +2790,2022-07-13,232.9,242.06,223.9033,234.6833,62291388.0 +2791,2022-07-14,236.0467,239.48,229.3333,239.48,50364726.0 +2792,2022-07-15,237.3333,243.6233,236.4667,239.6633,40794570.0 +2793,2022-07-18,244.0033,250.5167,239.6033,241.3367,52663089.0 +2794,2022-07-19,242.1333,247.8967,236.9767,247.1467,51763212.0 +2795,2022-07-20,247.0633,259.3333,243.48,251.1,54030141.0 +2796,2022-07-21,251.87,273.2667,249.3333,269.75,86439174.0 +2797,2022-07-22,269.2767,280.7867,268.6733,271.6667,60837000.0 +2798,2022-07-25,272.3167,276.5433,266.67,266.8333,39659769.0 +2799,2022-07-26,267.0967,268.0,256.2633,262.3333,42541404.0 +2800,2022-07-27,263.3333,275.9267,258.86,273.58,55620006.0 +2801,2022-07-28,273.3333,284.5633,271.6667,284.3333,53337165.0 +2802,2022-07-29,284.1767,298.32,279.1,296.6,58007934.0 +2803,2022-08-01,296.6667,311.88,293.3333,298.0,71199081.0 +2804,2022-08-02,294.1133,307.8333,291.46,301.3333,59609352.0 +2805,2022-08-03,301.3667,309.55,301.15,307.7467,49034241.0 +2806,2022-08-04,308.8467,313.6067,305.0,309.1667,44030208.0 +2807,2022-08-05,312.2233,312.2233,285.5433,287.3333,67475064.0 +2808,2022-08-08,294.3333,305.19,289.0833,292.8,59549943.0 +2809,2022-08-09,295.2467,295.7233,279.3533,283.8,52285851.0 +2810,2022-08-10,286.2033,297.9867,283.3333,293.3333,57884541.0 +2811,2022-08-11,295.1367,298.2367,285.8333,288.1,43055865.0 +2812,2022-08-12,290.3333,301.5667,285.0333,301.3333,49332492.0 +2813,2022-08-15,298.39,313.1333,297.7367,309.6667,54710223.0 +2814,2022-08-16,308.5233,314.6667,302.8833,306.4,55540302.0 +2815,2022-08-17,306.0,309.6567,300.0333,303.0,43278504.0 +2816,2022-08-18,303.0267,307.5033,301.8533,303.1033,28342434.0 +2817,2022-08-19,301.9767,303.63,292.5,295.2667,37094298.0 +2818,2022-08-22,291.6667,294.8333,286.2967,290.5833,33285654.0 +2819,2022-08-23,290.0,298.8267,287.9233,296.5333,39575148.0 +2820,2022-08-24,295.76,308.94,295.5,306.6,11374931.0 +2821,2022-08-25,307.95,307.95,291.6,295.7,37975857.0 +2822,2022-08-26,296.77,302.0,284.3,284.5,41690512.0 +2823,2022-08-29,281.91,288.09,280.0,285.7,31229778.0 +2824,2022-08-30,289.38,292.5,272.65,278.12,36111921.0 +2825,2022-08-31,279.44,281.25,271.81,272.01,36997072.0 +2826,2022-09-01,271.57,280.34,266.15,279.7,39657641.0 +2827,2022-09-02,279.1,282.57,269.08,269.3,36972502.0 +2828,2022-09-06,276.14,276.14,265.74,273.81,39823707.0 +2829,2022-09-07,274.75,283.95,272.21,283.45,36023268.0 +2830,2022-09-08,282.87,290.0,279.78,290.0,40320418.0 +2831,2022-09-09,291.82,299.95,289.98,298.4,40244272.0 +2832,2022-09-12,300.0,305.49,298.01,304.65,35331535.0 +2833,2022-09-13,305.04,307.0,290.4,291.6,47611133.0 +2834,2022-09-14,292.6,306.0,289.3,304.25,51667238.0 +2835,2022-09-15,304.53,309.12,299.5,300.19,48241149.0 +2836,2022-09-16,299.65,304.01,295.6,303.9,70185787.0 +2837,2022-09-19,301.23,309.84,297.8,309.44,44466573.0 +2838,2022-09-20,308.4,313.33,305.58,307.4,46760937.0 +2839,2022-09-21,306.21,313.8,299.0,299.3,46208549.0 +2840,2022-09-22,301.03,304.5,285.82,288.02,50406357.0 +2841,2022-09-23,287.78,288.03,272.82,275.75,44530343.0 +2842,2022-09-26,275.33,284.09,269.8,276.4,40779663.0 +2843,2022-09-27,282.78,288.67,276.7,287.1,45446685.0 +2844,2022-09-28,281.45,289.0,274.77,286.3,40051777.0 +2845,2022-09-29,283.0,288.53,265.81,269.21,56781305.0 +2846,2022-09-30,273.8,275.57,262.47,266.05,49037220.0 +2847,2022-10-03,256.68,260.0,241.01,243.7,72670646.0 +2848,2022-10-04,249.43,257.5,242.01,247.7,82343604.0 +2849,2022-10-05,247.24,248.09,233.27,240.99,65285626.0 +2850,2022-10-06,241.8,244.58,235.35,236.7,51843790.0 +2851,2022-10-07,237.83,239.7,221.75,223.8,62463602.0 +2852,2022-10-10,223.46,226.99,218.0,223.0,51669555.0 +2853,2022-10-11,221.36,225.75,215.0,215.2,59920745.0 +2854,2022-10-12,218.4,219.69,211.51,216.8,51834612.0 +2855,2022-10-13,216.43,222.99,206.22,220.51,70560950.0 +2856,2022-10-14,223.4,226.26,203.5,204.43,72262028.0 +2857,2022-10-17,210.32,222.87,204.99,222.75,64099875.0 +2858,2022-10-18,225.9,229.82,217.25,224.25,61738061.0 +2859,2022-10-19,222.09,228.29,206.23,208.16,50898030.0 +2860,2022-10-20,209.74,215.55,202.0,206.6,92683950.0 +2861,2022-10-21,206.08,215.0,203.0,214.55,58617759.0 +2862,2022-10-24,213.4,216.66,198.58,208.8,78968509.0 +2863,2022-10-25,209.5,224.35,208.0,217.12,79670683.0 +2864,2022-10-26,219.56,230.6,218.2,226.5,68562598.0 +2865,2022-10-27,226.5,233.81,217.55,223.38,49680215.0 +2866,2022-10-28,221.0,228.86,215.0,228.35,56109870.0 +2867,2022-10-31,228.79,229.85,221.94,227.59,49891734.0 +2868,2022-11-01,229.19,237.4,226.51,227.0,49775576.0 +2869,2022-11-02,229.0,229.37,213.44,215.87,49853305.0 +2870,2022-11-03,216.74,221.2,210.14,214.48,44646949.0 +2871,2022-11-04,220.79,223.8,203.08,209.05,80308864.0 +2872,2022-11-07,210.6,210.6,196.5,197.3,73397622.0 +2873,2022-11-08,198.58,198.93,186.75,190.0,105514188.0 +2874,2022-11-09,194.0,195.89,175.51,176.5,102644299.0 +2875,2022-11-10,178.69,193.64,172.01,191.47,110460759.0 +2876,2022-11-11,194.48,196.52,182.59,195.65,95853553.0 +2877,2022-11-14,195.04,195.95,186.34,191.25,77319752.0 +2878,2022-11-15,194.53,200.83,191.42,193.3,74960504.0 +2879,2022-11-16,196.22,196.67,184.05,187.8,54096082.0 +2880,2022-11-17,189.18,189.18,180.9,183.62,52118517.0 +2881,2022-11-18,183.0,185.83,176.55,179.3,61891438.0 +2882,2022-11-21,178.6,179.66,167.54,167.83,73810772.0 +2883,2022-11-22,167.67,171.35,165.38,170.42,64763513.0 +2884,2022-11-23,173.11,184.88,170.51,184.8,90934248.0 +2885,2022-11-25,186.07,188.5,180.63,182.89,41660711.0 +2886,2022-11-28,181.59,188.5,178.0,183.9,78408629.0 +2887,2022-11-29,185.11,186.88,178.75,180.4,68205280.0 +2888,2022-11-30,182.42,196.6,180.63,195.9,92743086.0 +2889,2022-12-01,194.24,198.92,191.8,193.93,65844119.0 +2890,2022-12-02,194.07,196.9,189.55,194.2,60902399.0 +2891,2022-12-05,192.95,194.3,180.55,182.55,75912778.0 +2892,2022-12-06,182.89,183.82,175.33,179.05,76040783.0 +2893,2022-12-07,179.33,179.69,172.21,173.42,69718106.0 +2894,2022-12-08,174.14,175.7,169.06,173.45,80762690.0 +2895,2022-12-09,174.92,182.5,172.3,178.5,88081017.0 +2896,2022-12-12,178.45,179.56,167.52,168.02,90494485.0 +2897,2022-12-13,169.66,179.14,156.91,161.3,135812432.0 +2898,2022-12-14,161.75,162.25,155.31,156.9,113815160.0 +2899,2022-12-15,155.75,160.93,151.33,158.72,101035229.0 +2900,2022-12-16,156.46,160.99,149.0,149.06,113741284.0 +2901,2022-12-19,156.57,158.2,145.82,150.53,118190710.0 +2902,2022-12-20,148.0,151.57,137.37,139.07,131775303.0 +2903,2022-12-21,141.0,141.5,135.91,138.37,123736453.0 +2904,2022-12-22,138.5,139.48,122.26,126.85,177342265.0 +2905,2022-12-23,127.07,128.62,121.02,122.2,141626063.0 +2906,2022-12-27,123.88,125.0,106.6,106.69,175910731.0 +2907,2022-12-28,107.84,116.27,104.22,114.0,186100201.0 +2908,2022-12-29,115.0,123.57,114.47,122.84,189503721.0 +2909,2022-12-30,122.46,124.48,118.51,123.5,136672797.0 +2910,2023-01-03,120.02,121.9,104.64,107.0,191557167.0 +2911,2023-01-04,108.88,114.59,107.28,113.66,153862552.0 +2912,2023-01-05,112.5,114.87,107.16,110.35,133687246.0 +2913,2023-01-06,107.69,114.39,101.2,113.68,184006970.0 +2914,2023-01-09,114.03,123.52,113.75,119.55,162885492.0 +2915,2023-01-10,120.6,122.76,115.0,118.66,144503095.0 +2916,2023-01-11,118.63,125.95,118.23,123.19,158558924.0 +2917,2023-01-12,123.22,124.6,117.0,123.0,145833294.0 +2918,2023-01-13,118.0,123.0,115.6,122.03,157396482.0 +2919,2023-01-17,122.0,132.3,120.6,131.3,160937377.0 +2920,2023-01-18,132.16,137.5,126.6,126.72,169078250.0 +2921,2023-01-19,127.47,129.99,124.3,128.36,152223302.0 +2922,2023-01-20,128.36,133.85,127.34,133.85,123571951.0 +2923,2023-01-23,133.87,145.39,133.5,144.8,177044569.0 +2924,2023-01-24,146.0,146.5,140.64,140.97,140230986.0 +2925,2023-01-25,142.47,153.0,138.07,152.35,166419849.0 +2926,2023-01-26,153.43,161.42,152.35,158.95,200431932.0 +2927,2023-01-27,159.89,180.68,158.0,178.99,263157488.0 +2928,2023-01-30,178.5,180.0,165.77,165.77,196790466.0 +2929,2023-01-31,165.89,174.3,162.78,171.82,172099948.0 +2930,2023-02-01,173.22,184.84,169.97,184.33,187082506.0 +2931,2023-02-02,185.11,196.76,182.61,184.06,186940474.0 +2932,2023-02-03,183.47,199.0,182.0,192.77,199115506.0 +2933,2023-02-06,192.91,198.17,189.1,195.14,161365866.0 +2934,2023-02-07,195.38,197.8,189.55,196.19,162102866.0 +2935,2023-02-08,196.2,203.0,194.31,202.49,155395535.0 +2936,2023-02-09,205.0,214.0,201.29,204.0,181049895.0 +2937,2023-02-10,206.01,206.73,192.92,194.58,172846466.0 +2938,2023-02-13,194.54,199.5,187.61,195.62,147807152.0 +2939,2023-02-14,195.5,212.0,189.44,211.5,185629204.0 +2940,2023-02-15,209.0,216.21,206.11,215.91,152835862.0 +2941,2023-02-16,216.6,217.82,196.74,198.23,195125412.0 +2942,2023-02-17,199.0,209.77,197.5,209.0,183119234.0 +2943,2023-02-21,205.95,209.71,195.8,197.35,151695722.0 +2944,2023-02-22,198.94,203.0,191.83,202.4,167116119.0 +2945,2023-02-23,203.45,205.13,196.33,200.43,126002008.0 +2946,2023-02-24,198.1,201.33,192.8,196.48,121759004.0 +2947,2023-02-27,198.0,209.42,195.68,209.09,135811509.0 +2948,2023-02-28,208.08,212.6,203.75,204.7,129887964.0 +2949,2023-03-01,207.66,209.05,189.0,191.3,135485305.0 +2950,2023-03-02,191.4,193.75,185.42,190.85,154029003.0 +2951,2023-03-03,191.96,200.48,190.8,198.3,132018423.0 +2952,2023-03-06,198.45,199.6,192.3,193.03,111186290.0 +2953,2023-03-07,194.11,194.68,186.1,188.12,127160413.0 +2954,2023-03-08,187.45,188.2,180.0,180.62,130599496.0 +2955,2023-03-09,179.28,185.18,169.65,169.9,142783264.0 +2956,2023-03-10,171.84,178.29,168.44,174.47,163214327.0 +2957,2023-03-13,178.0,179.25,164.0,174.4,141125454.0 +2958,2023-03-14,174.72,184.49,173.8,184.15,124651497.0 +2959,2023-03-15,184.5,185.66,176.03,180.54,124829688.0 +2960,2023-03-16,180.99,185.81,178.84,183.86,103701677.0 +2961,2023-03-17,184.14,186.22,177.33,179.05,113188518.0 +2962,2023-03-20,176.45,186.44,176.29,183.31,111938751.0 +2963,2023-03-21,184.56,198.0,183.42,197.5,129806598.0 +2964,2023-03-22,197.6,200.66,189.8,192.36,127873104.0 +2965,2023-03-23,194.3,199.31,188.65,192.9,122801841.0 +2966,2023-03-24,194.0,194.28,187.15,190.23,100588036.0 +2967,2023-03-27,190.23,197.39,189.6,192.96,105008001.0 +2968,2023-03-28,192.36,193.95,185.43,189.65,85183670.0 +2969,2023-03-29,191.27,195.29,189.44,192.78,107927597.0 +2970,2023-03-30,194.66,197.33,193.12,195.35,94431494.0 +2971,2023-03-31,195.35,208.0,195.15,207.65,146669747.0 +2972,2023-04-03,204.0,206.8,192.2,193.2,141493469.0 +2973,2023-04-04,194.51,198.75,190.32,192.75,105533822.0 +2974,2023-04-05,192.35,194.0,183.76,184.19,112676921.0 +2975,2023-04-06,184.81,187.2,179.83,185.0,105769070.0 +2976,2023-04-10,183.56,185.9,176.11,184.4,123177931.0 +2977,2023-04-11,184.51,189.19,184.15,186.6,100721415.0 +2978,2023-04-12,186.29,191.59,179.75,179.9,131472591.0 +2979,2023-04-13,181.25,186.5,180.33,185.95,99401779.0 +2980,2023-04-14,185.36,186.57,182.01,185.0,84119837.0 diff --git a/examples/7_panes/pane.py b/examples/7_panes/pane.py new file mode 100644 index 00000000..66920f9d --- /dev/null +++ b/examples/7_panes/pane.py @@ -0,0 +1,55 @@ +import os +import pandas as pd + +from lightweight_charts import Chart + + +def calculate_sma(df, period: int = 50): + return pd.DataFrame( + {"time": df["date"], f"SMA {period}": df["close"].rolling(window=period).mean()} + ).dropna() + + +def calculate_macd(df, short_period=12, long_period=26, signal_period=9): + short_ema = df["close"].ewm(span=short_period, adjust=False).mean() + long_ema = df["close"].ewm(span=long_period, adjust=False).mean() + macd = short_ema - long_ema + signal = macd.ewm(span=signal_period, adjust=False).mean() + histogram = macd - signal + return pd.DataFrame( + { + "time": df["date"], + "MACD": macd, + "Signal": signal, + "Histogram": histogram, + } + ).dropna() + + +if __name__ == "__main__": + chart = Chart(inner_height=1) + chart.legend(visible=True) + + chart.watermark("Main") + + path = os.path.join(os.path.dirname(__file__), "ohlcv.csv") + + df = pd.read_csv(path) + + df = df.head(10) + + chart.set(df) + + sma_data = calculate_sma(df, period=5) + + line = chart.create_line("SMA 5") + line.set(sma_data) + + # Subchart with MACD + + macd_data = calculate_macd(df) + + histogram = chart.create_histogram("MACD", pane_index=1) + histogram.set(macd_data[["time", "MACD", "Signal", "Histogram"]]) + + chart.show(block=True) diff --git a/examples/7_panes/panes.png b/examples/7_panes/panes.png new file mode 100644 index 0000000000000000000000000000000000000000..3427ade5e7709b763fd8645c3a1268821b41a06b GIT binary patch literal 21951 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 literal 0 HcmV?d00001 diff --git a/lightweight_charts/abstract.py b/lightweight_charts/abstract.py index 0091d3f2..15c67002 100644 --- a/lightweight_charts/abstract.py +++ b/lightweight_charts/abstract.py @@ -8,16 +8,39 @@ from .table import Table from .toolbox import ToolBox -from .drawings import Box, HorizontalLine, RayLine, TrendLine, TwoPointDrawing, VerticalLine, VerticalSpan +from .drawings import ( + Box, + HorizontalLine, + RayLine, + TrendLine, + TwoPointDrawing, + VerticalLine, + VerticalSpan, +) from .topbar import TopBar from .util import ( - BulkRunScript, Pane, Events, IDGen, as_enum, jbool, js_json, TIME, NUM, FLOAT, - LINE_STYLE, MARKER_POSITION, MARKER_SHAPE, CROSSHAIR_MODE, - PRICE_SCALE_MODE, marker_position, marker_shape, js_data, + BulkRunScript, + Pane, + Events, + IDGen, + as_enum, + jbool, + js_json, + TIME, + NUM, + FLOAT, + LINE_STYLE, + MARKER_POSITION, + MARKER_SHAPE, + CROSSHAIR_MODE, + PRICE_SCALE_MODE, + marker_position, + marker_shape, + js_data, ) current_dir = os.path.dirname(os.path.abspath(__file__)) -INDEX = os.path.join(current_dir, 'js', 'index.html') +INDEX = os.path.join(current_dir, "js", "index.html") class Window: @@ -28,7 +51,7 @@ def __init__( self, script_func: Optional[Callable] = None, js_api_code: Optional[str] = None, - run_script: Optional[Callable] = None + run_script: Optional[Callable] = None, ): self.loaded = False self.script_func = script_func @@ -40,27 +63,28 @@ def __init__( self.run_script = run_script if js_api_code: - self.run_script(f'window.callbackFunction = {js_api_code}') + self.run_script(f"window.callbackFunction = {js_api_code}") def on_js_load(self): if self.loaded: return self.loaded = True - if hasattr(self, '_return_q'): + if hasattr(self, "_return_q"): while not self.run_script_and_get('document.readyState == "complete"'): - continue # scary, but works + continue # scary, but works - initial_script = '' + initial_script = "" self.scripts.extend(self.final_scripts) for script in self.scripts: - initial_script += f'\n{script}' + initial_script += f"\n{script}" self.script_func(initial_script) def run_script(self, script: str, run_last: bool = False): """ For advanced users; evaluates JavaScript within the Webview. """ + if self.script_func is None: raise AttributeError("script_func has not been set") if self.loaded: @@ -74,7 +98,7 @@ def run_script(self, script: str, run_last: bool = False): self.scripts.append(script) def run_script_and_get(self, script: str): - self.run_script(f'_~_~RETURN~_~_{script}') + self.run_script(f"_~_~RETURN~_~_{script}") return self._return_q.get() def create_table( @@ -84,66 +108,64 @@ def create_table( headings: tuple, widths: Optional[tuple] = None, alignments: Optional[tuple] = None, - position: FLOAT = 'left', + position: FLOAT = "left", draggable: bool = False, - background_color: str = '#121417', - border_color: str = 'rgb(70, 70, 70)', + background_color: str = "#121417", + border_color: str = "rgb(70, 70, 70)", border_width: int = 1, heading_text_colors: Optional[tuple] = None, heading_background_colors: Optional[tuple] = None, return_clicked_cells: bool = False, - func: Optional[Callable] = None - ) -> 'Table': + func: Optional[Callable] = None, + ) -> "Table": return Table(*locals().values()) def create_subchart( self, - position: FLOAT = 'left', + position: FLOAT = "left", width: float = 0.5, height: float = 0.5, sync_id: Optional[str] = None, scale_candles_only: bool = False, sync_crosshairs_only: bool = False, - toolbox: bool = False - ) -> 'AbstractChart': + toolbox: bool = False, + ) -> "AbstractChart": subchart = AbstractChart( - self, - width, - height, - scale_candles_only, - toolbox, - position=position + self, width, height, scale_candles_only, toolbox, position=position ) if not sync_id: return subchart - self.run_script(f''' + self.run_script( + f""" Lib.Handler.syncCharts( {subchart.id}, {sync_id}, {jbool(sync_crosshairs_only)} ) - ''', run_last=True) + """, + run_last=True, + ) return subchart def style( self, - background_color: str = '#0c0d0f', - hover_background_color: str = '#3c434c', - click_background_color: str = '#50565E', - active_background_color: str = 'rgba(0, 122, 255, 0.7)', - muted_background_color: str = 'rgba(0, 122, 255, 0.3)', - border_color: str = '#3C434C', - color: str = '#d8d9db', - active_color: str = '#ececed' + background_color: str = "#0c0d0f", + hover_background_color: str = "#3c434c", + click_background_color: str = "#50565E", + active_background_color: str = "rgba(0, 122, 255, 0.7)", + muted_background_color: str = "rgba(0, 122, 255, 0.3)", + border_color: str = "#3C434C", + color: str = "#d8d9db", + active_color: str = "#ececed", ): - self.run_script(f'Lib.Handler.setRootStyles({js_json(locals())});') + self.run_script(f"Lib.Handler.setRootStyles({js_json(locals())});") class SeriesCommon(Pane): - def __init__(self, chart: 'AbstractChart', name: str = ''): + def __init__(self, chart: "AbstractChart", name: str = "", pane_index: int = None): super().__init__(chart.win) self._chart = chart - if hasattr(chart, '_interval'): + if hasattr(chart, "_interval"): self._interval = chart._interval else: self._interval = 1 @@ -153,21 +175,24 @@ def __init__(self, chart: 'AbstractChart', name: str = ''): self.offset = 0 self.data = pd.DataFrame() self.markers = {} + self.pane_index = pane_index def _set_interval(self, df: pd.DataFrame): - if not pd.api.types.is_datetime64_any_dtype(df['time']): - df['time'] = pd.to_datetime(df['time']) - common_interval = df['time'].diff().value_counts() + if not pd.api.types.is_datetime64_any_dtype(df["time"]): + df["time"] = pd.to_datetime(df["time"]) + common_interval = df["time"].diff().value_counts() if common_interval.empty: return self._interval = common_interval.index[0].total_seconds() units = [ - pd.Timedelta(microseconds=df['time'].dt.microsecond.value_counts().index[0]), - pd.Timedelta(seconds=df['time'].dt.second.value_counts().index[0]), - pd.Timedelta(minutes=df['time'].dt.minute.value_counts().index[0]), - pd.Timedelta(hours=df['time'].dt.hour.value_counts().index[0]), - pd.Timedelta(days=df['time'].dt.day.value_counts().index[0]), + pd.Timedelta( + microseconds=df["time"].dt.microsecond.value_counts().index[0] + ), + pd.Timedelta(seconds=df["time"].dt.second.value_counts().index[0]), + pd.Timedelta(minutes=df["time"].dt.minute.value_counts().index[0]), + pd.Timedelta(hours=df["time"].dt.hour.value_counts().index[0]), + pd.Timedelta(days=df["time"].dt.day.value_counts().index[0]), ] self.offset = 0 for value in units: @@ -183,44 +208,49 @@ def _set_interval(self, df: pd.DataFrame): def _format_labels(data, labels, index, exclude_lowercase): def rename(la, mapper): return [mapper[key] if key in mapper else key for key in la] - if 'date' not in labels and 'time' not in labels: + + if "date" not in labels and "time" not in labels: labels = labels.str.lower() if exclude_lowercase: labels = rename(labels, {exclude_lowercase.lower(): exclude_lowercase}) - if 'date' in labels: - labels = rename(labels, {'date': 'time'}) - elif 'time' not in labels: - data['time'] = index - labels = [*labels, 'time'] + if "date" in labels: + labels = rename(labels, {"date": "time"}) + elif "time" not in labels: + data["time"] = index + labels = [*labels, "time"] return labels def _df_datetime_format(self, df: pd.DataFrame, exclude_lowercase=None): df = df.copy() df.columns = self._format_labels(df, df.columns, df.index, exclude_lowercase) self._set_interval(df) - if not pd.api.types.is_datetime64_any_dtype(df['time']): - df['time'] = pd.to_datetime(df['time']) - df['time'] = df['time'].astype('int64') // 10 ** 9 + if not pd.api.types.is_datetime64_any_dtype(df["time"]): + df["time"] = pd.to_datetime(df["time"]) + df["time"] = df["time"].astype("int64") // 10**9 return df def _series_datetime_format(self, series: pd.Series, exclude_lowercase=None): series = series.copy() - series.index = self._format_labels(series, series.index, series.name, exclude_lowercase) - series['time'] = self._single_datetime_format(series['time']) + series.index = self._format_labels( + series, series.index, series.name, exclude_lowercase + ) + series["time"] = self._single_datetime_format(series["time"]) return series def _single_datetime_format(self, arg) -> float: - if isinstance(arg, (str, int, float)) or not pd.api.types.is_datetime64_any_dtype(arg): + if isinstance( + arg, (str, int, float) + ) or not pd.api.types.is_datetime64_any_dtype(arg): try: - arg = pd.to_datetime(arg, unit='ms') + arg = pd.to_datetime(arg, unit="ms") except ValueError: arg = pd.to_datetime(arg) - arg = self._interval * (arg.timestamp() // self._interval)+self.offset + arg = self._interval * (arg.timestamp() // self._interval) + self.offset return arg def set(self, df: Optional[pd.DataFrame] = None, format_cols: bool = True): if df is None or df.empty: - self.run_script(f'{self.id}.series.setData([])') + self.run_script(f"{self.id}.series.setData([])") self.data = pd.DataFrame() return if format_cols: @@ -228,23 +258,24 @@ def set(self, df: Optional[pd.DataFrame] = None, format_cols: bool = True): if self.name: if self.name not in df: raise NameError(f'No column named "{self.name}".') - df = df.rename(columns={self.name: 'value'}) + df = df.rename(columns={self.name: "value"}) self.data = df.copy() self._last_bar = df.iloc[-1] - self.run_script(f'{self.id}.series.setData({js_data(df)}); ') + self.run_script(f"{self.id}.series.setData({js_data(df)}); ") def update(self, series: pd.Series): series = self._series_datetime_format(series, exclude_lowercase=self.name) if self.name in series.index: - series.rename({self.name: 'value'}, inplace=True) - if self._last_bar is not None and series['time'] != self._last_bar['time']: + series.rename({self.name: "value"}, inplace=True) + if self._last_bar is not None and series["time"] != self._last_bar["time"]: self.data.loc[self.data.index[-1]] = self._last_bar self.data = pd.concat([self.data, series.to_frame().T], ignore_index=True) self._last_bar = series - self.run_script(f'{self.id}.series.update({js_data(series)})') + self.run_script(f"{self.id}.series.update({js_data(series)})") def _update_markers(self): - self.run_script(f'{self.id}.series.setMarkers({json.dumps(list(self.markers.values()))})') + self.run_script(f'{self.id}.seriesMarkers.setMarkers({json.dumps(list(self.markers.values()))})') + def marker_list(self, markers: list): """ @@ -262,19 +293,24 @@ def marker_list(self, markers: list): for marker in markers: marker_id = self.win._id_gen.generate() self.markers[marker_id] = { - "time": self._single_datetime_format(marker['time']), - "position": marker_position(marker['position']), - "color": marker['color'], - "shape": marker_shape(marker['shape']), - "text": marker['text'], + "time": self._single_datetime_format(marker["time"]), + "position": marker_position(marker["position"]), + "color": marker["color"], + "shape": marker_shape(marker["shape"]), + "text": marker["text"], } marker_ids.append(marker_id) self._update_markers() return marker_ids - def marker(self, time: Optional[datetime] = None, position: MARKER_POSITION = 'below', - shape: MARKER_SHAPE = 'arrow_up', color: str = '#2196F3', text: str = '' - ) -> str: + def marker( + self, + time: Optional[datetime] = None, + position: MARKER_POSITION = "below", + shape: MARKER_SHAPE = "arrow_up", + color: str = "#2196F3", + text: str = "", + ) -> str: """ Creates a new marker.\n :param time: Time location of the marker. If no time is given, it will be placed at the last bar. @@ -285,13 +321,17 @@ def marker(self, time: Optional[datetime] = None, position: MARKER_POSITION = 'b :return: The id of the marker placed. """ try: - formatted_time = self._last_bar['time'] if not time else self._single_datetime_format(time) + formatted_time = ( + self._last_bar["time"] + if not time + else self._single_datetime_format(time) + ) except TypeError: - raise TypeError('Chart marker created before data was set.') + raise TypeError("Chart marker created before data was set.") marker_id = self.win._id_gen.generate() self.markers[marker_id] = { - "time": formatted_time, + "time": int(formatted_time), "position": marker_position(position), "color": color, "shape": marker_shape(shape), @@ -307,14 +347,22 @@ def remove_marker(self, marker_id: str): self.markers.pop(marker_id) self._update_markers() - def horizontal_line(self, price: NUM, color: str = 'rgb(122, 146, 202)', width: int = 2, - style: LINE_STYLE = 'solid', text: str = '', axis_label_visible: bool = True, - func: Optional[Callable] = None - ) -> 'HorizontalLine': + def horizontal_line( + self, + price: NUM, + color: str = "rgb(122, 146, 202)", + width: int = 2, + style: LINE_STYLE = "solid", + text: str = "", + axis_label_visible: bool = True, + func: Optional[Callable] = None, + ) -> "HorizontalLine": """ Creates a horizontal line at the given price. """ - return HorizontalLine(self, price, color, width, style, text, axis_label_visible, func) + return HorizontalLine( + self, price, color, width, style, text, axis_label_visible, func + ) def trend_line( self, @@ -323,9 +371,9 @@ def trend_line( end_time: TIME, end_value: NUM, round: bool = False, - line_color: str = '#1E80F0', + line_color: str = "#1E80F0", width: int = 2, - style: LINE_STYLE = 'solid', + style: LINE_STYLE = "solid", ) -> TwoPointDrawing: return TrendLine(*locals().values()) @@ -336,10 +384,10 @@ def box( end_time: TIME, end_value: NUM, round: bool = False, - color: str = '#1E80F0', - fill_color: str = 'rgba(255, 255, 255, 0.2)', + color: str = "#1E80F0", + fill_color: str = "rgba(255, 255, 255, 0.2)", width: int = 2, - style: LINE_STYLE = 'solid', + style: LINE_STYLE = "solid", ) -> TwoPointDrawing: return Box(*locals().values()) @@ -348,21 +396,21 @@ def ray_line( start_time: TIME, value: NUM, round: bool = False, - color: str = '#1E80F0', + color: str = "#1E80F0", width: int = 2, - style: LINE_STYLE = 'solid', - text: str = '' + style: LINE_STYLE = "solid", + text: str = "", ) -> RayLine: - # TODO + # TODO return RayLine(*locals().values()) def vertical_line( self, time: TIME, - color: str = '#1E80F0', + color: str = "#1E80F0", width: int = 2, - style: LINE_STYLE ='solid', - text: str = '' + style: LINE_STYLE = "solid", + text: str = "", ) -> VerticalLine: return VerticalLine(*locals().values()) @@ -373,13 +421,17 @@ def clear_markers(self): self.markers.clear() self._update_markers() - def price_line(self, label_visible: bool = True, line_visible: bool = True, title: str = ''): - self.run_script(f''' + def price_line( + self, label_visible: bool = True, line_visible: bool = True, title: str = "" + ): + self.run_script( + f""" {self.id}.series.applyOptions({{ lastValueVisible: {jbool(label_visible)}, priceLineVisible: {jbool(line_visible)}, title: '{title}', - }})''') + }})""" + ) def precision(self, precision: int): """ @@ -387,10 +439,12 @@ def precision(self, precision: int): :param precision: The number of decimal places. """ min_move = 1 / (10**precision) - self.run_script(f''' + self.run_script( + f""" {self.id}.series.applyOptions({{ priceFormat: {{precision: {precision}, minMove: {min_move}}} - }})''') + }})""" + ) self.num_decimals = precision def hide_data(self): @@ -400,17 +454,19 @@ def show_data(self): self._toggle_data(True) def _toggle_data(self, arg): - self.run_script(f''' + self.run_script( + f""" {self.id}.series.applyOptions({{visible: {jbool(arg)}}}) if ('volumeSeries' in {self.id}) {self.id}.volumeSeries.applyOptions({{visible: {jbool(arg)}}}) - ''') + """ + ) def vertical_span( self, start_time: Union[TIME, tuple, list], end_time: Optional[TIME] = None, - color: str = 'rgba(252, 219, 3, 0.2)', - round: bool = False + color: str = "rgba(252, 219, 3, 0.2)", + round: bool = False, ): """ Creates a vertical line or span across the chart.\n @@ -424,12 +480,25 @@ def vertical_span( class Line(SeriesCommon): - def __init__(self, chart, name, color, style, width, price_line, price_label, price_scale_id=None, crosshair_marker=True): + def __init__( + self, + chart, + name, + color, + style, + width, + price_line, + price_label, + price_scale_id=None, + crosshair_marker=True, + pane_index: int = None, + ): - super().__init__(chart, name) + super().__init__(chart, name, pane_index) self.color = color - self.run_script(f''' + self.run_script( + f''' {self.id} = {self._chart.id}.createLineSeries( "{name}", {{ @@ -439,7 +508,7 @@ def __init__(self, chart, name, color, style, width, price_line, price_label, pr lastValueVisible: {jbool(price_label)}, priceLineVisible: {jbool(price_line)}, crosshairMarkerVisible: {jbool(crosshair_marker)}, - priceScaleId: {f'"{price_scale_id}"' if price_scale_id else 'undefined'} + priceScaleId: {f'"{price_scale_id}"' if price_scale_id else 'undefined'}, {"""autoscaleInfoProvider: () => ({ priceRange: { minValue: 1_000_000_000, @@ -447,9 +516,12 @@ def __init__(self, chart, name, color, style, width, price_line, price_label, pr }, }), """ if chart._scale_candles_only else ''} - }} + + }}, + {f'{pane_index},' if pane_index is not None else '0'} ) - null''') + null''' + ) # def _set_trend(self, start_time, start_value, end_time, end_value, ray=False, round=False): # if round: @@ -471,7 +543,8 @@ def delete(self): Irreversibly deletes the line, as well as the object that contains the line. """ self._chart._lines.remove(self) if self in self._chart._lines else None - self.run_script(f''' + self.run_script( + f""" {self.id}legendItem = {self._chart.id}.legend._lines.find((line) => line.series == {self.id}.series) {self._chart.id}.legend._lines = {self._chart.id}.legend._lines.filter((item) => item != {self.id}legendItem) @@ -482,14 +555,26 @@ def delete(self): {self._chart.id}.chart.removeSeries({self.id}.series) delete {self.id}legendItem delete {self.id} - ''') + """ + ) class Histogram(SeriesCommon): - def __init__(self, chart, name, color, price_line, price_label, scale_margin_top, scale_margin_bottom): - super().__init__(chart, name) + def __init__( + self, + chart, + name, + color, + price_line, + price_label, + scale_margin_top, + scale_margin_bottom, + pane_index: int = None, + ): + super().__init__(chart, name, pane_index) self.color = color - self.run_script(f''' + self.run_script( + f""" {self.id} = {chart.id}.createHistogramSeries( "{name}", {{ @@ -499,17 +584,19 @@ def __init__(self, chart, name, color, price_line, price_label, scale_margin_top priceScaleId: '{self.id}', priceFormat: {{type: "volume"}}, }}, - // precision: 2, + {f'{pane_index}' if pane_index is not None else '0'} ) {self.id}.series.priceScale().applyOptions({{ scaleMargins: {{top:{scale_margin_top}, bottom: {scale_margin_bottom}}} - }})''') + }})""" + ) def delete(self): """ Irreversibly deletes the histogram. """ - self.run_script(f''' + self.run_script( + f""" {self.id}legendItem = {self._chart.id}.legend._lines.find((line) => line.series == {self.id}.series) {self._chart.id}.legend._lines = {self._chart.id}.legend._lines.filter((item) => item != {self.id}legendItem) @@ -520,20 +607,23 @@ def delete(self): {self._chart.id}.chart.removeSeries({self.id}.series) delete {self.id}legendItem delete {self.id} - ''') + """ + ) def scale(self, scale_margin_top: float = 0.0, scale_margin_bottom: float = 0.0): - self.run_script(f''' + self.run_script( + f""" {self.id}.series.priceScale().applyOptions({{ scaleMargins: {{top: {scale_margin_top}, bottom: {scale_margin_bottom}}} - }})''') + }})""" + ) class Candlestick(SeriesCommon): - def __init__(self, chart: 'AbstractChart'): + def __init__(self, chart: "AbstractChart"): super().__init__(chart) - self._volume_up_color = 'rgba(83,141,131,0.8)' - self._volume_down_color = 'rgba(200,127,130,0.8)' + self._volume_up_color = "rgba(83,141,131,0.8)" + self._volume_down_color = "rgba(200,127,130,0.8)" self.candle_data = pd.DataFrame() @@ -546,34 +636,40 @@ def set(self, df: Optional[pd.DataFrame] = None, keep_drawings=False): :param keep_drawings: keeps any drawings made through the toolbox. Otherwise, they will be deleted. """ if df is None or df.empty: - self.run_script(f'{self.id}.series.setData([])') - self.run_script(f'{self.id}.volumeSeries.setData([])') + self.run_script(f"{self.id}.series.setData([])") + self.run_script(f"{self.id}.volumeSeries.setData([])") self.candle_data = pd.DataFrame() return df = self._df_datetime_format(df) self.candle_data = df.copy() self._last_bar = df.iloc[-1] - self.run_script(f'{self.id}.series.setData({js_data(df)})') + self.run_script(f"{self.id}.series.setData({js_data(df)})") - if 'volume' not in df: + if "volume" not in df: return - volume = df.drop(columns=['open', 'high', 'low', 'close']).rename(columns={'volume': 'value'}) - volume['color'] = self._volume_down_color - volume.loc[df['close'] > df['open'], 'color'] = self._volume_up_color - self.run_script(f'{self.id}.volumeSeries.setData({js_data(volume)})') + volume = df.drop(columns=["open", "high", "low", "close"]).rename( + columns={"volume": "value"} + ) + volume["color"] = self._volume_down_color + volume.loc[df["close"] > df["open"], "color"] = self._volume_up_color + self.run_script(f"{self.id}.volumeSeries.setData({js_data(volume)})") for line in self._lines: if line.name not in df.columns: continue - line.set(df[['time', line.name]], format_cols=False) + line.set(df[["time", line.name]], format_cols=False) # set autoScale to true in case the user has dragged the price scale - self.run_script(f''' - if (!{self.id}.chart.priceScale("right").options.autoScale) + self.run_script( + f""" + if (!{self.id}.chart.priceScale("right")?.options?.autoScale) // precision: 2, {self.id}.chart.priceScale("right").applyOptions({{autoScale: true}}) - ''') + """ + ) # TODO keep drawings doesn't work consistenly w if keep_drawings: - self.run_script(f'{self._chart.id}.toolBox?._drawingTool.repositionOnTime()') + self.run_script( + f"{self._chart.id}.toolBox?._drawingTool.repositionOnTime()" + ) else: self.run_script(f"{self._chart.id}.toolBox?.clearDrawings()") @@ -584,18 +680,26 @@ def update(self, series: pd.Series, _from_tick=False): :param series: labels: date/time, open, high, low, close, volume (if using volume). """ series = self._series_datetime_format(series) if not _from_tick else series - if series['time'] != self._last_bar['time']: + if series["time"] != self._last_bar["time"]: self.candle_data.loc[self.candle_data.index[-1]] = self._last_bar - self.candle_data = pd.concat([self.candle_data, series.to_frame().T], ignore_index=True) + self.candle_data = pd.concat( + [self.candle_data, series.to_frame().T], ignore_index=True + ) self._chart.events.new_bar._emit(self) self._last_bar = series - self.run_script(f'{self.id}.series.update({js_data(series)})') - if 'volume' not in series: + self.run_script(f"{self.id}.series.update({js_data(series)})") + if "volume" not in series: return - volume = series.drop(['open', 'high', 'low', 'close']).rename({'volume': 'value'}) - volume['color'] = self._volume_up_color if series['close'] > series['open'] else self._volume_down_color - self.run_script(f'{self.id}.volumeSeries.update({js_data(volume)})') + volume = series.drop(["open", "high", "low", "close"]).rename( + {"volume": "value"} + ) + volume["color"] = ( + self._volume_up_color + if series["close"] > series["open"] + else self._volume_down_color + ) + self.run_script(f"{self.id}.volumeSeries.update({js_data(volume)})") def update_from_tick(self, series: pd.Series, cumulative_volume: bool = False): """ @@ -604,31 +708,33 @@ def update_from_tick(self, series: pd.Series, cumulative_volume: bool = False): :param cumulative_volume: Adds the given volume onto the latest bar. """ series = self._series_datetime_format(series) - if series['time'] < self._last_bar['time']: - raise ValueError(f'Trying to update tick of time "{pd.to_datetime(series["time"])}", which occurs before the last bar time of "{pd.to_datetime(self._last_bar["time"])}".') - bar = pd.Series(dtype='float64') - if series['time'] == self._last_bar['time']: + if series["time"] < self._last_bar["time"]: + raise ValueError( + f'Trying to update tick of time "{pd.to_datetime(series["time"])}", which occurs before the last bar time of "{pd.to_datetime(self._last_bar["time"])}".' + ) + bar = pd.Series(dtype="float64") + if series["time"] == self._last_bar["time"]: bar = self._last_bar - bar['high'] = max(self._last_bar['high'], series['price']) - bar['low'] = min(self._last_bar['low'], series['price']) - bar['close'] = series['price'] - if 'volume' in series: + bar["high"] = max(self._last_bar["high"], series["price"]) + bar["low"] = min(self._last_bar["low"], series["price"]) + bar["close"] = series["price"] + if "volume" in series: if cumulative_volume: - bar['volume'] += series['volume'] + bar["volume"] += series["volume"] else: - bar['volume'] = series['volume'] + bar["volume"] = series["volume"] else: - for key in ('open', 'high', 'low', 'close'): - bar[key] = series['price'] - bar['time'] = series['time'] - if 'volume' in series: - bar['volume'] = series['volume'] + for key in ("open", "high", "low", "close"): + bar[key] = series["price"] + bar["time"] = series["time"] + if "volume" in series: + bar["volume"] = series["volume"] self.update(bar, _from_tick=True) def price_scale( self, auto_scale: bool = True, - mode: PRICE_SCALE_MODE = 'normal', + mode: PRICE_SCALE_MODE = "normal", invert_scale: bool = False, align_labels: bool = True, scale_margin_top: float = 0.2, @@ -639,9 +745,10 @@ def price_scale( entire_text_only: bool = False, visible: bool = True, ticks_visible: bool = False, - minimum_width: int = 0 + minimum_width: int = 0, ): - self.run_script(f''' + self.run_script( + f""" {self.id}.series.priceScale().applyOptions({{ autoScale: {jbool(auto_scale)}, mode: {as_enum(mode, PRICE_SCALE_MODE)}, @@ -655,12 +762,20 @@ def price_scale( visible: {jbool(visible)}, ticksVisible: {jbool(ticks_visible)}, minimumWidth: {minimum_width} - }})''') + }})""" + ) def candle_style( - self, up_color: str = 'rgba(39, 157, 130, 100)', down_color: str = 'rgba(200, 97, 100, 100)', - wick_visible: bool = True, border_visible: bool = True, border_up_color: str = '', - border_down_color: str = '', wick_up_color: str = '', wick_down_color: str = ''): + self, + up_color: str = "rgba(39, 157, 130, 100)", + down_color: str = "rgba(200, 97, 100, 100)", + wick_visible: bool = True, + border_visible: bool = True, + border_up_color: str = "", + border_down_color: str = "", + wick_up_color: str = "", + wick_down_color: str = "", + ): """ Candle styling for each of its parts.\n If only `up_color` and `down_color` are passed, they will color all parts of the candle. @@ -671,8 +786,13 @@ def candle_style( wick_down_color = wick_down_color if wick_down_color else down_color self.run_script(f"{self.id}.series.applyOptions({js_json(locals())})") - def volume_config(self, scale_margin_top: float = 0.8, scale_margin_bottom: float = 0.0, - up_color='rgba(83,141,131,0.8)', down_color='rgba(200,127,130,0.8)'): + def volume_config( + self, + scale_margin_top: float = 0.8, + scale_margin_bottom: float = 0.0, + up_color="rgba(83,141,131,0.8)", + down_color="rgba(200,127,130,0.8)", + ): """ Configure volume settings.\n Numbers for scaling must be greater than 0 and less than 1.\n @@ -680,19 +800,28 @@ def volume_config(self, scale_margin_top: float = 0.8, scale_margin_bottom: floa """ self._volume_up_color = up_color if up_color else self._volume_up_color self._volume_down_color = down_color if down_color else self._volume_down_color - self.run_script(f''' + self.run_script( + f""" {self.id}.volumeSeries.priceScale().applyOptions({{ scaleMargins: {{ top: {scale_margin_top}, bottom: {scale_margin_bottom}, }} - }})''') + }})""" + ) class AbstractChart(Candlestick, Pane): - def __init__(self, window: Window, width: float = 1.0, height: float = 1.0, - scale_candles_only: bool = False, toolbox: bool = False, - autosize: bool = True, position: FLOAT = 'left'): + def __init__( + self, + window: Window, + width: float = 1.0, + height: float = 1.0, + scale_candles_only: bool = False, + toolbox: bool = False, + autosize: bool = True, + position: FLOAT = "left", + ): Pane.__init__(self, window) self._lines = [] @@ -702,10 +831,12 @@ def __init__(self, window: Window, width: float = 1.0, height: float = 1.0, self.events: Events = Events(self) from lightweight_charts.polygon import PolygonAPI + self.polygon: PolygonAPI = PolygonAPI(self) self.run_script( - f'{self.id} = new Lib.Handler("{self.id}", {width}, {height}, "{position}", {jbool(autosize)})') + f'{self.id} = new Lib.Handler("{self.id}", {width}, {height}, "{position}", {jbool(autosize)})' + ) Candlestick.__init__(self, self) @@ -717,30 +848,60 @@ def fit(self): """ Fits the maximum amount of the chart data within the viewport. """ - self.run_script(f'{self.id}.chart.timeScale().fitContent()') + self.run_script(f"{self.id}.chart.timeScale().fitContent()") def create_line( - self, name: str = '', color: str = 'rgba(214, 237, 255, 0.6)', - style: LINE_STYLE = 'solid', width: int = 2, - price_line: bool = True, price_label: bool = True, price_scale_id: Optional[str] = None + self, + name: str = "", + color: str = "rgba(214, 237, 255, 0.6)", + style: LINE_STYLE = "solid", + width: int = 2, + price_line: bool = True, + price_label: bool = True, + price_scale_id: Optional[str] = None, + pane_index: int = None, ) -> Line: """ Creates and returns a Line object. """ - self._lines.append(Line(self, name, color, style, width, price_line, price_label, price_scale_id)) + self._lines.append( + Line( + self, + name, + color, + style, + width, + price_line, + price_label, + price_scale_id, + pane_index=pane_index, + ) + ) return self._lines[-1] def create_histogram( - self, name: str = '', color: str = 'rgba(214, 237, 255, 0.6)', - price_line: bool = True, price_label: bool = True, - scale_margin_top: float = 0.0, scale_margin_bottom: float = 0.0 + self, + name: str = "", + color: str = "rgba(214, 237, 255, 0.6)", + price_line: bool = True, + price_label: bool = True, + scale_margin_top: float = 0.0, + scale_margin_bottom: float = 0.0, + pane_index: int = 0, ) -> Histogram: """ Creates and returns a Histogram object. """ return Histogram( - self, name, color, price_line, price_label, - scale_margin_top, scale_margin_bottom) + self, + name, + color, + price_line, + price_label, + scale_margin_top, + scale_margin_bottom, + pane_index, + ) def lines(self) -> List[Line]: """ @@ -749,12 +910,14 @@ def lines(self) -> List[Line]: return self._lines.copy() def set_visible_range(self, start_time: TIME, end_time: TIME): - self.run_script(f''' + self.run_script( + f""" {self.id}.chart.timeScale().setVisibleRange({{ from: {pd.to_datetime(start_time).timestamp()}, to: {pd.to_datetime(end_time).timestamp()} }}) - ''') + """ + ) def resize(self, width: Optional[float] = None, height: Optional[float] = None): """ @@ -763,26 +926,43 @@ def resize(self, width: Optional[float] = None, height: Optional[float] = None): """ self._width = width if width is not None else self._width self._height = height if height is not None else self._height - self.run_script(f''' + self.run_script( + f""" {self.id}.scale.width = {self._width} {self.id}.scale.height = {self._height} {self.id}.reSize() - ''') + """ + ) - def time_scale(self, right_offset: int = 0, min_bar_spacing: float = 0.5, - visible: bool = True, time_visible: bool = True, seconds_visible: bool = False, - border_visible: bool = True, border_color: Optional[str] = None): + def time_scale( + self, + right_offset: int = 0, + min_bar_spacing: float = 0.5, + visible: bool = True, + time_visible: bool = True, + seconds_visible: bool = False, + border_visible: bool = True, + border_color: Optional[str] = None, + ): """ Options for the timescale of the chart. """ - self.run_script(f'''{self.id}.chart.applyOptions({{timeScale: {js_json(locals())}}})''') + self.run_script( + f"""{self.id}.chart.applyOptions({{timeScale: {js_json(locals())}}})""" + ) - def layout(self, background_color: str = '#000000', text_color: Optional[str] = None, - font_size: Optional[int] = None, font_family: Optional[str] = None): + def layout( + self, + background_color: str = "#000000", + text_color: Optional[str] = None, + font_size: Optional[int] = None, + font_family: Optional[str] = None, + ): """ Global layout options for the chart. """ - self.run_script(f""" + self.run_script( + f""" document.getElementById('container').style.backgroundColor = '{background_color}' {self.id}.chart.applyOptions({{ layout: {{ @@ -790,14 +970,21 @@ def layout(self, background_color: str = '#000000', text_color: Optional[str] = {f'textColor: "{text_color}",' if text_color else ''} {f'fontSize: {font_size},' if font_size else ''} {f'fontFamily: "{font_family}",' if font_family else ''} - }}}})""") + }}}})""" + ) - def grid(self, vert_enabled: bool = True, horz_enabled: bool = True, - color: str = 'rgba(29, 30, 38, 5)', style: LINE_STYLE = 'solid'): + def grid( + self, + vert_enabled: bool = True, + horz_enabled: bool = True, + color: str = "rgba(29, 30, 38, 5)", + style: LINE_STYLE = "solid", + ): """ Grid styling for the chart. """ - self.run_script(f""" + self.run_script( + f""" {self.id}.chart.applyOptions({{ grid: {{ vertLines: {{ @@ -811,26 +998,28 @@ def grid(self, vert_enabled: bool = True, horz_enabled: bool = True, style: {as_enum(style, LINE_STYLE)}, }}, }} - }})""") + }})""" + ) def crosshair( self, - mode: CROSSHAIR_MODE = 'normal', + mode: CROSSHAIR_MODE = "normal", vert_visible: bool = True, vert_width: int = 1, vert_color: Optional[str] = None, - vert_style: LINE_STYLE = 'large_dashed', - vert_label_background_color: str = 'rgb(46, 46, 46)', + vert_style: LINE_STYLE = "large_dashed", + vert_label_background_color: str = "rgb(46, 46, 46)", horz_visible: bool = True, horz_width: int = 1, horz_color: Optional[str] = None, - horz_style: LINE_STYLE = 'large_dashed', - horz_label_background_color: str = 'rgb(55, 55, 55)' + horz_style: LINE_STYLE = "large_dashed", + horz_label_background_color: str = "rgb(55, 55, 55)", ): """ Crosshair formatting for its vertical and horizontal axes. """ - self.run_script(f''' + self.run_script( + f""" {self.id}.chart.applyOptions({{ crosshair: {{ mode: {as_enum(mode, CROSSHAIR_MODE)}, @@ -849,38 +1038,43 @@ def crosshair( labelBackgroundColor: "{horz_label_background_color}" }} }} - }})''') + }})""" + ) def watermark(self, text: str, font_size: int = 44, color: str = 'rgba(180, 180, 200, 0.5)'): """ Adds a watermark to the chart. """ - self.run_script(f''' - {self.id}.chart.applyOptions({{ - watermark: {{ - visible: true, - horzAlign: 'center', - vertAlign: 'center', - ...{js_json(locals())} - }} - }})''') + self.run_script(f'''{self._chart.id}.createWatermark('{text}', {font_size}, '{color}')''') - def legend(self, visible: bool = False, ohlc: bool = True, percent: bool = True, lines: bool = True, - color: str = 'rgb(191, 195, 203)', font_size: int = 11, font_family: str = 'Monaco', - text: str = '', color_based_on_candle: bool = False): + def legend( + self, + visible: bool = False, + ohlc: bool = True, + percent: bool = True, + lines: bool = True, + color: str = "rgb(191, 195, 203)", + font_size: int = 11, + font_family: str = "Monaco", + text: str = "", + color_based_on_candle: bool = False, + ): """ Configures the legend of the chart. """ - l_id = f'{self.id}.legend' + l_id = f"{self.id}.legend" if not visible: - self.run_script(f''' + self.run_script( + f""" {l_id}.div.style.display = "none" {l_id}.ohlcEnabled = false {l_id}.percentEnabled = false {l_id}.linesEnabled = false - ''') + """ + ) return - self.run_script(f''' + self.run_script( + f""" {l_id}.div.style.display = 'flex' {l_id}.ohlcEnabled = {jbool(ohlc)} {l_id}.percentEnabled = {jbool(percent)} @@ -891,26 +1085,34 @@ def legend(self, visible: bool = False, ohlc: bool = True, percent: bool = True, {l_id}.div.style.fontSize = '{font_size}px' {l_id}.div.style.fontFamily = '{font_family}' {l_id}.text.innerText = '{text}' - ''') + """ + ) def spinner(self, visible): - self.run_script(f"{self.id}.spinner.style.display = '{'block' if visible else 'none'}'") + self.run_script( + f"{self.id}.spinner.style.display = '{'block' if visible else 'none'}'" + ) - def hotkey(self, modifier_key: Literal['ctrl', 'alt', 'shift', 'meta', None], - keys: Union[str, tuple, int], func: Callable): + def hotkey( + self, + modifier_key: Literal["ctrl", "alt", "shift", "meta", None], + keys: Union[str, tuple, int], + func: Callable, + ): if not isinstance(keys, tuple): keys = (keys,) for key in keys: key = str(key) if key.isalnum() and len(key) == 1: - key_code = f'Digit{key}' if key.isdigit() else f'Key{key.upper()}' + key_code = f"Digit{key}" if key.isdigit() else f"Key{key.upper()}" key_condition = f'event.code === "{key_code}"' else: key_condition = f'event.key === "{key}"' if modifier_key is not None: - key_condition += f'&& event.{modifier_key}Key' + key_condition += f"&& event.{modifier_key}Key" - self.run_script(f''' + self.run_script( + f""" {self.id}.commandFunctions.unshift((event) => {{ if ({key_condition}) {{ event.preventDefault() @@ -918,8 +1120,9 @@ def hotkey(self, modifier_key: Literal['ctrl', 'alt', 'shift', 'meta', None], return true }} else return false - }})''') - self.win.handlers[f'{modifier_key, keys}'] = func + }})""" + ) + self.win.handlers[f"{modifier_key, keys}"] = func def create_table( self, @@ -928,18 +1131,18 @@ def create_table( headings: tuple, widths: Optional[tuple] = None, alignments: Optional[tuple] = None, - position: FLOAT = 'left', + position: FLOAT = "left", draggable: bool = False, - background_color: str = '#121417', - border_color: str = 'rgb(70, 70, 70)', + background_color: str = "#121417", + border_color: str = "rgb(70, 70, 70)", border_width: int = 1, heading_text_colors: Optional[tuple] = None, heading_background_colors: Optional[tuple] = None, return_clicked_cells: bool = False, - func: Optional[Callable] = None + func: Optional[Callable] = None, ) -> Table: args = locals() - del args['self'] + del args["self"] return self.win.create_table(*args.values()) def screenshot(self) -> bytes: @@ -947,15 +1150,39 @@ def screenshot(self) -> bytes: Takes a screenshot. This method can only be used after the chart window is visible. :return: a bytes object containing a screenshot of the chart. """ - serial_data = self.win.run_script_and_get(f'{self.id}.chart.takeScreenshot().toDataURL()') - return b64decode(serial_data.split(',')[1]) + serial_data = self.win.run_script_and_get( + f"{self.id}.chart.takeScreenshot().toDataURL()" + ) + return b64decode(serial_data.split(",")[1]) - def create_subchart(self, position: FLOAT = 'left', width: float = 0.5, height: float = 0.5, - sync: Optional[Union[str, bool]] = None, scale_candles_only: bool = False, - sync_crosshairs_only: bool = False, - toolbox: bool = False) -> 'AbstractChart': + def create_subchart( + self, + position: FLOAT = "left", + width: float = 0.5, + height: float = 0.5, + sync: Optional[Union[str, bool]] = None, + scale_candles_only: bool = False, + sync_crosshairs_only: bool = False, + toolbox: bool = False, + ) -> "AbstractChart": if sync is True: sync = self.id args = locals() - del args['self'] + del args["self"] return self.win.create_subchart(*args.values()) + + def resize_pane(self, pane_index: int, height: int): + self.run_script( + f""" + if ({self.id}.chart.panes().length > {pane_index}) {{ + {self.id}.chart.panes()[{pane_index}].setHeight({height}); + }} + """ + ) + + def remove_pane(self, pane_index: int): + self.run_script( + f""" + {self.id}.chart.removePane({pane_index}); + """ + ) \ No newline at end of file diff --git a/lightweight_charts/chart.py b/lightweight_charts/chart.py index 305534c8..c498dc43 100644 --- a/lightweight_charts/chart.py +++ b/lightweight_charts/chart.py @@ -8,9 +8,6 @@ from lightweight_charts import abstract from .util import parse_event_message, FLOAT -import os -import threading - class CallbackAPI: def __init__(self, emit_queue): @@ -33,10 +30,8 @@ def __init__(self, q, emit_q, return_q, loaded_event): self.windows: typing.List[webview.Window] = [] self.loop() - def create_window( - self, width, height, x, y, screen=None, on_top=False, - maximize=False, title='' + self, width, height, x, y, screen=None, on_top=False, maximize=False, title="" ): screen = webview.screens[screen] if screen is not None else None if maximize: @@ -46,55 +41,69 @@ def create_window( else: width, height = screen.width, screen.height - self.windows.append(webview.create_window( - title, - url=abstract.INDEX, - js_api=self.callback_api, - width=width, - height=height, - x=x, - y=y, - screen=screen, - on_top=on_top, - background_color='#000000') + self.windows.append( + webview.create_window( + title, + url=abstract.INDEX, + js_api=self.callback_api, + width=width, + height=height, + x=x, + y=y, + screen=screen, + on_top=on_top, + background_color="#000000", + ) ) self.windows[-1].events.loaded += lambda: self.loaded_event.set() - def loop(self): # self.loaded_event.set() while self.is_alive: i, arg = self.queue.get() - if i == 'start': + if i == "start": webview.start(debug=arg, func=self.loop) self.is_alive = False - self.emit_queue.put('exit') + self.emit_queue.put("exit") return - if i == 'create_window': + if i == "create_window": self.create_window(*arg) continue window = self.windows[i] - if arg == 'show': + if arg == "show": window.show() - elif arg == 'hide': + elif arg == "hide": window.hide() else: try: - if '_~_~RETURN~_~_' in arg: + if "_~_~RETURN~_~_" in arg: self.return_queue.put(window.evaluate_js(arg[14:])) else: - window.evaluate_js(arg) + try: + # Uncomment these lines for debugging + # with open("script.js", "w") as f: + # f.write(arg) + + window.evaluate_js(arg) + + except webview.errors.JavascriptException as e: + + # print(f"Js: {str(arg)}") + print(f"JavaScript Error 1: {e}") # Debugging output except KeyError as e: return except JavascriptException as e: - msg = eval(str(e)) - raise JavascriptException(f"\n\nscript -> '{arg}',\nerror -> {msg['name']}[{msg['line']}:{msg['column']}]\n{msg['message']}") + msg = json.loads(str(e)) + print(msg) + raise JavascriptException( + f"\n\nscript -> '{arg}',\nerror -> {msg['name']}[{msg['line']}:{msg['column']}]\n{msg['message']}" + ) -class WebviewHandler(): +class WebviewHandler: def __init__(self) -> None: self._reset() self.debug = False @@ -105,36 +114,37 @@ def _reset(self): self.function_call_queue = mp.Queue() self.emit_queue = mp.Queue() self.wv_process = mp.Process( - target=PyWV, args=( - self.function_call_queue, self.emit_queue, - self.return_queue, self.loaded_event + target=PyWV, + args=( + self.function_call_queue, + self.emit_queue, + self.return_queue, + self.loaded_event, ), - daemon=True + daemon=True, ) self.max_window_num = -1 def create_window( - self, width, height, x, y, screen=None, on_top=False, - maximize=False, title='' + self, width, height, x, y, screen=None, on_top=False, maximize=False, title="" ): - self.function_call_queue.put(( - 'create_window', - (width, height, x, y, screen, on_top, maximize, title) - )) + self.function_call_queue.put( + ("create_window", (width, height, x, y, screen, on_top, maximize, title)) + ) self.max_window_num += 1 return self.max_window_num def start(self): self.loaded_event.clear() self.wv_process.start() - self.function_call_queue.put(('start', self.debug)) + self.function_call_queue.put(("start", self.debug)) self.loaded_event.wait() def show(self, window_num): - self.function_call_queue.put((window_num, 'show')) + self.function_call_queue.put((window_num, "show")) def hide(self, window_num): - self.function_call_queue.put((window_num, 'hide')) + self.function_call_queue.put((window_num, "hide")) def evaluate_js(self, window_num, script): self.function_call_queue.put((window_num, script)) @@ -156,7 +166,7 @@ def __init__( height: int = 600, x: int = None, y: int = None, - title: str = '', + title: str = "", screen: int = None, on_top: bool = False, maximize: bool = False, @@ -165,28 +175,42 @@ def __init__( inner_width: float = 1.0, inner_height: float = 1.0, scale_candles_only: bool = False, - position: FLOAT = 'left' + position: FLOAT = "left", ): Chart.WV.debug = debug self._i = Chart.WV.create_window( - width, height, x, y, screen, on_top, maximize, title - ) + width, height, x, y, screen, on_top, maximize, title + ) window = abstract.Window( - script_func=lambda s: Chart.WV.evaluate_js(self._i, s), - js_api_code='pywebview.api.callback' - ) + script_func=lambda s: Chart.WV.evaluate_js(self._i, s), + js_api_code="pywebview.api.callback", + ) abstract.Window._return_q = Chart.WV.return_queue self.is_alive = True if Chart._main_window_handlers is None: - super().__init__(window, inner_width, inner_height, scale_candles_only, toolbox, position=position) + super().__init__( + window, + inner_width, + inner_height, + scale_candles_only, + toolbox, + position=position, + ) Chart._main_window_handlers = self.win.handlers else: window.handlers = Chart._main_window_handlers - super().__init__(window, inner_width, inner_height, scale_candles_only, toolbox, position=position) + super().__init__( + window, + inner_width, + inner_height, + scale_candles_only, + toolbox, + position=position, + ) def show(self, block: bool = False): """ @@ -205,20 +229,28 @@ async def show_async(self): self.show(block=False) try: from lightweight_charts import polygon - [asyncio.create_task(self.polygon.async_set(*args)) for args in polygon._set_on_load] + + [ + asyncio.create_task(self.polygon.async_set(*args)) + for args in polygon._set_on_load + ] while 1: while Chart.WV.emit_queue.empty() and self.is_alive: await asyncio.sleep(0.05) if not self.is_alive: return response = Chart.WV.emit_queue.get() - if response == 'exit': + if response == "exit": Chart.WV.exit() self.is_alive = False return else: func, args = parse_event_message(self.win, response) - await func(*args) if asyncio.iscoroutinefunction(func) else func(*args) + ( + await func(*args) + if asyncio.iscoroutinefunction(func) + else func(*args) + ) except KeyboardInterrupt: return @@ -226,7 +258,7 @@ def hide(self): """ Hides the chart window.\n """ - self._q.put((self._i, 'hide')) + self._q.put((self._i, "hide")) def exit(self): """ diff --git a/lightweight_charts/js/bundle.js b/lightweight_charts/js/bundle.js index bd59e73d..4f8532ac 100644 --- a/lightweight_charts/js/bundle.js +++ b/lightweight_charts/js/bundle.js @@ -1 +1 @@ -var Lib=function(t,e){"use strict";const i={backgroundColor:"#0c0d0f",hoverBackgroundColor:"#3c434c",clickBackgroundColor:"#50565E",activeBackgroundColor:"rgba(0, 122, 255, 0.7)",mutedBackgroundColor:"rgba(0, 122, 255, 0.3)",borderColor:"#3C434C",color:"#d8d9db",activeColor:"#ececed"};function s(){window.pane={...i},window.containerDiv=document.getElementById("container")||document.createElement("div"),window.setCursor=t=>{t&&(window.cursor=t),document.body.style.cursor=window.cursor},window.cursor="default",window.textBoxFocused=!1}class o{handler;div;seriesContainer;ohlcEnabled=!1;percentEnabled=!1;linesEnabled=!1;colorBasedOnCandle=!1;text;candle;_lines=[];constructor(t){this.legendHandler=this.legendHandler.bind(this),this.handler=t,this.ohlcEnabled=!1,this.percentEnabled=!1,this.linesEnabled=!1,this.colorBasedOnCandle=!1,this.div=document.createElement("div"),this.div.classList.add("legend"),this.div.style.maxWidth=100*t.scale.width-8+"vw",this.div.style.display="none";const e=document.createElement("div");e.style.display="flex",e.style.flexDirection="row",this.seriesContainer=document.createElement("div"),this.seriesContainer.classList.add("series-container"),this.text=document.createElement("span"),this.text.style.lineHeight="1.8",this.candle=document.createElement("div"),e.appendChild(this.seriesContainer),this.div.appendChild(this.text),this.div.appendChild(this.candle),this.div.appendChild(e),t.div.appendChild(this.div),t.chart.subscribeCrosshairMove(this.legendHandler)}toJSON(){const{_lines:t,handler:e,...i}=this;return i}makeSeriesRow(t,e){const i="#FFF";let s=`\n \n \`\n `,o=`\n \n `,n=document.createElement("div");n.style.display="flex",n.style.alignItems="center";let r=document.createElement("div"),a=document.createElement("div");a.classList.add("legend-toggle-switch");let l=document.createElementNS("http://www.w3.org/2000/svg","svg");l.setAttribute("width","22"),l.setAttribute("height","16");let h=document.createElementNS("http://www.w3.org/2000/svg","g");h.innerHTML=s;let d=!0;a.addEventListener("click",(()=>{d?(d=!1,h.innerHTML=o,e.applyOptions({visible:!1})):(d=!0,e.applyOptions({visible:!0}),h.innerHTML=s)})),l.appendChild(h),a.appendChild(l),n.appendChild(r),n.appendChild(a),this.seriesContainer.appendChild(n);const c=e.options().color;this._lines.push({name:t,div:r,row:n,toggle:a,series:e,solid:c.startsWith("rgba")?c.replace(/[^,]+(?=\))/,"1"):c})}legendItemFormat(t,e){return t.toFixed(e).toString().padStart(8," ")}shorthandFormat(t){const e=Math.abs(t);return e>=1e6?(t/1e6).toFixed(1)+"M":e>=1e3?(t/1e3).toFixed(1)+"K":t.toString().padStart(8," ")}legendHandler(t,e=!1){if(!this.ohlcEnabled&&!this.linesEnabled&&!this.percentEnabled)return;const i=this.handler.series.options();if(!t.time)return this.candle.style.color="transparent",void(this.candle.innerHTML=this.candle.innerHTML.replace(i.upColor,"").replace(i.downColor,""));let s,o=null;if(e){const e=this.handler.chart.timeScale();let i=e.timeToCoordinate(t.time);i&&(o=e.coordinateToLogical(i.valueOf())),o&&(s=this.handler.series.dataByIndex(o.valueOf()))}else s=t.seriesData.get(this.handler.series);this.candle.style.color="";let n='';if(s){if(this.ohlcEnabled&&(n+=`O ${this.legendItemFormat(s.open,this.handler.precision)} `,n+=`| H ${this.legendItemFormat(s.high,this.handler.precision)} `,n+=`| L ${this.legendItemFormat(s.low,this.handler.precision)} `,n+=`| C ${this.legendItemFormat(s.close,this.handler.precision)} `),this.percentEnabled){let t=(s.close-s.open)/s.open*100,e=t>0?i.upColor:i.downColor,o=`${t>=0?"+":""}${t.toFixed(2)} %`;this.colorBasedOnCandle?n+=`| ${o}`:n+="| "+o}if(this.handler.volumeSeries){let e;e=o?this.handler.volumeSeries.dataByIndex(o):t.seriesData.get(this.handler.volumeSeries),e&&(n+=this.ohlcEnabled?`
V ${this.shorthandFormat(e.value)}`:"")}}this.candle.innerHTML=n+"
",this._lines.forEach((i=>{if(!this.linesEnabled)return void(i.row.style.display="none");let s,n;if(i.row.style.display="flex",s=e&&o?i.series.dataByIndex(o):t.seriesData.get(i.series),s?.value){if("Histogram"==i.series.seriesType())n=this.shorthandFormat(s.value);else{const t=i.series.options().priceFormat;n=this.legendItemFormat(s.value,t.precision)}i.div.innerHTML=` ${i.name} : ${n}`}}))}}function n(t){if(void 0===t)throw new Error("Value is undefined");return t}class r{_chart=void 0;_series=void 0;requestUpdate(){this._requestUpdate&&this._requestUpdate()}_requestUpdate;attached({chart:t,series:e,requestUpdate:i}){this._chart=t,this._series=e,this._series.subscribeDataChanged(this._fireDataUpdated),this._requestUpdate=i,this.requestUpdate()}detached(){this._chart=void 0,this._series=void 0,this._requestUpdate=void 0}get chart(){return n(this._chart)}get series(){return n(this._series)}_fireDataUpdated(t){this.dataUpdated&&this.dataUpdated(t)}}const a={lineColor:"#1E80F0",lineStyle:e.LineStyle.Solid,width:4};var l;!function(t){t[t.NONE=0]="NONE",t[t.HOVERING=1]="HOVERING",t[t.DRAGGING=2]="DRAGGING",t[t.DRAGGINGP1=3]="DRAGGINGP1",t[t.DRAGGINGP2=4]="DRAGGINGP2",t[t.DRAGGINGP3=5]="DRAGGINGP3",t[t.DRAGGINGP4=6]="DRAGGINGP4"}(l||(l={}));class h extends r{_paneViews=[];_options;_points=[];_state=l.NONE;_startDragPoint=null;_latestHoverPoint=null;static _mouseIsDown=!1;static hoveredObject=null;static lastHoveredObject=null;_listeners=[];constructor(t){super(),this._options={...a,...t}}updateAllViews(){this._paneViews.forEach((t=>t.update()))}paneViews(){return this._paneViews}applyOptions(t){this._options={...this._options,...t},this.requestUpdate()}updatePoints(...t){for(let e=0;ei.name===t&&i.listener===e));this._listeners.splice(this._listeners.indexOf(i),1)}_handleHoverInteraction(t){if(this._latestHoverPoint=t.point,h._mouseIsDown)this._handleDragInteraction(t);else if(this._mouseIsOverDrawing(t)){if(this._state!=l.NONE)return;this._moveToState(l.HOVERING),h.hoveredObject=h.lastHoveredObject=this}else{if(this._state==l.NONE)return;this._moveToState(l.NONE),h.hoveredObject===this&&(h.hoveredObject=null)}}static _eventToPoint(t,e){if(!e||!t.point||!t.logical)return null;const i=e.coordinateToPrice(t.point.y);return null==i?null:{time:t.time||null,logical:t.logical,price:i.valueOf()}}static _getDiff(t,e){return{logical:t.logical-e.logical,price:t.price-e.price}}_addDiffToPoint(t,e,i){t&&(t.logical=t.logical+e,t.price=t.price+i,t.time=this.series.dataByIndex(t.logical)?.time||null)}_handleMouseDownInteraction=()=>{h._mouseIsDown=!0,this._onMouseDown()};_handleMouseUpInteraction=()=>{h._mouseIsDown=!1,this._moveToState(l.HOVERING)};_handleDragInteraction(t){if(this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP1&&this._state!=l.DRAGGINGP2&&this._state!=l.DRAGGINGP3&&this._state!=l.DRAGGINGP4)return;const e=h._eventToPoint(t,this.series);if(!e)return;this._startDragPoint=this._startDragPoint||e;const i=h._getDiff(e,this._startDragPoint);this._onDrag(i),this.requestUpdate(),this._startDragPoint=e}}class d{_options;constructor(t){this._options=t}}class c extends d{_p1;_p2;_hovered;constructor(t,e,i,s){super(i),this._p1=t,this._p2=e,this._hovered=s}_getScaledCoordinates(t){return null===this._p1.x||null===this._p1.y||null===this._p2.x||null===this._p2.y?null:{x1:Math.round(this._p1.x*t.horizontalPixelRatio),y1:Math.round(this._p1.y*t.verticalPixelRatio),x2:Math.round(this._p2.x*t.horizontalPixelRatio),y2:Math.round(this._p2.y*t.verticalPixelRatio)}}_drawEndCircle(t,e,i){t.context.fillStyle="#000",t.context.beginPath(),t.context.arc(e,i,9,0,2*Math.PI),t.context.stroke(),t.context.fill()}}function p(t,i){const s={[e.LineStyle.Solid]:[],[e.LineStyle.Dotted]:[t.lineWidth,t.lineWidth],[e.LineStyle.Dashed]:[2*t.lineWidth,2*t.lineWidth],[e.LineStyle.LargeDashed]:[6*t.lineWidth,6*t.lineWidth],[e.LineStyle.SparseDotted]:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(s)}class u extends d{_point={x:null,y:null};constructor(t,e){super(e),this._point=t}draw(t){t.useBitmapCoordinateSpace((t=>{if(null==this._point.y)return;const e=t.context,i=Math.round(this._point.y*t.verticalPixelRatio),s=this._point.x?this._point.x*t.horizontalPixelRatio:0;e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.beginPath(),e.moveTo(s,i),e.lineTo(t.bitmapSize.width,i),e.stroke()}))}}class _{_source;constructor(t){this._source=t}}class m extends _{_p1={x:null,y:null};_p2={x:null,y:null};_source;constructor(t){super(t),this._source=t}update(){if(!this._source.p1||!this._source.p2)return;const t=this._source.series,e=t.priceToCoordinate(this._source.p1.price),i=t.priceToCoordinate(this._source.p2.price),s=this._getX(this._source.p1),o=this._getX(this._source.p2);this._p1={x:s,y:e},this._p2={x:o,y:i}}_getX(t){return this._source.chart.timeScale().logicalToCoordinate(t.logical)}}class v extends _{_source;_point={x:null,y:null};constructor(t){super(t),this._source=t}update(){const t=this._source._point,e=this._source.chart.timeScale(),i=this._source.series;"RayLine"==this._source._type&&(this._point.x=t.time?e.timeToCoordinate(t.time):e.logicalToCoordinate(t.logical)),this._point.y=i.priceToCoordinate(t.price)}renderer(){return new u(this._point,this._source._options)}}class g{_source;_y=null;_price=null;constructor(t){this._source=t}update(){if(!this._source.series||!this._source._point)return;this._y=this._source.series.priceToCoordinate(this._source._point.price);const t=this._source.series.options().priceFormat.precision;this._price=this._source._point.price.toFixed(t).toString()}visible(){return!0}tickVisible(){return!0}coordinate(){return this._y??0}text(){return this._source._options.text||this._price||""}textColor(){return"white"}backColor(){return this._source._options.lineColor}}class w extends h{_type="HorizontalLine";_paneViews;_point;_callbackName;_priceAxisViews;_startDragPoint=null;constructor(t,e,i=null){super(e),this._point=t,this._point.time=null,this._paneViews=[new v(this)],this._priceAxisViews=[new g(this)],this._callbackName=i}get points(){return[this._point]}updatePoints(...t){for(const e of t)e&&(this._point.price=e.price);this.requestUpdate()}updateAllViews(){this._paneViews.forEach((t=>t.update())),this._priceAxisViews.forEach((t=>t.update()))}priceAxisViews(){return this._priceAxisViews}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._unsubscribe("mouseup",this._childHandleMouseUpInteraction),this._subscribe("mousedown",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGING:document.body.style.cursor="grabbing",this._subscribe("mouseup",this._childHandleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._addDiffToPoint(this._point,0,t.price),this.requestUpdate()}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this.series.priceToCoordinate(this._point.price);return!!i&&Math.abs(i-t.point.y){this._handleMouseUpInteraction(),this._callbackName&&window.callbackFunction(`${this._callbackName}_~_${this._point.price.toFixed(8)}`)}}class y{_chart;_series;_finishDrawingCallback=null;_drawings=[];_activeDrawing=null;_isDrawing=!1;_drawingType=null;constructor(t,e,i=null){this._chart=t,this._series=e,this._finishDrawingCallback=i,this._chart.subscribeClick(this._clickHandler),this._chart.subscribeCrosshairMove(this._moveHandler)}_clickHandler=t=>this._onClick(t);_moveHandler=t=>this._onMouseMove(t);beginDrawing(t){this._drawingType=t,this._isDrawing=!0}stopDrawing(){this._isDrawing=!1,this._activeDrawing=null}get drawings(){return this._drawings}addNewDrawing(t){this._series.attachPrimitive(t),this._drawings.push(t)}delete(t){if(null==t)return;const e=this._drawings.indexOf(t);-1!=e&&(this._drawings.splice(e,1),t.detach())}clearDrawings(){for(const t of this._drawings)t.detach();this._drawings=[]}repositionOnTime(){for(const t of this.drawings){const e=[];for(const i of t.points){if(!i){e.push(i);continue}const t=i.time?this._chart.timeScale().coordinateToLogical(this._chart.timeScale().timeToCoordinate(i.time)||0):i.logical;e.push({time:i.time,logical:t,price:i.price})}t.updatePoints(...e)}}_onClick(t){if(!this._isDrawing)return;const e=h._eventToPoint(t,this._series);if(e)if(null==this._activeDrawing){if(null==this._drawingType)return;this._activeDrawing=new this._drawingType(e,e),this._series.attachPrimitive(this._activeDrawing),this._drawingType==w&&this._onClick(t)}else{if(this._drawings.push(this._activeDrawing),this.stopDrawing(),!this._finishDrawingCallback)return;this._finishDrawingCallback()}}_onMouseMove(t){if(!t)return;for(const e of this._drawings)e._handleHoverInteraction(t);if(!this._isDrawing||!this._activeDrawing)return;const e=h._eventToPoint(t,this._series);e&&this._activeDrawing.updatePoints(null,e)}}class b extends c{constructor(t,e,i,s){super(t,e,i,s)}draw(t){t.useBitmapCoordinateSpace((t=>{if(null===this._p1.x||null===this._p1.y||null===this._p2.x||null===this._p2.y)return;const e=t.context,i=this._getScaledCoordinates(t);i&&(e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.beginPath(),e.moveTo(i.x1,i.y1),e.lineTo(i.x2,i.y2),e.stroke(),this._hovered&&(this._drawEndCircle(t,i.x1,i.y1),this._drawEndCircle(t,i.x2,i.y2)))}))}}class x extends m{constructor(t){super(t)}renderer(){return new b(this._p1,this._p2,this._source._options,this._source.hovered)}}class C extends h{_paneViews=[];_hovered=!1;constructor(t,e,i){super(),this.points.push(t),this.points.push(e),this._options={...a,...i}}setFirstPoint(t){this.updatePoints(t)}setSecondPoint(t){this.updatePoints(null,t)}get p1(){return this.points[0]}get p2(){return this.points[1]}get hovered(){return this._hovered}}class f extends C{_type="TrendLine";constructor(t,e,i){super(t,e,i),this._paneViews=[new x(this)]}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._hovered=!1,this.requestUpdate(),this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._hovered=!0,this.requestUpdate(),this._subscribe("mousedown",this._handleMouseDownInteraction),this._unsubscribe("mouseup",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGINGP1:case l.DRAGGINGP2:case l.DRAGGING:document.body.style.cursor="grabbing",this._subscribe("mouseup",this._handleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP1||this._addDiffToPoint(this.p1,t.logical,t.price),this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP2||this._addDiffToPoint(this.p2,t.logical,t.price)}_onMouseDown(){this._startDragPoint=null;const t=this._latestHoverPoint;if(!t)return;const e=this._paneViews[0]._p1,i=this._paneViews[0]._p2;if(!(e.x&&i.x&&e.y&&i.y))return this._moveToState(l.DRAGGING);Math.abs(t.x-e.x)<10&&Math.abs(t.y-e.y)<10?this._moveToState(l.DRAGGINGP1):Math.abs(t.x-i.x)<10&&Math.abs(t.y-i.y)<10?this._moveToState(l.DRAGGINGP2):this._moveToState(l.DRAGGING)}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this._paneViews[0]._p1.x,s=this._paneViews[0]._p1.y,o=this._paneViews[0]._p2.x,n=this._paneViews[0]._p2.y;if(!(i&&o&&s&&n))return!1;const r=t.point.x,a=t.point.y;if(r<=Math.min(i,o)-e||r>=Math.max(i,o)+e)return!1;return Math.abs((n-s)*r-(o-i)*a+o*s-n*i)/Math.sqrt((n-s)**2+(o-i)**2)<=e}}class D extends c{constructor(t,e,i,s){super(t,e,i,s)}draw(t){t.useBitmapCoordinateSpace((t=>{const e=t.context,i=this._getScaledCoordinates(t);if(!i)return;e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.fillStyle=this._options.fillColor;const s=Math.min(i.x1,i.x2),o=Math.min(i.y1,i.y2),n=Math.abs(i.x1-i.x2),r=Math.abs(i.y1-i.y2);e.strokeRect(s,o,n,r),e.fillRect(s,o,n,r),this._hovered&&(this._drawEndCircle(t,s,o),this._drawEndCircle(t,s+n,o),this._drawEndCircle(t,s+n,o+r),this._drawEndCircle(t,s,o+r))}))}}class E extends m{constructor(t){super(t)}renderer(){return new D(this._p1,this._p2,this._source._options,this._source.hovered)}}const k={fillEnabled:!0,fillColor:"rgba(255, 255, 255, 0.2)",...a};class L extends C{_type="Box";constructor(t,e,i){super(t,e,i),this._options={...k,...i},this._paneViews=[new E(this)]}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._hovered=!1,this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._hovered=!0,this._unsubscribe("mouseup",this._handleMouseUpInteraction),this._subscribe("mousedown",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGINGP1:case l.DRAGGINGP2:case l.DRAGGINGP3:case l.DRAGGINGP4:case l.DRAGGING:document.body.style.cursor="grabbing",document.body.addEventListener("mouseup",this._handleMouseUpInteraction),this._subscribe("mouseup",this._handleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP1||this._addDiffToPoint(this.p1,t.logical,t.price),this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP2||this._addDiffToPoint(this.p2,t.logical,t.price),this._state!=l.DRAGGING&&(this._state==l.DRAGGINGP3&&(this._addDiffToPoint(this.p1,t.logical,0),this._addDiffToPoint(this.p2,0,t.price)),this._state==l.DRAGGINGP4&&(this._addDiffToPoint(this.p1,0,t.price),this._addDiffToPoint(this.p2,t.logical,0)))}_onMouseDown(){this._startDragPoint=null;const t=this._latestHoverPoint,e=this._paneViews[0]._p1,i=this._paneViews[0]._p2;if(!(e.x&&i.x&&e.y&&i.y))return this._moveToState(l.DRAGGING);const s=10;Math.abs(t.x-e.x)l-p&&rh-p&&ai.appendChild(this.makeColorBox(t))));let s=document.createElement("div");s.style.backgroundColor=window.pane.borderColor,s.style.height="1px",s.style.width="130px";let o=document.createElement("div");o.style.margin="10px";let n=document.createElement("div");n.style.color="lightgray",n.style.fontSize="12px",n.innerText="Opacity",this._opacityLabel=document.createElement("div"),this._opacityLabel.style.color="lightgray",this._opacityLabel.style.fontSize="12px",this._opacitySlider=document.createElement("input"),this._opacitySlider.type="range",this._opacitySlider.value=(100*this.opacity).toString(),this._opacityLabel.innerText=this._opacitySlider.value+"%",this._opacitySlider.oninput=()=>{this._opacityLabel.innerText=this._opacitySlider.value+"%",this.opacity=parseInt(this._opacitySlider.value)/100,this.updateColor()},o.appendChild(n),o.appendChild(this._opacitySlider),o.appendChild(this._opacityLabel),this._div.appendChild(i),this._div.appendChild(s),this._div.appendChild(o),window.containerDiv.appendChild(this._div)}_updateOpacitySlider(){this._opacitySlider.value=(100*this.opacity).toString(),this._opacityLabel.innerText=this._opacitySlider.value+"%"}makeColorBox(t){const e=document.createElement("div");e.style.width="18px",e.style.height="18px",e.style.borderRadius="3px",e.style.margin="3px",e.style.boxSizing="border-box",e.style.backgroundColor=t,e.addEventListener("mouseover",(()=>e.style.border="2px solid lightgray")),e.addEventListener("mouseout",(()=>e.style.border="none"));const i=S.extractRGBA(t);return e.addEventListener("click",(()=>{this.rgba=i,this.updateColor()})),e}static extractRGBA(t){const e=document.createElement("div");e.style.color=t,document.body.appendChild(e);const i=getComputedStyle(e).color;document.body.removeChild(e);const s=i.match(/\d+/g)?.map(Number);if(!s)return[];let o=i.includes("rgba")?parseFloat(i.split(",")[3]):1;return[s[0],s[1],s[2],o]}updateColor(){if(!h.lastHoveredObject||!this.rgba)return;const t=`rgba(${this.rgba[0]}, ${this.rgba[1]}, ${this.rgba[2]}, ${this.opacity})`;h.lastHoveredObject.applyOptions({[this.colorOption]:t}),this.saveDrawings()}openMenu(t){h.lastHoveredObject&&(this.rgba=S.extractRGBA(h.lastHoveredObject._options[this.colorOption]),this.opacity=this.rgba[3],this._updateOpacitySlider(),this._div.style.top=t.top-30+"px",this._div.style.left=t.right+"px",this._div.style.display="flex",setTimeout((()=>document.addEventListener("mousedown",(t=>{this._div.contains(t.target)||this.closeMenu()}))),10))}closeMenu(){document.body.removeEventListener("click",this.closeMenu),this._div.style.display="none"}}class G{static _styles=[{name:"Solid",var:e.LineStyle.Solid},{name:"Dotted",var:e.LineStyle.Dotted},{name:"Dashed",var:e.LineStyle.Dashed},{name:"Large Dashed",var:e.LineStyle.LargeDashed},{name:"Sparse Dotted",var:e.LineStyle.SparseDotted}];_div;_saveDrawings;constructor(t){this._saveDrawings=t,this._div=document.createElement("div"),this._div.classList.add("context-menu"),G._styles.forEach((t=>{this._div.appendChild(this._makeTextBox(t.name,t.var))})),window.containerDiv.appendChild(this._div)}_makeTextBox(t,e){const i=document.createElement("span");return i.classList.add("context-menu-item"),i.innerText=t,i.addEventListener("click",(()=>{h.lastHoveredObject?.applyOptions({lineStyle:e}),this._saveDrawings()})),i}openMenu(t){this._div.style.top=t.top-30+"px",this._div.style.left=t.right+"px",this._div.style.display="block",setTimeout((()=>document.addEventListener("mousedown",(t=>{this._div.contains(t.target)||this.closeMenu()}))),10)}closeMenu(){document.removeEventListener("click",this.closeMenu),this._div.style.display="none"}}function T(t){const e=[];for(const i of t)0==e.length?e.push(i.toUpperCase()):i==i.toUpperCase()?e.push(" "+i):e.push(i);return e.join("")}class I{saveDrawings;drawingTool;div;hoverItem;items=[];constructor(t,e){this.saveDrawings=t,this.drawingTool=e,this._onRightClick=this._onRightClick.bind(this),this.div=document.createElement("div"),this.div.classList.add("context-menu"),document.body.appendChild(this.div),this.hoverItem=null,document.body.addEventListener("contextmenu",this._onRightClick)}_handleClick=t=>this._onClick(t);_onClick(t){t.target&&(this.div.contains(t.target)||(this.div.style.display="none",document.body.removeEventListener("click",this._handleClick)))}_onRightClick(t){if(!h.hoveredObject)return;for(const t of this.items)this.div.removeChild(t);this.items=[];for(const t of Object.keys(h.hoveredObject._options)){let e;if(t.toLowerCase().includes("color"))e=new S(this.saveDrawings,t);else{if("lineStyle"!==t)continue;e=new G(this.saveDrawings)}let i=t=>e.openMenu(t);this.menuItem(T(t),i,(()=>{document.removeEventListener("click",e.closeMenu),e._div.style.display="none"}))}this.separator(),this.menuItem("Delete Drawing",(()=>this.drawingTool.delete(h.lastHoveredObject))),t.preventDefault(),this.div.style.left=t.clientX+"px",this.div.style.top=t.clientY+"px",this.div.style.display="block",document.body.addEventListener("click",this._handleClick)}menuItem(t,e,i=null){const s=document.createElement("span");s.classList.add("context-menu-item"),this.div.appendChild(s);const o=document.createElement("span");if(o.innerText=t,o.style.pointerEvents="none",s.appendChild(o),i){let t=document.createElement("span");t.innerText="►",t.style.fontSize="8px",t.style.pointerEvents="none",s.appendChild(t)}if(s.addEventListener("mouseover",(()=>{this.hoverItem&&this.hoverItem.closeAction&&this.hoverItem.closeAction(),this.hoverItem={elem:o,action:e,closeAction:i}})),i){let t;s.addEventListener("mouseover",(()=>t=setTimeout((()=>e(s.getBoundingClientRect())),100))),s.addEventListener("mouseout",(()=>clearTimeout(t)))}else s.addEventListener("click",(t=>{e(t),this.div.style.display="none"}));this.items.push(s)}separator(){const t=document.createElement("div");t.style.width="90%",t.style.height="1px",t.style.margin="3px 0px",t.style.backgroundColor=window.pane.borderColor,this.div.appendChild(t),this.items.push(t)}}class M extends w{_type="RayLine";constructor(t,e){super({...t},e),this._point.time=t.time}updatePoints(...t){for(const e of t)e&&(this._point=e);this.requestUpdate()}_onDrag(t){this._addDiffToPoint(this._point,t.logical,t.price),this.requestUpdate()}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this.series.priceToCoordinate(this._point.price),s=this._point.time?this.chart.timeScale().timeToCoordinate(this._point.time):null;return!(!i||!s)&&(Math.abs(i-t.point.y)s-e)}}class N extends d{_point={x:null,y:null};constructor(t,e){super(e),this._point=t}draw(t){t.useBitmapCoordinateSpace((t=>{if(null==this._point.x)return;const e=t.context,i=this._point.x*t.horizontalPixelRatio;e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.beginPath(),e.moveTo(i,0),e.lineTo(i,t.bitmapSize.height),e.stroke()}))}}class R extends _{_source;_point={x:null,y:null};constructor(t){super(t),this._source=t}update(){const t=this._source._point,e=this._source.chart.timeScale(),i=this._source.series;this._point.x=t.time?e.timeToCoordinate(t.time):e.logicalToCoordinate(t.logical),this._point.y=i.priceToCoordinate(t.price)}renderer(){return new N(this._point,this._source._options)}}class A{_source;_x=null;constructor(t){this._source=t}update(){if(!this._source.chart||!this._source._point)return;const t=this._source._point,e=this._source.chart.timeScale();this._x=t.time?e.timeToCoordinate(t.time):e.logicalToCoordinate(t.logical)}visible(){return!!this._source._options.text}tickVisible(){return!0}coordinate(){return this._x??0}text(){return this._source._options.text||""}textColor(){return"white"}backColor(){return this._source._options.lineColor}}class B extends h{_type="VerticalLine";_paneViews;_timeAxisViews;_point;_callbackName;_startDragPoint=null;constructor(t,e,i=null){super(e),this._point=t,this._paneViews=[new R(this)],this._callbackName=i,this._timeAxisViews=[new A(this)]}updateAllViews(){this._paneViews.forEach((t=>t.update())),this._timeAxisViews.forEach((t=>t.update()))}timeAxisViews(){return this._timeAxisViews}updatePoints(...t){for(const e of t)e&&(!e.time&&e.logical&&(e.time=this.series.dataByIndex(e.logical)?.time||null),this._point=e);this.requestUpdate()}get points(){return[this._point]}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._unsubscribe("mouseup",this._childHandleMouseUpInteraction),this._subscribe("mousedown",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGING:document.body.style.cursor="grabbing",this._subscribe("mouseup",this._childHandleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._addDiffToPoint(this._point,t.logical,0),this.requestUpdate()}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this.chart.timeScale();let s;return s=this._point.time?i.timeToCoordinate(this._point.time):i.logicalToCoordinate(this._point.logical),!!s&&Math.abs(s-t.point.x){this._handleMouseUpInteraction(),this._callbackName&&window.callbackFunction(`${this._callbackName}_~_${this._point.price.toFixed(8)}`)}}class P{static TREND_SVG='';static HORZ_SVG='';static RAY_SVG='';static BOX_SVG='';static VERT_SVG=P.RAY_SVG;div;activeIcon=null;buttons=[];_commandFunctions;_handlerID;_drawingTool;constructor(t,e,i,s){this._handlerID=t,this._commandFunctions=s,this._drawingTool=new y(e,i,(()=>this.removeActiveAndSave())),this.div=this._makeToolBox(),new I(this.saveDrawings,this._drawingTool),s.push((t=>{if((t.metaKey||t.ctrlKey)&&"KeyZ"===t.code){const t=this._drawingTool.drawings.pop();return t&&this._drawingTool.delete(t),!0}return!1}))}toJSON(){const{...t}=this;return t}_makeToolBox(){let t=document.createElement("div");t.classList.add("toolbox"),this.buttons.push(this._makeToolBoxElement(f,"KeyT",P.TREND_SVG)),this.buttons.push(this._makeToolBoxElement(w,"KeyH",P.HORZ_SVG)),this.buttons.push(this._makeToolBoxElement(M,"KeyR",P.RAY_SVG)),this.buttons.push(this._makeToolBoxElement(L,"KeyB",P.BOX_SVG)),this.buttons.push(this._makeToolBoxElement(B,"KeyV",P.VERT_SVG,!0));for(const e of this.buttons)t.appendChild(e);return t}_makeToolBoxElement(t,e,i,s=!1){const o=document.createElement("div");o.classList.add("toolbox-button");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("width","29"),n.setAttribute("height","29");const r=document.createElementNS("http://www.w3.org/2000/svg","g");r.innerHTML=i,r.setAttribute("fill",window.pane.color),n.appendChild(r),o.appendChild(n);const a={div:o,group:r,type:t};return o.addEventListener("click",(()=>this._onIconClick(a))),this._commandFunctions.push((t=>this._handlerID===window.handlerInFocus&&(!(!t.altKey||t.code!==e)&&(t.preventDefault(),this._onIconClick(a),!0)))),1==s&&(n.style.transform="rotate(90deg)",n.style.transformBox="fill-box",n.style.transformOrigin="center"),o}_onIconClick(t){this.activeIcon&&(this.activeIcon.div.classList.remove("active-toolbox-button"),window.setCursor("crosshair"),this._drawingTool?.stopDrawing(),this.activeIcon===t)?this.activeIcon=null:(this.activeIcon=t,this.activeIcon.div.classList.add("active-toolbox-button"),window.setCursor("crosshair"),this._drawingTool?.beginDrawing(this.activeIcon.type))}removeActiveAndSave=()=>{window.setCursor("default"),this.activeIcon&&this.activeIcon.div.classList.remove("active-toolbox-button"),this.activeIcon=null,this.saveDrawings()};addNewDrawing(t){this._drawingTool.addNewDrawing(t)}clearDrawings(){this._drawingTool.clearDrawings()}saveDrawings=()=>{const t=[];for(const e of this._drawingTool.drawings)t.push({type:e._type,points:e.points,options:e._options});const e=JSON.stringify(t);window.callbackFunction(`save_drawings${this._handlerID}_~_${e}`)};loadDrawings(t){t.forEach((t=>{switch(t.type){case"Box":this._drawingTool.addNewDrawing(new L(t.points[0],t.points[1],t.options));break;case"TrendLine":this._drawingTool.addNewDrawing(new f(t.points[0],t.points[1],t.options));break;case"HorizontalLine":this._drawingTool.addNewDrawing(new w(t.points[0],t.options));break;case"RayLine":this._drawingTool.addNewDrawing(new M(t.points[0],t.options));break;case"VerticalLine":this._drawingTool.addNewDrawing(new B(t.points[0],t.options))}}))}}class O{makeButton;callbackName;div;isOpen=!1;widget;constructor(t,e,i,s,o,n){this.makeButton=t,this.callbackName=e,this.div=document.createElement("div"),this.div.classList.add("topbar-menu"),this.widget=this.makeButton(s+" ↓",null,o,!0,n),this.updateMenuItems(i),this.widget.elem.addEventListener("click",(()=>{if(this.isOpen=!this.isOpen,!this.isOpen)return void(this.div.style.display="none");let t=this.widget.elem.getBoundingClientRect();this.div.style.display="flex",this.div.style.flexDirection="column";let e=t.x+t.width/2;this.div.style.left=e-this.div.clientWidth/2+"px",this.div.style.top=t.y+t.height+"px"})),document.body.appendChild(this.div)}updateMenuItems(t){this.div.innerHTML="",t.forEach((t=>{let e=this.makeButton(t,null,!1,!1);e.elem.addEventListener("click",(()=>{this._clickHandler(e.elem.innerText)})),e.elem.style.margin="4px 4px",e.elem.style.padding="2px 2px",this.div.appendChild(e.elem)})),this.widget.elem.innerText=t[0]+" ↓"}_clickHandler(t){this.widget.elem.innerText=t+" ↓",window.callbackFunction(`${this.callbackName}_~_${t}`),this.div.style.display="none",this.isOpen=!1}}class V{_handler;_div;left;right;constructor(t){this._handler=t,this._div=document.createElement("div"),this._div.classList.add("topbar");const e=t=>{const e=document.createElement("div");return e.classList.add("topbar-container"),e.style.justifyContent=t,this._div.appendChild(e),e};this.left=e("flex-start"),this.right=e("flex-end")}makeSwitcher(t,e,i,s="left"){const o=document.createElement("div");let n;o.style.margin="4px 12px";const r={elem:o,callbackName:i,intervalElements:t.map((t=>{const i=document.createElement("button");i.classList.add("topbar-button"),i.classList.add("switcher-button"),i.style.margin="0px 2px",i.innerText=t,t==e&&(n=i,i.classList.add("active-switcher-button"));const s=V.getClientWidth(i);return i.style.minWidth=s+1+"px",i.addEventListener("click",(()=>r.onItemClicked(i))),o.appendChild(i),i})),onItemClicked:t=>{t!=n&&(n.classList.remove("active-switcher-button"),t.classList.add("active-switcher-button"),n=t,window.callbackFunction(`${r.callbackName}_~_${t.innerText}`))}};return this.appendWidget(o,s,!0),r}makeTextBoxWidget(t,e="left",i=null){if(i){const s=document.createElement("input");return s.classList.add("topbar-textbox-input"),s.value=t,s.style.width=`${s.value.length+2}ch`,s.addEventListener("focus",(()=>{window.textBoxFocused=!0})),s.addEventListener("input",(t=>{t.preventDefault(),s.style.width=`${s.value.length+2}ch`})),s.addEventListener("keydown",(t=>{"Enter"==t.key&&(t.preventDefault(),s.blur())})),s.addEventListener("blur",(()=>{window.callbackFunction(`${i}_~_${s.value}`),window.textBoxFocused=!1})),this.appendWidget(s,e,!0),s}{const i=document.createElement("div");return i.classList.add("topbar-textbox"),i.innerText=t,this.appendWidget(i,e,!0),i}}makeMenu(t,e,i,s,o){return new O(this.makeButton.bind(this),s,t,e,i,o)}makeButton(t,e,i,s=!0,o="left",n=!1){let r=document.createElement("button");r.classList.add("topbar-button"),r.innerText=t,document.body.appendChild(r),r.style.minWidth=r.clientWidth+1+"px",document.body.removeChild(r);let a={elem:r,callbackName:e};if(e){let t;if(n){let e=!1;t=()=>{e=!e,window.callbackFunction(`${a.callbackName}_~_${e}`),r.style.backgroundColor=e?"var(--active-bg-color)":"",r.style.color=e?"var(--active-color)":""}}else t=()=>window.callbackFunction(`${a.callbackName}_~_${r.innerText}`);r.addEventListener("click",t)}return s&&this.appendWidget(r,o,i),a}makeSeparator(t="left"){const e=document.createElement("div");e.classList.add("topbar-seperator");("left"==t?this.left:this.right).appendChild(e)}appendWidget(t,e,i){const s="left"==e?this.left:this.right;i?("left"==e&&s.appendChild(t),this.makeSeparator(e),"right"==e&&s.appendChild(t)):s.appendChild(t),this._handler.reSize()}static getClientWidth(t){document.body.appendChild(t);const e=t.clientWidth;return document.body.removeChild(t),e}}s();return t.Box=L,t.Handler=class{id;commandFunctions=[];wrapper;div;chart;scale;precision=2;series;volumeSeries;legend;_topBar;toolBox;spinner;_seriesList=[];constructor(t,e,i,s,n){this.reSize=this.reSize.bind(this),this.id=t,this.scale={width:e,height:i},this.wrapper=document.createElement("div"),this.wrapper.classList.add("handler"),this.wrapper.style.float=s,this.div=document.createElement("div"),this.div.style.position="relative",this.wrapper.appendChild(this.div),window.containerDiv.append(this.wrapper),this.chart=this._createChart(),this.series=this.createCandlestickSeries(),this.volumeSeries=this.createVolumeSeries(),this.legend=new o(this),document.addEventListener("keydown",(t=>{for(let e=0;ewindow.handlerInFocus=this.id)),this.reSize(),n&&window.addEventListener("resize",(()=>this.reSize()))}reSize(){let t=0!==this.scale.height&&this._topBar?._div.offsetHeight||0;this.chart.resize(window.innerWidth*this.scale.width,window.innerHeight*this.scale.height-t),this.wrapper.style.width=100*this.scale.width+"%",this.wrapper.style.height=100*this.scale.height+"%",0===this.scale.height||0===this.scale.width?this.toolBox&&(this.toolBox.div.style.display="none"):this.toolBox&&(this.toolBox.div.style.display="flex")}_createChart(){return e.createChart(this.div,{width:window.innerWidth*this.scale.width,height:window.innerHeight*this.scale.height,layout:{textColor:window.pane.color,background:{color:"#000000",type:e.ColorType.Solid},fontSize:12},rightPriceScale:{scaleMargins:{top:.3,bottom:.25}},timeScale:{timeVisible:!0,secondsVisible:!1},crosshair:{mode:e.CrosshairMode.Normal,vertLine:{labelBackgroundColor:"rgb(46, 46, 46)"},horzLine:{labelBackgroundColor:"rgb(55, 55, 55)"}},grid:{vertLines:{color:"rgba(29, 30, 38, 5)"},horzLines:{color:"rgba(29, 30, 58, 5)"}},handleScroll:{vertTouchDrag:!0}})}createCandlestickSeries(){const t="rgba(39, 157, 130, 100)",e="rgba(200, 97, 100, 100)",i=this.chart.addCandlestickSeries({upColor:t,borderUpColor:t,wickUpColor:t,downColor:e,borderDownColor:e,wickDownColor:e});return i.priceScale().applyOptions({scaleMargins:{top:.2,bottom:.2}}),i}createVolumeSeries(){const t=this.chart.addHistogramSeries({color:"#26a69a",priceFormat:{type:"volume"},priceScaleId:"volume_scale"});return t.priceScale().applyOptions({scaleMargins:{top:.8,bottom:0}}),t}createLineSeries(t,e){const i=this.chart.addLineSeries({...e});return this._seriesList.push(i),this.legend.makeSeriesRow(t,i),{name:t,series:i}}createHistogramSeries(t,e){const i=this.chart.addHistogramSeries({...e});return this._seriesList.push(i),this.legend.makeSeriesRow(t,i),{name:t,series:i}}createToolBox(){this.toolBox=new P(this.id,this.chart,this.series,this.commandFunctions),this.div.appendChild(this.toolBox.div)}createTopBar(){return this._topBar=new V(this),this.wrapper.prepend(this._topBar._div),this._topBar}toJSON(){const{chart:t,...e}=this;return e}static syncCharts(t,e,i=!1){function s(t,e){e?(t.chart.setCrosshairPosition(e.value||e.close,e.time,t.series),t.legend.legendHandler(e,!0)):t.chart.clearCrosshairPosition()}function o(t,e){return e.time&&e.seriesData.get(t)||null}const n=t.chart.timeScale(),r=e.chart.timeScale(),a=t=>{t&&n.setVisibleLogicalRange(t)},l=t=>{t&&r.setVisibleLogicalRange(t)},h=i=>{s(e,o(t.series,i))},d=i=>{s(t,o(e.series,i))};let c=e;function p(t,e,s,o,n,r){t.wrapper.addEventListener("mouseover",(()=>{c!==t&&(c=t,e.chart.unsubscribeCrosshairMove(s),t.chart.subscribeCrosshairMove(o),i||(e.chart.timeScale().unsubscribeVisibleLogicalRangeChange(n),t.chart.timeScale().subscribeVisibleLogicalRangeChange(r)))}))}p(e,t,h,d,l,a),p(t,e,d,h,a,l),e.chart.subscribeCrosshairMove(d);const u=r.getVisibleLogicalRange();u&&n.setVisibleLogicalRange(u),i||e.chart.timeScale().subscribeVisibleLogicalRangeChange(a)}static makeSearchBox(t){const e=document.createElement("div");e.classList.add("searchbox"),e.style.display="none";const i=document.createElement("div");i.innerHTML='';const s=document.createElement("input");return s.type="text",e.appendChild(i),e.appendChild(s),t.div.appendChild(e),t.commandFunctions.push((i=>window.handlerInFocus===t.id&&!window.textBoxFocused&&("none"===e.style.display?!!/^[a-zA-Z0-9]$/.test(i.key)&&(e.style.display="flex",s.focus(),!0):("Enter"===i.key||"Escape"===i.key)&&("Enter"===i.key&&window.callbackFunction(`search${t.id}_~_${s.value}`),e.style.display="none",s.value="",!0)))),s.addEventListener("input",(()=>s.value=s.value.toUpperCase())),{window:e,box:s}}static makeSpinner(t){t.spinner=document.createElement("div"),t.spinner.classList.add("spinner"),t.wrapper.appendChild(t.spinner);let e=0;!function i(){t.spinner&&(e+=10,t.spinner.style.transform=`translate(-50%, -50%) rotate(${e}deg)`,requestAnimationFrame(i))}()}static _styleMap={"--bg-color":"backgroundColor","--hover-bg-color":"hoverBackgroundColor","--click-bg-color":"clickBackgroundColor","--active-bg-color":"activeBackgroundColor","--muted-bg-color":"mutedBackgroundColor","--border-color":"borderColor","--color":"color","--active-color":"activeColor"};static setRootStyles(t){const e=document.documentElement.style;for(const[i,s]of Object.entries(this._styleMap))e.setProperty(i,t[s])}},t.HorizontalLine=w,t.Legend=o,t.RayLine=M,t.Table=class{_div;callbackName;borderColor;borderWidth;table;rows={};headings;widths;alignments;footer;header;constructor(t,e,i,s,o,n,r=!1,a,l,h,d,c){this._div=document.createElement("div"),this.callbackName=null,this.borderColor=l,this.borderWidth=h,r?(this._div.style.position="absolute",this._div.style.cursor="move"):(this._div.style.position="relative",this._div.style.float=n),this._div.style.zIndex="2000",this.reSize(t,e),this._div.style.display="flex",this._div.style.flexDirection="column",this._div.style.borderRadius="5px",this._div.style.color="white",this._div.style.fontSize="12px",this._div.style.fontVariantNumeric="tabular-nums",this.table=document.createElement("table"),this.table.style.width="100%",this.table.style.borderCollapse="collapse",this._div.style.overflow="hidden",this.headings=i,this.widths=s.map((t=>100*t+"%")),this.alignments=o;let p=this.table.createTHead().insertRow();for(let t=0;t0?c[t]:a,e.style.color=d[t],p.appendChild(e)}let u,_,m=document.createElement("div");if(m.style.overflowY="auto",m.style.overflowX="hidden",m.style.backgroundColor=a,m.appendChild(this.table),this._div.appendChild(m),window.containerDiv.appendChild(this._div),!r)return;let v=t=>{this._div.style.left=t.clientX-u+"px",this._div.style.top=t.clientY-_+"px"},g=()=>{document.removeEventListener("mousemove",v),document.removeEventListener("mouseup",g)};this._div.addEventListener("mousedown",(t=>{u=t.clientX-this._div.offsetLeft,_=t.clientY-this._div.offsetTop,document.addEventListener("mousemove",v),document.addEventListener("mouseup",g)}))}divToButton(t,e){t.addEventListener("mouseover",(()=>t.style.backgroundColor="rgba(60, 60, 60, 0.6)")),t.addEventListener("mouseout",(()=>t.style.backgroundColor="transparent")),t.addEventListener("mousedown",(()=>t.style.backgroundColor="rgba(60, 60, 60)")),t.addEventListener("click",(()=>window.callbackFunction(e))),t.addEventListener("mouseup",(()=>t.style.backgroundColor="rgba(60, 60, 60, 0.6)"))}newRow(t,e=!1){let i=this.table.insertRow();i.style.cursor="default";for(let s=0;s{t&&(window.cursor=t),document.body.style.cursor=window.cursor},t}({},LightweightCharts); +var Lib=function(t,e){"use strict";const i={backgroundColor:"#0c0d0f",hoverBackgroundColor:"#3c434c",clickBackgroundColor:"#50565E",activeBackgroundColor:"rgba(0, 122, 255, 0.7)",mutedBackgroundColor:"rgba(0, 122, 255, 0.3)",borderColor:"#3C434C",color:"#d8d9db",activeColor:"#ececed"};function s(){window.pane={...i},window.containerDiv=document.getElementById("container")||document.createElement("div"),window.setCursor=t=>{t&&(window.cursor=t),document.body.style.cursor=window.cursor},window.cursor="default",window.textBoxFocused=!1}class o{handler;div;seriesContainer;ohlcEnabled=!1;percentEnabled=!1;linesEnabled=!1;colorBasedOnCandle=!1;text;candle;_lines=[];constructor(t){this.legendHandler=this.legendHandler.bind(this),this.handler=t,this.ohlcEnabled=!1,this.percentEnabled=!1,this.linesEnabled=!1,this.colorBasedOnCandle=!1,this.div=document.createElement("div"),this.div.classList.add("legend"),this.div.style.maxWidth=100*t.scale.width-8+"vw",this.div.style.display="none";const e=document.createElement("div");e.style.display="flex",e.style.flexDirection="row",this.seriesContainer=document.createElement("div"),this.seriesContainer.classList.add("series-container"),this.text=document.createElement("span"),this.text.style.lineHeight="1.8",this.candle=document.createElement("div"),e.appendChild(this.seriesContainer),this.div.appendChild(this.text),this.div.appendChild(this.candle),this.div.appendChild(e),t.div.appendChild(this.div),t.chart.subscribeCrosshairMove(this.legendHandler)}toJSON(){const{_lines:t,handler:e,...i}=this;return i}makeSeriesRow(t,e){const i="#FFF";let s=`\n \n \`\n `,o=`\n \n `,n=document.createElement("div");n.style.display="flex",n.style.alignItems="center";let r=document.createElement("div"),a=document.createElement("div");a.classList.add("legend-toggle-switch");let l=document.createElementNS("http://www.w3.org/2000/svg","svg");l.setAttribute("width","22"),l.setAttribute("height","16");let h=document.createElementNS("http://www.w3.org/2000/svg","g");h.innerHTML=s;let d=!0;a.addEventListener("click",(()=>{d?(d=!1,h.innerHTML=o,e.applyOptions({visible:!1})):(d=!0,e.applyOptions({visible:!0}),h.innerHTML=s)})),l.appendChild(h),a.appendChild(l),n.appendChild(r),n.appendChild(a),this.seriesContainer.appendChild(n);const c=e.options().baseLineColor;this._lines.push({name:t,div:r,row:n,toggle:a,series:e,solid:c.startsWith("rgba")?c.replace(/[^,]+(?=\))/,"1"):c})}legendItemFormat(t,e){return t.toFixed(e).toString().padStart(8," ")}shorthandFormat(t){const e=Math.abs(t);return e>=1e6?(t/1e6).toFixed(1)+"M":e>=1e3?(t/1e3).toFixed(1)+"K":t.toString().padStart(8," ")}legendHandler(t,e=!1){if(!this.ohlcEnabled&&!this.linesEnabled&&!this.percentEnabled)return;const i=this.handler.series.options();if(!t.time)return this.candle.style.color="transparent",void(this.candle.innerHTML=this.candle.innerHTML.replace(i.upColor,"").replace(i.downColor,""));let s,o=null;if(e){const e=this.handler.chart.timeScale();let i=e.timeToCoordinate(t.time);i&&(o=e.coordinateToLogical(i.valueOf())),o&&(s=this.handler.series.dataByIndex(o.valueOf()))}else s=t.seriesData.get(this.handler.series);this.candle.style.color="";let n='';if(s){if(this.ohlcEnabled&&(n+=`O ${this.legendItemFormat(s.open,this.handler.precision)} `,n+=`| H ${this.legendItemFormat(s.high,this.handler.precision)} `,n+=`| L ${this.legendItemFormat(s.low,this.handler.precision)} `,n+=`| C ${this.legendItemFormat(s.close,this.handler.precision)} `),this.percentEnabled){let t=(s.close-s.open)/s.open*100,e=t>0?i.upColor:i.downColor,o=`${t>=0?"+":""}${t.toFixed(2)} %`;this.colorBasedOnCandle?n+=`| ${o}`:n+="| "+o}if(this.handler.volumeSeries){let e;e=o?this.handler.volumeSeries.dataByIndex(o):t.seriesData.get(this.handler.volumeSeries),e&&(n+=this.ohlcEnabled?`
V ${this.shorthandFormat(e.value)}`:"")}}this.candle.innerHTML=n+"
",this._lines.forEach((i=>{if(!this.linesEnabled)return void(i.row.style.display="none");let s,n;if(i.row.style.display="flex",s=e&&o?i.series.dataByIndex(o):t.seriesData.get(i.series),s?.value){if("Histogram"==i.series.seriesType())n=this.shorthandFormat(s.value);else{const t=i.series.options().priceFormat;n=this.legendItemFormat(s.value,t.precision)}i.div.innerHTML=` ${i.name} : ${n}`}}))}}function n(t){if(void 0===t)throw new Error("Value is undefined");return t}class r{_chart=void 0;_series=void 0;requestUpdate(){this._requestUpdate&&this._requestUpdate()}_requestUpdate;attached({chart:t,series:e,requestUpdate:i}){this._chart=t,this._series=e,this._series.subscribeDataChanged(this._fireDataUpdated),this._requestUpdate=i,this.requestUpdate()}detached(){this._chart=void 0,this._series=void 0,this._requestUpdate=void 0}get chart(){return n(this._chart)}get series(){return n(this._series)}_fireDataUpdated(t){this.dataUpdated&&this.dataUpdated(t)}}const a={lineColor:"#1E80F0",lineStyle:e.LineStyle.Solid,width:4};var l;!function(t){t[t.NONE=0]="NONE",t[t.HOVERING=1]="HOVERING",t[t.DRAGGING=2]="DRAGGING",t[t.DRAGGINGP1=3]="DRAGGINGP1",t[t.DRAGGINGP2=4]="DRAGGINGP2",t[t.DRAGGINGP3=5]="DRAGGINGP3",t[t.DRAGGINGP4=6]="DRAGGINGP4"}(l||(l={}));class h extends r{_paneViews=[];_options;_points=[];_state=l.NONE;_startDragPoint=null;_latestHoverPoint=null;static _mouseIsDown=!1;static hoveredObject=null;static lastHoveredObject=null;_listeners=[];constructor(t){super(),this._options={...a,...t}}updateAllViews(){this._paneViews.forEach((t=>t.update()))}paneViews(){return this._paneViews}applyOptions(t){this._options={...this._options,...t},this.requestUpdate()}updatePoints(...t){for(let e=0;ei.name===t&&i.listener===e));this._listeners.splice(this._listeners.indexOf(i),1)}_handleHoverInteraction(t){if(this._latestHoverPoint=t.point,h._mouseIsDown)this._handleDragInteraction(t);else if(this._mouseIsOverDrawing(t)){if(this._state!=l.NONE)return;this._moveToState(l.HOVERING),h.hoveredObject=h.lastHoveredObject=this}else{if(this._state==l.NONE)return;this._moveToState(l.NONE),h.hoveredObject===this&&(h.hoveredObject=null)}}static _eventToPoint(t,e){if(!e||!t.point||!t.logical)return null;const i=e.coordinateToPrice(t.point.y);return null==i?null:{time:t.time||null,logical:t.logical,price:i.valueOf()}}static _getDiff(t,e){return{logical:t.logical-e.logical,price:t.price-e.price}}_addDiffToPoint(t,e,i){t&&(t.logical=t.logical+e,t.price=t.price+i,t.time=this.series.dataByIndex(t.logical)?.time||null)}_handleMouseDownInteraction=()=>{h._mouseIsDown=!0,this._onMouseDown()};_handleMouseUpInteraction=()=>{h._mouseIsDown=!1,this._moveToState(l.HOVERING)};_handleDragInteraction(t){if(this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP1&&this._state!=l.DRAGGINGP2&&this._state!=l.DRAGGINGP3&&this._state!=l.DRAGGINGP4)return;const e=h._eventToPoint(t,this.series);if(!e)return;this._startDragPoint=this._startDragPoint||e;const i=h._getDiff(e,this._startDragPoint);this._onDrag(i),this.requestUpdate(),this._startDragPoint=e}}class d{_options;constructor(t){this._options=t}}class c extends d{_p1;_p2;_hovered;constructor(t,e,i,s){super(i),this._p1=t,this._p2=e,this._hovered=s}_getScaledCoordinates(t){return null===this._p1.x||null===this._p1.y||null===this._p2.x||null===this._p2.y?null:{x1:Math.round(this._p1.x*t.horizontalPixelRatio),y1:Math.round(this._p1.y*t.verticalPixelRatio),x2:Math.round(this._p2.x*t.horizontalPixelRatio),y2:Math.round(this._p2.y*t.verticalPixelRatio)}}_drawEndCircle(t,e,i){t.context.fillStyle="#000",t.context.beginPath(),t.context.arc(e,i,9,0,2*Math.PI),t.context.stroke(),t.context.fill()}}function p(t,i){const s={[e.LineStyle.Solid]:[],[e.LineStyle.Dotted]:[t.lineWidth,t.lineWidth],[e.LineStyle.Dashed]:[2*t.lineWidth,2*t.lineWidth],[e.LineStyle.LargeDashed]:[6*t.lineWidth,6*t.lineWidth],[e.LineStyle.SparseDotted]:[t.lineWidth,4*t.lineWidth]}[i];t.setLineDash(s)}class u extends d{_point={x:null,y:null};constructor(t,e){super(e),this._point=t}draw(t){t.useBitmapCoordinateSpace((t=>{if(null==this._point.y)return;const e=t.context,i=Math.round(this._point.y*t.verticalPixelRatio),s=this._point.x?this._point.x*t.horizontalPixelRatio:0;e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.beginPath(),e.moveTo(s,i),e.lineTo(t.bitmapSize.width,i),e.stroke()}))}}class _{_source;constructor(t){this._source=t}}class m extends _{_p1={x:null,y:null};_p2={x:null,y:null};_source;constructor(t){super(t),this._source=t}update(){if(!this._source.p1||!this._source.p2)return;const t=this._source.series,e=t.priceToCoordinate(this._source.p1.price),i=t.priceToCoordinate(this._source.p2.price),s=this._getX(this._source.p1),o=this._getX(this._source.p2);this._p1={x:s,y:e},this._p2={x:o,y:i}}_getX(t){return this._source.chart.timeScale().logicalToCoordinate(t.logical)}}class v extends _{_source;_point={x:null,y:null};constructor(t){super(t),this._source=t}update(){const t=this._source._point,e=this._source.chart.timeScale(),i=this._source.series;"RayLine"==this._source._type&&(this._point.x=t.time?e.timeToCoordinate(t.time):e.logicalToCoordinate(t.logical)),this._point.y=i.priceToCoordinate(t.price)}renderer(){return new u(this._point,this._source._options)}}class w{_source;_y=null;_price=null;constructor(t){this._source=t}update(){if(!this._source.series||!this._source._point)return;this._y=this._source.series.priceToCoordinate(this._source._point.price);const t=this._source.series.options().priceFormat.precision;this._price=this._source._point.price.toFixed(t).toString()}visible(){return!0}tickVisible(){return!0}coordinate(){return this._y??0}text(){return this._price||""}textColor(){return"white"}backColor(){return this._source._options.lineColor}}class g extends h{_type="HorizontalLine";_paneViews;_point;_callbackName;_priceAxisViews;_startDragPoint=null;constructor(t,e,i=null){super(e),this._point=t,this._point.time=null,this._paneViews=[new v(this)],this._priceAxisViews=[new w(this)],this._callbackName=i}get points(){return[this._point]}updatePoints(...t){for(const e of t)e&&(this._point.price=e.price);this.requestUpdate()}updateAllViews(){this._paneViews.forEach((t=>t.update())),this._priceAxisViews.forEach((t=>t.update()))}priceAxisViews(){return this._priceAxisViews}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._unsubscribe("mouseup",this._childHandleMouseUpInteraction),this._subscribe("mousedown",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGING:document.body.style.cursor="grabbing",this._subscribe("mouseup",this._childHandleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._addDiffToPoint(this._point,0,t.price),this.requestUpdate()}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this.series.priceToCoordinate(this._point.price);return!!i&&Math.abs(i-t.point.y){this._handleMouseUpInteraction(),this._callbackName&&window.callbackFunction(`${this._callbackName}_~_${this._point.price.toFixed(8)}`)}}class y{_chart;_series;_finishDrawingCallback=null;_drawings=[];_activeDrawing=null;_isDrawing=!1;_drawingType=null;constructor(t,e,i=null){this._chart=t,this._series=e,this._finishDrawingCallback=i,this._chart.subscribeClick(this._clickHandler),this._chart.subscribeCrosshairMove(this._moveHandler)}_clickHandler=t=>this._onClick(t);_moveHandler=t=>this._onMouseMove(t);beginDrawing(t){this._drawingType=t,this._isDrawing=!0}stopDrawing(){this._isDrawing=!1,this._activeDrawing=null}get drawings(){return this._drawings}addNewDrawing(t){this._series.attachPrimitive(t),this._drawings.push(t)}delete(t){if(null==t)return;const e=this._drawings.indexOf(t);-1!=e&&(this._drawings.splice(e,1),t.detach())}clearDrawings(){for(const t of this._drawings)t.detach();this._drawings=[]}repositionOnTime(){for(const t of this.drawings){const e=[];for(const i of t.points){if(!i){e.push(i);continue}const t=i.time?this._chart.timeScale().coordinateToLogical(this._chart.timeScale().timeToCoordinate(i.time)||0):i.logical;e.push({time:i.time,logical:t,price:i.price})}t.updatePoints(...e)}}_onClick(t){if(!this._isDrawing)return;const e=h._eventToPoint(t,this._series);if(e)if(null==this._activeDrawing){if(null==this._drawingType)return;this._activeDrawing=new this._drawingType(e,e),this._series.attachPrimitive(this._activeDrawing),this._drawingType==g&&this._onClick(t)}else{if(this._drawings.push(this._activeDrawing),this.stopDrawing(),!this._finishDrawingCallback)return;this._finishDrawingCallback()}}_onMouseMove(t){if(!t)return;for(const e of this._drawings)e._handleHoverInteraction(t);if(!this._isDrawing||!this._activeDrawing)return;const e=h._eventToPoint(t,this._series);e&&this._activeDrawing.updatePoints(null,e)}}class b extends c{constructor(t,e,i,s){super(t,e,i,s)}draw(t){t.useBitmapCoordinateSpace((t=>{if(null===this._p1.x||null===this._p1.y||null===this._p2.x||null===this._p2.y)return;const e=t.context,i=this._getScaledCoordinates(t);i&&(e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.beginPath(),e.moveTo(i.x1,i.y1),e.lineTo(i.x2,i.y2),e.stroke(),this._hovered&&(this._drawEndCircle(t,i.x1,i.y1),this._drawEndCircle(t,i.x2,i.y2)))}))}}class x extends m{constructor(t){super(t)}renderer(){return new b(this._p1,this._p2,this._source._options,this._source.hovered)}}class C extends h{_paneViews=[];_hovered=!1;constructor(t,e,i){super(),this.points.push(t),this.points.push(e),this._options={...a,...i}}setFirstPoint(t){this.updatePoints(t)}setSecondPoint(t){this.updatePoints(null,t)}get p1(){return this.points[0]}get p2(){return this.points[1]}get hovered(){return this._hovered}}class f extends C{_type="TrendLine";constructor(t,e,i){super(t,e,i),this._paneViews=[new x(this)]}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._hovered=!1,this.requestUpdate(),this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._hovered=!0,this.requestUpdate(),this._subscribe("mousedown",this._handleMouseDownInteraction),this._unsubscribe("mouseup",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGINGP1:case l.DRAGGINGP2:case l.DRAGGING:document.body.style.cursor="grabbing",this._subscribe("mouseup",this._handleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP1||this._addDiffToPoint(this.p1,t.logical,t.price),this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP2||this._addDiffToPoint(this.p2,t.logical,t.price)}_onMouseDown(){this._startDragPoint=null;const t=this._latestHoverPoint;if(!t)return;const e=this._paneViews[0]._p1,i=this._paneViews[0]._p2;if(!(e.x&&i.x&&e.y&&i.y))return this._moveToState(l.DRAGGING);Math.abs(t.x-e.x)<10&&Math.abs(t.y-e.y)<10?this._moveToState(l.DRAGGINGP1):Math.abs(t.x-i.x)<10&&Math.abs(t.y-i.y)<10?this._moveToState(l.DRAGGINGP2):this._moveToState(l.DRAGGING)}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this._paneViews[0]._p1.x,s=this._paneViews[0]._p1.y,o=this._paneViews[0]._p2.x,n=this._paneViews[0]._p2.y;if(!(i&&o&&s&&n))return!1;const r=t.point.x,a=t.point.y;if(r<=Math.min(i,o)-e||r>=Math.max(i,o)+e)return!1;return Math.abs((n-s)*r-(o-i)*a+o*s-n*i)/Math.sqrt((n-s)**2+(o-i)**2)<=e}}class D extends c{constructor(t,e,i,s){super(t,e,i,s)}draw(t){t.useBitmapCoordinateSpace((t=>{const e=t.context,i=this._getScaledCoordinates(t);if(!i)return;e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.fillStyle=this._options.fillColor;const s=Math.min(i.x1,i.x2),o=Math.min(i.y1,i.y2),n=Math.abs(i.x1-i.x2),r=Math.abs(i.y1-i.y2);e.strokeRect(s,o,n,r),e.fillRect(s,o,n,r),this._hovered&&(this._drawEndCircle(t,s,o),this._drawEndCircle(t,s+n,o),this._drawEndCircle(t,s+n,o+r),this._drawEndCircle(t,s,o+r))}))}}class k extends m{constructor(t){super(t)}renderer(){return new D(this._p1,this._p2,this._source._options,this._source.hovered)}}const E={fillEnabled:!0,fillColor:"rgba(255, 255, 255, 0.2)",...a};class L extends C{_type="Box";constructor(t,e,i){super(t,e,i),this._options={...E,...i},this._paneViews=[new k(this)]}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._hovered=!1,this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._hovered=!0,this._unsubscribe("mouseup",this._handleMouseUpInteraction),this._subscribe("mousedown",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGINGP1:case l.DRAGGINGP2:case l.DRAGGINGP3:case l.DRAGGINGP4:case l.DRAGGING:document.body.style.cursor="grabbing",document.body.addEventListener("mouseup",this._handleMouseUpInteraction),this._subscribe("mouseup",this._handleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP1||this._addDiffToPoint(this.p1,t.logical,t.price),this._state!=l.DRAGGING&&this._state!=l.DRAGGINGP2||this._addDiffToPoint(this.p2,t.logical,t.price),this._state!=l.DRAGGING&&(this._state==l.DRAGGINGP3&&(this._addDiffToPoint(this.p1,t.logical,0),this._addDiffToPoint(this.p2,0,t.price)),this._state==l.DRAGGINGP4&&(this._addDiffToPoint(this.p1,0,t.price),this._addDiffToPoint(this.p2,t.logical,0)))}_onMouseDown(){this._startDragPoint=null;const t=this._latestHoverPoint,e=this._paneViews[0]._p1,i=this._paneViews[0]._p2;if(!(e.x&&i.x&&e.y&&i.y))return this._moveToState(l.DRAGGING);const s=10;Math.abs(t.x-e.x)l-p&&rh-p&&ai.appendChild(this.makeColorBox(t))));let s=document.createElement("div");s.style.backgroundColor=window.pane.borderColor,s.style.height="1px",s.style.width="130px";let o=document.createElement("div");o.style.margin="10px";let n=document.createElement("div");n.style.color="lightgray",n.style.fontSize="12px",n.innerText="Opacity",this._opacityLabel=document.createElement("div"),this._opacityLabel.style.color="lightgray",this._opacityLabel.style.fontSize="12px",this._opacitySlider=document.createElement("input"),this._opacitySlider.type="range",this._opacitySlider.value=(100*this.opacity).toString(),this._opacityLabel.innerText=this._opacitySlider.value+"%",this._opacitySlider.oninput=()=>{this._opacityLabel.innerText=this._opacitySlider.value+"%",this.opacity=parseInt(this._opacitySlider.value)/100,this.updateColor()},o.appendChild(n),o.appendChild(this._opacitySlider),o.appendChild(this._opacityLabel),this._div.appendChild(i),this._div.appendChild(s),this._div.appendChild(o),window.containerDiv.appendChild(this._div)}_updateOpacitySlider(){this._opacitySlider.value=(100*this.opacity).toString(),this._opacityLabel.innerText=this._opacitySlider.value+"%"}makeColorBox(t){const e=document.createElement("div");e.style.width="18px",e.style.height="18px",e.style.borderRadius="3px",e.style.margin="3px",e.style.boxSizing="border-box",e.style.backgroundColor=t,e.addEventListener("mouseover",(()=>e.style.border="2px solid lightgray")),e.addEventListener("mouseout",(()=>e.style.border="none"));const i=S.extractRGBA(t);return e.addEventListener("click",(()=>{this.rgba=i,this.updateColor()})),e}static extractRGBA(t){const e=document.createElement("div");e.style.color=t,document.body.appendChild(e);const i=getComputedStyle(e).color;document.body.removeChild(e);const s=i.match(/\d+/g)?.map(Number);if(!s)return[];let o=i.includes("rgba")?parseFloat(i.split(",")[3]):1;return[s[0],s[1],s[2],o]}updateColor(){if(!h.lastHoveredObject||!this.rgba)return;const t=`rgba(${this.rgba[0]}, ${this.rgba[1]}, ${this.rgba[2]}, ${this.opacity})`;h.lastHoveredObject.applyOptions({[this.colorOption]:t}),this.saveDrawings()}openMenu(t){h.lastHoveredObject&&(this.rgba=S.extractRGBA(h.lastHoveredObject._options[this.colorOption]),this.opacity=this.rgba[3],this._updateOpacitySlider(),this._div.style.top=t.top-30+"px",this._div.style.left=t.right+"px",this._div.style.display="flex",setTimeout((()=>document.addEventListener("mousedown",(t=>{this._div.contains(t.target)||this.closeMenu()}))),10))}closeMenu(){document.body.removeEventListener("click",this.closeMenu),this._div.style.display="none"}}class G{static _styles=[{name:"Solid",var:e.LineStyle.Solid},{name:"Dotted",var:e.LineStyle.Dotted},{name:"Dashed",var:e.LineStyle.Dashed},{name:"Large Dashed",var:e.LineStyle.LargeDashed},{name:"Sparse Dotted",var:e.LineStyle.SparseDotted}];_div;_saveDrawings;constructor(t){this._saveDrawings=t,this._div=document.createElement("div"),this._div.classList.add("context-menu"),G._styles.forEach((t=>{this._div.appendChild(this._makeTextBox(t.name,t.var))})),window.containerDiv.appendChild(this._div)}_makeTextBox(t,e){const i=document.createElement("span");return i.classList.add("context-menu-item"),i.innerText=t,i.addEventListener("click",(()=>{h.lastHoveredObject?.applyOptions({lineStyle:e}),this._saveDrawings()})),i}openMenu(t){this._div.style.top=t.top-30+"px",this._div.style.left=t.right+"px",this._div.style.display="block",setTimeout((()=>document.addEventListener("mousedown",(t=>{this._div.contains(t.target)||this.closeMenu()}))),10)}closeMenu(){document.removeEventListener("click",this.closeMenu),this._div.style.display="none"}}function T(t){const e=[];for(const i of t)0==e.length?e.push(i.toUpperCase()):i==i.toUpperCase()?e.push(" "+i):e.push(i);return e.join("")}class I{saveDrawings;drawingTool;div;hoverItem;items=[];constructor(t,e){this.saveDrawings=t,this.drawingTool=e,this._onRightClick=this._onRightClick.bind(this),this.div=document.createElement("div"),this.div.classList.add("context-menu"),document.body.appendChild(this.div),this.hoverItem=null,document.body.addEventListener("contextmenu",this._onRightClick)}_handleClick=t=>this._onClick(t);_onClick(t){t.target&&(this.div.contains(t.target)||(this.div.style.display="none",document.body.removeEventListener("click",this._handleClick)))}_onRightClick(t){if(!h.hoveredObject)return;for(const t of this.items)this.div.removeChild(t);this.items=[];for(const t of Object.keys(h.hoveredObject._options)){let e;if(t.toLowerCase().includes("color"))e=new S(this.saveDrawings,t);else{if("lineStyle"!==t)continue;e=new G(this.saveDrawings)}let i=t=>e.openMenu(t);this.menuItem(T(t),i,(()=>{document.removeEventListener("click",e.closeMenu),e._div.style.display="none"}))}this.separator(),this.menuItem("Delete Drawing",(()=>this.drawingTool.delete(h.lastHoveredObject))),t.preventDefault(),this.div.style.left=t.clientX+"px",this.div.style.top=t.clientY+"px",this.div.style.display="block",document.body.addEventListener("click",this._handleClick)}menuItem(t,e,i=null){const s=document.createElement("span");s.classList.add("context-menu-item"),this.div.appendChild(s);const o=document.createElement("span");if(o.innerText=t,o.style.pointerEvents="none",s.appendChild(o),i){let t=document.createElement("span");t.innerText="►",t.style.fontSize="8px",t.style.pointerEvents="none",s.appendChild(t)}if(s.addEventListener("mouseover",(()=>{this.hoverItem&&this.hoverItem.closeAction&&this.hoverItem.closeAction(),this.hoverItem={elem:o,action:e,closeAction:i}})),i){let t;s.addEventListener("mouseover",(()=>t=setTimeout((()=>e(s.getBoundingClientRect())),100))),s.addEventListener("mouseout",(()=>clearTimeout(t)))}else s.addEventListener("click",(t=>{e(t),this.div.style.display="none"}));this.items.push(s)}separator(){const t=document.createElement("div");t.style.width="90%",t.style.height="1px",t.style.margin="3px 0px",t.style.backgroundColor=window.pane.borderColor,this.div.appendChild(t),this.items.push(t)}}class M extends g{_type="RayLine";constructor(t,e){super({...t},e),this._point.time=t.time}updatePoints(...t){for(const e of t)e&&(this._point=e);this.requestUpdate()}_onDrag(t){this._addDiffToPoint(this._point,t.logical,t.price),this.requestUpdate()}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this.series.priceToCoordinate(this._point.price),s=this._point.time?this.chart.timeScale().timeToCoordinate(this._point.time):null;return!(!i||!s)&&(Math.abs(i-t.point.y)s-e)}}class N extends d{_point={x:null,y:null};constructor(t,e){super(e),this._point=t}draw(t){t.useBitmapCoordinateSpace((t=>{if(null==this._point.x)return;const e=t.context,i=this._point.x*t.horizontalPixelRatio;e.lineWidth=this._options.width,e.strokeStyle=this._options.lineColor,p(e,this._options.lineStyle),e.beginPath(),e.moveTo(i,0),e.lineTo(i,t.bitmapSize.height),e.stroke()}))}}class R extends _{_source;_point={x:null,y:null};constructor(t){super(t),this._source=t}update(){const t=this._source._point,e=this._source.chart.timeScale(),i=this._source.series;this._point.x=t.time?e.timeToCoordinate(t.time):e.logicalToCoordinate(t.logical),this._point.y=i.priceToCoordinate(t.price)}renderer(){return new N(this._point,this._source._options)}}class A{_source;_x=null;constructor(t){this._source=t}update(){if(!this._source.chart||!this._source._point)return;const t=this._source._point,e=this._source.chart.timeScale();this._x=t.time?e.timeToCoordinate(t.time):e.logicalToCoordinate(t.logical)}visible(){return!0}tickVisible(){return!0}coordinate(){return this._x??0}text(){return"No-text"}textColor(){return"white"}backColor(){return this._source._options.lineColor}}class B extends h{_type="VerticalLine";_paneViews;_timeAxisViews;_point;_callbackName;_startDragPoint=null;constructor(t,e,i=null){super(e),this._point=t,this._paneViews=[new R(this)],this._callbackName=i,this._timeAxisViews=[new A(this)]}updateAllViews(){this._paneViews.forEach((t=>t.update())),this._timeAxisViews.forEach((t=>t.update()))}timeAxisViews(){return this._timeAxisViews}updatePoints(...t){for(const e of t)e&&(!e.time&&e.logical&&(e.time=this.series.dataByIndex(e.logical)?.time||null),this._point=e);this.requestUpdate()}get points(){return[this._point]}_moveToState(t){switch(t){case l.NONE:document.body.style.cursor="default",this._unsubscribe("mousedown",this._handleMouseDownInteraction);break;case l.HOVERING:document.body.style.cursor="pointer",this._unsubscribe("mouseup",this._childHandleMouseUpInteraction),this._subscribe("mousedown",this._handleMouseDownInteraction),this.chart.applyOptions({handleScroll:!0});break;case l.DRAGGING:document.body.style.cursor="grabbing",this._subscribe("mouseup",this._childHandleMouseUpInteraction),this.chart.applyOptions({handleScroll:!1})}this._state=t}_onDrag(t){this._addDiffToPoint(this._point,t.logical,0),this.requestUpdate()}_mouseIsOverDrawing(t,e=4){if(!t.point)return!1;const i=this.chart.timeScale();let s;return s=this._point.time?i.timeToCoordinate(this._point.time):i.logicalToCoordinate(this._point.logical),!!s&&Math.abs(s-t.point.x){this._handleMouseUpInteraction(),this._callbackName&&window.callbackFunction(`${this._callbackName}_~_${this._point.price.toFixed(8)}`)}}class P{static TREND_SVG='';static HORZ_SVG='';static RAY_SVG='';static BOX_SVG='';static VERT_SVG=P.RAY_SVG;div;activeIcon=null;buttons=[];_commandFunctions;_handlerID;_drawingTool;constructor(t,e,i,s){this._handlerID=t,this._commandFunctions=s,this._drawingTool=new y(e,i,(()=>this.removeActiveAndSave())),this.div=this._makeToolBox(),new I(this.saveDrawings,this._drawingTool),s.push((t=>{if((t.metaKey||t.ctrlKey)&&"KeyZ"===t.code){const t=this._drawingTool.drawings.pop();return t&&this._drawingTool.delete(t),!0}return!1}))}toJSON(){const{...t}=this;return t}_makeToolBox(){let t=document.createElement("div");t.classList.add("toolbox"),this.buttons.push(this._makeToolBoxElement(f,"KeyT",P.TREND_SVG)),this.buttons.push(this._makeToolBoxElement(g,"KeyH",P.HORZ_SVG)),this.buttons.push(this._makeToolBoxElement(M,"KeyR",P.RAY_SVG)),this.buttons.push(this._makeToolBoxElement(L,"KeyB",P.BOX_SVG)),this.buttons.push(this._makeToolBoxElement(B,"KeyV",P.VERT_SVG,!0));for(const e of this.buttons)t.appendChild(e);return t}_makeToolBoxElement(t,e,i,s=!1){const o=document.createElement("div");o.classList.add("toolbox-button");const n=document.createElementNS("http://www.w3.org/2000/svg","svg");n.setAttribute("width","29"),n.setAttribute("height","29");const r=document.createElementNS("http://www.w3.org/2000/svg","g");r.innerHTML=i,r.setAttribute("fill",window.pane.color),n.appendChild(r),o.appendChild(n);const a={div:o,group:r,type:t};return o.addEventListener("click",(()=>this._onIconClick(a))),this._commandFunctions.push((t=>this._handlerID===window.handlerInFocus&&(!(!t.altKey||t.code!==e)&&(t.preventDefault(),this._onIconClick(a),!0)))),1==s&&(n.style.transform="rotate(90deg)",n.style.transformBox="fill-box",n.style.transformOrigin="center"),o}_onIconClick(t){this.activeIcon&&(this.activeIcon.div.classList.remove("active-toolbox-button"),window.setCursor("crosshair"),this._drawingTool?.stopDrawing(),this.activeIcon===t)?this.activeIcon=null:(this.activeIcon=t,this.activeIcon.div.classList.add("active-toolbox-button"),window.setCursor("crosshair"),this._drawingTool?.beginDrawing(this.activeIcon.type))}removeActiveAndSave=()=>{window.setCursor("default"),this.activeIcon&&this.activeIcon.div.classList.remove("active-toolbox-button"),this.activeIcon=null,this.saveDrawings()};addNewDrawing(t){this._drawingTool.addNewDrawing(t)}clearDrawings(){this._drawingTool.clearDrawings()}saveDrawings=()=>{const t=[];for(const e of this._drawingTool.drawings)t.push({type:e._type,points:e.points,options:e._options});const e=JSON.stringify(t);window.callbackFunction(`save_drawings${this._handlerID}_~_${e}`)};loadDrawings(t){t.forEach((t=>{switch(t.type){case"Box":this._drawingTool.addNewDrawing(new L(t.points[0],t.points[1],t.options));break;case"TrendLine":this._drawingTool.addNewDrawing(new f(t.points[0],t.points[1],t.options));break;case"HorizontalLine":this._drawingTool.addNewDrawing(new g(t.points[0],t.options));break;case"RayLine":this._drawingTool.addNewDrawing(new M(t.points[0],t.options));break;case"VerticalLine":this._drawingTool.addNewDrawing(new B(t.points[0],t.options))}}))}}class O{makeButton;callbackName;div;isOpen=!1;widget;constructor(t,e,i,s,o,n){this.makeButton=t,this.callbackName=e,this.div=document.createElement("div"),this.div.classList.add("topbar-menu"),this.widget=this.makeButton(s+" ↓",null,o,!0,n),this.updateMenuItems(i),this.widget.elem.addEventListener("click",(()=>{if(this.isOpen=!this.isOpen,!this.isOpen)return void(this.div.style.display="none");let t=this.widget.elem.getBoundingClientRect();this.div.style.display="flex",this.div.style.flexDirection="column";let e=t.x+t.width/2;this.div.style.left=e-this.div.clientWidth/2+"px",this.div.style.top=t.y+t.height+"px"})),document.body.appendChild(this.div)}updateMenuItems(t){this.div.innerHTML="",t.forEach((t=>{let e=this.makeButton(t,null,!1,!1);e.elem.addEventListener("click",(()=>{this._clickHandler(e.elem.innerText)})),e.elem.style.margin="4px 4px",e.elem.style.padding="2px 2px",this.div.appendChild(e.elem)})),this.widget.elem.innerText=t[0]+" ↓"}_clickHandler(t){this.widget.elem.innerText=t+" ↓",window.callbackFunction(`${this.callbackName}_~_${t}`),this.div.style.display="none",this.isOpen=!1}}class V{_handler;_div;left;right;constructor(t){this._handler=t,this._div=document.createElement("div"),this._div.classList.add("topbar");const e=t=>{const e=document.createElement("div");return e.classList.add("topbar-container"),e.style.justifyContent=t,this._div.appendChild(e),e};this.left=e("flex-start"),this.right=e("flex-end")}makeSwitcher(t,e,i,s="left"){const o=document.createElement("div");let n;o.style.margin="4px 12px";const r={elem:o,callbackName:i,intervalElements:t.map((t=>{const i=document.createElement("button");i.classList.add("topbar-button"),i.classList.add("switcher-button"),i.style.margin="0px 2px",i.innerText=t,t==e&&(n=i,i.classList.add("active-switcher-button"));const s=V.getClientWidth(i);return i.style.minWidth=s+1+"px",i.addEventListener("click",(()=>r.onItemClicked(i))),o.appendChild(i),i})),onItemClicked:t=>{t!=n&&(n.classList.remove("active-switcher-button"),t.classList.add("active-switcher-button"),n=t,window.callbackFunction(`${r.callbackName}_~_${t.innerText}`))}};return this.appendWidget(o,s,!0),r}makeTextBoxWidget(t,e="left",i=null){if(i){const s=document.createElement("input");return s.classList.add("topbar-textbox-input"),s.value=t,s.style.width=`${s.value.length+2}ch`,s.addEventListener("focus",(()=>{window.textBoxFocused=!0})),s.addEventListener("input",(t=>{t.preventDefault(),s.style.width=`${s.value.length+2}ch`})),s.addEventListener("keydown",(t=>{"Enter"==t.key&&(t.preventDefault(),s.blur())})),s.addEventListener("blur",(()=>{window.callbackFunction(`${i}_~_${s.value}`),window.textBoxFocused=!1})),this.appendWidget(s,e,!0),s}{const i=document.createElement("div");return i.classList.add("topbar-textbox"),i.innerText=t,this.appendWidget(i,e,!0),i}}makeMenu(t,e,i,s,o){return new O(this.makeButton.bind(this),s,t,e,i,o)}makeButton(t,e,i,s=!0,o="left",n=!1){let r=document.createElement("button");r.classList.add("topbar-button"),r.innerText=t,document.body.appendChild(r),r.style.minWidth=r.clientWidth+1+"px",document.body.removeChild(r);let a={elem:r,callbackName:e};if(e){let t;if(n){let e=!1;t=()=>{e=!e,window.callbackFunction(`${a.callbackName}_~_${e}`),r.style.backgroundColor=e?"var(--active-bg-color)":"",r.style.color=e?"var(--active-color)":""}}else t=()=>window.callbackFunction(`${a.callbackName}_~_${r.innerText}`);r.addEventListener("click",t)}return s&&this.appendWidget(r,o,i),a}makeSeparator(t="left"){const e=document.createElement("div");e.classList.add("topbar-seperator");("left"==t?this.left:this.right).appendChild(e)}appendWidget(t,e,i){const s="left"==e?this.left:this.right;i?("left"==e&&s.appendChild(t),this.makeSeparator(e),"right"==e&&s.appendChild(t)):s.appendChild(t),this._handler.reSize()}static getClientWidth(t){document.body.appendChild(t);const e=t.clientWidth;return document.body.removeChild(t),e}}s();return t.Box=L,t.Handler=class{id;commandFunctions=[];wrapper;div;chart;scale;precision=2;series;volumeSeries;legend;_topBar;toolBox;spinner;_seriesList=[];watermark;seriesMarkers;constructor(t,i,s,n,r){this.reSize=this.reSize.bind(this),this.id=t,this.scale={width:i,height:s},this.wrapper=document.createElement("div"),this.wrapper.classList.add("handler"),this.wrapper.style.float=n,this.div=document.createElement("div"),this.div.style.position="relative",this.wrapper.appendChild(this.div),window.containerDiv.append(this.wrapper),this.chart=this._createChart(),this.series=this.createCandlestickSeries(0),this.volumeSeries=this.createVolumeSeries(0),this.seriesMarkers=e.createSeriesMarkers(this.series,[]),this.legend=new o(this),document.addEventListener("keydown",(t=>{for(let e=0;ewindow.handlerInFocus=this.id)),this.reSize(),r&&window.addEventListener("resize",(()=>this.reSize()))}reSize(){let t=0!==this.scale.height&&this._topBar?._div.offsetHeight||0;this.chart.resize(window.innerWidth*this.scale.width,window.innerHeight*this.scale.height-t),this.wrapper.style.width=100*this.scale.width+"%",this.wrapper.style.height=100*this.scale.height+"%",0===this.scale.height||0===this.scale.width?this.toolBox&&(this.toolBox.div.style.display="none"):this.toolBox&&(this.toolBox.div.style.display="flex")}_createChart(){return e.createChart(this.div,{width:window.innerWidth*this.scale.width,height:window.innerHeight*this.scale.height,layout:{textColor:window.pane.color,background:{color:"#000000",type:e.ColorType.Solid},fontSize:12},rightPriceScale:{scaleMargins:{top:.3,bottom:.25}},timeScale:{timeVisible:!0,secondsVisible:!1},crosshair:{mode:e.CrosshairMode.Normal,vertLine:{labelBackgroundColor:"rgb(46, 46, 46)"},horzLine:{labelBackgroundColor:"rgb(55, 55, 55)"}},grid:{vertLines:{color:"rgba(29, 30, 38, 5)"},horzLines:{color:"rgba(29, 30, 58, 5)"}},handleScroll:{vertTouchDrag:!0}})}createCandlestickSeries(t){const i="rgba(39, 157, 130, 100)",s="rgba(200, 97, 100, 100)",o=this.chart.addSeries(e.CandlestickSeries,{upColor:i,borderUpColor:i,wickUpColor:i,downColor:s,borderDownColor:s,wickDownColor:s},t);return o.priceScale().applyOptions({scaleMargins:{top:.2,bottom:.2}}),o}createVolumeSeries(t){const i=this.chart.addSeries(e.HistogramSeries,{color:"#26a69a",priceFormat:{type:"volume"},priceScaleId:"volume_scale"},t);return i.priceScale().applyOptions({scaleMargins:{top:.8,bottom:0}}),i}createLineSeries(t,i,s){const o=this.chart.addSeries(e.LineSeries,{...i},s);return this._seriesList.push(o),this.legend.makeSeriesRow(t,o),{name:t,series:o}}createHistogramSeries(t,i,s){const o=this.chart.addSeries(e.HistogramSeries,{...i},s);return this._seriesList.push(o),this.legend.makeSeriesRow(t,o),{name:t,series:o}}createToolBox(){this.toolBox=new P(this.id,this.chart,this.series,this.commandFunctions),this.div.appendChild(this.toolBox.div)}createTopBar(){return this._topBar=new V(this),this.wrapper.prepend(this._topBar._div),this._topBar}toJSON(){const{chart:t,...e}=this;return e}static syncCharts(t,e,i=!1){function s(t,e){e?(t.chart.setCrosshairPosition(e.value||e.close,e.time,t.series),t.legend.legendHandler(e,!0)):t.chart.clearCrosshairPosition()}function o(t,e){return e.time&&e.seriesData.get(t)||null}const n=t.chart.timeScale(),r=e.chart.timeScale(),a=t=>{t&&n.setVisibleLogicalRange(t)},l=t=>{t&&r.setVisibleLogicalRange(t)},h=i=>{s(e,o(t.series,i))},d=i=>{s(t,o(e.series,i))};let c=e;function p(t,e,s,o,n,r){t.wrapper.addEventListener("mouseover",(()=>{c!==t&&(c=t,e.chart.unsubscribeCrosshairMove(s),t.chart.subscribeCrosshairMove(o),i||(e.chart.timeScale().unsubscribeVisibleLogicalRangeChange(n),t.chart.timeScale().subscribeVisibleLogicalRangeChange(r)))}))}p(e,t,h,d,l,a),p(t,e,d,h,a,l),e.chart.subscribeCrosshairMove(d);const u=r.getVisibleLogicalRange();u&&n.setVisibleLogicalRange(u),i||e.chart.timeScale().subscribeVisibleLogicalRangeChange(a)}static makeSearchBox(t){const e=document.createElement("div");e.classList.add("searchbox"),e.style.display="none";const i=document.createElement("div");i.innerHTML='';const s=document.createElement("input");return s.type="text",e.appendChild(i),e.appendChild(s),t.div.appendChild(e),t.commandFunctions.push((i=>window.handlerInFocus===t.id&&!window.textBoxFocused&&("none"===e.style.display?!!/^[a-zA-Z0-9]$/.test(i.key)&&(e.style.display="flex",s.focus(),!0):("Enter"===i.key||"Escape"===i.key)&&("Enter"===i.key&&window.callbackFunction(`search${t.id}_~_${s.value}`),e.style.display="none",s.value="",!0)))),s.addEventListener("input",(()=>s.value=s.value.toUpperCase())),{window:e,box:s}}static makeSpinner(t){t.spinner=document.createElement("div"),t.spinner.classList.add("spinner"),t.wrapper.appendChild(t.spinner);let e=0;!function i(){t.spinner&&(e+=10,t.spinner.style.transform=`translate(-50%, -50%) rotate(${e}deg)`,requestAnimationFrame(i))}()}static _styleMap={"--bg-color":"backgroundColor","--hover-bg-color":"hoverBackgroundColor","--click-bg-color":"clickBackgroundColor","--active-bg-color":"activeBackgroundColor","--muted-bg-color":"mutedBackgroundColor","--border-color":"borderColor","--color":"color","--active-color":"activeColor"};static setRootStyles(t){const e=document.documentElement.style;for(const[i,s]of Object.entries(this._styleMap))e.setProperty(i,t[s])}createWatermark(t,i,s){this.watermark?this.watermark.applyOptions({lines:[{text:t,color:s,fontSize:i}]}):this.watermark=e.createTextWatermark(this.chart.panes()[0],{horzAlign:"center",vertAlign:"center",lines:[{text:t,color:s,fontSize:i}]})}},t.HorizontalLine=g,t.Legend=o,t.RayLine=M,t.Table=class{_div;callbackName;borderColor;borderWidth;table;rows={};headings;widths;alignments;footer;header;constructor(t,e,i,s,o,n,r=!1,a,l,h,d,c){this._div=document.createElement("div"),this.callbackName=null,this.borderColor=l,this.borderWidth=h,r?(this._div.style.position="absolute",this._div.style.cursor="move"):(this._div.style.position="relative",this._div.style.float=n),this._div.style.zIndex="2000",this.reSize(t,e),this._div.style.display="flex",this._div.style.flexDirection="column",this._div.style.borderRadius="5px",this._div.style.color="white",this._div.style.fontSize="12px",this._div.style.fontVariantNumeric="tabular-nums",this.table=document.createElement("table"),this.table.style.width="100%",this.table.style.borderCollapse="collapse",this._div.style.overflow="hidden",this.headings=i,this.widths=s.map((t=>100*t+"%")),this.alignments=o;let p=this.table.createTHead().insertRow();for(let t=0;t0?c[t]:a,e.style.color=d[t],p.appendChild(e)}let u,_,m=document.createElement("div");if(m.style.overflowY="auto",m.style.overflowX="hidden",m.style.backgroundColor=a,m.appendChild(this.table),this._div.appendChild(m),window.containerDiv.appendChild(this._div),!r)return;let v=t=>{this._div.style.left=t.clientX-u+"px",this._div.style.top=t.clientY-_+"px"},w=()=>{document.removeEventListener("mousemove",v),document.removeEventListener("mouseup",w)};this._div.addEventListener("mousedown",(t=>{u=t.clientX-this._div.offsetLeft,_=t.clientY-this._div.offsetTop,document.addEventListener("mousemove",v),document.addEventListener("mouseup",w)}))}divToButton(t,e){t.addEventListener("mouseover",(()=>t.style.backgroundColor="rgba(60, 60, 60, 0.6)")),t.addEventListener("mouseout",(()=>t.style.backgroundColor="transparent")),t.addEventListener("mousedown",(()=>t.style.backgroundColor="rgba(60, 60, 60)")),t.addEventListener("click",(()=>window.callbackFunction(e))),t.addEventListener("mouseup",(()=>t.style.backgroundColor="rgba(60, 60, 60, 0.6)"))}newRow(t,e=!1){let i=this.table.insertRow();i.style.cursor="default";for(let s=0;s{t&&(window.cursor=t),document.body.style.cursor=window.cursor},t}({},LightweightCharts); diff --git a/lightweight_charts/js/index.html b/lightweight_charts/js/index.html index 8f2dd943..576e4931 100644 --- a/lightweight_charts/js/index.html +++ b/lightweight_charts/js/index.html @@ -3,7 +3,7 @@ lightweight-charts-python - +