update for huge_volume_main.py

This commit is contained in:
blade 2025-08-04 22:36:25 +08:00
parent e0bf2bbbfb
commit cd0b64c5c9
5 changed files with 62 additions and 36 deletions

View File

@ -24,9 +24,6 @@ class DBHugeVolumeData:
"high", "high",
"low", "low",
"close", "close",
"pre_close",
"close_change",
"pct_chg",
"volume", "volume",
"volCcy", "volCcy",
"volCCyQuote", "volCCyQuote",

View File

@ -138,7 +138,12 @@ class HugeVolumeMain:
symbol, bar, window_size symbol, bar, window_size
) )
if latest_huge_volume_data is None or len(latest_huge_volume_data) == 0: if latest_huge_volume_data is None or len(latest_huge_volume_data) == 0:
self.detect_volume_spike(symbol, bar, only_output_huge_volume=False) self.detect_volume_spike(
symbol=symbol,
bar=bar,
window_size=window_size,
only_output_huge_volume=False,
)
return return
else: else:
earliest_date_time = latest_huge_volume_data["date_time"] earliest_date_time = latest_huge_volume_data["date_time"]
@ -280,7 +285,7 @@ class HugeVolumeMain:
data=volume_statistics_data, window_size=window_size, periods=periods data=volume_statistics_data, window_size=window_size, periods=periods
) )
return huge_volume_data, result_data return huge_volume_data, result_data
def send_huge_volume_data_to_wechat(self, start: str = None, end: str = None): def send_huge_volume_data_to_wechat(self, start: str = None, end: str = None):
if start is None: if start is None:
start = MONITOR_CONFIG.get("volume_monitor", {}).get( start = MONITOR_CONFIG.get("volume_monitor", {}).get(
@ -288,16 +293,15 @@ class HugeVolumeMain:
) )
if end is None: if end is None:
end = datetime.now().strftime("%Y-%m-%d %H:%M:%S") end = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_timestamp = transform_date_time_to_timestamp(start) start_timestamp = transform_date_time_to_timestamp(start)
end_timestamp = transform_date_time_to_timestamp(end) end_timestamp = transform_date_time_to_timestamp(end)
start_date_time = timestamp_to_datetime(start_timestamp) start_date_time = timestamp_to_datetime(start_timestamp)
end_date_time = timestamp_to_datetime(end_timestamp) end_date_time = timestamp_to_datetime(end_timestamp)
logging.info(f"开始获取巨量交易数据: {start}{end}") logging.info(f"开始获取巨量交易数据: {start}{end}")
huge_volume_data = self.db_huge_volume_data.query_huge_volume_records( huge_volume_data = self.db_huge_volume_data.query_huge_volume_records(
start=start_timestamp, start=start_timestamp, end=end_timestamp
end=end_timestamp
) )
if huge_volume_data is None or len(huge_volume_data) == 0: if huge_volume_data is None or len(huge_volume_data) == 0:
logging.warning(f"获取巨量交易数据为空: {start}{end}") logging.warning(f"获取巨量交易数据为空: {start}{end}")
@ -311,13 +315,15 @@ class HugeVolumeMain:
huge_volume_data = huge_volume_data[huge_volume_data["huge_volume"] == 1] huge_volume_data = huge_volume_data[huge_volume_data["huge_volume"] == 1]
# 过滤huge_volume_data要求(price_80_high == 1 or price_90_high == 1 or price_20_low == 1 or price_10_low == 1) # 过滤huge_volume_data要求(price_80_high == 1 or price_90_high == 1 or price_20_low == 1 or price_10_low == 1)
huge_volume_data = huge_volume_data[ huge_volume_data = huge_volume_data[
(huge_volume_data["price_90_high"] == 1) | (huge_volume_data["price_90_high"] == 1)
(huge_volume_data["price_10_low"] == 1) | (huge_volume_data["price_10_low"] == 1)
] ]
# 过滤huge_volume_data要求volume_ratio > 10 # 过滤huge_volume_data要求volume_ratio > 10
huge_volume_data = huge_volume_data[huge_volume_data["volume_ratio"] > 10] huge_volume_data = huge_volume_data[huge_volume_data["volume_ratio"] > 10]
# 根据symbol, bar, window_size, timestamp排序 # 根据symbol, bar, window_size, timestamp排序
huge_volume_data = huge_volume_data.sort_values(by=["symbol", "bar", "window_size", "timestamp"], ascending=True) huge_volume_data = huge_volume_data.sort_values(
by=["symbol", "bar", "window_size", "timestamp"], ascending=True
)
huge_volume_data = huge_volume_data.reset_index(drop=True) huge_volume_data = huge_volume_data.reset_index(drop=True)
logging.info(f"获取巨量交易数据: {len(huge_volume_data)}") logging.info(f"获取巨量交易数据: {len(huge_volume_data)}")
contents = [] contents = []
@ -330,39 +336,52 @@ class HugeVolumeMain:
contents.append(f"# 放量交易数据: {start_date_time}{end_date_time}") contents.append(f"# 放量交易数据: {start_date_time}{end_date_time}")
contents.append(f"## 币种: {symbol}") contents.append(f"## 币种: {symbol}")
symbol_data = huge_volume_data[huge_volume_data["symbol"] == symbol] symbol_data = huge_volume_data[huge_volume_data["symbol"] == symbol]
symbol_data = symbol_data.sort_values(by=["bar", "window_size", "timestamp"], ascending=True) symbol_data = symbol_data.sort_values(
by=["bar", "window_size", "timestamp"], ascending=True
)
symbol_data = symbol_data.reset_index(drop=True) symbol_data = symbol_data.reset_index(drop=True)
for index, row in symbol_data.iterrows(): for index, row in symbol_data.iterrows():
if row['huge_volume'] == 1 and (row['price_80_high'] == 1 or row['price_90_high'] == 1 or row['price_20_low'] == 1 or row['price_10_low'] == 1): if row["huge_volume"] == 1 and (
if row['price_90_high'] == 1: row["price_80_high"] == 1
or row["price_90_high"] == 1
or row["price_20_low"] == 1
or row["price_10_low"] == 1
):
if row["price_90_high"] == 1:
price_position_text = "90%分位数高点" price_position_text = "90%分位数高点"
elif row['price_80_high'] == 1: elif row["price_80_high"] == 1:
price_position_text = "80%分位数高点" price_position_text = "80%分位数高点"
else: else:
price_position_text = "" price_position_text = ""
if price_position_text == "": if price_position_text == "":
if row['price_10_low'] == 1: if row["price_10_low"] == 1:
price_position_text = "10%分位数低点" price_position_text = "10%分位数低点"
elif row['price_20_low'] == 1: elif row["price_20_low"] == 1:
price_position_text = "20%分位数低点" price_position_text = "20%分位数低点"
else: else:
price_position_text = "" price_position_text = ""
open_price = str(round(row['open'], 6)) open_price = str(round(row["open"], 6))
high = str(round(row['high'], 6)) high = str(round(row["high"], 6))
low = str(round(row['low'], 6)) low = str(round(row["low"], 6))
close = str(round(row['close'], 6)) close = str(round(row["close"], 6))
volume = str(round(row['volume'], 6)) volume = str(round(row["volume"], 6))
volCCyQuote = str(round(row['volCCyQuote'], 6)) volCCyQuote = str(round(row["volCCyQuote"], 6))
volume_ratio = str(round(row['volume_ratio'], 6)) volume_ratio = str(round(row["volume_ratio"], 6))
contents.append(f"交易周期: {row['bar']}, 滑动窗口: {row['window_size']} , 发生时间: {row['date_time']}") contents.append(
contents.append(f"开盘价: {open_price}, 最高价: {high}, 最低价: {low}, 收盘价: {close}") f"交易周期: {row['bar']}, 滑动窗口: {row['window_size']} , 发生时间: {row['date_time']}"
contents.append(f"成交量: {volume}, 成交量USDT: {volCCyQuote}, 交易量比率: {volume_ratio}") )
contents.append(
f"开盘价: {open_price}, 最高价: {high}, 最低价: {low}, 收盘价: {close}"
)
contents.append(
f"成交量: {volume}, 成交量USDT: {volCCyQuote}, 交易量比率: {volume_ratio}"
)
contents.append(f"价格分位: {price_position_text}") contents.append(f"价格分位: {price_position_text}")
contents.append(f"--------------------------------") contents.append(f"--------------------------------")
text = "\n\n".join(contents) text = "\n\n".join(contents)
# 获得text的字节数 # 获得text的字节数
text_length = len(text.encode('utf-8')) text_length = len(text.encode("utf-8"))
logging.info(f"发送巨量交易数据到微信,字节数: {text_length}") logging.info(f"发送巨量交易数据到微信,字节数: {text_length}")
# with open(os.path.join(self.output_folder, "huge_volume_data.md"), "w", encoding="utf-8") as f: # with open(os.path.join(self.output_folder, "huge_volume_data.md"), "w", encoding="utf-8") as f:
@ -447,10 +466,13 @@ def batch_initial_detect_volume_spike(threshold: float = 2.0):
): ):
window_sizes = [50, 80, 100, 120] window_sizes = [50, 80, 100, 120]
huge_volume_main = HugeVolumeMain(threshold) huge_volume_main = HugeVolumeMain(threshold)
start_date = MONITOR_CONFIG.get("volume_monitor", {}).get(
"initial_date", "2025-05-01 00:00:00"
)
for window_size in window_sizes: for window_size in window_sizes:
huge_volume_main.batch_initial_detect_volume_spike( huge_volume_main.batch_initial_detect_volume_spike(
window_size=window_size, window_size=window_size,
start="2025-05-01 00:00:00", start=start_date,
) )
@ -479,8 +501,8 @@ def test_send_huge_volume_data_to_wechat():
if __name__ == "__main__": if __name__ == "__main__":
test_send_huge_volume_data_to_wechat() # test_send_huge_volume_data_to_wechat()
# batch_initial_detect_volume_spike(threshold=2.0) batch_initial_detect_volume_spike(threshold=2.0)
# batch_update_volume_spike(threshold=2.0) # batch_update_volume_spike(threshold=2.0)
# huge_volume_main = HugeVolumeMain(threshold=2.0) # huge_volume_main = HugeVolumeMain(threshold=2.0)
# huge_volume_main.batch_next_periods_rise_or_fall(output_excel=True) # huge_volume_main.batch_next_periods_rise_or_fall(output_excel=True)

