All posts
Trading Strategies2025/12/28Updated: By Iven W.

Backtesting Spreadsheet: Trade Log and Execution Worksheet

Download a free backtesting spreadsheet CSV and learn how to record run settings, every eligible signal, modeled fills, costs, exceptions, and rule compliance.

Quick answer: A backtesting spreadsheet should preserve two layers of evidence: the settings for each test run and the row-by-row record of every eligible signal or trade. The goal is not to create a prettier profit summary. It is to make the historical test reproducible, expose skipped signals and execution assumptions, and give the later results review a clean source dataset.

Download the free backtesting execution log CSV. It opens in Excel, Google Sheets, Numbers, LibreOffice, or any tool that supports CSV files.

This page owns the during-the-test execution record. Use the backtesting test plan before the run, the complete backtesting guide for the broader workflow, the backtesting results guide after the report exists, and the validation checklist to challenge whether the result can be trusted.

What This Spreadsheet Is—and Is Not

A backtesting spreadsheet is an audit trail for a historical strategy test. Each row should connect a strategy rule to a specific signal, modeled order, exit, cost assumption, and result.

It is not the same as:

RecordMain purposeWhen it is used
Backtesting test planFix the hypothesis, rules, data, costs, benchmark, and decision criteriaBefore the test
Backtesting execution logRecord what the test actually did, signal by signal and trade by tradeDuring the test
Backtesting results reportSummarize return, drawdown, trade distribution, and other metricsAfter the test
Validation checklistCheck data, fills, overfitting, stability, and out-of-sample evidenceAfter the report
Trading journalReview live or simulated decisions, habits, emotions, and process qualityDuring trading practice or live trading

The distinction matters because aggregated metrics cannot explain every anomaly. A profitable curve may contain skipped losing signals, impossible fills, duplicated orders, missing data, or parameter changes that are invisible in the summary.

TradingView's Strategy Report separates aggregate metrics from a List of Trades, while MetaTrader's tester provides detailed results, a testing journal, trade history, data-quality information, and execution settings. Those platform structures illustrate the same principle: a final scorecard should be traceable to lower-level evidence.

The Two-Layer Structure

A useful worksheet contains run-level fields and row-level fields.

Layer 1: Run-level metadata

These values describe the test as a whole and may repeat on every CSV row or live in a separate worksheet tab.

FieldWhat to recordWhy it matters
run_idUnique name for the runPrevents results from different tests being mixed
strategy_versionFrozen rule versionConnects the output to the exact strategy definition
parameter_setParameter values usedMakes optimization and sensitivity comparisons traceable
sample_labelDevelopment, holdout, walk-forward, or another labelSeparates research data from validation data
data_sourceVendor, broker, exchange, or exported datasetDocuments where the prices came from
test_start_date / test_end_dateRequested test datesDefines the intended sample
symbol or universe ruleInstrument or selection rulePrevents silent universe changes
timeframeBar intervalAffects signals, sequencing, and fill assumptions
timezoneChart and event clockPrevents session and timestamp mismatches

Record the effective dates too when the platform changes them. MetaTrader documents that a tester may download preceding history for indicator calculations and can shift the effective start when insufficient history is available. A requested date range and the data actually used are not always identical.

Layer 2: Signal- and trade-level rows

These values describe one eligible decision or one executed trade.

Field groupSuggested columns
Identityrow_id, signal_time, setup_id
Eligibilityeligible_signal, side, rule_compliance
Planned orderplanned_entry, planned_stop, planned_target
Modeled ordermodeled_entry, quantity, modeled_exit, exit_reason
Frictioncommission, spread_cost, slippage_cost
Resultgross_pnl, net_pnl, r_multiple
Pathmfe, mae, market_regime
Exceptionsexception_code, notes

The downloadable CSV contains these fields in a single header row so it can be imported into a spreadsheet, database, notebook, or analysis script.

How to Use the Backtesting Execution Log

1. Create a new run ID

Do not overwrite a prior test when the strategy rules, parameters, data, or execution assumptions change.

A practical naming format is:

strategy-name_version_sample_run-date

For example:

breakout-pullback_v1.0_holdout_2026-07-27

The name is not a performance claim. It is a reference that connects the spreadsheet, test plan, code or chart settings, and exported report.

2. Copy the frozen settings from the test plan

