106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
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()
|