Files
profitable-expert-advisor/polymarket/gui/static/js/components/StrategyComponent.js
T
zhutoutoutousan 98a87a69ca Update
2026-02-13 08:03:25 +01:00

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}`);
}
}
}