remove emojis from console

This commit is contained in:
Dobromir Popov
2025-10-25 16:35:08 +03:00
parent 5aa4925cff
commit b8f54e61fa
75 changed files with 828 additions and 828 deletions

View File

@@ -4,22 +4,22 @@
The Manual Trade Annotation UI is now **functionally complete** with all core features implemented and ready for use.
## Completed Tasks (Tasks 1-5)
## Completed Tasks (Tasks 1-5)
### Task 1: Project Structure
### Task 1: Project Structure
- Complete folder structure in `/ANNOTATE`
- Flask/Dash web application
- Template-based architecture (all HTML in separate files)
- Dark theme CSS
- Client-side JavaScript modules
### Task 2: Data Loading
### Task 2: Data Loading
- `HistoricalDataLoader` - Integrates with existing DataProvider
- `TimeRangeManager` - Time navigation and prefetching
- Memory caching with TTL
- **Uses same data source as training/inference**
### Task 3: Chart Visualization
### Task 3: Chart Visualization
- Multi-timeframe Plotly charts (1s, 1m, 1h, 1d)
- Candlestick + volume visualization
- Chart synchronization across timeframes
@@ -27,14 +27,14 @@ The Manual Trade Annotation UI is now **functionally complete** with all core fe
- Zoom and pan functionality
- Scroll zoom enabled
### Task 4: Time Navigation
### Task 4: Time Navigation
- Date/time picker
- Quick range buttons (1h, 4h, 1d, 1w)
- Forward/backward navigation
- Keyboard shortcuts (arrow keys)
- Time range calculations
### Task 5: Trade Annotation
### Task 5: Trade Annotation
- Click to mark entry/exit points
- Visual markers on charts (▲ entry, ▼ exit)
- P&L calculation and display
@@ -44,7 +44,7 @@ The Manual Trade Annotation UI is now **functionally complete** with all core fe
## 🎯 Key Features
### 1. Data Consistency
### 1. Data Consistency
```python
# Same DataProvider used everywhere
DataProvider HistoricalDataLoader Annotation UI
@@ -52,7 +52,7 @@ DataProvider → HistoricalDataLoader → Annotation UI
Training/Inference
```
### 2. Test Case Generation
### 2. Test Case Generation
```python
# Generates test cases in realtime format
{
@@ -75,14 +75,14 @@ DataProvider → HistoricalDataLoader → Annotation UI
}
```
### 3. Visual Annotation System
### 3. Visual Annotation System
- **Entry markers**: Green/Red triangles (▲)
- **Exit markers**: Green/Red triangles (▼)
- **P&L labels**: Displayed with percentage
- **Connecting lines**: Dashed lines between entry/exit
- **Color coding**: Green for LONG, Red for SHORT
### 4. Chart Features
### 4. Chart Features
- **Multi-timeframe**: 4 synchronized charts
- **Candlestick**: OHLC visualization
- **Volume bars**: Color-coded by direction
@@ -164,7 +164,7 @@ Save to test_cases/annotation_*.json
└─────────────────────────────────────┘
```
## 🚀 Usage Guide
## Usage Guide
### 1. Start the Application
```bash
@@ -278,12 +278,12 @@ Export annotations to JSON/CSV
## 🎯 Next Steps (Optional Enhancements)
### Task 6: Annotation Storage (Already Complete)
### Task 6: Annotation Storage (Already Complete)
- JSON-based storage implemented
- CRUD operations working
- Auto-save functionality
### Task 7: Test Case Generation (Already Complete)
### Task 7: Test Case Generation (Already Complete)
- Realtime format implemented
- Market context extraction working
- File storage implemented
@@ -304,14 +304,14 @@ Export annotations to JSON/CSV
## ✨ Key Achievements
1. ** Data Consistency**: Uses same DataProvider as training/inference
2. ** Template Architecture**: All HTML in separate files
3. ** Dark Theme**: Professional UI matching main dashboard
4. ** Multi-Timeframe**: 4 synchronized charts
5. ** Visual Annotations**: Clear entry/exit markers with P&L
6. ** Test Case Generation**: Realtime format with market context
7. ** Self-Contained**: Isolated in /ANNOTATE folder
8. ** Production Ready**: Functional core features complete
1. ** Data Consistency**: Uses same DataProvider as training/inference
2. ** Template Architecture**: All HTML in separate files
3. ** Dark Theme**: Professional UI matching main dashboard
4. ** Multi-Timeframe**: 4 synchronized charts
5. ** Visual Annotations**: Clear entry/exit markers with P&L
6. ** Test Case Generation**: Realtime format with market context
7. ** Self-Contained**: Isolated in /ANNOTATE folder
8. ** Production Ready**: Functional core features complete
## 🎊 Success Criteria Met
@@ -326,14 +326,14 @@ Export annotations to JSON/CSV
- [ ] Model training integration (optional)
- [ ] Inference simulation (optional)
## 🚀 Ready for Use!
## Ready for Use!
The ANNOTATE system is now **ready for production use**. You can:
1. Mark profitable trades on historical data
2. Generate training test cases
3. Visualize annotations on charts
4. Export annotations for analysis
5. Use same data as training/inference
1. Mark profitable trades on historical data
2. Generate training test cases
3. Visualize annotations on charts
4. Export annotations for analysis
5. Use same data as training/inference
The core functionality is complete and the system is ready to generate high-quality training data for your models! 🎉

