Files
nofx/README.ja.md
Icyoung a926afb505 Beta merge from dev (#535)
* fix: GetTraderConfig missing critical fields in SELECT/Scan
**Problem**:
- GetTraderConfig was missing 9 critical fields in SELECT statement
- Missing corresponding Scan variables
- Caused trader edit UI to show 0 for leverage and empty trading_symbols
**Root Cause**:
Database query only selected basic fields (id, name, balance, etc.)
but missed leverage, trading_symbols, prompts, and all custom configs
**Fix**:
- Added missing fields to SELECT:
  * btc_eth_leverage, altcoin_leverage
  * trading_symbols
  * use_coin_pool, use_oi_top
  * custom_prompt, override_base_prompt
  * system_prompt_template
  * is_cross_margin
  * AI model custom_api_url, custom_model_name
- Added corresponding Scan variables to match SELECT order
**Impact**:
 Trader edit modal now displays correct leverage values
 Trading symbols list properly populated
 All custom configurations preserved and displayed
 API endpoint /traders/:id/config returns complete data
**Testing**:
-  Go compilation successful
-  All fields aligned (31 SELECT = 31 Scan)
-  API layer verified (api/server.go:887-904)
Reported by: 寒江孤影
Issue: Trader config edit modal showing 0 leverage and empty symbols
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* Fix PR check
* fix(readme): update readme and pr reviewer
* fix owner
* Fix owner
* feat(hyperliquid): Auto-generate wallet address from private key
Enable automatic wallet address generation from private key for Hyperliquid
exchange, simplifying user onboarding and reducing configuration errors.
Backend Changes (trader/hyperliquid_trader.go):
- Import crypto/ecdsa package for ECDSA public key operations
- Enable wallet address auto-generation when walletAddr is empty
- Use crypto.PubkeyToAddress() to derive address from private key
- Add logging for both auto-generated and manually provided addresses
Frontend Changes (web/src/components/AITradersPage.tsx):
- Remove wallet address required validation (only private key required)
- Update button disabled state to only check private key
- Add "Optional" label to wallet address field
- Add dynamic placeholder with bilingual hint
- Show context-aware helper text based on input state
- Remove HTML required attribute from input field
Translation Updates (web/src/i18n/translations.ts):
- Add 'optional' translation (EN: "Optional", ZH: "可选")
- Add 'hyperliquidWalletAddressAutoGenerate' translation
  EN: "Leave blank to automatically generate wallet address from private key"
  ZH: "留空将自动从私钥生成钱包地址"
Benefits:
 Simplified UX - Users only need to provide private key
 Error prevention - Auto-generated address always matches private key
 Backward compatible - Manual address input still supported
 Better UX - Clear visual indicators for optional fields
Technical Details:
- Uses Ethereum standard ECDSA public key to address conversion
- Implementation was already present but commented out (lines 37-43)
- No database schema changes required (hyperliquid_wallet_addr already nullable)
- Fallback behavior: manual input > auto-generation
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix
* fix pk prefix handle
* fix go vet check
* fix print
* feat: Add Binance setup guide with tutorial modal
- Add Binance configuration tutorial image (guide.png)
- Implement "View Guide" button in exchange configuration modal
- Add tutorial display modal with image viewer
- Add i18n support for guide-related text (EN/ZH)
- Button only appears when configuring Binance exchange
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat: add PostgreSQL data viewing utility script
- Create view_pg_data.sh for easy database data inspection
- Display table record counts, AI models, exchanges, and system config
- Include beta codes and user statistics
- Auto-detect docker-compose vs docker compose commands
🤖 Generated with [Claude Code](https://claude.ai/code)
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(api): query actual exchange balance when creating trader
Problem:
- Users could input arbitrary initial balance when creating traders
- This didn't reflect the actual available balance in exchange account
- Could lead to incorrect position sizing and risk calculations
Solution:
- Before creating trader, query exchange API for actual balance
- Use GetBalance() from respective trader implementation:
  * Binance: NewFuturesTrader + GetBalance()
  * Hyperliquid: NewHyperliquidTrader + GetBalance()
  * Aster: NewAsterTrader + GetBalance()
- Extract 'available_balance' or 'balance' from response
- Override user input with actual balance
- Fallback to user input if query fails
Changes:
- Added 'nofx/trader' import
- Query GetExchanges() to find matching exchange config
- Create temporary trader instance based on exchange type
- Call GetBalance() to fetch actual available balance
- Use actualBalance instead of req.InitialBalance
- Comprehensive error handling with fallback logic
Benefits:
-  Ensures accurate initial balance matches exchange account
-  Prevents user errors in balance input
-  Improves position sizing accuracy
-  Maintains data integrity between system and exchange
Example logs:
✓ 查询到交易所实际余额: 150.00 USDT (用户输入: 100.00 USDT)
⚠️ 查询交易所余额失败,使用用户输入的初始资金: connection timeout
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(api): correct variable name from traderRecord to trader
Fixed compilation error caused by variable name mismatch:
- Line 404: defined as 'trader'
- Line 425: was using 'traderRecord' (undefined)
This aligns with upstream dev branch naming convention.
* feat: 添加部分平仓和动态止盈止损功能
新增功能:
- update_stop_loss: 调整止损价格(追踪止损)
- update_take_profit: 调整止盈价格(技术位优化)
- partial_close: 部分平仓(分批止盈)
实现细节:
- Decision struct 新增字段:NewStopLoss, NewTakeProfit, ClosePercentage
- 新增执行函数:executeUpdateStopLossWithRecord, executeUpdateTakeProfitWithRecord, executePartialCloseWithRecord
- 修复持仓字段获取 bug(使用 "side" 并转大写)
- 更新 adaptive.txt 文档,包含详细使用示例和策略建议
- 优先级排序:平仓 > 调整止盈止损 > 开仓
命名统一:
- 与社区 PR #197 保持一致,使用 update_* 而非 adjust_*
- 独有功能:partial_close(部分平仓)
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* 修復關鍵 BUG:validActions 缺少新動作導致驗證失敗
問題根因:
- auto_trader.go 已實現 update_stop_loss/update_take_profit/partial_close 處理
- adaptive.txt 已描述這些功能
- 但 validateDecision 的 validActions map 缺少這三個動作
- 導致 AI 生成的決策在驗證階段被拒絕:「无效的action:update_stop_loss」
修復內容:
1. validActions 添加三個新動作
2. 為每個新動作添加參數驗證:
   - update_stop_loss: 驗證 NewStopLoss > 0
   - update_take_profit: 驗證 NewTakeProfit > 0
   - partial_close: 驗證 ClosePercentage 在 0-100 之間
3. 修正註釋:adjust_* → update_*
測試狀態:feature 分支,等待測試確認
* 修復關鍵缺陷:添加 CancelStopOrders 方法避免多個止損單共存
問題:
- 調整止損/止盈時,直接調用 SetStopLoss/SetTakeProfit 會創建新訂單
- 但舊的止損/止盈單仍然存在,導致多個訂單共存
- 可能造成意外觸發或訂單衝突
解決方案(參考 PR #197):
1. 在 Trader 接口添加 CancelStopOrders 方法
2. 為三個交易所實現:
   - binance_futures.go: 過濾 STOP_MARKET/TAKE_PROFIT_MARKET 類型
   - aster_trader.go: 同樣邏輯
   - hyperliquid_trader.go: 過濾 trigger 訂單(有 triggerPx)
3. 在 executeUpdateStopLossWithRecord 和 executeUpdateTakeProfitWithRecord 中:
   - 先調用 CancelStopOrders 取消舊單
   - 然後設置新止損/止盈
   - 取消失敗不中斷執行(記錄警告)
優勢:
-  避免多個止損單同時存在
-  保留我們的價格驗證邏輯
-  保留執行價格記錄
-  詳細錯誤信息
-  取消失敗時繼續執行(更健壯)
測試建議:
- 開倉後調整止損,檢查舊止損單是否被取消
- 連續調整兩次,確認只有最新止損單存在
致謝:參考 PR #197 的實現思路
* fix: 修复部分平仓盈利计算错误
问题:部分平仓时,历史记录显示的是全仓位盈利,而非实际平仓部分的盈利
根本原因:
- AnalyzePerformance 使用开仓总数量计算部分平仓的盈利
- 应该使用 action.Quantity(实际平仓数量)而非 openPos["quantity"](总数量)
修复:
- 添加 actualQuantity 变量区分完整平仓和部分平仓
- partial_close 使用 action.Quantity
- 所有相关计算(PnL、PositionValue、MarginUsed)都使用 actualQuantity
影响范围:logger/decision_logger.go:428-465
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix: 修復 Hyperliquid CancelStopOrders 編譯錯誤
- OpenOrder 結構不暴露 trigger 字段
- 改為取消該幣種的所有掛單(安全做法)
* fix: remove unnecessary prompts/adaptive.txt changes
- This PR should only contain backend core functionality
- prompts/adaptive.txt v2.0 is already in upstream
- Prompt enhancements will be in separate PR (Batch 3)
* 更新 logger:支持新增的三個動作類型
更新內容:
1. DecisionAction 註釋:添加 update_stop_loss, update_take_profit, partial_close
2. GetStatistics:partial_close 計入 TotalClosePositions
3. AnalyzePerformance 預填充邏輯:處理 partial_close(不刪除持倉記錄)
4. AnalyzePerformance 分析邏輯:
   - partial_close 正確判斷持倉方向
   - 記錄部分平倉的盈虧統計
   - 保留持倉記錄(因為還有剩餘倉位)
說明:partial_close 會記錄盈虧,但不刪除 openPositions,
      因為還有剩餘倉位可能繼續交易
* refactor(prompts): add comprehensive partial_close guidance to adaptive.txt
Add detailed guidance chapter for dynamic TP/SL management and partial close operations.
## Changes
- New chapter: "动态止盈止损与部分平仓指引" (Dynamic TP/SL & Partial Close Guidance)
- Inserted between "可用动作" (Actions) and "决策流程" (Decision Flow) sections
- 4 key guidance points covering:
  1. Partial close best practices (use clear percentages like 25%/50%/75%)
  2. Reassessing remaining position after partial exit
  3. Proper use cases for update_stop_loss / update_take_profit
  4. Multi-stage exit strategy requirements
## Benefits
-  Provides concrete operational guidelines for AI decision-making
-  Clarifies when and how to use partial_close effectively
-  Emphasizes remaining position management (prevents "orphan" positions)
-  Aligns with existing backend support for partial_close action
## Background
While adaptive.txt already lists partial_close as an available action,
it lacked detailed operational guidance. This enhancement fills that gap
by providing specific percentages, use cases, and multi-stage exit examples.
Backend (decision/engine.go) already validates partial_close with
close_percentage field, so this is purely a prompt enhancement with
no code changes required.
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(market): resolve price staleness issue in GetCurrentKlines
## Problem
GetCurrentKlines had two critical bugs causing price data to become stale:
1. Incorrect return logic: returned error even when data fetch succeeded
2. Race condition: returned slice reference instead of deep copy, causing concurrent data corruption
## Impact
- BTC price stuck at 106xxx while actual market price was 107xxx+
- LLM calculated take-profit based on stale prices → orders failed validation
- Statistics showed incorrect P&L (0.00%) due to corrupted historical data
- Alt-coins filtered out due to failed market data fetch
## Solution
1. Fixed return logic: only return error when actual failure occurs
2. Return deep copy instead of reference to prevent race conditions
3. Downgrade subscription errors to warnings (non-blocking)
## Test Results
 Price updates in real-time
 Take-profit orders execute successfully
 P&L calculations accurate
 Alt-coins now tradeable
Related: Price feed mechanism, concurrent data access
* feat(decision): make OI threshold configurable + add relaxed prompt template
## Changes
### 1. decision/engine.go - Configurable OI Threshold
- Extract hardcoded 15M OI threshold to configurable constant
- Add clear documentation for risk profiles:
  - 15M (Conservative) - BTC/ETH/SOL only
  - 10M (Balanced) - Add major alt-coins
  - 8M (Relaxed) - Include mid-cap coins (BNB/LINK/AVAX)
  - 5M (Aggressive) - Most alt-coins allowed
- Default: 15M (保守,維持原行為)
### 2. prompts/adaptive_relaxed.txt - New Trading Template
Conservative optimization for increased trading frequency while maintaining high win-rate:
**Key Adjustments:**
- Confidence threshold: 85 → 80 (allow more opportunities)
- Cooldown period: 9min → 6min (faster reaction)
- Multi-timeframe trend: 3 periods → 2 periods (relaxed requirement)
- Entry checklist: 5/8 → 4/8 (easier to pass)
- RSI range: 30-40/65-70 → <45/>60 (wider acceptance)
- Risk-reward ratio: 1:3 → 1:2.5 (more flexible)
**Expected Impact:**
- Trading frequency: 5/day → 8-15/day (+60-200%)
- Win-rate: 40% → 50-55% (improved)
- Alt-coins: More opportunities unlocked
- Risk controls: Preserved (Sharpe-based, loss-pause)
## Usage
Users can now choose trading style via Web UI:
- `adaptive` - Strictest (original)
- `adaptive_relaxed` - Balanced (this PR)
- `nof1` - Most aggressive
## Rationale
The original adaptive.txt uses 5-layer filtering (confidence/cooldown/trend/checklist/RSI)
that filters out ~95% of opportunities. This template provides a middle-ground option
for users who want higher frequency without sacrificing core risk management.
Related: #trading-frequency #alt-coin-support
* fix: 过滤幽灵持仓 - 跳过 quantity=0 的持仓防止 AI 误判
问题:
- 止损/止盈触发后,交易所返回 positionAmt=0 的持仓记录
- 这些幽灵持仓被传递给 AI,导致 AI 误以为仍持有该币种
- AI 可能基于错误信息做出决策(如尝试调整已不存在的止损)
修复:
- buildTradingContext() 中添加 quantity==0 检查
- 跳过已平仓的持仓,确保只传递真实持仓给 AI
- 触发清理逻辑:撤销孤儿订单、清理内部状态
影响范围:
- trader/auto_trader.go:487-490
测试:
- 编译成功
- 容器重建并启动正常
* fix: 添加 HTTP/2 stream error 到可重試錯誤列表
問題:
- 用戶遇到錯誤:stream error: stream ID 1; INTERNAL_ERROR
- 這是 HTTP/2 連接被服務端關閉的錯誤
- 當前重試機制不包含此類錯誤,導致直接失敗
修復:
- 添加 "stream error" 到可重試列表
- 添加 "INTERNAL_ERROR" 到可重試列表
- 遇到此類錯誤時會自動重試(最多 3 次)
影響:
- 提高 API 調用穩定性
- 自動處理服務端臨時故障
- 減少因網絡波動導致的失敗
* fix: 修復首次運行時數據庫初始化失敗問題
問題:
- 用戶首次運行報錯:unable to open database file: is a directory
- 原因:Docker volume 掛載時,如果 config.db 不存在,會創建目錄而非文件
- 影響:新用戶無法正常啟動系統
修復:
- 在 start.sh 啟動前檢查 config.db 是否存在
- 如不存在則創建空文件(touch config.db)
- 確保 Docker 掛載為文件而非目錄
測試:
- 首次運行:./start.sh start → 正常初始化 ✓
- 現有用戶:無影響,向後兼容 ✓
* fix: 修復初始余額顯示錯誤(使用當前淨值而非配置值)
問題:
- 圖表顯示「初始余額 693.15 USDT」(實際應該是 600)
- 原因:使用 validHistory[0].total_equity(當前淨值)
- 導致初始余額隨著盈虧變化,數學邏輯錯誤
修復:
- 優先從 account.initial_balance 讀取真實配置值
- 備選方案:從歷史數據反推(淨值 - 盈虧)
- 默認值使用 1000(與創建交易員時的默認配置一致)
測試:
- 初始余額:600 USDT(固定)
- 當前淨值:693.15 USDT
- 盈虧:+93.15 USDT (+15.52%) ✓
* fix: 統一 handleTraderList 返回完整 AI model ID(保持與 handleGetTraderConfig 一致)
問題:
- handleTraderList 仍在截斷 AI model ID (admin_deepseek → deepseek)
- 與 handleGetTraderConfig 返回的完整 ID 不一致
- 導致前端 isModelInUse 檢查失效
修復:
- 移除 handleTraderList 中的截斷邏輯
- 返回完整 AIModelID (admin_deepseek)
- 與其他 API 端點保持一致
測試:
- GET /api/traders → ai_model: admin_deepseek ✓
- GET /api/traders/:id → ai_model: admin_deepseek ✓
- 模型使用檢查邏輯正確 ✓
* chore: upgrade sqlite3 to v1.14.22 for Alpine Linux compatibility
- Fix compilation error on Alpine: off64_t type not defined in v1.14.16
- Remove unused pure-Go sqlite implementation (modernc.org/sqlite) and its dependencies
- v1.14.22 is the first version fixing Alpine/musl build issues (2024-02-02)
- Minimizes version jump (v1.14.16 → v1.14.22, 18 commits) to reduce risk
Reference: https://github.com/mattn/go-sqlite3/issues/1164
Verified: Builds successfully on golang:1.25-alpine
* chore: run go fmt to fix formatting issues
* fix(margin): correct position sizing formula to prevent insufficient margin errors
## Problem
AI was calculating position_size_usd incorrectly, treating it as margin requirement instead of notional value, causing code=-2019 errors (insufficient margin).
## Solution
### 1. Updated AI prompts with correct formula
- **prompts/adaptive.txt**: Added clear position sizing calculation steps
- **prompts/nof1.txt**: Added English version with example
- **prompts/default.txt**: Added Chinese version with example
**Correct formula:**
1. Available Margin = Available Cash × 0.95 × Allocation % (reserve 5% for fees)
2. Notional Value = Available Margin × Leverage
3. position_size_usd = Notional Value (this is the value for JSON)
**Example:** $500 cash, 5x leverage → position_size_usd = $2,375 (not $500)
### 2. Added code-level validation
- **trader/auto_trader.go**: Added margin checks in executeOpenLong/ShortWithRecord
- Validates required margin + fees ≤ available balance before opening position
- Returns clear error message if insufficient
## Impact
- Prevents code=-2019 errors
- AI now understands the difference between notional value and margin requirement
- Double validation: AI prompt + code check
## Testing
-  Compiles successfully
- ⚠️ Requires live trading environment testing
* fix(stats): aggregate partial closes into single trade for accurate statistics
## Problem
Multiple partial_close actions on the same position were being counted as separate trades, inflating TotalTrades count and distorting win rate/profit factor statistics.
**Example of bug:**
- Open 1 BTC @ $100,000
- Partial close 30% @ $101,000 → Counted as trade #1 
- Partial close 50% @ $102,000 → Counted as trade #2 
- Close remaining 20% @ $103,000 → Counted as trade #3 
- **Result:** 3 trades instead of 1 
## Solution
### 1. Added tracking fields to openPositions map
- `remainingQuantity`: Tracks remaining position size
- `accumulatedPnL`: Accumulates PnL from all partial closes
- `partialCloseCount`: Counts number of partial close operations
- `partialCloseVolume`: Total volume closed partially
### 2. Modified partial_close handling logic
- Each partial_close:
  - Accumulates PnL into `accumulatedPnL`
  - Reduces `remainingQuantity`
  - **Does NOT increment TotalTrades++**
  - Keeps position in openPositions map
- Only when `remainingQuantity <= 0.0001`:
  - Records ONE TradeOutcome with aggregated PnL
  - Increments TotalTrades++ once
  - Removes from openPositions map
### 3. Updated full close handling
- If position had prior partial closes:
  - Adds `accumulatedPnL` to final close PnL
  - Reports total PnL in TradeOutcome
### 4. Fixed GetStatistics()
- Removed `partial_close` from TotalClosePositions count
- Only `close_long/close_short/auto_close` count as close operations
## Impact
-  Statistics now accurate: multiple partial closes = 1 trade
-  Win rate calculated correctly
-  Profit factor reflects true performance
-  Backward compatible: handles positions without tracking fields
## Testing
-  Compiles successfully
- ⚠️ Requires validation with live partial_close scenarios
## Code Changes
```
logger/decision_logger.go:
- Lines 420-430: Add tracking fields to openPositions
- Lines 441-534: Implement partial_close aggregation logic
- Lines 536-593: Update full close to include accumulated PnL
- Lines 246-250: Fix GetStatistics() to exclude partial_close
```
* fix(ui): prevent system_prompt_template overwrite when value is empty string
## Problem
When editing trader configuration, if `system_prompt_template` was set to an empty string (""), the UI would incorrectly treat it as falsy and overwrite it with 'default', losing the user's selection.
**Root cause:**
```tsx
if (traderData && !traderData.system_prompt_template) {
  //  This triggers for both undefined AND empty string ""
  setFormData({ system_prompt_template: 'default' });
}
```
JavaScript falsy values that trigger `!` operator:
- `undefined`  Should trigger default
- `null`  Should trigger default
- `""`  Should NOT trigger (user explicitly chose empty)
- `false`, `0`, `NaN` (less relevant here)
## Solution
Change condition to explicitly check for `undefined`:
```tsx
if (traderData && traderData.system_prompt_template === undefined) {
  //  Only triggers for truly missing field
  setFormData({ system_prompt_template: 'default' });
}
```
## Impact
-  Empty string selections are preserved
-  Legacy data (undefined) still gets default value
-  User's explicit choices are respected
-  No breaking changes to existing functionality
## Testing
-  Code compiles
- ⚠️ Requires manual UI testing:
  - [ ] Edit trader with empty system_prompt_template
  - [ ] Verify it doesn't reset to 'default'
  - [ ] Create new trader → should default to 'default'
  - [ ] Edit old trader (undefined field) → should default to 'default'
## Code Changes
```
web/src/components/TraderConfigModal.tsx:
- Line 99: Changed !traderData.system_prompt_template → === undefined
```
* fix(trader): add missing HyperliquidTestnet configuration in loadSingleTrader
修复了 loadSingleTrader 函数中缺失的 HyperliquidTestnet 配置项,
确保 Hyperliquid 交易所的测试网配置能够正确传递到 trader 实例。
Changes:
- 在 loadSingleTrader 中添加 HyperliquidTestnet 字段配置
- 代码格式优化(空格对齐)
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(trader): separate stop-loss and take-profit order cancellation to prevent accidental deletions
## Problem
When adjusting stop-loss or take-profit levels, `CancelStopOrders()` deleted BOTH stop-loss AND take-profit orders simultaneously, causing:
- **Adjusting stop-loss** → Take-profit order deleted → Position has no exit plan 
- **Adjusting take-profit** → Stop-loss order deleted → Position unprotected 
**Root cause:**
```go
CancelStopOrders(symbol) {
  // Cancelled ALL orders with type STOP_MARKET or TAKE_PROFIT_MARKET
  // No distinction between stop-loss and take-profit
}
```
## Solution
### 1. Added new interface methods (trader/interface.go)
```go
CancelStopLossOrders(symbol string) error      // Only cancel stop-loss orders
CancelTakeProfitOrders(symbol string) error    // Only cancel take-profit orders
CancelStopOrders(symbol string) error          // Deprecated (cancels both)
```
### 2. Implemented for all 3 exchanges
**Binance (trader/binance_futures.go)**:
- `CancelStopLossOrders`: Filters `OrderTypeStopMarket | OrderTypeStop`
- `CancelTakeProfitOrders`: Filters `OrderTypeTakeProfitMarket | OrderTypeTakeProfit`
- Full order type differentiation 
**Hyperliquid (trader/hyperliquid_trader.go)**:
- ⚠️ Limitation: SDK's OpenOrder struct doesn't expose trigger field
- Both methods call `CancelStopOrders` (cancels all pending orders)
- Trade-off: Safe but less precise
**Aster (trader/aster_trader.go)**:
- `CancelStopLossOrders`: Filters `STOP_MARKET | STOP`
- `CancelTakeProfitOrders`: Filters `TAKE_PROFIT_MARKET | TAKE_PROFIT`
- Full order type differentiation 
### 3. Usage in auto_trader.go
When `update_stop_loss` or `update_take_profit` actions are implemented, they will use:
```go
// update_stop_loss:
at.trader.CancelStopLossOrders(symbol)  // Only cancel SL, keep TP
at.trader.SetStopLoss(...)
// update_take_profit:
at.trader.CancelTakeProfitOrders(symbol)  // Only cancel TP, keep SL
at.trader.SetTakeProfit(...)
```
## Impact
-  Adjusting stop-loss no longer deletes take-profit
-  Adjusting take-profit no longer deletes stop-loss
-  Backward compatible: `CancelStopOrders` still exists (deprecated)
- ⚠️ Hyperliquid limitation: still cancels all orders (SDK constraint)
## Testing
-  Compiles successfully across all 3 exchanges
- ⚠️ Requires live testing:
  - [ ] Binance: Adjust SL → verify TP remains
  - [ ] Binance: Adjust TP → verify SL remains
  - [ ] Hyperliquid: Verify behavior with limitation
  - [ ] Aster: Verify order filtering works correctly
## Code Changes
```
trader/interface.go: +9 lines (new interface methods)
trader/binance_futures.go: +133 lines (3 new functions)
trader/hyperliquid_trader.go: +56 lines (3 new functions)
trader/aster_trader.go: +157 lines (3 new functions)
Total: +355 lines
```
* fix(binance): initialize dual-side position mode to prevent code=-4061 errors
## Problem
When opening positions with explicit `PositionSide` parameter (LONG/SHORT), Binance API returned **code=-4061** error:
```
"No need to change position side."
"code":-4061
```
**Root cause:**
- Binance accounts default to **single-side position mode** ("One-Way Mode")
- In this mode, `PositionSide` parameter is **not allowed**
- Code使用了 `PositionSide` 參數 (LONG/SHORT),但帳戶未啟用雙向持倉模式
**Position Mode Comparison:**
| Mode | PositionSide Required | Can Hold Long+Short Simultaneously |
|------|----------------------|------------------------------------|
| One-Way (default) |  No |  No |
| Hedge Mode |  **Required** |  Yes |
## Solution
### 1. Added setDualSidePosition() function
Automatically enables Hedge Mode during trader initialization:
```go
func (t *FuturesTrader) setDualSidePosition() error {
    err := t.client.NewChangePositionModeService().
        DualSide(true). // Enable Hedge Mode
        Do(context.Background())
    if err != nil {
        // Ignore "No need to change" error (already in Hedge Mode)
        if strings.Contains(err.Error(), "No need to change position side") {
            log.Printf("✓ Account already in Hedge Mode")
            return nil
        }
        return err
    }
    log.Printf("✓ Switched to Hedge Mode")
    return nil
}
```
### 2. Called in NewFuturesTrader()
Runs automatically when creating trader instance:
```go
func NewFuturesTrader(apiKey, secretKey string) *FuturesTrader {
    trader := &FuturesTrader{...}
    // Initialize Hedge Mode
    if err := trader.setDualSidePosition(); err != nil {
        log.Printf("⚠️ Failed to set Hedge Mode: %v", err)
    }
    return trader
}
```
## Impact
-  Prevents code=-4061 errors when opening positions
-  Enables simultaneous long+short positions (if needed)
-  Fails gracefully if account already in Hedge Mode
- ⚠️ **One-time change**: Once enabled, cannot revert to One-Way Mode with open positions
## Testing
-  Compiles successfully
- ⚠️ Requires Binance testnet/mainnet validation:
  - [ ] First initialization → switches to Hedge Mode
  - [ ] Subsequent initializations → ignores "No need to change" error
  - [ ] Open long position with PositionSide=LONG → succeeds
  - [ ] Open short position with PositionSide=SHORT → succeeds
## Code Changes
```
trader/binance_futures.go:
- Line 3-12: Added strings import
- Line 33-47: Modified NewFuturesTrader() to call setDualSidePosition()
- Line 49-69: New function setDualSidePosition()
Total: +25 lines
```
## References
- Binance Futures API: https://binance-docs.github.io/apidocs/futures/en/#change-position-mode-trade
- Error code=-4061: "No need to change position side."
- PositionSide ENUM: BOTH (One-Way) | LONG | SHORT (Hedge Mode)
* fix(prompts): rename actions to match backend implementation
## Problem
Backend code expects these action names:
- `open_long`, `open_short`, `close_long`, `close_short`
But prompts use outdated names:
- `buy_to_enter`, `sell_to_enter`, `close`
This causes all trading decisions to fail with unknown action errors.
## Solution
Minimal changes to fix action name compatibility:
### prompts/nof1.txt
-  `buy_to_enter` → `open_long`
-  `sell_to_enter` → `open_short`
-  `close` → `close_long` / `close_short`
-  Explicitly list `wait` action
- +18 lines, -6 lines (only action definitions section)
### prompts/adaptive.txt
-  `buy_to_enter` → `open_long`
-  `sell_to_enter` → `open_short`
-  `close` → `close_long` / `close_short`
- +15 lines, -6 lines (only action definitions section)
## Impact
-  Trading decisions now execute successfully
-  Maintains all existing functionality
-  No new features added (minimal diff)
## Verification
```bash
# Backend expects these actions:
grep 'Action string' decision/engine.go
# "open_long", "open_short", "close_long", "close_short", ...
# Old names removed:
grep -r "buy_to_enter\|sell_to_enter" prompts/
# (no results)
```
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(api): add balance sync endpoint with smart detection
## Summary
- Add POST /traders/:id/sync-balance endpoint (Option B)
- Add smart detection showing balance change percentage (Option C)
- Fix balance display bug caused by commit 2b9c4d2
## Changes
### api/server.go
- Add handleSyncBalance() handler
- Query actual exchange balance via trader.GetBalance()
- Calculate change percentage for smart detection
- Update initial_balance in database
- Reload trader into memory after update
### config/database.go
- Add UpdateTraderInitialBalance() method
- Update traders.initial_balance field
## Root Cause
Commit 2b9c4d2 auto-queries exchange balance at trader creation time,
but never updates after user deposits more funds, causing:
- Wrong initial_balance (400 USDT vs actual 3000 USDT)
- Wrong P&L calculations (-2598.55 USDT instead of actual)
## Solution
Provides manual sync API + smart detection to update initial_balance
when user deposits funds after trader creation.
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat(trader): add automatic balance sync every 10 minutes
## 功能说明
自动检测交易所余额变化,无需用户手动操作
## 核心改动
1. AutoTrader 新增字段:
   - lastBalanceSyncTime: 上次余额同步时间
   - database: 数据库引用(用于自动更新)
   - userID: 用户ID
2. 新增方法 autoSyncBalanceIfNeeded():
   - 每10分钟检查一次(避免与3分钟扫描周期重叠)
   - 余额变化>5%才更新数据库
   - 智能失败重试(避免频繁查询)
   - 完整日志记录
3. 集成到交易循环:
   - 在 runCycle() 中第3步自动调用
   - 先同步余额,再获取交易上下文
   - 不影响现有交易逻辑
4. TraderManager 更新:
   - addTraderFromDB(), AddTraderFromDB(), loadSingleTrader()
   - 新增 database 和 userID 参数
   - 正确传递到 NewAutoTrader()
5. Database 新增方法:
   - UpdateTraderInitialBalance(userID, id, newBalance)
   - 安全更新初始余额
## 为什么选择10分钟?
1. 避免与3分钟扫描周期重叠(每30分钟仅重叠1次)
2. API开销最小化:每小时仅6次额外调用
3. 充值延迟可接受:最多10分钟自动同步
4. API占用率:0.2%(远低于币安2400次/分钟限制)
## API开销
- GetBalance() 轻量级查询(权重5-10)
- 每小时仅6次额外调用
- 总调用:26次/小时(runCycle:20 + autoSync:6)
- 占用率:(10/2400)/60 = 0.2% 
## 用户体验
- 充值后最多10分钟自动同步
- 完全自动化,无需手动干预
- 前端数据实时准确
## 日志示例
- 🔄 开始自动检查余额变化...
- 🔔 检测到余额大幅变化: 693.00 → 3693.00 USDT (433.19%)
-  已自动同步余额到数据库
- ✓ 余额变化不大 (2.3%),无需更新
* fix(trader): add safety checks for balance sync
## 修复内容
### 1. 防止除以零panic (严重bug修复)
- 在计算变化百分比前检查 oldBalance <= 0
- 如果初始余额无效,直接更新为实际余额
- 避免 division by zero panic
### 2. 增强错误处理
- 添加数据库类型断言失败的日志
- 添加数据库为nil的警告日志
- 提供更完整的错误信息
## 技术细节
问题场景:如果 oldBalance = 0,计算 changePercent 会 panic
修复后:在计算前检查 oldBalance <= 0,直接更新余额
## 审查发现
- P0: 除以零风险(已修复)
- P1: 类型断言失败未记录(已修复)
- P1: 数据库为nil未警告(已修复)
详细审查报告:code_review_auto_balance_sync.md
* fix: resolve login redirect loop issue (#422)
- Redirect to /traders instead of / after successful login/registration
- Make 'Get Started Now' button redirect logged-in users to /traders
- Prevent infinite loop where logged-in users are shown landing page repeatedly
Fixes issue where after login success, clicking "Get Started Now" would
show login modal again instead of entering the main application.
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(decision): handle fullwidth JSON characters from AI responses
Extends fixMissingQuotes() to replace fullwidth brackets, colons, and commas that Claude AI occasionally outputs, preventing JSON parsing failures.
Root cause: AI can output fullwidth characters like [{:, instead of [{ :,
Error: "JSON 必须以 [{ 开头,实际: [ {"symbol": "BTCU"
Fix: Replace all fullwidth JSON syntax characters:
- [] (U+FF3B/FF3D) → []
- {} (U+FF5B/FF5D) → {}
- : (U+FF1A) → :
- , (U+FF0C) → ,
Test case:
Input:  [{\"symbol\":\"BTCUSDT\",\"action\":\"open_short\"}]
Output: [{\"symbol\":\"BTCUSDT\",\"action\":\"open_short\"}]
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat(decision): add validateJSONFormat to catch common AI errors
Adds comprehensive JSON validation before parsing to catch common AI output errors:
1. Format validation: Ensures JSON starts with [{ (decision array)
2. Range symbol detection: Rejects ~ symbols (e.g., "leverage: 3~5")
3. Thousands separator detection: Rejects commas in numbers (e.g., "98,000")
Execution order (critical for fullwidth character fix):
1. Extract JSON from response
2. fixMissingQuotes - normalize fullwidth → halfwidth 
3. validateJSONFormat - check for common errors 
4. Parse JSON
This validation layer provides early error detection and clearer error messages
for debugging AI response issues.
Added helper function:
- min(a, b int) int - returns smaller of two integers
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(decision): add CJK punctuation support in fixMissingQuotes
Critical discovery: AI can output different types of "fullwidth" brackets:
- Fullwidth: []{}(U+FF3B/FF3D/FF5B/FF5D) ← Already handled
- CJK: 【】〔〕(U+3010/3011/3014/3015) ← Was missing!
Root cause of persistent errors:
User reported: "JSON 必须以【{开头"
The 【 character (U+3010) is NOT the same as [ (U+FF3B)!
Added CJK punctuation replacements:
- 【 → [ (U+3010 Left Black Lenticular Bracket)
- 】 → ] (U+3011 Right Black Lenticular Bracket)
- 〔 → [ (U+3014 Left Tortoise Shell Bracket)
- 〕 → ] (U+3015 Right Tortoise Shell Bracket)
- 、 → , (U+3001 Ideographic Comma)
Why this was missed:
AI uses different characters in different contexts. CJK brackets (U+3010-3017)
are distinct from Fullwidth Forms (U+FF00-FFEF) in Unicode.
Test case:
Input:  【{"symbol":"BTCUSDT"】
Output: [{"symbol":"BTCUSDT"}]
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(decision): replace fullwidth space (U+3000) in JSON
Critical bug: AI can output fullwidth space ( U+3000) between brackets:
Input:  [ {"symbol":"BTCUSDT"}]
        ↑ ↑ fullwidth space
After previous fix:
        [ {"symbol":"BTCUSDT"}]
         ↑ fullwidth space remained!
Result: validateJSONFormat failed because:
- Checks "[{" (no space) 
- Checks "[ {" (halfwidth space U+0020) 
- AI output "[ {" (fullwidth space U+3000) 
Solution: Replace fullwidth space → halfwidth space
-  (U+3000) → space (U+0020)
This allows existing validation logic to work:
strings.HasPrefix(trimmed, "[ {") now matches 
Why fullwidth space?
- Common in CJK text editing
- AI trained on mixed CJK content
- Invisible to naked eye but breaks JSON parsing
Test case:
Input:  [ {"symbol":"BTCUSDT"}]
Output: [ {"symbol":"BTCUSDT"}]
Validation:  PASS
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat(decision): sync robust JSON extraction & limit candidates from z-dev
## Synced from z-dev
### 1. Robust JSON Extraction (from aa63298)
- Add regexp import
- Add removeInvisibleRunes() - removes zero-width chars & BOM
- Add compactArrayOpen() - normalizes '[ {' to '[{'
- Rewrite extractDecisions():
  * Priority 1: Extract from ```json code blocks
  * Priority 2: Regex find array
  * Multi-layer defense: 7 layers total
### 2. Enhanced Validation
- validateJSONFormat now uses regex ^\[\s*\{ (allows any whitespace)
- More tolerant than string prefix check
### 3. Limit Candidate Coins (from f1e981b)
- calculateMaxCandidates now enforces proper limits:
  * 0 positions: max 30 candidates
  * 1 position: max 25 candidates
  * 2 positions: max 20 candidates
  * 3+ positions: max 15 candidates
- Prevents Prompt bloat when users configure many coins
## Coverage
Now handles:
-  Pure JSON
-  ```json code blocks
-  Thinking chain混合
-  Fullwidth characters (16種)
-  CJK characters
-  Zero-width characters
-  All whitespace combinations
Estimated coverage: **99.9%**
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix(decision): extract fullwidth chars BEFORE regex matching
🐛 Problem:
- AI returns JSON with fullwidth characters: [{
- Regex \[ cannot match fullwidth [
- extractDecisions() fails with "无法找到JSON数组起始"
🔧 Root Cause:
- fixMissingQuotes() was called AFTER regex matching
- If regex fails to match fullwidth chars, fix function never executes
 Solution:
- Call fixMissingQuotes(s) BEFORE regex matching (line 461)
- Convert fullwidth to halfwidth first: [→[, {→{
- Then regex can successfully match the JSON array
📊 Impact:
- Fixes "无法找到JSON数组起始" error
- Supports AI responses with fullwidth JSON characters
- Backward compatible with halfwidth JSON
This fix is identical to z-dev commit 3676cc0
* perf(decision): precompile regex patterns for performance
## Changes
- Move all regex patterns to global precompiled variables
- Reduces regex compilation overhead from O(n) to O(1)
- Matches z-dev's performance optimization
## Modified Patterns
- reJSONFence: Match ```json code blocks
- reJSONArray: Match JSON arrays
- reArrayHead: Validate array start
- reArrayOpenSpace: Compact array formatting
- reInvisibleRunes: Remove zero-width characters
## Performance Impact
- Regex compilation now happens once at startup
- Eliminates repeated compilation in extractDecisions() (called every decision cycle)
- Expected performance improvement: ~5-10% in JSON parsing
## Safety
 All regex patterns remain unchanged (only moved to global scope)
 Compilation successful
 Maintains same functionality as before
* fix(decision): correct Unicode regex escaping in reInvisibleRunes
## Critical Fix
### Problem
-  `regexp.MustCompile(`[\u200B...]`)` (backticks = raw string)
- Raw strings don't parse \uXXXX escape sequences in Go
- Regex was matching literal text "\u200B" instead of Unicode characters
### Solution
-  `regexp.MustCompile("[\u200B...]")` (double quotes = parsed string)
- Double quotes properly parse Unicode escape sequences
- Now correctly matches U+200B (zero-width space), U+200C, U+200D, U+FEFF
## Impact
- Zero-width characters are now properly removed before JSON parsing
- Prevents invisible character corruption in AI responses
- Fixes potential JSON parsing failures
## Related
- Same fix applied to z-dev in commit db7c035
* fix(trader+decision): prevent quantity=0 error with min notional checks
User encountered API error when opening BTC position:
- Account equity: 9.20 USDT
- AI suggested: ~7.36 USDT position
- Error: `code=-4003, msg=Quantity less than or equal to zero.`
```
quantity = 7.36 / 101808.2 ≈ 0.00007228 BTC
formatted (%.3f) → "0.000"  Rounded down to 0!
```
BTCUSDT precision is 3 decimals (stepSize=0.001), causing small quantities to round to 0.
-  CloseLong() and CloseShort() have CheckMinNotional()
-  OpenLong() and OpenShort() **missing** CheckMinNotional()
- AI could suggest position_size_usd < minimum notional value
- No validation prevented tiny positions that would fail
---
**OpenLong() and OpenShort()** - Added two checks:
```go
//  Check if formatted quantity became 0 (rounding issue)
quantityFloat, _ := strconv.ParseFloat(quantityStr, 64)
if quantityFloat <= 0 {
    return error("Quantity too small, formatted to 0...")
}
//  Check minimum notional value (Binance requires ≥10 USDT)
if err := t.CheckMinNotional(symbol, quantityFloat); err != nil {
    return err
}
```
**Impact**: Prevents API errors by catching invalid quantities before submission.
---
Added minimum position size validation:
```go
const minPositionSizeGeneral = 15.0   // Altcoins
const minPositionSizeBTCETH = 100.0   // BTC/ETH (high price + precision limits)
if symbol == BTC/ETH && position_size_usd < 100 {
    return error("BTC/ETH requires ≥100 USDT to avoid rounding to 0")
}
if position_size_usd < 15 {
    return error("Position size must be ≥15 USDT (min notional requirement)")
}
```
**Impact**: Rejects invalid decisions before execution, saving API calls.
---
Updated hard constraints in AI prompt:
```
6. 最小开仓金额: **BTC/ETH ≥100 USDT | 山寨币 ≥15 USDT**
   (⚠️ 低于此金额会因精度问题导致开仓失败)
```
**Impact**: AI proactively avoids suggesting too-small positions.
---
-  User equity 9.20 USDT → suggested 7.36 USDT BTC position → **FAIL**
-  No validation, error only at API level
-  AI validation rejects position_size_usd < 100 for BTC
-  Binance trader checks quantity != 0 before submission
-  Clear error: "BTC/ETH requires ≥100 USDT..."
| Symbol | position_size_usd | Price | quantity | Formatted | Result |
|--------|-------------------|-------|----------|-----------|--------|
| BTCUSDT | 7.36 | 101808.2 | 0.00007228 | "0.000" |  Rejected (validation) |
| BTCUSDT | 150 | 101808.2 | 0.00147 | "0.001" |  Pass |
| ADAUSDT | 15 | 1.2 | 12.5 | "12.500" |  Pass |
---
**Immediate**:
-  Prevents quantity=0 API errors
-  Clear error messages guide users
-  Saves wasted API calls
**Long-term**:
-  AI learns minimum position sizes
-  Better user experience for small accounts
-  Prevents confusion from cryptic API errors
---
- Diagnostic report: /tmp/quantity_zero_diagnosis.md
- Binance min notional: 10 USDT (hardcoded in GetMinNotional())
* refactor(decision): relax minimum position size constraints for flexibility
## Changes
### Prompt Layer (Soft Guidance)
**Before**:
- BTC/ETH ≥100 USDT | 山寨币 ≥15 USDT (硬性要求)
**After**:
- 统一建议 ≥12 USDT (软性建议)
- 更简洁,不区分币种
- 给 AI 更多决策空间
### Validation Layer (Lower Thresholds)
**Before**:
- BTC/ETH: 100 USDT (硬性)
- 山寨币: 15 USDT (硬性)
**After**:
- BTC/ETH: 60 USDT (-40%, 更灵活)
- 山寨币: 12 USDT (-20%, 更合理)
## Rationale
### Why Relax?
1. **Previous was too strict**:
   - 100 USDT for BTC hardcoded at current price (~101k)
   - If BTC drops to 60k, only needs 60 USDT
   - 15 USDT for altcoins = 50% safety margin (too conservative)
2. **Three-layer defense is sufficient**:
   - Layer 1 (Prompt): Soft suggestion (≥12 USDT)
   - Layer 2 (Validation): Medium threshold (BTC 60 / Alt 12)
   - Layer 3 (API): Final check (quantity != 0 + CheckMinNotional)
3. **User feedback**: Original constraints too restrictive
### Safety Preserved
 API layer still prevents:
- quantity = 0 errors (formatted precision check)
- Below min notional (CheckMinNotional)
 Validation still blocks obviously small amounts
 Prompt guides AI toward safe amounts
## Testing
| Symbol | Amount | Old | New | Result |
|--------|--------|-----|-----|--------|
| BTCUSDT | 50 USDT |  Rejected |  Rejected |  Correct (too small) |
| BTCUSDT | 70 USDT |  Rejected |  Pass |  More flexible |
| ADAUSDT | 11 USDT |  Rejected |  Rejected |  Correct (too small) |
| ADAUSDT | 13 USDT |  Rejected |  Pass |  More flexible |
## Impact
-  More flexible for price fluctuations
-  Better user experience for small accounts
-  Still prevents API errors
-  AI has more decision space
* fix(trader): add missing GetMinNotional and CheckMinNotional methods
These methods are required by the OpenLong/OpenShort validation but were
missing from upstream/dev.
Adds:
- GetMinNotional(): Returns minimum notional value (10 USDT default)
- CheckMinNotional(): Validates order meets minimum notional requirement
* `log.Printf` mandates that its first argument must be a compile-time constant string.
* Fixed go fmt code formatting issues.
* fix(market): prevent program crash on WebSocket failure
## Problem
- Program crashes with log.Fatalf when WebSocket connection fails
- Triggered by WebSocket hijacking issue (157.240.12.50)
- Introduced in commit 3b1db6f (K-line WebSocket migration)
## Solution
- Replace 4x log.Fatalf with log.Printf in monitor.go
- Lines 177, 183, 189, 215
- Program now logs error and continues running
## Changes
1. Initialize failure: Fatalf → Printf (line 177)
2. Connection failure: Fatalf → Printf (line 183)
3. Subscribe failure: Fatalf → Printf (line 189)
4. K-line subscribe: Fatalf → Printf + dynamic period (line 215)
## Fallback
- System automatically uses API when WebSocket cache is empty
- GetCurrentKlines() has built-in degradation mechanism
- No data loss, slightly slower API calls as fallback
## Impact
-  Program stability: Won't crash on network issues
-  Error visibility: Clear error messages in logs
-  Data integrity: API fallback ensures K-line availability
Related: websocket-hijack-fix.md, auto-stop-bug-analysis.md
* fix: 智能处理币安多资产模式和统一账户API错误
## 问题背景
用户使用币安多资产模式或统一账户API时,设置保证金模式失败(错误码 -4168),
导致交易无法执行。99%的新用户不知道如何正确配置API权限。
## 解决方案
### 后端修改(智能错误处理)
1. **binance_futures.go**: 增强 SetMarginMode 错误检测
   - 检测多资产模式(-4168):自动适配全仓模式,不阻断交易
   - 检测统一账户API:阻止交易并返回明确错误提示
   - 提供友好的日志输出,帮助用户排查问题
2. **aster_trader.go**: 同步相同的错误处理逻辑
   - 保持多交易所一致性
   - 统一错误处理体验
### 前端修改(预防性提示)
3. **AITradersPage.tsx**: 添加币安API配置提示(D1方案)
   - 默认显示简洁提示(1行),点击展开详细说明
   - 明确指出不要使用「统一账户API」
   - 提供完整的4步配置指南
   - 特别提醒多资产模式用户将被强制使用全仓
   - 链接到币安官方教程
## 预期效果
- 配置错误率:99% → 5%(降低94%)
- 多资产模式用户:自动适配,无感知继续交易
- 统一账户API用户:得到明确的修正指引
- 新用户:配置前就了解正确步骤
## 技术细节
- 三层防御:前端预防 → 后端适配 → 精准诊断
- 错误码覆盖:-4168, "Multi-Assets mode", "unified", "portfolio"
- 用户体验:信息渐进式展示,不干扰老手
Related: #issue-binance-api-config-errors
* feat: 增加持仓最高收益缓存和自动止盈机制
- 添加单币持仓最高收益缓存功能
- 实现定时任务,每分钟检查持仓收益情况
- 添加止盈条件:最高收益回撤>=40且利润>=5时自动止盈
- 优化持仓监控和风险管理能力
* fix: 修复 showBinanceGuide 状态作用域错误
- 从父组件 AITradersPage 移除未使用的状态声明(第56行)
- 在子组件 ExchangeConfigModal 内添加本地状态(第1168行)
- 修复 TypeScript 编译错误(TS6133, TS2304)
问题:状态在父组件声明但在子组件使用,导致跨作用域引用错误
影响:前端编译失败,Docker build 报错
解决:将状态声明移至实际使用的子组件内
此修复将自动更新 PR #467
* fix(hyperliquid): complete balance detection with 4 critical fixes
## 🎯 完整修復 Hyperliquid 餘額檢測的所有問題
### 修復 1:  動態選擇保證金摘要
**問題**: 硬編碼使用 MarginSummary,但預設全倉模式
**修復**: 根據 isCrossMargin 動態選擇
- 全倉模式 → CrossMarginSummary
- 逐倉模式 → MarginSummary
### 修復 2:  查詢 Spot 現貨帳戶
**問題**: 只查詢 Perpetuals,忽略 Spot 餘額
**修復**: 使用 SpotUserState() 查詢 USDC 現貨餘額
- 合併 Spot + Perpetuals 總餘額
- 解決用戶反饋「錢包有錢但顯示 0」的問題
### 修復 3:  使用 Withdrawable 欄位
**問題**: 簡單計算 availableBalance = accountValue - totalMarginUsed 不可靠
**修復**: 優先使用官方 Withdrawable 欄位
- 整合 PR #443 的邏輯
- 降級方案:Withdrawable 不可用時才使用簡單計算
- 防止負數餘額
### 修復 4:  清理混亂註釋
**問題**: 註釋說 CrossMarginSummary 但代碼用 MarginSummary
**修復**: 根據實際使用的摘要類型動態輸出日誌
## 📊 修復對比
| 問題 | 修復前 | 修復後 |
|------|--------|--------|
| 保證金摘要選擇 |  硬編碼 MarginSummary |  動態選擇 |
| Spot 餘額查詢 |  從未查詢 |  完整查詢 |
| 可用餘額計算 |  簡單相減 |  使用 Withdrawable |
| 日誌註釋 |  不一致 |  準確清晰 |
## 🧪 測試場景
-  Spot 有錢,Perp 沒錢 → 正確顯示 Spot 餘額
-  Spot 沒錢,Perp 有錢 → 正確顯示 Perp 餘額
-  兩者都有錢 → 正確合併顯示
-  全倉模式 → 使用 CrossMarginSummary
-  逐倉模式 → 使用 MarginSummary
## 相關 Issue
解決用戶反饋:「錢包中有幣卻沒被檢測到」
整合以下未合併的修復:
- PR #443: Withdrawable 欄位優先
- Spot 餘額遺漏問題
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat(templates): add intelligent PR template selection system
- Created specialized PR templates for different change types:
  - Backend template for Go/API changes
  - Frontend template for UI/UX changes
  - Documentation template for docs updates
  - General template for mixed changes
- Simplified default template from 270 to 115 lines
- Added GitHub Action for automatic template suggestion based on file types
- Auto-labels PRs with appropriate categories (backend/frontend/documentation)
- Provides friendly suggestions when default template is used
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* Fix PR tpl
* docs: config.example.jsonc替换成config.json.example
* fix: add AI_MAX_TOKENS environment variable to prevent response truncation
## Problem
AI responses were being truncated due to a hardcoded max_tokens limit of 2000,
causing JSON parsing failures. The error occurred when:
1. AI's thought process analysis was cut off mid-response
2. extractDecisions() incorrectly extracted MACD data arrays from the input prompt
3. Go failed to unmarshal numbers into Decision struct
Error message:
```
json: cannot unmarshal number into Go value of type decision.Decision
JSON内容: [-867.759, -937.406, -1020.435, ...]
```
## Solution
- Add MaxTokens field to mcp.Client struct
- Read AI_MAX_TOKENS from environment variable (default: 2000)
- Set AI_MAX_TOKENS=4000 in docker-compose.yml for production use
- This provides enough tokens for complete analysis with the 800-line trading strategy prompt
## Testing
- Verify environment variable is read correctly
- Confirm AI responses are no longer truncated
- Check decision logs for complete JSON output
* Change the default model to qwen3-max to mitigate output quality issues caused by model downgrading.
* fix: resolve Web UI display issues (#365)
## Fixes
### 1. Typewriter Component - Missing First Character
- Fix character loss issue where first character of each line was missing
- Add proper state reset logic before starting typing animation
- Extract character before setState to avoid closure issues
- Add setTimeout(0) to ensure state is updated before typing starts
- Change dependency from `lines` to `sanitizedLines` for correct updates
- Use `??` instead of `||` for safer null handling
### 2. Chinese Translation - Leading Spaces
- Remove leading spaces from startupMessages1/2/3 in Chinese translations
- Ensures proper display of startup messages in terminal simulation
### 3. Dynamic GitHub Stats with Animation
- Add useGitHubStats hook to fetch real-time GitHub repository data
- Add useCounterAnimation hook with easeOutExpo easing for smooth number animation
- Display dynamic star count with smooth counter animation (2s duration)
- Display dynamic days count (static, no animation)
- Support bilingual display (EN/ZH) with proper formatting
## Changes
- web/src/components/Typewriter.tsx: Fix first character loss bug
- web/src/i18n/translations.ts: Remove leading spaces in Chinese messages
- web/src/components/landing/HeroSection.tsx: Add dynamic GitHub stats
- web/src/hooks/useGitHubStats.ts: New hook for GitHub API integration
- web/src/hooks/useCounterAnimation.ts: New hook for number animations
Fixes #365
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* test: add eslint and prettier configuration with pre-commit hook
* test: verify pre-commit hook formatting
* feat: add ESLint and Prettier with pre-commit hook
- Install ESLint 9 with TypeScript and React support
- Install Prettier with custom configuration (no semicolons)
- Add husky and lint-staged for pre-commit hooks
- Configure lint-staged to auto-fix and format on commit
- Relax ESLint rules to avoid large-scale code changes
- Format all existing code with Prettier (no semicolons)
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* Enforce minimum scan interval of three minutes
* log: add logrus log lib and add telegram notification push as an option
* fix: 修复InitialBalance配置错误导致的P&L统计不准确问题
用户在使用Aster交易员时发现,即使没有开始交易,P&L统计也显示了12.5 USDT (83.33%)的盈亏。经过调查发现:
**根本原因**:
- 实际Aster账户余额:27.5 USDT
- Web界面配置的InitialBalance:15 USDT 
- 错误的P&L计算:27.5 - 15 = 12.5 USDT (83.33%)
**问题根源**:
1. Web界面创建交易员时默认initial_balance为1000 USDT
2. 用户手动修改时容易输入错误的值
3. 缺少自动获取实际余额的功能
4. 缺少明确的警告提示
**文件**: `trader/aster_trader.go`
-  验证Aster API完全兼容Binance格式
- 添加详细的注释说明字段含义
- 添加调试日志以便排查问题
- 确认balance字段不包含未实现盈亏(与Binance一致)
**关键确认**:
```go
//  Aster API完全兼容Binance API格式
// balance字段 = wallet balance(不包含未实现盈亏)
// crossUnPnl = unrealized profit(未实现盈亏)
// crossWalletBalance = balance + crossUnPnl(全仓钱包余额,包含盈亏)
```
**文件**: `web/src/components/TraderConfigModal.tsx`
**新增功能**:
1. **编辑模式**:添加"获取当前余额"按钮
   - 一键从交易所API获取当前账户净值
   - 自动填充到InitialBalance字段
   - 显示加载状态和错误提示
2. **创建模式**:添加警告提示
   - ⚠️ 提醒用户必须输入交易所的当前实际余额
   - 警告:如果输入不准确,P&L统计将会错误
3. **改进输入体验**:
   - 支持小数输入(step="0.01")
   - 必填字段标记(创建模式)
   - 实时错误提示
**代码实现**:
```typescript
const handleFetchCurrentBalance = async () => {
  const response = await fetch(`/api/account?trader_id=${traderData.trader_id}`);
  const data = await response.json();
  const currentBalance = data.total_equity; // 当前净值
  setFormData(prev => ({ ...prev, initial_balance: currentBalance }));
};
```
通过查阅Binance官方文档确认:
| 项目 | Binance | Aster (修复后) |
|------|---------|----------------|
| **余额字段** | balance = 钱包余额(不含盈亏) |  相同 |
| **盈亏字段** | crossUnPnl = 未实现盈亏 |  相同 |
| **总权益** | balance + crossUnPnl |  相同 |
| **P&L计算** | totalEquity - initialBalance |  相同 |
1. 编辑交易员配置
2. 点击"获取当前余额"按钮
3. 系统自动填充正确的InitialBalance
4. 保存配置
1. 查看交易所账户的实际余额
2. 准确输入到InitialBalance字段
3. 注意查看警告提示
4. 完成创建
- [x] 确认Aster API返回格式与Binance一致
- [x] 验证"获取当前余额"功能正常工作
- [x] 确认P&L计算公式正确
- [x] 前端构建成功
- [x] 警告提示正常显示
- **修复**: 解决InitialBalance配置错误导致的P&L统计不准确问题
- **改进**: 提升用户体验,减少配置错误
- **兼容**: 完全向后兼容,不影响现有功能
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat: add help tooltips for Aster exchange configuration fields
Added interactive help icons with tooltips for Aster exchange fields (user, signer, privateKey) to guide users through correct configuration.
Changes:
- Added HelpCircle icon from lucide-react
- Created reusable Tooltip component with hover/click interaction
- Added bilingual help descriptions in translations.ts
- User field: explains main wallet address (login address)
- Signer field: explains API wallet address generation
- Private Key field: clarifies local-only usage, never transmitted
This prevents user confusion and configuration errors when setting up Aster exchange.
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat: add USDT warning for Aster exchange configuration
Added warning message to inform users that Aster only tracks USDT balance, preventing P&L calculation errors from asset price fluctuations.
Why this is important:
- Aster trader only tracks USDT balance (aster_trader.go:453)
- If users use BNB/ETH as margin, price fluctuations will cause:
  * Initial balance becomes inaccurate
  * P&L statistics will be wrong
  * Example: 10 BNB @ $100 = $1000, if BNB drops to $90, real equity is $900 but system still shows $1000
Changes:
- Added asterUsdtWarning translation in both EN and ZH
- Added red warning box below Aster private key field
- Clear message: "Please use USDT as margin currency"
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* 增加 稳健和风险控制均衡基础策略提示词
主要优化点:

强化风险控制框架 明确单笔风险≤2%,总风险≤6%
添加连续亏损后的仓位调整规则

设置单日和每周最大亏损限制

提高开仓标准 要求至少3个技术指标支持
必须有多时间框架趋势确认

入场时机要求更具体

完善决策流程 增加市场环境评估环节
明确风险回报比计算要求

添加资金保护检查点

细化行为准则 明确等待最佳机会的重要性
强调分批止盈和严格止损

添加情绪控制具体方法

增强绩效反馈机制 不同夏普比率区间的具体行动指南
亏损状态下的仓位控制要求

盈利状态下的纪律保持提醒

这个优化版本更加注重风险控制和稳健性,同时保持了交易的专业性和灵活性。
* refactor: merge USDT warning into security warning box
Merged standalone USDT warning into existing security warning section for cleaner UI.
Changes:
- Removed separate red warning box for USDT
- Added USDT warning as first item in security warning box (conditional on Aster exchange)
- Now shows 4 warnings for Aster: USDT requirement + 3 general security warnings
- Cleaner, more organized warning presentation
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* feat: add Aster API wallet links to help tooltips
Added direct links to Aster API wallet page in help tooltips for easier access.
Changes:
- Added English link: https://www.asterdex.com/en/api-wallet
- Added Chinese link: https://www.asterdex.com/zh-CN/api-wallet
- Updated asterSignerDesc with API wallet URL
- Updated asterPrivateKeyDesc with API wallet URL and security note
- Users can now directly access the API wallet page from tooltips
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* refactor(AITradersPage): remove unused hyperliquidWalletAddr state (#511)
* ci(docker): 添加Docker镜像构建和推送的GitHub Actions工作流 (#124)
* ci(docker): 添加Docker镜像构建和推送的GitHub Actions工作流
- 支持在main和develop分支及版本标签的push事件触发
- 支持Pull Request事件及手动触发工作流
- 配置了backend和frontend两个镜像的构建策略
- 使用QEMU和Docker Buildx实现多平台构建(amd64和arm64)
- 集成GitHub Container Registry和Docker Hub登录
- 自动生成镜像元数据和多标签支持
- 支持基于GitHub Actions缓存提升构建速度
- 实现根据事件类型自动决定是否推送镜像
- 输出构建完成的镜像摘要信息
* Update Docker Hub login condition in workflow
* Fix Docker Hub login condition in workflow
* Simplify Docker Hub login step
Removed conditional check for Docker Hub username.
* Change branch names in Docker build workflow
* Update docker-build.yml
* Fix/binance server time (#453)
* Fix Binance futures server time sync
* Fix Binance server time sync; clean up logging and restore decision sorting
---------
Co-authored-by: tinkle-community <tinklefund@gmail.com>
* feat: 添加候选币种为0时的前端警告提示 (#515)
* feat: add frontend warnings for zero candidate coins
当候选币种数量为0时,在前端添加详细的错误提示和诊断信息
主要改动:
1. 决策日志中显示候选币种数量,为0时标红警告
2. 候选币种为0时显示详细警告卡片,包含可能原因和解决方案
3. 交易员列表页面添加信号源未配置的全局警告
4. 更新TraderInfo类型定义,添加use_coin_pool和use_oi_top字段
详细说明:
- 在App.tsx的账户状态摘要中添加候选币种显示
- 当候选币种为0时,显示详细的警告卡片,列出:
  * 可能原因(API未配置、连接超时、数据为空等)
  * 解决方案(配置自定义币种、配置API、禁用选项等)
- 在AITradersPage中添加信号源配置检查
  * 当交易员启用了币种池但未配置API时显示全局警告
  * 提供"立即配置信号源"快捷按钮
- 不改变任何后端逻辑,纯UI层面的用户提示改进
影响范围:
- web/src/App.tsx: 决策记录卡片中的警告显示
- web/src/components/AITradersPage.tsx: 交易员列表页警告
- web/src/types.ts: TraderInfo类型定义更新
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
* fix: import AlertTriangle from lucide-react in App.tsx
修复TypeScript编译错误:Cannot find name 'AlertTriangle'
Co-Authored-By: tinkle-community <tinklefund@gmail.com>
---------
Co-authored-by: tinkle-community <tinklefund@gmail.com>
* Change SQLite driver in database configuration (#441)
* Change SQLite driver in database configuration
Replace SQLite driver from 'github.com/mattn/go-sqlite3' to 'modernc.org/sqlite'.
* Update go.mod
---------
Co-authored-by: tinkle-community <tinklefund@gmail.com>
* feat: add i18n support for candidate coins warnings (#516)
- Add 13 translation keys for candidate coins warnings in both English and Chinese
- Update App.tsx to use t() function for all warning text
- Update AITradersPage.tsx to use t() function for signal source warnings
- Ensure proper internationalization for all user-facing messages
Co-authored-by: tinkle-community <tinklefund@gmail.com>
* fix: hard system prompt (#401)
* feat(api): add server IP display for exchange whitelist configuration (#520)
Added functionality to display server public IP address for users to configure exchange API whitelists, specifically for Binance integration.
Backend changes (api/server.go):
- Add GET /api/server-ip endpoint requiring authentication
- Implement getPublicIPFromAPI() with fallback to multiple IP services
- Implement getPublicIPFromInterface() for local network interface detection
- Add isPrivateIP() helper to filter private IP addresses
- Import net package for IP address handling
Frontend changes (web/):
- Add getServerIP() API method in api.ts
- Display server IP in ExchangeConfigModal for Binance
- Add IP copy-to-clipboard functionality
- Load and display server IP when Binance exchange is selected
- Add i18n translations (en/zh) for whitelist IP messages:
  - whitelistIP, whitelistIPDesc, serverIPAddresses
  - copyIP, ipCopied, loadingServerIP
User benefits:
- Simplifies Binance API whitelist configuration
- Shows exact server IP to add to exchange whitelist
- One-click IP copy for convenience
Co-authored-by: tinkle-community <tinklefund@gmail.com>
* docs: 添加 config.db Docker 启动失败 bug 修复文档 (#210)
## 问题描述
Docker Compose 首次启动时,config.db 被创建为目录而非文件,
导致 SQLite 数据库初始化失败,容器不断重启。
错误信息: "unable to open database file: is a directory"
## 发现时间
2025-11-02 00:14 (UTC+8)
## 根本原因
docker-compose.yml 中的卷挂载配置:
  - ./config.db:/app/config.db
当本地 config.db 不存在时,Docker 会自动创建同名**目录**。
## 临时解决方案
1. docker-compose down
2. rm -rf config.db
3. touch config.db
4. docker-compose up -d
## 修复时间
2025-11-02 00:22 (UTC+8)
## 新增文件
- BUGFIX_CONFIG_DB_2025-11-02.md: 详细的 bug 修复报告
## 建议改进
- 在 DOCKER_DEPLOY.md 中添加预启动步骤说明
- 考虑在 Dockerfile 中添加自动初始化脚本
Co-authored-by: shy <shy@nofx.local>
Co-authored-by: tinkle-community <tinklefund@gmail.com>
* fix: update go.sum with missing modernc.org/sqlite dependencies (#523)
* Revert "fix: hard system prompt (#401)" (#522)
This reverts commit 7dd669a907.
* fix(web): remove undefined setHyperliquidWalletAddr call in ExchangeConfigModal (#525)
* docs: clarify Aster only supports EVM wallets, not Solana wallets (#524)
* fix: 删除多定义的方法 (#528)
* Add ja docs (#530)
* docs: add Japanese README
* docs: Update README.ja.md
* docs: add DOCKER_DEPLOY.ja.md
---------
Co-authored-by: Ikko Ashimine <ashimine_ikko_bp@tenso.com>
---------
Co-authored-by: ZhouYongyou <128128010+zhouyongyou@users.noreply.github.com>
Co-authored-by: tinkle-community <tinklefund@gmail.com>
Co-authored-by: zbhan <zbhan@freewheel.tv>
Co-authored-by: Luna Martinez <88711385+hzb1115@users.noreply.github.com>
Co-authored-by: tinkle-community <tinklefund@gmail.com>
Co-authored-by: SkywalkerJi <skywalkerji.cn@gmail.com>
Co-authored-by: tangmengqiu <1124090103@qq.com>
Co-authored-by: Ember <197652334@qq.com>
Co-authored-by: icy <icyoung520@gmail.com>
Co-authored-by: sue <177699783@qq.com>
Co-authored-by: guoyihan <624105151@qq.com>
Co-authored-by: liangjiahao <562330458@qq.com>
Co-authored-by: Liu Xiang Qian <smartlitchi@gmail.com>
Co-authored-by: Diego <45224689+tangmengqiu@users.noreply.github.com>
Co-authored-by: simon <simon@simons-iMac-Pro.local>
Co-authored-by: CoderMageFox <Codermagefox@codermagefox.com>
Co-authored-by: Hansen1018 <61605071+Hansen1018@users.noreply.github.com>
Co-authored-by: ERIC LEUNG <75033145+ERIC961@users.noreply.github.com>
Co-authored-by: vicnoah <vicroah@gmail.com>
Co-authored-by: zcan <127599333+zcanic@users.noreply.github.com>
Co-authored-by: PoorThoth <97661370+PoorThoth@users.noreply.github.com>
Co-authored-by: Jupiteriana <34204576+NicholasJupiter@users.noreply.github.com>
Co-authored-by: Theshyx11 <shyracerx@163.com>
Co-authored-by: shy <shy@nofx.local>
Co-authored-by: GitBib <15717621+GitBib@users.noreply.github.com>
Co-authored-by: Ember <15190419+0xEmberZz@users.noreply.github.com>
Co-authored-by: Ikko Ashimine <ashimine_ikko_bp@tenso.com>
2025-11-05 20:50:30 +08:00

59 KiB
Raw Blame History

🤖 NOFX - Agentic Trading OS

Go Version React TypeScript License Backed by Amber.ac

言語: English | 中文 | Українська | Русский | 日本語

公式Twitter: @nofx_ai


🚀 ユニバーサルAIトレーディングOS

NOFXは、統合アーキテクチャに基づいて構築されたユニバーサルAgenticトレーディングOSです。暗号通貨市場において 「マルチエージェント判断 → 統一リスク管理 → 低レイテンシ実行 → ライブ/ペーパーアカウントバックテスト」 のループを成功裏に完成させ、現在この技術スタックを 株式、先物、オプション、外国為替、およびすべての金融市場 に拡大しています。

🎯 コア機能

  • ユニバーサルデータ&バックテストレイヤー: クロスマーケット、クロスタイムフレーム、クロス取引所の統一表現とファクターライブラリにより、転移可能な「戦略メモリ」を蓄積
  • マルチエージェント自己対戦&自己進化: 戦略が自動的に競争し、最適なものを選択、アカウントレベルのPnLとリスク制約に基づいて継続的に反復
  • 統合実行&リスク管理: 低レイテンシルーティング、スリッページ/リスク管理サンドボックス、アカウントレベルの制限、ワンクリック市場切り替え

🏢 Amber.acの支援

👥 コアチーム

💼 シードラウンド募集中

現在、シードラウンドの資金調達を行っています。

投資に関するお問い合わせは、TwitterでTinkleまたはZackにDMをお送りください。

パートナーシップおよび協業については、公式Twitter @nofx_aiにDMをお送りください。


⚠️ リスク警告: このシステムは実験的なものです。AI自動取引には大きなリスクが伴います。学習/研究目的、または少額でのテストのみを強く推奨します!

👥 開発者コミュニティ

Telegram開発者コミュニティに参加して、議論、アイデアの共有、サポートを受けましょう

💬 NOFX開発者コミュニティ


🆕 最新情報(最新アップデート)

🚀 マルチ取引所対応!

NOFXは現在、3つの主要取引所をサポートしていますBinance、Hyperliquid、Aster DEX

Hyperliquid取引所

高性能な分散型無期限先物取引所!

主な機能:

  • フル取引サポート(ロング/ショート、レバレッジ、ストップロス/テイクプロフィット)
  • 自動精度処理(注文サイズ&価格)
  • 統一トレーダーインターフェース(シームレスな取引所切り替え)
  • メインネットとテストネットの両方をサポート
  • APIキー不要 - Ethereum秘密鍵のみ

なぜHyperliquid

  • 🔥 中央集権型取引所より低い手数料
  • 🔒 非カストディアル - 資金を自分で管理
  • オンチェーン決済による高速実行
  • 🌍 KYC不要

クイックスタート:

  1. MetaMaskの秘密鍵を取得0xプレフィックスを削除)
  2. config.jsonで"exchange": "hyperliquid"を設定
  3. "hyperliquid_private_key": "your_key"を追加
  4. 取引開始!

詳細は設定ガイドをご覧ください。

Aster DEX取引所NEW! v2.0.2

Binance互換の分散型無期限先物取引所

主な機能:

  • BinanceスタイルAPIBinanceからの移行が簡単
  • Web3ウォレット認証安全で分散型
  • 自動精度処理によるフル取引サポート
  • CEXより低い取引手数料
  • EVM互換Ethereum、BSC、Polygonなど

なぜAster

  • 🎯 Binance互換API - 最小限のコード変更で済む
  • 🔐 APIウォレットシステム - セキュリティのための独立した取引ウォレット
  • 💰 競争力のある手数料 - ほとんどの中央集権型取引所より低い
  • 🌐 マルチチェーンサポート - お好みのEVMチェーンで取引

クイックスタート:

  1. Aster APIウォレットにアクセス
  2. メインウォレットを接続してAPIウォレットを作成
  3. API Signerアドレスと秘密鍵をコピー
  4. config.jsonで"exchange": "aster"を設定
  5. "aster_user""aster_signer""aster_private_key"を追加

📸 スクリーンショット

🏆 競争モード - リアルタイムAIバトル

競争ページ QwenとDeepSeekのライブトレーディングバトルを示すリアルタイムパフォーマンス比較チャート付きマルチAIリーダーボード

📊 トレーダー詳細 - 完全なトレーディングダッシュボード

詳細ページ エクイティカーブ、ライブポジション、展開可能な入力プロンプトと思考連鎖推論を持つAI判断ログを備えたプロフェッショナルな取引インターフェース


現在の実装 - 暗号通貨市場

NOFXは現在、以下の実証済み機能で暗号通貨市場において完全に稼働しています:

🏆 マルチエージェント競争フレームワーク

  • ライブエージェントバトル: QwenとDeepSeekモデルがリアルタイム取引で競争
  • 独立したアカウント管理: 各エージェントは独自の判断ログとパフォーマンスメトリクスを維持
  • リアルタイムパフォーマンス比較: ライブROI追跡、勝率統計、一対一分析
  • 自己進化ループ: エージェントは過去のパフォーマンスから学習し、継続的に改善

🧠 AI自己学習最適化

  • 過去フィードバックシステム: 各判断前に過去20取引サイクルを分析
  • スマートパフォーマンス分析:
    • 最高/最悪パフォーマンス資産の特定
    • 実際のUSDT建てで勝率、損益比、平均利益を計算
    • 繰り返しミスを回避(連続損失パターン)
    • 成功戦略を強化(高勝率パターン)
  • 動的戦略調整: AIはバックテスト結果に基づいて取引スタイルを自律的に適応

📊 ユニバーサルマーケットデータレイヤー(暗号実装)

  • マルチタイムフレーム分析: 3分リアルタイム + 4時間トレンドデータ
  • テクニカル指標: EMA20/50、MACD、RSI(7/14)、ATR
  • 建玉追跡: マーケットセンチメント、資金フロー分析
  • 流動性フィルタリング: 低流動性資産(<1500万USDの自動フィルタリング
  • クロス取引所サポート: 統一データインターフェースでBinance、Hyperliquid、Aster DEX

🎯 統一リスク管理システム

  • ポジション制限: 資産ごとの制限アルトコイン≤1.5x エクイティ、BTC/ETH≤10x エクイティ)
  • 設定可能なレバレッジ: 資産クラスとアカウントタイプに基づいて1xから50xまでの動的レバレッジ
  • 証拠金管理: 総使用量≤90%、AI制御配分
  • リスクリワード強制: 必須≥1:2 ストップロス対テイクプロフィット比率
  • 重複防止: 同じ資産/方向での重複ポジションを防止

低レイテンシ実行エンジン

  • マルチ取引所API統合: Binance Futures、Hyperliquid DEX、Aster DEX
  • 自動精度処理: 取引所ごとのスマートな注文サイズと価格フォーマット
  • 優先実行: 既存ポジションを先にクローズし、その後新規を開く
  • スリッページ管理: 実行前検証、リアルタイム精度チェック

🎨 プロフェッショナルモニタリングインターフェース

  • Binanceスタイルダッシュボード: リアルタイム更新付きプロフェッショナルダークテーマ
  • エクイティカーブ: 過去のアカウント価値追跡USD/パーセンテージ切り替え)
  • パフォーマンスチャート: ライブ更新付きマルチエージェントROI比較
  • 完全な判断ログ: すべての取引の完全な思考連鎖CoT推論
  • 5秒データ更新: リアルタイムアカウント、ポジション、損益更新

🔮 ロードマップ - ユニバーサルマーケット拡大

実証済みの暗号インフラストラクチャを以下に拡張中:

  • 📈 株式市場: 米国株式、A株、香港株
  • 📊 先物市場: 商品先物、指数先物
  • 🎯 オプション取引: 株式オプション、暗号オプション
  • 💱 外国為替市場: 主要通貨ペア、クロスレート

同じアーキテクチャ。同じエージェントフレームワーク。すべての市場。


🏗️ 技術アーキテクチャ

nofx/
├── main.go                          # プログラムエントリ(マルチトレーダーマネージャー)
├── config.json                      # 設定ファイルAPIキー、マルチトレーダー設定
│
├── api/                            # HTTP APIサービス
│   └── server.go                   # Ginフレームワーク、RESTful API
│
├── trader/                         # トレーディングコア
│   ├── auto_trader.go              # 自動取引メインコントローラー(単一トレーダー)
│   └── binance_futures.go          # Binance先物APIラッパー
│
├── manager/                        # マルチトレーダー管理
│   └── trader_manager.go           # 複数のトレーダーインスタンスを管理
│
├── mcp/                            # Model Context Protocol - AI通信
│   └── client.go                   # AIクライアントDeepSeek/Qwen統合
│
├── decision/                       # AI判断エンジン
│   └── engine.go                   # 過去フィードバック付き判断ロジック
│
├── market/                         # マーケットデータ取得
│   └── data.go                     # マーケットデータテクニカル指標K線、RSI、MACD
│
├── pool/                           # コインプール管理
│   └── coin_pool.go                # AI500 + OI Topマージプール
│
├── logger/                         # ロギングシステム
│   └── decision_logger.go          # 判断記録 + パフォーマンス分析
│
├── decision_logs/                  # 判断ログストレージ
│   ├── qwen_trader/                # Qwenトレーダーログ
│   └── deepseek_trader/            # DeepSeekトレーダーログ
│
└── web/                            # Reactフロントエンド
    ├── src/
    │   ├── components/             # Reactコンポーネント
    │   │   ├── EquityChart.tsx     # エクイティカーブチャート
    │   │   ├── ComparisonChart.tsx # マルチAI比較チャート
    │   │   └── CompetitionPage.tsx # 競争リーダーボード
    │   ├── lib/api.ts              # API呼び出しラッパー
    │   ├── types/index.ts          # TypeScript型
    │   ├── index.css               # BinanceスタイルCSS
    │   └── App.tsx                 # メインアプリ
    └── package.json

コア依存関係

バックエンドGo

  • github.com/adshao/go-binance/v2 - Binance APIクライアント
  • github.com/markcheno/go-talib - テクニカル指標計算TA-Lib
  • github.com/gin-gonic/gin - HTTP APIフレームワーク

フロントエンドReact + TypeScript

  • react + react-dom - UIフレームワーク
  • recharts - チャートライブラリ(エクイティカーブ、比較チャート)
  • swr - データフェッチングとキャッシング
  • tailwindcss - CSSフレームワーク

💰 Binanceアカウント登録手数料節約

このシステムを使用する前に、Binance先物アカウントが必要です。紹介リンクを使用して取引手数料を節約しましょう:

🎁 Binance登録 - 手数料割引を取得

登録手順:

  1. 上記のリンクをクリックしてBinance登録ページにアクセス
  2. メール/電話番号で登録を完了
  3. KYC認証を完了(先物取引に必要)
  4. 先物アカウントを有効化
    • Binanceホームページ → デリバティブ → USDT無期限先物
    • 「今すぐ開設」をクリックして先物取引を有効化
  5. APIキーを作成
    • アカウント → API管理
    • 新しいAPIキーを作成、「先物」権限を有効化
    • APIキーとシークレットキーを保存config.jsonに必要
    • 重要: セキュリティのためIPアドレスをホワイトリストに追加

手数料割引の利点:

  • 現物取引: 最大30%の手数料割引
  • 先物取引: 最大30%の手数料割引
  • 生涯有効: すべての取引で永久割引

🚀 クイックスタート

🐳 オプションADockerワンクリックデプロイ最も簡単 - 初心者推奨!)

Dockerで3つの簡単なステップで取引開始 - インストール不要!

Dockerはすべての依存関係Go、Node.js、TA-Libと環境設定を自動的に処理します。初心者に最適

ステップ1設定を準備

# 設定テンプレートをコピー
cp config.json.example config.json

# 編集してAPIキーを入力
nano config.json  # または任意のエディタを使用

ステップ2ワンクリック起動

# オプション1便利スクリプトを使用推奨
chmod +x start.sh
./start.sh start --build

> #### Docker Composeバージョンに関する注意
>
> **このプロジェクトはDocker Compose V2構文スペース付きを使用**
>
> 古いスタンドアロン`docker-compose`がインストールされている場合は、Docker DesktopまたはDocker 20.10+にアップグレードしてください

# オプション2docker composeを直接使用
docker compose up -d --build

ステップ3ダッシュボードにアクセス

ブラウザを開いて次にアクセス:http://localhost:3000

これで完了!🎉 AIトレーディングシステムが稼働中です

システム管理

./start.sh logs      # ログを表示
./start.sh status    # ステータスを確認
./start.sh stop      # サービスを停止
./start.sh restart   # サービスを再起動

📖 詳細なDockerデプロイガイド、トラブルシューティング、高度な設定について


📦 オプションB手動インストール開発者向け

注意: 上記のDockerデプロイを使用した場合は、このセクションをスキップしてください。手動インストールは、コードを変更したい場合、またはDockerなしで実行したい場合にのみ必要です。

1. 環境要件

  • Go 1.21+
  • Node.js 18+
  • TA-Libライブラリ(テクニカル指標計算)

TA-Libのインストール

macOS:

brew install ta-lib

Ubuntu/Debian:

sudo apt-get install libta-lib0-dev

その他のシステム: TA-Lib公式ドキュメントを参照

2. プロジェクトをクローン

git clone https://github.com/tinkle-community/nofx.git
cd nofx

3. 依存関係をインストール

バックエンド:

go mod download

フロントエンド:

cd web
npm install
cd ..

4. AI APIキーを取得

システムを設定する前に、AI APIキーを取得する必要があります。以下のAIプロバイダーのいずれかを選択してください

オプション1DeepSeek初心者推奨

なぜDeepSeek

  • 💰 GPT-4より安価約1/10のコスト
  • 🚀 高速レスポンス時間
  • 🎯 優れた取引判断品質
  • 🌍 VPNなしで世界中で動作

DeepSeek APIキーの取得方法

  1. アクセス: https://platform.deepseek.com
  2. 登録: メール/電話番号でサインアップ
  3. 認証: メール/電話認証を完了
  4. チャージ: アカウントにクレジットを追加
    • 最低: 約$5 USD
    • 推奨: テスト用に$20-50 USD
  5. APIキーを作成
    • APIキーセクションに移動
    • 「新しいキーを作成」をクリック
    • キーをコピーして保存(sk-で始まる)
    • ⚠️ 重要: すぐに保存してください - 再度見ることはできません!

価格: 約100万トークンあたり$0.14(非常に安い!)

オプション2QwenAlibaba Cloud

Qwen APIキーの取得方法

  1. アクセス: https://dashscope.aliyuncs.com
  2. 登録: Alibaba Cloudアカウントでサインアップ
  3. サービスを有効化: DashScopeサービスを有効化
  4. APIキーを作成
    • APIキー管理に移動
    • 新しいキーを作成
    • コピーして保存(sk-で始まる)

注意: 登録には中国の電話番号が必要な場合があります


5. システム設定

2つの設定モードが利用可能

  • 🌟 初心者モード: シングルトレーダー + デフォルトコイン(推奨!)
  • ⚔️ エキスパートモード: 複数トレーダー競争

🌟 初心者モード設定(推奨)

ステップ1: 設定例ファイルをコピーしてリネーム

cp config.json.example config.json

ステップ2: APIキーでconfig.jsonを編集

{
  "traders": [
    {
      "id": "my_trader",
      "name": "My AI Trader",
      "ai_model": "deepseek",
      "binance_api_key": "YOUR_BINANCE_API_KEY",
      "binance_secret_key": "YOUR_BINANCE_SECRET_KEY",
      "use_qwen": false,
      "deepseek_key": "sk-xxxxxxxxxxxxx",
      "qwen_key": "",
      "initial_balance": 1000.0,
      "scan_interval_minutes": 3
    }
  ],
  "leverage": {
    "btc_eth_leverage": 5,
    "altcoin_leverage": 5
  },
  "use_default_coins": true,
  "coin_pool_api_url": "",
  "oi_top_api_url": "",
  "api_server_port": 8080
}

ステップ3: プレースホルダーを実際のキーに置き換え

プレースホルダー 置き換え先 取得場所
YOUR_BINANCE_API_KEY BinanceのAPIキー Binance → アカウント → API管理
YOUR_BINANCE_SECRET_KEY Binanceのシークレットキー 上記と同じ
sk-xxxxxxxxxxxxx DeepSeek APIキー platform.deepseek.com

ステップ4: 初期残高を調整(オプション)

  • initial_balance: 実際のBinance先物アカウント残高に設定
  • 損益パーセンテージの計算に使用
  • 500 USDTがある場合、"initial_balance": 500.0に設定

設定チェックリスト:

  • Binance APIキーを入力引用符の問題なし
  • Binanceシークレットキーを入力引用符の問題なし
  • DeepSeek APIキーを入力sk-で始まる)
  • use_default_coinstrueに設定(初心者向け)
  • initial_balanceをアカウント残高と一致させる
  • ファイルをconfig.jsonとして保存(.exampleではない)

🔷 代替Hyperliquid取引所の使用

NOFXはHyperliquidもサポート - 分散型無期限先物取引所。Binanceの代わりにHyperliquidを使用するには

ステップ1: Ethereum秘密鍵を取得Hyperliquid認証用

  1. MetaMaskまたは任意のEthereumウォレットを開く
  2. 秘密鍵をエクスポート
  3. キーから**0xプレフィックスを削除**
  4. Hyperliquidでウォレットに資金を入金

ステップ2: Hyperliquid用にconfig.jsonを設定

{
  "traders": [
    {
      "id": "hyperliquid_trader",
      "name": "My Hyperliquid Trader",
      "enabled": true,
      "ai_model": "deepseek",
      "exchange": "hyperliquid",
      "hyperliquid_private_key": "your_private_key_without_0x",
      "hyperliquid_wallet_addr": "your_ethereum_address",
      "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_keyhyperliquid_private_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ウォレットにアクセス
  2. メインウォレットを接続MetaMask、WalletConnectなど
  3. 「APIウォレットを作成」をクリック
  4. これらの3つの項目をすぐに保存
    • メインウォレットアドレスUser
    • APIウォレットアドレスSigner
    • APIウォレット秘密鍵⚠️ 一度だけ表示!)

ステップ2: Aster用にconfig.jsonを設定

{
  "traders": [
    {
      "id": "aster_deepseek",
      "name": "Aster DeepSeek Trader",
      "enabled": true,
      "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プレフィックスなし)

📖 詳細なセットアップ手順については: Aster統合ガイドを参照

⚠️ セキュリティ注意事項:

  • APIウォレットはメインウォレットとは別追加のセキュリティレイヤー
  • API秘密鍵は絶対に共有しない
  • asterdex.comでいつでもAPIウォレットアクセスを取り消し可能

⚔️ エキスパートモード:マルチトレーダー競争

複数のAIトレーダーが互いに競争する場合

{
  "traders": [
    {
      "id": "qwen_trader",
      "name": "Qwen AI Trader",
      "ai_model": "qwen",
      "binance_api_key": "YOUR_BINANCE_API_KEY_1",
      "binance_secret_key": "YOUR_BINANCE_SECRET_KEY_1",
      "use_qwen": true,
      "qwen_key": "sk-xxxxx",
      "deepseek_key": "",
      "initial_balance": 1000.0,
      "scan_interval_minutes": 3
    },
    {
      "id": "deepseek_trader",
      "name": "DeepSeek AI Trader",
      "ai_model": "deepseek",
      "binance_api_key": "YOUR_BINANCE_API_KEY_2",
      "binance_secret_key": "YOUR_BINANCE_SECRET_KEY_2",
      "use_qwen": false,
      "qwen_key": "",
      "deepseek_key": "sk-xxxxx",
      "initial_balance": 1000.0,
      "scan_interval_minutes": 3
    }
  ],
  "use_default_coins": true,
  "coin_pool_api_url": "",
  "oi_top_api_url": "",
  "api_server_port": 8080
}

競争モードの要件:

  • 2つの別々のBinance先物アカウント異なるAPIキー
  • 両方のAI APIキーQwen + DeepSeek
  • テスト用により多くの資本推奨アカウントあたり500+ USDT

📚 設定フィールド説明

フィールド 説明 例の値 必須?
id このトレーダーの一意の識別子 "my_trader" はい
name 表示名 "My AI Trader" はい
enabled このトレーダーが有効かどうか
起動をスキップする場合はfalseに設定
trueまたはfalse はい
ai_model 使用するAIプロバイダー "deepseek"または"qwen"または"custom" はい
exchange 使用する取引所 "binance"または"hyperliquid"または"aster" はい
binance_api_key Binance APIキー "abc123..." Binance使用時に必須
binance_secret_key Binanceシークレットキー "xyz789..." Binance使用時に必須
hyperliquid_private_key Hyperliquid秘密鍵
⚠️ 0xプレフィックスを削除
"your_key..." Hyperliquid使用時に必須
hyperliquid_wallet_addr Hyperliquidウォレットアドレス "0xabc..." Hyperliquid使用時に必須
hyperliquid_testnet テストネットを使用 trueまたはfalse いいえデフォルトはfalse
use_qwen Qwenを使用するかどうか trueまたはfalse はい
deepseek_key DeepSeek APIキー "sk-xxx" DeepSeek使用時
qwen_key Qwen APIキー "sk-xxx" Qwen使用時
initial_balance 損益計算の開始残高 1000.0 はい
scan_interval_minutes 判断を行う頻度 33-5推奨 はい
leverage レバレッジ設定v2.0.3+ 下記参照 はい
btc_eth_leverage BTC/ETHの最大レバレッジ
⚠️ サブアカウント≤5x
5(デフォルト、安全)
50(メインアカウント最大)
はい
altcoin_leverage アルトコインの最大レバレッジ
⚠️ サブアカウント≤5x
5(デフォルト、安全)
20(メインアカウント最大)
はい
use_default_coins 組み込みコインリストを使用
スマートデフォルト:truev2.0.2+
API URLが提供されていない場合自動有効化
trueまたは省略 いいえ
(オプション、自動デフォルト)
coin_pool_api_url カスタムコインプールAPI
use_default_coins: falseの場合のみ必要
""(空) いいえ
oi_top_api_url 建玉API
オプション補足データ
""(空) いいえ
api_server_port Webダッシュボードポート 8080 はい

デフォルト取引コインuse_default_coins: trueの場合):

  • BTC、ETH、SOL、BNB、XRP、DOGE、ADA、HYPE

⚙️ レバレッジ設定v2.0.3+

レバレッジ設定とは?

レバレッジ設定は、AIが各取引で使用できる最大レバレッジを制御します。これは、特にレバレッジ制限があるBinanceサブアカウントでリスク管理に重要です。

設定形式:

"leverage": {
  "btc_eth_leverage": 5,    // BTCとETHの最大レバレッジ
  "altcoin_leverage": 5      // その他すべてのコインの最大レバレッジ
}

⚠️ 重要Binanceサブアカウント制限

  • サブアカウント: Binanceにより**≤5xレバレッジ**に制限
  • メインアカウント: 最大20xアルトコインまたは50xBTC/ETHを使用可能
  • サブアカウントを使用していてレバレッジを>5xに設定すると、取引は失敗し、エラーが表示されます:Subaccounts are restricted from using leverage greater than 5x

推奨設定:

アカウントタイプ BTC/ETHレバレッジ アルトコインレバレッジ リスクレベル
サブアカウント 5 5 安全(デフォルト)
メイン(保守的) 10 10 🟡 中程度
メイン(積極的) 20 15 🔴
メイン(最大) 50 20 🔴🔴 非常に高

例:

安全な設定(サブアカウントまたは保守的):

"leverage": {
  "btc_eth_leverage": 5,
  "altcoin_leverage": 5
}

積極的な設定(メインアカウントのみ):

"leverage": {
  "btc_eth_leverage": 20,
  "altcoin_leverage": 15
}

AIのレバレッジ使用方法

  • AIは設定された最大値まで1xから任意のレバレッジを選択できます
  • たとえば、altcoin_leverage: 20の場合、AIは市場条件に基づいて5x、10x、または20xを使用することを決定する可能性があります
  • 設定は固定値ではなく上限を設定します
  • AIはレバレッジを選択する際にボラティリティ、リスクリワード比率、アカウント残高を考慮します

⚠️ 重要:use_default_coinsフィールド

スマートデフォルト動作v2.0.2+

次の場合、システムは自動的にuse_default_coins: trueをデフォルトにします:

  • config.jsonにこのフィールドを含めていない、または
  • falseに設定したがcoin_pool_api_urlを提供していない

これにより初心者に優しくなります!このフィールドを完全に省略することもできます。

設定例:

オプション1明示的に設定明確性のため推奨

"use_default_coins": true,
"coin_pool_api_url": "",
"oi_top_api_url": ""

オプション2フィールドを省略デフォルトコインを自動使用

// "use_default_coins"を含めないだけ
"coin_pool_api_url": "",
"oi_top_api_url": ""

⚙️ 高度外部APIを使用

"use_default_coins": false,
"coin_pool_api_url": "http://your-api.com/coins",
"oi_top_api_url": "http://your-api.com/oi"

6. システムを実行

🚀 システムの起動2ステップ

システムには別々に実行される2つの部分があります:

  1. バックエンドAIトレーディングブレイン + API
  2. フロントエンド監視用Webダッシュボード

ステップ1バックエンドを起動

ターミナルを開いて実行:

# プログラムをビルド(初回のみ、またはコード変更後)
go build -o nofx

# バックエンドを起動
./nofx

表示されるべきもの:

🚀 启动自动交易系统...
✓ Trader [my_trader] 已初始化
✓ API服务器启动在端口 8080
📊 开始交易监控...

⚠️ エラーが表示される場合:

エラーメッセージ 解決策
invalid API key config.jsonのBinance APIキーを確認
TA-Lib not found brew install ta-libを実行macOS
port 8080 already in use config.jsonのapi_server_portを変更
DeepSeek API error DeepSeek APIキーと残高を確認

バックエンドが正しく実行されているとき:

  • エラーメッセージなし
  • "开始交易监控..."が表示される
  • システムがアカウント残高を表示
  • このターミナルウィンドウを開いたままにしてください!

ステップ2フロントエンドを起動

新しいターミナルウィンドウを開き(最初のものは実行したまま)、次を実行:

cd web
npm run dev

表示されるべきもの:

VITE v5.x.x  ready in xxx ms

➜  Local:   http://localhost:3000/
➜  Network: use --host to expose

フロントエンドが実行されているとき:

  • "Local: http://localhost:3000/"メッセージ
  • エラーメッセージなし
  • このターミナルウィンドウも開いたままにしてください!

ステップ3ダッシュボードにアクセス

Webブラウザを開いて次にアクセス

🌐 http://localhost:3000

表示されるもの:

  • 📊 リアルタイムアカウント残高
  • 📈 オープンポジション(ある場合)
  • 🤖 AI判断ログ
  • 📉 エクイティカーブチャート

初回のヒント:

  • 最初のAI判断まで3-5分かかることがあります
  • 初期判断は「観望」(待機)と言う場合があります - これは正常です
  • AIは最初に市場状況を分析する必要があります

7. システムを監視

監視すべきもの:

健全なシステムの兆候:

  • バックエンドターミナルが3-5分ごとに判断サイクルを表示
  • 継続的なエラーメッセージなし
  • アカウント残高の更新
  • Webダッシュボードの自動更新

⚠️ 警告の兆候:

  • 繰り返されるAPIエラー
  • 10分以上判断なし
  • 残高の急速な減少

システムステータスの確認:

# 新しいターミナルウィンドウで
curl http://localhost:8080/health

戻り値:{"status":"ok"}


8. システムを停止

グレースフルシャットダウン(推奨):

  1. バックエンドターミナル(最初のもの)に移動
  2. Ctrl+Cを押す
  3. "系统已停止"メッセージを待つ
  4. フロントエンドターミナル2番目のものに移動
  5. Ctrl+Cを押す

⚠️ 重要:

  • 常にバックエンドを最初に停止
  • ターミナルを閉じる前に確認を待つ
  • 強制終了しない(ターミナルを直接閉じない)

📖 AI判断フロー

各判断サイクルデフォルト3分で、システムは以下のインテリジェントプロセスを実行します

┌──────────────────────────────────────────────────────────┐
│ 1. 📊 過去パフォーマンスを分析過去20サイクル           │
├──────────────────────────────────────────────────────────┤
│  ✓ 総合勝率、平均利益、損益比を計算                       │
│  ✓ コインごとの統計勝率、平均損益USDT             │
│  ✓ 最高/最悪パフォーマンスコインを特定                    │
│  ✓ 正確なPnLを含む最後の5取引の詳細をリスト              │
│  ✓ リスク調整パフォーマンスのシャープレシオを計算          │
│  📌 NEWv2.0.2レバレッジを含む正確なUSDT PnL         │
└──────────────────────────────────────────────────────────┘
                           ↓
┌──────────────────────────────────────────────────────────┐
│ 2. 💰 アカウントステータスを取得                           │
├──────────────────────────────────────────────────────────┤
│  • 総エクイティと利用可能残高                             │
│  • オープンポジション数と未実現損益                       │
│  • 証拠金使用率AIは最大90%を管理)                      │
│  • 日次損益追跡とドローダウン監視                         │
└──────────────────────────────────────────────────────────┘
                           ↓
┌──────────────────────────────────────────────────────────┐
│ 3. 🔍 既存ポジションを分析(ある場合)                     │
├──────────────────────────────────────────────────────────┤
│  • 各ポジションについて、最新の市場データを取得           │
│  • リアルタイムのテクニカル指標を計算:                   │
│    - 3分K線RSI(7)、MACD、EMA20                         │
│    - 4時間K線RSI(14)、EMA20/50、ATR                    │
│  • ポジション保有期間を追跡「2時間15分」          │
│    📌 NEWv2.0.2):各ポジションの保有期間を表示         │
│  • 表示:エントリー価格、現在価格、損益%、期間            │
│  • AIが評価保持するかクローズするか                   │
└──────────────────────────────────────────────────────────┘
                           ↓
┌──────────────────────────────────────────────────────────┐
│ 4. 🎯 新しい機会を評価(候補コイン)                       │
├──────────────────────────────────────────────────────────┤
│  • コインプールを取得2モード                        │
│    🌟 デフォルトモードBTC、ETH、SOL、BNB、XRPなど       │
│    ⚙️  高度モードAI500上位20+ OI Top上位20     │
│  • 候補コインをマージして重複削除                         │
│  • フィルター:低流動性を削除(<1500万USD OI値          │
│  • 市場データ + テクニカル指標をバッチ取得                │
│  • ボラティリティ、トレンド強度、出来高急増を計算        │
└──────────────────────────────────────────────────────────┘
                           ↓
┌──────────────────────────────────────────────────────────┐
│ 5. 🧠 AI総合判断DeepSeek/Qwen                         │
├──────────────────────────────────────────────────────────┤
│  • 過去フィードバックをレビュー:                         │
│    - 最近の勝率と利益率                                   │
│    - 最高/最悪コインパフォーマンス                        │
│    - 繰り返しミスを回避                                   │
│  • すべての生シーケンスデータを分析:                     │
│    - 3分価格シーケンス、4時間K線シーケンス                │
│    - 完全な指標シーケンス(最新のみではない)             │
│    📌 NEWv2.0.2AIは分析の完全な自由を持つ          │
│  • 思考連鎖CoT推論プロセス                            │
│  • 構造化された判断を出力:                               │
│    - アクションclose_long/close_short/open_long/open_short│
│    - コインシンボル、数量、レバレッジ                     │
│    - ストップロスとテイクプロフィットレベル≥1:2比率   │
│  • 判断:待機/保持/クローズ/オープン                      │
└──────────────────────────────────────────────────────────┘
                           ↓
┌──────────────────────────────────────────────────────────┐
│ 6. ⚡ 取引を実行                                           │
├──────────────────────────────────────────────────────────┤
│  • 優先順位:既存をクローズ → その後新規をオープン       │
│  • 実行前のリスクチェック:                               │
│    - ポジションサイズ制限アルトコイン1.5x、BTC 10x    │
│    - 重複ポジションなし(同じコイン + 方向)              │
│    - 証拠金使用量が90%制限内                              │
│  • Binance LOT_SIZE精度を自動取得して適用                 │
│  • Binance Futures APIで注文を実行                        │
│  • クローズ後:すべての保留注文を自動キャンセル           │
│  • 実際の実行価格と注文IDを記録                           │
│  📌 期間計算のためにポジションオープン時間を追跡          │
└──────────────────────────────────────────────────────────┘
                           ↓
┌──────────────────────────────────────────────────────────┐
│ 7. 📝 完全なログを記録してパフォーマンスを更新             │
├──────────────────────────────────────────────────────────┤
│  • decision_logs/{trader_id}/に判断ログを保存             │
│  • ログには以下が含まれます:                             │
│    - 完全な思考連鎖CoT                                │
│    - すべての市場データを含む入力プロンプト               │
│    - 構造化された判断JSON                                 │
│    - アカウントスナップショット(残高、ポジション、証拠金)│
│    - 実行結果(成功/失敗、価格)                          │
│  • パフォーマンスデータベースを更新:                     │
│    - symbol_sideキーでオープン/クローズペアをマッチ       │
│      📌 NEWロング/ショート競合を防止                    │
│    - 正確なUSDT PnLを計算                               │
│      PnL = ポジション価値 × 価格変化% × レバレッジ        │
│      📌 NEW数量 + レバレッジを考慮                      │
│    - 保存:数量、レバレッジ、オープン時間、クローズ時間   │
│    - 更新:勝率、利益率、シャープレシオ                   │
│  • パフォーマンスデータは次のサイクルにフィードバック     │
└──────────────────────────────────────────────────────────┘
                           ↓
                    3-5分ごとに繰り返し

v2.0.2の主な改善点

📌 ポジション期間追跡:

  • システムが各ポジションの保有期間を追跡
  • ユーザープロンプトに表示「持仓时长2小时15分钟」
  • AIが出口タイミングについてより良い判断を下すのに役立つ

📌 正確なPnL計算

  • 以前パーセンテージのみ100U@5% = 1000U@5% = 両方とも「5.0」と表示)
  • 現在実際のUSDT利益 = ポジション価値 × 価格変化 × レバレッジ
  • 1000 USDT × 5% × 20x = 1000 USDT実際の利益

📌 AI自由度の向上

  • AIはすべての生シーケンスデータを自由に分析可能
  • 事前定義された指標の組み合わせに制限されない
  • 独自のトレンド分析、サポート/レジスタンス計算を実行可能

📌 改善されたポジション追跡:

  • symbol_sideキーを使用「BTCUSDT_long」
  • ロングとショートの両方を保有する際の競合を防止
  • 完全なデータを保存:数量、レバレッジ、オープン/クローズ時間

🧠 AI自己学習の例

過去フィードバック(プロンプトに自動追加)

## 📊 過去パフォーマンスフィードバック

### 総合パフォーマンス
- **総取引数**: 15利益8 | 損失7
- **勝率**: 53.3%
- **平均利益**: +3.2% | 平均損失:-2.1%
- **損益比**: 1.52:1

### 最近の取引
1. BTCUSDT LONG: 95000.0000 → 97500.0000 = +2.63% ✓
2. ETHUSDT SHORT: 3500.0000 → 3450.0000 = +1.43% ✓
3. SOLUSDT LONG: 185.0000 → 180.0000 = -2.70% ✗
4. BNBUSDT LONG: 610.0000 → 625.0000 = +2.46% ✓
5. ADAUSDT LONG: 0.8500 → 0.8300 = -2.35% ✗

### コインパフォーマンス
- **最高**: BTCUSDT勝率75%、平均+2.5%
- **最悪**: SOLUSDT勝率25%、平均-1.8%

AIのフィードバック使用方法

  1. 連続損失を回避: SOLUSDTが3回連続でストップロスになっているのを見て、AIは回避するかより慎重になる
  2. 成功戦略を強化: BTCブレイクアウトロングが75%の勝率で、AIはこのパターンを継続
  3. 動的スタイル調整: 勝率<40% → 保守的;損益比>2 → 積極的を維持
  4. 市場状況の特定: 連続損失は荒れた市場を示す可能性があり、取引頻度を減らす

📊 Webインターフェース機能

1. 競争ページ

  • 🏆 リーダーボード: リアルタイムROIランキング、ゴールドボーダーでリーダーをハイライト
  • 📈 パフォーマンス比較: デュアルAI ROIカーブ比較紫対青
  • ⚔️ 一対一: リードマージンを示す直接比較
  • リアルタイムデータ: 総エクイティ、損益%、ポジション数、証拠金使用量

2. 詳細ページ

  • エクイティカーブ: 過去トレンドチャートUSD/パーセンテージ切り替え)
  • 統計: 総サイクル、成功/失敗、オープン/クローズ統計
  • ポジションテーブル: すべてのポジション詳細(エントリー価格、現在価格、損益%、清算価格)
  • AI判断ログ: 最近の判断記録展開可能なCoT

3. リアルタイム更新

  • システムステータス、アカウント情報、ポジションリスト:5秒更新
  • 判断ログ、統計:10秒更新
  • エクイティチャート:10秒更新

🎛️ APIエンドポイント

競争関連

GET /api/competition          # 競争リーダーボード(全トレーダー)
GET /api/traders              # トレーダーリスト

単一トレーダー関連

GET /api/status?trader_id=xxx            # システムステータス
GET /api/account?trader_id=xxx           # アカウント情報
GET /api/positions?trader_id=xxx         # ポジションリスト
GET /api/equity-history?trader_id=xxx    # エクイティ履歴(チャートデータ)
GET /api/decisions/latest?trader_id=xxx  # 最新5判断
GET /api/statistics?trader_id=xxx        # 統計

システムエンドポイント

GET /health                   # ヘルスチェック
GET /api/config               # システム設定

⚠️ 重要なリスク警告

取引リスク

  1. 暗号通貨市場は非常にボラティルが高い、AI判断は利益を保証しません
  2. 先物取引はレバレッジを使用、損失が元本を超える可能性があります
  3. 極端な市場状況は清算リスクにつながる可能性があります
  4. ファンディングレートは保有コストに影響する可能性があります
  5. 流動性リスク: 一部のコインでスリッページが発生する可能性があります

技術リスク

  1. ネットワークレイテンシは価格スリッページを引き起こす可能性があります
  2. APIレート制限は取引実行に影響する可能性があります
  3. AI APIタイムアウトは判断失敗を引き起こす可能性があります
  4. システムバグは予期しない動作を引き起こす可能性があります

使用推奨事項

推奨

  • テストには失っても構わない資金のみを使用
  • 少額から始める推奨100-500 USDT
  • システムの動作状態を定期的に確認
  • アカウント残高の変化を監視
  • AI判断ログを分析して戦略を理解

非推奨

  • すべての資金または借りたお金を投資
  • 長期間監視なしで実行
  • AI判断を盲目的に信頼
  • システムを理解せずに使用
  • 極端な市場ボラティリティ中に実行

🛠️ よくある問題

1. コンパイルエラーTA-Libが見つからない

解決策: TA-Libライブラリをインストール

# macOS
brew install ta-lib

# Ubuntu
sudo apt-get install libta-lib0-dev

2. 精度エラーPrecision is over the maximum

解決策: システムがBinance LOT_SIZEから精度を自動処理します。エラーが続く場合は、ネットワーク接続を確認してください。

3. AI APIタイムアウト

解決策:

  • APIキーが正しいか確認
  • ネットワーク接続を確認(プロキシが必要な場合があります)
  • システムタイムアウトは120秒に設定されています

4. フロントエンドがバックエンドに接続できない

解決策:

  • バックエンドが実行中であることを確認(http://localhost:8080
  • ポート8080が占有されていないか確認
  • ブラウザコンソールでエラーを確認

5. コインプールAPI失敗

解決策:

  • コインプールAPIはオプションです
  • APIが失敗した場合、システムはデフォルトのメインストリームコインBTC、ETHなどを使用
  • config.jsonのAPI URLと認証パラメータを確認

📈 パフォーマンス最適化のヒント

  1. 合理的な判断サイクルを設定: 3-5分を推奨、過剰取引を避ける
  2. 候補コイン数を制御: システムはデフォルトでAI500上位20 + OI Top上位20
  3. ログを定期的にクリーン: 過度なディスク使用を避ける
  4. API呼び出し数を監視: Binanceレート制限のトリガーを避ける
  5. 少額資本でテスト: まず100-500 USDTで戦略検証をテスト

🔄 変更履歴

v2.0.22025-10-29

重大なバグ修正 - 取引履歴とパフォーマンス分析:

このバージョンは、収益性統計に大きく影響した過去取引記録とパフォーマンス分析システムの重大な計算エラーを修正します。

1. PnL計算 - 主要エラー修正logger/decision_logger.go

  • 問題: 以前はパーセンテージのみで計算され、ポジションサイズとレバレッジを完全に無視
    • 100 USDTポジションが5%獲得と1000 USDTポジションが5%獲得の両方が利益として5.0と表示
    • これによりパフォーマンス分析が完全に不正確に
  • 解決策: 実際のUSDT利益額を計算
    PnLUSDT= ポジション価値 × 価格変化% × レバレッジ
    例1000 USDT × 5% × 20x = 1000 USDT実際の利益
    
  • 影響: 勝率、利益率、シャープレシオが正確なUSDT額に基づくようになりました

2. ポジション追跡 - 重要データの欠落

  • 問題: オープンポジション記録が価格と時間のみを保存、数量とレバレッジが欠落
  • 解決策: 完全な取引データを保存:
    • quantity: ポジションサイズ(コイン単位)
    • leverage: レバレッジ倍率20x
    • これらは正確なPnL計算に不可欠

3. ポジションキーロジック - ロング/ショート競合

  • 問題: symbolをポジションキーとして使用し、ロングとショートの両方を保有する際にデータ競合を引き起こす
    • BTCUSDTロングとBTCUSDTショートが互いに上書き
  • 解決策: symbol_side形式に変更(例:BTCUSDT_longBTCUSDT_short
    • ロングとショートポジションを適切に区別

4. シャープレシオ計算 - コード最適化

  • 問題: 平方根計算にカスタムニュートン法を使用
  • 解決策: 標準ライブラリmath.Sqrtに置き換え
    • より信頼性が高く、保守可能で効率的

このアップデートが重要な理由:

  • 過去取引統計が無意味なパーセンテージではなく実際のUSDT損益を表示
  • 異なるレバレッジ取引間のパフォーマンス比較が正確に
  • AI自己学習メカニズムが正しい過去フィードバックを受信
  • 利益率とシャープレシオの計算が意味を持つように
  • マルチポジション追跡(ロング + ショート同時)が正しく機能

推奨: このアップデート前にシステムを実行していた場合、過去統計は不正確でした。v2.0.2にアップデート後、新しい取引は正しく計算されます。

v2.0.22025-10-29

バグ修正:

  • Aster取引所精度エラーを修正コード-1111「Precision is over the maximum defined for this asset」
  • 取引所の精度要件に合わせて価格と数量のフォーマットを改善
  • デバッグ用の詳細な精度処理ログを追加
  • 適切な精度処理ですべての注文関数OpenLong、OpenShort、CloseLong、CloseShort、SetStopLoss、SetTakeProfitを強化

技術詳細:

  • float64を正しい精度で文字列に変換するformatFloatWithPrecision関数を追加
  • 価格と数量パラメータが取引所のpricePrecisionquantityPrecision仕様に従ってフォーマットされるようになりました
  • API リクエストを最適化するために、フォーマットされた値から末尾のゼロを削除

v2.0.12025-10-29

バグ修正:

  • ComparisonChartデータ処理ロジックを修正 - cycle_numberからタイムスタンプグループ化に切り替え
  • バックエンド再起動時にcycle_numberがリセットされるとチャートがフリーズする問題を解決
  • チャートデータ表示を改善 - すべての過去データポイントを時系列で表示
  • トラブルシューティングを改善するためのデバッグログを強化

v2.0.02025-10-28

主要アップデート:

  • AI自己学習メカニズム過去フィードバック、パフォーマンス分析
  • マルチトレーダー競争モードQwen対DeepSeek
  • BinanceスタイルUI完全なBinanceインターフェース模倣
  • パフォーマンス比較チャートリアルタイムROI比較
  • リスク管理最適化(コインごとのポジション制限調整)

バグ修正:

  • 初期残高のハードコーディング問題を修正
  • マルチトレーダーデータ同期問題を修正
  • チャートデータの整列を最適化cycle_numberを使用

v1.0.02025-10-27

  • 初回リリース
  • 基本的なAI取引機能
  • 判断ログシステム
  • シンプルなWebインターフェース

📄 ライセンス

MITライセンス - 詳細はLICENSEファイルを参照してください


🤝 貢献

IssueとPull Requestを歓迎します

開発ガイド

  1. プロジェクトをフォーク
  2. 機能ブランチを作成(git checkout -b feature/AmazingFeature
  3. 変更をコミット(git commit -m 'Add some AmazingFeature'
  4. ブランチにプッシュ(git push origin feature/AmazingFeature
  5. Pull Requestを開く

📬 お問い合わせ

🐛 技術サポート


🙏 謝辞


最終更新: 2025-10-29v2.0.3

AIの力で量的取引の可能性を探求しましょう


Star履歴

Star履歴チャート