This commit is contained in:
薇薇安 2026-01-15 13:08:41 +08:00
parent b1a6ae83c5
commit 81526052e7
5 changed files with 55 additions and 1 deletions

View File

@ -112,6 +112,7 @@ class ConfigManager:
'MAX_POSITION_PERCENT': self.get('MAX_POSITION_PERCENT', 0.05),
'MAX_TOTAL_POSITION_PERCENT': self.get('MAX_TOTAL_POSITION_PERCENT', 0.30),
'MIN_POSITION_PERCENT': self.get('MIN_POSITION_PERCENT', 0.01),
'MIN_MARGIN_USDT': self.get('MIN_MARGIN_USDT', 0.5), # 最小保证金要求USDT
# 涨跌幅阈值
'MIN_CHANGE_PERCENT': self.get('MIN_CHANGE_PERCENT', 2.0),

View File

@ -133,6 +133,7 @@ INSERT INTO `trading_config` (`config_key`, `config_value`, `config_type`, `cate
('MAX_POSITION_PERCENT', '0.05', 'number', 'position', '单笔最大仓位账户余额的5%'),
('MAX_TOTAL_POSITION_PERCENT', '0.30', 'number', 'position', '总仓位上限账户余额的30%'),
('MIN_POSITION_PERCENT', '0.01', 'number', 'position', '单笔最小仓位账户余额的1%'),
('MIN_MARGIN_USDT', '0.5', 'number', 'position', '最小保证金要求0.5 USDT避免手续费侵蚀收益'),
-- 涨跌幅阈值
('MIN_CHANGE_PERCENT', '2.0', 'number', 'scan', '最小涨跌幅阈值2%'),

View File

@ -164,6 +164,7 @@ def _get_trading_config():
'MAX_POSITION_PERCENT': 0.05,
'MAX_TOTAL_POSITION_PERCENT': 0.30,
'MIN_POSITION_PERCENT': 0.01,
'MIN_MARGIN_USDT': 0.5, # 最小保证金要求USDT避免手续费侵蚀收益
'MIN_CHANGE_PERCENT': 2.0,
'TOP_N_SYMBOLS': 10, # 每次扫描后处理的交易对数量
'MAX_SCAN_SYMBOLS': 500, # 扫描的最大交易对数量0表示扫描所有

View File

@ -103,6 +103,7 @@ class PositionManager:
logger.warning(f" 2. 单笔仓位超过限制")
logger.warning(f" 3. 总仓位超过限制")
logger.warning(f" 4. 无法获取价格数据")
logger.warning(f" 5. 保证金不足最小要求MIN_MARGIN_USDT")
return None
logger.info(f"{symbol} 仓位计算成功: {quantity:.4f}")

View File

@ -301,10 +301,60 @@ class RiskManager:
quantity = required_quantity
position_value = required_quantity * current_price
# 检查最小保证金要求(避免手续费侵蚀收益)
min_margin_usdt = self.config.get('MIN_MARGIN_USDT', 0.5) # 默认0.5 USDT
leverage = self.config.get('LEVERAGE', 10)
# 计算实际需要的保证金 = 仓位价值 / 杠杆
required_margin = position_value / leverage
logger.info(f" 计算保证金: {required_margin:.4f} USDT (仓位价值: {position_value:.2f} USDT / 杠杆: {leverage}x)")
if required_margin < min_margin_usdt:
# 保证金不足,需要增加仓位价值
required_position_value = min_margin_usdt * leverage
logger.warning(
f" ⚠ 保证金 {required_margin:.4f} USDT < 最小保证金要求 {min_margin_usdt:.2f} USDT"
)
logger.info(
f" 需要的最小仓位价值: {required_position_value:.2f} USDT "
f"(最小保证金 {min_margin_usdt:.2f} USDT × 杠杆 {leverage}x)"
)
# 检查是否可以使用更大的仓位价值(但不超过最大仓位限制)
max_position_value = available_balance * max_position_percent
if required_position_value <= max_position_value:
# 可以增加仓位价值以满足最小保证金要求
position_value = required_position_value
quantity = position_value / current_price
logger.info(
f" ✓ 调整仓位价值到 {position_value:.2f} USDT "
f"以满足最小保证金要求 (保证金: {min_margin_usdt:.2f} USDT)"
)
else:
# 即使使用最大仓位也无法满足最小保证金要求
max_margin = max_position_value / leverage
logger.warning(
f" ❌ 无法满足最小保证金要求: "
f"需要 {min_margin_usdt:.2f} USDT 保证金 (仓位价值 {required_position_value:.2f} USDT)"
f"但最大允许 {max_margin:.2f} USDT 保证金 (仓位价值 {max_position_value:.2f} USDT)"
)
logger.warning(
f" 💡 建议: 增加账户余额到至少 "
f"{required_position_value / max_position_percent:.2f} USDT "
f"才能满足最小保证金要求"
)
return None
# 检查是否通过风险控制
logger.info(f" 检查仓位大小是否符合风险控制要求...")
if await self.check_position_size(symbol, quantity):
logger.info(f"{symbol} 仓位计算成功: {quantity:.4f} (价值: {position_value:.2f} USDT, 名义价值: {quantity * current_price:.2f} USDT)")
final_margin = (quantity * current_price) / leverage
logger.info(
f"{symbol} 仓位计算成功: {quantity:.4f} "
f"(仓位价值: {position_value:.2f} USDT, "
f"名义价值: {quantity * current_price:.2f} USDT, "
f"保证金: {final_margin:.4f} USDT)"
)
return quantity
else:
logger.warning(f"{symbol} 仓位检查未通过,无法开仓")