I mentioned "even when costs are set to 0" just to say that Spread is forced to 0, and it could not have been somehow 'mistakenly' used in calculating the exit price ( even if it shouldn't for short trades anyway).

The difference between TradePriceClose=1.07309 and close/open=1.07305(ask) is exactly the spread from the asset list file.
Quote
Lifetime lets the trade exit at next open, not at current close. So you were possibly comparing the wrong prices.
- Logs are exactly to avoid 'possibility' and ensure 'certainty'. But my OP was not about the price; it was about the TradeBarClose.
With LifeTime, you get:
Quote
[5240: Fri 22-06-03 14:30] 11.04 -1.43 59/49 (1.07305)

[EUR/USD::S23753] Expired 1@1.07305: -1.44 at 15:00:00 < -in live, it will exit at 1430+...but TradeBarClose=5241.

[5241: Fri 22-06-03 15:00] 11.03 0 59/49 (1.07230)..
With if (tod()==1430) exitShort(); you get:
Quote
[5240: Fri 22-06-03 14:30] 11.04 -1.43 59/49 (1.07305)

[EUR/USD::S23753] Expired 1@1.07305: -1.44 at 14:30:00 <- same as above.... but TradeBarClose=5240.

[5241: Fri 22-06-03 15:00] 11.03 0 59/49 (1.07230).
In reality, its exactly same moment in time ( tick at or after 1430) and the same exit price, yet 2 different treatments (in TradeBarClose).