Commit Graph

950 Commits

Author SHA1 Message Date
tinkle-community
cbe753b9e6 fix(market): handle invalid period in calculateDonchian 2026-01-17 21:43:14 +08:00
tinkle-community
5c79aa451e feat(market): add Donchian channel calculation
Add calculateDonchian function to compute highest high and lowest low
over a specified period. This is the foundation for box (range) detection
in the multi-period box indicator system for grid trading.
2026-01-17 21:39:21 +08:00
tinkle-community
0a2c62885b docs: add grid market regime implementation plan
20 tasks covering:
- Donchian channel calculation
- Box data types and API
- Regime classification (4 levels)
- Breakout detection and handling
- False breakout recovery
- Frontend risk panel
- AI prompt updates
2026-01-17 20:51:08 +08:00
tinkle-community
ac25dd334e docs: add grid market regime detection design
Design for enhanced market state recognition with:
- Multi-dimensional indicators (ATR, Bollinger, EMA, MACD, RSI)
- Multi-period box indicators (72/240/500 1h candles)
- 4-level ranging classification
- Breakout detection and handling
- Frontend risk control panel
2026-01-17 20:46:02 +08:00
tinkle-community
f4cdf2e532 fix(grid): use actual PositionSize sum instead of count in syncGridState heuristic
The position-based heuristic was using `float64(previousFilledCount) * level.OrderQuantity`
which incorrectly assumed uniform order quantities. Since the grid uses weighted distribution
(gaussian, pyramid, uniform) where orders have different quantities, this could lead to
incorrect fill detection.

Now sums the actual PositionSize from filled levels for accurate comparison.
Also adds warning log when GetPositions() fails.
2026-01-14 13:02:58 +08:00
tinkle-community
f6411f05ba fix(grid): improve order state sync logic
- Don't assume missing orders are filled
- Compare position size to determine fill vs cancel
- Properly reset cancelled orders to empty state
- More accurate grid state tracking
2026-01-14 12:58:50 +08:00
tinkle-community
38be361eca fix(grid): recalculate bounds in autoAdjustGrid before reinitializing levels
Critical fix for grid auto-adjustment:
- Recalculate grid bounds (UpperPrice, LowerPrice, GridSpacing) centered
  on current price before reinitializing grid levels
- Preserve filled positions during adjustment by saving and restoring
  them to the closest new level after reinitialization
- Hold mutex lock for the entire adjustment operation to ensure atomicity
- Add locked variants of calculateDefaultBounds, calculateATRBounds, and
  initializeGridLevels to use during adjustment

Without this fix, autoAdjustGrid was using old boundaries when creating
new grid levels, defeating the purpose of auto-adjustment when price
moved significantly.
2026-01-14 12:54:26 +08:00
tinkle-community
584bfae699 feat(grid): add automatic grid adjustment
- New checkGridSkew() detects imbalanced grid
- autoAdjustGrid() reinitializes around current price
- Prevents grid from becoming ineffective after drift
- Triggers when one side is 3x more filled than other
2026-01-14 12:49:22 +08:00
tinkle-community
73789f7fb7 fix(grid): update daily PnL when stop loss is executed
The updateDailyPnL() function was added but never called, leaving
DailyPnL always at 0 and preventing daily loss limit checks from
triggering.

