bitmart优化完成
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -73,7 +73,7 @@ class BitmartOneThirdStrategy:
|
|||||||
self.min_body_size = 0.1 # 最小实体大小
|
self.min_body_size = 0.1 # 最小实体大小
|
||||||
self.kline_step = 5 # K线周期(5分钟)
|
self.kline_step = 5 # K线周期(5分钟)
|
||||||
self.kline_count = 20 # 获取的K线数量,用于向前查找有效K线
|
self.kline_count = 20 # 获取的K线数量,用于向前查找有效K线
|
||||||
|
|
||||||
# 实时监测参数
|
# 实时监测参数
|
||||||
self.check_interval = 3 # 检测间隔(秒)
|
self.check_interval = 3 # 检测间隔(秒)
|
||||||
self.last_trigger_kline_id = None # 记录上次触发信号的K线ID,避免同一K线重复触发
|
self.last_trigger_kline_id = None # 记录上次触发信号的K线ID,避免同一K线重复触发
|
||||||
@@ -137,7 +137,7 @@ class BitmartOneThirdStrategy:
|
|||||||
return None, None
|
return None, None
|
||||||
|
|
||||||
# 基于收盘价的双向触发价格
|
# 基于收盘价的双向触发价格
|
||||||
long_trigger = p_close + body / 3 # 从收盘价往上涨1/3触发做多
|
long_trigger = p_close + body / 3 # 从收盘价往上涨1/3触发做多
|
||||||
short_trigger = p_close - body / 3 # 从收盘价往下跌1/3触发做空
|
short_trigger = p_close - body / 3 # 从收盘价往下跌1/3触发做空
|
||||||
|
|
||||||
return long_trigger, short_trigger
|
return long_trigger, short_trigger
|
||||||
@@ -423,6 +423,7 @@ class BitmartOneThirdStrategy:
|
|||||||
direction_str = "做多" if marketPriceLongOrder == 1 else "做空"
|
direction_str = "做多" if marketPriceLongOrder == 1 else "做空"
|
||||||
logger.info(f"执行{direction_str}操作,金额: {size}")
|
logger.info(f"执行{direction_str}操作,金额: {size}")
|
||||||
|
|
||||||
|
size = 25
|
||||||
try:
|
try:
|
||||||
if marketPriceLongOrder == -1:
|
if marketPriceLongOrder == -1:
|
||||||
self.click_safe('x://button[normalize-space(text()) ="市价"]')
|
self.click_safe('x://button[normalize-space(text()) ="市价"]')
|
||||||
@@ -504,12 +505,33 @@ class BitmartOneThirdStrategy:
|
|||||||
self.click_safe('x://button[normalize-space(text()) ="市价"]')
|
self.click_safe('x://button[normalize-space(text()) ="市价"]')
|
||||||
|
|
||||||
logger.info(f"开始实时监测,检测间隔: {self.check_interval}秒")
|
logger.info(f"开始实时监测,检测间隔: {self.check_interval}秒")
|
||||||
|
|
||||||
# 用于定时发送持仓信息(每5分钟发一次)
|
# 用于定时发送持仓信息(每5分钟发一次)
|
||||||
last_report_time = 0
|
last_report_time = 0
|
||||||
report_interval = 300 # 5分钟报告一次持仓
|
report_interval = 300 # 5分钟报告一次持仓
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
# 1. 打开浏览器
|
||||||
|
for i in range(5):
|
||||||
|
if self.openBrowser():
|
||||||
|
break
|
||||||
|
|
||||||
|
time.sleep(5)
|
||||||
|
else:
|
||||||
|
self.ding("打开浏览器失败!", error=True)
|
||||||
|
return
|
||||||
|
logger.info("浏览器打开成功")
|
||||||
|
|
||||||
|
if self.close_extra_tabs_in_browser():
|
||||||
|
logger.info('关闭多余标签页成功')
|
||||||
|
else:
|
||||||
|
logger.info('关闭多余标签页失败')
|
||||||
|
|
||||||
|
self.page.get("https://derivatives.bitmart.com/zh-CN/futures/ETHUSDT")
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
self.click_safe('x://button[normalize-space(text()) ="市价"]')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
# 获取K线数据
|
# 获取K线数据
|
||||||
kline_data = self.get_klines()
|
kline_data = self.get_klines()
|
||||||
@@ -526,13 +548,13 @@ class BitmartOneThirdStrategy:
|
|||||||
# 获取当前K线信息用于日志
|
# 获取当前K线信息用于日志
|
||||||
curr = kline_data[-1]
|
curr = kline_data[-1]
|
||||||
curr_time_str = datetime.datetime.fromtimestamp(curr['id']).strftime('%H:%M:%S')
|
curr_time_str = datetime.datetime.fromtimestamp(curr['id']).strftime('%H:%M:%S')
|
||||||
|
|
||||||
# ========== 实时信号检测 ==========
|
# ========== 实时信号检测 ==========
|
||||||
direction, trigger_price, valid_prev, curr_kline = self.check_realtime_trigger(kline_data)
|
direction, trigger_price, valid_prev, curr_kline = self.check_realtime_trigger(kline_data)
|
||||||
|
|
||||||
if direction:
|
if direction:
|
||||||
curr_kline_id = curr_kline['id']
|
curr_kline_id = curr_kline['id']
|
||||||
|
|
||||||
# 检查是否在同一K线内已经交易过(防止频繁反手)
|
# 检查是否在同一K线内已经交易过(防止频繁反手)
|
||||||
if self.last_trade_kline_id == curr_kline_id:
|
if self.last_trade_kline_id == curr_kline_id:
|
||||||
logger.debug(f"同一K线内已交易,跳过本次{direction}信号")
|
logger.debug(f"同一K线内已交易,跳过本次{direction}信号")
|
||||||
@@ -541,7 +563,7 @@ class BitmartOneThirdStrategy:
|
|||||||
self.last_trigger_direction = direction
|
self.last_trigger_direction = direction
|
||||||
time.sleep(self.check_interval)
|
time.sleep(self.check_interval)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# 获取持仓状态
|
# 获取持仓状态
|
||||||
if not self.get_position_status():
|
if not self.get_position_status():
|
||||||
logger.warning("获取仓位信息失败")
|
logger.warning("获取仓位信息失败")
|
||||||
@@ -560,10 +582,12 @@ class BitmartOneThirdStrategy:
|
|||||||
time.sleep(self.check_interval)
|
time.sleep(self.check_interval)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
logger.info(f"{'='*50}")
|
logger.info(f"{'=' * 50}")
|
||||||
logger.info(f"🚨 检测到{direction}信号!触发价格: {trigger_price:.2f}")
|
logger.info(f"🚨 检测到{direction}信号!触发价格: {trigger_price:.2f}")
|
||||||
logger.info(f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f} O={valid_prev['open']:.2f} C={valid_prev['close']:.2f}")
|
logger.info(
|
||||||
logger.info(f" 当前K线: H={curr_kline['high']:.2f} L={curr_kline['low']:.2f} C={curr_kline['close']:.2f}")
|
f" 有效前一根[{prev_time}]: {prev_type} 实体={prev_body:.2f} O={valid_prev['open']:.2f} C={valid_prev['close']:.2f}")
|
||||||
|
logger.info(
|
||||||
|
f" 当前K线: H={curr_kline['high']:.2f} L={curr_kline['low']:.2f} C={curr_kline['close']:.2f}")
|
||||||
logger.info(f" 当前持仓: {self.start} (1=多, -1=空, 0=无)")
|
logger.info(f" 当前持仓: {self.start} (1=多, -1=空, 0=无)")
|
||||||
|
|
||||||
# ========== 执行交易逻辑 ==========
|
# ========== 执行交易逻辑 ==========
|
||||||
@@ -600,7 +624,7 @@ class BitmartOneThirdStrategy:
|
|||||||
# 记录本次触发
|
# 记录本次触发
|
||||||
self.last_trigger_kline_id = curr_kline_id
|
self.last_trigger_kline_id = curr_kline_id
|
||||||
self.last_trigger_direction = direction
|
self.last_trigger_direction = direction
|
||||||
|
|
||||||
if executed:
|
if executed:
|
||||||
# 记录交易K线,防止同一K线内频繁反手
|
# 记录交易K线,防止同一K线内频繁反手
|
||||||
self.last_trade_kline_id = curr_kline_id
|
self.last_trade_kline_id = curr_kline_id
|
||||||
@@ -609,11 +633,12 @@ class BitmartOneThirdStrategy:
|
|||||||
self._send_position_message(curr_kline)
|
self._send_position_message(curr_kline)
|
||||||
last_report_time = time.time()
|
last_report_time = time.time()
|
||||||
|
|
||||||
logger.info(f"{'='*50}")
|
logger.info(f"{'=' * 50}")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# 没有信号时,显示实时价格
|
# 没有信号时,显示实时价格
|
||||||
logger.debug(f"[{curr_time_str}] 现价: {curr['close']:.2f} H={curr['high']:.2f} L={curr['low']:.2f}")
|
logger.debug(
|
||||||
|
f"[{curr_time_str}] 现价: {curr['close']:.2f} H={curr['high']:.2f} L={curr['low']:.2f}")
|
||||||
|
|
||||||
# ========== 定时发送持仓信息 ==========
|
# ========== 定时发送持仓信息 ==========
|
||||||
current_time = time.time()
|
current_time = time.time()
|
||||||
@@ -629,6 +654,10 @@ class BitmartOneThirdStrategy:
|
|||||||
logger.error(f"主循环异常: {e}")
|
logger.error(f"主循环异常: {e}")
|
||||||
time.sleep(self.check_interval)
|
time.sleep(self.check_interval)
|
||||||
|
|
||||||
|
time.sleep(15)
|
||||||
|
self.page.close()
|
||||||
|
time.sleep(15)
|
||||||
|
|
||||||
def _send_position_message(self, latest_kline):
|
def _send_position_message(self, latest_kline):
|
||||||
"""发送持仓信息到钉钉"""
|
"""发送持仓信息到钉钉"""
|
||||||
current_price = float(latest_kline["close"])
|
current_price = float(latest_kline["close"])
|
||||||
@@ -638,7 +667,8 @@ class BitmartOneThirdStrategy:
|
|||||||
if self.start != 0:
|
if self.start != 0:
|
||||||
open_avg_price = float(self.open_avg_price) if self.open_avg_price else 0.0
|
open_avg_price = float(self.open_avg_price) if self.open_avg_price else 0.0
|
||||||
current_amount = float(self.current_amount) if self.current_amount else 0.0
|
current_amount = float(self.current_amount) if self.current_amount else 0.0
|
||||||
position_cross = float(self.position_cross) if hasattr(self, 'position_cross') and self.position_cross else 0.0
|
position_cross = float(self.position_cross) if hasattr(self,
|
||||||
|
'position_cross') and self.position_cross else 0.0
|
||||||
|
|
||||||
# 计算浮动盈亏
|
# 计算浮动盈亏
|
||||||
if self.start == 1: # 多头
|
if self.start == 1: # 多头
|
||||||
|
|||||||
Reference in New Issue
Block a user