07ac8e4ecd
fix: use http.DefaultClient for OKX trader
tinkle-community
2025-12-07 18:52:42 +08:00
bee4e5dd41
fix: add OKX support to order/position sync and fix WebSocket concurrent write
tinkle-community
2025-12-07 17:13:17 +08:00
a1211153ee
fix: Bybit order quantity precision and position fields
tinkle-community
2025-12-07 15:17:46 +08:00
7bd5ca0a55
fix: improve frontend UX and fix OKX close position Frontend improvements: - Replace window.location.reload() with SWR mutate() for data refresh - Replace native alert/confirm with toast notifications (confirmToast, notify) - Add loading skeletons to AITradersPage and EquityChart - Fix flash of empty state during initial load OKX fixes: - Fix proxy issue in Docker by using explicit no-proxy function - Fix CloseShort sz parameter error - ensure quantity is always positive - Fix GetPositions to return absolute value for positionAmt
tinkle-community
2025-12-06 19:57:13 +08:00
a77c54dbef
feat: add one-click close position for all exchanges - Add handleClosePosition API endpoint in server.go - Add closePosition API function in frontend - Add close position button to positions table in App.tsx and TraderDashboard.tsx - Fix GetFullConfig to include passphrase field for OKX - Fix OKX CloseLong/CloseShort to use position quantity directly (already in contracts)
tinkle-community
2025-12-06 19:16:37 +08:00
5e5be347ad
feat: auto-restart traders on system startup - Add AutoStartRunningTraders method to TraderManager - Automatically restore traders marked as running in database - Call auto-start after loading traders from store on startup
tinkle-community
2025-12-06 18:21:12 +08:00
1e5ece947c
Feature/okx trading (#1177) * feat: add OKX exchange trading support - Add OKX trader client with full trading API integration - Support API Key, Secret Key, and Passphrase authentication - Add OKX icon and frontend configuration modal - Update exchange store and types for OKX fields * fix: add passphrase column migration and fix exchange type mapping * fix: show OKX input fields in exchange config modal * fix: ensure all supported exchanges exist for user when listing * fix: simplify exchange type check condition for OKX * debug: add visible debug info for exchange id * fix: remove debug info from exchange config modal * fix: add OKX to exchange type condition in AITradersPage * feat: complete OKX trading support and fix exchange config issues - Add LIGHTER exchange UI support in AITradersPage - Add passphrase field to UpdateExchangeConfigRequest type - Fix OKX HTTP client to bypass proxy (disable system proxy) - Auto-fetch initial balance from exchange when not set - Support multiple balance field names for different exchanges - Add detailed error messages when trader fails to load - Add lighter_api_key_private_key field to exchange store
tinkle-community
2025-12-06 18:04:59 +08:00
5d1d0b6842
Feature/custom strategy (#1173) * feat: add Strategy Studio with multi-timeframe support - Add Strategy Studio page with three-column layout for strategy management - Support multi-timeframe K-line data selection (5m, 15m, 1h, 4h, etc.) - Add GetWithTimeframes() function in market package for fetching multiple timeframes - Add TimeframeSeriesData struct for storing per-timeframe technical indicators - Update formatMarketData() to display all selected timeframes in AI prompt - Add strategy API endpoints for CRUD operations and test run - Integrate real AI test runs with configured AI models - Support custom AI500 and OI Top API URLs from strategy config * docs: add Strategy Studio screenshot to README files * feat: add quant data integration and fix position click navigation - Integrate quant data API (netflow, OI, price changes) into Strategy Studio - Add enable_quant_data toggle in indicator editor - Fix position symbol click to navigate to chart (sync defaultSymbol prop) - Fix TradingView chart fullscreen flickering
tinkle-community
2025-12-06 07:47:03 +08:00
5cff32e4f2
Feature/custom strategy (#1172) * feat: add Strategy Studio with multi-timeframe support - Add Strategy Studio page with three-column layout for strategy management - Support multi-timeframe K-line data selection (5m, 15m, 1h, 4h, etc.) - Add GetWithTimeframes() function in market package for fetching multiple timeframes - Add TimeframeSeriesData struct for storing per-timeframe technical indicators - Update formatMarketData() to display all selected timeframes in AI prompt - Add strategy API endpoints for CRUD operations and test run - Integrate real AI test runs with configured AI models - Support custom AI500 and OI Top API URLs from strategy config * docs: add Strategy Studio screenshot to README files * fix: correct strategy-studio.png filename case in README * refactor: remove legacy signal source config and simplify trader creation - Remove signal source configuration from traders page (now handled by strategy) - Remove advanced options (legacy config) from TraderConfigModal - Rename default strategy to "默认山寨策略" with AI500 coin pool URL - Delete SignalSourceModal and SignalSourceWarning components - Clean up related stores, hooks, and page components
tinkle-community
2025-12-06 07:20:11 +08:00
afb2d158ac
feat: add exchange_id field to trader_positions table - Add exchange_id column to track which exchange the position is from - Update all SELECT/INSERT queries to include exchange_id - Set exchange_id when creating position record in AutoTrader - Add migration to add column to existing tables
tinkle-community
2025-12-06 01:35:26 +08:00
f116d80cda
fix: use exchange.ID instead of exchange.Type in PositionSyncManager exchange.Type is cex/dex category, exchange.ID is the actual exchange name (binance/bybit/etc)
tinkle-community
2025-12-06 01:28:43 +08:00
f4ece051e7
Refactor/trading actions (#1169) * refactor: 简化交易动作,移除 update_stop_loss/update_take_profit/partial_close - 移除 Decision 结构体中的 NewStopLoss, NewTakeProfit, ClosePercentage 字段 - 删除 executeUpdateStopLossWithRecord, executeUpdateTakeProfitWithRecord, executePartialCloseWithRecord 函数 - 简化 logger 中的 partial_close 聚合逻辑 - 更新 AI prompt 和验证逻辑,只保留 6 个核心动作 - 清理相关测试代码 保留的交易动作: open_long, open_short, close_long, close_short, hold, wait * refactor: 移除 AI学习与反思 模块 - 删除前端 AILearning.tsx 组件和相关引用 - 删除后端 /performance API 接口 - 删除 logger 中 AnalyzePerformance、calculateSharpeRatio 等函数 - 删除 PerformanceAnalysis、TradeOutcome、SymbolPerformance 等结构体 - 删除 Context 中的 Performance 字段 - 移除 AI prompt 中夏普比率自我进化相关内容 - 清理 i18n 翻译文件中的相关条目 该模块基于磁盘存储计算,经常出错,做减法移除 * refactor: 将数据库操作统一迁移到 store 包 - 新增 store/ 包,统一管理所有数据库操作 - store.go: 主 Store 结构,懒加载各子模块 - user.go, ai_model.go, exchange.go, trader.go 等子模块 - 支持加密/解密函数注入 (SetCryptoFuncs) - 更新 main.go 使用 store.New() 替代 config.NewDatabase() - 更新 api/server.go 使用 *store.Store 替代 *config.Database - 更新 manager/trader_manager.go: - 新增 LoadTradersFromStore, LoadUserTradersFromStore 方法 - 删除旧版 LoadUserTraders, LoadTraderByID, loadSingleTrader 等方法 - 移除 nofx/config 依赖 - 删除 config/database.go 和 config/database_test.go - 更新 api/server_test.go 使用 store.Trader 类型 - 清理 logger/ 包中未使用的 telegram 相关代码 * refactor: unify encryption key management via .env - Remove redundant EncryptionManager and SecureStorage - Simplify CryptoService to load keys from environment variables only - RSA_PRIVATE_KEY: RSA private key for client-server encryption - DATA_ENCRYPTION_KEY: AES-256 key for database encryption - JWT_SECRET: JWT signing key for authentication - Update start.sh to auto-generate missing keys on first run - Remove secrets/ directory and file-based key storage - Delete obsolete encryption setup scripts - Update .env.example with all required keys * refactor: unify logger usage across mcp package - Add MCPLogger adapter in logger package to implement mcp.Logger interface - Update mcp/config.go to use global logger by default - Remove redundant defaultLogger from mcp/logger.go - Keep noopLogger for testing purposes * chore: remove leftover test RSA key file * chore: remove unused bootstrap package * refactor: unify logging to use logger package instead of fmt/log - Replace all fmt.Print/log.Print calls with logger package - Add auto-initialization in logger package init() for test compatibility - Update main.go to initialize logger at startup - Migrate all packages: api, backtest, config, decision, manager, market, store, trader * refactor: rename database file from config.db to data.db - Update main.go, start.sh, docker-compose.yml - Update migration script and documentation - Update .gitignore and translations * fix: add RSA_PRIVATE_KEY to docker-compose environment * fix: add registration_enabled to /api/config response * fix: Fix navigation between login and register pages Use window.location.href instead of react-router's navigate() to fix the issue where URL changes but the page doesn't reload due to App.tsx using custom route state management. * fix: Switch SQLite from WAL to DELETE mode for Docker compatibility WAL mode causes data sync issues with Docker bind mounts on macOS due to incompatible file locking mechanisms between the container and host. DELETE mode (traditional journaling) ensures data is written directly to the main database file. * refactor: Remove default user from database initialization The default user was a legacy placeholder that is no longer needed now that proper user registration is in place. * feat: Add order tracking system with centralized status sync - Add trader_orders table for tracking all order lifecycle - Implement GetOrderStatus interface for all exchanges (Binance, Bybit, Hyperliquid, Aster, Lighter) - Create OrderSyncManager for centralized order status polling - Add trading statistics (Sharpe ratio, win rate, profit factor) to AI context - Include recent completed orders in AI decision input - Remove per-order goroutine polling in favor of global sync manager * feat: Add TradingView K-line chart to dashboard - Create TradingViewChart component with exchange/symbol selectors - Support Binance, Bybit, OKX, Coinbase, Kraken, KuCoin exchanges - Add popular symbols quick selection - Support multiple timeframes (1m to 1W) - Add fullscreen mode - Integrate with Dashboard page below equity chart - Add i18n translations for zh/en * refactor: Replace separate charts with tabbed ChartTabs component - Create ChartTabs component with tab switching between equity curve and K-line - Add embedded mode support for EquityChart and TradingViewChart - User can now switch between account equity and market chart in same area * fix: Use ChartTabs in App.tsx and fix embedded mode in EquityChart - Replace EquityChart with ChartTabs in App.tsx (the actual dashboard renderer) - Fix EquityChart embedded mode for error and empty data states - Rename interval state to timeInterval to avoid shadowing window.setInterval - Add debug logging to ChartTabs component * feat: Add position tracking system for accurate trade history - Add trader_positions table to track complete open/close trades - Add PositionSyncManager to detect manual closes via polling - Record position on open, update on close with PnL calculation - Use positions table for trading stats and recent trades (replacing orders table) - Fix TradingView chart symbol format (add .P suffix for futures) - Fix DecisionCard wait/hold action color (gray instead of red) - Auto-append USDT suffix for custom symbol input * update ---------
tinkle-community
2025-12-06 01:04:26 +08:00
010676c591
fix: Fix Deepseek compatibility issues on the official website. (#1166) * fix: Compatible with the HTTP2 stream transmission bug on DeepSeek's official website endpoint. * fix: Remove reasoning from JSON
SkywalkerJi
2025-12-04 20:19:48 +09:00
52e4ff6921
fix(bybit): complete Bybit integration by adding API layer support (#1149)
0xYYBB | ZYY | Bobo
2025-12-02 05:00:20 +08:00
cdf4099433
fix: resolve multiple bugs preventing trader creation and deletion (#1140) * fix: resolve multiple bugs preventing trader creation Bug fixes: 1. Fix time.Time scanning error - SQLite stores datetime as TEXT, now parsing manually 2. Fix foreign key mismatch - traders table referenced exchanges(id) but exchanges uses composite primary key (id, user_id) 3. Add missing backtestManager field to Server struct 4. Add missing Shutdown method to Server struct 5. Fix NewFuturesTrader call - pass userId parameter 6. Fix UpdateExchange call - pass all required parameters 7. Add migrateTradersTable() to fix existing databases These issues prevented creating new traders with 500 errors. * fix(api): fix balance extraction field name mismatch Binance API returns 'availableBalance' (camelCase) but code was looking for 'available_balance' (snake_case). Now supports both formats. Also added 'totalWalletBalance' as fallback for total balance extraction. * fix(frontend): add missing ConfirmDialogProvider to App The delete trader button required ConfirmDialogProvider to be wrapped around the App component for the confirmation dialog to work. --------- Co-authored-by: NOFX Trader <nofx@local.dev>
Professor-Chen
2025-11-30 16:09:42 +08:00
a4a95dcca3
fix: ensure tab navigation updates page state correctly Tab buttons were only calling navigate() which changes URL but doesn't trigger popstate events. App.tsx listens to popstate/hashchange to update page state, so clicks appeared to do nothing. Now all tab buttons call both onPageChange() callback and navigate() to ensure page state updates and URL stays in sync.
tinkle-community
2025-11-30 12:40:14 +08:00
c34a6c6bcf
fix: resolve multiple bugs preventing trader creation (#1138) * fix: resolve multiple bugs preventing trader creation Bug fixes: 1. Fix time.Time scanning error - SQLite stores datetime as TEXT, now parsing manually 2. Fix foreign key mismatch - traders table referenced exchanges(id) but exchanges uses composite primary key (id, user_id) 3. Add missing backtestManager field to Server struct 4. Add missing Shutdown method to Server struct 5. Fix NewFuturesTrader call - pass userId parameter 6. Fix UpdateExchange call - pass all required parameters 7. Add migrateTradersTable() to fix existing databases These issues prevented creating new traders with 500 errors. * fix(api): fix balance extraction field name mismatch Binance API returns 'availableBalance' (camelCase) but code was looking for 'available_balance' (snake_case). Now supports both formats. Also added 'totalWalletBalance' as fallback for total balance extraction. * fix(frontend): add missing ConfirmDialogProvider to App The delete trader button required ConfirmDialogProvider to be wrapped around the App component for the confirmation dialog to work. --------- Co-authored-by: NOFX Trader <nofx@local.dev>
Professor-Chen
2025-11-30 12:22:20 +08:00
11b6c6ba3e
Dev backtest (#1134)
Rick
2025-11-28 21:34:27 +08:00
04f006abad
docs: update airdrop program text
tinkle-community
2025-11-27 04:08:13 +08:00
cdb7a6ba06
refactor(web): redesign httpClient with axios and unified error handling (#1061) * fix(web): remove duplicate PasswordChecklist in error block - Remove duplicate PasswordChecklist component from error message area - Keep only the real-time password validation checklist - Error block now displays only the error message text Bug was introduced in commit aa0bd93 (PR #872) Co-Authored-By: tinkle-community <tinklefund@gmail.com> * refactor(web): redesign httpClient with axios and unified error handling Major refactoring to improve error handling architecture: ## Changes ### 1. HTTP Client Redesign (httpClient.ts) - Replaced native fetch with axios for better interceptor support - Implemented request/response interceptors for centralized error handling - Added automatic Bearer token injection in request interceptor - Network errors and system errors (404, 403, 500) now intercepted and shown via toast - Only business logic errors (4xx except 401/403/404) returned to caller - New ApiResponse<T> interface for type-safe responses ### 2. API Migration (api.ts) - Migrated all 31 API methods from legacy fetch-style to new httpClient - Updated pattern: from res.ok/res.json() to result.success/result.data - Removed getAuthHeaders() helper (token now auto-injected) - Added TypeScript generics for better type safety ### 3. Component Updates - AuthContext.tsx: Updated register() to use new API - TraderConfigModal.tsx: Migrated 3 API calls (config, templates, balance) - RegisterPage.tsx: Simplified error display (error type handling now in API layer) ### 4. Removed Legacy Code - Removed legacyHttpClient compatibility wrapper (~30 lines) - Removed legacyRequest() method - Clean separation: API layer handles all error classification ## Benefits - Centralized error handling - no need to check network/system errors in components - Better UX - automatic toast notifications for system errors - Type safety - generic ApiResponse<T> provides compile-time checks - Cleaner business components - only handle business logic errors - Consistent error messages across the application Co-Authored-By: tinkle-community <tinklefund@gmail.com> --------- Co-authored-by: tinkle-community <tinklefund@gmail.com>
Ember
2025-11-17 14:48:14 +08:00
36fcad03c5
fix(docker): revert healthcheck to wget for Alpine compatibility (#986) ## Problem PR #906 changed healthcheck commands from wget to curl, but Alpine Linux (our base image) does not include curl by default, causing all containers to fail healthchecks with: `` exec: "curl": executable file not found in $PATH ` This creates a configuration mismatch: - docker/Dockerfile.backend uses wget (✅ works) - docker-compose.yml uses curl (❌ fails) ## Root Cause Analysis Alpine Linux philosophy is minimalism: - ✅wget is pre-installed (part of busybox) - ❌curl requires apk add curl (~3MB extra) The original PR #906 made two commits: 1. First commit (3af8760): curl → wget (✅ correct fix) 2. Second commit (333b2ef): wget → curl (❌ introduced bug) The second commit was based on incorrect assumption that "curl is more widely available than wget in Docker images". This is false for Alpine. ## Solution Revert healthcheck commands back to wget to match: 1. Alpine's pre-installed tools 2. Dockerfile.backend healthcheck (line 68) 3. Docker and Kubernetes best practices ## Testing ✅ Verified wget exists in Alpine containers: `bash docker run --rm alpine:latest which wget # Output: /usr/bin/wget `✅ Added new CI workflow to prevent regression: - .github/workflows/pr-docker-compose-healthcheck.yml - Validates healthcheck compatibility with Alpine - Ensures containers reach healthy status ## Impact - **Before**: Containers show (unhealthy), potential auto-restart loops - **After**: Containers show (healthy), monitoring systems happy - **Scope**: Only affects docker-compose deployments - **Breaking**: None - this is a bug fix ## References - PR #906: Original (incorrect) fix - Alpine Linux: https://alpinelinux.org/about/ - Dockerfile.backend L68: Existing wget` healthcheck Co-authored-by: the-dev-z <the-dev-z@users.noreply.github.com> Co-authored-by: tinkle-community <tinklefund@gmail.com> Co-authored-by: Shui <88711385+hzb1115@users.noreply.github.com>
0xYYBB | ZYY | Bobo
2025-11-16 08:26:12 +08:00
c64d4ff549
refactor(web): restructure AITradersPage into modular architecture (#1023) * refactor(web): restructure AITradersPage into modular architecture Refactored the massive 2652-line AITradersPage.tsx into a clean, modular architecture following React best practices. **Changes:** - Decomposed 2652-line component into 12 focused modules - Introduced Zustand stores for config and modal state management - Extracted all business logic into useTraderActions custom hook (633 lines) - Created reusable section components (PageHeader, TradersGrid, etc.) - Separated complex modal logic into dedicated components - Added TraderConfig type, eliminated all any types - Fixed critical bugs in configuredExchanges logic and getState() usage **File Structure:** - Main page reduced from 2652 → 234 lines (91% reduction) - components/traders/: 7 UI components + 5 section components - stores/: tradersConfigStore, tradersModalStore - hooks/: useTraderActions (all business logic) Co-Authored-By: tinkle-community <tinklefund@gmail.com> * chore: ignore PR_DESCRIPTION.md * fix(web): restore trader dashboard navigation functionality Fixed missing navigation logic in refactored AITradersPage. The "查看" (View) button now correctly navigates to the trader dashboard. **Root Cause:** During refactoring, the useNavigate hook and default navigation logic were inadvertently omitted from the main page component. **Changes:** - Added useNavigate import from react-router-dom - Implemented handleTraderSelect function with fallback navigation - Restored original behavior: use onTraderSelect prop if provided, otherwise navigate to /dashboard?trader=${traderId} **Testing:** - ✅ Click "查看" button navigates to trader dashboard - ✅ Query parameter correctly passed to dashboard Co-Authored-By: tinkle-community <tinklefund@gmail.com> * fix(web): correct type definitions for trader configuration Fixed TypeScript build errors by using the correct TraderConfigData type instead of the incorrect TraderConfig type. **Root Cause:** During refactoring, a new TraderConfig type was incorrectly created that extended CreateTraderRequest (with fields like name, ai_model_id). However, the TraderConfigModal component and API responses actually use TraderConfigData (with fields like trader_name, ai_model). **Changes:** - Replaced all TraderConfig references with TraderConfigData: - stores/tradersModalStore.ts - hooks/useTraderActions.ts - lib/api.ts - Removed incorrect TraderConfig type definition from types.ts - Added null check for editingTrader.trader_id to satisfy TypeScript **Build Status:** - ✅ TypeScript compilation: PASS - ✅ Vite production build: PASS Co-Authored-By: tinkle-community <tinklefund@gmail.com> --------- Co-authored-by: tinkle-community <tinklefund@gmail.com>
Ember
2025-11-15 12:33:48 +08:00
7eab056394
fix gh job failed when pr contains issues (#1019)
Diego
2025-11-14 21:10:54 -05:00
c1cf44b98f
fix(api): use UUID to ensure traderID uniqueness (#893) (#1008) ## Problem When multiple users create traders with the same exchange + AI model combination within the same second, they generate identical traderIDs, causing data conflicts. Old code (Line 496): ``go traderID := fmt.Sprintf("%s_%s_%d", req.ExchangeID, req.AIModelID, time.Now().Unix()) ` ## Solution Use UUID to guarantee 100% uniqueness while preserving prefix for debugging: `go traderID := fmt.Sprintf("%s_%s_%s", req.ExchangeID, req.AIModelID, uuid.New().String()) ` Example output: binance_gpt-4_a1b2c3d4-e5f6-7890-abcd-ef1234567890 ## Changes - api/server.go:495-497: Use UUID for traderID generation - api/traderid_test.go`: New test file with 3 comprehensive tests ## Tests ✅ All tests passed (0.189s) ✅ TestTraderIDUniqueness - 100 unique IDs generated ✅ TestTraderIDFormat - 3 exchange/model combinations validated ✅ TestTraderIDNoCollision - 1000 iterations without collision Fixes#893 Co-authored-by: the-dev-z <the-dev-z@users.noreply.github.com>
0xYYBB | ZYY | Bobo
2025-11-14 23:33:25 +08:00
b96c86fce4
Improve(interface): replace some struct with interface for testing (#994) * fix(trader): get peakPnlPct using posKey * fix(docs): keep readme at the same page * improve(interface): replace with interface * refactor mcp --------- Co-authored-by: zbhan <zbhan@freewheel.tv>
Shui
2025-11-13 22:22:05 -05:00
5577d284f6
fix(web): await mutateTraders() to eliminate 3-4s delay after operations (#989) ## Problem When creating/editing/deleting traders, AI models, or exchanges, the UI takes 3-4 seconds to show results, causing users to think the system is frozen. ## Root Cause Although mutateTraders() was called after operations, it was not awaited, causing the function to continue immediately without waiting for data refresh. The UI relied on the refreshInterval: 5000 automatic refresh, resulting in up to 5 seconds of delay. ## Solution Added await before all mutateTraders() calls to ensure data is refreshed before closing modals or showing success messages. Changes: - handleCreateTrader: Added await before mutateTraders() - handleSaveEditTrader: Added await before mutateTraders() - handleDeleteTrader: Added await before mutateTraders() - handleToggleTrader: Added await before mutateTraders() Impact: - From 3-4s delay to immediate display (< 500ms) - Significantly improved UX - Consistent with AI model and exchange config behavior Testing: - Frontend build successful - No TypeScript errors - Ready for manual UI testing Co-authored-by: the-dev-z <the-dev-z@users.noreply.github.com>
0xYYBB | ZYY | Bobo
2025-11-14 05:25:25 +08:00
575aef2156
Revert "fix(api): market/combined_streams: Get Proxy form Environment (#879)" (#985) This reverts commit 183e9273b889a3206a917887f0535526d6e48f59.
Lawrence Liu
2025-11-13 23:17:26 +08:00
3451d7bfac
fix(api): market/combined_streams: Get Proxy form Environment (#879) * fix(api): market/combined_streams: Get Proxy form Environment issues: ❌ 批量订阅流失败: 组合流WebSocket连接失败: dial tcp xxxxxx:443: i/o timeout Make environment variables effective for dialer.Dial("wss://fstream.binance.com/stream", nil): export HTTPS_PROXY=http://ip:port export HTTP_PROXY=http://ip:port Signed-off-by: MarsDoge <mars@dogexorg.com> * docs(WebSocket): add proxy usage guidance for combined streams (#475) Signed-off-by: MarsDoge <mars@dogexorg.com> --------- Signed-off-by: MarsDoge <mars@dogexorg.com>
Dongyan Qian
2025-11-13 20:29:51 +08:00