# QuantDinger Changelog This document records version updates, new features, bug fixes, and database migration instructions. --- ## V2.1.1 (2026-01-31) ### 🚀 New Features #### AI Analysis System Overhaul - **Fast Analysis Mode**: Replaced the complex multi-agent system with a streamlined single LLM call architecture for faster and more accurate analysis - **Progressive Loading**: Market data now loads independently - each section (sentiment, indices, heatmap, calendar) displays as soon as it's ready - **Professional Loading Animation**: New progress bar with step indicators during AI analysis - **Analysis Memory**: Store analysis results for history review and user feedback - **Stop Loss/Take Profit Calculation**: Now based on ATR (Average True Range) and Support/Resistance levels with clear methodology hints #### Global Market Integration - Integrated Global Market data directly into AI Analysis page - Real-time scrolling display of major global indices with flags, prices, and percentage changes - Interactive heatmaps for Crypto, Commodities, Sectors, and Forex - Economic calendar with bullish/bearish/neutral impact indicators - Commodities heatmap added (Gold, Silver, Crude Oil, etc.) #### Indicator Community Enhancements - **Admin Review System**: Administrators can now review, approve, reject, unpublish, and delete community indicators - **Purchase & Rating System**: Users can buy indicators, leave ratings and comments - **Statistics Tracking**: Purchase count, average rating, rating count, view count for each indicator #### Trading Assistant Improvements - Improved IBKR/MT5 connection test feedback - Added local deployment warning for external trading platforms - Virtual profit/loss calculation for signal-only strategies ### 🐛 Bug Fixes - Fixed progress bar and timer not animating during AI analysis - Fixed missing i18n translations for various components - Fixed Tiingo API rate limit issues with caching - Fixed A-share and H-share data fetching with multiple fallback sources - Fixed watchlist price batch fetch timeout handling - Fixed heatmap multi-language support for commodities and forex ### 🎨 UI/UX Improvements - Reorganized left menu: Indicator Market moved below Indicator Analysis, Settings moved to bottom - Skeleton loading animations for progressive data display - Dark theme support for all new components - Compact market overview bar design ### 📋 Database Migration **Run the following SQL on your PostgreSQL database before deploying V2.1.1:** ```sql -- ============================================================ -- QuantDinger V2.1.1 Database Migration -- ============================================================ -- 1. AI Analysis Memory Table CREATE TABLE IF NOT EXISTS qd_analysis_memory ( id SERIAL PRIMARY KEY, market VARCHAR(50) NOT NULL, symbol VARCHAR(50) NOT NULL, decision VARCHAR(10) NOT NULL, confidence INT DEFAULT 50, price_at_analysis DECIMAL(24, 8), entry_price DECIMAL(24, 8), stop_loss DECIMAL(24, 8), take_profit DECIMAL(24, 8), summary TEXT, reasons JSONB, risks JSONB, scores JSONB, indicators_snapshot JSONB, raw_result JSONB, created_at TIMESTAMP DEFAULT NOW(), validated_at TIMESTAMP, actual_outcome VARCHAR(20), actual_return_pct DECIMAL(10, 4), was_correct BOOLEAN, user_feedback VARCHAR(20), feedback_at TIMESTAMP ); -- Add raw_result column if table exists but column doesn't DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_analysis_memory' AND column_name = 'raw_result' ) THEN ALTER TABLE qd_analysis_memory ADD COLUMN raw_result JSONB; END IF; END $$; CREATE INDEX IF NOT EXISTS idx_analysis_memory_symbol ON qd_analysis_memory(market, symbol); CREATE INDEX IF NOT EXISTS idx_analysis_memory_created ON qd_analysis_memory(created_at DESC); CREATE INDEX IF NOT EXISTS idx_analysis_memory_validated ON qd_analysis_memory(validated_at) WHERE validated_at IS NOT NULL; -- 2. Indicator Purchase Records CREATE TABLE IF NOT EXISTS qd_indicator_purchases ( id SERIAL PRIMARY KEY, indicator_id INTEGER NOT NULL REFERENCES qd_indicator_codes(id) ON DELETE CASCADE, buyer_id INTEGER NOT NULL REFERENCES qd_users(id) ON DELETE CASCADE, seller_id INTEGER NOT NULL REFERENCES qd_users(id), price DECIMAL(10,2) NOT NULL DEFAULT 0, created_at TIMESTAMP DEFAULT NOW(), UNIQUE(indicator_id, buyer_id) ); CREATE INDEX IF NOT EXISTS idx_purchases_indicator ON qd_indicator_purchases(indicator_id); CREATE INDEX IF NOT EXISTS idx_purchases_buyer ON qd_indicator_purchases(buyer_id); CREATE INDEX IF NOT EXISTS idx_purchases_seller ON qd_indicator_purchases(seller_id); -- 3. Indicator Comments CREATE TABLE IF NOT EXISTS qd_indicator_comments ( id SERIAL PRIMARY KEY, indicator_id INTEGER NOT NULL REFERENCES qd_indicator_codes(id) ON DELETE CASCADE, user_id INTEGER NOT NULL REFERENCES qd_users(id) ON DELETE CASCADE, rating INTEGER DEFAULT 5 CHECK (rating >= 1 AND rating <= 5), content TEXT DEFAULT '', parent_id INTEGER REFERENCES qd_indicator_comments(id) ON DELETE CASCADE, is_deleted INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW(), updated_at TIMESTAMP DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_comments_indicator ON qd_indicator_comments(indicator_id); CREATE INDEX IF NOT EXISTS idx_comments_user ON qd_indicator_comments(user_id); -- 4. Indicator Codes Extensions DO $$ BEGIN -- Purchase count IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'purchase_count' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN purchase_count INTEGER DEFAULT 0; END IF; -- Average rating IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'avg_rating' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN avg_rating DECIMAL(3,2) DEFAULT 0; END IF; -- Rating count IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'rating_count' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN rating_count INTEGER DEFAULT 0; END IF; -- View count IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'view_count' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN view_count INTEGER DEFAULT 0; END IF; -- Review status IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'review_status' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN review_status VARCHAR(20) DEFAULT 'approved'; UPDATE qd_indicator_codes SET review_status = 'approved' WHERE publish_to_community = 1; END IF; -- Review note IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'review_note' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN review_note TEXT DEFAULT ''; END IF; -- Reviewed at IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'reviewed_at' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN reviewed_at TIMESTAMP; END IF; -- Reviewed by IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_indicator_codes' AND column_name = 'reviewed_by' ) THEN ALTER TABLE qd_indicator_codes ADD COLUMN reviewed_by INTEGER; END IF; END $$; CREATE INDEX IF NOT EXISTS idx_indicator_review_status ON qd_indicator_codes(review_status); -- 5. User Table Extensions DO $$ BEGIN -- Token version (for single-client login) IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_users' AND column_name = 'token_version' ) THEN ALTER TABLE qd_users ADD COLUMN token_version INTEGER DEFAULT 1; END IF; -- Notification settings IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'qd_users' AND column_name = 'notification_settings' ) THEN ALTER TABLE qd_users ADD COLUMN notification_settings TEXT DEFAULT '{}'; END IF; END $$; -- Migration Complete DO $$ BEGIN RAISE NOTICE '✅ QuantDinger V2.1.1 database migration completed!'; END $$; ``` ### 🗑️ Removed - Old multi-agent AI analysis system (`backend_api_python/app/services/agents/` directory) - Old analysis routes and services - Standalone Global Market page (merged into AI Analysis) - Reflection worker background process ### ⚠️ Breaking Changes - AI Analysis API endpoints changed from `/api/analysis/*` to `/api/fast-analysis/*` - Old analysis history data is not compatible with new format ### 📝 Configuration Notes - No new environment variables required - Existing LLM configuration in System Settings will be used for AI Analysis --- ## Version History | Version | Date | Highlights | |---------|------|------------| | V2.1.1 | 2026-01-31 | AI Analysis overhaul, Global Market integration, Indicator Community enhancements | --- *For questions or issues, please open a GitHub issue or contact the maintainers.*