import os from nicegui import ui, app from sqlalchemy import create_engine # import requests import json # import time # import re import valkey # import asyncio # import datetime as dt # from random import random # from nicegui_modules import data # from nicegui_modules import ui_components # from glide import GlideClient, NodeAddress, GlideClientConfiguration LISTENING_CLIENT = None LH_PAIR = 'BTC' RH_PAIR = 'USD' DEFAULT_TO_DARKMODE: bool = True ALLOW_BODY_SCROLL: bool = True LOOKBACK: int = 60 LOOKBACK_RT_TV_MAX_POINTS: int = 300 REFRESH_INTERVAL_SEC: int = 10 REFRESH_INTERVAL_RT_SEC: int = 0.1 ENGINE = create_engine('mysql+pymysql://root:pwd@localhost/polymarket') VALKEY_R = valkey.Valkey(host='localhost', port=6379, db=0, decode_responses=True) # VALKEY_P = VALKEY_R.pubsub() # VALKEY_P.subscribe('mexc_mkt_bookTicker') def root(): app.add_static_files(max_cache_age=0, url_path='/static', local_directory=os.path.join(os.path.dirname(__file__), 'nicegui_modules/static')) ui.add_head_html(''' ''' ) # ui.add_head_html('') update_body_scroll(bool_override=ALLOW_BODY_SCROLL) ui.sub_pages({ '/': rt_chart_page, }).classes('w-full') async def update_tv(): series_update = json.loads(VALKEY_R.get('poly_rtds_cl_btcusd')) series_update_b = json.loads(VALKEY_R.get('poly_coinbase_btcusd')) series_update_c = json.loads(VALKEY_R.get('poly_5min_btcusd')) timestamp = round( ( series_update['timestamp_arrival'] / 1000 ) , 2) timestamp_b = round( ( series_update_b['timestamp_arrival'] / 1000 ) , 2) timestamp_c = round( ( series_update_c['timestamp_arrival'] / 1000 ) , 2) value = float(series_update['value']) value_b = float(series_update_b['value']) value_c = float(series_update_c['price']) data_dict = { 'timestamp': timestamp, 'timestamp_b': timestamp_b, 'timestamp_c': timestamp_c, 'value': value, 'value_b': value_b, 'value_c': value_c, 'target': series_update_c['target_price'], 'LOOKBACK_RT_TV_MAX_POINTS': LOOKBACK_RT_TV_MAX_POINTS, } ui.run_javascript(f'await update_tv(data_dict={data_dict});') def update_body_scroll(e=None, bool_override=False): if e is None: if bool_override: ui.query('body').style('height: 100%; overflow-y: auto;') else: ui.query('body').style('height: 100%; overflow-y: hidden;') else: if e.value: ui.query('body').style('height: 100%; overflow-y: auto;') else: ui.query('body').style('height: 100%; overflow-y: hidden;') # async def refresh_lookback_funcs(lookback: int = LOOKBACK): # lookback = app.storage.user.get('lookback', lookback) # await data.trades_pnl_graph.refresh(ENGINE=ENGINE, LH_PAIR=LH_PAIR, RH_PAIR=RH_PAIR, lookback=lookback) # await ui_components.er_table.refresh(ENGINE=ENGINE, lookback=lookback) # await ui_components.trades_table.refresh(ENGINE=ENGINE, lookback=lookback) # await ui_components.er_stats.refresh(ENGINE=ENGINE, lookback=lookback) async def rt_chart_page(): global LOOKBACK LOOKBACK = app.storage.user.get('lookback', LOOKBACK) timer = ui.timer(REFRESH_INTERVAL_RT_SEC, update_tv) with ui.row(): with ui.column(): ui.switch('☸︎', value=ALLOW_BODY_SCROLL, on_change=lambda e: update_body_scroll(e)) with ui.column(): ui.switch('▶️', value=True).bind_value_to(timer, 'active') with ui.column().style('position: absolute; right: 20px; font-family: monospace; align-self: center;'): ui.label('Atwater Trading: Orderbook') with ui.grid(columns=16).classes('w-full gap-0 auto-fit'): with ui.card().tight().classes('w-full col-span-full no-shadow border border-black-200').style('overflow: auto;'): ui.html('
', sanitize=False).classes('w-full') ui.run_javascript('await create_tv();') ui.run(root, storage_secret="123ABC", reload=True, dark=True, title='Atwater Trading')