发起回测

{#if busyDatasets} {:else if cfgErr} {/if} {#if !busyDatasets && datasetsReady.length === 0 && !cfgErr} {#snippet emptyCta()} {/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}
{#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} {/if} {#if canRerun} {/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}