Consider a hypothetical journal. Mark records 171 trades and a €4,200 loss. Adding setup and news-context fields lets him identify a segment with a €2,700 loss, about 64.3% of the total. That retrospective observation does not prove that excluding the segment would create a future €8,100 profit. The twenty-five fields below form one proposed design, not an industry standard.

What a five-column journal can miss

A compact journal can record results, but it may lack the fields needed for a particular investigation. Choose columns from the questions you want to answer, then preserve enough information to reproduce the calculations and distinguish planned actions from actual fills.

This proposed twenty-five-field template groups ten trade fields, five risk fields, five setup fields and five review fields. It is an editorial design rather than a mandatory standard attributed to authors or trading firms. Add or remove fields according to the investigation while retaining an auditable source record.

Keep the source event record separate from calculated summaries. A recorded plan states information available at the decision; fills and fees describe what actually happened; formulas derive results from those definitions. An imported fill is still source data even if not typed by hand. Define one summary row as one trading idea, linking partial executions with an idea ID in a separate operations sheet. Two partial exits are not automatically two independent signals. Add account, currency, demo/live status, time zone and strategy version to that source record or dictionary; do not add PLN and USD outcomes without a defined conversion.

Ten columns of trade data — the foundation of any journal

The ten fields below combine entry and exit timestamps into single fields. Save planned prices separately from actual fills where execution analysis needs both; do not reconstruct missing entry context from hindsight. Some metrics require additional intratrade observations that these ten fields do not contain.

Ten columns of trade data (1–10)
1. Entry dateISO format YYYY-MM-DD plus time HH:MM. Enables chronological sorting and segmentation by weekday.
2. InstrumentFor example EUR/USD, GBP/JPY or gold quoted in USD. Store the provider’s symbol and product specification; XAU/USD is a gold quote, not a pair of two currencies.
3. DirectionLong or short. Trivial, but without it every output value comes apart.
4. Entry priceThe actual fill price, not the quote at the moment of clicking. The difference comes from slippage.
5. Stop lossThe planned stop level and order type; record the actual exit fill separately because an ordinary stop does not guarantee this price.
6. Take profitThe planned target if used, or the documented alternative exit rule. A strategy need not use a fixed take-profit price.
7. Position sizeRecord lots and the actual contract units per lot. Conventional FX lot labels alone do not define every instrument or broker contract.
8. Exit priceThe actual closing fill — whether from a stop-loss hit, a take-profit hit or a manual close.
9. Exit date and timeEnables calculation of holding period, a key parameter for day and swing strategies.
10. Monetary resultNet profit or loss including applicable costs. Use actual fills and avoid subtracting spread a second time.

Use the actual contract and account-currency records to calculate net result. Commission and financing may be separate entries; spread is already reflected in executable buy and sell prices and must not be deducted twice. A broker label such as ECN does not establish a universal euro cost per lot.

Five risk columns — define the reference first

Risk-normalised results distinguish position scale from realised payout. A hypothetical €800 result against €400 initial planned risk is 2R; €1,200 against €1,000 is 1.2R. Those ratios alone do not prove which strategy is better or how much risk was actually borne.

Column eleven records initial planned monetary risk divided by a stated balance or equity reference. If you format that ratio as a percentage, do not multiply by 100 again; for an ordinary number expressed in percent, multiply once. Pip calculations need the actual contract, volume and currency conversion. Column twelve is net result divided by positive, valid initial planned risk: EUR 150 / EUR 50 = 3R and −EUR 50 / EUR 50 = −1R. Moving the stop later does not rewrite that initial denominator. Leave R missing when the initial risk is unknown; an ordinary stop is not a guaranteed loss boundary.

Column thirteen can record profit giveback from maximum favourable excursion to exit: a hypothetical +4R peak and +1R exit give 3R giveback. That is not necessarily maximum peak-to-trough drawdown, which requires the intervening path. Column fourteen records exposure on a defined comparable basis. Column fifteen records estimated correlation with its window and method; +0.90 does not make two different positions identical or exactly double risk.