This fix updates DailyPnL and TotalProfit directly in checkAndExecuteStopLoss()
when a stop loss is executed. We update directly rather than calling
updateDailyPnL() because the mutex is already held in that function.
2026-01-14 12:45:31 +08:00
tinkle-community
65f333e73c feat(grid): enforce daily loss limit
- Add checkDailyLossLimit() function to check if daily loss exceeds limit
- Track daily PnL with auto-reset at midnight
- Pause grid when DailyLossLimitPct exceeded
- Add updateDailyPnL() helper for realized PnL tracking
- Prevent excessive single-day losses
2026-01-14 12:39:33 +08:00
tinkle-community
1454ad3112 feat(grid): enforce max drawdown limit with emergency exit
CRITICAL: Add drawdown protection
- New checkMaxDrawdown() function tracks peak equity
- emergencyExit() closes all positions and cancels orders
- Auto-pause grid when MaxDrawdownPct exceeded
- Protect capital from excessive losses
2026-01-14 12:34:45 +08:00
tinkle-community
ec81384b7a feat(grid): add breakout detection and auto-pause
CRITICAL: Detect price breakout from grid range
- New checkBreakout() function to detect upper/lower breakouts
- Auto-pause grid on significant breakout (>2%)
- Cancel all orders when breakout detected
- Prevent continued losses in trending market
- Minor breakouts (1-2%) logged for AI consideration
2026-01-14 12:30:43 +08:00
tinkle-community
c161632e2b feat(grid): implement stop loss execution
CRITICAL: Add code-level stop loss protection
- New checkAndExecuteStopLoss() function
- Checks each filled level against StopLossPct
- Automatically closes positions exceeding stop loss
- Called during every grid state sync
2026-01-14 12:25:59 +08:00
tinkle-community
8ef6045f9d fix(grid): add total position value limit check
CRITICAL: Prevent excessive position accumulation
- New checkTotalPositionLimit() function
- Checks current + pending + new order value
- Rejects orders that would exceed TotalInvestment x Leverage
- Logs clear error messages when limit exceeded
2026-01-14 12:21:43 +08:00
tinkle-community
d7d9dc5c42 fix(grid): prevent CancelOrder from canceling all orders
CRITICAL BUG FIX:
- CancelOrder no longer calls CancelAllOrders
- Try exchange-specific CancelOrder if available
- Return error if individual cancellation not supported
2026-01-14 12:18:24 +08:00
tinkle-community
90509ae783 fix(grid): add leverage setting before order placement
CRITICAL BUG FIX:
- Call SetLeverage() in GridTraderAdapter.PlaceLimitOrder()
- Set leverage during grid initialization
- Log leverage setting results
2026-01-14 12:14:08 +08:00
tinkle-community
937527281e test: add Lighter API authentication tests and diagnostic tools 2026-01-13 14:03:28 +08:00
tinkle-community
2bc45827f3 fix: use auth query parameter instead of Authorization header for Lighter API 2026-01-13 13:51:58 +08:00
tinkle-community
68e8a6e4b0 fix: provide FromAccountIndex and ApiKeyIndex for Lighter nonce auto-fetch
Root cause: SDK requires these fields to fetch nonce from API, otherwise nonce gets cached/stuck
2026-01-13 13:42:14 +08:00
tinkle-community
aa7aa94275 fix: address code review issues for GetOpenOrders
- Add error logging for OKX/Bitget API failures (was silently swallowed)
- Fix Lighter position side logic to handle reduce-only orders
- Change verbose debug logs from Infof to Debugf level
2026-01-13 13:38:09 +08:00
tinkle-community
13189fa3aa feat: implement GetOpenOrders for Aster, OKX, Bitget exchanges
- Aster: uses /fapi/v3/openOrders endpoint
- OKX: uses /api/v5/trade/orders-pending and orders-algo-pending
- Bitget: uses /api/v2/mix/order/orders-pending and orders-plan-pending
2026-01-13 13:34:43 +08:00
tinkle-community
33cf09e7fe fix: correct Lighter API response parsing for GetOpenOrders
- Changed response field from 'data' to 'orders' to match Lighter API
- Updated OrderResponse struct to match Lighter's actual field names
- Fixed field types: price/quantity as strings, is_ask for side
2026-01-13 13:28:18 +08:00
tinkle-community
ef91bec2dd debug: add logging for Lighter GetActiveOrders API call 2026-01-13 13:24:57 +08:00
tinkle-community
2fcbdbab36 fix: implement GetOpenOrders for Lighter exchange 2026-01-13 13:19:11 +08:00
tinkle-community
1786f0ff53 Merge branch 'dev' into ai-grid 2026-01-13 13:10:57 +08:00
tinkle-community
1b47249d57 Merge branch 'dev' into ai-grid 2026-01-13 13:07:01 +08:00
SkywalkerJi
502801777f docs: update PR templates to English-only (#1332) 2026-01-12 22:50:03 -06:00
SkywalkerJi
b10b9ec1a7 docs: convert PR templates to English-only (#1331) 2026-01-12 22:06:17 -06:00
tinkle-community
c1def0e2c2 fix: change GAMMA-RAY risk level from ZERO to LOW 2026-01-13 10:36:27 +08:00
tinkle-community
5fb26c17dc feat: add AI grid trading and market regime classification
- Add GridTrader interface with PlaceLimitOrder, CancelOrder, GetOrderBook
- Implement GridTrader for all exchanges (Binance, Bybit, OKX, Bitget, Hyperliquid, Aster, Lighter)
- Add grid engine with ATR-based boundary calculation and fund distribution
- Add market regime classification documents (Chinese/English)
- Add GridConfigEditor component for frontend configuration
2026-01-13 10:33:02 +08:00
tinkle-community
705aa641b0 fix: backtest module PostgreSQL compatibility and bug fixes
- Fix PostgreSQL placeholder conversion (? to $1, $2...) in all SQL queries
- Fix int4 overflow for timestamp columns (ALTER to BIGINT)
- Fix notional calculation bug in position Close() using proportional entry
- Fix potential panic in DecisionTimestamp with bounds check
- Fix nil pointer dereference in sliceUpTo with defensive checks
- Fix race condition in releaseLock using sync.Once
- Fix UnrealizedPnLPct always 0 in convertPositions
- Improve Sharpe ratio calculation with proper negative return handling
2026-01-09 01:48:02 +08:00
tinkle-community
2f88205231 fix: chart container height using flexbox layout 2026-01-08 15:48:33 +08:00
tinkle-community
e92222950a fix: use completeRegistration for incomplete OTP setup in login flow
- LoginPage: call completeRegistration instead of verifyOTP when qrCodeURL exists
- This ensures otp_verified is set to true for users completing OTP setup
- Backend: reorder maxUsers check to allow existing incomplete users to continue
- Backend: return OTP info when login with incomplete OTP setup
2026-01-07 20:15:27 +08:00
tinkle-community
138943d6fb fix: update xyz dex order routing configuration 2026-01-07 02:31:52 +08:00
tinkle-community
b36ab27b65 feat: add pending orders (SL/TP) display on chart
- Add GetOpenOrders method to Trader interface
- Implement for Binance (legacy + Algo), Bybit, Hyperliquid
- Add stub implementations for OKX, Bitget, Aster, Lighter
- Add /api/open-orders endpoint
- Display price lines for SL (red) and TP (green) orders
- Refresh open orders every 60 seconds (separate from 5s kline refresh)
2026-01-07 00:50:29 +08:00
tinkle-community
5e65ae7077 fix: chart order markers not displaying due to timestamp format mismatch
- Fix milliseconds to seconds conversion in parseCustomTime (AdvancedChart & ChartWithOrders)
- Add GetTraderOrdersFiltered to filter orders at database level by symbol/status
- Increase order limit from 50 to 200 for more historical orders
- Group multiple orders at same candle time and show count (B3, S5, etc.)
- Buy markers shown below bar (green), sell markers above bar (red)
2026-01-06 21:08:42 +08:00
tinkle-community
c0c89d7534 docs: update Railway deploy button with official template URL 2026-01-06 19:07:25 +08:00
tinkle-community
3b2a3f4e76 chore: clean up Railway deployment - remove debug code 2026-01-06 18:58:27 +08:00
tinkle-community
c8458ec79c fix: align PORT defaults to 8080 for Railway 2026-01-06 18:53:27 +08:00
tinkle-community
aee096ab1e debug: test nginx startup and internal health check 2026-01-06 18:48:11 +08:00
tinkle-community
165c0b1b5d debug: add nginx config test and file check 2026-01-06 18:44:24 +08:00
tinkle-community
4c097f7190 fix: use heredoc for nginx config to avoid envsubst issues 2026-01-06 18:41:08 +08:00
tinkle-community
ea763a2471 fix: use port 8081 for backend to avoid conflict with nginx 2026-01-06 18:37:18 +08:00
tinkle-community
6e6bdf1e57 refactor: simplify Railway deployment using existing GHCR images
- Use multi-stage build from existing backend/frontend images
- Remove supervisord, use simple shell script
- Single process model: backend runs in background, nginx foreground
- Auto-generate encryption keys on startup
2026-01-06 18:31:39 +08:00
tinkle-community
f0b4913ad6 debug: add PORT environment variable debugging 2026-01-06 18:19:28 +08:00
tinkle-community
29cd79c626 fix: use Railway PORT env var for nginx 2026-01-06 18:07:11 +08:00
tinkle-community
7db37ade1c fix: auto-generate encryption keys in Railway startup script 2026-01-06 17:59:29 +08:00
tinkle-community
4804cfcb05 feat: add Railway one-click deployment support
- Add Dockerfile.railway for all-in-one container
- Add railway.toml configuration
- Add railway/nginx.conf and supervisord.conf
- Update README with Deploy on Railway button
- Update Chinese README with deployment instructions
2026-01-06 17:32:09 +08:00
tinkle-community
799d8b9c2e feat: migrate timestamps to int64 and security improvements
- Convert all time.Time fields to int64 Unix milliseconds (UTC)
- Add PostgreSQL migration to convert timestamp columns to bigint
- Reduce Binance sync window from 7 days to 24 hours
- Fix dashboard trader name visibility (add nofx-text-main color)
- Add position value column to history table
- Remove hardcoded API keys from test files
2026-01-06 15:56:07 +08:00
tinkle-community
5c4c9cdc99 fix: handle large Binance trade IDs in Go to avoid database CAST limitations 2026-01-06 10:43:21 +08:00