2025-07-26 06:41:50 +00:00
|
|
|
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
|
2025-07-26 06:41:50 +00:00
|
|
|
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()
|
2025-07-26 06:41:50 +00:00
|
|
|
|
|
|
|
|
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)
|
2025-07-26 06:41:50 +00:00
|
|
|
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()
|
2025-07-26 06:41:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
)
|