Most copier logs answer a question nobody is asking. They record that follower account B ended the session holding 3 contracts, the one fact in the dispute everyone already agrees on. What a firm review or a divergence investigation needs is the chain that produced the 3: what the master filled, what the copier read, computed, rounded and submitted, and what the broker said back. An outcome-only log cannot reproduce that chain, and you find that out on the day you needed it.

Key takeaway

A trade copier audit trail is only useful if it records decisions and inputs rather than outcomes. Every copy event should store the master fill with the venue's own timestamp, the sizing inputs exactly as read at that instant, the computed size both before and after rounding, every risk check with its verdict, and the broker's acknowledgment and fill carrying the broker's own order ID. Reconciliation is a separate activity from logging: periodically compare the copier's internal position belief against the broker's reported state, and correct the internal record to match the broker, never the reverse.

Why do outcome-only logs fail exactly when they matter?

Because an outcome is equally consistent with a correct system and a broken one. "Follower B holds 3 contracts" proves nothing on its own. "The master filled 5, the configured ratio was 0.6, the computed size was 3.0, rounding was a no-op, and the broker acknowledged 3 at a stated price" makes every hop checkable by someone who does not trust you. Record decisions and inputs, because outcomes are the only part of the chain that cannot verify themselves.

Two situations need that record: a firm dispute, where you must prove what your system did and precisely when, and self-diagnosis, where a follower's equity curve pulls away from the master's over weeks and you need the node where divergence entered. Your trading journal tells you the result diverged. Only an event log tells you where.

Two failure modes are structurally invisible to outcome fields. A risk check that blocked an order and a signal the copier never received look identical, because both produce zero fills, and only a logged risk check with its compared value and pass or block verdict separates "the copier correctly refused" from "the copier never saw the trade." A symbol mapping error is worse. It produces a valid-looking fill on the wrong instrument or contract month, so the outcome field reads as clean execution. Only the applied transformation, logged as source symbol -> resolved target symbol -> contract month, exposes it.

The eleven fields every copy event should capture

A complete per-event record has eleven parts. Each one exists because a specific failure is invisible without it.

FieldWhat it proves
Master fill: instrument, side, quantity, price, venue-reported timestampWhat was supposed to be copied, and when it happened at the venue rather than when you heard about it.
Copier receipt time, your own clock, UTCPaired with the venue timestamp, yields per-event latency and separates a slow copier from a moving market.
Sizing inputs as read: follower equity or balance, configured ratio or risk percent, stop distance if risk-basedLets a third party recompute the size from the exact numbers the copier used.
Computed size before roundingExposes the fractional result that rounding is about to destroy.
Size after rounding, plus the rounding mode appliedTurns silent fleet-wide drift into a visible one-line difference.
Symbol mapping applied (source -> target -> contract month)Catches valid-looking fills on the wrong instrument or expiry.
Every risk check: the value compared, the threshold, pass or blockDistinguishes a correct refusal from a missed signal.
Order as submitted, including your client order IDFixes your intent in the record before the broker responds.
Broker acknowledgment, including the broker's own order IDThe join key between your log and the broker's or firm's statement.
Fill as reported, with the broker's timestamp and filled quantityThe only field that proves what actually reached the market.
Errors, rejections, retries, with the reason textExplains gaps that would otherwise look like the copier idling.

Two of these get skipped most often. Record sizing inputs as read, not as configured: if the copier sized off an equity of $52,180 at 09:31:04, the log must say $52,180, because reconstructing the decision from a later balance produces a different answer and makes a correct system look broken. And log the broker's order ID, not only your client order ID. Your client ID exists in exactly one place, your own records. The broker's ID appears in the broker's records and on the firm's statement, which is what lets two independent sets of evidence be joined.

Why pre-rounding and post-rounding size are two separate fields

Storing computed size before and after rounding is the highest-value line in the schema. Rounding is the most common source of silent divergence across a fleet, and it is invisible if you keep only the final integer, which always looks plausible: a whole number in a field that only ever holds whole numbers.

Clean case first. Master fills 5 ES long, ratio 0.6, computed size = 5 x 0.6 = 3.0. Rounding is a no-op, submitted size is 3, broker reports a fill of 3. Every hop verifies and nothing is inferred.