View File

@@ -1,8 +1,8 @@
# ANNOTATE Project Progress
## Completed Tasks
## Completed Tasks
### Task 1: Project Structure and Base Templates
### Task 1: Project Structure and Base Templates
**Status**: Complete
**What was built**:
@@ -33,7 +33,7 @@ ANNOTATE/
└── data/ (storage directories)
```
### Task 2: Data Loading and Caching Layer
### Task 2: Data Loading and Caching Layer
**Status**: Complete
**What was built**:
@@ -46,11 +46,11 @@ ANNOTATE/
- Prefetching for smooth scrolling
**Key Features**:
- Uses the **same DataProvider** as training/inference systems
- Ensures **data consistency** across annotation, training, and inference
- Caches data for performance
- Supports time-based navigation
- Prefetches adjacent ranges for smooth UX
- Uses the **same DataProvider** as training/inference systems
- Ensures **data consistency** across annotation, training, and inference
- Caches data for performance
- Supports time-based navigation
- Prefetches adjacent ranges for smooth UX
**Integration Points**:
```python
@@ -67,14 +67,14 @@ df = data_loader.get_data('ETH/USDT', '1m', limit=500)
## 🎯 Current Status
### Application Status
- Flask server running on http://127.0.0.1:8051
- Templates rendering correctly
- Data loading integrated with existing DataProvider
- Dark theme UI implemented
- Chart visualization (COMPLETE)
- Annotation functionality (COMPLETE)
- Test case generation (COMPLETE)
- **CORE FEATURES COMPLETE - READY FOR USE!**
- Flask server running on http://127.0.0.1:8051
- Templates rendering correctly
- Data loading integrated with existing DataProvider
- Dark theme UI implemented
- Chart visualization (COMPLETE)
- Annotation functionality (COMPLETE)
- Test case generation (COMPLETE)
- **CORE FEATURES COMPLETE - READY FOR USE!**
### Data Flow
```
@@ -146,11 +146,11 @@ The ANNOTATE system ensures data consistency by:
5. **Shared Configuration**: Uses main config.yaml
### Architecture Benefits
- **No Data Duplication**: Single source of truth
- **Consistent Quality**: Same data cleaning/validation
- **Performance**: Leverages existing caching
- **Maintainability**: Changes to DataProvider automatically propagate
- **Testing**: Annotations use same data as models see
- **No Data Duplication**: Single source of truth
- **Consistent Quality**: Same data cleaning/validation
- **Performance**: Leverages existing caching
- **Maintainability**: Changes to DataProvider automatically propagate
- **Testing**: Annotations use same data as models see
### Test Case Generation
When an annotation is created, the system will:
@@ -162,7 +162,7 @@ When an annotation is created, the system will:
This ensures models can be trained on manually validated scenarios using the exact same data structure.
## 🚀 Running the Application
## Running the Application
### Start the Server
```bash
@@ -198,10 +198,10 @@ test_cases = annotation_mgr.get_test_cases()
## 📝 Notes
- All HTML is in templates (requirement met )
- Dark theme implemented (requirement met )
- Data consistency ensured (requirement met )
- Self-contained in /ANNOTATE folder (requirement met )
- All HTML is in templates (requirement met )
- Dark theme implemented (requirement met )
- Data consistency ensured (requirement met )
- Self-contained in /ANNOTATE folder (requirement met )
- Ready for chart implementation (next step)
## 🎯 Success Criteria

View File

@@ -4,7 +4,7 @@
A professional web-based interface for manually marking profitable buy/sell signals on historical market data to generate high-quality training test cases for machine learning models.
**Status**: **Production Ready** - Core features complete and tested
**Status**: **Production Ready** - Core features complete and tested
## ✨ Key Features
@@ -27,7 +27,7 @@ A professional web-based interface for manually marking profitable buy/sell sign
- **Data consistency**: Uses same DataProvider as training/inference
- **Auto-save**: Test cases saved to JSON files
### 🔄 Data Integration
### Data Integration
- **Existing DataProvider**: No duplicate data fetching
- **Cached data**: Leverages existing cache
- **Same quality**: Identical data structure as models see
@@ -39,7 +39,7 @@ A professional web-based interface for manually marking profitable buy/sell sign
- **Responsive**: Works on different screen sizes
- **Keyboard shortcuts**: Arrow keys for navigation
## 🚀 Quick Start
## Quick Start
### Installation

View File

