发起回测
开始回测
{#if busyDatasets}
{:else if cfgErr}
{/if} {#if !busyDatasets && datasetsReady.length === 0 && !cfgErr}
{#snippet emptyCta()}
go(`/projects/${projectId}/data`)}>去接入数据
{/snippet}
{/if} {#if datasetsReady.length > 0}
数据集
(datasetId = v)} >
{datasetId ? (() => { const d = datasetsReady.find((x) => x.id === datasetId); return d ? `${d.name ?? d.id.slice(0, 8)} · ${d.request.start_date}~${d.request.end_date}` : '选择数据集…'; })() : '选择数据集…'}
{#each datasetsReady as d (d.id)}
{d.name ?? d.id.slice(0, 8)} · {d.request.start_date}~{d.request.end_date} · {d.request.instruments.map((i) => i.symbol).join(',')}
{/each}
起始资金
佣金率
滑点率
基准代码(可选)
策略参数(JSON,可选)
{#if needAck}
⚠
该数据集存在覆盖/预警信息,需要明确知晓后才能启动:
{#each datasetWarnMsgs as m, i (i)}
{m}
{/each}
我已知晓并用当前数据继续
{/if}
{#if selectedDataset}
本次回测与该数据集、当前策略快照一同记录,可按原始条件重跑
{/if}
{#if cfgErr}
{:else if actionMsg}
{/if} {/if}
最近一次回测
{#if latest}
Run 分支 {latest.version_id?.slice(0,8) ?? '—'}
{runStatusLabel[latest.status]}
{/if}
{#if latest}
启动时间
{fmtDateTime(latest.created_at)}
{#if latest.started_at}
开始执行
{fmtDateTime(latest.started_at)}
{/if} {#if latest.finished_at}
结束时间
{fmtDateTime(latest.finished_at)}
{/if}
代码版本
{latest.version_id.slice(0, 10)}
数据集
{latest.dataset_id?.slice(0, 8)}…
资金
{formatMoney(latest.config.capital)} · 佣金 {fmtPct(latest.config.commission, 4)} · 滑点 {fmtPct(latest.config.slippage, 4)}
{#if latest.error}
✕
{latest.error}
{/if} {#if latest.result?.warnings?.length}
⚠
{#each latest.result.warnings as w, i (i)}
{w}
{/each}
{/if} {#if latest.result?.assumptions && Object.keys(latest.result.assumptions).length}
技术口径
{#each Object.entries(latest.result.assumptions) as [k, v] (k)}
{k}
{v}
{/each}
{/if} {#if latest.status === 'succeeded' && latest.result}
查看完整结果与图表
{/if}
{#if canCancel}
{cancelBusy ? '取消中…' : '取消回测'}
{/if} {#if canRerun}
{rerunBusy ? '重新提交…' : '按原始代码&数据重跑'}
{/if}
{:else}
{/if}
回测历史
{#if history && history.length > 0}
启动时间
状态
资金/佣金/滑点
数据集
结果
{#each history as h (h.id)}
{fmtDateTime(h.created_at)}
{h.status === 'succeeded' ? '完成' : h.status === 'failed' ? '失败' : h.status === 'running' ? '执行中' : h.status === 'cancelled' ? '已取消' : '排队中'}
{formatMoney(h.config.capital)} · {fmtPct(h.config.commission, 4)} / {fmtPct(h.config.slippage, 4)}
{h.dataset_id?.slice(0, 8)}…
结果
{/each}
{/if}