Now change one input. Master fills 3 ES, same 0.6 ratio, computed size = 3 x 0.6 = 1.8. Floor rounding submits 1. The realized ratio is 1 / 3 = 0.3333, so the follower carried 33.33% of the master's size against a configured 60%, and the shortfall on this single trade is 1.8 - 1 = 0.8 contracts. The chain forks at exactly one node. The master fill arrives, the receipt clock stamps it, equity and ratio are read, the multiply yields 1.8, and then the rounding node branches: one path floors to 1 and submits 1, the other rounds to nearest and submits 2. Everything downstream is identical in shape on both branches, same order submit, same broker acknowledgment, same fill message. Only the integer differs, and if the log stores only that integer, the fork is unrecoverable after the fact.

Repeat that trade ten times. Intended total = 3 x 0.6 x 10 = 18 contracts. Floor rounding delivers 1 x 10 = 10 contracts, a shortfall of 18 - 10 = 8 contracts, which is 8 / 18 = 0.4444, or 44.44% of intended exposure that never got copied. Switch to round-half-up and 1.8 becomes 2, so actual = 2 x 10 = 20 contracts, an over-copy of 20 - 18 = 2 contracts, which is 2 / 18 = 0.1111, or 11.11% over. Same configuration, same trades, opposite sign of error, decided entirely by a rounding mode that most tools never write down.

THE FORK THAT LEAVES NO TRACE 3 x 0.6 = 1.8 computed size floor round-half-up 1 2 10 trades: 10 vs 18 intended 44.44% under-copied 10 trades: 20 vs 18 intended 11.11% over-copied same event, same submit, same ack, same fill: only the stored integer differs
Rounding mode is a systematic bias with a sign, not random noise. If the log stores only the final integer, the fork is unrecoverable after the fact, which is why the pre-rounding and post-rounding sizes belong in the record as two separate fields.

Put dollars on it. If each of those ten trades captured 4 index points on the E-mini S&P 500 (ES), whose multiplier is $50 per index point, intended P&L = 18 x 4 x $50 = $3,600 while the floor-rounded actual = 10 x 4 x $50 = $2,000. The difference is $3,600 - $2,000 = $1,600 the follower never earned, with no error, no rejection, and no log line indicating anything went wrong.

Rounding mode is a systematic bias, not noise, so it compounds in one direction across hundreds of trades instead of averaging out.
Rounding mode1.4 becomes1.8 becomes2.5 becomesBias across many trades
Floor (truncate)112Under-copies every fractional result. Never over. Compounds one way.
Ceiling223Over-copies every fractional result. Inflates fleet exposure.
Nearest, ties up123Under below .5, over at or above .5, ties break upward. Smallest systematic bias.
Nearest with minimum 1123As above, but a computed 0.3 becomes 1, which over-copies the smallest accounts hardest.

Futures copying is structurally worse for this than CFD copying, because futures contracts are integer-only and a computed 1.8 must collapse to 1 or 2. MT4, MT5 and most CFD platforms accept fractional lots, with the minimum volume step set per symbol by the broker rather than by the platform, so a 0.6 ratio usually lands close to exact. Check the step on your own symbol before assuming it. That is why a ratio behaving fine on a CFD account drifts the moment it points at futures, and why divergence across a fleet of followers so often traces back to a sizing decision nobody logged.

Micro contracts are the cheapest fix. The Micro E-mini S&P 500 (MES) is $5 per index point against the ES at $50, so 1 ES equals 10 MES. The computed 1.8 ES expressed in micros is 1.8 x 10 = 18 MES, already an integer, so the rounding error is exactly zero. The 44.44% shortfall above becomes 0% by changing the target instrument alone. Verify current CME contract specifications and whether your firm permits and scales micros before switching.

Timestamp discipline: two clocks, both in UTC

Record two timestamps per event: your own clock and the venue-reported clock, both UTC, both ISO 8601 with an explicit offset or trailing Z. A dispute about whether a fill fell before or after a reset boundary is decided by timestamps, and a log of local, ambiguous times is not evidence.

The two clocks are distinct in the protocols that carry orders. FIX defines TransactTime, tag 60, as a UTCTimestamp giving the "Time of execution/order creation" expressed in UTC, and keeps it separate from SendingTime, tag 52, the time of message transmission. Tag 60 is business time: when the transaction occurred, stamped by the party reporting it, so on an execution report it reflects the venue side rather than your machine. Tag 52 is session time: when a message left a machine. Conflating them is what makes a copier log useless, because the second drifts with your infrastructure and the first does not. Store both.

