crypto_quant/statistics_main.py

78 lines
2.6 KiB
Python
Raw Normal View History

from core.statistics import Statistics
2025-07-28 04:29:31 +00:00
from core.db_market_data import DBMarketData
from monitor_main import MonitorMain
import logging
from config import MONITOR_CONFIG, MYSQL_CONFIG
from datetime import datetime
import pandas as pd
logging.basicConfig(
level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s"
)
class StatisticsMain:
def __init__(self):
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.statistics = Statistics()
2025-07-28 04:29:31 +00:00
self.db_market_data = DBMarketData(self.db_url)
self.monitor_main = MonitorMain()
def batch_detect_volume_spike(self, start: str, end: str):
pass
def detect_volume_spike(
self,
symbol: str = "XCH-USDT",
bar: str = "5m",
start: str = "2025-05-01 00:00:00",
end: str = None,
only_output_huge_volume: bool = False,
):
if start is None:
start = MONITOR_CONFIG.get("volume_monitor", {}).get(
"initial_date", "2025-05-01 00:00:00"
)
if end is None:
end = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
2025-07-28 04:29:31 +00:00
data = self.db_market_data.query_market_data_by_symbol_bar(symbol, bar, start, end)
if data is None:
logging.warning(f"获取数据失败: {symbol} {bar} {start} {end}")
return None
else:
if len(data) == 0:
logging.warning(f"获取数据为空: {symbol} {bar} {start} {end}")
return None
else:
if isinstance(data, list):
data = pd.DataFrame(data)
elif isinstance(data, dict):
data = pd.DataFrame([data])
return self.statistics.detect_volume_spike(
data=data,
check_price=True,
only_output_huge_volume=only_output_huge_volume,
output_excel=True,
)
2025-07-28 04:29:31 +00:00
def update_volume_spike(self):
self.monitor_main.update_data()
if __name__ == "__main__":
statistics_main = StatisticsMain()
statistics_main.detect_volume_spike(
symbol="XCH-USDT",
bar="5m",
start="2025-05-01 00:00:00",
only_output_huge_volume=True,
)