View File

@ -224,14 +224,16 @@ class MarketDataMain:
before_data = self.db_market_data.query_data_before_timestamp( before_data = self.db_market_data.query_data_before_timestamp(
symbol, bar, min_start_time_ts, 30 symbol, bar, min_start_time_ts, 30
) )
latest_before_timestamp = None
if before_data is not None and len(before_data) > 0: if before_data is not None and len(before_data) > 0:
earliest_timestamp = before_data[-1]["timestamp"] earliest_timestamp = before_data[-1]["timestamp"]
latest_before_timestamp = before_data[0]["timestamp"]
else: else:
earliest_timestamp = min_start_time_ts earliest_timestamp = min_start_time_ts
handle_data = self.db_market_data.query_market_data_by_symbol_bar( handle_data = self.db_market_data.query_market_data_by_symbol_bar(
symbol=symbol, bar=bar, start=earliest_timestamp, end=None symbol=symbol, bar=bar, start=earliest_timestamp, end=None
) )
if handle_data is not None and len(handle_data) > 0: if handle_data is not None and len(handle_data) > len(before_data):
if isinstance(handle_data, list): if isinstance(handle_data, list):
handle_data = pd.DataFrame(handle_data) handle_data = pd.DataFrame(handle_data)
elif isinstance(handle_data, dict): elif isinstance(handle_data, dict):
@ -243,6 +245,9 @@ class MarketDataMain:
return None return None
handle_data = self.calculate_metrics(handle_data) handle_data = self.calculate_metrics(handle_data)
if latest_before_timestamp is not None:
handle_data = handle_data[handle_data["timestamp"] > latest_before_timestamp]
handle_data.reset_index(drop=True, inplace=True)
logging.info(f"开始保存技术指标数据: {symbol} {bar}") logging.info(f"开始保存技术指标数据: {symbol} {bar}")
self.db_market_data.insert_data_to_mysql(handle_data) self.db_market_data.insert_data_to_mysql(handle_data)
return data return data

