89b0f71ef6
Merge pull request #498 from tangmengqiu/dev_logs feat(log): add logrus log lib and add telegram notification push as an option
tinkle-community
2025-11-05 14:15:47 +08:00
3ac5a694df
refactor: extract repeated star formatting logic - Extract formattedStars calculation to avoid duplication - Keep tabular-nums span for consistent number width during animation - Address code review feedback from @xqliu Co-Authored-By: tinkle-community <tinklefund@gmail.com>
Ember
2025-11-05 13:58:34 +08:00
c61f57e49e
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>
Ember
2025-11-05 10:51:20 +08:00
c7d7884d2b
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>
CoderMageFox
2025-11-05 13:26:05 +08:00
6bc9a16f4c
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>
CoderMageFox
2025-11-05 13:19:39 +08:00
9349438e82
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>
CoderMageFox
2025-11-05 13:15:49 +08:00
13dc0213f3
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>
CoderMageFox
2025-11-05 13:03:41 +08:00
b79878ab36
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>
Ember
2025-11-05 11:30:27 +08:00
aaf1243f20
test: verify pre-commit hook formatting
Ember
2025-11-05 11:05:45 +08:00
a89cd722c9
test: add eslint and prettier configuration with pre-commit hook
Ember
2025-11-05 11:05:07 +08:00
d1f7ced7e1
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>
Ember
2025-11-05 10:51:20 +08:00
fb1c093b68
Updates dependencies and ignores files Updates dependencies by replacing ioutil with io. Adds .tool-versions and web/yarn.lock to .gitignore.
Ethan
2025-11-05 11:29:23 +08:00
8afbf0b891
Merge pull request #421 from Im-Sue/fix/trader-manager-hyperliquid-testnet-clean fix(trader): add missing HyperliquidTestnet configuration in loadSing…
Shui
2025-11-04 22:04:13 -05:00
bb6a1ac073
Merge pull request #399 from tangmengqiu/fix/hyperliquid_setup fix(setup): hyperliquid setup, no need to enter the wallet address, improve user experience
Diego
2025-11-05 10:23:26 +08:00
7fa8414d16
Merge pull request #480 from SkywalkerJi/dev fix(AI): Change the default model to qwen3-max to mitigate output quality issues caused by model downgrading.
SkywalkerJi
2025-11-05 11:02:06 +09:00
aecc875d09
Merge pull request #477 from xqliu/fix/ai-max-tokens-env-var fix: add AI_MAX_TOKENS environment variable to prevent response truncation
Shui
2025-11-04 20:54:15 -05:00
308f469b9c
Change the default model to qwen3-max to mitigate output quality issues caused by model downgrading.
SkywalkerJi
2025-11-05 09:50:05 +08:00
f8edc0ec11
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
Liu Xiang Qian
2025-11-05 09:31:58 +08:00
caa42ec1a1
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>
zbhan
2025-11-04 15:52:01 -05:00
35ea18e927log.Printf mandates that its first argument must be a compile-time constant string.
SkywalkerJi
2025-11-05 01:36:44 +08:00
aecca7fc8c
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
ZhouYongyou
2025-11-05 01:20:02 +08:00
7027d7a2e1
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
ZhouYongyou
2025-11-05 01:16:34 +08:00
1cb5c268c5
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())
ZhouYongyou
2025-11-05 01:13:06 +08:00
2f14ee304b
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
ZhouYongyou
2025-11-05 01:05:13 +08:00
14ba145ea7
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
ZhouYongyou
2025-11-05 00:54:51 +08:00
30b22d3762
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
ZhouYongyou
2025-11-05 00:32:48 +08:00
5afd417a5d
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>
ZhouYongyou
2025-11-05 00:27:47 +08:00
834285bb16
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>
ZhouYongyou
2025-11-04 23:59:20 +08:00
40ba5865a4
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>
ZhouYongyou
2025-11-04 23:11:08 +08:00
1ca4b80add
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>
ZhouYongyou
2025-11-04 23:04:22 +08:00
2f0f026fdb
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>
ZhouYongyou
2025-11-04 22:41:35 +08:00
284d4f9b58
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>
Ember
2025-11-04 22:30:31 +08:00
64a704e779
Merge pull request #439 from NoFxAiOS/revert-411-beta Revert "Beta feat: migrate from SQLite to PostgreSQL + Redis architecture"
Icyoung
2025-11-04 21:48:22 +08:00
3e4c415628
Revert "Beta feat: migrate from SQLite to PostgreSQL + Redis architecture"
Icyoung
2025-11-04 21:47:58 +08:00
841cd2d277
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 ``
ZhouYongyou
2025-11-04 19:00:23 +08:00
21ae77e7cc
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 ``
ZhouYongyou
2025-11-04 18:58:20 +08:00
4e6b868531
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
ZhouYongyou
2025-11-04 18:44:07 +08:00
1e8746e692
chore: run go fmt to fix formatting issues
ZhouYongyou
2025-11-04 17:39:00 +08:00
dc44bc9a1b
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
ZhouYongyou
2025-11-03 00:56:02 +08:00
4d54a4704c
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 ✓ - 模型使用檢查邏輯正確 ✓
ZhouYongyou
2025-11-02 07:11:57 +08:00
b8eea8eaad
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
ZhouYongyou
2025-11-04 10:55:11 +08:00
3f5bb5ca84
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
ZhouYongyou
2025-11-04 10:54:49 +08:00
5d2d849226
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>
ZhouYongyou
2025-11-03 19:58:30 +08:00
c26463c4c4
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)
ZhouYongyou
2025-11-04 16:58:28 +08:00
2ca627ff72
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.
ZhouYongyou
2025-11-03 20:55:41 +08:00
93e9b505cf
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>
ZhouYongyou
2025-11-03 20:30:00 +08:00
cd41a563a1
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>
icy
2025-11-04 15:58:48 +08:00
9fe6fea664
Merge pull request #411 from Icyoung/beta Beta feat: migrate from SQLite to PostgreSQL + Redis architecture
tinkle-community
2025-11-04 15:50:50 +08:00
09ed0d6929
fix: resolve pager and query issues in migration script • Fix PostgreSQL pager hanging issue with --pset pager=off • Fix incorrect column name in pg_stat_user_tables query (tablename -> relname) • Simplify system config display to avoid long text truncation issues • Improve script reliability and user experience
icy
2025-11-04 15:42:41 +08:00
4f7d21c581
Merge pull request #404 from 0xEmberZz/feature/binance-guide feat: Add Binance setup guide with tutorial modal
tinkle-community
2025-11-04 15:35:19 +08:00
6426696258
feat: migrate from SQLite to PostgreSQL + Redis architecture Major database migration to modernize the AI trading system: • **Database Migration**: - Add PostgreSQL 15 and Redis 7 services to docker-compose - Create comprehensive PostgreSQL schema with proper indexes and triggers - Implement DatabaseInterface for multi-database support - Add automatic environment-based database selection • **Infrastructure**: - PostgreSQL: ACID transactions, better concurrency, JSON support - Redis: High-performance caching layer (prepared for future use) - Docker services with health checks and dependency management - Persistent volumes for data safety • **Code Refactoring**: - Abstract database operations through DatabaseInterface - Implement PostgreSQL-specific operations with proper syntax - Update all SQL queries to support both SQLite and PostgreSQL - Fix foreign key constraints and data type conversions • **Migration Tools**: - Automated data migration script from SQLite to PostgreSQL - Complete backup and restore procedures - One-click migration script with validation • **Compatibility**: - Backward compatible with existing SQLite deployments - Environment variable driven database selection - Preserved all existing functionality and data 🎯 Benefits: Better performance, scalability, and reliability for production deployments
icy
2025-11-04 15:09:11 +08:00
76abf1ee6e
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>
Ember
2025-11-04 14:50:38 +08:00
045834dcbe
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>
tangmengqiu
2025-11-03 23:15:38 -05:00
272e830707
fix the main branch history issue from November 3rd. Merge pull request #395 from NoFxAiOS/beta fix:fix the main branch history issue from November 3rd.
SkywalkerJi
2025-11-04 13:00:05 +09:00
21f263990d
Merge pull request #389 from NoFxAiOS/beta Fix:fix the main branch history issue from November 3rd.
tinkle-community
2025-11-04 11:22:10 +08:00