From 4c21989328cfd342ef81f05e55411945ac5de537 Mon Sep 17 00:00:00 2001 From: nobody <878822589@qq.com> Date: Thu, 30 Oct 2025 00:41:14 +0800 Subject: [PATCH] Update readmes. --- COMMIT_MESSAGE.txt | 2 + README.ru.md | 164 ++++++++++++++++++++++++++++++++++++++++- README.uk.md | 164 ++++++++++++++++++++++++++++++++++++++++- README.zh-CN.md | 164 ++++++++++++++++++++++++++++++++++++++++- trader/aster_trader.go | 49 ++++++++++++ 5 files changed, 540 insertions(+), 3 deletions(-) diff --git a/COMMIT_MESSAGE.txt b/COMMIT_MESSAGE.txt index 85d0fd23..53f4f6e7 100644 --- a/COMMIT_MESSAGE.txt +++ b/COMMIT_MESSAGE.txt @@ -8,8 +8,10 @@ feat: Add Aster DEX exchange support + fix precision issues ## Bug Fixes - Fix precision error (code -1111) for all order types +- Fix "Quantity less than zero" error (code -4003) when closing positions - Implement proper float-to-string conversion with exchange precision - Add automatic precision fetching from /exchangeInfo endpoint +- Add quantity=0 handling in CloseLong/CloseShort (auto-detect position size) - Remove trailing zeros from formatted values ## Documentation diff --git a/README.ru.md b/README.ru.md index 9febe179..ed819e70 100644 --- a/README.ru.md +++ b/README.ru.md @@ -9,7 +9,7 @@ --- -Автоматизированная система торговли фьючерсами Binance на базе **DeepSeek/Qwen AI**, поддерживающая **конкуренцию нескольких AI-моделей в реальной торговле**, с полным анализом рынка, принятием решений AI, **механизмом самообучения** и профессиональным веб-интерфейсом мониторинга. +Автоматизированная система торговли криптовалютными фьючерсами на базе **DeepSeek/Qwen AI**, поддерживающая **Binance, Hyperliquid и Aster DEX биржи**, **конкуренцию нескольких AI-моделей в реальной торговле**, с полным анализом рынка, принятием решений AI, **механизмом самообучения** и профессиональным веб-интерфейсом мониторинга. > ⚠️ **Предупреждение о рисках**: Эта система экспериментальная. Автоматическая торговля с AI несет значительные риски. Настоятельно рекомендуется использовать только для обучения/исследований или тестирования с небольшими суммами! @@ -21,6 +21,63 @@ --- +## 🆕 Последние обновления + +### 🚀 Поддержка нескольких бирж! + +NOFX теперь поддерживает **три основные биржи**: Binance, Hyperliquid и Aster DEX! + +#### **Биржа Hyperliquid** + +Высокопроизводительная децентрализованная биржа бессрочных фьючерсов! + +**Ключевые особенности:** +- ✅ Полная поддержка торговли (лонг/шорт, плечо, стоп-лосс/тейк-профит) +- ✅ Автоматическая обработка точности (размер и цена ордера) +- ✅ Единый интерфейс трейдера (бесшовное переключение бирж) +- ✅ Поддержка мейннета и тестнета +- ✅ Не нужны API ключи - только приватный ключ Ethereum + +**Почему Hyperliquid?** +- 🔥 Более низкие комиссии чем на централизованных биржах +- 🔒 Без хранения - вы контролируете свои средства +- ⚡ Быстрое исполнение с расчетом на цепи +- 🌍 Не нужна KYC + +**Быстрый старт:** +1. Получите приватный ключ MetaMask (удалите префикс `0x`) +2. Установите `"exchange": "hyperliquid"` в config.json +3. Добавьте `"hyperliquid_private_key": "your_key"` +4. Начните торговать! + +См. [Руководство по конфигурации](#-альтернатива-использование-биржи-hyperliquid). + +#### **Биржа Aster DEX** (НОВОЕ! v2.0.2) + +Децентрализованная биржа бессрочных фьючерсов, совместимая с Binance! + +**Ключевые особенности:** +- ✅ API в стиле Binance (легкая миграция с Binance) +- ✅ Web3 аутентификация кошелька (безопасно и децентрализованно) +- ✅ Полная поддержка торговли с автоматической обработкой точности +- ✅ Более низкие комиссии за торговлю чем CEX +- ✅ Совместимость с EVM (Ethereum, BSC, Polygon и т.д.) + +**Почему Aster?** +- 🎯 **API совместимый с Binance** - нужны минимальные изменения кода +- 🔐 **Система API кошелька** - отдельный торговый кошелек для безопасности +- 💰 **Конкурентные комиссии** - ниже чем большинство централизованных бирж +- 🌐 **Поддержка нескольких цепей** - торгуйте на вашей любимой EVM цепи + +**Быстрый старт:** +1. Посетите [Aster API Wallet](https://www.asterdex.com/en/api-wallet) +2. Подключите основной кошелек и создайте API кошелек +3. Скопируйте адрес API Signer и приватный ключ +4. Установите `"exchange": "aster"` в config.json +5. Добавьте `"aster_user"`, `"aster_signer"` и `"aster_private_key"` + +--- + ## ✨ Основные возможности ### 🏆 Режим конкуренции нескольких AI @@ -308,6 +365,111 @@ cp config.json.example config.json --- +#### 🔷 Альтернатива: Использование биржи Hyperliquid + +**NOFX также поддерживает Hyperliquid** - децентрализованную биржу бессрочных фьючерсов. Чтобы использовать Hyperliquid вместо Binance: + +**Шаг 1**: Получите приватный ключ Ethereum (для аутентификации Hyperliquid) + +1. Откройте **MetaMask** (или любой Ethereum кошелек) +2. Экспортируйте приватный ключ +3. **Удалите префикс `0x`** из ключа +4. Пополните кошелек на [Hyperliquid](https://hyperliquid.xyz) + +**Шаг 2**: Настройте `config.json` для Hyperliquid + +```json +{ + "traders": [ + { + "id": "hyperliquid_trader", + "name": "My Hyperliquid Trader", + "ai_model": "deepseek", + "exchange": "hyperliquid", + "hyperliquid_private_key": "your_private_key_without_0x", + "hyperliquid_testnet": false, + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +**Ключевые отличия от конфигурации Binance:** +- Замените `binance_api_key` + `binance_secret_key` на `hyperliquid_private_key` +- Добавьте поле `"exchange": "hyperliquid"` +- Установите `hyperliquid_testnet: false` для мейннета (или `true` для тестнета) + +**⚠️ Предупреждение безопасности**: Никогда не делитесь приватным ключом! Используйте отдельный кошелек для торговли, а не основной. + +--- + +#### 🔶 Альтернатива: Использование биржи Aster DEX + +**NOFX также поддерживает Aster DEX** - децентрализованную биржу бессрочных фьючерсов, совместимую с Binance! + +**Почему выбрать Aster?** +- 🎯 API совместимый с Binance (легкая миграция) +- 🔐 Система безопасности API кошелька +- 💰 Более низкие комиссии за торговлю +- 🌐 Поддержка нескольких цепей (ETH, BSC, Polygon) +- 🌍 Не нужна KYC + +**Шаг 1**: Создайте Aster API кошелек + +1. Посетите [Aster API Wallet](https://www.asterdex.com/en/api-wallet) +2. Подключите основной кошелек (MetaMask, WalletConnect и т.д.) +3. Нажмите "Создать API кошелек" +4. **Сохраните эти 3 элемента немедленно:** + - Адрес основного кошелька (User) + - Адрес API кошелька (Signer) + - Приватный ключ API кошелька (⚠️ показывается только один раз!) + +**Шаг 2**: Настройте `config.json` для Aster + +```json +{ + "traders": [ + { + "id": "aster_deepseek", + "name": "Aster DeepSeek Trader", + "ai_model": "deepseek", + "exchange": "aster", + + "aster_user": "0x63DD5aCC6b1aa0f563956C0e534DD30B6dcF7C4e", + "aster_signer": "0x21cF8Ae13Bb72632562c6Fff438652Ba1a151bb0", + "aster_private_key": "4fd0a42218f3eae43a6ce26d22544e986139a01e5b34a62db53757ffca81bae1", + + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080, + "leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 + } +} +``` + +**Ключевые поля конфигурации:** +- `"exchange": "aster"` - Установите биржу на Aster +- `aster_user` - Адрес вашего основного кошелька +- `aster_signer` - Адрес API кошелька (из Шага 1) +- `aster_private_key` - Приватный ключ API кошелька (без префикса `0x`) + +**⚠️ Примечания безопасности**: +- API кошелек отдельный от основного (дополнительный уровень безопасности) +- Никогда не делитесь приватным ключом API +- Вы можете отозвать доступ API кошелька в любое время на [asterdex.com](https://www.asterdex.com/en/api-wallet) + +--- + #### ⚔️ Экспертный режим: Конкуренция нескольких трейдеров Для запуска нескольких AI трейдеров, конкурирующих друг с другом: diff --git a/README.uk.md b/README.uk.md index b5afe3fb..e37be6d8 100644 --- a/README.uk.md +++ b/README.uk.md @@ -9,7 +9,7 @@ --- -Автоматизована система торгівлі ф'ючерсами Binance на базі **DeepSeek/Qwen AI**, що підтримує **змагання кількох AI-моделей у реальній торгівлі**, з повним аналізом ринку, прийняттям рішень AI, **механізмом самонавчання** та професійним веб-інтерфейсом моніторингу. +Автоматизована система торгівлі криптовалютними ф'ючерсами на базі **DeepSeek/Qwen AI**, що підтримує **Binance, Hyperliquid та Aster DEX біржі**, **змагання кількох AI-моделей у реальній торгівлі**, з повним аналізом ринку, прийняттям рішень AI, **механізмом самонавчання** та професійним веб-інтерфейсом моніторингу. > ⚠️ **Попередження про ризики**: Ця система експериментальна. Автоматична торгівля з AI несе значні ризики. Наполегливо рекомендується використовувати лише для навчання/досліджень або тестування з невеликими сумами! @@ -21,6 +21,63 @@ --- +## 🆕 Останні оновлення + +### 🚀 Підтримка кількох бірж! + +NOFX тепер підтримує **три основні біржі**: Binance, Hyperliquid та Aster DEX! + +#### **Біржа Hyperliquid** + +Високопродуктивна децентралізована біржа безстрокових ф'ючерсів! + +**Ключові особливості:** +- ✅ Повна підтримка торгівлі (лонг/шорт, плече, стоп-лосс/тейк-профіт) +- ✅ Автоматична обробка точності (розмір та ціна ордера) +- ✅ Єдиний інтерфейс трейдера (безшовне перемикання бірж) +- ✅ Підтримка мейннету та тестнету +- ✅ Не потрібні API ключі - тільки приватний ключ Ethereum + +**Чому Hyperliquid?** +- 🔥 Нижчі комісії ніж на централізованих біржах +- 🔒 Без зберігання - ви контролюєте свої кошти +- ⚡ Швидке виконання з розрахунком на ланцюзі +- 🌍 Не потрібна KYC + +**Швидкий старт:** +1. Отримайте приватний ключ MetaMask (видаліть префікс `0x`) +2. Встановіть `"exchange": "hyperliquid"` в config.json +3. Додайте `"hyperliquid_private_key": "your_key"` +4. Почніть торгувати! + +Див. [Посібник з конфігурації](#-альтернатива-використання-біржі-hyperliquid). + +#### **Біржа Aster DEX** (НОВЕ! v2.0.2) + +Децентралізована біржа безстрокових ф'ючерсів, сумісна з Binance! + +**Ключові особливості:** +- ✅ API в стилі Binance (легка міграція з Binance) +- ✅ Web3 автентифікація гаманця (безпечно та децентралізовано) +- ✅ Повна підтримка торгівлі з автоматичною обробкою точності +- ✅ Нижчі комісії за торгівлю ніж CEX +- ✅ Сумісність з EVM (Ethereum, BSC, Polygon тощо) + +**Чому Aster?** +- 🎯 **API сумісний з Binance** - потрібні мінімальні зміни коду +- 🔐 **Система API гаманця** - окремий торговий гаманець для безпеки +- 💰 **Конкурентні комісії** - нижче ніж більшість централізованих бірж +- 🌐 **Підтримка кількох ланцюгів** - торгуйте на вашому улюбленому EVM ланцюзі + +**Швидкий старт:** +1. Відвідайте [Aster API Wallet](https://www.asterdex.com/en/api-wallet) +2. Підключіть основний гаманець і створіть API гаманець +3. Скопіюйте адресу API Signer та приватний ключ +4. Встановіть `"exchange": "aster"` в config.json +5. Додайте `"aster_user"`, `"aster_signer"` та `"aster_private_key"` + +--- + ## ✨ Основні можливості ### 🏆 Режим змагання кількох AI @@ -308,6 +365,111 @@ cp config.json.example config.json --- +#### 🔷 Альтернатива: Використання біржі Hyperliquid + +**NOFX також підтримує Hyperliquid** - децентралізовану біржу безстрокових ф'ючерсів. Щоб використовувати Hyperliquid замість Binance: + +**Крок 1**: Отримайте приватний ключ Ethereum (для автентифікації Hyperliquid) + +1. Відкрийте **MetaMask** (або будь-який Ethereum гаманець) +2. Експортуйте приватний ключ +3. **Видаліть префікс `0x`** з ключа +4. Поповніть гаманець на [Hyperliquid](https://hyperliquid.xyz) + +**Крок 2**: Налаштуйте `config.json` для Hyperliquid + +```json +{ + "traders": [ + { + "id": "hyperliquid_trader", + "name": "My Hyperliquid Trader", + "ai_model": "deepseek", + "exchange": "hyperliquid", + "hyperliquid_private_key": "your_private_key_without_0x", + "hyperliquid_testnet": false, + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +**Ключові відмінності від конфігурації Binance:** +- Замініть `binance_api_key` + `binance_secret_key` на `hyperliquid_private_key` +- Додайте поле `"exchange": "hyperliquid"` +- Встановіть `hyperliquid_testnet: false` для мейннету (або `true` для тестнету) + +**⚠️ Попередження безпеки**: Ніколи не діліться приватним ключем! Використовуйте окремий гаманець для торгівлі, а не основний. + +--- + +#### 🔶 Альтернатива: Використання біржі Aster DEX + +**NOFX також підтримує Aster DEX** - децентралізовану біржу безстрокових ф'ючерсів, сумісну з Binance! + +**Чому обрати Aster?** +- 🎯 API сумісний з Binance (легка міграція) +- 🔐 Система безпеки API гаманця +- 💰 Нижчі комісії за торгівлю +- 🌐 Підтримка кількох ланцюгів (ETH, BSC, Polygon) +- 🌍 Не потрібна KYC + +**Крок 1**: Створіть Aster API гаманець + +1. Відвідайте [Aster API Wallet](https://www.asterdex.com/en/api-wallet) +2. Підключіть основний гаманець (MetaMask, WalletConnect тощо) +3. Натисніть "Створити API гаманець" +4. **Збережіть ці 3 елементи негайно:** + - Адреса основного гаманця (User) + - Адреса API гаманця (Signer) + - Приватний ключ API гаманця (⚠️ показується лише один раз!) + +**Крок 2**: Налаштуйте `config.json` для Aster + +```json +{ + "traders": [ + { + "id": "aster_deepseek", + "name": "Aster DeepSeek Trader", + "ai_model": "deepseek", + "exchange": "aster", + + "aster_user": "0x63DD5aCC6b1aa0f563956C0e534DD30B6dcF7C4e", + "aster_signer": "0x21cF8Ae13Bb72632562c6Fff438652Ba1a151bb0", + "aster_private_key": "4fd0a42218f3eae43a6ce26d22544e986139a01e5b34a62db53757ffca81bae1", + + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080, + "leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 + } +} +``` + +**Ключові поля конфігурації:** +- `"exchange": "aster"` - Встановіть біржу на Aster +- `aster_user` - Адреса вашого основного гаманця +- `aster_signer` - Адреса API гаманця (з Кроку 1) +- `aster_private_key` - Приватний ключ API гаманця (без префікса `0x`) + +**⚠️ Примітки безпеки**: +- API гаманець окремий від основного (додатковий рівень безпеки) +- Ніколи не діліться приватним ключем API +- Ви можете відкликати доступ API гаманця в будь-який час на [asterdex.com](https://www.asterdex.com/en/api-wallet) + +--- + #### ⚔️ Експертний режим: Змагання кількох трейдерів Для запуску кількох AI трейдерів, що змагаються один з одним: diff --git a/README.zh-CN.md b/README.zh-CN.md index 4fbabdde..b08b7a55 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -9,7 +9,7 @@ --- -一个基于 **DeepSeek/Qwen AI** 的币安合约自动交易系统,支持**多AI模型实盘竞赛**,具备完整的市场分析、AI决策、**自我学习机制**和专业的Web监控界面。 +一个基于 **DeepSeek/Qwen AI** 的加密货币期货自动交易系统,支持 **Binance、Hyperliquid和Aster DEX交易所**,**多AI模型实盘竞赛**,具备完整的市场分析、AI决策、**自我学习机制**和专业的Web监控界面。 > ⚠️ **风险提示**:本系统为实验性项目,AI自动交易存在重大风险,强烈建议仅用于学习研究或小额资金测试! @@ -21,6 +21,63 @@ --- +## 🆕 最新更新 + +### 🚀 多交易所支持! + +NOFX现已支持**三大交易所**:Binance、Hyperliquid和Aster DEX! + +#### **Hyperliquid交易所** + +高性能的去中心化永续期货交易所! + +**核心特性:** +- ✅ 完整交易支持(做多/做空、杠杆、止损/止盈) +- ✅ 自动精度处理(订单数量和价格) +- ✅ 统一trader接口(无缝切换交易所) +- ✅ 支持主网和测试网 +- ✅ 无需API密钥 - 只需以太坊私钥 + +**为什么选择Hyperliquid?** +- 🔥 比中心化交易所手续费更低 +- 🔒 非托管 - 你掌控自己的资金 +- ⚡ 快速执行与链上结算 +- 🌍 无需KYC + +**快速开始:** +1. 获取你的MetaMask私钥(去掉`0x`前缀) +2. 在config.json中设置`"exchange": "hyperliquid"` +3. 添加`"hyperliquid_private_key": "your_key"` +4. 开始交易! + +详见[配置指南](#-备选使用hyperliquid交易所)。 + +#### **Aster DEX交易所**(新!v2.0.2) + +兼容Binance的去中心化永续期货交易所! + +**核心特性:** +- ✅ Binance风格API(从Binance轻松迁移) +- ✅ Web3钱包认证(安全且去中心化) +- ✅ 完整交易支持,自动精度处理 +- ✅ 比中心化交易所手续费更低 +- ✅ 兼容EVM(以太坊、BSC、Polygon等) + +**为什么选择Aster?** +- 🎯 **兼容Binance API** - 需要最少的代码修改 +- 🔐 **API钱包系统** - 独立交易钱包提升安全性 +- 💰 **有竞争力的手续费** - 比大多数中心化交易所更低 +- 🌐 **多链支持** - 在你喜欢的EVM链上交易 + +**快速开始:** +1. 访问[Aster API钱包](https://www.asterdex.com/en/api-wallet) +2. 连接你的主钱包并创建API钱包 +3. 复制API Signer地址和私钥 +4. 在config.json中设置`"exchange": "aster"` +5. 添加`"aster_user"`、`"aster_signer"`和`"aster_private_key"` + +--- + ## ✨ 核心特性 ### 🏆 多AI竞赛模式 @@ -371,6 +428,111 @@ cp config.json.example config.json --- +#### 🔷 备选:使用Hyperliquid交易所 + +**NOFX也支持Hyperliquid** - 去中心化永续期货交易所。使用Hyperliquid而非Binance: + +**步骤1**:获取以太坊私钥(用于Hyperliquid身份验证) + +1. 打开**MetaMask**(或任何以太坊钱包) +2. 导出你的私钥 +3. **去掉`0x`前缀** +4. 在[Hyperliquid](https://hyperliquid.xyz)上为钱包充值 + +**步骤2**:为Hyperliquid配置`config.json` + +```json +{ + "traders": [ + { + "id": "hyperliquid_trader", + "name": "My Hyperliquid Trader", + "ai_model": "deepseek", + "exchange": "hyperliquid", + "hyperliquid_private_key": "your_private_key_without_0x", + "hyperliquid_testnet": false, + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080 +} +``` + +**与Binance配置的关键区别:** +- 用`hyperliquid_private_key`替换`binance_api_key` + `binance_secret_key` +- 添加`"exchange": "hyperliquid"`字段 +- 设置`hyperliquid_testnet: false`用于主网(或`true`用于测试网) + +**⚠️ 安全警告**:切勿分享你的私钥!使用专门的钱包进行交易,而非主钱包。 + +--- + +#### 🔶 备选:使用Aster DEX交易所 + +**NOFX也支持Aster DEX** - 兼容Binance的去中心化永续期货交易所! + +**为什么选择Aster?** +- 🎯 兼容Binance API(轻松迁移) +- 🔐 API钱包安全系统 +- 💰 更低的交易手续费 +- 🌐 多链支持(ETH、BSC、Polygon) +- 🌍 无需KYC + +**步骤1**:创建Aster API钱包 + +1. 访问[Aster API钱包](https://www.asterdex.com/en/api-wallet) +2. 连接你的主钱包(MetaMask、WalletConnect等) +3. 点击"创建API钱包" +4. **立即保存这3项:** + - 主钱包地址(User) + - API钱包地址(Signer) + - API钱包私钥(⚠️ 仅显示一次!) + +**步骤2**:为Aster配置`config.json` + +```json +{ + "traders": [ + { + "id": "aster_deepseek", + "name": "Aster DeepSeek Trader", + "ai_model": "deepseek", + "exchange": "aster", + + "aster_user": "0x63DD5aCC6b1aa0f563956C0e534DD30B6dcF7C4e", + "aster_signer": "0x21cF8Ae13Bb72632562c6Fff438652Ba1a151bb0", + "aster_private_key": "4fd0a42218f3eae43a6ce26d22544e986139a01e5b34a62db53757ffca81bae1", + + "deepseek_key": "sk-xxxxxxxxxxxxx", + "initial_balance": 1000.0, + "scan_interval_minutes": 3 + } + ], + "use_default_coins": true, + "api_server_port": 8080, + "leverage": { + "btc_eth_leverage": 5, + "altcoin_leverage": 5 + } +} +``` + +**关键配置字段:** +- `"exchange": "aster"` - 设置交易所为Aster +- `aster_user` - 你的主钱包地址 +- `aster_signer` - API钱包地址(来自步骤1) +- `aster_private_key` - API钱包私钥(去掉`0x`前缀) + +**⚠️ 安全提示**: +- API钱包与主钱包分离(额外的安全层) +- 切勿分享API私钥 +- 你可以随时在[asterdex.com](https://www.asterdex.com/en/api-wallet)撤销API钱包访问 + +--- + #### ⚔️ 专家模式:多Trader竞赛 用于运行多个AI trader相互竞争: diff --git a/trader/aster_trader.go b/trader/aster_trader.go index 937262ef..9aaf078c 100644 --- a/trader/aster_trader.go +++ b/trader/aster_trader.go @@ -646,6 +646,26 @@ func (t *AsterTrader) OpenShort(symbol string, quantity float64, leverage int) ( // CloseLong 平多单 func (t *AsterTrader) CloseLong(symbol string, quantity float64) (map[string]interface{}, error) { + // 如果数量为0,获取当前持仓数量 + if quantity == 0 { + positions, err := t.GetPositions() + if err != nil { + return nil, err + } + + for _, pos := range positions { + if pos["symbol"] == symbol && pos["side"] == "long" { + quantity = pos["positionAmt"].(float64) + break + } + } + + if quantity == 0 { + return nil, fmt.Errorf("没有找到 %s 的多仓", symbol) + } + log.Printf(" 📊 获取到多仓数量: %.8f", quantity) + } + price, err := t.GetMarketPrice(symbol) if err != nil { return nil, err @@ -673,6 +693,9 @@ func (t *AsterTrader) CloseLong(symbol string, quantity float64) (map[string]int priceStr := t.formatFloatWithPrecision(formattedPrice, prec.PricePrecision) qtyStr := t.formatFloatWithPrecision(formattedQty, prec.QuantityPrecision) + log.Printf(" 📏 精度处理: 价格 %.8f -> %s (精度=%d), 数量 %.8f -> %s (精度=%d)", + limitPrice, priceStr, prec.PricePrecision, quantity, qtyStr, prec.QuantityPrecision) + params := map[string]interface{}{ "symbol": symbol, "positionSide": "BOTH", @@ -693,11 +716,33 @@ func (t *AsterTrader) CloseLong(symbol string, quantity float64) (map[string]int return nil, err } + log.Printf("✓ 平多仓成功: %s 数量: %s", symbol, qtyStr) return result, nil } // CloseShort 平空单 func (t *AsterTrader) CloseShort(symbol string, quantity float64) (map[string]interface{}, error) { + // 如果数量为0,获取当前持仓数量 + if quantity == 0 { + positions, err := t.GetPositions() + if err != nil { + return nil, err + } + + for _, pos := range positions { + if pos["symbol"] == symbol && pos["side"] == "short" { + // Aster的GetPositions已经将空仓数量转换为正数,直接使用 + quantity = pos["positionAmt"].(float64) + break + } + } + + if quantity == 0 { + return nil, fmt.Errorf("没有找到 %s 的空仓", symbol) + } + log.Printf(" 📊 获取到空仓数量: %.8f", quantity) + } + price, err := t.GetMarketPrice(symbol) if err != nil { return nil, err @@ -725,6 +770,9 @@ func (t *AsterTrader) CloseShort(symbol string, quantity float64) (map[string]in priceStr := t.formatFloatWithPrecision(formattedPrice, prec.PricePrecision) qtyStr := t.formatFloatWithPrecision(formattedQty, prec.QuantityPrecision) + log.Printf(" 📏 精度处理: 价格 %.8f -> %s (精度=%d), 数量 %.8f -> %s (精度=%d)", + limitPrice, priceStr, prec.PricePrecision, quantity, qtyStr, prec.QuantityPrecision) + params := map[string]interface{}{ "symbol": symbol, "positionSide": "BOTH", @@ -745,6 +793,7 @@ func (t *AsterTrader) CloseShort(symbol string, quantity float64) (map[string]in return nil, err } + log.Printf("✓ 平空仓成功: %s 数量: %s", symbol, qtyStr) return result, nil }