136 lines
4.8 KiB
JavaScript
136 lines
4.8 KiB
JavaScript
/**
|
|
* 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}`);
|
|
}
|
|
}
|
|
}
|