refactor valkey into objects with health check

This commit is contained in:
2026-05-15 11:34:25 +09:00
parent f5f43be1a1
commit 1fd922d98f
25 changed files with 6461 additions and 9613 deletions

View File

@@ -17,6 +17,7 @@ import os
from dotenv import load_dotenv
import modules.db as db
import modules.aster_db as aster_db
import sys
### Allow only ipv4 ###
def allowed_gai_family():
@@ -37,9 +38,10 @@ load_dotenv()
LOG_FILEPATH: str = f'{os.getenv(key="LOGS_PATH")}/Fund_Rate_Aster.log'
### CONSTANTS ###
SYMBOL: str = 'ETHUSDT'
SYMBOL: str = 'ENAUSDT'
STREAM_MARKPRICE: str = f'{SYMBOL.lower()}@markPrice@1s'
STREAM_MARKPRICE: str = '!markPrice@arr@1s'
# STREAM_MARKPRICE: str = f'{SYMBOL.lower()}@markPrice@1s'
STREAM_BOOKTICKER: str = f'{SYMBOL.lower()}@bookTicker'
STREAM_TRADES: str = f'{SYMBOL.lower()}@aggTrade'
@@ -83,17 +85,23 @@ async def ws_stream():
async for message in websocket:
### Update Symbol if Algo Outputs Change ###
if ALLOW_SYMBOL_CHG:
best_symbol_by_exchange: dict = json.loads(s=VAL_KEY.get(name='fr_algo_working_symbol')) # ty:ignore[invalid-argument-type]
fr_algo_working_symbol = VAL_KEY.get(name='fr_algo_working_symbol')
if not fr_algo_working_symbol:
logging.critical(f'fr_algo_working_symbol is empty - killing: {fr_algo_working_symbol}')
sys.exit(1)
best_symbol_by_exchange: dict = json.loads(fr_algo_working_symbol) # ty:ignore[invalid-argument-type]
best_symbol: str = best_symbol_by_exchange['ASTER']['symbol']
if best_symbol != SYMBOL:
logging.info(f'Symbol Change: {SYMBOL} -> {best_symbol}')
SYMBOL = best_symbol
await unsubscribe_streams(websocket = websocket, streams=[STREAM_MARKPRICE,STREAM_BOOKTICKER,STREAM_TRADES])
await unsubscribe_streams(websocket = websocket, streams=[STREAM_BOOKTICKER,STREAM_TRADES])
STREAM_MARKPRICE = f'{SYMBOL.lower()}@markPrice@1s'
# STREAM_MARKPRICE = f'{SYMBOL.lower()}@markPrice@1s'
STREAM_BOOKTICKER = f'{SYMBOL.lower()}@bookTicker'
STREAM_TRADES = f'{SYMBOL.lower()}@aggTrade'
await subscribe_streams(websocket = websocket, streams=[STREAM_MARKPRICE,STREAM_BOOKTICKER,STREAM_TRADES])
await subscribe_streams(websocket = websocket, streams=[STREAM_BOOKTICKER,STREAM_TRADES])
continue
ts_arrival = round(datetime.now().timestamp()*1000)
@@ -104,18 +112,25 @@ async def ws_stream():
if channel is not None:
match channel:
case c if c == STREAM_MARKPRICE:
# print(f'MP: {data}')
VAL_KEY_OBJ = json.dumps({
'timestamp_arrival': ts_arrival,
'timestamp_msg': data['data']['E'],
'symbol': data['data']['s'],
'mark_price': data['data']['p'],
'index_price': data['data']['i'],
'estimated_settle_price': data['data']['P'],
'funding_rate': data['data']['r'],
'next_funding_time_ts_ms': data['data']['T'],
})
VAL_KEY.set(VK_FUND_RATE, VAL_KEY_OBJ)
if data.get('data'):
VAL_KEY.set('fund_rate_aster_all', json.dumps(data['data']))
else:
logging.warning(f'Data["data"] is None: {data}')
single_ticker_fr = [d for d in data['data'] if d.get('s')==SYMBOL]
if single_ticker_fr:
d = single_ticker_fr[0]
VAL_KEY_OBJ = json.dumps({
'timestamp_arrival': ts_arrival,
'timestamp_msg': d['E'],
'symbol': d['s'],
'mark_price': d['p'],
'index_price': d['i'],
'estimated_settle_price': d['P'],
'funding_rate': d['r'],
'next_funding_time_ts_ms': d['T'],
})
VAL_KEY.set(VK_FUND_RATE, VAL_KEY_OBJ)
# print(f'MP: {d}')
continue
case c if c == STREAM_BOOKTICKER:
# print(f'BT: {data}')