Local time carries ambiguity you cannot remove later. A 5:00 PM America/New_York reset is 21:00 UTC during EDT and 22:00 UTC during EST, so a log line reading "17:00:03" with no zone cannot establish which trading day a fill belongs to, and its meaning changes twice a year with no code change.

Now the drift case. A venue-reported fill at 2026-08-17T20:59:58.400Z against a reset boundary of 21:00:00.000Z precedes it by 21:00:00.000 - 20:59:58.400 = 1.600 seconds, so the fill belongs to the prior trading day. Suppose the copier's clock runs 2.5 seconds fast and the log stores only that clock. It records 20:59:58.400 + 2.500 = 21:00:00.900Z, 0.900 seconds after the boundary, so the identical fill now lands on the next trading day. Storing both clocks makes the offset provable. Storing one makes it silent.

Compliance minimums are not a design target

17 CFR 1.35 requires order times only to the nearest minute, and it binds registered intermediaries such as futures commission merchants, retail foreign exchange dealers, introducing brokers, and members of designated contract markets and swap execution facilities, not an individual funded trader. Nothing here is legal or compliance advice, so ask a qualified compliance professional whether any recordkeeping rule reaches your setup. Design for milliseconds either way, because a reset-boundary dispute is settled far below one minute.

Two more mechanics. Use the wall clock in UTC for absolute event times you will compare against a broker statement, and a monotonic clock for durations, because NTP can step the wall clock backwards and produce negative intervals. Store latency as its own field, derived from the two timestamps you already have: venue fill at 20:59:58.400Z, copier receipt at 20:59:58.610Z, latency = 610 - 400 = 210 ms. In a dispute that field separates "the copier was slow" from "the market moved."

That 2.5 seconds is not academic. If the prior day already used $2,300 of a $3,000 daily loss allowance, remaining room is $3,000 - $2,300 = $700. A $1,200 loss attributed to the prior day exceeds that room by $1,200 - $700 = $500, a breach. Attributed to the next day against a fresh allowance, it is not. Loss limits and reset times differ by firm and change, so verify yours against the firm's current rules document. The mechanism is universal.

What reconciliation is, and what it is not

Reconciliation is not logging. Logging records what you did; reconciliation periodically compares the copier's internal belief about each account's open positions against the broker's authoritative reported state, and resolves any difference explicitly instead of assuming the internal record is right.

It exists because event streams can drop or reorder messages, and at least one major platform documents that in its own reference. MetaQuotes states for MT5's OnTradeTransaction handler that "Priority of these transactions' arrival at the terminal is not guaranteed", that the transaction queue length comprises 1024 elements, and that if the handler takes too long on one transaction, previous ones can be superseded by new transactions in the queue. A copier trusting an event stream alone will eventually hold a wrong position count.

Run reconciliation at four moments: on startup, because internal state begins empty or stale; on reconnect, because events that occurred while you were away are gone; on a routine interval during the session; and after any order submit that timed out or errored ambiguously, because then you do not know whether the order landed. The primitive is built into the protocols, so skipping it is a choice. cTrader's Open API defines ProtoOAReconcileReq and ProtoOAReconcileRes, whose response returns the account's open positions and pending orders. FIX 4.4 offers Request for Positions and Order Mass Status Request for the same job.

The resolution rule is one sentence: the broker is the source of truth, and internal state is corrected to match it, never the reverse. A copier that "fixes" a discrepancy by firing corrective orders can double a position when the gap came from stale data during a disconnect. So split the two corrections. Overwriting the internal ledger should be automatic and should raise a human alert; auto-trading to close a detected gap belongs off by default or behind an explicit gate. Correcting your record is bookkeeping. Correcting the market position is a trade placed from data you just admitted was wrong.

A one-contract discrepancy, worked end to end

The copier believes follower account B holds 4 ES contracts long. The broker's position report says 3. The difference is 4 - 3 = 1 contract. The copier's belief came from two of its own records: order 1 submitted 2, order 2 submitted 2, internal total = 2 + 2 = 4. The broker's execution records show a fill of 2 on order 1 and a fill of 1 on order 2, with LastQty 1 and LeavesQty 1, the remainder later cancelled, so the broker total = 2 + 1 = 3. The copier logged its intent for order 2 and never the broker's fill quantity, the field that decides the case.

