Update
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
/**
|
||||
* Strategy Component
|
||||
* Handles strategy controls and status
|
||||
*/
|
||||
|
||||
export class StrategyComponent {
|
||||
constructor() {
|
||||
this.isActive = false;
|
||||
this.statusInterval = null;
|
||||
}
|
||||
|
||||
initialize() {
|
||||
const startBtn = document.getElementById('startBtn');
|
||||
const stopBtn = document.getElementById('stopBtn');
|
||||
|
||||
if (startBtn) startBtn.addEventListener('click', () => this.start());
|
||||
if (stopBtn) stopBtn.addEventListener('click', () => this.stop());
|
||||
|
||||
this.updateStatus();
|
||||
this.startStatusUpdates();
|
||||
}
|
||||
|
||||
async start() {
|
||||
try {
|
||||
const threshold = parseFloat(document.getElementById('threshold')?.value || 0.15);
|
||||
const confidence = parseFloat(document.getElementById('confidence')?.value || 0.7);
|
||||
const balance = parseFloat(document.getElementById('balance')?.value || 1000);
|
||||
const category = document.getElementById('category')?.value || '21';
|
||||
|
||||
const response = await fetch('/api/strategy/start', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
threshold,
|
||||
min_confidence: confidence,
|
||||
initial_balance: balance,
|
||||
tag_id: parseInt(category)
|
||||
})
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (response.ok) {
|
||||
document.getElementById('startBtn').disabled = true;
|
||||
document.getElementById('stopBtn').disabled = false;
|
||||
this.isActive = true;
|
||||
this.updateStatusIndicator(true);
|
||||
this.showNotification('TRADING STARTED', 'success');
|
||||
} else {
|
||||
this.showNotification('ERROR: ' + data.error, 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[Strategy] Error starting:', error);
|
||||
this.showNotification('ERROR STARTING TRADING', 'error');
|
||||
}
|
||||
}
|
||||
|
||||
async stop() {
|
||||
try {
|
||||
const response = await fetch('/api/strategy/stop', {
|
||||
method: 'POST'
|
||||
});
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
if (response.ok) {
|
||||
document.getElementById('startBtn').disabled = false;
|
||||
document.getElementById('stopBtn').disabled = true;
|
||||
this.isActive = false;
|
||||
this.updateStatusIndicator(false);
|
||||
this.showNotification('TRADING STOPPED', 'info');
|
||||
} else {
|
||||
this.showNotification('ERROR: ' + data.error, 'error');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('[Strategy] Error stopping:', error);
|
||||
this.showNotification('ERROR STOPPING TRADING', 'error');
|
||||
}
|
||||
}
|
||||
|
||||
async updateStatus() {
|
||||
try {
|
||||
const response = await fetch('/api/strategy/status');
|
||||
const data = await response.json();
|
||||
|
||||
document.getElementById('balanceValue').textContent = '$' + data.balance.toFixed(2);
|
||||
document.getElementById('equityValue').textContent = '$' + data.equity.toFixed(2);
|
||||
document.getElementById('positionsValue').textContent = data.positions;
|
||||
document.getElementById('tradesValue').textContent = data.trades;
|
||||
document.getElementById('winRateValue').textContent = data.win_rate.toFixed(1) + '%';
|
||||
|
||||
const pnlElement = document.getElementById('pnlValue');
|
||||
const pnl = data.profit || 0;
|
||||
pnlElement.textContent = '$' + pnl.toFixed(2);
|
||||
pnlElement.style.color = pnl >= 0 ? 'var(--neon-green)' : 'var(--neon-pink)';
|
||||
} catch (error) {
|
||||
console.error('[Strategy] Error updating status:', error);
|
||||
}
|
||||
}
|
||||
|
||||
updateStatusIndicator(active) {
|
||||
const statusDot = document.getElementById('statusDot');
|
||||
const statusText = document.getElementById('statusText');
|
||||
|
||||
if (statusDot && statusText) {
|
||||
if (active) {
|
||||
statusDot.classList.add('active');
|
||||
statusText.textContent = 'ONLINE';
|
||||
} else {
|
||||
statusDot.classList.remove('active');
|
||||
statusText.textContent = 'OFFLINE';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startStatusUpdates() {
|
||||
this.statusInterval = setInterval(() => this.updateStatus(), 2000);
|
||||
}
|
||||
|
||||
stopStatusUpdates() {
|
||||
if (this.statusInterval) {
|
||||
clearInterval(this.statusInterval);
|
||||
this.statusInterval = null;
|
||||
}
|
||||
}
|
||||
|
||||
showNotification(message, type = 'info') {
|
||||
// Use global notification system if available
|
||||
if (window.showNotification) {
|
||||
window.showNotification(message, type);
|
||||
} else {
|
||||
console.log(`[${type.toUpperCase()}] ${message}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user