View File

@ -2,6 +2,11 @@ select date_time, open, high, low, close, k_shape from crypto_market_data
WHERE symbol='XCH-USDT' and bar='5m' and date_time > '2025-08-04 15:00:00' WHERE symbol='XCH-USDT' and bar='5m' and date_time > '2025-08-04 15:00:00'
order by timestamp ; order by timestamp ;
select * from crypto_market_data
WHERE symbol='XCH-USDT' and bar='5m' and date_time > '2025-08-04 15:00:00'
order by timestamp desc;
delete FROM crypto_market_data where symbol != 'XCH-USDT'; delete FROM crypto_market_data where symbol != 'XCH-USDT';
select * from crypto_trade_data select * from crypto_trade_data

View File

@ -9,9 +9,6 @@ CREATE TABLE IF NOT EXISTS crypto_huge_volume (
high DECIMAL(20,10) NOT NULL COMMENT '最高价', high DECIMAL(20,10) NOT NULL COMMENT '最高价',
low DECIMAL(20,10) NOT NULL COMMENT '最低价', low DECIMAL(20,10) NOT NULL COMMENT '最低价',
close DECIMAL(20,10) NOT NULL COMMENT '收盘价', close DECIMAL(20,10) NOT NULL COMMENT '收盘价',
pre_close DECIMAL(20,10) NOT NULL COMMENT '前收盘价',
close_change DECIMAL(20,10) NOT NULL COMMENT '涨跌额',
pct_chg DECIMAL(20,10) NOT NULL COMMENT '涨跌幅',
volume DECIMAL(30,10) NOT NULL COMMENT '交易量', volume DECIMAL(30,10) NOT NULL COMMENT '交易量',
volCcy DECIMAL(30,10) NOT NULL COMMENT '交易量(基础货币)', volCcy DECIMAL(30,10) NOT NULL COMMENT '交易量(基础货币)',
volCCyQuote DECIMAL(30,10) NOT NULL COMMENT '交易量(计价货币)', volCCyQuote DECIMAL(30,10) NOT NULL COMMENT '交易量(计价货币)',