diff --git a/__pycache__/engine.cpython-313.pyc b/__pycache__/engine.cpython-313.pyc index 8ea9256..4c0f052 100644 Binary files a/__pycache__/engine.cpython-313.pyc and b/__pycache__/engine.cpython-313.pyc differ diff --git a/app.py b/app.py index 5e0f7d0..0526d11 100644 --- a/app.py +++ b/app.py @@ -4,6 +4,7 @@ from engine import DataEngine import concurrent.futures from flask_caching import Cache import csv, os, logging +from concurrent.futures import ThreadPoolExecutor app = Flask(__name__) cache = Cache(app, config={'CACHE_TYPE': 'SimpleCache'}) @@ -11,52 +12,6 @@ cache = Cache(app, config={'CACHE_TYPE': 'SimpleCache'}) import os import csv -def load_instruments_from_csv(file_path): - instruments = [] - - # Standard static templates - # For AGI, we use the ISIN-based Tearsheet URL - TEMPLATES = { - 'jpm': "https://am.jpmorgan.com/FundsMarketingHandler/historicalData?cusip={cusip}&country=hk&role=per", - 'yahoo': "https://query1.finance.yahoo.com/v8/finance/chart/{cusip}?range=5y&interval=1d", - 'agi': "https://markets.ft.com/data/funds/tearsheet/historical?s={cusip}" - } - - try: - abs_path = os.path.join(os.path.dirname(__file__), file_path) - - if not os.path.exists(abs_path): - print(f"Error: {file_path} not found.") - return [] - - with open(abs_path, mode='r', encoding='utf-8-sig') as csvfile: - reader = csv.DictReader(csvfile) - # Standardize header names to lowercase - reader.fieldnames = [name.strip().lower() for name in reader.fieldnames] - - for row in reader: - symbol = row.get('symbol', '').strip() - cusip = row.get('cusip', '').strip() - provider = row.get('provider', 'jpm').strip().lower() - - if symbol and cusip: - # Fetch correct template; default to JPM if provider is unknown - template = TEMPLATES.get(provider, TEMPLATES['jpm']) - url = template.format(cusip=cusip) - - instruments.append({ - "symbol": symbol, - "url": url, - "provider": provider - }) - - except Exception as e: - print(f"CSV Loading Error: {e}") - - return instruments - -# Usage -URL_CONFIG = load_instruments_from_csv('instruments.csv') @cache.memoize(timeout=3600) def fetch_and_calculate(config): @@ -75,13 +30,38 @@ def index(): @app.route('/api/summary') def get_summary(): + engine_base = DataEngine() + instruments = engine_base.load_instruments_from_csv('instruments.csv') + results = [] - with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: - futures = [executor.submit(fetch_and_calculate, cfg) for cfg in URL_CONFIG] - for f in concurrent.futures.as_completed(futures): - if f.result(): results.append(f.result()) - results.sort(key=lambda x: x['symbol']) + for item in instruments: + engine = DataEngine( + symbol=item['symbol'], + url=item['url'], + provider=item['provider'] + ) + + metrics = engine.get_local_metrics() + + if metrics and isinstance(metrics, dict): + metrics['symbol'] = item['symbol'] + results.append(metrics) + else: + # š„ FIX: Include the 'error' key so JavaScript hits the Gatekeeper + results.append({ + "symbol": item['symbol'], + "last_close": None, # Ensure this is null, not the string "No Data" + "error": True + }) + return jsonify(results) +@app.route('/api/sync', methods=['POST']) +def run_sync(): + # ā THIS RUNS THE FULL fetch_data() WITH NETWORK ACCESS + engine = DataEngine() + report = engine.global_sync() + return jsonify(report) + if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/data_cache/SPMO ETF - USD.csv b/data_cache/SPMO ETF - USD.csv index ab8392c..519e232 100644 --- a/data_cache/SPMO ETF - USD.csv +++ b/data_cache/SPMO ETF - USD.csv @@ -1,4 +1,1335 @@ date,close +2015-10-12 13:30:00,25.190000534057617 +2015-10-13 13:30:00,25.190000534057617 +2015-10-14 13:30:00,25.190000534057617 +2015-10-15 13:30:00,25.190000534057617 +2015-10-16 13:30:00,25.34000015258789 +2015-10-19 13:30:00,25.34000015258789 +2015-10-20 13:30:00,25.34000015258789 +2015-10-21 13:30:00,25.34000015258789 +2015-10-22 13:30:00,25.541000366210938 +2015-10-23 13:30:00,25.541000366210938 +2015-10-26 13:30:00,25.799999237060547 +2015-10-27 13:30:00,25.799999237060547 +2015-10-28 13:30:00,26.360000610351562 +2015-10-29 13:30:00,26.299999237060547 +2015-10-30 13:30:00,26.18000030517578 +2015-11-02 14:30:00,26.18000030517578 +2015-11-03 14:30:00,26.18000030517578 +2015-11-04 14:30:00,26.18000030517578 +2015-11-05 14:30:00,26.100000381469727 +2015-11-06 14:30:00,26.1200008392334 +2015-11-09 14:30:00,26.1200008392334 +2015-11-10 14:30:00,25.958999633789062 +2015-11-11 14:30:00,25.958999633789062 +2015-11-12 14:30:00,25.958999633789062 +2015-11-13 14:30:00,25.42300033569336 +2015-11-16 14:30:00,25.55299949645996 +2015-11-17 14:30:00,25.55299949645996 +2015-11-18 14:30:00,25.55299949645996 +2015-11-19 14:30:00,25.979999542236328 +2015-11-20 14:30:00,25.979999542236328 +2015-11-23 14:30:00,25.979999542236328 +2015-11-24 14:30:00,26.049999237060547 +2015-11-25 14:30:00,26.450000762939453 +2015-11-27 14:30:00,26.450000762939453 +2015-11-30 14:30:00,26.450000762939453 +2015-12-01 14:30:00,26.360000610351562 +2015-12-02 14:30:00,26.360000610351562 +2015-12-03 14:30:00,26.360000610351562 +2015-12-04 14:30:00,26.360000610351562 +2015-12-07 14:30:00,26.360000610351562 +2015-12-08 14:30:00,26.360000610351562 +2015-12-09 14:30:00,26.360000610351562 +2015-12-10 14:30:00,26.360000610351562 +2015-12-11 14:30:00,26.360000610351562 +2015-12-14 14:30:00,26.360000610351562 +2015-12-15 14:30:00,26.360000610351562 +2015-12-16 14:30:00,26.360000610351562 +2015-12-17 14:30:00,26.360000610351562 +2015-12-18 14:30:00,25.799999237060547 +2015-12-21 14:30:00,25.799999237060547 +2015-12-22 14:30:00,25.799999237060547 +2015-12-23 14:30:00,25.799999237060547 +2015-12-24 14:30:00,25.799999237060547 +2015-12-28 14:30:00,25.799999237060547 +2015-12-29 14:30:00,25.799999237060547 +2015-12-30 14:30:00,25.799999237060547 +2015-12-31 14:30:00,25.799999237060547 +2016-01-04 14:30:00,25.799999237060547 +2016-01-05 14:30:00,25.799999237060547 +2016-01-06 14:30:00,25.489999771118164 +2016-01-07 14:30:00,25.489999771118164 +2016-01-08 14:30:00,25.489999771118164 +2016-01-11 14:30:00,25.489999771118164 +2016-01-12 14:30:00,25.489999771118164 +2016-01-13 14:30:00,25.489999771118164 +2016-01-14 14:30:00,24.559999465942383 +2016-01-15 14:30:00,24.559999465942383 +2016-01-19 14:30:00,24.920000076293945 +2016-01-20 14:30:00,24.920000076293945 +2016-01-21 14:30:00,24.299999237060547 +2016-01-22 14:30:00,24.299999237060547 +2016-01-25 14:30:00,24.299999237060547 +2016-01-26 14:30:00,24.299999237060547 +2016-01-27 14:30:00,24.299999237060547 +2016-01-28 14:30:00,24.329999923706055 +2016-01-29 14:30:00,24.770000457763672 +2016-02-01 14:30:00,24.770000457763672 +2016-02-02 14:30:00,24.5 +2016-02-03 14:30:00,24.5 +2016-02-04 14:30:00,24.5 +2016-02-05 14:30:00,23.75 +2016-02-08 14:30:00,23.75 +2016-02-09 14:30:00,23.75 +2016-02-10 14:30:00,23.649999618530273 +2016-02-11 14:30:00,23.649999618530273 +2016-02-12 14:30:00,23.450000762939453 +2016-02-16 14:30:00,23.969999313354492 +2016-02-17 14:30:00,23.969999313354492 +2016-02-18 14:30:00,24.309999465942383 +2016-02-19 14:30:00,24.309999465942383 +2016-02-22 14:30:00,24.719999313354492 +2016-02-23 14:30:00,24.719999313354492 +2016-02-24 14:30:00,24.719999313354492 +2016-02-25 14:30:00,24.719999313354492 +2016-02-26 14:30:00,24.719999313354492 +2016-02-29 14:30:00,24.719999313354492 +2016-03-01 14:30:00,24.719999313354492 +2016-03-02 14:30:00,24.719999313354492 +2016-03-03 14:30:00,24.719999313354492 +2016-03-04 14:30:00,25.149999618530273 +2016-03-07 14:30:00,25.149999618530273 +2016-03-08 14:30:00,25.149999618530273 +2016-03-09 14:30:00,25.149999618530273 +2016-03-10 14:30:00,25.149999618530273 +2016-03-11 14:30:00,25.149999618530273 +2016-03-14 13:30:00,25.149999618530273 +2016-03-15 13:30:00,25.149999618530273 +2016-03-16 13:30:00,25.149999618530273 +2016-03-17 13:30:00,25.329999923706055 +2016-03-18 13:30:00,25.329999923706055 +2016-03-21 13:30:00,25.329999923706055 +2016-03-22 13:30:00,25.329999923706055 +2016-03-23 13:30:00,25.329999923706055 +2016-03-24 13:30:00,25.329999923706055 +2016-03-28 13:30:00,25.329999923706055 +2016-03-29 13:30:00,25.329999923706055 +2016-03-30 13:30:00,26.049999237060547 +2016-03-31 13:30:00,26.049999237060547 +2016-04-01 13:30:00,26.049999237060547 +2016-04-04 13:30:00,26.049999237060547 +2016-04-05 13:30:00,26.049999237060547 +2016-04-06 13:30:00,26.049999237060547 +2016-04-07 13:30:00,25.78700065612793 +2016-04-08 13:30:00,25.93000030517578 +2016-04-11 13:30:00,25.93000030517578 +2016-04-12 13:30:00,25.93000030517578 +2016-04-13 13:30:00,25.93000030517578 +2016-04-14 13:30:00,25.969999313354492 +2016-04-15 13:30:00,25.969999313354492 +2016-04-18 13:30:00,26.18000030517578 +2016-04-19 13:30:00,26.18000030517578 +2016-04-20 13:30:00,26.18000030517578 +2016-04-21 13:30:00,26.18000030517578 +2016-04-22 13:30:00,26.18000030517578 +2016-04-25 13:30:00,26.18000030517578 +2016-04-26 13:30:00,26.18000030517578 +2016-04-27 13:30:00,26.18000030517578 +2016-04-28 13:30:00,26.18000030517578 +2016-04-29 13:30:00,26.18000030517578 +2016-05-02 13:30:00,25.83300018310547 +2016-05-03 13:30:00,25.83300018310547 +2016-05-04 13:30:00,25.83300018310547 +2016-05-05 13:30:00,25.83300018310547 +2016-05-06 13:30:00,25.83300018310547 +2016-05-09 13:30:00,25.83300018310547 +2016-05-10 13:30:00,25.83300018310547 +2016-05-11 13:30:00,25.83300018310547 +2016-05-12 13:30:00,25.83300018310547 +2016-05-13 13:30:00,26.09000015258789 +2016-05-16 13:30:00,26.09000015258789 +2016-05-17 13:30:00,26.09000015258789 +2016-05-18 13:30:00,26.09000015258789 +2016-05-19 13:30:00,26.09000015258789 +2016-05-20 13:30:00,25.739999771118164 +2016-05-23 13:30:00,25.739999771118164 +2016-05-24 13:30:00,25.739999771118164 +2016-05-25 13:30:00,25.739999771118164 +2016-05-26 13:30:00,25.739999771118164 +2016-05-27 13:30:00,26.190000534057617 +2016-05-31 13:30:00,26.190000534057617 +2016-06-01 13:30:00,26.190000534057617 +2016-06-02 13:30:00,26.209999084472656 +2016-06-03 13:30:00,26.209999084472656 +2016-06-06 13:30:00,26.209999084472656 +2016-06-07 13:30:00,26.209999084472656 +2016-06-08 13:30:00,26.209999084472656 +2016-06-09 13:30:00,26.209999084472656 +2016-06-10 13:30:00,26.209999084472656 +2016-06-13 13:30:00,26.209999084472656 +2016-06-14 13:30:00,25.959999084472656 +2016-06-15 13:30:00,25.959999084472656 +2016-06-16 13:30:00,25.959999084472656 +2016-06-17 13:30:00,25.959999084472656 +2016-06-20 13:30:00,25.959999084472656 +2016-06-21 13:30:00,25.959999084472656 +2016-06-22 13:30:00,25.959999084472656 +2016-06-23 13:30:00,25.959999084472656 +2016-06-24 13:30:00,25.959999084472656 +2016-06-27 13:30:00,25.959999084472656 +2016-06-28 13:30:00,25.959999084472656 +2016-06-29 13:30:00,25.959999084472656 +2016-06-30 13:30:00,25.959999084472656 +2016-07-01 13:30:00,25.959999084472656 +2016-07-05 13:30:00,25.959999084472656 +2016-07-06 13:30:00,25.959999084472656 +2016-07-07 13:30:00,25.959999084472656 +2016-07-08 13:30:00,25.959999084472656 +2016-07-11 13:30:00,25.959999084472656 +2016-07-12 13:30:00,25.959999084472656 +2016-07-13 13:30:00,25.959999084472656 +2016-07-14 13:30:00,25.959999084472656 +2016-07-15 13:30:00,25.959999084472656 +2016-07-18 13:30:00,25.959999084472656 +2016-07-19 13:30:00,25.959999084472656 +2016-07-20 13:30:00,25.959999084472656 +2016-07-21 13:30:00,25.959999084472656 +2016-07-22 13:30:00,25.959999084472656 +2016-07-25 13:30:00,27.218000411987305 +2016-07-26 13:30:00,27.218000411987305 +2016-07-27 13:30:00,27.218000411987305 +2016-07-28 13:30:00,27.218000411987305 +2016-07-29 13:30:00,27.218000411987305 +2016-08-01 13:30:00,27.218000411987305 +2016-08-02 13:30:00,27.218000411987305 +2016-08-03 13:30:00,27.218000411987305 +2016-08-04 13:30:00,27.218000411987305 +2016-08-05 13:30:00,27.218000411987305 +2016-08-08 13:30:00,27.218000411987305 +2016-08-09 13:30:00,27.218000411987305 +2016-08-10 13:30:00,27.218000411987305 +2016-08-11 13:30:00,27.218000411987305 +2016-08-12 13:30:00,27.218000411987305 +2016-08-15 13:30:00,27.218000411987305 +2016-08-16 13:30:00,27.218000411987305 +2016-08-17 13:30:00,27.218000411987305 +2016-08-18 13:30:00,27.218000411987305 +2016-08-19 13:30:00,27.218000411987305 +2016-08-22 13:30:00,27.218000411987305 +2016-08-23 13:30:00,27.218000411987305 +2016-08-24 13:30:00,27.218000411987305 +2016-08-25 13:30:00,27.218000411987305 +2016-08-26 13:30:00,27.218000411987305 +2016-08-29 13:30:00,27.218000411987305 +2016-08-30 13:30:00,27.218000411987305 +2016-08-31 13:30:00,27.218000411987305 +2016-09-01 13:30:00,27.218000411987305 +2016-09-02 13:30:00,27.218000411987305 +2016-09-06 13:30:00,27.218000411987305 +2016-09-07 13:30:00,27.218000411987305 +2016-09-08 13:30:00,27.41699981689453 +2016-09-09 13:30:00,27.0 +2016-09-12 13:30:00,27.020000457763672 +2016-09-13 13:30:00,26.700000762939453 +2016-09-14 13:30:00,26.700000762939453 +2016-09-15 13:30:00,26.700000762939453 +2016-09-16 13:30:00,26.75 +2016-09-19 13:30:00,26.75 +2016-09-20 13:30:00,26.75 +2016-09-21 13:30:00,26.75 +2016-09-22 13:30:00,26.75 +2016-09-23 13:30:00,26.75 +2016-09-26 13:30:00,26.75 +2016-09-27 13:30:00,26.75 +2016-09-28 13:30:00,27.226999282836914 +2016-09-29 13:30:00,27.226999282836914 +2016-09-30 13:30:00,27.226999282836914 +2016-10-03 13:30:00,27.226999282836914 +2016-10-04 13:30:00,27.226999282836914 +2016-10-05 13:30:00,27.226999282836914 +2016-10-06 13:30:00,26.760000228881836 +2016-10-07 13:30:00,26.760000228881836 +2016-10-10 13:30:00,26.760000228881836 +2016-10-11 13:30:00,26.760000228881836 +2016-10-12 13:30:00,26.760000228881836 +2016-10-13 13:30:00,26.600000381469727 +2016-10-14 13:30:00,26.600000381469727 +2016-10-17 13:30:00,26.600000381469727 +2016-10-18 13:30:00,26.600000381469727 +2016-10-19 13:30:00,26.600000381469727 +2016-10-20 13:30:00,26.719999313354492 +2016-10-21 13:30:00,26.719999313354492 +2016-10-24 13:30:00,26.719999313354492 +2016-10-25 13:30:00,26.719999313354492 +2016-10-26 13:30:00,26.719999313354492 +2016-10-27 13:30:00,26.719999313354492 +2016-10-28 13:30:00,26.719999313354492 +2016-10-31 13:30:00,26.719999313354492 +2016-11-01 13:30:00,26.719999313354492 +2016-11-02 13:30:00,26.719999313354492 +2016-11-03 13:30:00,26.719999313354492 +2016-11-04 13:30:00,26.719999313354492 +2016-11-07 14:30:00,26.719999313354492 +2016-11-08 14:30:00,26.610000610351562 +2016-11-09 14:30:00,26.479999542236328 +2016-11-10 14:30:00,26.479999542236328 +2016-11-11 14:30:00,26.479999542236328 +2016-11-14 14:30:00,26.479999542236328 +2016-11-15 14:30:00,26.479999542236328 +2016-11-16 14:30:00,26.479999542236328 +2016-11-17 14:30:00,26.360000610351562 +2016-11-18 14:30:00,26.360000610351562 +2016-11-21 14:30:00,26.360000610351562 +2016-11-22 14:30:00,26.360000610351562 +2016-11-23 14:30:00,26.55699920654297 +2016-11-25 14:30:00,26.55699920654297 +2016-11-28 14:30:00,26.770000457763672 +2016-11-29 14:30:00,26.770000457763672 +2016-11-30 14:30:00,26.55299949645996 +2016-12-01 14:30:00,26.55299949645996 +2016-12-02 14:30:00,26.55299949645996 +2016-12-05 14:30:00,26.55299949645996 +2016-12-06 14:30:00,26.55299949645996 +2016-12-07 14:30:00,26.718000411987305 +2016-12-08 14:30:00,26.718000411987305 +2016-12-09 14:30:00,26.718000411987305 +2016-12-12 14:30:00,27.05699920654297 +2016-12-13 14:30:00,27.05699920654297 +2016-12-14 14:30:00,27.05699920654297 +2016-12-15 14:30:00,27.05699920654297 +2016-12-16 14:30:00,27.05699920654297 +2016-12-19 14:30:00,27.05699920654297 +2016-12-20 14:30:00,27.149999618530273 +2016-12-21 14:30:00,27.209999084472656 +2016-12-22 14:30:00,27.209999084472656 +2016-12-23 14:30:00,27.209999084472656 +2016-12-27 14:30:00,27.209999084472656 +2016-12-28 14:30:00,27.209999084472656 +2016-12-29 14:30:00,27.209999084472656 +2016-12-30 14:30:00,27.15999984741211 +2017-01-03 14:30:00,27.0 +2017-01-04 14:30:00,27.165000915527344 +2017-01-05 14:30:00,27.165000915527344 +2017-01-06 14:30:00,27.165000915527344 +2017-01-09 14:30:00,27.290000915527344 +2017-01-10 14:30:00,27.190000534057617 +2017-01-11 14:30:00,27.190000534057617 +2017-01-12 14:30:00,27.190000534057617 +2017-01-13 14:30:00,27.190000534057617 +2017-01-17 14:30:00,27.190000534057617 +2017-01-18 14:30:00,27.329999923706055 +2017-01-19 14:30:00,27.329999923706055 +2017-01-20 14:30:00,27.440000534057617 +2017-01-23 14:30:00,27.440000534057617 +2017-01-24 14:30:00,27.440000534057617 +2017-01-25 14:30:00,27.610000610351562 +2017-01-26 14:30:00,27.610000610351562 +2017-01-27 14:30:00,27.610000610351562 +2017-01-30 14:30:00,27.610000610351562 +2017-01-31 14:30:00,27.408000946044922 +2017-02-01 14:30:00,27.408000946044922 +2017-02-02 14:30:00,27.408000946044922 +2017-02-03 14:30:00,27.408000946044922 +2017-02-06 14:30:00,27.408000946044922 +2017-02-07 14:30:00,27.538000106811523 +2017-02-08 14:30:00,27.538000106811523 +2017-02-09 14:30:00,27.538000106811523 +2017-02-10 14:30:00,27.538000106811523 +2017-02-13 14:30:00,27.8799991607666 +2017-02-14 14:30:00,27.8799991607666 +2017-02-15 14:30:00,27.8799991607666 +2017-02-16 14:30:00,27.8799991607666 +2017-02-17 14:30:00,27.8799991607666 +2017-02-21 14:30:00,28.290000915527344 +2017-02-22 14:30:00,28.290000915527344 +2017-02-23 14:30:00,28.420000076293945 +2017-02-24 14:30:00,28.420000076293945 +2017-02-27 14:30:00,28.420000076293945 +2017-02-28 14:30:00,28.5 +2017-03-01 14:30:00,28.5 +2017-03-02 14:30:00,28.5 +2017-03-03 14:30:00,28.540000915527344 +2017-03-06 14:30:00,28.540000915527344 +2017-03-07 14:30:00,28.520000457763672 +2017-03-08 14:30:00,28.520000457763672 +2017-03-09 14:30:00,28.520000457763672 +2017-03-10 14:30:00,28.520000457763672 +2017-03-13 13:30:00,28.520000457763672 +2017-03-14 13:30:00,28.520000457763672 +2017-03-15 13:30:00,28.520000457763672 +2017-03-16 13:30:00,28.790000915527344 +2017-03-17 13:30:00,28.790000915527344 +2017-03-20 13:30:00,28.790000915527344 +2017-03-21 13:30:00,28.790000915527344 +2017-03-22 13:30:00,27.950000762939453 +2017-03-23 13:30:00,27.950000762939453 +2017-03-24 13:30:00,27.950000762939453 +2017-03-27 13:30:00,27.950000762939453 +2017-03-28 13:30:00,27.950000762939453 +2017-03-29 13:30:00,27.950000762939453 +2017-03-30 13:30:00,27.950000762939453 +2017-03-31 13:30:00,27.950000762939453 +2017-04-03 13:30:00,28.34000015258789 +2017-04-04 13:30:00,28.34000015258789 +2017-04-05 13:30:00,28.34000015258789 +2017-04-06 13:30:00,28.34000015258789 +2017-04-07 13:30:00,28.34000015258789 +2017-04-10 13:30:00,28.3700008392334 +2017-04-11 13:30:00,28.3700008392334 +2017-04-12 13:30:00,28.3700008392334 +2017-04-13 13:30:00,28.3700008392334 +2017-04-17 13:30:00,28.3700008392334 +2017-04-18 13:30:00,27.90999984741211 +2017-04-19 13:30:00,27.90999984741211 +2017-04-20 13:30:00,27.90999984741211 +2017-04-21 13:30:00,27.90999984741211 +2017-04-24 13:30:00,28.68000030517578 +2017-04-25 13:30:00,28.68000030517578 +2017-04-26 13:30:00,28.68000030517578 +2017-04-27 13:30:00,28.68000030517578 +2017-04-28 13:30:00,28.68000030517578 +2017-05-01 13:30:00,28.841999053955078 +2017-05-02 13:30:00,28.75 +2017-05-03 13:30:00,28.75 +2017-05-04 13:30:00,28.75 +2017-05-05 13:30:00,28.75 +2017-05-08 13:30:00,28.780000686645508 +2017-05-09 13:30:00,28.829999923706055 +2017-05-10 13:30:00,28.829999923706055 +2017-05-11 13:30:00,28.829999923706055 +2017-05-12 13:30:00,29.049999237060547 +2017-05-15 13:30:00,29.079999923706055 +2017-05-16 13:30:00,29.079999923706055 +2017-05-17 13:30:00,28.3439998626709 +2017-05-18 13:30:00,28.312999725341797 +2017-05-19 13:30:00,28.312999725341797 +2017-05-22 13:30:00,28.312999725341797 +2017-05-23 13:30:00,28.863000869750977 +2017-05-24 13:30:00,29.05900001525879 +2017-05-25 13:30:00,29.211999893188477 +2017-05-26 13:30:00,29.211999893188477 +2017-05-30 13:30:00,29.211999893188477 +2017-05-31 13:30:00,29.211999893188477 +2017-06-01 13:30:00,29.211999893188477 +2017-06-02 13:30:00,29.211999893188477 +2017-06-05 13:30:00,29.445999145507812 +2017-06-06 13:30:00,29.445999145507812 +2017-06-07 13:30:00,29.445999145507812 +2017-06-08 13:30:00,29.445999145507812 +2017-06-09 13:30:00,29.445999145507812 +2017-06-12 13:30:00,29.445999145507812 +2017-06-13 13:30:00,29.445999145507812 +2017-06-14 13:30:00,30.020000457763672 +2017-06-15 13:30:00,30.020000457763672 +2017-06-16 13:30:00,30.020000457763672 +2017-06-19 13:30:00,30.020000457763672 +2017-06-20 13:30:00,30.020000457763672 +2017-06-21 13:30:00,29.756999969482422 +2017-06-22 13:30:00,29.756999969482422 +2017-06-23 13:30:00,29.756999969482422 +2017-06-26 13:30:00,29.68000030517578 +2017-06-27 13:30:00,29.68000030517578 +2017-06-28 13:30:00,29.84000015258789 +2017-06-29 13:30:00,29.84000015258789 +2017-06-30 13:30:00,29.65999984741211 +2017-07-03 13:30:00,29.65999984741211 +2017-07-05 13:30:00,29.65999984741211 +2017-07-06 13:30:00,29.729999542236328 +2017-07-07 13:30:00,29.729999542236328 +2017-07-10 13:30:00,29.729999542236328 +2017-07-11 13:30:00,29.729999542236328 +2017-07-12 13:30:00,30.243000030517578 +2017-07-13 13:30:00,30.309999465942383 +2017-07-14 13:30:00,30.31999969482422 +2017-07-17 13:30:00,30.31999969482422 +2017-07-18 13:30:00,30.31999969482422 +2017-07-19 13:30:00,30.31999969482422 +2017-07-20 13:30:00,30.31999969482422 +2017-07-21 13:30:00,30.31999969482422 +2017-07-24 13:30:00,30.350000381469727 +2017-07-25 13:30:00,30.350000381469727 +2017-07-26 13:30:00,30.350000381469727 +2017-07-27 13:30:00,30.350000381469727 +2017-07-28 13:30:00,30.350000381469727 +2017-07-31 13:30:00,30.350000381469727 +2017-08-01 13:30:00,30.350000381469727 +2017-08-02 13:30:00,30.760000228881836 +2017-08-03 13:30:00,30.760000228881836 +2017-08-04 13:30:00,30.719999313354492 +2017-08-07 13:30:00,30.719999313354492 +2017-08-08 13:30:00,30.719999313354492 +2017-08-09 13:30:00,30.719999313354492 +2017-08-10 13:30:00,30.415000915527344 +2017-08-11 13:30:00,30.415000915527344 +2017-08-14 13:30:00,30.415000915527344 +2017-08-15 13:30:00,30.415000915527344 +2017-08-16 13:30:00,30.415000915527344 +2017-08-17 13:30:00,30.264999389648438 +2017-08-18 13:30:00,30.264999389648438 +2017-08-21 13:30:00,30.264999389648438 +2017-08-22 13:30:00,30.264999389648438 +2017-08-23 13:30:00,30.264999389648438 +2017-08-24 13:30:00,30.43000030517578 +2017-08-25 13:30:00,30.43000030517578 +2017-08-28 13:30:00,30.43000030517578 +2017-08-29 13:30:00,30.43000030517578 +2017-08-30 13:30:00,30.43000030517578 +2017-08-31 13:30:00,30.67300033569336 +2017-09-01 13:30:00,30.67300033569336 +2017-09-05 13:30:00,30.389999389648438 +2017-09-06 13:30:00,30.389999389648438 +2017-09-07 13:30:00,30.389999389648438 +2017-09-08 13:30:00,30.31999969482422 +2017-09-11 13:30:00,30.31999969482422 +2017-09-12 13:30:00,30.31999969482422 +2017-09-13 13:30:00,30.31999969482422 +2017-09-14 13:30:00,30.31999969482422 +2017-09-15 13:30:00,31.09600067138672 +2017-09-18 13:30:00,31.260000228881836 +2017-09-19 13:30:00,31.229999542236328 +2017-09-20 13:30:00,31.200000762939453 +2017-09-21 13:30:00,31.200000762939453 +2017-09-22 13:30:00,31.200000762939453 +2017-09-25 13:30:00,30.790000915527344 +2017-09-26 13:30:00,30.850000381469727 +2017-09-27 13:30:00,30.850000381469727 +2017-09-28 13:30:00,30.850000381469727 +2017-09-29 13:30:00,30.850000381469727 +2017-10-02 13:30:00,30.850000381469727 +2017-10-03 13:30:00,30.850000381469727 +2017-10-04 13:30:00,30.850000381469727 +2017-10-05 13:30:00,31.885000228881836 +2017-10-06 13:30:00,31.860000610351562 +2017-10-09 13:30:00,31.989999771118164 +2017-10-10 13:30:00,31.969999313354492 +2017-10-11 13:30:00,32.04199981689453 +2017-10-12 13:30:00,32.08000183105469 +2017-10-13 13:30:00,32.2400016784668 +2017-10-16 13:30:00,32.27000045776367 +2017-10-17 13:30:00,32.263999938964844 +2017-10-18 13:30:00,32.334999084472656 +2017-10-19 13:30:00,32.27399826049805 +2017-10-20 13:30:00,32.65399932861328 +2017-10-23 13:30:00,32.599998474121094 +2017-10-24 13:30:00,32.810001373291016 +2017-10-25 13:30:00,32.59000015258789 +2017-10-26 13:30:00,32.59000015258789 +2017-10-27 13:30:00,32.59000015258789 +2017-10-30 13:30:00,33.178001403808594 +2017-10-31 13:30:00,33.25 +2017-11-01 13:30:00,33.220001220703125 +2017-11-02 13:30:00,33.33000183105469 +2017-11-03 13:30:00,33.52000045776367 +2017-11-06 14:30:00,33.630001068115234 +2017-11-07 14:30:00,33.301998138427734 +2017-11-08 14:30:00,33.310001373291016 +2017-11-09 14:30:00,32.9900016784668 +2017-11-10 14:30:00,33.11000061035156 +2017-11-13 14:30:00,33.20000076293945 +2017-11-14 14:30:00,33.150001525878906 +2017-11-15 14:30:00,33.064998626708984 +2017-11-16 14:30:00,33.349998474121094 +2017-11-17 14:30:00,33.215999603271484 +2017-11-20 14:30:00,33.29499816894531 +2017-11-21 14:30:00,33.599998474121094 +2017-11-22 14:30:00,33.529998779296875 +2017-11-24 14:30:00,33.529998779296875 +2017-11-27 14:30:00,33.56999969482422 +2017-11-28 14:30:00,33.970001220703125 +2017-11-29 14:30:00,33.67499923706055 +2017-11-30 14:30:00,34.11899948120117 +2017-12-01 14:30:00,33.915000915527344 +2017-12-04 14:30:00,33.849998474121094 +2017-12-05 14:30:00,33.632999420166016 +2017-12-06 14:30:00,33.73699951171875 +2017-12-07 14:30:00,33.93000030517578 +2017-12-08 14:30:00,34.02000045776367 +2017-12-11 14:30:00,34.154998779296875 +2017-12-12 14:30:00,34.30500030517578 +2017-12-13 14:30:00,34.2400016784668 +2017-12-14 14:30:00,34.18000030517578 +2017-12-15 14:30:00,34.334999084472656 +2017-12-18 14:30:00,34.59000015258789 +2017-12-19 14:30:00,34.505001068115234 +2017-12-20 14:30:00,34.47999954223633 +2017-12-21 14:30:00,34.560001373291016 +2017-12-22 14:30:00,34.459999084472656 +2017-12-26 14:30:00,34.279998779296875 +2017-12-27 14:30:00,34.32500076293945 +2017-12-28 14:30:00,34.37300109863281 +2017-12-29 14:30:00,34.40999984741211 +2018-01-02 14:30:00,34.5099983215332 +2018-01-03 14:30:00,34.79999923706055 +2018-01-04 14:30:00,35.18899917602539 +2018-01-05 14:30:00,35.45000076293945 +2018-01-08 14:30:00,35.494998931884766 +2018-01-09 14:30:00,35.709999084472656 +2018-01-10 14:30:00,35.72200012207031 +2018-01-11 14:30:00,35.856998443603516 +2018-01-12 14:30:00,36.194000244140625 +2018-01-16 14:30:00,36.15999984741211 +2018-01-17 14:30:00,36.55799865722656 +2018-01-18 14:30:00,36.630001068115234 +2018-01-19 14:30:00,36.707000732421875 +2018-01-22 14:30:00,36.92499923706055 +2018-01-23 14:30:00,37.1349983215332 +2018-01-24 14:30:00,37.150001525878906 +2018-01-25 14:30:00,36.95000076293945 +2018-01-26 14:30:00,37.46099853515625 +2018-01-29 14:30:00,37.25 +2018-01-30 14:30:00,36.80500030517578 +2018-01-31 14:30:00,36.91999816894531 +2018-02-01 14:30:00,37.040000915527344 +2018-02-02 14:30:00,36.54999923706055 +2018-02-05 14:30:00,34.79100036621094 +2018-02-06 14:30:00,35.303001403808594 +2018-02-07 14:30:00,35.61000061035156 +2018-02-08 14:30:00,34.099998474121094 +2018-02-09 14:30:00,34.27399826049805 +2018-02-12 14:30:00,35.20000076293945 +2018-02-13 14:30:00,35.369998931884766 +2018-02-14 14:30:00,36.0 +2018-02-15 14:30:00,36.38999938964844 +2018-02-16 14:30:00,36.5 +2018-02-20 14:30:00,36.483001708984375 +2018-02-21 14:30:00,36.40999984741211 +2018-02-22 14:30:00,36.439998626708984 +2018-02-23 14:30:00,36.59000015258789 +2018-02-26 14:30:00,37.279998779296875 +2018-02-27 14:30:00,37.04999923706055 +2018-02-28 14:30:00,36.73500061035156 +2018-03-01 14:30:00,36.15599822998047 +2018-03-02 14:30:00,36.25 +2018-03-05 14:30:00,36.7400016784668 +2018-03-06 14:30:00,36.790000915527344 +2018-03-07 14:30:00,36.91999816894531 +2018-03-08 14:30:00,36.959999084472656 +2018-03-09 14:30:00,37.775001525878906 +2018-03-12 13:30:00,37.869998931884766 +2018-03-13 13:30:00,37.64500045776367 +2018-03-14 13:30:00,37.314998626708984 +2018-03-15 13:30:00,37.20500183105469 +2018-03-16 13:30:00,37.31999969482422 +2018-03-19 13:30:00,36.470001220703125 +2018-03-20 13:30:00,36.900001525878906 +2018-03-21 13:30:00,36.849998474121094 +2018-03-22 13:30:00,35.58000183105469 +2018-03-23 13:30:00,35.084999084472656 +2018-03-26 13:30:00,35.959999084472656 +2018-03-27 13:30:00,35.0099983215332 +2018-03-28 13:30:00,34.65999984741211 +2018-03-29 13:30:00,35.220001220703125 +2018-04-02 13:30:00,34.21099853515625 +2018-04-03 13:30:00,34.3849983215332 +2018-04-04 13:30:00,35.22999954223633 +2018-04-05 13:30:00,35.54999923706055 +2018-04-06 13:30:00,34.5 +2018-04-09 13:30:00,34.790000915527344 +2018-04-10 13:30:00,35.404998779296875 +2018-04-11 13:30:00,35.46500015258789 +2018-04-12 13:30:00,35.62799835205078 +2018-04-13 13:30:00,35.45899963378906 +2018-04-16 13:30:00,35.69300079345703 +2018-04-17 13:30:00,36.41999816894531 +2018-04-18 13:30:00,36.459999084472656 +2018-04-19 13:30:00,36.52000045776367 +2018-04-20 13:30:00,36.189998626708984 +2018-04-23 13:30:00,36.0 +2018-04-24 13:30:00,35.20000076293945 +2018-04-25 13:30:00,35.250999450683594 +2018-04-26 13:30:00,35.93000030517578 +2018-04-27 13:30:00,35.93899917602539 +2018-04-30 13:30:00,35.71799850463867 +2018-05-01 13:30:00,35.939998626708984 +2018-05-02 13:30:00,35.650001525878906 +2018-05-03 13:30:00,35.709999084472656 +2018-05-04 13:30:00,36.119998931884766 +2018-05-07 13:30:00,36.36000061035156 +2018-05-08 13:30:00,36.349998474121094 +2018-05-09 13:30:00,36.84600067138672 +2018-05-10 13:30:00,37.165000915527344 +2018-05-11 13:30:00,37.15999984741211 +2018-05-14 13:30:00,37.25 +2018-05-15 13:30:00,36.81999969482422 +2018-05-16 13:30:00,36.95500183105469 +2018-05-17 13:30:00,36.880001068115234 +2018-05-18 13:30:00,36.95800018310547 +2018-05-21 13:30:00,37.279998779296875 +2018-05-22 13:30:00,37.18000030517578 +2018-05-23 13:30:00,37.249000549316406 +2018-05-24 13:30:00,37.2599983215332 +2018-05-25 13:30:00,37.18000030517578 +2018-05-29 13:30:00,36.77000045776367 +2018-05-30 13:30:00,37.28799819946289 +2018-05-31 13:30:00,37.130001068115234 +2018-06-01 13:30:00,37.54999923706055 +2018-06-04 13:30:00,37.900001525878906 +2018-06-05 13:30:00,37.959999084472656 +2018-06-06 13:30:00,38.2400016784668 +2018-06-07 13:30:00,38.150001525878906 +2018-06-08 13:30:00,38.11000061035156 +2018-06-11 13:30:00,38.290000915527344 +2018-06-12 13:30:00,38.37799835205078 +2018-06-13 13:30:00,38.2599983215332 +2018-06-14 13:30:00,38.36000061035156 +2018-06-15 13:30:00,38.310001373291016 +2018-06-18 13:30:00,38.27000045776367 +2018-06-19 13:30:00,38.00899887084961 +2018-06-20 13:30:00,38.20199966430664 +2018-06-21 13:30:00,37.909000396728516 +2018-06-22 13:30:00,37.75 +2018-06-25 13:30:00,37.02000045776367 +2018-06-26 13:30:00,37.150001525878906 +2018-06-27 13:30:00,36.7599983215332 +2018-06-28 13:30:00,37.099998474121094 +2018-06-29 13:30:00,37.04999923706055 +2018-07-02 13:30:00,37.18899917602539 +2018-07-03 13:30:00,37.194000244140625 +2018-07-05 13:30:00,37.28900146484375 +2018-07-06 13:30:00,37.625 +2018-07-09 13:30:00,37.95899963378906 +2018-07-10 13:30:00,38.20000076293945 +2018-07-11 13:30:00,38.040000915527344 +2018-07-12 13:30:00,38.619998931884766 +2018-07-13 13:30:00,38.709999084472656 +2018-07-16 13:30:00,38.6870002746582 +2018-07-17 13:30:00,38.90999984741211 +2018-07-18 13:30:00,39.060001373291016 +2018-07-19 13:30:00,38.724998474121094 +2018-07-20 13:30:00,38.83000183105469 +2018-07-23 13:30:00,38.8849983215332 +2018-07-24 13:30:00,39.119998931884766 +2018-07-25 13:30:00,39.68000030517578 +2018-07-26 13:30:00,39.20000076293945 +2018-07-27 13:30:00,38.84000015258789 +2018-07-30 13:30:00,38.16999816894531 +2018-07-31 13:30:00,38.36000061035156 +2018-08-01 13:30:00,38.43000030517578 +2018-08-02 13:30:00,38.70000076293945 +2018-08-03 13:30:00,38.7400016784668 +2018-08-06 13:30:00,38.95000076293945 +2018-08-07 13:30:00,39.16999816894531 +2018-08-08 13:30:00,39.27000045776367 +2018-08-09 13:30:00,39.22999954223633 +2018-08-10 13:30:00,38.95000076293945 +2018-08-13 13:30:00,38.80400085449219 +2018-08-14 13:30:00,39.11000061035156 +2018-08-15 13:30:00,38.650001525878906 +2018-08-16 13:30:00,38.86000061035156 +2018-08-17 13:30:00,38.90999984741211 +2018-08-20 13:30:00,38.95000076293945 +2018-08-21 13:30:00,39.029998779296875 +2018-08-22 13:30:00,39.15999984741211 +2018-08-23 13:30:00,39.18000030517578 +2018-08-24 13:30:00,39.42499923706055 +2018-08-27 13:30:00,39.83599853515625 +2018-08-28 13:30:00,39.849998474121094 +2018-08-29 13:30:00,40.31999969482422 +2018-08-30 13:30:00,40.099998474121094 +2018-08-31 13:30:00,40.06999969482422 +2018-09-04 13:30:00,40.04999923706055 +2018-09-05 13:30:00,39.61000061035156 +2018-09-06 13:30:00,39.619998931884766 +2018-09-07 13:30:00,39.45000076293945 +2018-09-10 13:30:00,39.53499984741211 +2018-09-11 13:30:00,39.83700180053711 +2018-09-12 13:30:00,39.78799819946289 +2018-09-13 13:30:00,40.073001861572266 +2018-09-14 13:30:00,40.17100143432617 +2018-09-17 13:30:00,39.7400016784668 +2018-09-18 13:30:00,40.0890007019043 +2018-09-19 13:30:00,40.09299850463867 +2018-09-20 13:30:00,40.45000076293945 +2018-09-21 13:30:00,40.29999923706055 +2018-09-24 13:30:00,40.31999969482422 +2018-09-25 13:30:00,40.459999084472656 +2018-09-26 13:30:00,40.43000030517578 +2018-09-27 13:30:00,40.58000183105469 +2018-09-28 13:30:00,40.53499984741211 +2018-10-01 13:30:00,40.88999938964844 +2018-10-02 13:30:00,40.619998931884766 +2018-10-03 13:30:00,40.68000030517578 +2018-10-04 13:30:00,40.04999923706055 +2018-10-05 13:30:00,39.709999084472656 +2018-10-08 13:30:00,39.369998931884766 +2018-10-09 13:30:00,39.439998626708984 +2018-10-10 13:30:00,37.61000061035156 +2018-10-11 13:30:00,37.007999420166016 +2018-10-12 13:30:00,37.93000030517578 +2018-10-15 13:30:00,37.439998626708984 +2018-10-16 13:30:00,38.540000915527344 +2018-10-17 13:30:00,38.40999984741211 +2018-10-18 13:30:00,37.6619987487793 +2018-10-19 13:30:00,37.470001220703125 +2018-10-22 13:30:00,37.52000045776367 +2018-10-23 13:30:00,37.09000015258789 +2018-10-24 13:30:00,35.619998931884766 +2018-10-25 13:30:00,36.84000015258789 +2018-10-26 13:30:00,35.91999816894531 +2018-10-29 13:30:00,34.691001892089844 +2018-10-30 13:30:00,35.58000183105469 +2018-10-31 13:30:00,36.560001373291016 +2018-11-01 13:30:00,36.9900016784668 +2018-11-02 13:30:00,36.81999969482422 +2018-11-05 14:30:00,36.900001525878906 +2018-11-06 14:30:00,37.0099983215332 +2018-11-07 14:30:00,38.31999969482422 +2018-11-08 14:30:00,38.02000045776367 +2018-11-09 14:30:00,37.72999954223633 +2018-11-12 14:30:00,36.619998931884766 +2018-11-13 14:30:00,36.52000045776367 +2018-11-14 14:30:00,36.099998474121094 +2018-11-15 14:30:00,36.59000015258789 +2018-11-16 14:30:00,36.59000015258789 +2018-11-19 14:30:00,35.47800064086914 +2018-11-20 14:30:00,34.65999984741211 +2018-11-21 14:30:00,34.974998474121094 +2018-11-23 14:30:00,34.73099899291992 +2018-11-26 14:30:00,35.439998626708984 +2018-11-27 14:30:00,35.619998931884766 +2018-11-28 14:30:00,36.904998779296875 +2018-11-29 14:30:00,36.97999954223633 +2018-11-30 14:30:00,37.13999938964844 +2018-12-03 14:30:00,37.880001068115234 +2018-12-04 14:30:00,36.38999938964844 +2018-12-06 14:30:00,35.95000076293945 +2018-12-07 14:30:00,35.349998474121094 +2018-12-10 14:30:00,35.56700134277344 +2018-12-11 14:30:00,35.566001892089844 +2018-12-12 14:30:00,35.9630012512207 +2018-12-13 14:30:00,35.88600158691406 +2018-12-14 14:30:00,34.98400115966797 +2018-12-17 14:30:00,34.034000396728516 +2018-12-18 14:30:00,34.34299850463867 +2018-12-19 14:30:00,33.8390007019043 +2018-12-20 14:30:00,33.06999969482422 +2018-12-21 14:30:00,32.22999954223633 +2018-12-24 14:30:00,31.200000762939453 +2018-12-26 14:30:00,33.209999084472656 +2018-12-27 14:30:00,33.45000076293945 +2018-12-28 14:30:00,33.43000030517578 +2018-12-31 14:30:00,33.7599983215332 +2019-01-02 14:30:00,33.83000183105469 +2019-01-03 14:30:00,32.775001525878906 +2019-01-04 14:30:00,34.12699890136719 +2019-01-07 14:30:00,34.61000061035156 +2019-01-08 14:30:00,34.93000030517578 +2019-01-09 14:30:00,35.290000915527344 +2019-01-10 14:30:00,35.38999938964844 +2019-01-11 14:30:00,35.400001525878906 +2019-01-14 14:30:00,35.16999816894531 +2019-01-15 14:30:00,35.67399978637695 +2019-01-16 14:30:00,35.790000915527344 +2019-01-17 14:30:00,36.01100158691406 +2019-01-18 14:30:00,36.560001373291016 +2019-01-22 14:30:00,35.88999938964844 +2019-01-23 14:30:00,35.95000076293945 +2019-01-24 14:30:00,36.099998474121094 +2019-01-25 14:30:00,36.40999984741211 +2019-01-28 14:30:00,36.040000915527344 +2019-01-29 14:30:00,35.77000045776367 +2019-01-30 14:30:00,36.560001373291016 +2019-01-31 14:30:00,36.85100173950195 +2019-02-01 14:30:00,36.72999954223633 +2019-02-04 14:30:00,37.09400177001953 +2019-02-05 14:30:00,37.369998931884766 +2019-02-06 14:30:00,37.30500030517578 +2019-02-07 14:30:00,36.900001525878906 +2019-02-08 14:30:00,36.8650016784668 +2019-02-11 14:30:00,36.90999984741211 +2019-02-12 14:30:00,37.540000915527344 +2019-02-13 14:30:00,37.66999816894531 +2019-02-14 14:30:00,37.66999816894531 +2019-02-15 14:30:00,38.082000732421875 +2019-02-19 14:30:00,38.08000183105469 +2019-02-20 14:30:00,38.099998474121094 +2019-02-21 14:30:00,37.9900016784668 +2019-02-22 14:30:00,38.36000061035156 +2019-02-25 14:30:00,38.40999984741211 +2019-02-26 14:30:00,38.459999084472656 +2019-02-27 14:30:00,38.37099838256836 +2019-02-28 14:30:00,38.29999923706055 +2019-03-01 14:30:00,38.599998474121094 +2019-03-04 14:30:00,38.310001373291016 +2019-03-05 14:30:00,38.332000732421875 +2019-03-06 14:30:00,38.040000915527344 +2019-03-07 14:30:00,37.6349983215332 +2019-03-08 14:30:00,37.560001373291016 +2019-03-11 13:30:00,38.17499923706055 +2019-03-12 13:30:00,38.25 +2019-03-13 13:30:00,38.595001220703125 +2019-03-14 13:30:00,38.58000183105469 +2019-03-15 13:30:00,38.814998626708984 +2019-03-18 13:30:00,38.834999084472656 +2019-03-19 13:30:00,38.95000076293945 +2019-03-20 13:30:00,38.986000061035156 +2019-03-21 13:30:00,39.45000076293945 +2019-03-22 13:30:00,38.88999938964844 +2019-03-25 13:30:00,38.9900016784668 +2019-03-26 13:30:00,39.084999084472656 +2019-03-27 13:30:00,38.85499954223633 +2019-03-28 13:30:00,39.0 +2019-03-29 13:30:00,39.277000427246094 +2019-04-01 13:30:00,39.52199935913086 +2019-04-02 13:30:00,39.54100036621094 +2019-04-03 13:30:00,39.56700134277344 +2019-04-04 13:30:00,39.356998443603516 +2019-04-05 13:30:00,39.534000396728516 +2019-04-08 13:30:00,39.542999267578125 +2019-04-09 13:30:00,39.439998626708984 +2019-04-10 13:30:00,39.5629997253418 +2019-04-11 13:30:00,39.430999755859375 +2019-04-12 13:30:00,39.29800033569336 +2019-04-15 13:30:00,39.39899826049805 +2019-04-16 13:30:00,39.020999908447266 +2019-04-17 13:30:00,38.54999923706055 +2019-04-18 13:30:00,38.71500015258789 +2019-04-22 13:30:00,38.810001373291016 +2019-04-23 13:30:00,39.20800018310547 +2019-04-24 13:30:00,39.22200012207031 +2019-04-25 13:30:00,39.2599983215332 +2019-04-26 13:30:00,39.54999923706055 +2019-04-29 13:30:00,39.439998626708984 +2019-04-30 13:30:00,39.68299865722656 +2019-05-01 13:30:00,39.354000091552734 +2019-05-02 13:30:00,39.345001220703125 +2019-05-03 13:30:00,39.7400016784668 +2019-05-06 13:30:00,39.65399932861328 +2019-05-07 13:30:00,39.05400085449219 +2019-05-08 13:30:00,39.04999923706055 +2019-05-09 13:30:00,38.97999954223633 +2019-05-10 13:30:00,39.16899871826172 +2019-05-13 13:30:00,38.59000015258789 +2019-05-14 13:30:00,38.83700180053711 +2019-05-15 13:30:00,39.06999969482422 +2019-05-16 13:30:00,39.529998779296875 +2019-05-17 13:30:00,39.459999084472656 +2019-05-20 13:30:00,39.29999923706055 +2019-05-21 13:30:00,39.53300094604492 +2019-05-22 13:30:00,39.70000076293945 +2019-05-23 13:30:00,39.30500030517578 +2019-05-24 13:30:00,39.395999908447266 +2019-05-28 13:30:00,39.194000244140625 +2019-05-29 13:30:00,38.83000183105469 +2019-05-30 13:30:00,39.018001556396484 +2019-05-31 13:30:00,38.70000076293945 +2019-06-03 13:30:00,38.40700149536133 +2019-06-04 13:30:00,39.02000045776367 +2019-06-05 13:30:00,39.641998291015625 +2019-06-06 13:30:00,39.85300064086914 +2019-06-07 13:30:00,40.30400085449219 +2019-06-10 13:30:00,40.380001068115234 +2019-06-11 13:30:00,40.25 +2019-06-12 13:30:00,40.28200149536133 +2019-06-13 13:30:00,40.2400016784668 +2019-06-14 13:30:00,40.305999755859375 +2019-06-17 13:30:00,40.354000091552734 +2019-06-18 13:30:00,40.573001861572266 +2019-06-19 13:30:00,40.94499969482422 +2019-06-20 13:30:00,41.2599983215332 +2019-06-21 13:30:00,41.130001068115234 +2019-06-24 13:30:00,40.952999114990234 +2019-06-25 13:30:00,40.54899978637695 +2019-06-26 13:30:00,40.18000030517578 +2019-06-27 13:30:00,40.36199951171875 +2019-06-28 13:30:00,40.41400146484375 +2019-07-01 13:30:00,40.73500061035156 +2019-07-02 13:30:00,40.97999954223633 +2019-07-03 13:30:00,41.4370002746582 +2019-07-05 13:30:00,41.28799819946289 +2019-07-08 13:30:00,41.249000549316406 +2019-07-09 13:30:00,41.4119987487793 +2019-07-10 13:30:00,41.720001220703125 +2019-07-11 13:30:00,41.67399978637695 +2019-07-12 13:30:00,41.70000076293945 +2019-07-15 13:30:00,41.75699996948242 +2019-07-16 13:30:00,41.619998931884766 +2019-07-17 13:30:00,41.54600143432617 +2019-07-18 13:30:00,41.63999938964844 +2019-07-19 13:30:00,41.21900177001953 +2019-07-22 13:30:00,41.277000427246094 +2019-07-23 13:30:00,41.32899856567383 +2019-07-24 13:30:00,41.37900161743164 +2019-07-25 13:30:00,41.18199920654297 +2019-07-26 13:30:00,41.44300079345703 +2019-07-29 13:30:00,41.41999816894531 +2019-07-30 13:30:00,41.18600082397461 +2019-07-31 13:30:00,40.762001037597656 +2019-08-01 13:30:00,40.630001068115234 +2019-08-02 13:30:00,40.560001373291016 +2019-08-05 13:30:00,39.290000915527344 +2019-08-06 13:30:00,39.939998626708984 +2019-08-07 13:30:00,40.099998474121094 +2019-08-08 13:30:00,40.7400016784668 +2019-08-09 13:30:00,40.63100051879883 +2019-08-12 13:30:00,40.19499969482422 +2019-08-13 13:30:00,40.6609992980957 +2019-08-14 13:30:00,39.64500045776367 +2019-08-15 13:30:00,39.70000076293945 +2019-08-16 13:30:00,40.17900085449219 +2019-08-19 13:30:00,40.52000045776367 +2019-08-20 13:30:00,40.233001708984375 +2019-08-21 13:30:00,40.56800079345703 +2019-08-22 13:30:00,40.52899932861328 +2019-08-23 13:30:00,39.689998626708984 +2019-08-26 13:30:00,40.099998474121094 +2019-08-27 13:30:00,40.07899856567383 +2019-08-28 13:30:00,40.220001220703125 +2019-08-29 13:30:00,40.619998931884766 +2019-08-30 13:30:00,40.60599899291992 +2019-09-03 13:30:00,40.608001708984375 +2019-09-04 13:30:00,40.79100036621094 +2019-09-05 13:30:00,41.07400131225586 +2019-09-06 13:30:00,41.071998596191406 +2019-09-09 13:30:00,40.630001068115234 +2019-09-10 13:30:00,40.29999923706055 +2019-09-11 13:30:00,40.40999984741211 +2019-09-12 13:30:00,40.59000015258789 +2019-09-13 13:30:00,40.52000045776367 +2019-09-16 13:30:00,40.38999938964844 +2019-09-17 13:30:00,40.667999267578125 +2019-09-18 13:30:00,40.66999816894531 +2019-09-19 13:30:00,40.762001037597656 +2019-09-20 13:30:00,40.696998596191406 +2019-09-23 13:30:00,40.5890007019043 +2019-09-24 13:30:00,40.47999954223633 +2019-09-25 13:30:00,40.58700180053711 +2019-09-26 13:30:00,40.72999954223633 +2019-09-27 13:30:00,40.30099868774414 +2019-09-30 13:30:00,40.5890007019043 +2019-10-01 13:30:00,40.18199920654297 +2019-10-02 13:30:00,39.529998779296875 +2019-10-03 13:30:00,39.867000579833984 +2019-10-04 13:30:00,40.51300048828125 +2019-10-07 13:30:00,40.327999114990234 +2019-10-08 13:30:00,39.76900100708008 +2019-10-09 13:30:00,40.20100021362305 +2019-10-10 13:30:00,40.28099822998047 +2019-10-11 13:30:00,40.37099838256836 +2019-10-14 13:30:00,40.26599884033203 +2019-10-15 13:30:00,40.327999114990234 +2019-10-16 13:30:00,40.29199981689453 +2019-10-17 13:30:00,40.369998931884766 +2019-10-18 13:30:00,40.32400131225586 +2019-10-21 13:30:00,40.40999984741211 +2019-10-22 13:30:00,39.90999984741211 +2019-10-23 13:30:00,39.92399978637695 +2019-10-24 13:30:00,40.23899841308594 +2019-10-25 13:30:00,40.130001068115234 +2019-10-28 13:30:00,40.183998107910156 +2019-10-29 13:30:00,40.28799819946289 +2019-10-30 13:30:00,40.58000183105469 +2019-10-31 13:30:00,40.47999954223633 +2019-11-01 13:30:00,40.393001556396484 +2019-11-04 14:30:00,40.0099983215332 +2019-11-05 14:30:00,39.709999084472656 +2019-11-06 14:30:00,39.974998474121094 +2019-11-07 14:30:00,39.91699981689453 +2019-11-08 14:30:00,40.025001525878906 +2019-11-11 14:30:00,40.0099983215332 +2019-11-12 14:30:00,40.1870002746582 +2019-11-13 14:30:00,40.58700180053711 +2019-11-14 14:30:00,40.62900161743164 +2019-11-15 14:30:00,40.74399948120117 +2019-11-18 14:30:00,40.858001708984375 +2019-11-19 14:30:00,41.02399826049805 +2019-11-20 14:30:00,41.029998779296875 +2019-11-21 14:30:00,40.736000061035156 +2019-11-22 14:30:00,40.680999755859375 +2019-11-25 14:30:00,40.86600112915039 +2019-11-26 14:30:00,41.26900100708008 +2019-11-27 14:30:00,41.38999938964844 +2019-11-29 14:30:00,41.277000427246094 +2019-12-02 14:30:00,40.91299819946289 +2019-12-03 14:30:00,40.86800003051758 +2019-12-04 14:30:00,41.05699920654297 +2019-12-05 14:30:00,41.04100036621094 +2019-12-06 14:30:00,41.22600173950195 +2019-12-09 14:30:00,41.138999938964844 +2019-12-10 14:30:00,41.064998626708984 +2019-12-11 14:30:00,41.1349983215332 +2019-12-12 14:30:00,41.279998779296875 +2019-12-13 14:30:00,41.50600051879883 +2019-12-16 14:30:00,41.71799850463867 +2019-12-17 14:30:00,41.65599822998047 +2019-12-18 14:30:00,41.650001525878906 +2019-12-19 14:30:00,41.880001068115234 +2019-12-20 14:30:00,42.209999084472656 +2019-12-23 14:30:00,41.85900115966797 +2019-12-24 14:30:00,41.91999816894531 +2019-12-26 14:30:00,41.974998474121094 +2019-12-27 14:30:00,42.09299850463867 +2019-12-30 14:30:00,41.845001220703125 +2019-12-31 14:30:00,41.90999984741211 +2020-01-02 14:30:00,42.14899826049805 +2020-01-03 14:30:00,42.01900100708008 +2020-01-06 14:30:00,42.04999923706055 +2020-01-07 14:30:00,41.810001373291016 +2020-01-08 14:30:00,42.02000045776367 +2020-01-09 14:30:00,42.45000076293945 +2020-01-10 14:30:00,42.39899826049805 +2020-01-13 14:30:00,42.70800018310547 +2020-01-14 14:30:00,42.62200164794922 +2020-01-15 14:30:00,43.02000045776367 +2020-01-16 14:30:00,43.35499954223633 +2020-01-17 14:30:00,43.625999450683594 +2020-01-21 14:30:00,43.689998626708984 +2020-01-22 14:30:00,43.82099914550781 +2020-01-23 14:30:00,43.823001861572266 +2020-01-24 14:30:00,43.606998443603516 +2020-01-27 14:30:00,43.19599914550781 +2020-01-28 14:30:00,43.54399871826172 +2020-01-29 14:30:00,43.48899841308594 +2020-01-30 14:30:00,43.90800094604492 +2020-01-31 14:30:00,43.16999816894531 +2020-02-03 14:30:00,43.61600112915039 +2020-02-04 14:30:00,44.12300109863281 +2020-02-05 14:30:00,44.12200164794922 +2020-02-06 14:30:00,44.34700012207031 +2020-02-07 14:30:00,44.18899917602539 +2020-02-10 14:30:00,44.61199951171875 +2020-02-11 14:30:00,44.58000183105469 +2020-02-12 14:30:00,44.72999954223633 +2020-02-13 14:30:00,44.83300018310547 +2020-02-14 14:30:00,45.112998962402344 +2020-02-18 14:30:00,45.154998779296875 +2020-02-19 14:30:00,45.21500015258789 +2020-02-20 14:30:00,45.029998779296875 +2020-02-21 14:30:00,44.63999938964844 +2020-02-24 14:30:00,43.45899963378906 +2020-02-25 14:30:00,42.29999923706055 +2020-02-26 14:30:00,42.13600158691406 +2020-02-27 14:30:00,40.09000015258789 +2020-02-28 14:30:00,39.59000015258789 +2020-03-02 14:30:00,41.779998779296875 +2020-03-03 14:30:00,40.75 +2020-03-04 14:30:00,42.56999969482422 +2020-03-05 14:30:00,41.46699905395508 +2020-03-06 14:30:00,41.040000915527344 +2020-03-09 13:30:00,38.78200149536133 +2020-03-10 13:30:00,40.17399978637695 +2020-03-11 13:30:00,38.41600036621094 +2020-03-12 13:30:00,35.15800094604492 +2020-03-13 13:30:00,37.56100082397461 +2020-03-16 13:30:00,31.79400062561035 +2020-03-17 13:30:00,35.040000915527344 +2020-03-18 13:30:00,34.119998931884766 +2020-03-19 13:30:00,34.051998138427734 +2020-03-20 13:30:00,32.34400177001953 +2020-03-23 13:30:00,31.05699920654297 +2020-03-24 13:30:00,33.95000076293945 +2020-03-25 13:30:00,34.41899871826172 +2020-03-26 13:30:00,36.48099899291992 +2020-03-27 13:30:00,35.59000015258789 +2020-03-30 13:30:00,36.987998962402344 +2020-03-31 13:30:00,36.01499938964844 +2020-04-01 13:30:00,34.542999267578125 +2020-04-02 13:30:00,35.54600143432617 +2020-04-03 13:30:00,35.08599853515625 +2020-04-06 13:30:00,37.529998779296875 +2020-04-07 13:30:00,37.130001068115234 +2020-04-08 13:30:00,38.42399978637695 +2020-04-09 13:30:00,39.125 +2020-04-13 13:30:00,38.45199966430664 +2020-04-14 13:30:00,39.77000045776367 +2020-04-15 13:30:00,38.86399841308594 +2020-04-16 13:30:00,39.29999923706055 +2020-04-17 13:30:00,40.275001525878906 +2020-04-20 13:30:00,39.45000076293945 +2020-04-21 13:30:00,38.31999969482422 +2020-04-22 13:30:00,39.402000427246094 +2020-04-23 13:30:00,39.000999450683594 +2020-04-24 13:30:00,39.31999969482422 +2020-04-27 13:30:00,39.874000549316406 +2020-04-28 13:30:00,39.505001068115234 +2020-04-29 13:30:00,40.31100082397461 +2020-04-30 13:30:00,40.01599884033203 +2020-05-01 13:30:00,39.16400146484375 +2020-05-04 13:30:00,39.57099914550781 +2020-05-05 13:30:00,40.14400100708008 +2020-05-06 13:30:00,39.93899917602539 +2020-05-07 13:30:00,40.290000915527344 +2020-05-08 13:30:00,40.90399932861328 +2020-05-11 13:30:00,41.16299819946289 +2020-05-12 13:30:00,40.358001708984375 +2020-05-13 13:30:00,39.862998962402344 +2020-05-14 13:30:00,40.20800018310547 +2020-05-15 13:30:00,40.459999084472656 +2020-05-18 13:30:00,41.599998474121094 +2020-05-19 13:30:00,41.30400085449219 +2020-05-20 13:30:00,41.70399856567383 +2020-05-21 13:30:00,41.2599983215332 +2020-05-22 13:30:00,41.51900100708008 +2020-05-26 13:30:00,41.63999938964844 +2020-05-27 13:30:00,41.95100021362305 +2020-05-28 13:30:00,42.323001861572266 +2020-05-29 13:30:00,42.736000061035156 +2020-06-01 13:30:00,42.79999923706055 +2020-06-02 13:30:00,43.09000015258789 +2020-06-03 13:30:00,43.387001037597656 +2020-06-04 13:30:00,42.821998596191406 +2020-06-05 13:30:00,43.73400115966797 +2020-06-08 13:30:00,44.08000183105469 +2020-06-09 13:30:00,44.06999969482422 +2020-06-10 13:30:00,44.500999450683594 +2020-06-11 13:30:00,42.125999450683594 +2020-06-12 13:30:00,42.62099838256836 +2020-06-15 13:30:00,42.85200119018555 +2020-06-16 13:30:00,43.50600051879883 +2020-06-17 13:30:00,43.66999816894531 +2020-06-18 13:30:00,43.68600082397461 +2020-06-19 13:30:00,43.52299880981445 +2020-06-22 13:30:00,43.73099899291992 +2020-06-23 13:30:00,43.86000061035156 +2020-06-24 13:30:00,42.89500045776367 +2020-06-25 13:30:00,43.26300048828125 +2020-06-26 13:30:00,42.38999938964844 +2020-06-29 13:30:00,42.93000030517578 +2020-06-30 13:30:00,43.66999816894531 +2020-07-01 13:30:00,43.9109992980957 +2020-07-02 13:30:00,44.0099983215332 +2020-07-06 13:30:00,44.60300064086914 +2020-07-07 13:30:00,44.402000427246094 +2020-07-08 13:30:00,44.887001037597656 +2020-07-09 13:30:00,44.8380012512207 +2020-07-10 13:30:00,45.07500076293945 +2020-07-13 13:30:00,44.409000396728516 +2020-07-14 13:30:00,45.12200164794922 +2020-07-15 13:30:00,45.2599983215332 +2020-07-16 13:30:00,45.069000244140625 +2020-07-17 13:30:00,45.45500183105469 +2020-07-20 13:30:00,46.077999114990234 +2020-07-21 13:30:00,45.8489990234375 +2020-07-22 13:30:00,46.409000396728516 +2020-07-23 13:30:00,45.676998138427734 +2020-07-24 13:30:00,45.630001068115234 +2020-07-27 13:30:00,46.02199935913086 +2020-07-28 13:30:00,45.7859992980957 +2020-07-29 13:30:00,46.37699890136719 +2020-07-30 13:30:00,46.500999450683594 +2020-07-31 13:30:00,47.016998291015625 +2020-08-03 13:30:00,47.62200164794922 +2020-08-04 13:30:00,47.87099838256836 +2020-08-05 13:30:00,47.99399948120117 +2020-08-06 13:30:00,48.40299987792969 +2020-08-07 13:30:00,48.180999755859375 +2020-08-10 13:30:00,48.01900100708008 +2020-08-11 13:30:00,47.32600021362305 +2020-08-12 13:30:00,48.3390007019043 +2020-08-13 13:30:00,48.46799850463867 +2020-08-14 13:30:00,48.375999450683594 +2020-08-17 13:30:00,48.880001068115234 +2020-08-18 13:30:00,48.91999816894531 +2020-08-19 13:30:00,48.76499938964844 +2020-08-20 13:30:00,49.20000076293945 +2020-08-21 13:30:00,49.60599899291992 +2020-08-24 13:30:00,49.78799819946289 +2020-08-25 13:30:00,49.96900177001953 +2020-08-26 13:30:00,50.487998962402344 +2020-08-27 13:30:00,50.4630012512207 +2020-08-28 13:30:00,50.89899826049805 +2020-08-31 13:30:00,51.0099983215332 +2020-09-01 13:30:00,51.43000030517578 +2020-09-02 13:30:00,52.301998138427734 +2020-09-03 13:30:00,49.983001708984375 +2020-09-04 13:30:00,49.220001220703125 +2020-09-08 13:30:00,47.82699966430664 +2020-09-09 13:30:00,49.249000549316406 +2020-09-10 13:30:00,48.31999969482422 +2020-09-11 13:30:00,48.11600112915039 +2020-09-14 13:30:00,49.027000427246094 +2020-09-15 13:30:00,49.46200180053711 +2020-09-16 13:30:00,48.935001373291016 +2020-09-17 13:30:00,48.52000045776367 +2020-09-18 13:30:00,47.90999984741211 +2020-09-21 13:30:00,47.65399932861328 +2020-09-22 13:30:00,48.81399917602539 +2020-09-23 13:30:00,47.4640007019043 +2020-09-24 13:30:00,47.70899963378906 +2020-09-25 13:30:00,48.744998931884766 +2020-09-28 13:30:00,49.43199920654297 +2020-09-29 13:30:00,49.52299880981445 +2020-09-30 13:30:00,49.97999954223633 +2020-10-01 13:30:00,50.5 +2020-10-02 13:30:00,49.310001373291016 +2020-10-05 13:30:00,50.44499969482422 +2020-10-06 13:30:00,49.611000061035156 +2020-10-07 13:30:00,50.5260009765625 +2020-10-08 13:30:00,50.599998474121094 +2020-10-09 13:30:00,51.16600036621094 +2020-10-12 13:30:00,52.4119987487793 +2020-10-13 13:30:00,52.45199966430664 +2020-10-14 13:30:00,51.94499969482422 +2020-10-15 13:30:00,51.4900016784668 +2020-10-16 13:30:00,51.40999984741211 +2020-10-19 13:30:00,50.513999938964844 +2020-10-20 13:30:00,50.81100082397461 +2020-10-21 13:30:00,50.68000030517578 +2020-10-22 13:30:00,50.33399963378906 +2020-10-23 13:30:00,50.63199996948242 +2020-10-26 13:30:00,49.93600082397461 +2020-10-27 13:30:00,50.20000076293945 +2020-10-28 13:30:00,48.55799865722656 +2020-10-29 13:30:00,49.35599899291992 +2020-10-30 13:30:00,47.8390007019043 +2020-11-02 14:30:00,48.255001068115234 +2020-11-03 14:30:00,49.16999816894531 +2020-11-04 14:30:00,51.119998931884766 +2020-11-05 14:30:00,52.39899826049805 +2020-11-06 14:30:00,52.582000732421875 +2020-11-09 14:30:00,51.099998474121094 +2020-11-10 14:30:00,49.770999908447266 +2020-11-11 14:30:00,50.957000732421875 +2020-11-12 14:30:00,50.65700149536133 +2020-11-13 14:30:00,51.0260009765625 +2020-11-16 14:30:00,51.097999572753906 +2020-11-17 14:30:00,50.9379997253418 +2020-11-18 14:30:00,50.362998962402344 +2020-11-19 14:30:00,50.58599853515625 +2020-11-20 14:30:00,50.43000030517578 +2020-11-23 14:30:00,50.25 +2020-11-24 14:30:00,50.40999984741211 +2020-11-25 14:30:00,50.78499984741211 +2020-11-27 14:30:00,51.119998931884766 +2020-11-30 14:30:00,51.52000045776367 +2020-12-01 14:30:00,51.99599838256836 +2020-12-02 14:30:00,51.810001373291016 +2020-12-03 14:30:00,51.479000091552734 +2020-12-04 14:30:00,51.750999450683594 +2020-12-07 14:30:00,51.96900177001953 +2020-12-08 14:30:00,52.05500030517578 +2020-12-09 14:30:00,51.27000045776367 +2020-12-10 14:30:00,51.375 +2020-12-11 14:30:00,51.23099899291992 +2020-12-14 14:30:00,51.64899826049805 +2020-12-15 14:30:00,52.071998596191406 +2020-12-16 14:30:00,52.465999603271484 +2020-12-17 14:30:00,52.819000244140625 +2020-12-18 14:30:00,52.78300094604492 +2020-12-21 14:30:00,52.448001861572266 +2020-12-22 14:30:00,52.63100051879883 +2020-12-23 14:30:00,52.3489990234375 +2020-12-24 14:30:00,52.42499923706055 +2020-12-28 14:30:00,52.88100051879883 +2020-12-29 14:30:00,52.827999114990234 +2020-12-30 14:30:00,52.74399948120117 +2020-12-31 14:30:00,52.90999984741211 +2021-01-04 14:30:00,52.18199920654297 +2021-01-05 14:30:00,52.60100173950195 +2021-01-06 14:30:00,51.81999969482422 +2021-01-07 14:30:00,52.84000015258789 +2021-01-08 14:30:00,53.33000183105469 +2021-01-11 14:30:00,52.97800064086914 +2021-01-12 14:30:00,52.70199966430664 +2021-01-13 14:30:00,52.994998931884766 +2021-01-14 14:30:00,52.59000015258789 +2021-01-15 14:30:00,52.409000396728516 +2021-01-19 14:30:00,53.05099868774414 +2021-01-20 14:30:00,54.24700164794922 +2021-01-21 14:30:00,54.6349983215332 +2021-01-22 14:30:00,54.70600128173828 +2021-01-25 14:30:00,55.034000396728516 2021-01-26 14:30:00,54.99800109863281 2021-01-27 14:30:00,53.37799835205078 2021-01-28 14:30:00,53.599998474121094 @@ -1254,26 +2585,4 @@ date,close 2026-01-21 14:30:00,117.6500015258789 2026-01-22 14:30:00,117.94000244140625 2026-01-23 14:30:00,117.91999816894531 -2026-01-26 17:14:07,118.98999786376952 -2026-01-26 17:19:48,119.04000091552734 -2026-01-26 17:22:59,119.05500030517578 -2026-01-26 17:29:05,119.04000091552734 -2026-01-26 17:31:02,119.01000213623048 -2026-01-26 17:34:02,119.00140380859376 -2026-01-26 17:40:30,119.04540252685548 -2026-01-26 18:01:26,118.97689819335938 -2026-01-26 18:07:28,118.9250030517578 -2026-01-26 19:09:24,119.06529998779295 -2026-01-26 19:17:21,119.0355987548828 -2026-01-26 19:18:20,119.0250015258789 -2026-01-26 19:20:39,119.01499938964844 -2026-01-26 19:26:12,119.00679779052734 -2026-01-26 19:38:00,119.0199966430664 -2026-01-26 19:41:17,119.04000091552734 -2026-01-26 19:42:10,119.04540252685548 -2026-01-26 19:45:09,119.05999755859376 -2026-01-26 19:50:02,118.98999786376952 -2026-01-26 19:50:30,118.99500274658205 -2026-01-26 19:51:20,118.99410247802734 -2026-01-26 19:54:40,118.9499969482422 -2026-01-26 20:09:14,118.964599609375 +2026-01-26 21:00:00,118.83000183105469 diff --git a/engine.py b/engine.py index cc183ac..28217e0 100644 --- a/engine.py +++ b/engine.py @@ -1,48 +1,179 @@ import pandas as pd import requests import os -from datetime import datetime +import shutil +from datetime import datetime, time from ta.trend import EMAIndicator from ta.momentum import StochasticOscillator class DataEngine: - def __init__(self, symbol, url, provider): + def __init__(self, symbol=None, url=None, provider=None, data_dir='data_cache'): self.symbol = symbol self.url = url self.provider = provider - # 1. Get the folder where engine.py lives + # Use your robust path logic base_path = os.path.dirname(os.path.abspath(__file__)) - - # 2. Define the cache directory path - self.cache_dir = os.path.join(base_path, "data_cache") - - # 3. Create the folder if it doesn't exist (safety-first) + self.cache_dir = os.path.join(base_path, data_dir) # Use data_dir variable os.makedirs(self.cache_dir, exist_ok=True) - # 4. Set the full path for this specific instrument's CSV - self.file_path = os.path.join(self.cache_dir, f"{self.symbol}.csv") + # 4. Only set file_path if we actually have a symbol + if self.symbol: + self.file_path = os.path.join(self.cache_dir, f"{self.symbol}.csv") + else: + self.file_path = None - def global_sync(self): - """The 'One-Click' background loop.""" - # 1. Get the latest list of instruments from your CSV - all_instruments = self.load_instruments_from_csv() + def load_instruments_from_csv(self, file_path): + import csv + instruments = [] - for item in all_instruments: - # 2. Update the 'Current' target for the engine - self.symbol = item['symbol'] - self.cusip = item['cusip'] - self.provider = item['provider'] + # Updated templates for maximum historical reach + TEMPLATES = { + 'jpm': "https://am.jpmorgan.com/FundsMarketingHandler/historicalData?cusip={cusip}&country=hk&role=per", + # period1=0 fetches from the earliest available date; interval=1d is daily + 'yahoo': "https://query1.finance.yahoo.com/v8/finance/chart/{cusip}?period1=0&period2=9999999999&interval=1d&events=history", + # FT remains 30-day window; Smart Append logic in fetch_data handles the history + 'agi': "https://markets.ft.com/data/funds/tearsheet/historical?s={cusip}" + } + + try: + abs_path = os.path.join(os.path.dirname(__file__), file_path) - # 3. Regenerate the URL and File Path for THIS specific instrument - self.url = self.generate_url() - self.file_path = os.path.join(self.data_dir, f"{self.symbol}.csv") - - # 4. Run the robust fetch/merge logic we built - print(f"Syncing {self.symbol}...") - self.fetch_data() - - print("Global Sync Complete.") + if not os.path.exists(abs_path): + print(f"Error: {file_path} not found.") + return [] + + with open(abs_path, mode='r', encoding='utf-8-sig') as csvfile: + reader = csv.DictReader(csvfile) + reader.fieldnames = [name.strip().lower() for name in reader.fieldnames] + + for row in reader: + symbol = row.get('symbol', '').strip() + cusip = row.get('cusip', '').strip() + provider = row.get('provider', 'jpm').strip().lower() + + if symbol and cusip: + template = TEMPLATES.get(provider, TEMPLATES['jpm']) + url = template.format(cusip=cusip) + + instruments.append({ + "symbol": symbol, + "url": url, + "provider": provider, + "cusip": cusip # Added this so sync_all can use it if needed + }) + + except Exception as e: + print(f"CSV Loading Error: {e}") + return instruments + # URL_CONFIG = load_instruments_from_csv('instruments.csv') + + def global_sync(self): + """Backup, Sync all instruments, and return a summary report.""" + # 1. Run Maintenance/Backup + self.run_pre_sync_maintenance() + + # FIX 1: Add 'self.' so it calls the method inside this class + instruments = self.load_instruments_from_csv('instruments.csv') + + report = { + "total": len(instruments), + "updated": 0, + "failed": 0, + "details": [] + } + + for item in instruments: + try: + self.symbol = item['symbol'] + self.provider = item['provider'] + self.url = item['url'] + + # FIX 2: Use 'self.cache_dir' to match your __init__ logic + self.file_path = os.path.join(self.cache_dir, f"{self.symbol}.csv") + + print(f"Updating {self.symbol}...") + + # fetch_data now returns the updated DataFrame or None + result_df = self.fetch_data() + + time.sleep(1) + + if result_df is not None and not result_df.empty: + report["updated"] += 1 + last_price = result_df['close'].iloc[-1] + report["details"].append(f"ā {self.symbol}: Updated (Price: {last_price})") + else: + report["failed"] += 1 + report["details"].append(f"ā {self.symbol}: No new data found") + + except Exception as e: + report["failed"] += 1 + report["details"].append(f"ā ļø {self.symbol}: Error ({str(e)})") + + return report + + def run_pre_sync_maintenance(self): + """Backs up files and reports current data health.""" + import os + import shutil + import pandas as pd + from datetime import datetime + + # 1. Setup paths correctly + base_dir = os.path.dirname(os.path.abspath(__file__)) + backup_dir = os.path.join(base_dir, 'backups') + + # 2. Create the timestamped folder path FIRST + timestamp = datetime.now().strftime("%Y%m%d_%H%M") + current_backup_path = os.path.join(backup_dir, f"sync_backup_{timestamp}") + + # 3. Create the directories (safety-first) + os.makedirs(current_backup_path, exist_ok=True) + + print(f"\n--- Pre-Sync Health Check ({timestamp}) ---") + stats = [] + + # 4. Check if cache exists to avoid errors + if not os.path.exists(self.cache_dir): + print(f"ā ļø Cache directory not found at {self.cache_dir}") + return pd.DataFrame() + + # 5. Backup loop + for filename in os.listdir(self.cache_dir): + if filename.endswith(".csv"): + src = os.path.join(self.cache_dir, filename) + dst = os.path.join(current_backup_path, filename) + + try: + # Perform copy + shutil.copy2(src, dst) + + # Read data for health check + df = pd.read_csv(src) + + # Store stats + stats.append({ + "Fund": filename.replace(".csv", ""), + "Rows": len(df), + "Start": df['date'].min() if 'date' in df.columns else "N/A", + "End": df['date'].max() if 'date' in df.columns else "N/A" + }) + print(f"š¦ Backed up: {filename} ({len(df)} rows)") + + except Exception as e: + print(f"ā ļø Could not backup {filename}: {e}") + continue + + # 6. Display and return report + if stats: + stats_df = pd.DataFrame(stats) + print("\n" + stats_df.to_string(index=False)) + print(f"\nā All backups saved to: {current_backup_path}") + return stats_df + else: + print("š No CSV files found to backup.") + return pd.DataFrame() def _parse_jpm(self, json_data): if isinstance(json_data, dict) and "historicalNAVList" in json_data: @@ -165,6 +296,24 @@ class DataEngine: print(f"Network error for {self.symbol}: {e}") return local_df + def get_local_metrics(self): + """Reads ONLY from local CSV and returns metrics immediately.""" + if not os.path.exists(self.file_path): + return {"error": "Missing Local Data", "status": "needs_sync"} + + try: + df = pd.read_csv(self.file_path) + # Ensure columns are clean + df.columns = [c.lower().strip() for c in df.columns] + df['date'] = pd.to_datetime(df['date'], errors='coerce') + df = df.dropna(subset=['date', 'close']).sort_values('date') + + # Pass this local dataframe to your existing calculation function + return self.calculate_table_metrics(df) + except Exception as e: + print(f"Error reading local data for {self.symbol}: {e}") + return None + def calculate_table_metrics(self, df): if df is None or df.empty or len(df) < 2: diff --git a/templates/index.html b/templates/index.html index 5dfe590..22fbb49 100644 --- a/templates/index.html +++ b/templates/index.html @@ -5,6 +5,7 @@
| Instrument | -Close | -Chg% | -52W Range | -v20 EMA | -v50 EMA | -v100 EMA | -v200 EMA | -K/D | +Instrument | +Close | +Chg% | +52W Range | 20 EMA | +50 EMA | +100 EMA | +200 EMA | +K/D |
|---|