This commit is contained in:
薇薇安 2026-02-08 20:06:47 +08:00
parent 262ee661a5
commit bfae183e39
2 changed files with 43 additions and 1 deletions

View File

@ -12,3 +12,7 @@
## 3. 代码风格 ## 3. 代码风格
- 使用 Python 异步编程 (asyncio)。 - 使用 Python 异步编程 (asyncio)。
- 所有的交易日志必须记录 Symbol、价格、原因和时间戳。 - 所有的交易日志必须记录 Symbol、价格、原因和时间戳。
## 4. 不要在本地运行交易系统,后台服务,数据库连接
- 交易系统必须在服务器上运行,严禁在本地环境测试。
- 所有配置(如 API 密钥、数据库连接等)必须在服务器上配置,本地环境不得包含任何敏感信息。

View File

@ -274,6 +274,26 @@ const StatsDashboard = () => {
{ limit: 0, market: 0, unknown: 0 } { limit: 0, market: 0, unknown: 0 }
) )
const handleExportPositions = () => {
if (openTrades.length === 0) {
alert('暂无持仓数据可导出')
return
}
const timestamp = new Date().toISOString().slice(0, 19).replace(/:/g, '-')
const filename = `持仓记录_${timestamp}.json`
const dataStr = JSON.stringify(openTrades, null, 2)
const dataBlob = new Blob([dataStr], { type: 'application/json' })
const url = URL.createObjectURL(dataBlob)
const link = document.createElement('a')
link.href = url
link.download = filename
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
URL.revokeObjectURL(url)
}
return ( return (
<div className="dashboard"> <div className="dashboard">
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '20px' }}> <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '20px' }}>
@ -441,6 +461,24 @@ const StatsDashboard = () => {
<div className="positions-header"> <div className="positions-header">
<h3>当前持仓</h3> <h3>当前持仓</h3>
<div style={{ display: 'flex', gap: '8px' }}> <div style={{ display: 'flex', gap: '8px' }}>
<button
onClick={handleExportPositions}
disabled={openTrades.length === 0}
style={{
padding: '6px 12px',
backgroundColor: '#607D8B',
color: 'white',
border: 'none',
borderRadius: '4px',
cursor: openTrades.length === 0 ? 'not-allowed' : 'pointer',
fontSize: '13px',
fontWeight: 'bold',
opacity: openTrades.length === 0 ? 0.6 : 1
}}
title="导出当前持仓为JSON数据"
>
导出 JSON
</button>
<button <button
className="sltp-all-btn" className="sltp-all-btn"
onClick={handleEnsureAllSLTP} onClick={handleEnsureAllSLTP}