Before recording trades, copy the relevant settings from the pre-test specification:

  • strategy version;
  • parameter set;
  • instrument universe;
  • timeframe and session;
  • data source and adjustment policy;
  • entry and exit logic;
  • position-sizing rule;
  • order and fill model;
  • spread, commission, and slippage assumptions;
  • development or holdout label.

If any setting changes after the run begins, stop and create a new version or document an explicit exception. Do not silently blend two strategies into one dataset.

3. Record every eligible signal

A common manual-backtesting error is to record only trades the reviewer likes. That turns the sample into a selection exercise rather than a test of the written rule.

For every signal that meets the eligibility conditions:

  1. assign a row_id;
  2. record the historical signal_time;
  3. identify the setup_id;
  4. mark eligible_signal as yes;
  5. record whether a trade was executed or skipped;
  6. explain any skip in exception_code or notes.

A skipped row is still evidence. It can reveal that the rules were ambiguous, the data was incomplete, an order could not be modeled, or discretion was applied inconsistently.

4. Separate requested prices from modeled fills

Do not use one price field for both the strategy instruction and the simulated execution.

  • planned_entry records the price or rule requested by the strategy.
  • modeled_entry records the fill produced by the test method.
  • planned_stop and planned_target preserve the original risk logic.
  • modeled_exit records the simulated exit.

This distinction becomes important when:

  • a market order fills on the next bar rather than the signal close;
  • a stop or limit order is touched inside a bar;
  • bid and ask prices differ from the chart's displayed price;
  • spread or slippage changes the fill;
  • a gap crosses the requested price;
  • a platform's broker emulator applies a specific intrabar path.

TradingView describes its Broker Emulator as the module that controls fill timing, costs, and the price model. MetaTrader likewise offers different tick and OHLC modeling modes, delay settings, commissions, and instrument specifications. The selected model belongs in the run record.

5. Record costs as separate fields

Do not hide all friction inside one adjusted P&L number.

Keep separate columns for:

  • commission;
  • spread cost;
  • slippage cost;
  • other fees when relevant;
  • gross P&L;
  • net P&L.

Separate fields make sensitivity testing possible. You can later ask whether the result survives a wider spread or less favorable fill assumption without reconstructing the original test.

6. Capture MFE, MAE, and the path—not only the exit

The final result does not show what happened while the position was open.

  • MFE, maximum favorable excursion, records the largest favorable move during the position.
  • MAE, maximum adverse excursion, records the largest unfavorable move during the position.

MetaTrader's testing report includes MFE- and MAE-related analysis because the path can reveal different information from the closing result. Two trades with the same net outcome may have experienced very different adverse movement, opportunity, and exit efficiency.

Use consistent units: price, points, percentage, or risk units. Do not mix units inside one column.

7. Tag market regime without rewriting history

A simple market_regime field can help segment results, but the classification rule must be consistent.

Possible labels include:

  • directional up;
  • directional down;
  • range;
  • high volatility;
  • low volatility;
  • event window;
  • unknown.

Avoid labeling the regime only after seeing whether the trade won. Ideally, define the classification rule in the test plan or use an external series that was available at the time.

8. Preserve exceptions and data problems

Use an exception_code instead of burying every issue in free-form notes.

Example codes:

CodeMeaning
DATA_GAPRequired historical data is missing
TIMEZONE_UNCLEARBar or event alignment cannot be verified
AMBIGUOUS_RULEThe written rule does not produce one clear decision
INTRABAR_UNKNOWNBar data cannot determine which order level occurred first
NO_FILL_MODELThe test method cannot model the requested order
SKIPPED_SIGNALAn eligible signal was not executed
PARAMETER_CHANGEA setting changed during the run
DUPLICATE_SIGNALThe same event was logged more than once

Exception counts are useful later. A backtest with many unresolved INTRABAR_UNKNOWN rows may require more granular data rather than stronger conclusions.

Copyable Minimum Worksheet

For a lightweight manual test, begin with this smaller table:

Run IDRow IDSignal TimeSetupEligible?SidePlanned EntryModeled EntryStopExitNet ResultRRegimeRules Followed?Exception

Use the downloadable CSV when you need separate cost, MFE, MAE, version, data, and sample fields.

Manual Replay vs Automated Export

The same evidence model works for both methods, but the source differs.