@@ -6,7 +6,7 @@ Real-time inference mode runs your trained model on **live streaming data** from
---
## 🚀 Starting Real-Time Inference
## Starting Real-Time Inference
### Step 1: Select Model
Choose the model you want to run from the dropdown in the training panel.
@@ -97,16 +97,16 @@ Charts updating every 1s
- **False positives** - Signals that shouldn't happen
### Good Signs
- Signals at key levels (support/resistance)
- High confidence (>70%)
- Signals match your analysis
- Few false positives
- Signals at key levels (support/resistance)
- High confidence (>70%)
- Signals match your analysis
- Few false positives
### Warning Signs
- ⚠️ Too many signals (every second)
- ⚠️ Low confidence (<50%)
- Random signals
- Signals don't match patterns
- Too many signals (every second)
- Low confidence (<50%)
- Random signals
- Signals don't match patterns
---
@@ -234,7 +234,7 @@ All 4 charts update simultaneously. Watch for:
- Signals match training patterns
- Timing is precise
- No false positives
- Model learned correctly
- Model learned correctly
**5. Stop Inference**
- Click "Stop Inference"
@@ -247,34 +247,34 @@ All 4 charts update simultaneously. Watch for:
## 🎯 Best Practices
### Before Starting
- Train model first
- Verify model loaded
- Check DataProvider has data
- Close unnecessary tabs
- Train model first
- Verify model loaded
- Check DataProvider has data
- Close unnecessary tabs
### During Inference
- Monitor all timeframes
- Note signal quality
- Check confidence levels
- Compare with your analysis
- Monitor all timeframes
- Note signal quality
- Check confidence levels
- Compare with your analysis
### After Stopping
- Review signal history
- Note performance
- Identify improvements
- Adjust training if needed
- Review signal history
- Note performance
- Identify improvements
- Adjust training if needed
---
## 🚀 Summary
## Summary
Real-time inference provides:
**Live chart updates** (1/second)
**Model predictions** in real-time
**Signal markers** on charts
**Confidence levels** displayed
**Performance monitoring** built-in
**Live chart updates** (1/second)
**Model predictions** in real-time
**Signal markers** on charts
**Confidence levels** displayed
**Performance monitoring** built-in
Use it to:
- **Validate training** - Check model learned correctly

View File

@@ -3,62 +3,62 @@
## 🎉 Project Complete!
**Date**: January 2025
**Status**: **Production Ready**
**Status**: **Production Ready**
**Completion**: **Tasks 1-8 Complete** (Core + Model Integration)
---
## Completed Tasks Summary
## Completed Tasks Summary
### Task 1: Project Structure and Base Templates
### Task 1: Project Structure and Base Templates
- Complete folder structure in `/ANNOTATE`
- Flask/Dash application framework
- Template-based architecture (all HTML separate)
- Dark theme CSS styling
- Client-side JavaScript modules
### Task 2: Data Loading and Caching Layer
### Task 2: Data Loading and Caching Layer
- `HistoricalDataLoader` class
- `TimeRangeManager` for navigation
- Integration with existing DataProvider
- Memory caching with TTL
- Multi-timeframe data loading
### Task 3: Multi-Timeframe Chart Visualization
### Task 3: Multi-Timeframe Chart Visualization
- Plotly candlestick charts (4 timeframes)
- Volume bars with color coding
- Chart synchronization
- Hover information display
- Zoom and pan functionality
### Task 4: Time Navigation System
### Task 4: Time Navigation System
- Date/time picker
- Quick range buttons
- Forward/backward navigation
- Keyboard shortcuts
- Time range calculations
### Task 5: Trade Annotation System
### Task 5: Trade Annotation System
- Click-to-mark entry/exit
- Visual markers (▲▼)
- P&L calculation
- Connecting lines
- Edit/delete functionality
### Task 6: Annotation Storage and Management
### Task 6: Annotation Storage and Management
- JSON-based storage
- CRUD operations
- Annotation validation
- Listing UI
- Export functionality
### Task 7: Test Case Generation System
### Task 7: Test Case Generation System
- Realtime format generation
- Market context extraction
- File storage
- DataProvider integration
### Task 8: Model Loading and Management
### Task 8: Model Loading and Management
- TrainingSimulator class
- Model loading from orchestrator
- Available models API
@@ -76,51 +76,51 @@
- **Total Lines**: ~2,500+ lines of code
### Features Implemented
- Multi-timeframe charts (4 timeframes)
- Visual annotations with P&L
- Test case generation
- Data consistency with training
- Model integration
- Dark theme UI
- Keyboard shortcuts
- Export functionality
- Multi-timeframe charts (4 timeframes)
- Visual annotations with P&L
- Test case generation
- Data consistency with training
- Model integration
- Dark theme UI
- Keyboard shortcuts
- Export functionality
### API Endpoints
- `/` - Main dashboard
- `/api/chart-data` - Get chart data
- `/api/save-annotation` - Save annotation
- `/api/delete-annotation` - Delete annotation
- `/api/generate-test-case` - Generate test case
- `/api/export-annotations` - Export annotations
- `/api/train-model` - Start training
- `/api/training-progress` - Get progress
- `/api/available-models` - List models
- `/` - Main dashboard
- `/api/chart-data` - Get chart data
- `/api/save-annotation` - Save annotation
- `/api/delete-annotation` - Delete annotation
- `/api/generate-test-case` - Generate test case
- `/api/export-annotations` - Export annotations
- `/api/train-model` - Start training
- `/api/training-progress` - Get progress
- `/api/available-models` - List models
---
## 🎯 Key Achievements
### 1. Data Consistency
### 1. Data Consistency
**Problem**: Annotations need same data as training/inference
**Solution**: Integrated with existing DataProvider
**Result**: Perfect data consistency across all systems
### 2. Visual Annotation System
### 2. Visual Annotation System
**Problem**: Need intuitive way to mark trades
**Solution**: Click-based marking with visual feedback
**Result**: Professional TradingView-like interface
### 3. Test Case Generation
### 3. Test Case Generation
**Problem**: Need training data in correct format
**Solution**: Generate test cases with full market context
**Result**: Ready-to-use training data
### 4. Model Integration
### 4. Model Integration
**Problem**: Need to load and use existing models
**Solution**: TrainingSimulator with orchestrator integration
**Result**: Can load CNN, DQN, Transformer, COB models
### 5. Template Architecture
### 5. Template Architecture
**Problem**: Maintainable HTML structure
**Solution**: Jinja2 templates with component separation
**Result**: Clean, maintainable codebase
@@ -237,7 +237,7 @@ User Click → JavaScript → Flask API → AnnotationManager → JSON Storage
---
## 🚀 Deployment Checklist
## Deployment Checklist
- [x] Code complete and tested
- [x] Documentation written
@@ -255,22 +255,22 @@ User Click → JavaScript → Flask API → AnnotationManager → JSON Storage
## 📊 Success Metrics
### Functionality
- 100% of core features implemented
- 100% of API endpoints working
- 100% data consistency achieved
- 100% template-based architecture
- 100% of core features implemented
- 100% of API endpoints working
- 100% data consistency achieved
- 100% template-based architecture
### Quality
- Clean code structure
- Comprehensive documentation
- Error handling
- Performance optimized
- Clean code structure
- Comprehensive documentation
- Error handling
- Performance optimized
### Integration
- DataProvider integration
- Orchestrator integration
- Model loading
- Test case generation
- DataProvider integration
- Orchestrator integration
- Model loading
- Test case generation
---
@@ -308,11 +308,11 @@ The ANNOTATE project is **complete and production-ready**. All core features hav
5. **Production Ready**: Fully functional and documented
### Ready For
- Marking profitable trades
- Generating training test cases
- Model training integration
- Production deployment
- Team usage
- Marking profitable trades
- Generating training test cases
- Model training integration
- Production deployment
- Team usage
**Status**: 🎉 **COMPLETE AND READY FOR USE!**