Four histories produce the identical outcome of "broker says 3", reaching the account along four different paths. One is a partial fill recorded as complete, arriving as an execution report with LastQty below the submitted quantity and a non-zero LeavesQty. Two is a fill missed while disconnected, identified by a broker execution whose timestamp falls inside the copier's recorded disconnect window. Three is a position the firm's or broker's risk engine closed, arriving as a broker-originated execution or cancel with no matching client order ID. Four is a manual trade placed directly on the account, with a different order origin and no copier record. Only a log holding the broker acknowledgment and fill separates them.

ONE OBSERVED STATE, FOUR CAUSES partial fill: LeavesQty > 0 missed while disconnected risk engine closed it manual trade on the account broker says 3 copier believed 4 the log broker ack + fill message the discrepancy is not the loss, the invisibility is
Four genuinely different causes converge on one identical observation. Without the broker acknowledgment and fill message stored alongside the copier's own intent, the four are indistinguishable, and an unreconciled contract is exposure the copier will never manage, close, or risk-check.

Leaving that gap unresolved has a price. The one unreconciled ES contract is unhedged exposure. At $50 per index point, a 10-point adverse move costs 1 x 10 x $50 = $500 on a position the copier does not believe exists and will therefore never manage, never close, and never include in a risk check. The discrepancy is not the loss. The invisibility is.

Retention, off-box storage, and the export you have never tested

Keep logs at least as long as the longer of your firm's dispute window and its payout-review window, and treat that as your floor. Both windows are firm-specific and change, so read the current rules document rather than assuming.

For a design analogue rather than an obligation, 17 CFR 1.31 requires a records entity to keep each regulatory record "for a period of not less than five years from the date on which the record was created" and to keep electronic regulatory records "readily accessible for the duration of the required record keeping period." A records entity is a person required by the Commodity Exchange Act or Commission regulations to keep regulatory records, which an individual funded trader running a copier is not. None of this is legal advice, and whether a recordkeeping rule reaches you is a question for a lawyer or compliance professional. Borrow the standard anyway: "readily accessible for the whole period" is a sharper target than "archived somewhere in a tarball."

Store logs outside the copier's own server. If that server fails, a log kept only on it destroys the evidence of what it did at precisely the moment you needed that evidence. Append-only, write-once storage is worth more than a bigger log, because a record that can be silently edited afterwards is weak evidence and a firm reviewing a dispute has no reason to weight it heavily. Ship records off-box on write, to object storage or a separate host.

Then verify the export path before you need it. Confirm you can produce a human-legible file, CSV or JSON lines, headers present, UTC timestamps, one row per event, over an arbitrary date range, and re-test quarterly. A log you cannot export is not a log. It is a database you hope someone will help you query in the middle of an argument. This belongs with the rest of your pre-live verification work: cheap to check on a quiet Tuesday, impossible to check under pressure.

What this costs, and when it is not worth building

Storage is not a real objection. Take a per-event record of roughly 400 bytes as a JSON line, six recorded events per copied order (master fill, sizing computation, risk check, order submitted, broker ack, broker fill), and a desk whose master produces 40 fills a day across 12 follower accounts. Events per day = 40 x 12 x 6 = 2,880, so bytes per day = 2,880 x 400 = 1,152,000, about 1.15 MB. Over 260 trading days that is 748,800 events and 748,800 x 400 = 299,520,000 bytes, roughly 300 MB per year uncompressed, and JSON lines compress well. Measure your own record size, because 400 bytes is illustrative. Tools ship thin logs not because of byte cost but because logging decisions requires the code to be structured around explicit decision points.

Latency is the honest tradeoff. Write all six records synchronously at an illustrative 2 ms per durable write and you add 6 x 2 = 12 ms to every copied order. Across a day that totals 40 x 12 x 12 ms = 5,760 ms, meaningless in aggregate, but the 12 ms sits on the critical path of every order, where it converts into slippage. The compromise is neither blocking the trade path nor skipping the record: append to an in-memory ring buffer or write-ahead log on the hot path, and flush asynchronously to off-box storage. You accept a small window in which a hard crash loses the last few records, in exchange for keeping fsync latency off every order. Measure the real per-write cost yourself, because it varies by orders of magnitude between a local NVMe fsync and a network volume.

There is a case where none of this is the answer. If you run two accounts and place three trades a week, broker statements plus a spreadsheet give you everything a copier log would, with no extra failure surface and nothing new to maintain. Audit infrastructure is justified by fleet size and dispute exposure, not by principle. Building it for two accounts is a hobby, not risk management.

