From 9e7f474d5ee96315f478df2a22d13613dddb82e4 Mon Sep 17 00:00:00 2001 From: tab888 Date: Tue, 27 Jan 2026 07:12:09 +0800 Subject: [PATCH] Refactor: Separate data sync from UI rendering, change colunm width --- __pycache__/engine.cpython-313.pyc | Bin 10653 -> 18150 bytes app.py | 82 +- data_cache/SPMO ETF - USD.csv | 1355 +++++++++++++++++++++++++++- engine.py | 205 ++++- templates/index.html | 193 +++- 5 files changed, 1691 insertions(+), 144 deletions(-) diff --git a/__pycache__/engine.cpython-313.pyc b/__pycache__/engine.cpython-313.pyc index 8ea92567813198e36b2b49ca4ba650a97fcf6125..4c0f052eb22aff609ae907fcf986e28606683401 100644 GIT binary patch delta 8809 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 JQb?6`{uh_B;h+Ej delta 2661 zcmY*beQXt36~FWOzS`H7M=5PzVG4yZ(3TC~EQmt+=(h48zIIU|c{`nV`#Q_Knc>bn zTB@=9qp4=eF1c=O-H$?CW9vWc+CZ15kK*nm z?>Fb3d(N42&)0o_zaqU^%sy^xOcQwi`kM*o>&DgWT50%dw{b!qQU_J08l*^y%8)jw zGd-r&p~PU4B@MEcY#>FgjTH6WGU^k;QWeQeEF)PkC6O#!5xshC|BDiG;CXxq;5BlN zFsVqGT$Gqnl-meXiwdAtQ~`A~$r42!Fj-6hriw|xbTP#;m9&`=>7!O;9rG%VN0*ae z&{p|rX|=S#sk9)e{C#OX@0D}vh+35R5qU_Li^_i4;I||L`TXN-E0>ftTh*QNir*u| z&7gnyREVh+L>gSTO15Q>(_xbzQzkZRLJg@q#u`C}Wf7VHL~7IuX(_Ox@lb;`|A%7h zDImgc@fXzH)1T<1EkEBf*D{}<%U^Te$=_`~G^4(p1%4{?O6I$nSC4+baJ8^7{9$s( zXJyMj_O5$3SKn%Xul;7@`@^^Q4Bl-Wno+N0AA@ybuY?pAI{Xy)J^lu8Un3*r%PYG) zmCZfxNh4B@47^T=CyzkT(N8$>iVOjs{Dk);kFXCxd%{D@@iW2$t(nj3N&Z&$41afT zPR){{${U(GWo?At*xQV2oewl^oi@nHHwnoQgPd(yQ72>+73pKH>VK zmTMr_==ZCEOOp}pE0~RvPt2fRZ{Y%@r*~z)SnWHZc-D~Zbt;}@*Ie0H` zTx+|N?*aNGsIAR^)UxGH%a*$>TY)q1amV`kGjnI=&&{1%=(^Fn*n9Knt)cgZZhrpP z>h1j}?{*YGr~pOPxa!p%1GB^PXXnn&o?OV?Ue)`DhQ50Z&%AQ#JE#8C(DBb!(%kh) zo}{w3vzz{y+|1U2o3@NS#b=G5OhW=(Kcqs%ZZ>6+^sI}gnPXGd3xbQ1NZ7txt9qfS ziL?`9G%U|XdB=`~9F#>08}>M}s#NHVdhlL}U+SgM_u_~OxjgpSxTT@1SV;NLI@_h~ z{KL+Z(z+#M!=SoHXb^8FSXSZlLh2D@QI1_cl@&nR?MnNAATwZh1h*#zhd^*p7)agfpC&8bxd8cq1@yb zr(F$IFzJL*Sa0VfqgFXnvcrpzaNlOn@(Vkg4+zcmC%{-gy1W|!qZ9a+Y*t2tmrw;<2?O7QHW}WvS;u+9Hu1~5+9bC0 z`mTra(y4>LR1(Yog$Fty_r;%2*V9!m6@3C?=})j(RQmzIG7jkfD245ZO}P1i7LBxO zVLIxS2ICFf5n4Q>O^v;QA_|DWjDWEn#kC^Rn72~BdhiZ0jLVlV*Jojt4;&tpe@giG z4!>aHoMCSPEMwi9Qfv;&RULOKdPl#(b4NBvZ}UAzUfhmRWTydyHs<q2))oXTjkr|mm9YtzAMoED>(~~DB+eo>97Di=I3cQin>>=6v@c1IHsrMKM_YO4 z@!a&kJgHMl#}hjiHq$~6EU#>Z^){G6D{&j(l_Zjp)fd48F4vQrfo0Xli>p?x2Q2>T zZ&B%~Cn9;U>X&OSJ;Z(w8(1OXMu3NkBy~ymN$x&rx=&IMNXG-x`GEBNTRoyk=|==H Gw(>u!Y|<0} 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 @@ Financial Dashboard + @@ -104,9 +120,16 @@
Portfolio Signals
-
- Updating... - +
+ + + + +
@@ -114,15 +137,14 @@ - - - - - - - - - + + + + + + + + @@ -133,13 +155,30 @@ -
InstrumentCloseChg%52W Rangev20 EMAv50 EMAv100 EMAv200 EMAK/DInstrumentCloseChg%52W Range 20 EMA50 EMA100 EMA200 EMAK/D