diff --git a/trader/aster_trader.go b/trader/aster_trader.go index d1523368..73570dbc 100644 --- a/trader/aster_trader.go +++ b/trader/aster_trader.go @@ -866,6 +866,21 @@ func (t *AsterTrader) SetMarginMode(symbol string, isCrossMargin bool) error { log.Printf(" ✓ %s 仓位模式已是 %s 或有持仓无法更改", symbol, marginType) return nil } + // 检测多资产模式(错误码 -4168) + if strings.Contains(err.Error(), "Multi-Assets mode") || + strings.Contains(err.Error(), "-4168") || + strings.Contains(err.Error(), "4168") { + log.Printf(" ⚠️ %s 检测到多资产模式,强制使用全仓模式", symbol) + log.Printf(" 💡 提示:如需使用逐仓模式,请在交易所关闭多资产模式") + return nil + } + // 检测统一账户 API + if strings.Contains(err.Error(), "unified") || + strings.Contains(err.Error(), "portfolio") || + strings.Contains(err.Error(), "Portfolio") { + log.Printf(" ❌ %s 检测到统一账户 API,无法进行合约交易", symbol) + return fmt.Errorf("请使用「现货与合约交易」API 权限,不要使用「统一账户 API」") + } log.Printf(" ⚠️ 设置仓位模式失败: %v", err) // 不返回错误,让交易继续 return nil diff --git a/trader/binance_futures.go b/trader/binance_futures.go index f14ca726..29cd42f6 100644 --- a/trader/binance_futures.go +++ b/trader/binance_futures.go @@ -193,6 +193,17 @@ func (t *FuturesTrader) SetMarginMode(symbol string, isCrossMargin bool) error { log.Printf(" ⚠️ %s 有持仓,无法更改仓位模式,继续使用当前模式", symbol) return nil } + // 检测多资产模式(错误码 -4168) + if contains(err.Error(), "Multi-Assets mode") || contains(err.Error(), "-4168") || contains(err.Error(), "4168") { + log.Printf(" ⚠️ %s 检测到多资产模式,强制使用全仓模式", symbol) + log.Printf(" 💡 提示:如需使用逐仓模式,请在币安关闭多资产模式") + return nil + } + // 检测统一账户 API(Portfolio Margin) + if contains(err.Error(), "unified") || contains(err.Error(), "portfolio") || contains(err.Error(), "Portfolio") { + log.Printf(" ❌ %s 检测到统一账户 API,无法进行合约交易", symbol) + return fmt.Errorf("请使用「现货与合约交易」API 权限,不要使用「统一账户 API」") + } log.Printf(" ⚠️ 设置仓位模式失败: %v", err) // 不返回错误,让交易继续 return nil diff --git a/web/src/components/AITradersPage.tsx b/web/src/components/AITradersPage.tsx index a19e7097..2f7c3113 100644 --- a/web/src/components/AITradersPage.tsx +++ b/web/src/components/AITradersPage.tsx @@ -1530,14 +1530,18 @@ function ExchangeConfigModal({ onClose: () => void language: Language }) { - const [selectedExchangeId, setSelectedExchangeId] = useState( - editingExchangeId || '' - ) - const [apiKey, setApiKey] = useState('') - const [secretKey, setSecretKey] = useState('') - const [passphrase, setPassphrase] = useState('') - const [testnet, setTestnet] = useState(false) - const [showGuide, setShowGuide] = useState(false) + const [selectedExchangeId, setSelectedExchangeId] = useState(editingExchangeId || ''); + const [apiKey, setApiKey] = useState(''); + const [secretKey, setSecretKey] = useState(''); + const [passphrase, setPassphrase] = useState(''); + const [testnet, setTestnet] = useState(false); + const [showGuide, setShowGuide] = useState(false); + + // 币安配置指南展开状态 + const [showBinanceGuide, setShowBinanceGuide] = useState(false); + + // Hyperliquid 特定字段 + const [hyperliquidWalletAddr, setHyperliquidWalletAddr] = useState(''); // Aster 特定字段 const [asterUser, setAsterUser] = useState('') @@ -1708,32 +1712,104 @@ function ExchangeConfigModal({ {selectedExchange && ( <> {/* Binance 和其他 CEX 交易所的字段 */} - {(selectedExchange.id === 'binance' || - selectedExchange.type === 'cex') && - selectedExchange.id !== 'hyperliquid' && - selectedExchange.id !== 'aster' && ( - <> -
- - setApiKey(e.target.value)} - placeholder={t('enterAPIKey', language)} - className="w-full px-3 py-2 rounded" - style={{ - background: '#0B0E11', - border: '1px solid #2B3139', - color: '#EAECEF', - }} - required - /> + {(selectedExchange.id === 'binance' || selectedExchange.type === 'cex') && selectedExchange.id !== 'hyperliquid' && selectedExchange.id !== 'aster' && ( + <> + {/* 币安用户配置提示 (D1 方案) */} + {selectedExchange.id === 'binance' && ( +
setShowBinanceGuide(!showBinanceGuide)} + > +
+
+ ℹ️ + + 币安用户必读: + 使用「现货与合约交易」API,不要用「统一账户 API」 + +
+ + {showBinanceGuide ? '▲' : '▼'} + +
+ + {/* 展开的详细说明 */} + {showBinanceGuide && ( +
e.stopPropagation()} + > +

+ 原因:统一账户 API 权限结构不同,会导致订单提交失败 +

+ +

+ 正确配置步骤: +

+
    +
  1. 登录币安 → 个人中心 → API 管理
  2. +
  3. 创建 API → 选择「系统生成的 API 密钥
  4. +
  5. 勾选「现货与合约交易」(不选统一账户
  6. +
  7. IP 限制选「无限制」或添加服务器 IP
  8. +
+ +

+ 💡 多资产模式用户注意: + 如果您开启了多资产模式,将强制使用全仓模式。建议关闭多资产模式以支持逐仓交易。 +

+ + + 📖 查看币安官方教程 ↗ + +
+ )}
+ )} + +
+ + setApiKey(e.target.value)} + placeholder={t('enterAPIKey', language)} + className="w-full px-3 py-2 rounded" + style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} + required + /> +
+ +
+ + setSecretKey(e.target.value)} + placeholder={t('enterSecretKey', language)} + className="w-full px-3 py-2 rounded" + style={{ background: '#0B0E11', border: '1px solid #2B3139', color: '#EAECEF' }} + required + /> +