crypto_quant/market_data_main.py

106 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()