// 导出功能模块 // 导出为Excel(使用纯JS实现CSV导出) function exportToExcel(data, filename) { // 将数据转换为CSV格式 const csv = convertToCSV(data); // 创建Blob并下载 const blob = new Blob(['\ufeff' + csv], { type: 'text/csv;charset=utf-8;' }); const link = document.createElement('a'); const url = URL.createObjectURL(blob); link.setAttribute('href', url); link.setAttribute('download', filename); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } function convertToCSV(data) { if (!data || data.length === 0) return ''; // 获取表头 const headers = Object.keys(data[0]); // 构建CSV内容 const csvContent = [ headers.join(','), // 表头行 ...data.map(row => headers.map(header => { let cell = row[header]; // 处理特殊字符 if (typeof cell === 'string' && (cell.includes(',') || cell.includes('"'))) { cell = `"${cell.replace(/"/g, '""')}"`; } return cell; }).join(',') ) ].join('\n'); return csvContent; } // 绑定导出按钮事件 document.addEventListener('DOMContentLoaded', function() { // 延迟绑定,确保元素已加载 setTimeout(() => { // 参数优化结果导出 const optExportBtn = document.getElementById('opt-export-btn'); if (optExportBtn) { optExportBtn.addEventListener('click', () => { if (currentOptData && currentOptData.data) { const filename = `参数优化结果_${new Date().toISOString().slice(0,10)}.csv`; exportToExcel(currentOptData.data, filename); } else { alert('请先加载数据'); } }); } // 交易明细导出 const tradesExportBtn = document.getElementById('trades-export-btn'); if (tradesExportBtn) { tradesExportBtn.addEventListener('click', () => { if (currentTradesData && currentTradesData.data) { const filename = `交易明细_${new Date().toISOString().slice(0,10)}.csv`; exportToExcel(currentTradesData.data, filename); } else { alert('请先加载数据'); } }); } }, 1000); }); // 生成完整报告(HTML格式) function generateFullReport() { if (!currentOptData && !currentTradesData && !currentEquityData) { alert('请先加载数据'); return; } let reportHTML = `
生成时间:${new Date().toLocaleString('zh-CN')}
`; // 添加优化结果部分 if (currentOptData) { reportHTML += `${currentOptData.stats.total_combinations || 0}
${currentOptData.stats.best_sharpe ? currentOptData.stats.best_sharpe.toFixed(4) : 'N/A'}
${currentOptData.stats.best_return ? (currentOptData.stats.best_return * 100).toFixed(2) + '%' : 'N/A'}
| 排名 | 短期均线 | 长期均线 | 持有天数 | 总收益率 | 夏普比率 | 最大回撤 |
|---|---|---|---|---|---|---|
| ${index + 1} | ${row.param_ma_short || '-'} | ${row.param_ma_long || '-'} | ${row.param_hold_days || '-'} | ${(row.total_return * 100).toFixed(2)}% | ${row.sharpe ? row.sharpe.toFixed(4) : '-'} | ${(row.max_drawdown * 100).toFixed(2)}% |
${currentTradesData.stats.total_trades || 0}
${currentTradesData.stats.win_rate || '0%'}
¥${currentTradesData.stats.total_profit ? currentTradesData.stats.total_profit.toFixed(2) : '0'}