2025-07-24 10:23:00 +00:00
|
|
|
|
import logging
|
|
|
|
|
|
from time import sleep
|
|
|
|
|
|
from core.data_monitor import DataMonitor
|
2025-07-25 08:12:52 +00:00
|
|
|
|
from core.db_manager import insert_market_data_to_mysql, query_latest_data
|
2025-07-25 05:11:27 +00:00
|
|
|
|
from config import API_KEY, SECRET_KEY, PASSPHRASE, SANDBOX, \
|
|
|
|
|
|
MONITOR_CONFIG, MYSQL_CONFIG
|
2025-07-24 10:23:00 +00:00
|
|
|
|
|
|
|
|
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(levelname)s: %(message)s')
|
|
|
|
|
|
|
|
|
|
|
|
class MonitorMain:
|
|
|
|
|
|
def __init__(self):
|
|
|
|
|
|
self.data_monitor = DataMonitor(
|
|
|
|
|
|
api_key=API_KEY,
|
|
|
|
|
|
secret_key=SECRET_KEY,
|
|
|
|
|
|
passphrase=PASSPHRASE,
|
|
|
|
|
|
sandbox=SANDBOX,
|
|
|
|
|
|
)
|
|
|
|
|
|
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")
|
2025-07-25 05:11:27 +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-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-25 08:12:52 +00:00
|
|
|
|
latest_data = query_latest_data(symbol, interval, self.db_url)
|
|
|
|
|
|
if latest_data:
|
|
|
|
|
|
logging.info(f"已初始化{symbol}, {interval} 最新数据,请使用update_data()更新数据")
|
|
|
|
|
|
continue
|
|
|
|
|
|
self.fetch_save_data(symbol, interval, self.initial_date)
|
2025-07-24 10:23:00 +00:00
|
|
|
|
|
2025-07-25 08:12:52 +00:00
|
|
|
|
def fetch_save_data(self, symbol: str, interval: str, start: str):
|
|
|
|
|
|
"""
|
|
|
|
|
|
获取保存数据
|
|
|
|
|
|
"""
|
|
|
|
|
|
data = self.data_monitor.get_historical_kline_data(symbol=symbol,
|
|
|
|
|
|
start=start,
|
|
|
|
|
|
bar=interval)
|
|
|
|
|
|
if data is not None and len(data) > 0:
|
|
|
|
|
|
insert_market_data_to_mysql(data, self.db_url)
|
|
|
|
|
|
|
|
|
|
|
|
def update_data(self):
|
|
|
|
|
|
"""
|
|
|
|
|
|
更新数据
|
|
|
|
|
|
1. 获取最新数据
|
|
|
|
|
|
2. 获取最新数据的时间戳
|
|
|
|
|
|
3. 根据最新数据的时间戳,获取最新数据
|
|
|
|
|
|
4. 将最新数据保存到数据库
|
|
|
|
|
|
"""
|
|
|
|
|
|
for symbol in self.symbols:
|
|
|
|
|
|
for interval in self.intervals:
|
|
|
|
|
|
latest_data = query_latest_data(symbol, interval, self.db_url)
|
|
|
|
|
|
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-24 10:23:00 +00:00
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
|
monitor_main = MonitorMain()
|
2025-07-25 08:12:52 +00:00
|
|
|
|
# monitor_main.update_data()
|
2025-07-24 10:23:00 +00:00
|
|
|
|
monitor_main.initial_data()
|
|
|
|
|
|
|
|
|
|
|
|
|