And a limit that holds even at scale: your copier's log is your evidence, not the authoritative record. In a dispute, the firm's platform records and the broker's records are what the firm treats as canonical. A copier log wins arguments by being consistent with those records and by explaining causation, showing that a specific input produced a specific decision at a specific millisecond. It does not override them when they disagree. Build it to corroborate, not to contradict.

Frequently asked questions

What should a trade copier log record for each copy event?

Each copy event should record eleven things: the master fill with instrument, side, quantity, price and the venue's own timestamp; the copier's receipt time; the sizing inputs exactly as read at that instant; the computed size before rounding; the size after rounding with the rounding mode; the symbol mapping applied; every risk check with its compared value and verdict; the order as submitted with your client order ID; the broker acknowledgment with the broker's order ID; the fill as reported with the broker's timestamp and quantity; and any error, rejection or retry. Each field exists because a specific failure is invisible without it. Outcome fields alone cannot verify themselves.

Why does my follower account end up with fewer contracts than the ratio implies?

Almost always rounding, because futures contracts are integer-only and a computed fractional size has to collapse to a whole number. A master fill of 3 contracts at a 0.6 ratio computes to 1.8, and floor rounding submits 1, giving a realized ratio of 1 / 3 = 33.33% against a configured 60%. Floor rounding under-copies every fractional result in the same direction, so the gap compounds instead of averaging out. Copying into micro contracts, where 1 ES equals 10 MES, multiplies size granularity by ten and can remove the error entirely, subject to your firm permitting micros.

What is the difference between logging and reconciliation?

Logging records what your copier did; reconciliation checks whether what it believes is still true. Reconciliation periodically compares the copier's internal position state for each account against the broker's authoritative reported positions and resolves any difference explicitly. A perfect log with no reconciliation still leaves you holding a wrong position count after a disconnect, because the log only knows about events the copier actually saw.

When should a copier reconcile positions with the broker?

Reconcile at four moments: on startup, on reconnect after any disconnection, on a routine interval during the session, and after any order submit that timed out or errored ambiguously. Startup matters because internal state begins empty or stale. Reconnect matters because events that occurred during the outage are gone permanently. The ambiguous-submit case matters because you genuinely do not know whether the order reached the market.

Should the copier place orders to fix a position discrepancy automatically?

No, not by default. Correcting the internal ledger to match the broker is safe and should be automatic, but firing orders to close a detected gap is a trade placed from data you just admitted was unreliable. If the discrepancy came from stale state during a disconnect, a corrective order can double the position instead of flattening it. Auto-correction of the market position belongs behind an explicit gate with a human alert.

Why do I need the broker's order ID in my log and not just my own?

Because the broker's order ID is the only identifier that appears in both sets of records. Your client order ID exists solely in your system, so it cannot be cross-referenced with anything the firm or broker holds. The broker's ID appears on their execution records and on the account statement, which makes it the join key that lets an independent reviewer match your log line to their evidence.

What timestamp format should copier logs use?

ISO 8601 in UTC with an explicit offset or trailing Z, at millisecond precision, and store two timestamps per event: the venue-reported time and your own clock. Local times without a zone are ambiguous, because a 5:00 PM New York reset is 21:00 UTC in summer and 22:00 UTC in winter. Storing both clocks also makes any drift in your own machine visible and provable rather than silent.

How long should I keep copier logs, and where?

Keep them at least as long as the longer of your firm's dispute window and its payout-review window, and store them outside the copier's own server. If the server fails, logs kept only on that server destroy the evidence of what it did at exactly the moment you need it. Append-only, write-once storage carries more weight in a review than a larger log that could have been edited afterwards. Firm windows vary and change, so check the current rules document.

Does comprehensive per-event logging slow down copying?

It does if you write synchronously on the trade path, and that cost lands on every single order. Six durable writes per copied order at an illustrative 2 ms each adds 12 ms, which shows up as slippage rather than as a throughput problem. The fix is to append to an in-memory ring buffer or write-ahead log on the hot path and flush asynchronously to off-box storage, accepting a small window where a hard crash loses the last few records. Measure your own per-write cost, because it varies widely by storage type.

Is a copier audit trail worth building for a two-account setup?

No. If you run two accounts and place a handful of trades a week, broker statements plus a spreadsheet already give you everything a copier log would, with no additional infrastructure to maintain or break. Audit tooling is justified by fleet size and dispute exposure, not by principle. The case for it grows with the number of follower accounts and the size of the payout at stake.