@@ -331,7 +331,21 @@ func buildSystemPrompt(accountEquity float64, btcEthLeverage, altcoinLeverage in
331331 accountEquity * 0.8 , accountEquity * 1.5 , accountEquity * 5 , accountEquity * 10 ))
332332 sb .WriteString (fmt .Sprintf ("4. 杠杆限制: **山寨币最大%dx杠杆** | **BTC/ETH最大%dx杠杆** (⚠️ 严格执行,不可超过)\n " , altcoinLeverage , btcEthLeverage ))
333333 sb .WriteString ("5. 保证金: 总使用率 ≤ 90%\n " )
334- sb .WriteString ("6. 开仓金额: 建议 **≥12 USDT** (交易所最小名义价值 10 USDT + 安全边际)\n \n " )
334+
335+ // 6. 开仓金额:根据账户规模动态提示
336+ sb .WriteString ("6. 开仓金额: 山寨币≥12 USDT" )
337+ if accountEquity < 20.0 {
338+ // 小账户特殊提示
339+ sb .WriteString (" | BTC/ETH≥12 USDT (⚠️ 小账户模式,降低门槛)" )
340+ } else if accountEquity < 100.0 {
341+ // 中型账户动态门槛
342+ minBTCETH := calculateMinPositionSize ("BTCUSDT" , accountEquity )
343+ sb .WriteString (fmt .Sprintf (" | BTC/ETH≥%.0f USDT (根据账户规模动态调整)" , minBTCETH ))
344+ } else {
345+ // 大账户标准门槛
346+ sb .WriteString (" | BTC/ETH≥60 USDT" )
347+ }
348+ sb .WriteString ("\n \n " )
335349
336350 // 3. 输出格式 - 动态生成
337351 sb .WriteString ("# 输出格式 (严格遵守)\n \n " )
@@ -701,6 +715,36 @@ func findMatchingBracket(s string, start int) int {
701715 return - 1
702716}
703717
718+ // calculateMinPositionSize 根据账户净值和币种动态计算最小开仓金额
719+ func calculateMinPositionSize (symbol string , accountEquity float64 ) float64 {
720+ const (
721+ absoluteMinimum = 12.0 // 交易所绝对最小值 (10 USDT + 20% 安全边际)
722+ standardBTCETH = 60.0 // 标准 BTC/ETH 最小值 (因价格高和精度限制)
723+ )
724+
725+ isBTCETH := symbol == "BTCUSDT" || symbol == "ETHUSDT"
726+
727+ // 山寨币始终使用绝对最小值
728+ if ! isBTCETH {
729+ return absoluteMinimum
730+ }
731+
732+ // BTC/ETH 动态调整策略
733+ // 小账户(<20U): 使用绝对最小值,避免完全无法交易
734+ if accountEquity < 20.0 {
735+ return absoluteMinimum
736+ }
737+
738+ // 中型账户(20-100U): 线性插值,平滑过渡
739+ // 例: 20U账户→12U, 60U账户→36U, 100U账户→60U
740+ if accountEquity < 100.0 {
741+ return absoluteMinimum + (standardBTCETH - absoluteMinimum )* (accountEquity - 20.0 )/ 80.0
742+ }
743+
744+ // 大账户(≥100U): 使用标准值
745+ return standardBTCETH
746+ }
747+
704748// validateDecision 验证单个决策的有效性
705749func validateDecision (d * Decision , accountEquity float64 , btcEthLeverage , altcoinLeverage int ) error {
706750 // 验证action
@@ -744,18 +788,17 @@ func validateDecision(d *Decision, accountEquity float64, btcEthLeverage, altcoi
744788 }
745789
746790 // ✅ 验证最小开仓金额(防止数量格式化为 0 的错误)
747- // Binance 最小名义价值 10 USDT + 安全边际
748- const minPositionSizeGeneral = 12.0 // 10 + 20% 安全边际
749- const minPositionSizeBTCETH = 60.0 // BTC/ETH 因价格高和精度限制需要更大金额(更灵活)
750-
751- if d .Symbol == "BTCUSDT" || d .Symbol == "ETHUSDT" {
752- if d .PositionSizeUSD < minPositionSizeBTCETH {
753- return fmt .Errorf ("%s 开仓金额过小(%.2f USDT),必须≥%.2f USDT(因价格高且精度限制,避免数量四舍五入为0)" , d .Symbol , d .PositionSizeUSD , minPositionSizeBTCETH )
754- }
755- } else {
756- if d .PositionSizeUSD < minPositionSizeGeneral {
757- return fmt .Errorf ("开仓金额过小(%.2f USDT),必须≥%.2f USDT(Binance 最小名义价值要求)" , d .PositionSizeUSD , minPositionSizeGeneral )
791+ // 使用动态计算函数,根据账户规模自适应调整
792+ minPositionSize := calculateMinPositionSize (d .Symbol , accountEquity )
793+ if d .PositionSizeUSD < minPositionSize {
794+ // 小账户特殊提示:引导用户理解动态门槛
795+ if accountEquity < 20.0 && (d .Symbol == "BTCUSDT" || d .Symbol == "ETHUSDT" ) {
796+ return fmt .Errorf ("%s 开仓金额过小(%.2f USDT),当前账户规模(%.2f USDT)要求≥%.2f USDT(小账户动态调整)" ,
797+ d .Symbol , d .PositionSizeUSD , accountEquity , minPositionSize )
758798 }
799+ // 通用错误提示
800+ return fmt .Errorf ("开仓金额过小(%.2f USDT),必须≥%.2f USDT(交易所最小名义价值要求)" ,
801+ d .PositionSizeUSD , minPositionSize )
759802 }
760803
761804 // 验证仓位价值上限(加1%容差以避免浮点数精度问题)
0 commit comments