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' && ( - <> -
+ 原因:统一账户 API 权限结构不同,会导致订单提交失败 +
+ ++ 正确配置步骤: +
++ 💡 多资产模式用户注意: + 如果您开启了多资产模式,将强制使用全仓模式。建议关闭多资产模式以支持逐仓交易。 +
+ + + 📖 查看币安官方教程 ↗ + +