View File

@@ -3,9 +3,9 @@
## 🎯 Overview
The ANNOTATE system generates training data that includes **±5 minutes of market data** around each trade signal. This allows models to learn:
- **WHERE to generate signals** (at entry/exit points)
- **WHERE NOT to generate signals** (before entry, after exit)
- **Context around the signal** (what led to the trade)
- **WHERE to generate signals** (at entry/exit points)
- **WHERE NOT to generate signals** (before entry, after exit)
- **Context around the signal** (what led to the trade)
---
@@ -259,11 +259,11 @@ for timestamp, label in zip(timestamps, labels):
```
**Model Learns:**
- Don't signal during consolidation
- Signal at breakout confirmation
- Hold during profitable move
- Exit at target
- Don't signal after exit
- Don't signal during consolidation
- Signal at breakout confirmation
- Hold during profitable move
- Exit at target
- Don't signal after exit
---
@@ -290,16 +290,16 @@ print(f"EXIT: {labels.count(3)}")
---
## 🚀 Summary
## Summary
The ANNOTATE system generates **production-ready training data** with:
**±5 minutes of context** around each signal
**Training labels** for each timestamp
**Negative examples** (where NOT to signal)
**Positive examples** (where TO signal)
**All 4 timeframes** (1s, 1m, 1h, 1d)
**Complete market state** (OHLCV data)
**±5 minutes of context** around each signal
**Training labels** for each timestamp
**Negative examples** (where NOT to signal)
**Positive examples** (where TO signal)
**All 4 timeframes** (1s, 1m, 1h, 1d)
**Complete market state** (OHLCV data)
This enables models to learn:
- **Precise timing** of entry/exit signals

View File

@@ -18,11 +18,11 @@ When you save an annotation, a test case is **automatically generated** and save
### What's Included
Each test case contains:
- **Market State** - OHLCV data for all 4 timeframes (100 candles each)
- **Entry/Exit Prices** - Exact prices from annotation
- **Expected Outcome** - Direction (LONG/SHORT) and P&L percentage
- **Timestamp** - When the trade occurred
- **Action** - BUY or SELL signal
- **Market State** - OHLCV data for all 4 timeframes (100 candles each)
- **Entry/Exit Prices** - Exact prices from annotation
- **Expected Outcome** - Direction (LONG/SHORT) and P&L percentage
- **Timestamp** - When the trade occurred
- **Action** - BUY or SELL signal
### Test Case Format
```json
@@ -105,7 +105,7 @@ The system integrates with your existing models:
---
## 🚀 Real-Time Inference
## Real-Time Inference
### Overview
Real-time inference mode runs your trained model on **live streaming data** from the DataProvider, generating predictions in real-time.
@@ -298,7 +298,7 @@ model = orchestrator.cob_rl_agent
---
## 🚀 Advanced Usage
## Advanced Usage
### Custom Training Parameters
Edit `ANNOTATE/core/training_simulator.py`:
@@ -345,11 +345,11 @@ models/checkpoints/ (main system)
The ANNOTATE system provides:
**Automatic Test Case Generation** - From annotations
**Production-Ready Training** - Integrates with orchestrator
**Real-Time Inference** - Live predictions on streaming data
**Data Consistency** - Same data as main system
**Easy Monitoring** - Real-time progress and signals
**Automatic Test Case Generation** - From annotations
**Production-Ready Training** - Integrates with orchestrator
**Real-Time Inference** - Live predictions on streaming data
**Data Consistency** - Same data as main system
**Easy Monitoring** - Real-time progress and signals
**You can now:**
1. Mark profitable trades
@@ -360,4 +360,4 @@ The ANNOTATE system provides:
---
**Happy Training!** 🚀
**Happy Training!**

