feat(config): 添加详细配置项说明以优化策略分析

在 `GlobalConfig` 组件中新增配置项详细说明,提供各项参数的建议与使用说明,便于用户理解和优化交易策略。此改动提升了用户体验,帮助用户更好地进行策略配置与调整。
This commit is contained in:
薇薇安 2026-02-24 15:53:54 +08:00
parent 4dd44782c5
commit 1dea3df84a

View File

@ -37,6 +37,66 @@ const KEY_LABELS = {
SYSTEM_ORDER_ID_PREFIX: '系统单 clientOrderId 前缀', SYSTEM_ORDER_ID_PREFIX: '系统单 clientOrderId 前缀',
} }
//
const CONFIG_GUIDE_DETAILS = {
SCAN_INTERVAL: '扫描间隔。系统每隔多长时间扫描一次市场寻找交易机会。值越小扫描越频繁能更快捕捉波动但更容易产生噪音与过度交易。建议低频波段1800秒(30分钟)或更长;稳健/保守可3600秒(1小时);高频不建议长期使用。',
MIN_CHANGE_PERCENT: '最小涨跌幅阈值(%。只有24小时涨跌幅达到此值的交易对才会被考虑交易。值越小捕捉机会越多但可能包含噪音和假信号。值越大只捕捉大幅波动信号质量更高但机会更少。建议保守策略2.0-3.0%平衡策略1.5-2.0%激进策略1.0-1.5%。',
MIN_SIGNAL_STRENGTH: '最小信号强度0-10。技术指标综合评分只有达到此强度的信号才会执行交易。值越小机会越多但噪音更大值越大更偏"精选高质量"。建议低频波段建议≥8一般保守5-7平衡4-5高频3-4不推荐长期。',
TOP_N_SYMBOLS: '每次扫描后处理的交易对数量。从符合条件的交易对中选择涨跌幅最大的前N个进行详细分析。值越大机会越多但计算量增加API请求增多。建议保守策略8-10个平衡策略12-15个激进策略15-20个。',
MAX_SCAN_SYMBOLS: '扫描的最大交易对数量0表示扫描所有。限制每次扫描时处理的交易对总数减少API请求和计算量。值越小扫描越快但可能错过一些机会。值越大覆盖更全面。建议保守策略100-200个平衡策略200-300个激进策略300-500个。',
MIN_VOLATILITY: '最小波动率小数形式如0.02表示2%。过滤掉波动率低于此值的交易对确保只交易有足够波动的币种。建议0.015-0.0251.5%-2.5%)。',
MIN_VOLUME_24H: '最小24小时成交量USDT。过滤掉24小时交易量低于此值的交易对确保只交易流动性好的币种避免滑点和流动性风险。建议≥500万USDT主流币种可设置1000万以上。',
KLINE_INTERVAL: 'K线数据周期。获取K线数据的基础周期影响技术指标的计算粒度。建议5m-1h通常与PRIMARY_INTERVAL保持一致。',
PRIMARY_INTERVAL: '主周期。策略分析的主要时间周期用于计算技术指标RSI、MACD、布林带等。建议保守策略4h-1d平衡策略1h-4h激进策略15m-1h。',
CONFIRM_INTERVAL: '确认周期。用于确认交易信号的更长时间周期增加信号的可靠性。建议保守策略1d平衡策略4h-1d激进策略1h-4h。',
ENTRY_INTERVAL: '入场周期。用于精确入场的短时间周期优化入场点。建议保守策略1h平衡策略15m-30m激进策略5m-15m。',
MAX_POSITION_PERCENT: '单笔最大保证金占用账户余额的百分比如0.02表示2%。值越小越保守适合回归波段交易、降低单笔波动对账户的伤害。注意币安合约有最小名义价值要求通常≥5 USDT。',
MAX_TOTAL_POSITION_PERCENT: '总保证金上限账户余额的百分比如0.20表示20%)。所有持仓占用的保证金之和不能超过该上限,防止过度分散和风险集中。',
MIN_POSITION_PERCENT: '单笔最小保证金占用账户余额的百分比。0表示不限制。用于避免过小仓位。',
STOP_LOSS_PERCENT: '止损百分比如0.08表示8%相对于保证金。当亏损达到此百分比时自动平仓止损。建议保守策略10-15%平衡策略8-10%激进策略5-8%。盈亏比建议至少1:1.5。',
TAKE_PROFIT_PERCENT: '止盈百分比如0.15表示15%相对于保证金。建议保守策略20-30%平衡策略15-20%激进策略10-15%。应大于止损盈亏比至少1:1.5。',
MIN_STOP_LOSS_PRICE_PCT: '最小止损价格变动百分比。用于防止止损过紧。建议1.5%-3%。',
MIN_TAKE_PROFIT_PRICE_PCT: '最小止盈价格变动百分比。用于防止止盈过紧。建议2%-4%。',
LEVERAGE: '交易杠杆倍数。杠杆越高相同仓位下需要的保证金越少但风险越大。建议保守策略5-10倍平衡策略10倍激进策略10-15倍。高杠杆会增加爆仓风险。',
USE_TRAILING_STOP: '是否启用移动止损。启用后,当盈利达到激活阈值时,止损会自动跟踪价格,保护利润。适合趋势行情。建议:平衡和激进策略启用,保守策略可关闭。',
SMART_ENTRY_ENABLED: '智能入场开关。开启时会进行"限价回调 + 追价 +(趋势强时)市价兜底";关闭时回归"纯限价单模式",更适合低频波段与控频。',
AUTO_TRADE_ONLY_TRENDING: '自动交易仅在市场状态=trending时执行ranging/unknown只生成推荐不自动下单。能显著降低震荡扫损但也会减少出单。',
AUTO_TRADE_ALLOW_4H_NEUTRAL: '是否允许4H趋势=neutral时自动交易。关闭可减少震荡扫损开启会显著增加出单需配合更严格的信号门槛。',
LIMIT_ORDER_OFFSET_PCT: '限价入场偏移(%。BUY 挂在当前价下方SELL 挂在当前价上方。值越小越贴近当前价更容易成交值越大更保守。建议0.05%-0.20%。',
ENTRY_CONFIRM_TIMEOUT_SEC: '下单后等待成交的确认超时。在纯限价模式下超时未成交会撤单并跳过。建议60-180秒。',
ENTRY_CHASE_MAX_STEPS: '智能入场最大追价步数。步数越多越不容易错过,但也更接近追价;建议 2-4 步。',
ENTRY_STEP_WAIT_SEC: '智能入场每一步等待成交时间(秒)。建议 15-25 秒。',
ENTRY_MARKET_FALLBACK_AFTER_SEC: '趋势强时市价兜底延迟(秒)。建议 45-90 秒。',
ENTRY_MAX_DRIFT_PCT_TRENDING: '趋势强时最大追价偏离(%)。例如 0.3 表示 0.3%。越小越保守;建议 0.2%-0.6%。',
ENTRY_MAX_DRIFT_PCT_RANGING: '震荡/弱趋势最大追价偏离(%)。建议 0.1%-0.3%。',
TRAILING_STOP_ACTIVATION: '移动止损激活阈值如0.01表示1%。当盈利达到此百分比时移动止损开始跟踪价格。建议1-2%。',
TRAILING_STOP_PROTECT: '移动止损保护利润如0.01表示1%。当价格从最高点回撤达到此百分比时触发止损。建议1-2%。',
BETA_FILTER_ENABLED: '大盘共振过滤当BTC/ETH短周期下跌时屏蔽多单避免逆势开多。建议在大盘明显下跌时保持开启。',
BETA_FILTER_THRESHOLD: '大盘共振阈值(比例,如-0.005表示-0.5%。当BTC/ETH 15m或1h涨跌幅低于此值时触发过滤屏蔽多单。',
MARKET_SCHEME: '市场方案bull(多头市)/bear(熊市)/normal(正常)/conservative(保守)。用于根据当前市场环境调整策略参数。',
USE_ATR_STOP_LOSS: '是否使用ATR动态止损优先于固定百分比。ATR根据波动率计算止损距离更适应不同市场。',
ATR_STOP_LOSS_MULTIPLIER: 'ATR止损倍数。建议 2.0-3.0。放宽止损可以给波动留出空间,提高胜率。',
ATR_TAKE_PROFIT_MULTIPLIER: 'ATR止盈倍数。建议 1.0-2.0。对应盈亏比 1:1 到 2:1。',
USE_FIXED_RISK_SIZING: '使用固定风险百分比计算仓位(凯利公式)。启用后,每笔单子承受的风险固定为 FIXED_RISK_PERCENT避免大额亏损。',
FIXED_RISK_PERCENT: '每笔单子承受的风险百分比(相对于总资金)。例如 0.02 表示 2%。',
AUTO_TRADE_ENABLED: '自动交易总开关。关闭后仅生成推荐,不会自动下单,适合先观察/体验。',
MAX_OPEN_POSITIONS: '同时持仓数量上限(防止仓位过多/难管理)。建议 1-5。',
MAX_DAILY_ENTRIES: '每日最多开仓次数(防止高频下单/过度交易)。建议 3-15。',
BINANCE_API_KEY: '币安API密钥。用于访问币安账户的凭证需要启用"合约交易"权限。请妥善保管,不要泄露。',
BINANCE_API_SECRET: '币安API密钥Secret。与API Key配对使用用于签名验证。请妥善保管不要泄露。',
USE_TESTNET: '是否使用币安测试网。true表示模拟交易无真实资金false表示真实交易。',
MIN_MARGIN_USDT: '最小单笔保证金USDT。低于此值不下单用于满足币安合约最小名义价值要求。',
MIN_VOLUME_24H_STRICT: '严格成交量过滤USD。24H Volume 低于此值的交易对直接剔除,比 MIN_VOLUME_24H 更严格。',
SCAN_EXTRA_SYMBOLS_FOR_SUPPLEMENT: '智能补单额外候选数。当 TOP_N 中部分因冷却等被跳过时,仍会尝试这批额外候选,避免无单可下。',
EXCLUDE_MAJOR_COINS: '是否排除主流币BTC、ETH、BNB等。开启后专注于山寨币策略。',
TAKE_PROFIT_1_PERCENT: '分步止盈第一目标保证金百分比如0.15=15%。第一目标触发后了结50%仓位,剩余追求第二目标。',
TRADING_PROFILE: '交易预设conservative(稳健)/fast(快速验证)。conservative 偏向低频+高门槛fast 偏向高频+宽松过滤。',
ATR_PERIOD: 'ATR 计算周期K线数量。默认 14影响 ATR 动态止损的敏感度。',
SYMBOL_LOSS_COOLDOWN_ENABLED: '连续亏损冷却开关。开启后,同一交易对连续亏损达到阈值则禁止交易一段时间,避免连续亏损。',
SYMBOL_MAX_CONSECUTIVE_LOSSES: '最大允许连续亏损次数。超过后触发该交易对的冷却。',
SYMBOL_LOSS_COOLDOWN_SEC: '连续亏损后的冷却时间(秒),默认 36001小时。',
}
const ConfigItem = ({ label, config, onUpdate, disabled }) => { const ConfigItem = ({ label, config, onUpdate, disabled }) => {
const isPercentKey = label.includes('PERCENT') || label.includes('PCT') const isPercentKey = label.includes('PERCENT') || label.includes('PCT')
const PCT_LIKE_KEYS = new Set([ const PCT_LIKE_KEYS = new Set([
@ -202,6 +262,7 @@ const GlobalConfig = () => {
const [recommendationsStatus, setRecommendationsStatus] = useState(null) const [recommendationsStatus, setRecommendationsStatus] = useState(null)
const [servicesSummary, setServicesSummary] = useState(null) const [servicesSummary, setServicesSummary] = useState(null)
const [marketOverview, setMarketOverview] = useState(null) const [marketOverview, setMarketOverview] = useState(null)
const [showMarketJson, setShowMarketJson] = useState(false)
const [systemBusy, setSystemBusy] = useState(false) const [systemBusy, setSystemBusy] = useState(false)
// //
@ -967,9 +1028,18 @@ const GlobalConfig = () => {
} }
} }
// description
const config_guide = {}
entries.forEach((e) => {
const detail = CONFIG_GUIDE_DETAILS[e.key] || e.description
if (detail) config_guide[e.key] = detail
})
const snapshot = { const snapshot = {
fetched_at: now.toISOString(), fetched_at: now.toISOString(),
note: 'display_value 对 PERCENT/PCT 做了百分比换算;敏感字段可选择脱敏/明文。', export_purpose: '策略配置全量导出用于离线分析与调参。来源getGlobalConfigs管理员或 getConfigs普通用户包含数据库配置及后端默认值。',
note: 'configs 为全部配置项display_value 对 PERCENT/PCT 做了百分比换算敏感字段API Key/Secret可选择脱敏或明文。config_guide 提供各配置的详细说明与建议,便于策略分析。',
config_count: entries.length,
preset_detected: detectedPreset, preset_detected: detectedPreset,
system_status: systemStatus ? { system_status: systemStatus ? {
running: !!systemStatus.running, running: !!systemStatus.running,
@ -978,6 +1048,7 @@ const GlobalConfig = () => {
state: systemStatus.state || null, state: systemStatus.state || null,
} : null, } : null,
configs: entries, configs: entries,
config_guide,
} }
return JSON.stringify(snapshot, null, 2) return JSON.stringify(snapshot, null, 2)
@ -1169,11 +1240,18 @@ const GlobalConfig = () => {
{/* 市场行情概览(供确认策略方案是否匹配市场) */} {/* 市场行情概览(供确认策略方案是否匹配市场) */}
{isAdmin && ( {isAdmin && (
<section className="global-section" style={{ marginBottom: '20px' }}> <section className="global-section" style={{ marginBottom: '20px' }}>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '10px' }}> <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '10px', flexWrap: 'wrap', gap: '8px' }}>
<h3>市场行情概览</h3> <h3>市场行情概览</h3>
<button type="button" className="system-btn primary" onClick={loadMarketOverview}> <div style={{ display: 'flex', gap: '8px' }}>
刷新 <button type="button" className="system-btn primary" onClick={loadMarketOverview}>
</button> 刷新
</button>
{marketOverview && (
<button type="button" className="system-btn" onClick={() => setShowMarketJson(v => !v)}>
{showMarketJson ? '收起 JSON' : '查看 JSON'}
</button>
)}
</div>
</div> </div>
{marketOverview ? ( {marketOverview ? (
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', gap: '12px', fontSize: '14px' }}> <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(200px, 1fr))', gap: '12px', fontSize: '14px' }}>
@ -1226,6 +1304,25 @@ const GlobalConfig = () => {
) : ( ) : (
<div style={{ color: '#888', fontSize: '14px' }}>加载中或拉取失败请点击刷新</div> <div style={{ color: '#888', fontSize: '14px' }}>加载中或拉取失败请点击刷新</div>
)} )}
{showMarketJson && marketOverview && (
<div style={{ marginTop: '12px' }}>
<div style={{ display: 'flex', justifyContent: 'flex-end', marginBottom: '6px' }}>
<button
type="button"
className="system-btn"
onClick={() => {
const json = JSON.stringify(marketOverview, null, 2)
navigator.clipboard.writeText(json).then(() => setMessage('已复制到剪贴板')).catch(() => setMessage('复制失败'))
}}
>
复制 JSON
</button>
</div>
<pre style={{ background: '#263238', color: '#aed581', padding: '12px', borderRadius: '6px', overflow: 'auto', maxHeight: '400px', fontSize: '13px', margin: 0 }}>
{JSON.stringify(marketOverview, null, 2)}
</pre>
</div>
)}
</section> </section>
)} )}
@ -1628,7 +1725,7 @@ const GlobalConfig = () => {
<div> <div>
<h3>当前整体配置快照</h3> <h3>当前整体配置快照</h3>
<div className="snapshot-hint"> <div className="snapshot-hint">
默认脱敏 BINANCE_API_KEY/SECRET你可以选择明文后重新生成再复制/下载 导出全量策略配置与配置页数据源一致config_guide 含各配置项说明与建议便于策略分析默认脱敏 API Key/Secret可勾选明文后重新生成
</div> </div>
</div> </div>
<button type="button" className="snapshot-close" onClick={() => setShowSnapshot(false)}> <button type="button" className="snapshot-close" onClick={() => setShowSnapshot(false)}>