You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: demo/simulator/README.md
+19-16Lines changed: 19 additions & 16 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,23 +21,23 @@ This project exists for the concrete checks below.
21
21
22
22
### 1. Is there a profitable corridor at all?
23
23
24
-
One `Simulator.run` over the whole feed: each idea gets ONE asynchronous candle pass from the minute after its publication (the horizon is the grid's longest hold — 72h here, no hidden engine constant; wick-honest execution — exits by high/low, never close-to-close, stop wins inside an ambiguous candle, fees and slippage on both legs), and the outcome of **any** grid point is derived from the profiles arithmetically. The grid is deliberately small — **48 points of hard stop × hold × ban rule** — because the profit-harvesting machinery is switched off: a position is entered on a proven author's idea and exits by time or catastrophe stop, nothing else. If no point of even this primitive corridor is profitable on its own training range, the feed carries no extractable signal — full stop.
24
+
One `Simulator.run` over the whole feed: each idea gets ONE asynchronous candle pass from the minute after its publication (5-day horizon, wick-honest execution — exits by high/low, never close-to-close, stop wins inside an ambiguous candle, fees and slippage on both legs), and the outcome of **any** grid point is derived from the profiles arithmetically. The grid is deliberately small — **48 points of hard stop × hold × ban rule** — because the profit-harvesting machinery is switched off: a position is entered on a proven author's idea and exits by time or catastrophe stop, nothing else. If no point of even this primitive corridor is profitable on its own training range, the feed carries no extractable signal — full stop.
25
25
26
26
### 2. How much does the window cut?
27
27
28
-
Before any trading logic runs, the feed passes the honesty filters: NEUTRAL ideas dropped, flood deduplicated (at most one idea per author per direction per 8 hours — reposting a call must not inflate a track record or retrigger entries). The probe reports the cut explicitly: **421 BTCUSDT ideas → 300 directional survivors**. A feed that mostly evaporates here is a feed of reposts, not signals.
28
+
Before any trading logic runs, the feed passes the honesty filters: NEUTRAL ideas dropped, flood deduplicated (at most one idea per author per direction per 8 hours — reposting a call must not inflate a track record, retrigger entries or keep a consensus vote alive). The probe reports the cut explicitly: **421 BTCUSDT ideas → 300 directional survivors**. A feed that mostly evaporates here is a feed of reposts, not signals.
29
29
30
30
### 3. Does anyone survive the ban?
31
31
32
-
Ban is the **default**: an author is allowed only when his correctness is unambiguously proven — enough ideas with a fully observed outcome at a sufficient hit rate. Correctness here is graded by `close` inside each point's OWN hold window — a 24h point judges its authors by the 24h close, a 72h point by the 72h close: the author is graded on exactly the event the point trades (the probe runs lock-free, and the level-graded metrics `reach`/`retain` require a lock by construction). The probe answers how many authors clear the bar: **8 of 154** under the winning rule (48h window, track ≥ 5, hit rate ≥ 0.5 — 146 banned, the long-posting crowd included). An empty whitelist is a disqualifying verdict no parameter sweep can fix.
32
+
Ban is the **default**: an author is allowed only when his correctness is unambiguously proven — enough ideas with a fully observed outcome at a sufficient hit rate. The probe answers how many authors clear the bar: **7 of 154** under the winning rule (track ≥ 5, hit rate ≥ 0.5 — 147 banned, the long-posting crowd included). An empty whitelist is a disqualifying verdict no parameter sweep can fix.
33
33
34
34
### 4. The mechanics are deliberately primitive
35
35
36
-
The probe must not try to EARN — that is `demo/tune`'s territory. Every profit-harvesting mechanism is pinned off: `profitLockPercent: [0]`, the trailing take is inert (`[100]` never arms); any idea of a proven author triggers an entry — the engine grades authors strictly in isolation, no interaction metrics exist. What remains swept is only what the feasibility question needs: the catastrophe stop (2–7%), the hold (24–72h) and the ban rule (track 3/5 × rate 0.5/0.6). A probe that tunes the harvest on its own training range would overfit the very question it is asking.
36
+
The probe must not try to EARN — that is `demo/tune`'s territory. Every profit-harvesting mechanism is pinned off: `profitLockPercent: [0]`, the trailing take is inert (`[100]` never arms), the weighted consensus and the Wilson bound are disabled, one proven aligned author is enough to enter. What remains swept is only what the feasibility question needs: the catastrophe stop (2–7%), the hold (24–72h) and the ban rule (track 3/5 × rate 0.5/0.6). A probe that tunes the harvest on its own training range would overfit the very question it is asking.
37
37
38
38
### 5. The probe answers a boolean, tune finds the edge
39
39
40
-
The result still carries ranking winners (time-based Sharpe/Sortino over daily equity increments — frozen capital is not free — plus total PnL and recovery factor) with full trade lists, hold-time tail percentiles and per-trade `absorbedIdeaIds` — but they are **evidence for the verdict, not candidates**. The parameter search (the lock, the trailing, the rule arithmetic) belongs to `demo/tune` with its walk-forward split, and the final arbiter for anything picked there is always a real engine backtest (`Backtest.run`).
40
+
The result still carries ranking winners (time-based Sharpe/Sortino over daily equity increments — frozen capital is not free — plus total PnL and recovery factor) with full trade lists, hold-time tail percentiles and per-trade `absorbedIdeaIds` — but they are **evidence for the verdict, not candidates**. The parameter search (the lock, the trailing, the consensus, the rule arithmetic) belongs to `demo/tune` with its walk-forward split, and the final arbiter for anything picked there is always a real engine backtest (`Backtest.run`).
41
41
42
42
## Actual Results (June 2026, BTCUSDT, full feed)
43
43
@@ -47,20 +47,20 @@ The committed artifact is [`assets/simulator.done.json`](https://github.com/trip
47
47
|---|---|
48
48
| Ideas in feed (BTCUSDT) | 421 total → 300 after NEUTRAL + flood dedupe |
49
49
| Profiles built | 300, none truncated |
50
-
| Author filter |**8 allowed / 146 banned** (winning rule: 48h window, track ≥ 5, hit rate ≥ 0.5) — 12 ban dictionaries total, one per window × rule|
The verdict for this feed: **`true` — there is an edge to search.** Not because +23.3% is money anyone will earn (train-on-train, a ceiling by construction), but because the evidence stacks with the harvesting machinery OFF: 41 of 48 points are profitable, and the corridor covers EVERY hold once authors are judged by the window their point actually trades — 14/16 at 24h, 15/16 at 48h, 12/16 at 72h (under the old shared-horizon grading the short holds looked dead only because their authors were graded on a 72h event). The signal is the direction of the ideas, not exit engineering: 12 of the sharpe winner's 14 exits are the plain hold cap (`time_expired`), two are the stop. The rankings split between two honest shapes — faster turnover on the strictest track (48h, track ≥ 5: sharpe 1.69 on 14 trades) and a calmer 72h point (track ≥ 3, rate ≥ 0.6: +23.3% at dd 3.3) — and 8 authors survive the winner's scrutiny: TradingShot 10/15, XAUxBTC_Pro 5/6, CryptoSkullSignal 4/8, Cryptollica 3/6, InvestingScope 3/6, melikatrader94 3/5, CandleKing09 3/5, Vili_Wealth_Plan 3/5.
63
+
The verdict for this feed: **`true` — there is an edge to search.** Not because +19.8% is money anyone will earn (train-on-train, a ceiling by construction), but because the evidence stacks with the harvesting machinery OFF: half the primitive grid is profitable, and the corridor widens monotonically with the hold — 14 of 16 points at 72h. The signal is the direction of the ideas, not exit engineering: 9 of the sharpe winner's 10 exits are the plain hold cap (`time_expired`), one is the stop. All four criteria converge on hold = 72h and the strictest track ≥ 5, and 7 authors survive that scrutiny — a population worth whitelisting: TradingShot 9/15, MarketStrategysignals 5/8, PremiumTrader57 5/8, XAUxBTC_Pro 4/6, Cryptollica 3/6, InvestingScope 3/6, melikatrader94 3/5.
64
64
65
65
## Project Structure
66
66
@@ -107,13 +107,16 @@ addSimulatorSchema({
107
107
// инертен: проба не собирает прибыль, выход — по времени или стопу
108
108
trailingTakePercent: [100],
109
109
holdMinutes: [24*60, 2*24*60, 3*24*60],
110
+
// одного проверенного автора достаточно — консенсус не перебираем
111
+
minIdeasAligned: [1],
110
112
// правило бана — единственная перебираемая "умность" пробы
111
113
minAuthorTrack: [3, 5],
112
114
minAuthorHitRate: [0.5, 0.6],
115
+
minAuthorWilson: [0],
116
+
minWeightAligned: [0],
113
117
profitLockPercent: [0],
114
-
// close: закрытие 5-дневного горизонта в сторону идеи — у пробы
115
-
// замок выключен (lock=0), уровневым метрикам грейдить нечем
116
118
authorMetric: ["close"],
119
+
banCriteria: ["sharpe", "pnl"],
117
120
},
118
121
reportOrder:"sharpe",
119
122
});
@@ -127,7 +130,7 @@ The probe's answer is a single boolean, assembled from three checks in order of
127
130
128
131
1.**The whitelist size** (`allowedAuthors`). Zero → **`false`** immediately, regardless of anything else — nobody survives proof, nothing to follow. `authorStats` behind it carries the raw evidence (ideas with known outcome, hits, hit rate).
129
132
2.**The window cut** (`ideasTotal` → `ideasDirectional`). A feed that mostly evaporates into reposts and NEUTRAL noise → **`false`**: not enough workable signals to ever clear the anti-fluke floors.
130
-
3.**The profitable corridor** (`reports` — a dictionary keyed by the point's author metric, every bucket sorted by Sharpe; the probe's single-metric grid lands entirely in one bucket: count the positive-PnL share and how it distributes over the hold axis; `best` — ranking winners with full trade lists as the corridor's evidence; `p95/p99HoldMinutes` — eternal holds pinned at the cap are visible instantly). Train-on-train by construction — an upper bound, never a promise of earnings. Its only legitimate reading: if even this primitive, harvest-free ceiling is unprofitable → **`false`**, stop here.
133
+
3.**The profitable corridor** (`reports` — every point of the primitive grid, sorted by Sharpe: count the positive-PnL share and how it distributes over the hold axis; `best` — ranking winners with full trade lists as the corridor's evidence; `p95/p99HoldMinutes` — eternal holds pinned at the cap are visible instantly). Train-on-train by construction — an upper bound, never a promise of earnings. Its only legitimate reading: if even this primitive, harvest-free ceiling is unprofitable → **`false`**, stop here.
131
134
132
135
All three pass → **`true`**: the feed graduates to [`demo/tune`](https://github.com/tripolskypetr/backtest-kit/tree/master/demo/tune) — walk-forward training on the head of the feed and one frozen out-of-sample shot on the tail. A `false` is an answer too, and a much cheaper one than a month of forward testing on a dead feed.
0 commit comments