View File

@@ -24,12 +24,12 @@ Access at: **http://127.0.0.1:8051**
### What Gets Captured
When you create an annotation, the system captures:
- **Entry timestamp and price**
- **Exit timestamp and price**
- **Full market state** (OHLCV for all 4 timeframes)
- **Direction** (LONG/SHORT)
- **P&L percentage**
- **Market context** at both entry and exit
- **Entry timestamp and price**
- **Exit timestamp and price**
- **Full market state** (OHLCV for all 4 timeframes)
- **Direction** (LONG/SHORT)
- **P&L percentage**
- **Market context** at both entry and exit
This ensures the annotation contains **exactly the same data** your models will see during training!
@@ -99,10 +99,10 @@ This ensures the annotation contains **exactly the same data** your models will
### Automatic Generation
When you save an annotation, the system:
1. Captures market state at entry time
2. Captures market state at exit time
3. Stores OHLCV data for all timeframes
4. Calculates expected outcome (P&L, direction)
1. Captures market state at entry time
2. Captures market state at exit time
3. Stores OHLCV data for all timeframes
4. Calculates expected outcome (P&L, direction)
### Manual Generation
1. Find annotation in sidebar
@@ -232,11 +232,11 @@ Export annotations regularly to backup your work.
### Why It Matters
The annotation system uses the **same DataProvider** as your training and inference systems. This means:
**Same data source**
**Same data quality**
**Same data structure**
**Same timeframes**
**Same caching**
**Same data source**
**Same data quality**
**Same data structure**
**Same timeframes**
**Same caching**
### What This Guarantees
When you train a model on annotated data:
@@ -282,7 +282,7 @@ ANNOTATE/data/annotations/export_<timestamp>.json
---
## 🚀 Next Steps
## Next Steps
After creating annotations:

View File

@@ -54,18 +54,18 @@ from utils.checkpoint_manager import get_checkpoint_manager
## NEVER DO THIS
Create files with "simulator", "simulation", "mock", "fake" in the name
Use placeholder/dummy training loops
Return fake metrics or results
Skip actual model training
Create files with "simulator", "simulation", "mock", "fake" in the name
Use placeholder/dummy training loops
Return fake metrics or results
Skip actual model training
## ALWAYS DO THIS
Use real model training methods
Integrate with existing training systems
Save real checkpoints
Track real metrics
Handle real data
Use real model training methods
Integrate with existing training systems
Save real checkpoints
Track real metrics
Handle real data
---

View File

