import asyncio import json import logging import math import os import time import traceback from dataclasses import asdict, dataclass from datetime import datetime, timezone from typing import AsyncContextManager from dotenv import load_dotenv import numpy as np import pandas as pd import requests # import talib import valkey from sqlalchemy import text from sqlalchemy.ext.asyncio import create_async_engine ### Database ### CLIENT = None CON: AsyncContextManager | None = None VAL_KEY = None ### Logging ### load_dotenv() LOG_FILEPATH: str = os.getenv("LOGS_PATH") + '/Fund_Rate_Algo.log' async def run_algo(): try: while True: loop_start = time.time() print('__________Start___________') MEXC_FUND_RATE = json.loads(VAL_KEY.get('fund_rate_mexc')) MEXC_TICKER = json.loads(VAL_KEY.get('fut_ticker_mexc')) APEX_TICKER = json.loads(VAL_KEY.get('fut_ticker_apex')) print(f'MEXC FUND RATE: {MEXC_FUND_RATE}') print(f'MEXC TICKER: {MEXC_TICKER}') print(f'APEX TICKER: {APEX_TICKER}') time.sleep(5) print(f'__________________________ (Algo Engine ms: {(time.time() - loop_start)*1000})') except KeyboardInterrupt: print('...algo stopped') # await cancel_all_orders(CLIENT=CLIENT) except Exception as e: logging.critical(f'*** ALGO ENGINE CRASHED: {e}') logging.error(traceback.format_exc()) # await cancel_all_orders(CLIENT=CLIENT) async def main(): global CLIENT global VAL_KEY global CON VAL_KEY = valkey.Valkey(host='localhost', port=6379, db=0, decode_responses=True) engine = create_async_engine('mysql+asyncmy://root:pwd@localhost/fund_rate') async with engine.connect() as CON: # await create_executions_orders_table(CON=CON) await run_algo() if __name__ == '__main__': START_TIME = round(datetime.now().timestamp()*1000) logging.info(f'Log FilePath: {LOG_FILEPATH}') logging.basicConfig( force=True, filename=LOG_FILEPATH, level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filemode='w' ) logging.info(f"STARTED: {START_TIME}") asyncio.run(main())