Five setup-analysis columns — the answer to “why did I enter”

This group records the stated reason for entry: setup type, timeframe, specified confluence, scheduled-event context and any consistently defined self-rating at entry. Record these before the outcome rather than guessing later. A relationship between a state rating and losses does not by itself identify the cause of those losses.

Column sixteen records setup type using a defined list. Keep categories stable enough to compare, and report sample size and uncertainty for each segment. Eight to ten labels or one hundred total trades do not guarantee a reliable estimate of expectancy.

Column seventeen records the signal timeframe. Column eighteen records specified confluence conditions without assuming they are statistically independent. An average, RSI and chart pattern derived from the same prices may overlap in information. Sixty or one hundred trades do not guarantee a superior timeframe or a fifteen-to-twenty-percent win-rate uplift.

Column nineteen records scheduled-event context and time zone. Column twenty can record a self-rated 1–10 state, with consistent definitions. Investigate any association with results and its uncertainty; a score below four does not universally establish negative expectancy.

Five execution-review columns — post-trade analysis in concrete numbers

The fourth and final block is the execution review — what English-language literature calls post-trade analysis. It concerns not the trade itself but the quality of its execution against the original plan. Five fields: plan adherence, mistake count, lesson in one sentence, screenshot link, monthly tag.

Column twenty-one rates adherence to predefined rules on a documented 1–10 scale. Distinguish authorised changes from unplanned deviations and compare their recorded outcomes. Do not assume that every point below seven costs 0.3R or that a particular relationship appears in ninety percent of traders.

Column twenty-two counts predefined deviations, such as an unauthorised size increase or missing required exit instruction. Record the evidence and investigate results; defining an action as a mistake does not itself establish a statistical relationship with profit.

Column twenty-three records a short observation or question. Hypothetical notes could be “Entered before the required completed H1 bar” or “Exited at +0.8R instead of the planned +2R; investigate why.” Link the note to the rule and evidence. A profitable deviation is still a deviation, while a correctly executed loss is not automatically a mistake.

Column twenty-four — link to a chart screenshot at entry and exit. The simplest approach is to save them in a cloud folder and paste the hyperlink. Column twenty-five — a monthly tag, a simple category such as “January-NFP-tilt” or “February-EURUSD-range” — allows quick search through the journal by market phase. A fuller list of ten complementary metrics worth tracking alongside the twenty-five columns is laid out in the article on trading statistics.

A local ID needs an account scope

When a journal combines sources, check where each identifier is unique and inspect the record retained after duplicate handling.

Scroll sideways to see the full diagram

A local ID needs an account scopeFour fictional records in order: A/17 +10 PLN, A/18 −4 PLN, B/17 +7 PLN and an identical reimport of A/17 +10 PLN. Our audit retains the first record per complete account-and-local-ID key after confirming duplicate identity. It retains A/17,A/18,B/17, totalling +13 PLN. An incorrect ID-only procedure retaining the first seen record keeps A/17,A/18, totalling +6 PLN. The diagram identifies each retained record. It does not assign that ordering to Power Query or to real broker identifier formats.CHECK THE KEY AND RETAINED RECORDFictional local IDs • all results in PLNAccountLocal IDPLNAuditA17+10keepA18−4keepB17+7keepA17+10repeatKey (account,ID):3 records10 − 4 + 7 = 13 PLNID only + first record:2 records10 − 4 = 6 PLN • B/17 lost

Assumptions: Four complete fictional records in the shown order, one currency PLN and an identical A/17 reimport. Account scopes A and B are separate and explicit. This checks a local key and retained copy, not global uniqueness of real transaction numbers.

Our local identifiers are unique within each of the two fictional accounts. Real broker exports need their own scope check. The A/17 reimport represents the same operation and result in this controlled list; B/17 is a different operation.