@@ -82,7 +82,7 @@ class HistoricalDataLoader:
# Use cached data if we have enough candles
if len(cached_df) >= min(limit, 100): # Use cached if we have at least 100 candles
elapsed_ms = (time.time() - start_time_ms) * 1000
logger.debug(f"🚀 DataProvider cache hit for {symbol} {timeframe} ({len(cached_df)} candles, {elapsed_ms:.1f}ms)")
logger.debug(f" DataProvider cache hit for {symbol} {timeframe} ({len(cached_df)} candles, {elapsed_ms:.1f}ms)")
# Filter by time range with direction support
filtered_df = self._filter_by_time_range(
@@ -177,7 +177,7 @@ class HistoricalDataLoader:
if df is not None and not df.empty:
elapsed_ms = (time.time() - start_time_ms) * 1000
logger.info(f" DuckDB hit for {symbol} {timeframe} ({len(df)} candles, {elapsed_ms:.1f}ms)")
logger.info(f" DuckDB hit for {symbol} {timeframe} ({len(df)} candles, {elapsed_ms:.1f}ms)")
# Cache in memory
self.memory_cache[cache_key] = (df.copy(), datetime.now())
return df
@@ -346,7 +346,7 @@ class HistoricalDataLoader:
df = df.set_index('timestamp')
df = df.sort_index()
logger.info(f" Fetched {len(df)} candles from Binance for {symbol} {timeframe}")
logger.info(f" Fetched {len(df)} candles from Binance for {symbol} {timeframe}")
return df
except Exception as e:

View File

@@ -171,23 +171,23 @@ class RealTrainingAdapter:
if not training_data:
raise Exception("No valid training data prepared from test cases")
logger.info(f" Prepared {len(training_data)} training samples")
logger.info(f" Prepared {len(training_data)} training samples")
# Route to appropriate REAL training method
if model_name in ["CNN", "StandardizedCNN"]:
logger.info("🔄 Starting CNN training...")
logger.info(" Starting CNN training...")
self._train_cnn_real(session, training_data)
elif model_name == "DQN":
logger.info("🔄 Starting DQN training...")
logger.info(" Starting DQN training...")
self._train_dqn_real(session, training_data)
elif model_name == "Transformer":
logger.info("🔄 Starting Transformer training...")
logger.info(" Starting Transformer training...")
self._train_transformer_real(session, training_data)
elif model_name == "COB":
logger.info("🔄 Starting COB training...")
logger.info(" Starting COB training...")
self._train_cob_real(session, training_data)
elif model_name == "Extrema":
logger.info("🔄 Starting Extrema training...")
logger.info(" Starting Extrema training...")
self._train_extrema_real(session, training_data)
else:
raise Exception(f"Unknown model type: {model_name}")
@@ -196,12 +196,12 @@ class RealTrainingAdapter:
session.status = 'completed'
session.duration_seconds = time.time() - session.start_time
logger.info(f" REAL training completed: {training_id} in {session.duration_seconds:.2f}s")
logger.info(f" REAL training completed: {training_id} in {session.duration_seconds:.2f}s")
logger.info(f" Final loss: {session.final_loss}")
logger.info(f" Accuracy: {session.accuracy}")
except Exception as e:
logger.error(f" REAL training failed: {e}", exc_info=True)
logger.error(f" REAL training failed: {e}", exc_info=True)
session.status = 'failed'
session.error = str(e)
session.duration_seconds = time.time() - session.start_time
@@ -266,15 +266,15 @@ class RealTrainingAdapter:
'close': df['close'].tolist(),
'volume': df['volume'].tolist()
}
logger.debug(f" {timeframe}: {len(df)} candles")
logger.debug(f" {timeframe}: {len(df)} candles")
else:
logger.warning(f" {timeframe}: No data")
logger.warning(f" {timeframe}: No data")
if market_state['timeframes']:
logger.info(f" Fetched market state with {len(market_state['timeframes'])} timeframes")
logger.info(f" Fetched market state with {len(market_state['timeframes'])} timeframes")
return market_state
else:
logger.warning(f" No market data fetched")
logger.warning(f" No market data fetched")
return {}
except Exception as e:
@@ -309,7 +309,7 @@ class RealTrainingAdapter:
expected_outcome = test_case.get('expected_outcome', {})
if not expected_outcome:
logger.warning(f"⚠️ Skipping test case {test_case.get('test_case_id')}: missing expected_outcome")
logger.warning(f" Skipping test case {test_case.get('test_case_id')}: missing expected_outcome")
continue
# Check if market_state is provided, if not, fetch it dynamically
@@ -320,7 +320,7 @@ class RealTrainingAdapter:
market_state = self._fetch_market_state_for_test_case(test_case)
if not market_state:
logger.warning(f"⚠️ Skipping test case {test_case.get('test_case_id')}: could not fetch market state")
logger.warning(f" Skipping test case {test_case.get('test_case_id')}: could not fetch market state")
continue
logger.debug(f" Test case {i+1}: has_market_state={bool(market_state)}, has_expected_outcome={bool(expected_outcome)}")
@@ -339,7 +339,7 @@ class RealTrainingAdapter:
}
training_data.append(entry_sample)
logger.debug(f" Entry sample: {entry_sample['direction']} @ {entry_sample['entry_price']}")
logger.debug(f" Entry sample: {entry_sample['direction']} @ {entry_sample['entry_price']}")
# Create HOLD samples (every candle while position is open)
# This teaches the model to maintain the position until exit
@@ -367,7 +367,7 @@ class RealTrainingAdapter:
'repetitions': training_repetitions
}
training_data.append(exit_sample)
logger.debug(f" Exit sample @ {exit_sample['exit_price']} ({exit_sample['profit_loss_pct']:.2f}%)")
logger.debug(f" Exit sample @ {exit_sample['exit_price']} ({exit_sample['profit_loss_pct']:.2f}%)")
# Create NEGATIVE samples (where model should NOT trade)
# These are candles before and after the signal
@@ -382,14 +382,14 @@ class RealTrainingAdapter:
logger.debug(f" Added {len(negative_samples)} negative samples (±{negative_samples_window} candles)")
except Exception as e:
logger.error(f" Error preparing test case {i+1}: {e}")
logger.error(f" Error preparing test case {i+1}: {e}")
total_entry = sum(1 for s in training_data if s.get('label') == 'ENTRY')
total_hold = sum(1 for s in training_data if s.get('label') == 'HOLD')
total_exit = sum(1 for s in training_data if s.get('label') == 'EXIT')
total_no_trade = sum(1 for s in training_data if s.get('label') == 'NO_TRADE')
logger.info(f" Prepared {len(training_data)} training samples from {len(test_cases)} test cases")
logger.info(f" Prepared {len(training_data)} training samples from {len(test_cases)} test cases")
logger.info(f" ENTRY samples: {total_entry}")
logger.info(f" HOLD samples: {total_hold}")
logger.info(f" EXIT samples: {total_exit}")
@@ -399,7 +399,7 @@ class RealTrainingAdapter:
logger.info(f" Ratio: 1:{total_no_trade/total_entry:.1f} (entry:no_trade)")
if len(training_data) < len(test_cases):
logger.warning(f"⚠️ Skipped {len(test_cases) - len(training_data)} test cases due to missing data")
logger.warning(f" Skipped {len(test_cases) - len(training_data)} test cases due to missing data")
return training_data
@@ -1048,7 +1048,7 @@ class RealTrainingAdapter:
if not converted_batches:
raise Exception("No valid training batches after conversion")
logger.info(f" Converted {len(training_data)} samples to {len(converted_batches)} training batches")
logger.info(f" Converted {len(training_data)} samples to {len(converted_batches)} training batches")
# Train using train_step for each batch
for epoch in range(session.total_epochs):

