Data audit
Transparency & Verification
This page separates what is proven from what is modelled. The signal result, the modelled result and the exchange-verified result are three separate numbers and are never merged.
Three kinds of result
Signal Result
What the signal did against its own published levels: which take-profit rung it reached, what closed it, win or loss. Source: our database, recorded from the market price feed.
DatabaseModeled Result
Return on margin computed from price levels, not from an order fill. It includes no fee, no funding and no position size.
ModeledExchange-Verified Result
Net PnL from fills the exchange itself reported, with fees and funding. Shown only where exchange data is recorded.
VerifiedData status badges
- Verified
- 0 trades — Exchange-reported entry AND exit fills, a realised PnL (reported by the exchange or derived from those fills), the fee and the funding are all recorded for this trade in exchange_executions, from publishable rows.
- Partially Verified
- 0 trades — At least one exchange-reported fill is recorded for this trade, but not the full set that 'verified' requires — the fields that are missing are listed per trade.
- Modeled
- 260 trades — No exchange fill is recorded. The result is computed from the published price levels and the market price feed (positions.pnl_percent_on_close / realized_pnl_pct). It is not an execution and carries no fee or funding.
- Unavailable
- 0 trades — Neither an exchange fill nor a modelled result exists for this trade.
Date range
Performance dashboard
Every number is computed from persisted database rows, and each carries its formula.
A. Modeled
ModeledDrawdown and cumulative return depend on one assumption: 2% of equity as margin per trade, one trade at a time, no fees or funding. A model, not an account balance.
| Metric | Value | Unit | Source | Formula |
|---|---|---|---|---|
| Total trades | 260 | count | Database | COUNT(closed gradeable trades in range) |
| Wins | 164 | count | Modeled | COUNT(roi > 0) |
| Losses | 96 | count | Modeled | COUNT(roi <= 0) |
| Win rate | +63.08% | % | Modeled | wins / total_trades * 100 |
| Gross profit | +4,512.40 (افزایش) | ROI points (sum of %, not a portfolio return) | Modeled | SUM(roi WHERE roi > 0), ROI points |
| Gross loss | -1,568.87 (کاهش) | ROI points (sum of %, not a portfolio return) | Modeled | SUM(roi WHERE roi <= 0), ROI points (negative) |
| Net result | +2,943.53 (افزایش) | ROI points (sum of %, not a portfolio return) | Modeled | SUM(roi) over all trades, ROI points — NOT a portfolio return |
| Profit factor | 2.876 | ratio | Modeled | gross_profit / |gross_loss| |
| Average win | +27.51% (افزایش) | % of margin | Modeled | gross_profit / COUNT(roi > 0) |
| Average loss | -16.34% (کاهش) | % of margin | Modeled | gross_loss / COUNT(roi <= 0) |
| Realised risk/reward | 1.684 | ratio | Modeled | avg_win / |avg_loss| |
| Planned risk/reward (TP1) | 1.102 | ratio | Database | MEAN(|TP1 - entry| / |entry - SL|) over trades with both levels |
| Maximum drawdown | -3.34% (کاهش) | % | Modeled | min over trades of (equity / running peak - 1) * 100; equity_n = equity_(n-1) * (1 + allocation/100 * roi/100), ordered by closed_at |
| Cumulative return | +79.42% (افزایش) | % | Modeled | (equity_final / 100 - 1) * 100 on the same curve |
| Consecutive wins (max) | 14 | count | Modeled | longest run of roi > 0, ordered by closed_at |
| Consecutive losses (max) | 6 | count | Modeled | longest run of roi <= 0, ordered by closed_at |
B. Exchange-Verified
UnavailableVerified execution coverage: 0.0% of closed trades (0 of 260)
Exchange execution data unavailable
Monthly returns
| Month | Trades | A. Modeled return (%) | ROI points | Win rate | B. Verified coverage | B. Realized return on margin |
|---|---|---|---|---|---|---|
| 2026-05 | 104 | -5.80% (کاهش) | -259.2 (کاهش) | 59.6% | 0.0% | Exchange execution data unavailable |
| 2026-06 | 477 | +75.35% (افزایش) | +2,843.4 (افزایش) | 58.7% | 0.0% | Exchange execution data unavailable |
| 2026-07 | 507 | +16.38% (افزایش) | +780.6 (افزایش) | 60.6% | 0.0% | Exchange execution data unavailable |
| 2026-08 | 271 | +48.85% (افزایش) | +2,001.0 (افزایش) | 64.9% | 0.0% | Exchange execution data unavailable |
| 2026-09 | 220 | +67.28% (افزایش) | +2,591.0 (افزایش) | 64.5% | 0.0% | Exchange execution data unavailable |
Drawdown and cumulative return depend on one assumption: 2% of equity as margin per trade, one trade at a time, no fees or funding. A model, not an account balance.
Audit & data integrity
For each kind of evidence: how many trades carry it, out of how many, and its source.
| Evidence | Count | Coverage | Source |
|---|---|---|---|
| Closed trades A trade enters the public record when it has closed (closed_at IS NOT NULL), has a recorded realised ROI (pnl_percent_on_close IS NOT NULL AND <> 0), and was not closed by a risk-engine housekeeping action. Nothing else is filtered — every loss is included. A WIN IS THE SAME TEST ON EVERY BASIS — a trade whose ROI on that basis is strictly greater than zero — and every metric says which basis it used. What differs between the bases is the ROI, not the verdict: basis=ladder (the default) measures a trade at the highest take-profit rung its price reached, on the full position, while recorded and blended measure it at its final exit. How often price reached a rung is published separately, as success_rate_pct and reach_pct, and is a different and smaller number than the win rate. The universe itself — which rows are graded at all — is identical on all three bases, so the three answers are three readings of one set of trades and not three different samples. | 260 / 260 | 100.0% | Database |
| Telegram proof positions.telegram_message_id IS NOT NULL — the signal message id was stored before the outcome | 243 / 260 | 93.5% | Telegram |
| Copy-trade entry order acknowledged At least one follower account's entry order for this signal was accepted by the exchange API (trade_execution_logs stage=entry, status=ok). Proves the order was sent; records no fill. | 151 / 260 | 58.1% | Exchange |
| Exchange order id An exchange-assigned order id is stored in exchange_executions (publishable rows). positions.order_id is NULL on every row and copy-trade logs keep only our client_order_id. | 0 / 260 | 0.0% | Exchange |
| Verified entry fill An exchange-reported entry fill (quantity and average price) in exchange_executions. | 0 / 260 | 0.0% | Exchange |
| Verified exit fill An exchange-reported exit fill (quantity and average price) in exchange_executions. | 0 / 260 | 0.0% | Exchange |
| Realized PnL Net realised PnL computable from exchange data: gross (reported or fill-derived) - fees + funding. | 0 / 260 | 0.0% | Exchange |
| Modelled result A recorded and/or ladder ROI computed from price levels. Every gradeable trade has one. | 260 / 260 | 100.0% | Modeled |
Last data update
- positions_last_closed_at
- positions_last_created_at
- position_events_last_at
- copytrade_log_last_at
- exchange_executions_last_recorded_at
- not available
- snapshot_loaded_at
What was never stored
- positions.order_id, exit_price, quantity, pnl_usdt — NULL on every row
- order_fills — empty; partial_close_log volume_closed = 0 and order_id NULL on every row
- copy-trade: exchange order id, average fill price, fill time, fee, funding, realised PnL
- account balance / equity — no USDT return on capital can be computed
Independent third-party audit: Not available
PnL reconciliation
For every trade, independently stored numbers are compared with each other and with an independent recompute. Differences beyond the tolerance are flagged, not hidden.
Tolerance: 0.5 ROI points · Flagged trades: 188 / 260
| Check | Compared | Flagged | Flag rate | Largest delta |
|---|---|---|---|---|
| Stored ROI ↔ closing-event ROI positions.pnl_percent_on_close against the ROI the same monitor wrote on the closing position_events row. Two tables, one exit: they should agree exactly. | 245 | 0 | 0.0% | — |
| Stored ROI ↔ ROI from exit-event price positions.pnl_percent_on_close against ROI recomputed from entry_price and the closing event's price_at_event: (exit-entry)/entry*leverage*100, sign-flipped for SHORT. Differs by design on stop exits, where the stored ROI models the fill at sl +/- 0.10 %. | 245 | 186 | 75.9% | TYR-260925-588VSAJJ (16.01) |
| Stored ROI ↔ ROI from observed exit price positions.pnl_percent_on_close against ROI recomputed from signal_quality_metrics.exit_price, the market price seen when the exit was detected. | 237 | 186 | 78.5% | TYR-260925-588VSAJJ (16.01) |
| Ladder ROI ↔ independent recompute positions.realized_pnl_pct against the ladder rule re-applied independently (SPEC section 2): max(ROI of the highest rung reached, ROI of the recorded exit), where the rung ROI is the TP_HIT event's announced ROI, or ROI(entry, published TP price) when no event carries one. | 260 | 2 | 0.8% | TYR-260915-DI9E1XL0 (140.31) |
| Fraction-weighted ROI ↔ weighted legs positions.laddered_pnl_pct against sum(frac * roi) over the same pnl_legs. | 260 | 0 | 0.0% | — |
| TP event ROI ↔ published target Every TP_HIT event's stored ROI against ROI recomputed from entry_price and that rung's published price. The largest absolute difference across the trade's rungs is reported. | 161 | 0 | 0.0% | — |
| Exchange ROI ↔ modelled ROI Exchange-verified realised ROI (net of fees and funding, on entry margin) against the modelled recorded ROI. Only computable for a verified trade. | No exchange data | 0 | در دسترس نیست | — |
| Exchange fees and funding Fees and funding as reported by the exchange. There is no modelled counterpart: the model excludes both, so this check reports availability, not a delta. | No exchange data | 0 | در دسترس نیست | — |