Our deterministic audit retains the first record in the supplied order for each (account, local ID), checking repeat identity before omission. A/17 +10, A/18 −4 and B/17 +7 total +13 PLN. An incorrect ID-only procedure retains A/17 and A/18, totalling +6 PLN, losing the valid B/17 record.

Microsoft — duplicates and column selection in Power Query supports comparison across multiple columns but warns that duplicate removal does not guarantee keeping the first instance. Our first-record rule specifies this audit; it is not a promise of that function. If values disagree for the same complete key, investigate the conflict instead of discarding it as an identical repeat.

ID 17 on account B identifies a different record from ID 17 on account A.

Excel versus TraderSync versus Edgewonk — when to change tools

A spreadsheet offers control over fields and formulas. Check the actual licence, available functions and import workflow; Excel is not universally free and paid tools can also allow customisation. Setup time depends on the requirements and the user's skills.

Compare import compatibility, export access, required analytics and total subscription terms using a test dataset. TraderSync lists tiered recurring plans; Edgewonk lists an annual subscription. Neither a thousand trades per year nor a fixed sequence of tools is a universal switching threshold. Verify current billing, taxes and integrations before choosing.

Compare journal requirements before choosing a tool
SpreadsheetCheck licence, formula control, import/reconciliation work and export format.
TraderSyncCompare current recurring plans, supported import methods and required reports on the provider's pricing page.
EdgewonkCurrent pricing describes an annual subscription, not perpetual access for a one-time $169 payment. Check final currency, tax and renewal terms.
Practical checkReconcile a known sample before trusting aggregate metrics; do not switch tools solely because a trade-count threshold was crossed.

A VBA macro — one routine for automatic metric calculation

The VBA illustration below aggregates valid monetary outcomes and R values from columns J and L of a sheet named Trades, writing to Dashboard. It does not derive initial risk, validate account currencies, deduplicate source events, refresh pivots or send email. Use one defined currency and a reconciled valid row set. It includes a valid zero-result row in the trade count; profit factor is unavailable without losses. Missing paired data, errors and nonnumeric values are rejected. Check these cases independently before enabling a macro; its numeric checks alone do not verify dates, currencies or grouping.

Sub CalculateMetrics()
    Dim ws As Worksheet, lastRow As Long, i As Long
    Dim totalTrades As Long, countWins As Long
    Dim sumWins As Double, sumLosses As Double, sumR As Double
    Dim result As Double, rValue As Double
    Dim resultCell As Variant, rCell As Variant
    Dim resultText As String, rText As String
    Set ws = ThisWorkbook.Sheets("Trades")
    lastRow = Application.Max(ws.Cells(ws.Rows.Count, "J").End(xlUp).Row, _
        ws.Cells(ws.Rows.Count, "L").End(xlUp).Row)
    For i = 2 To lastRow
        resultCell = ws.Cells(i, 10).Value2
        rCell = ws.Cells(i, 12).Value2
        If IsError(resultCell) Then
            Err.Raise vbObjectError + 3, , "Error value in J at row " & i
        End If
        If IsError(rCell) Then
            Err.Raise vbObjectError + 4, , "Error value in L at row " & i
        End If
        If IsNull(resultCell) Then
            Err.Raise vbObjectError + 5, , "Null result in J at row " & i
        End If
        If IsNull(rCell) Then
            Err.Raise vbObjectError + 6, , "Null R in L at row " & i
        End If
        resultText = Trim$(CStr(resultCell))
        rText = Trim$(CStr(rCell))
        If Len(resultText) > 0 Or Len(rText) > 0 Then
            If Len(resultText) = 0 Or Len(rText) = 0 Then
                Err.Raise vbObjectError + 1, , "Missing result or R at row " & i
            End If
            If Not IsNumeric(resultCell) Then
                Err.Raise vbObjectError + 2, , "Non-numeric result in J at row " & i
            End If
            If Not IsNumeric(rCell) Then
                Err.Raise vbObjectError + 2, , "Non-numeric R in L at row " & i
            End If
            result = CDbl(resultCell)
            rValue = CDbl(rCell)
            totalTrades = totalTrades + 1
            sumR = sumR + rValue
            If result > 0 Then
                sumWins = sumWins + result
                countWins = countWins + 1
            ElseIf result < 0 Then
                sumLosses = sumLosses + Abs(result)
            End If
        End If
    Next i
    With ThisWorkbook.Sheets("Dashboard")
        .Range("B2").Value = totalTrades
        If totalTrades > 0 Then
            .Range("B3").Value = countWins / totalTrades
            .Range("B4").Value = sumR / totalTrades
        Else
            .Range("B3:B4").Value = CVErr(xlErrNA)
        End If
        If sumLosses > 0 Then
            .Range("B5").Value = sumWins / sumLosses
        Else
            .Range("B5").Value = CVErr(xlErrNA)
        End If
        .Range("B6").Value = sumWins - sumLosses
    End With
    MsgBox "Metrics calculated for " & totalTrades & " trades.", vbInformation
