import logging from time import sleep from core.market_data_monitor import MarketDataMonitor from core.db_market_data import DBMarketData from config import ( API_KEY, SECRET_KEY, PASSPHRASE, SANDBOX, MONITOR_CONFIG, MYSQL_CONFIG, ) logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") class MarketDataMain: def __init__(self): self.market_data_monitor = MarketDataMonitor( api_key=API_KEY, secret_key=SECRET_KEY, passphrase=PASSPHRASE, sandbox=SANDBOX, ) self.symbols = MONITOR_CONFIG.get("volume_monitor", {}).get( "symbols", ["XCH-USDT"] ) self.bars = MONITOR_CONFIG.get("volume_monitor", {}).get( "bars", ["5m", "15m", "1H", "4H", "1D"] ) self.initial_date = MONITOR_CONFIG.get("volume_monitor", {}).get( "initial_date", "2025-07-01 00:00:00" ) mysql_user = MYSQL_CONFIG.get("user", "xch") mysql_password = MYSQL_CONFIG.get("password", "") if not mysql_password: raise ValueError("MySQL password is not set") mysql_host = MYSQL_CONFIG.get("host", "localhost") mysql_port = MYSQL_CONFIG.get("port", 3306) mysql_database = MYSQL_CONFIG.get("database", "okx") self.db_url = f"mysql+pymysql://{mysql_user}:{mysql_password}@{mysql_host}:{mysql_port}/{mysql_database}" self.db_market_data = DBMarketData(self.db_url) def initial_data(self): """ 初始化数据 """ for symbol in self.symbols: for bar in self.bars: logging.info(f"开始初始化行情数据: {symbol} {bar}") latest_data = self.db_market_data.query_latest_data(symbol, bar) if latest_data: logging.info( f"已初始化{symbol}, {bar} 最新行情数据,请使用update_data()更新行情数据" ) continue self.fetch_save_data(symbol, bar, self.initial_date) def fetch_save_data(self, symbol: str, bar: str, start: str): """ 获取保存数据 """ data = self.market_data_monitor.get_historical_kline_data( symbol=symbol, start=start, bar=bar ) if data is not None and len(data) > 0: self.db_market_data.insert_data_to_mysql(data) return data def batch_update_data(self): """ 更新数据 1. 获取最新数据 2. 获取最新数据的时间戳 3. 根据最新数据的时间戳,获取最新数据 4. 将最新数据保存到数据库 """ for symbol in self.symbols: for bar in self.bars: self.update_data(symbol, bar) def update_data(self, symbol: str, bar: str): """ 更新数据 """ logging.info(f"开始更新行情数据: {symbol} {bar}") latest_data = self.db_market_data.query_latest_data(symbol, bar) if not latest_data: data = self.fetch_save_data(symbol, bar, self.initial_date) else: latest_timestamp = latest_data.get("timestamp") if latest_timestamp: latest_timestamp = int(latest_timestamp) else: logging.warning(f"获取{symbol}, {bar} 最新数据失败") return data = self.fetch_save_data(symbol, bar, latest_timestamp + 1) return data if __name__ == "__main__": market_data_main = MarketDataMain() market_data_main.batch_update_data() # market_data_main.initial_data()