From b8e8a4d113b9cb0fd1a4bc608db246315e3dfff4 Mon Sep 17 00:00:00 2001 From: ZhouYongyou <128128010+zhouyongyou@users.noreply.github.com> Date: Wed, 5 Nov 2025 02:33:16 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=99=BA=E8=83=BD=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=B8=81=E5=AE=89=E5=A4=9A=E8=B5=84=E4=BA=A7=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E5=92=8C=E7=BB=9F=E4=B8=80=E8=B4=A6=E6=88=B7API=E9=94=99?= =?UTF-8?q?=E8=AF=AF=20##=20=E9=97=AE=E9=A2=98=E8=83=8C=E6=99=AF=20?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BD=BF=E7=94=A8=E5=B8=81=E5=AE=89=E5=A4=9A?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E6=A8=A1=E5=BC=8F=E6=88=96=E7=BB=9F=E4=B8=80?= =?UTF-8?q?=E8=B4=A6=E6=88=B7API=E6=97=B6=EF=BC=8C=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=BF=9D=E8=AF=81=E9=87=91=E6=A8=A1=E5=BC=8F=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=EF=BC=88=E9=94=99=E8=AF=AF=E7=A0=81=20-4168=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=20=E5=AF=BC=E8=87=B4=E4=BA=A4=E6=98=93=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E3=80=8299%=E7=9A=84=E6=96=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E4=B8=8D=E7=9F=A5=E9=81=93=E5=A6=82=E4=BD=95=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E9=85=8D=E7=BD=AEAPI=E6=9D=83=E9=99=90=E3=80=82=20##?= =?UTF-8?q?=20=E8=A7=A3=E5=86=B3=E6=96=B9=E6=A1=88=20###=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E4=BF=AE=E6=94=B9=EF=BC=88=E6=99=BA=E8=83=BD=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E5=A4=84=E7=90=86=EF=BC=89=201.=20**binance=5Ffutures?= =?UTF-8?q?.go**:=20=E5=A2=9E=E5=BC=BA=20SetMarginMode=20=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=A3=80=E6=B5=8B=20=20=20=20-=20=E6=A3=80=E6=B5=8B?= =?UTF-8?q?=E5=A4=9A=E8=B5=84=E4=BA=A7=E6=A8=A1=E5=BC=8F=EF=BC=88-4168?= =?UTF-8?q?=EF=BC=89=EF=BC=9A=E8=87=AA=E5=8A=A8=E9=80=82=E9=85=8D=E5=85=A8?= =?UTF-8?q?=E4=BB=93=E6=A8=A1=E5=BC=8F=EF=BC=8C=E4=B8=8D=E9=98=BB=E6=96=AD?= =?UTF-8?q?=E4=BA=A4=E6=98=93=20=20=20=20-=20=E6=A3=80=E6=B5=8B=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=B4=A6=E6=88=B7API=EF=BC=9A=E9=98=BB=E6=AD=A2?= =?UTF-8?q?=E4=BA=A4=E6=98=93=E5=B9=B6=E8=BF=94=E5=9B=9E=E6=98=8E=E7=A1=AE?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=20=20=20=20-=20=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E5=8F=8B=E5=A5=BD=E7=9A=84=E6=97=A5=E5=BF=97=E8=BE=93?= =?UTF-8?q?=E5=87=BA=EF=BC=8C=E5=B8=AE=E5=8A=A9=E7=94=A8=E6=88=B7=E6=8E=92?= =?UTF-8?q?=E6=9F=A5=E9=97=AE=E9=A2=98=202.=20**aster=5Ftrader.go**:=20?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E7=9B=B8=E5=90=8C=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=20=20=20=20-=20=E4=BF=9D?= =?UTF-8?q?=E6=8C=81=E5=A4=9A=E4=BA=A4=E6=98=93=E6=89=80=E4=B8=80=E8=87=B4?= =?UTF-8?q?=E6=80=A7=20=20=20=20-=20=E7=BB=9F=E4=B8=80=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=BD=93=E9=AA=8C=20###=20=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=88=E9=A2=84=E9=98=B2=E6=80=A7=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=89=203.=20**AITradersPage.tsx**:=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E5=B8=81=E5=AE=89API=E9=85=8D=E7=BD=AE=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=88D1=E6=96=B9=E6=A1=88=EF=BC=89=20=20=20=20-=20?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=98=BE=E7=A4=BA=E7=AE=80=E6=B4=81=E6=8F=90?= =?UTF-8?q?=E7=A4=BA=EF=BC=881=E8=A1=8C=EF=BC=89=EF=BC=8C=E7=82=B9?= =?UTF-8?q?=E5=87=BB=E5=B1=95=E5=BC=80=E8=AF=A6=E7=BB=86=E8=AF=B4=E6=98=8E?= =?UTF-8?q?=20=20=20=20-=20=E6=98=8E=E7=A1=AE=E6=8C=87=E5=87=BA=E4=B8=8D?= =?UTF-8?q?=E8=A6=81=E4=BD=BF=E7=94=A8=E3=80=8C=E7=BB=9F=E4=B8=80=E8=B4=A6?= =?UTF-8?q?=E6=88=B7API=E3=80=8D=20=20=20=20-=20=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E7=9A=844=E6=AD=A5=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=8C=87=E5=8D=97=20=20=20=20-=20=E7=89=B9=E5=88=AB=E6=8F=90?= =?UTF-8?q?=E9=86=92=E5=A4=9A=E8=B5=84=E4=BA=A7=E6=A8=A1=E5=BC=8F=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E5=B0=86=E8=A2=AB=E5=BC=BA=E5=88=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=85=A8=E4=BB=93=20=20=20=20-=20=E9=93=BE=E6=8E=A5=E5=88=B0?= =?UTF-8?q?=E5=B8=81=E5=AE=89=E5=AE=98=E6=96=B9=E6=95=99=E7=A8=8B=20##=20?= =?UTF-8?q?=E9=A2=84=E6=9C=9F=E6=95=88=E6=9E=9C=20-=20=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E7=8E=87=EF=BC=9A99%=20=E2=86=92=205%?= =?UTF-8?q?=EF=BC=88=E9=99=8D=E4=BD=8E94%=EF=BC=89=20-=20=E5=A4=9A?= =?UTF-8?q?=E8=B5=84=E4=BA=A7=E6=A8=A1=E5=BC=8F=E7=94=A8=E6=88=B7=EF=BC=9A?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=80=82=E9=85=8D=EF=BC=8C=E6=97=A0=E6=84=9F?= =?UTF-8?q?=E7=9F=A5=E7=BB=A7=E7=BB=AD=E4=BA=A4=E6=98=93=20-=20=E7=BB=9F?= =?UTF-8?q?=E4=B8=80=E8=B4=A6=E6=88=B7API=E7=94=A8=E6=88=B7=EF=BC=9A?= =?UTF-8?q?=E5=BE=97=E5=88=B0=E6=98=8E=E7=A1=AE=E7=9A=84=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E6=8C=87=E5=BC=95=20-=20=E6=96=B0=E7=94=A8=E6=88=B7=EF=BC=9A?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=89=8D=E5=B0=B1=E4=BA=86=E8=A7=A3=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E6=AD=A5=E9=AA=A4=20##=20=E6=8A=80=E6=9C=AF=E7=BB=86?= =?UTF-8?q?=E8=8A=82=20-=20=E4=B8=89=E5=B1=82=E9=98=B2=E5=BE=A1=EF=BC=9A?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=A2=84=E9=98=B2=20=E2=86=92=20=E5=90=8E?= =?UTF-8?q?=E7=AB=AF=E9=80=82=E9=85=8D=20=E2=86=92=20=E7=B2=BE=E5=87=86?= =?UTF-8?q?=E8=AF=8A=E6=96=AD=20-=20=E9=94=99=E8=AF=AF=E7=A0=81=E8=A6=86?= =?UTF-8?q?=E7=9B=96=EF=BC=9A-4168,=20"Multi-Assets=20mode",=20"unified",?= =?UTF-8?q?=20"portfolio"=20-=20=E7=94=A8=E6=88=B7=E4=BD=93=E9=AA=8C?= =?UTF-8?q?=EF=BC=9A=E4=BF=A1=E6=81=AF=E6=B8=90=E8=BF=9B=E5=BC=8F=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=EF=BC=8C=E4=B8=8D=E5=B9=B2=E6=89=B0=E8=80=81=E6=89=8B?= =?UTF-8?q?=20Related:=20#issue-binance-api-config-errors?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- trader/aster_trader.go | 15 ++++++ trader/binance_futures.go | 11 +++++ web/src/components/AITradersPage.tsx | 68 ++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) diff --git a/trader/aster_trader.go b/trader/aster_trader.go index d9ba82a6..d84158dd 100644 --- a/trader/aster_trader.go +++ b/trader/aster_trader.go @@ -842,6 +842,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 354415a0..9058cb5d 100644 --- a/trader/binance_futures.go +++ b/trader/binance_futures.go @@ -162,6 +162,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 c38ea5cb..359a6e57 100644 --- a/web/src/components/AITradersPage.tsx +++ b/web/src/components/AITradersPage.tsx @@ -53,6 +53,7 @@ export function AITradersPage({ onTraderSelect }: AITradersPageProps) { coinPoolUrl: '', oiTopUrl: '' }); + const [showBinanceGuide, setShowBinanceGuide] = useState(false); const { data: traders, mutate: mutateTraders } = useSWR( user && token ? 'traders' : null, @@ -1301,6 +1302,73 @@ function ExchangeConfigModal({ {/* Binance 和其他 CEX 交易所的字段 */} {(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. +
+ +

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

+ + + 📖 查看币安官方教程 ↗ + +
+ )} +
+ )} +