View File

@@ -196,14 +196,14 @@ class AnnotationDashboard:
for attempt in range(max_retries):
try:
if attempt > 0:
logger.info(f"🔄 Retry attempt {attempt + 1}/{max_retries} for model loading...")
logger.info(f" Retry attempt {attempt + 1}/{max_retries} for model loading...")
time.sleep(retry_delay)
else:
logger.info("🔄 Starting async model loading...")
logger.info(" Starting async model loading...")
# Check if TradingOrchestrator is available
if not TradingOrchestrator:
logger.error(" TradingOrchestrator class not available")
logger.error(" TradingOrchestrator class not available")
self.models_loading = False
self.available_models = []
return
@@ -214,48 +214,48 @@ class AnnotationDashboard:
data_provider=self.data_provider,
enhanced_rl_training=True
)
logger.info(" Orchestrator created")
logger.info(" Orchestrator created")
# Initialize ML models
logger.info(" Initializing ML models...")
self.orchestrator._initialize_ml_models()
logger.info(" ML models initialized")
logger.info(" ML models initialized")
# Update training adapter with orchestrator
self.training_adapter.orchestrator = self.orchestrator
logger.info(" Training adapter updated")
logger.info(" Training adapter updated")
# Get available models from orchestrator
available = []
if hasattr(self.orchestrator, 'rl_agent') and self.orchestrator.rl_agent:
available.append('DQN')
logger.info(" DQN model available")
logger.info(" DQN model available")
if hasattr(self.orchestrator, 'cnn_model') and self.orchestrator.cnn_model:
available.append('CNN')
logger.info(" CNN model available")
logger.info(" CNN model available")
if hasattr(self.orchestrator, 'transformer_model') and self.orchestrator.transformer_model:
available.append('Transformer')
logger.info(" Transformer model available")
logger.info(" Transformer model available")
self.available_models = available
if available:
logger.info(f" Models loaded successfully: {', '.join(available)}")
logger.info(f" Models loaded successfully: {', '.join(available)}")
else:
logger.warning("⚠️ No models were initialized (this might be normal if models aren't configured)")
logger.warning(" No models were initialized (this might be normal if models aren't configured)")
self.models_loading = False
logger.info(" Async model loading complete")
logger.info(" Async model loading complete")
return # Success - exit retry loop
except Exception as e:
logger.error(f" Error loading models (attempt {attempt + 1}/{max_retries}): {e}")
logger.error(f" Error loading models (attempt {attempt + 1}/{max_retries}): {e}")
import traceback
logger.error(f"Traceback:\n{traceback.format_exc()}")
if attempt == max_retries - 1:
# Final attempt failed
logger.error(f" Model loading failed after {max_retries} attempts")
logger.error(f" Model loading failed after {max_retries} attempts")
self.models_loading = False
self.available_models = []
else:
@@ -264,7 +264,7 @@ class AnnotationDashboard:
# Start loading in background thread
thread = threading.Thread(target=load_models, daemon=True, name="ModelLoader")
thread.start()
logger.info(f"🚀 Model loading started in background thread (ID: {thread.ident}, Name: {thread.name})")
logger.info(f" Model loading started in background thread (ID: {thread.ident}, Name: {thread.name})")
logger.info(" UI remains responsive while models load...")
logger.info(" Will retry up to 3 times if loading fails")
@@ -284,7 +284,7 @@ class AnnotationDashboard:
)
if success:
logger.info(" ANNOTATE: Unified storage enabled for real-time data")
logger.info(" ANNOTATE: Unified storage enabled for real-time data")
# Get statistics
stats = self.data_provider.get_unified_storage_stats()
@@ -293,7 +293,7 @@ class AnnotationDashboard:
logger.info(" Historical data access: <100ms")
logger.info(" Annotation data: Available at any timestamp")
else:
logger.warning("⚠️ ANNOTATE: Unified storage not available, using cached data only")
logger.warning(" ANNOTATE: Unified storage not available, using cached data only")
except Exception as e:
logger.warning(f"ANNOTATE: Could not enable unified storage: {e}")
@@ -312,7 +312,7 @@ class AnnotationDashboard:
# Wait for app to fully start
time.sleep(5)
logger.info("🔄 Starting one-time background data refresh (fetching only recent missing data)")
logger.info(" Starting one-time background data refresh (fetching only recent missing data)")
# Disable startup mode to fetch fresh data
self.data_loader.disable_startup_mode()
@@ -321,7 +321,7 @@ class AnnotationDashboard:
logger.info("Using on-demand refresh for recent data")
self.data_provider.refresh_data_on_demand()
logger.info(" One-time background data refresh completed")
logger.info(" One-time background data refresh completed")
except Exception as e:
logger.error(f"Error in background data refresh: {e}")
@@ -488,9 +488,9 @@ class AnnotationDashboard:
<h1 class="text-center">📝 ANNOTATE - Manual Trade Annotation UI</h1>
<div class="alert alert-info">
<h4>System Status</h4>
<p> Annotation Manager: Active</p>
<p>⚠️ Data Provider: {'Available' if self.data_provider else 'Not Available (Standalone Mode)'}</p>
<p>⚠️ Trading Orchestrator: {'Available' if self.orchestrator else 'Not Available (Standalone Mode)'}</p>
<p> Annotation Manager: Active</p>
<p> Data Provider: {'Available' if self.data_provider else 'Not Available (Standalone Mode)'}</p>
<p> Trading Orchestrator: {'Available' if self.orchestrator else 'Not Available (Standalone Mode)'}</p>
</div>
<div class="row">
<div class="col-md-6">
@@ -537,7 +537,7 @@ class AnnotationDashboard:
'error': {'code': 'INVALID_REQUEST', 'message': 'Missing timeframe or timestamps'}
})
logger.info(f"🔄 Recalculating pivots for {symbol} {timeframe} with {len(timestamps)} candles")
logger.info(f" Recalculating pivots for {symbol} {timeframe} with {len(timestamps)} candles")
# Convert to DataFrame
df = pd.DataFrame({
@@ -552,7 +552,7 @@ class AnnotationDashboard:
# Recalculate pivot markers
pivot_markers = self._get_pivot_markers_for_timeframe(symbol, timeframe, df)
logger.info(f" Recalculated {len(pivot_markers)} pivot candles")
logger.info(f" Recalculated {len(pivot_markers)} pivot candles")
return jsonify({
'success': True,
@@ -614,7 +614,7 @@ class AnnotationDashboard:
)
if df is not None and not df.empty:
logger.info(f" {timeframe}: {len(df)} candles ({df.index[0]} to {df.index[-1]})")
logger.info(f" {timeframe}: {len(df)} candles ({df.index[0]} to {df.index[-1]})")
# Get pivot points for this timeframe
pivot_markers = self._get_pivot_markers_for_timeframe(symbol, timeframe, df)
@@ -630,7 +630,7 @@ class AnnotationDashboard:
'pivot_markers': pivot_markers # Optional: only present if pivots exist
}
else:
logger.warning(f" {timeframe}: No data returned")
logger.warning(f" {timeframe}: No data returned")
# Get pivot bounds for the symbol
pivot_bounds = None

View File

@@ -1215,10 +1215,10 @@ class ChartManager {
// Merge with existing data
this.mergeChartData(timeframe, newData, direction);
console.log(` Loaded ${newData.timestamps.length} new candles for ${timeframe}`);
console.log(` Loaded ${newData.timestamps.length} new candles for ${timeframe}`);
window.showSuccess(`Loaded ${newData.timestamps.length} more candles`);
} else {
console.warn(` No more data available for ${timeframe} ${direction}`);
console.warn(` No more data available for ${timeframe} ${direction}`);
console.warn('Full result:', result);
window.showWarning('No more historical data available');
}
@@ -1312,7 +1312,7 @@ class ChartManager {
*/
async recalculatePivots(timeframe, data) {
try {
console.log(`🔄 Recalculating pivots for ${timeframe} with ${data.timestamps.length} candles...`);
console.log(` Recalculating pivots for ${timeframe} with ${data.timestamps.length} candles...`);
const response = await fetch('/api/recalculate-pivots', {
method: 'POST',
@@ -1338,7 +1338,7 @@ class ChartManager {
const chart = this.charts[timeframe];
if (chart && chart.data) {
chart.data.pivot_markers = result.pivot_markers;
console.log(` Pivots recalculated: ${Object.keys(result.pivot_markers).length} pivot candles`);
console.log(` Pivots recalculated: ${Object.keys(result.pivot_markers).length} pivot candles`);
// Redraw the chart with updated pivots
this.redrawChartWithPivots(timeframe, chart.data);

View File

@@ -113,7 +113,7 @@
if (data.loading) {
// Models still loading - show loading message and poll
modelSelect.innerHTML = '<option value="">🔄 Loading models...</option>';
modelSelect.innerHTML = '<option value=""> Loading models...</option>';
// Start polling if not already polling
if (!modelLoadingPollInterval) {
@@ -132,7 +132,7 @@
if (data.success && data.models.length > 0) {
// Show success notification
if (window.showSuccess) {
window.showSuccess(` ${data.models.length} models loaded and ready for training`);
window.showSuccess(` ${data.models.length} models loaded and ready for training`);
}
data.models.forEach(model => {
@@ -142,7 +142,7 @@
modelSelect.appendChild(option);
});
console.log(` Models loaded: ${data.models.join(', ')}`);
console.log(` Models loaded: ${data.models.join(', ')}`);
} else {
const option = document.createElement('option');
option.value = '';
@@ -157,12 +157,12 @@
// Don't stop polling on network errors - keep trying
if (!modelLoadingPollInterval) {
modelSelect.innerHTML = '<option value="">⚠️ Connection error, retrying...</option>';
modelSelect.innerHTML = '<option value=""> Connection error, retrying...</option>';
// Start polling to retry
modelLoadingPollInterval = setInterval(loadAvailableModels, 3000); // Poll every 3 seconds
} else {
// Already polling, just update the message
modelSelect.innerHTML = '<option value="">🔄 Retrying...</option>';
modelSelect.innerHTML = '<option value=""> Retrying...</option>';
}
});
}