Manual historical replayAutomated backtest
The reviewer records each eligible setupThe engine exports orders, fills, and trades
Rule compliance must be checked manuallyRule execution should be checked against code and logs
Future candles must remain hiddenLook-ahead and repainting must be prevented
Ambiguous chart situations need exception codesModeling and data exceptions should be captured from the tester journal
Screenshots can support disputed rowsConfiguration files, code versions, and logs support disputed rows

TradingView exposes a metrics section and a List of Trades. MetaTrader provides a Results tab, testing journal, visual mode, order and deal history, and data-quality details. Exported platform data is useful, but preserve the configuration and strategy version that produced it. A trade list without its run settings is incomplete evidence.

Where ChartMini Fits

ChartMini is a lightweight historical chart replay tool for manual price-action and decision practice. It can help you:

  • keep future candles hidden;
  • apply a visual setup definition one candle at a time;
  • record eligible signals in the worksheet;
  • compare planned and simulated decisions;
  • review rule consistency across sessions.

ChartMini is not an automated strategy engine. It does not execute coded strategies, optimize parameters, reproduce broker order books, or guarantee realistic spreads, slippage, latency, and fills. For a manual ChartMini session, record intended stops, targets, invalidation, and cost assumptions in the worksheet rather than treating them as broker orders.

For a practice-focused journal that tracks behavior and replay decisions, use the simulated trade log guide. This page is narrower: it records the research evidence for a backtest run.

Common Backtesting Spreadsheet Errors

Recording only executed winners and losers

The missing rows may be the most important evidence. Log eligible signals that were skipped, rejected, or impossible to model.

Changing columns halfway through the sample

A new definition can change what a row means. Version the worksheet schema or create a new run when the recording method changes materially.

Mixing strategy versions

If an entry filter, stop rule, timeframe, or parameter changes, assign a new strategy_version or parameter_set.

Using one P&L field for everything

Keep gross result, commission, spread, slippage, and net result separate.

Treating the displayed chart price as an executable fill

Record the fill convention. A chart value, bid, ask, last trade, bar open, and next-bar execution are not interchangeable.

Deleting exceptions after the report looks good

Retain data gaps, ambiguous cases, and rejected signals. Removing them makes the result harder to reproduce and easier to overstate.

Turning the worksheet into a performance promise

A detailed spreadsheet improves documentation. It does not eliminate selection bias, overfitting, data errors, changing market conditions, execution differences, or live-trading risk.

How This Page Fits the Backtesting Cluster

Use the pages in this order:

  1. Before the test: write the Backtesting Test Plan.
  2. Learn the full method: use How to Backtest a Trading Strategy.
  3. During the run: use this spreadsheet and execution log.
  4. After the run: interpret what backtesting results can and cannot tell you.
  5. Challenge the result: apply the Backtesting Validation Checklist.
  6. Choose another practice method when appropriate: compare Market Replay, Backtesting, and Paper Trading.

Frequently Asked Questions

What should a backtesting spreadsheet record?

A backtesting spreadsheet should record the test run, strategy version, parameter set, data scope, every eligible signal, planned and modeled fills, costs, exits, result, market regime, rule compliance, and any exception that affected the test.

Is a backtesting trade log the same as a trading journal?

No. A backtesting trade log is a research record used to reproduce a historical test. A trading journal usually focuses on a trader's live or simulated decisions, execution habits, emotions, and review notes.

Should skipped signals be included in a backtesting worksheet?

Yes. If a signal met the written eligibility rules, record it even when no trade was taken. Mark the row as skipped and state the reason so discretionary filtering does not disappear from the research record.

Why separate planned entry from modeled entry?

The planned entry records what the strategy requested, while the modeled entry records the price produced by the backtesting or fill assumption. Keeping both fields exposes gaps caused by spread, slippage, bar sequencing, or order logic.

Can I use this CSV for manual and automated backtesting?

Yes. Manual testers can fill the rows during candle-by-candle review, while automated testers can map exported orders and trades into the same columns. Fields that do not apply can be left blank, but the run settings and exceptions should still be preserved.

Does a complete backtesting log prove a strategy will work live?

No. A complete log improves reproducibility and exposes errors, but it cannot reproduce every live fill, cost, liquidity condition, operational failure, or behavioral response. Historical and hypothetical results are not guarantees of future performance.

Official Sources


The downloadable CSV is an educational recordkeeping template. It does not provide trading signals, evaluate a strategy automatically, or guarantee live-market results.