6.0 KiB
6.0 KiB
Scalping Dashboard Dynamic Throttling Implementation
Issues Fixed
1. Critical Dash Callback Error
Problem: TypeError: unhashable type: 'list'
in Dash callback definition
Solution: Fixed callback structure by removing list brackets around outputs and inputs
Before:
@self.app.callback(
[Output(...), Output(...)], # ❌ Lists cause unhashable type error
[Input(...)]
)
After:
@self.app.callback(
Output(...), # ✅ Individual outputs
Output(...),
Input(...) # ✅ Individual input
)
2. Unicode Encoding Issues
Problem: Windows console (cp1252) couldn't encode Unicode characters like ✓
, ✅
, ❌
Solution: Replaced all Unicode characters with ASCII-safe alternatives
Changes:
✓
→ "OK"✅
→ "ACTIVE" / "OK"❌
→ "INACTIVE"- Removed all emoji characters from logging
3. Missing Argument Parsing
Problem: run_scalping_dashboard.py
didn't support command line arguments from launch.json
Solution: Added comprehensive argument parsing
Added Arguments:
--episodes
(default: 1000)--max-position
(default: 0.1)--leverage
(default: 500)--port
(default: 8051)--host
(default: '127.0.0.1')--debug
(flag)
Dynamic Throttling Implementation
Core Features
1. Adaptive Update Frequency
- Range: 500ms (fast) to 2000ms (slow)
- Default: 1000ms (1 second)
- Automatic adjustment based on performance
2. Performance-Based Throttling Levels
- Level 0: No throttling (optimal performance)
- Level 1-5: Increasing throttle levels
- Skip Factor: Higher levels skip more updates
3. Performance Monitoring
- Tracks: Callback execution duration
- History: Last 20 measurements for averaging
- Thresholds:
- Fast: < 0.5 seconds
- Slow: > 2.0 seconds
- Critical: > 5.0 seconds
Dynamic Adjustment Logic
Performance Degradation Response
if duration > 5.0 or error:
# Critical performance issue
throttle_level = min(5, throttle_level + 2)
update_frequency = min(2000, frequency * 1.5)
elif duration > 2.0:
# Slow performance
throttle_level = min(5, throttle_level + 1)
update_frequency = min(2000, frequency * 1.2)
Performance Improvement Response
if duration < 0.5 and avg_duration < 0.5:
consecutive_fast_updates += 1
if consecutive_fast_updates >= 5:
throttle_level = max(0, throttle_level - 1)
if throttle_level <= 1:
update_frequency = max(500, frequency * 0.9)
Throttling Mechanisms
1. Time-Based Throttling
- Prevents updates if called too frequently
- Minimum 80% of expected interval between updates
2. Skip-Based Throttling
- Skips updates based on throttle level
- Skip factor = throttle_level + 1
- Example: Level 3 = skip every 4th update
3. State Caching
- Stores last known good state
- Returns cached state when throttled
- Prevents empty/error responses
Client-Side Optimization
1. Fallback State Management
def _get_last_known_state(self):
if self.last_known_state is not None:
return self.last_known_state
return safe_default_state
2. Performance Tracking
def _track_callback_performance(self, duration, success=True):
# Track performance history
# Adjust throttling dynamically
# Log performance summaries
3. Smart Update Logic
def _should_update_now(self, n_intervals):
# Check time constraints
# Apply throttle level logic
# Return decision with reason
Benefits
1. Automatic Load Balancing
- Adapts to system performance in real-time
- Prevents dashboard freezing under load
- Optimizes for best possible responsiveness
2. Graceful Degradation
- Maintains functionality during high load
- Provides cached data when fresh data unavailable
- Recovers automatically when performance improves
3. Performance Monitoring
- Logs detailed performance metrics
- Tracks trends over time
- Alerts on performance issues
4. User Experience
- Consistent dashboard responsiveness
- No blank screens or timeouts
- Smooth operation under varying loads
Configuration
Throttling Parameters
update_frequency = 1000 # Start frequency (ms)
min_frequency = 2000 # Maximum throttling (ms)
max_frequency = 500 # Minimum throttling (ms)
throttle_level = 0 # Current throttle level (0-5)
Performance Thresholds
fast_threshold = 0.5 # Fast performance (seconds)
slow_threshold = 2.0 # Slow performance (seconds)
critical_threshold = 5.0 # Critical performance (seconds)
Testing Results
✅ Fixed Issues
- Dashboard starts successfully on port 8051
- No Unicode encoding errors in Windows console
- Proper argument parsing from launch.json
- Dash callback structure works correctly
- Dynamic throttling responds to load
✅ Performance Features
- Adaptive frequency adjusts automatically
- Throttling levels prevent overload
- State caching provides fallback data
- Performance monitoring tracks metrics
- Graceful recovery when load decreases
Usage
Launch from VS Code
Use the launch configuration: "💹 Live Scalping Dashboard (500x Leverage)"
Command Line
python run_scalping_dashboard.py --port 8051 --leverage 500
Monitor Performance
Check logs for performance summaries:
PERFORMANCE SUMMARY: Avg: 1.2s, Throttle: 2, Frequency: 1200ms
Conclusion
The scalping dashboard now has robust dynamic throttling that:
- Automatically balances performance vs responsiveness
- Prevents system overload through intelligent throttling
- Maintains user experience even under high load
- Recovers gracefully when conditions improve
- Provides detailed monitoring of system performance
The dashboard is now production-ready with enterprise-grade performance management.