End Sub

Bind the reviewed routine to a button only after checking its inputs and output against a small known dataset. Runtime depends on the workbook and machine. Further automation needs separate implementation and testing.

A hypothetical journal — from five columns to twenty-five

In this hypothetical example, Mark starts with €12,000 and loses €4,200, or 35%, across 171 trades. The simplified journal does not record enough context to segment those results reliably.

Suppose saved source records allow Mark to classify the earlier trades. An invented forty-eight-trade segment loses €2,700, approximately 64.3% of the €4,200 total. If each trade initially risks €100, total planned risk is €4,800 and mean result is −€2,700/(48×€100)=−0.5625R. Without equal risk, aggregate result divided by aggregate risk is a risk-weighted ratio rather than the arithmetic mean of trade R values.

A second hypothetical year assigns 142 trades and EUR 8,100 profit, mean 0.42R and profit factor 1.94. A possible 91 wins rounds to 64%, while 80 wins among the first year’s 171 trades round to 47%; the other assigned first-year summaries are −0.18R and profit factor 0.71. These summaries do not reconstruct trade outcomes or risk sizes and are not audited observations. Removing a segment changes the policy, and a difference between years does not isolate its causal effect.

A separate hypothetical example shows why mean R is not total money: +PLN 100 on PLN 100 initial risk is +1R, while −PLN 1,000 on PLN 1,000 risk is −1R. Arithmetic mean R is zero, but net money is −PLN 900. Dividing totals gives −900 / 1,100 ≈ −0.818, a risk-weighted mean of R, not an account return.

Segmentation can reveal candidate patterns, but searching many categories can also select historical noise. Preserve the initial analysis, check data completeness and evaluate any changed rule on later untouched observations. Twenty-five columns are not required for every investigation.

What to do tomorrow

  1. Create a journal with explicit field definitions. Use a neutral file name, timestamp format and currency convention. Mark unavailable information as missing instead of inventing it.
  2. Audit the formulas. For a simple linear instrument, gross quote-currency P/L is direction sign × (exit − entry) × units, then convert under the contract rules and include applicable costs without counting spread twice. Net R-multiple equals net result / initial monetary risk. Planned risk percentage equals initial monetary risk / stated capital reference ×100.
  3. Reconcile twenty source trades as a small check. Compare fills, costs, currencies and identifiers with the broker export. Enter historical context only when it was recorded at the time; twenty rows do not guarantee a stable pattern.
  4. Create aggregate metrics with defined denominators. Mean R is the average of valid R values. Profit factor is positive-result sum divided by the absolute negative-result sum and is undefined without losses. Win rate is winning trades divided by all valid closed trades, including zero-result trades according to the stated classification.
  5. Schedule a journal review. Check data completeness, deviations and candidate hypotheses at a cadence you can maintain. A review supports learning but is not a guarantee of competence or profit.