crypto_quant/monitor_main.py

97 lines
3.4 KiB
Python
Raw Normal View History

2025-07-24 10:23:00 +00:00
import logging
from time import sleep
from core.data_monitor import DataMonitor
2025-07-28 04:29:31 +00:00
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")
2025-07-24 10:23:00 +00:00
class MonitorMain:
def __init__(self):
self.data_monitor = DataMonitor(
api_key=API_KEY,
secret_key=SECRET_KEY,
passphrase=PASSPHRASE,
sandbox=SANDBOX,
2025-07-28 04:29:31 +00:00
)
self.symbols = MONITOR_CONFIG.get("volume_monitor", {}).get(
"symbols", ["XCH-USDT"]
)
self.intervals = MONITOR_CONFIG.get("volume_monitor", {}).get(
"intervals", ["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}"
2025-07-28 04:29:31 +00:00
self.db_market_data = DBMarketData(self.db_url)
2025-07-24 10:23:00 +00:00
def initial_data(self):
2025-07-25 08:12:52 +00:00
"""
初始化数据
"""
2025-07-24 10:23:00 +00:00
for symbol in self.symbols:
for interval in self.intervals:
2025-07-28 04:29:31 +00:00
latest_data = self.db_market_data.query_latest_data(symbol, interval)
2025-07-25 08:12:52 +00:00
if latest_data:
2025-07-28 04:29:31 +00:00
logging.info(
f"已初始化{symbol}, {interval} 最新数据请使用update_data()更新数据"
)
2025-07-25 08:12:52 +00:00
continue
self.fetch_save_data(symbol, interval, self.initial_date)
2025-07-28 04:29:31 +00:00
2025-07-25 08:12:52 +00:00
def fetch_save_data(self, symbol: str, interval: str, start: str):
"""
获取保存数据
"""
2025-07-28 04:29:31 +00:00
data = self.data_monitor.get_historical_kline_data(
symbol=symbol, start=start, bar=interval
)
2025-07-25 08:12:52 +00:00
if data is not None and len(data) > 0:
2025-07-28 04:29:31 +00:00
self.db_market_data.insert_data_to_mysql(data)
2025-07-25 08:12:52 +00:00
def update_data(self):
"""
更新数据
1. 获取最新数据
2. 获取最新数据的时间戳
3. 根据最新数据的时间戳获取最新数据
4. 将最新数据保存到数据库
"""
for symbol in self.symbols:
for interval in self.intervals:
2025-07-28 04:29:31 +00:00
latest_data = self.db_market_data.query_latest_data(symbol, interval)
2025-07-25 08:12:52 +00:00
if not latest_data:
self.fetch_save_data(symbol, interval, self.initial_date)
continue
else:
latest_timestamp = latest_data.get("timestamp")
if latest_timestamp:
latest_timestamp = int(latest_timestamp)
else:
logging.warning(f"获取{symbol}, {interval} 最新数据失败")
continue
self.fetch_save_data(symbol, interval, latest_timestamp + 1)
2025-07-28 04:29:31 +00:00
2025-07-24 10:23:00 +00:00
if __name__ == "__main__":
monitor_main = MonitorMain()
monitor_main.update_data()
# monitor_main.initial_data()