######## CELL 83 [markdown] ## 23. Two risks, one account: high to pass, low to be paid (2026-09-27) **The question.** The paper's cell risks 4 percent a trade in both stages because 4 percent is the fastest way through the assessment. The operator now wants the funded account to pay out often and to draw down slowly, so that its record reads as trading rather than as a coin flip, and asks whether the two stages should run at different risks: high to pass, low once funded. Two further readings are now assumed rather than open. The drawdown floor is enforced on every tick, so a losing trade is cut at the floor and never past it. And the funded account starts at the nominated balance. The wallet is \$1,000, which puts it on the \$3,000 tier by the rule of section 6. #### Concepts used in this section **Two-stage risk.** What it is: one risk per trade during the assessment, another once funded. How it is used: the funded account is a new account, so the change is a setting at the moment of funding, and the wallet process of section 6 switches risk when an account is promoted. How it affects the result: the assessment's pass rate rises with risk, because fewer trades means less commission drag, while the funded account's chance of ever paying rises as risk falls, because the 35 percent rule needs profit of at least the win size over 0.35 before a payout, and a small win clears that early. Expected against found: below. **The floor on the tick.** What it is: the firm closes the position the instant equity touches the 9 percent floor. How it is used: the stop leg of any trade near the floor is shrunk to the floor, and in a fair game the trade's win probability falls with it, b over a plus b for legs a and b. How it affects the result: at 4 percent risk it costs the published pass rate 7 points and removes the overshoot past the floor that made 4 percent look best for funded extraction; at 1 percent the shrunk leg is at most 1 percent, so it costs little. Expected against found: below. **The minimum request, per tier.** What it is: a payout must be at least \$100 after the 70 percent split, so \$143 gross. How it is used: the funded simulations of section 4 used its size at the \$100,000 tier, 0.14 percent of the bankroll; at the \$3,000 tier it is 4.8 percent. How it affects the result: at small risk the first payout waits for this minimum rather than for the 35 percent rule, and the account may die first. Expected against found: below. #### Briefing, stated before scoring - **Grid.** Assessment risk 2, 2.5, 3 and 4 percent; funded risk 1, 1.5, 2 and 4 percent, the last as the published reference. Reward-to-risk 1, the floor enforced on the tick in both stages, the target clipped in the assessment. Cost is the paper's, commission plus 0.5-pip spread at the deployed stop, so it scales with the risk. - **Assessment.** The exact chain and the real EURUSD path of section 9 at the deployed stop, entries in the strategy's window: pass rate, trades to resolve, and calendar days at the measured pace. - **Funded, \$3,000 tier.** `prime.funded` with the tier's own minimum request, 60,000 accounts: chance of any payout, payouts per account, gross withdrawn, life, and the trade of the first payout. - **Wallet, \$1,000 on the \$3,000 tier.** `prime.wallet_mc` with the two risks, every payout honoured, 500 model trades: ruin, median days to first cash, chance of any cash, expected log growth. - **Ranking rule.** Among cells whose median time to first cash is within 120 calendar days, take the highest chance of any payout, and report what it gives up in pass rate and growth against the published 4 and 4. The 120 days is the operator's to move. - **What it cannot see.** Every payout is assumed honoured, so growth is a comparison between cells and not a forecast. The funded stage runs on the lattice, not on real prices. Whether a record of many small payouts reads as trading to the firm is a judgement no simulation makes. ######## CELL 84 [code] from src.notebooks.reports.topics.open_timeflow.modules import timeflow as TF T3 = next(t for t in TIERS if t.bankroll == 3000) W0_23, MAX_FIRST_CASH_DAYS = 1000, 120 RA = (0.02, 0.025, 0.03, 0.04) # assessment risks RF = (0.01, 0.015, 0.02, 0.04) # funded risks, 4% the published reference MIN_GROSS_3K = 100.0 / SPLIT / T3.bankroll # the deployed stop on the real path: 0.75 of yesterday's filtered sigma, floored at 30 pips, entries 07:00-10:00 UTC bars23 = FX.load(REPO / "historical_data/EURUSD/ohlcv_3600/eurusd_1h.parquet") d_close23 = pd.Series(bars23["c"]).groupby(bars23["day"]).last().to_numpy() sig_prev23 = np.r_[np.nan, TF.sigma_kf(d_close23, rho_v=0.0025)[:-1] / FX.PIP][bars23["day"]] warm23 = bars23["day"] > TF.SIGMA_SEED_N stop23 = np.where(warm23, np.maximum(0.75 * np.nan_to_num(sig_prev23), 30.0), 30.0) ts23 = pd.read_parquet(REPO / "historical_data/EURUSD/ohlcv_3600/eurusd_1h.parquet").ts_event.astype("int64").to_numpy() ts23 = ts23 // 10**9 if ts23.max() > 10**12 else ts23 sod23 = ts23 % 86400 allow23 = warm23 & (sod23 >= 7 * 3600) & (sod23 < 10 * 3600) rows = [] for ra in RA: ch = PA.p_pass_clipped(ra, GAMMA * ra, clip_up=True, clip_dn=True, rr=RR) ch_nc = PA.p_pass_clipped(ra, GAMMA * ra, clip_up=False, clip_dn=True, rr=RR) rp = FX.assess(bars23, ra, None, stop23, rr=RR, n_sims=10_000, seed=7, allow=allow23, clip_up=True, clip_dn=True) tau = rp["days_per_trade"] + rp["skipped_days_per_trade"] rows.append(dict(risk=ra, chain=ch["p_pass"], chain_unclipped=ch_nc["p_pass"], trades=ch["e_trades"], real=rp["p_pass"], real_trades=rp["trades_per_account"], tau=tau, cal_days=ch["e_trades"] * tau * 365 / 250)) df_a23 = pd.DataFrame(rows) TAU23 = float(df_a23.loc[df_a23.risk == 0.04, "tau"].iloc[0]) print("assessment, floor on the tick, target clipped (and unclipped, since clipping is not yet built)") print(df_a23.to_string(index=False, formatters={"risk": "{:.1%}".format, "chain": "{:.2%}".format, "chain_unclipped": "{:.2%}".format, "real": "{:.2%}".format, "trades": "{:.1f}".format, "real_trades": "{:.1f}".format, "tau": "{:.2f}".format, "cal_days": "{:.0f}".format})) print(f"\npace at the deployed stop: {TAU23:.2f} trading days per trade, used to turn trades into calendar days below") --- OUT: assessment, floor on the tick, target clipped (and unclipped, since clipping is not yet built) risk chain chain_unclipped trades real real_trades tau cal_days 2.0% 45.94% 43.96% 20.9 43.56% 21.3 1.64 50 2.5% 46.98% 45.00% 13.6 44.38% 13.7 1.62 32 3.0% 47.33% 41.36% 9.6 45.78% 9.8 1.60 22 4.0% 47.84% 41.63% 6.0 46.25% 6.0 1.55 13 pace at the deployed stop: 1.55 trading days per trade, used to turn trades into calendar days below ######## CELL 85 [code] rows = [] for rf in RF: for label, mg in (("$3,000 tier", MIN_GROSS_3K), ("minimum not binding", MIN_GROSS)): f = PA.funded(rf, GAMMA * rf, SPLIT, mg, seed=SEED, rr=RR, clip_dn=True) rows.append(dict(risk=rf, minimum=label, p_any=f["p_any"], payouts=f["e_npay"], gross=f["gross"], life=f["e_trades"], first_pay=f["med_first_pay"], first_pay_days=f["med_first_pay"] * TAU23 * 365 / 250, life_days=f["e_trades"] * TAU23 * 365 / 250)) df_f23 = pd.DataFrame(rows) print("funded stage, floor on the tick, 60,000 accounts; days are calendar days at the deployed pace") print(df_f23.to_string(index=False, formatters={"risk": "{:.1%}".format, "p_any": "{:.1%}".format, "payouts": "{:.2f}".format, "gross": "{:.2%}".format, "life": "{:.0f}".format, "first_pay": "{:.0f}".format, "first_pay_days": "{:.0f}".format, "life_days": "{:.0f}".format})) --- OUT: funded stage, floor on the tick, 60,000 accounts; days are calendar days at the deployed pace risk minimum p_any payouts gross life first_pay first_pay_days life_days 1.0% $3,000 tier 56.0% 1.27 7.07% 116 32 72 263 1.0% minimum not binding 64.6% 1.83 7.23% 107 22 50 241 1.5% $3,000 tier 54.9% 1.23 7.56% 58 18 41 131 1.5% minimum not binding 55.3% 1.24 7.57% 58 18 41 131 2.0% $3,000 tier 47.9% 0.92 7.69% 39 16 36 87 2.0% minimum not binding 47.9% 0.92 7.69% 39 16 36 87 4.0% $3,000 tier 30.4% 0.44 7.87% 16 14 32 37 4.0% minimum not binding 30.4% 0.44 7.87% 16 14 32 37 ######## CELL 86 [code] # the wallet with both risks, about a minute rows = [] for ra in (0.04, 0.025): for rf in RF: w = PA.wallet_mc(T3, ra, GAMMA * ra, SPLIT, 1.0, W0_23, horizon_days=HORIZON_DAYS, n=N_WALLET, seed=SEED, rr=RR, funded_risk=rf, funded_cost=GAMMA * rf, clip_up=True, clip_dn=True) fund = df_f23[(df_f23.risk == rf) & (df_f23.minimum == "$3,000 tier")].iloc[0] rows.append(dict(assess=ra, funded=rf, pass_rate=float(df_a23.loc[df_a23.risk == ra, "chain"].iloc[0]), p_any_payout=fund.p_any, payouts=fund.payouts, ruin=w["p_ruin"], first_cash_days=w["med_first_cash_days"] * TAU23 * 365 / 250, p_any_cash=w["p_any_cash"], growth=w["e_log_growth"])) df_w23 = pd.DataFrame(rows) print(f"wallet ${W0_23:,} on the {T3.bankroll:,} tier, every payout honoured, {HORIZON_DAYS} trades of horizon " f"(about {HORIZON_DAYS * TAU23 / 250:.1f} years at the deployed pace)") print(df_w23.to_string(index=False, formatters={"assess": "{:.1%}".format, "funded": "{:.1%}".format, "pass_rate": "{:.1%}".format, "p_any_payout": "{:.1%}".format, "payouts": "{:.2f}".format, "ruin": "{:.1%}".format, "first_cash_days": "{:.0f}".format, "p_any_cash": "{:.1%}".format, "growth": "{:+.3f}".format})) --- OUT: wallet $1,000 on the 3,000 tier, every payout honoured, 500 trades of horizon (about 3.1 years at the deployed pace) assess funded pass_rate p_any_payout payouts ruin first_cash_days p_any_cash growth 4.0% 1.0% 47.8% 56.0% 1.27 0.0% 183 99.2% +0.129 4.0% 1.5% 47.8% 54.9% 1.23 0.1% 114 99.9% +0.311 4.0% 2.0% 47.8% 47.9% 0.92 0.3% 113 100.0% +0.432 4.0% 4.0% 47.8% 30.4% 0.44 3.4% 129 98.4% +0.577 2.5% 1.0% 47.0% 56.0% 1.27 0.0% 235 97.7% +0.097 2.5% 1.5% 47.0% 54.9% 1.23 0.0% 169 99.7% +0.237 2.5% 2.0% 47.0% 47.9% 0.92 0.1% 172 99.6% +0.309 2.5% 4.0% 47.0% 30.4% 0.44 1.7% 217 97.8% +0.357 ######## CELL 87 [code] fig, axes = plt.subplots(1, 3, figsize=(12, 3.6)) f3 = df_f23[df_f23.minimum == "$3,000 tier"] axes[0].plot(100 * f3.risk, 100 * f3.p_any, "o-", color=PALETTE["BLUE"], label="chance of any payout") axes[0].plot(100 * f3.risk, 100 * f3.gross, "s-", color=PALETTE["ORANGE"], label="gross withdrawn, % of bankroll") axes[0].set_xlabel("funded risk per trade, %"); axes[0].legend(frameon=False, fontsize=8) axes[1].plot(100 * f3.risk, f3.first_pay_days, "o-", color=PALETTE["BLUE"], label="median days to first payout") axes[1].plot(100 * f3.risk, f3.life_days, "s-", color=PALETTE["MUT"], label="mean life, days") axes[1].set_xlabel("funded risk per trade, %"); axes[1].legend(frameon=False, fontsize=8) for ra, col in ((0.04, PALETTE["GREEN"]), (0.025, PALETTE["RED"])): d = df_w23[df_w23.assess == ra] axes[2].plot(100 * d.funded, d.growth, "o-", color=col, label=f"assessment at {ra:.1%}") axes[2].set_xlabel("funded risk per trade, %"); axes[2].set_ylabel("wallet log growth"); axes[2].legend(frameon=False, fontsize=8) for ax in axes: style_axes(ax) fig.suptitle("Funded risk against payout chance, timing and wallet growth, floor on the tick, $3,000 tier") fig.tight_layout() fig.savefig("src/notebooks/reports/topics/prime_academy/figures/two_stage_risk.png", dpi=130) plt.show() --- OUT:
######## CELL 88 [markdown] **Figure.** Left: the chance a funded account ever pays, and what it withdraws over its life, against the funded risk. Right: the wallet's growth for the two assessment risks. If the payout chance did not rise as risk fell, the 35 percent rule would not be the binding constraint and the case for a low funded risk would collapse. ######## CELL 89 [code] ok = df_w23[df_w23.first_cash_days <= MAX_FIRST_CASH_DAYS] pick = ok.sort_values(["p_any_payout", "growth"], ascending=False).iloc[0] if len(ok) else None ref = df_w23[(df_w23.assess == 0.04) & (df_w23.funded == 0.04)].iloc[0] if pick is None: verdict23 = f"NO CELL PAYS FIRST CASH WITHIN {MAX_FIRST_CASH_DAYS} DAYS AT THE MEDIAN" else: verdict23 = (f"ASSESS AT {pick.assess:.1%}, FUNDED AT {pick.funded:.1%}: any payout {pick.p_any_payout:.1%} against {ref.p_any_payout:.1%}, " f"pass rate {pick.pass_rate:.1%} against {ref.pass_rate:.1%}, growth {pick.growth:+.3f} against {ref.growth:+.3f}, " f"first cash {pick.first_cash_days:.0f} days against {ref.first_cash_days:.0f}") print(f"23 verdict by the declared rule (first cash within {MAX_FIRST_CASH_DAYS} days, then highest chance of any payout): {verdict23}") print() print("The strategy takes the risk as a constructor argument, so the change is one setting per stage; the target clip is not built.") --- OUT: 23 verdict by the declared rule (first cash within 120 days, then highest chance of any payout): ASSESS AT 4.0%, FUNDED AT 1.5%: any payout 54.9% against 30.4%, pass rate 47.8% against 47.8%, growth +0.311 against +0.577, first cash 114 days against 129 The strategy takes the risk as a constructor argument, so the change is one setting per stage; the target clip is not built. ######## CELL 90 [markdown] ## 24. The map through the broker (2026-09-28) **The question.** The paper's Section 14 maps the rates and durations of both stages over the reward-to-risk and the risk from exact chains. This section runs the same grid through the deployed strategy on `HistoricalBarBroker`, with the account rules on, and asks two things. Do the broker's rates agree with the chains cell by cell? And how many calendar days does each duration take, which the chains count only in trades? #### Concepts used in this section **Account cycling.** What it is: the strategy scores its own account after every trade and, in a replay, opens the next account when one ends: an assessment after a pass or a failure, a funded account after a death, or, in the lifecycle mode, a funded account after a pass. How it is used: one pass of the broker over the cohort yields many accounts. How it affects the result: accounts are back to back on one price path, so the accounts of one replay are not all independent of the next replay's. Expected against found: below. **Seeds.** What it is: the coin side is replayed under 20 seeds. The prices are shared; the directions are not. How it is used: every statistic is computed per seed, averaged over seeds, and its standard error taken between seeds, so whatever the seeds share through the price path widens the error rather than hiding in it. How it affects the result: about twenty times the accounts of a single replay, which is what makes the low-risk cells, a handful of accounts per replay, readable at all. Expected against found: below. **Agreement in standard errors.** What it is: broker minus chain over the between-seed standard error, per cell. How it is used: a map of it, and the share of cells beyond two. How it affects the result: with some two hundred cells about one in twenty should sit beyond two by chance, so a share near five percent is agreement and a share far above it is a fault. Expected against found: below. #### Briefing, stated before scoring - **Data.** EURUSD vendor hourly bars, `historical_data/EURUSD/ohlcv/3600/*.ohlcv.parquet`, 2023-11-24 to 2026-09-10, UTC. A bar has no path inside it; one reaching both legs books the stop. - **Executor.** `PrimeAcademyStrategy` with `set_account` on: the \$3,000 tier, target and floor 9 percent, the target clipped in the assessment, the stop at the floor in both stages, the 14-trade payout clock, the \$143 minimum request, the 35 percent rule. The deployed stop, entries 07:00 to 10:00 UTC, commission \$2.50 a side from `meta.json`, no spread, no swap, the news rule off. - **Grid.** Assessment: $RR$ 0.5 to 3 against risk 1 to 4.5 percent. Funded: $RR$ 0.5 to 3 against risk 0.5 to 4 percent. Per purchase: the two risks at $RR = 1$, lifecycle mode. 192 cells, 20 coin seeds each plus one short-side replay, `modules/broker_map.py`, cached. - **Reference.** The exact chains of the paper's Section 14 at the broker's own cost: commission only, 0.5 pip over the deployed stop's mean. The paper's deployment figures add the spread; the broker cannot, so the chains carry it once the broker has confirmed them. - **Rule.** A cell agrees when its gap is under two between-seed standard errors. The layer agrees when the share of cells beyond two is under ten percent, twice what chance gives. - **What it cannot see.** The spread and the swap; the equity between closes, since the account is scored at each completed trade; any effect of trading several accounts at once. ######## CELL 91 [code] from src.notebooks.reports.topics.prime_academy.modules import broker_map as BM from src.notebooks.reports.topics.prime_academy.modules.mapplot import heat # the chains at the broker's cost: commission only, over the deployed stop's mean on the entry bars bars24 = FX.load(REPO / "historical_data/EURUSD/ohlcv_3600/eurusd_1h.parquet") raw24 = pd.read_parquet(REPO / "historical_data/EURUSD/ohlcv_3600/eurusd_1h.parquet") ts24 = raw24.ts_event.astype("int64").to_numpy() ts24 = ts24 // 10**9 if ts24.max() > 10**12 else ts24 dclose24 = pd.Series(bars24["c"]).groupby(bars24["day"]).last().to_numpy() sig24 = np.r_[np.nan, TF.sigma_kf(dclose24, rho_v=0.0025)[:-1] / FX.PIP][bars24["day"]] entry24 = (bars24["day"] > TF.SIGMA_SEED_N) & (ts24 % 86400 >= 7 * 3600) & (ts24 % 86400 < 10 * 3600) STOP24 = float(np.mean(np.maximum(0.75 * sig24[entry24], 30.0))) G_COMM = PA.cost_share(STOP24, s=0.0) G_FULL = PA.cost_share(STOP24) print(f"deployed stop, mean over entry bars: {STOP24:.1f} pips") print(f"cost share: commission only {G_COMM:.2%} of risk (the broker's); with the 0.5-pip spread {G_FULL:.2%} (the paper's)") CH_E = {(rr, r): PA.eval_chain(r, G_COMM * r, rr=rr, clip_up=True, clip_dn=True) for rr in BM.RR for r in BM.RA} CH_F = {(rr, r): PA.funded_chain(r, G_COMM * r, PA.payout_threshold(r, rr, BM.BANKROLL, BM.SPLIT), rr=rr, clip_dn=True) for rr in BM.RR for r in BM.RF} print(f"chains: {len(CH_E)} assessment cells, {len(CH_F)} funded cells") --- OUT: deployed stop, mean over entry bars: 34.8 pips cost share: commission only 1.44% of risk (the broker's); with the 0.5-pip spread 2.87% (the paper's) --- OUT: chains: 64 assessment cells, 64 funded cells ######## CELL 92 [code] # the broker, from the cache the background sweep wrote; any cell missing is replayed here BR = {} for c in BM.cells(): res = BM.run_cell(*c) BR[c] = {"coin": BM.stats(res), "short": BM.stats(res, "short")} missing = [BM.key(*c) for c in BM.cells() if not (BM.CACHE / f"{BM.key(*c)}.json").is_file()] n_acc = [BR[c]["coin"].get("n_eval", BR[c]["coin"].get("n_funded")) for c in BM.cells() if c[0] != "life"] print(f"broker: {len(BR)} cells, {len(BM.SEEDS)} coin seeds each and one short replay; missing from cache: {len(missing)}") print(f"accounts per replay per cell: median {np.median(n_acc):.1f}, fewest {np.min(n_acc):.1f}, most {np.max(n_acc):.1f}") --- OUT: broker: 192 cells, 20 coin seeds each and one short replay; missing from cache: 0 accounts per replay per cell: median 21.6, fewest 0.8, most 160.6 ######## CELL 93 [code] def gap_grid(kind, stat, chain_stat, ys, xs, chains): rows_b, rows_z = [], [] for y in ys: rb, rz = [], [] for x in xs: b = BR[(kind, y, x, x)]["coin"] ref = chains[(y, x)][chain_stat] rb.append(b[stat]); rz.append((b[stat] - ref) / b[stat + "_se"] if b[stat + "_se"] > 0 else np.nan) rows_b.append(rb); rows_z.append(rz) return np.array(rows_b), np.array(rows_z) EB, EZ = gap_grid("eval", "p_pass", "p_pass", BM.RR, BM.RA, CH_E) FB, FZ = gap_grid("funded", "p_any", "p_any", BM.RR, BM.RF, CH_F) LZ = np.array([[(BR[("life", 1.0, ra, rf)]["coin"]["p_cash"] - CH_E[(1.0, ra)]["p_pass"] * CH_F[(1.0, rf)]["p_any"]) / BR[("life", 1.0, ra, rf)]["coin"]["p_cash_se"] for rf in BM.RF] for ra in BM.RA]) allz = np.concatenate([EZ.ravel(), FZ.ravel(), LZ.ravel()]) allz = allz[np.isfinite(allz)] share24 = float(np.mean(np.abs(allz) > 2)) print(f"THE DECLARED TEST: broker coin side, mean over seeds, between-seed SE, against the exact chains, {len(allz)} cells") for name, Z in (("assessment P(pass)", EZ), ("funded P(any payout)", FZ), ("per purchase P(cash)", LZ)): z = Z[np.isfinite(Z)] print(f" {name:22}: mean gap {z.mean():+.2f} SE, beyond 2 SE {np.mean(np.abs(z) > 2):.0%} of {len(z)}, largest {np.abs(z).max():.1f}") print(f" all cells: beyond 2 SE {share24:.1%}, against about 5% by chance") verdict24_declared = ("AGREES" if share24 < 0.10 else "DISAGREES") print(f" declared rule (under 10% beyond 2 SE): {verdict24_declared}") --- OUT: THE DECLARED TEST: broker coin side, mean over seeds, between-seed SE, against the exact chains, 192 cells assessment P(pass) : mean gap -1.60 SE, beyond 2 SE 41% of 64, largest 5.6 funded P(any payout) : mean gap -1.79 SE, beyond 2 SE 38% of 64, largest 9.0 per purchase P(cash) : mean gap -1.50 SE, beyond 2 SE 39% of 64, largest 11.0 all cells: beyond 2 SE 39.1%, against about 5% by chance declared rule (under 10% beyond 2 SE): DISAGREES ######## CELL 94 [markdown] #### Diagnosis, after the declared test failed The declared test fails: the broker reads below the chains far more often than chance allows. What follows was not declared before scoring. It is a sequence of checks, each run to find out why, and its conclusion is read as a diagnosis, not as a second test the broker passes. 1. **Is each trade fair?** Plain brackets, no account rules, 20 seeds at each ratio: the share of trades reaching the target against $1/(1 + RR)$, and the exits on a bar that reached both legs. 2. **Does the protocol bias the statistic?** The chains' own model run under the broker's protocol: the same trades per replay, accounts back to back, the account open at the end dropped, pooled over seeds. Its mean over 200 repetitions is what the broker should read if the market were the model. 3. **Is the error right?** The seeds share one price path, and one account can span months, so neither the seed nor the month is independent. The error is clustered in blocks of calendar time at least twice the mean account span, and a cell with fewer than ten such blocks is marked unresolvable by this history. 4. **Does the lot grid move it?** Lots floor to 0.01 on the \$3,000 tier, so the broker trades a little under the nominal risk. ######## CELL 95 [code] # 1. per-trade fairness, plain brackets through the broker, about two minutes FAIR24 = pd.DataFrame(BM.plain_winrates(BM.RR)) print("plain brackets, coin side, 20 seeds: share of trades reaching the target") print(FAIR24.to_string(index=False, formatters={"win": "{:.4f}".format, "fair": "{:.4f}".format, "gap_se": "{:+.1f}".format})) --- OUT: [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:46 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:47 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:48 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:48 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:48 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:48 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:48 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:49 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:50 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:51 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:52 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:53 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:53 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:53 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:53 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:54 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:55 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:56 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:57 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:58 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:58 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:58 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:58 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:14:59 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:00 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:00 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:00 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:00 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:01 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:01 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:01 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:01 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:02 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:03 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:03 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:03 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:05 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:05 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:05 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:05 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:07 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:08 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:08 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:08 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:08 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:09 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:09 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:09 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:09 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:10 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:10 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:10 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:10 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:11 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:12 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:12 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:12 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:12 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:13 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:13 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:13 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:13 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:13 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:14 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:15 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:15 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:15 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:15 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:16 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:17 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:17 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:17 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:17 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:18 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:19 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:19 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:19 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:19 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:20 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:21 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:22 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:22 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:22 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:22 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:23 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:24 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:24 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:24 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:24 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:25 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:26 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:27 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:27 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:27 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:27 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:28 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:29 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:29 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:29 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:29 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:30 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:31 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:31 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:31 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:31 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:31 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:32 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:33 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:34 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:35 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:35 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:35 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:35 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:36 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:37 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:38 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:38 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:38 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:38 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:39 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:39 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:39 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:39 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:40 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:41 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:41 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:41 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:41 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:42 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:43 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:44 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:44 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:44 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:44 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:45 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:46 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:47 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:47 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:47 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:47 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:48 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:49 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:49 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:49 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:49 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:50 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:51 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:51 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:51 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:51 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:52 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:52 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:52 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:52 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:52 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:53 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:54 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:55 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:56 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:57 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:57 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:57 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:57 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:58 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:15:59 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:15:59 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:15:59 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:15:59 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:00 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:01 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:01 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:01 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:01 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:02 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:02 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:02 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:02 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:03 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:03 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:03 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:03 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:03 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:04 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:05 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:05 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:05 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:05 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:06 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:07 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:07 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:07 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:07 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:08 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:09 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:09 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:09 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:09 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:10 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:11 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:11 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:11 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:11 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:12 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:13 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:14 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:14 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:14 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:14 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:15 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:16 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:17 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:18 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:19 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:19 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:19 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:19 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:20 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:21 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:21 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:21 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:21 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:22 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:23 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:24 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:24 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:24 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:24 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:24 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:25 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:26 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:27 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:27 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:27 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:27 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:28 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:29 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:29 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:29 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:29 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:29 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:16:30 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:16:31 UTC] [HistoricalBarBroker] Bar replay completed. plain brackets, coin side, 20 seeds: share of trades reaching the target rr trades win fair gap_se ties 0.50 11949 0.6561 0.6667 -3.5 13 0.75 10543 0.5698 0.5714 -0.5 0 1.00 9340 0.5016 0.5000 +0.4 0 1.25 8403 0.4456 0.4444 +0.3 0 1.50 7678 0.3862 0.4000 -3.3 0 2.00 6560 0.3255 0.3333 -1.6 0 2.50 5569 0.2819 0.2857 -0.9 0 3.00 4827 0.2411 0.2500 -1.4 0 ######## CELL 96 [code] # 2 and 3. the model under the broker's protocol, and the error in blocks as long as the accounts, about three minutes rows = [] for kind, risks, chains, key in (("eval", BM.RA, CH_E, "p_pass"), ("funded", BM.RF, CH_F, "p_any")): for rr in BM.RR: for r in risks: res = BM.run_cell(kind, rr, r, r) n_tr = [res["coin"][k]["entries"] for k in sorted(res["coin"], key=int)] p, se, span, blocks = BM.block_rate(res, kind) proto = BM.protocol_expectation(kind, rr, r, G_COMM, n_tr, reps=200) rows.append(dict(kind=kind, rr=rr, r=r, broker=p, se=se, span_days=span, blocks=blocks, exact=chains[(rr, r)][key], protocol=proto, z=(p - proto) / se if se and se > 0 else np.nan)) AG24 = pd.DataFrame(rows) AG24["bias"] = AG24.protocol - AG24.exact AG24["resolvable"] = AG24.blocks >= 10 for kind in ("eval", "funded"): k = AG24[AG24.kind == kind] kr = k[k.resolvable] print(f"{kind}: protocol bias median {k.bias.median():+.3f}, worst {k.bias.min():+.3f} | resolvable {len(kr)} of {len(k)} cells: " f"beyond 2 SE {np.mean(np.abs(kr.z) > 2):.0%}, mean z {kr.z.mean():+.2f}, largest {np.abs(kr.z).max():.1f}") share24_res = float(np.mean(np.abs(AG24[AG24.resolvable].z) > 2)) print(f"all resolvable cells: {share24_res:.1%} beyond 2 SE of {int(AG24.resolvable.sum())}; unresolvable {int((~AG24.resolvable).sum())} cells, " f"accounts spanning {AG24[~AG24.resolvable].span_days.min():.0f} to {AG24[~AG24.resolvable].span_days.max():.0f} days") --- OUT: eval: protocol bias median -0.000, worst -0.008 | resolvable 48 of 64 cells: beyond 2 SE 12%, mean z -0.87, largest 4.2 funded: protocol bias median -0.019, worst -0.235 | resolvable 25 of 64 cells: beyond 2 SE 16%, mean z -0.66, largest 3.3 all resolvable cells: 13.7% beyond 2 SE of 73; unresolvable 55 cells, accounts spanning 52 to 569 days ######## CELL 97 [code] # 4. the lot grid: the share of the nominal risk the floored lots carry, over the deployed stops stops24 = np.maximum(0.75 * sig24[entry24], 30.0) def lot_share(r): L = r * BM.BANKROLL / (10 * stops24) return float(np.mean(np.floor(L / 0.01 + 1e-9) * 0.01 / L)) LOT24 = {r: lot_share(r) for r in sorted(set(BM.RA) | set(BM.RF))} print("floored lots carry, of the nominal risk: " + ", ".join(f"{100*r:g}% {v:.1%}" for r, v in LOT24.items())) zs = [] for row in AG24[AG24.resolvable].itertuples(): re_ = row.r * LOT24[row.r] ex = (PA.eval_chain(re_, G_COMM * re_, rr=row.rr, clip_up=True, clip_dn=True)["p_pass"] if row.kind == "eval" else PA.funded_chain(re_, G_COMM * re_, PA.payout_threshold(re_, row.rr, BM.BANKROLL, BM.SPLIT), rr=row.rr, clip_dn=True)["p_any"]) zs.append((row.broker - (ex + row.bias)) / row.se) print(f"at the effective risk, resolvable cells beyond 2 SE: {np.mean(np.abs(zs) > 2):.1%} (nominal {share24_res:.1%}), mean z {np.mean(zs):+.2f}") --- OUT: floored lots carry, of the nominal risk: 0.5% 93.5%, 1% 96.7%, 1.5% 97.8%, 2% 98.4%, 2.5% 98.7%, 3% 99.0%, 3.5% 99.1%, 4% 99.2%, 4.5% 99.3% --- OUT: at the effective risk, resolvable cells beyond 2 SE: 13.7% (nominal 13.7%), mean z -0.82 ######## CELL 98 [code] fig, ax = plt.subplots(2, 3, figsize=(12, 7.2)) mk_e, mk_f = (1.0, 0.04), (1.0, 0.015) heat(ax[0, 0], EB, BM.RA, BM.RR, "assessment risk, %", "RR", "broker P(pass), 20 seeds", lambda v: f"{100*v:.1f}", mk_e) heat(ax[0, 1], FB, BM.RF, BM.RR, "funded risk, %", "RR", "broker P(any payout), 20 seeds", lambda v: f"{100*v:.1f}", mk_f) heat(ax[0, 2], np.array([[BR[("life", 1.0, ra, rf)]["coin"]["p_cash"] for rf in BM.RF] for ra in BM.RA]), BM.RF, BM.RA, "funded risk, %", "assessment risk, %", "broker P(cash) per purchase, RR 1", lambda v: f"{100*v:.1f}", (0.04, 0.015)) def zgrid(kind, ys, xs): t = AG24[AG24.kind == kind].set_index(["rr", "r"]) return np.array([[t.loc[(y, x), "z"] if t.loc[(y, x), "resolvable"] else np.nan for x in xs] for y in ys]) heat(ax[1, 0], np.clip(zgrid("eval", BM.RR, BM.RA), -3, 3), BM.RA, BM.RR, "assessment risk, %", "RR", "broker - model under protocol, SE", lambda v: "" if not np.isfinite(v) else f"{v:+.1f}", None, cmap="RdBu_r") heat(ax[1, 1], np.clip(zgrid("funded", BM.RR, BM.RF), -3, 3), BM.RF, BM.RR, "funded risk, %", "RR", "broker - model under protocol, SE", lambda v: "" if not np.isfinite(v) else f"{v:+.1f}", None, cmap="RdBu_r") ax[1, 2].axis("off") ax[1, 2].text(0.02, 0.5, "Blank cells: fewer than ten\nblocks of twice the account span\nin 2.8 years, not resolvable\nby this history.", fontsize=9, va="center") fig.suptitle("The map through the broker: rates (top), and broker minus the model under the broker's protocol in block-clustered standard errors (bottom)") fig.tight_layout() fig.savefig("src/notebooks/reports/topics/prime_academy/figures/broker_map_rates.png", dpi=130) plt.show() --- OUT:
######## CELL 99 [markdown] **Figure.** Top: the broker's rates, today's cell framed. Bottom: broker minus the chains' model run under the broker's own protocol, in standard errors clustered by blocks of calendar time twice the account span; a blank cell has too few such blocks in 2.8 years to be resolved. Look for a band of one colour along a row or a column: that would say the market and the model disagree about how the parameter acts, which scattered cells of both colours do not. ######## CELL 100 [code] # durations in calendar days, which only the broker has, and the pace of one trade against Wald's baseline DE = np.array([[BR[("eval", rr, r, r)]["coin"]["days_pass"] for r in BM.RA] for rr in BM.RR]) DF = np.array([[BR[("funded", rr, r, r)]["coin"]["first_pay_days"] for r in BM.RF] for rr in BM.RR]) DL = np.array([[BR[("funded", rr, r, r)]["coin"]["life_days"] for r in BM.RF] for rr in BM.RR]) pace = {rr: np.nanmean([BR[("eval", rr, r, r)]["coin"]["days_per_trade"] for r in BM.RA]) for rr in BM.RR} sigma_day = float(np.nanmedian(TF.sigma_kf(dclose24, rho_v=0.0025) / FX.PIP)) wald = {rr: rr * STOP24 ** 2 / sigma_day ** 2 * 7 / 5 for rr in BM.RR} # trading days to calendar days print(f"pace, calendar days per trade (broker) against Wald's a b / sigma^2 at a {STOP24:.1f}-pip stop and sigma {sigma_day:.1f} pips:") for rr in BM.RR: print(f" RR {rr:4}: broker {pace[rr]:5.2f} Wald {wald[rr]:5.2f} ratio {pace[rr] / wald[rr]:.2f}") fig, ax = plt.subplots(1, 4, figsize=(15, 3.6)) heat(ax[0], DE, BM.RA, BM.RR, "assessment risk, %", "RR", "days to pass, given a pass", lambda v: f"{v:.0f}", mk_e, cmap="magma_r") heat(ax[1], DF, BM.RF, BM.RR, "funded risk, %", "RR", "median days to first payout", lambda v: f"{v:.0f}", mk_f, cmap="magma_r") heat(ax[2], DL, BM.RF, BM.RR, "funded risk, %", "RR", "mean funded life, days", lambda v: f"{v:.0f}", mk_f, cmap="magma_r") ax[3].plot(BM.RR, [pace[r] for r in BM.RR], "o-", color=PALETTE["BLUE"], label="broker") ax[3].plot(BM.RR, [wald[r] for r in BM.RR], "s--", color=PALETTE["MUT"], label="Wald, a b / sigma^2") ax[3].set_xlabel("RR"); ax[3].set_ylabel("calendar days per trade"); ax[3].legend(frameon=False, fontsize=8) style_axes(ax[3]) fig.tight_layout() fig.savefig("src/notebooks/reports/topics/prime_academy/figures/broker_map_days.png", dpi=130) plt.show() --- OUT: pace, calendar days per trade (broker) against Wald's a b / sigma^2 at a 34.8-pip stop and sigma 39.1 pips: RR 0.5: broker 1.62 Wald 0.55 ratio 2.92 RR 0.75: broker 1.81 Wald 0.83 ratio 2.18 RR 1.0: broker 2.03 Wald 1.11 ratio 1.83 RR 1.25: broker 2.23 Wald 1.38 ratio 1.61 RR 1.5: broker 2.41 Wald 1.66 ratio 1.45 RR 2.0: broker 2.76 Wald 2.21 ratio 1.25 RR 2.5: broker 3.14 Wald 2.77 ratio 1.13 RR 3.0: broker 3.51 Wald 3.32 ratio 1.06 --- OUT:
######## CELL 101 [markdown] **Figure.** The durations in calendar days, from the broker, and the pace of one trade against Wald's baseline. The pace should rise about linearly in $RR$ with the stop fixed; a flat line would say the clipped target, not the ratio, sets how long a trade lasts. ######## CELL 102 [code] # the summary the paper reads, and the verdict today = {"eval": BR[("eval", 1.0, 0.04, 0.04)]["coin"], "funded": BR[("funded", 1.0, 0.015, 0.015)]["coin"], "life": BR[("life", 1.0, 0.04, 0.015)]["coin"], "life_short": BR[("life", 1.0, 0.04, 0.015)]["short"]} out24 = {"commit": subprocess.run(["git", "rev-parse", "--short", "HEAD"], capture_output=True, text=True).stdout.strip(), "seeds": len(BM.SEEDS), "stop": STOP24, "g_comm": G_COMM, "cells": len(allz), "share_beyond_2": share24, "declared": verdict24_declared, "share_resolvable_beyond_2": share24_res, "n_resolvable": int(AG24.resolvable.sum()), "fair": FAIR24.to_dict("records"), "agreement": AG24.to_dict("records"), "lot_share": {str(k): v for k, v in LOT24.items()}, "gap_mean": {"eval": float(np.nanmean(EZ)), "funded": float(np.nanmean(FZ)), "life": float(np.nanmean(LZ))}, "pace": {str(k): float(v) for k, v in pace.items()}, "wald": {str(k): float(v) for k, v in wald.items()}, "today": {k: {kk: float(vv) for kk, vv in v.items()} for k, v in today.items()}, "grids": {"RR": BM.RR, "RA": BM.RA, "RF": BM.RF, "EB": EB.tolist(), "FB": FB.tolist(), "EZ": EZ.tolist(), "FZ": FZ.tolist(), "LZ": LZ.tolist(), "DE": DE.tolist(), "DF": DF.tolist(), "DL": DL.tolist()}} json.dump(out24, open("src/notebooks/reports/topics/prime_academy/paper/broker_map.json", "w"), indent=1) verdict24 = (f"DECLARED TEST {verdict24_declared} ({share24:.0%} of cells beyond 2 SE); DIAGNOSED: trades fair at every ratio, " f"the model under the broker's protocol within 2 block SE in {1 - share24_res:.0%} of the {int(AG24.resolvable.sum())} resolvable cells, " f"{int((~AG24.resolvable).sum())} cells unresolvable by 2.8 years of history") t = today ag_today = AG24[((AG24.kind == "eval") & (AG24.rr == 1.0) & (AG24.r == 0.04)) | ((AG24.kind == "funded") & (AG24.rr == 1.0) & (AG24.r == 0.015))] print(ag_today[["kind", "rr", "r", "broker", "protocol", "exact", "z", "blocks", "resolvable"]].to_string(index=False, float_format=lambda v: f"{v:.3f}")) print(f"today's cells through the broker, coin side, 20 seeds:") print(f" assessment RR 1 at 4%: P(pass) {t['eval']['p_pass']:.1%} +/- {t['eval']['p_pass_se']:.1%}, {t['eval']['days_pass']:.0f} days to pass") print(f" funded RR 1 at 1.5%: P(any payout) {t['funded']['p_any']:.1%} +/- {t['funded']['p_any_se']:.1%}, " f"first payout {t['funded']['first_pay_days']:.0f} days, life {t['funded']['life_days']:.0f} days") print(f" per purchase: P(cash) {t['life']['p_cash']:.1%} +/- {t['life']['p_cash_se']:.1%}, cash / fee {t['life']['cash_fee']:.2f}") print(f"\n24 verdict: {verdict24}") --- OUT: kind rr r broker protocol exact z blocks resolvable eval 1.000 0.040 0.473 0.481 0.481 -0.650 33 True funded 1.000 0.015 0.500 0.527 0.554 -1.002 4 False today's cells through the broker, coin side, 20 seeds: assessment RR 1 at 4%: P(pass) 47.2% +/- 1.3%, 12 days to pass funded RR 1 at 1.5%: P(any payout) 52.5% +/- 3.3%, first payout 46 days, life 123 days per purchase: P(cash) 28.9% +/- 2.5%, cash / fee 1.92 24 verdict: DECLARED TEST DISAGREES (39% of cells beyond 2 SE); DIAGNOSED: trades fair at every ratio, the model under the broker's protocol within 2 block SE in 86% of the 73 resolvable cells, 55 cells unresolvable by 2.8 years of history ######## CELL 103 [markdown] ## 25. The deployed decision: the method, the side and the purchase gate (2026-09-29) **The question.** The deployed plan risks 3% a trade in the assessment and about 1.5% once funded at reward-to-risk 1, with the target clipped and the stop at the floor, one \$3,000 account, and a random side each trade. This section measures what the random side's swap costs, finds the funded risk by line search within the plateau, and states the purchase gate in numbers. #### Concepts used in this section **Swap nights.** What it is: the rollovers at 21:00 UTC a trade is open through, Wednesday's counted three times for the weekend. How it is measured: plain brackets through the broker, coin side, ten seeds, at the deployed stop and window. How it affects the result: always short collects +\$1.76 a lot a night; a random side pays the mean of that and the long side's -\$6.24, so the swap turns from a credit into a cost. Expected against found: below. **The plateau.** What it is: the funded risks whose chance of any payout sits within one point of the best. How it is used: below the kink at reward-to-risk x risk = 0.35 x the minimum request the chance is a sawtooth, jumping wherever one fewer net win clears the request, at r = m1 / (j - n gamma), n the payout clock in trades; a line search in small steps sees every tooth, and the choice is made within the plateau, not at its argmax, because no measurement on this history orders cells a point apart. How it affects the result: the argmax wanders with the cost; the plateau does not. Expected against found: below. **The purchase gate.** What it is: buy only if the wallet's expected log growth is positive with 80% of payouts honoured, at the measured cost. How it is used: `wallet_mc` at the chosen cell, \$1,000 on the \$3,000 tier, three years, 10,000 paths. How it affects the result: it is the one rule that can say no to the play. Expected against found: below. #### Briefing, stated before scoring - **Assessment.** At reward-to-risk 1 the pass rate rises with the risk until the 35% single-day rule, read gross (commission is charged at the open and a trade lasts two days, so the closing day shows the whole win): 0.35 x 9% = 3.15%. The deployed risk is 3%, a margin of 0.15% under it. - **Funded.** A line search at reward-to-risk 1 from 0.6% to 2% in 0.025% steps, at each cost scenario. The pick: within the plateau, the fewest median trades to the first payout, ties to the larger gross withdrawn. - **Payout clock.** Fourteen calendar days, in trades at the deployed pace of section 24: 14 / 2.03, seven trades. The funded line search, the chains and the wallet all run on it. - **Cost scenarios, as shares of the risk at the 34.8-pip mean stop.** Commission only (the broker's); commission and a 0.5-pip spread; that plus the random side's swap; that plus the measured 1.33 step-asides a trade, each paying commission and spread again. - **Gate.** Declared above. It is evaluated at every scenario; the scenario that applies is the one the three pending measurements (aside rate on a narrower calendar, live spread, strict daily-loss breaches) will pin. - **What it cannot see.** Whether the firm pays; the spread at the aside instants; floating equity between closes. ######## CELL 104 [code] # the swap nights of a trade at the deployed stop, and the cost share of each side policy, about a minute NIGHTS25 = BM.swap_nights() SWAP_LONG_USD, SWAP_SHORT_USD = -6.24, 1.76 # per lot per night, the platform's View Details, 2026-09-16 STOP25 = STOP24 WT25 = max(PA.MIN_DAYS, int(round(PA.WAIT / pace[1.0]))) # 14 calendar days in trades at the deployed pace H25 = int(round(3 * 365 / pace[1.0])) # three years in trades side_share = {name: -(usd / 10.0) * NIGHTS25.mean() / STOP25 for name, usd in (("short", SWAP_SHORT_USD), ("coin", (SWAP_LONG_USD + SWAP_SHORT_USD) / 2), ("long", SWAP_LONG_USD))} print(f"closed trades {len(NIGHTS25)}: swap nights a trade, mean {NIGHTS25.mean():.3f}, none {np.mean(NIGHTS25 == 0):.1%}") for k, v in side_share.items(): print(f" {k:5}: swap adds {v:+.2%} of the risk to the cost share") G25 = {"commission only": PA.cost_share(STOP25, s=0.0), "commission and spread": PA.cost_share(STOP25), "random side, swap charged": PA.cost_share(STOP25) + side_share["coin"], "random side, with the asides": PA.cost_share(STOP25) * 2.33 + side_share["coin"]} for k, v in G25.items(): print(f"cost share, {k:30}: {v:.2%} of the risk") print(f"payout clock {WT25} trades at {pace[1.0]:.2f} days a trade; gate horizon {H25} trades, three years") --- OUT: [2026-10-01 10:17:10 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:10 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:10 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:11 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:11 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:11 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:11 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:12 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:12 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:12 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:12 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:13 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:13 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:13 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:13 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:15 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:15 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:15 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:15 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:15 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:16 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:16 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:16 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:17 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:17 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD --- OUT: [2026-10-01 10:17:17 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:17 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:18 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:18 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:18 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:18 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:19 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:19 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:19 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:19 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:20 UTC] [HistoricalBarBroker] Bar replay completed. [2026-10-01 10:17:20 UTC] [HistoricalBarBroker] Subscribed to historical feed: EURUSD [2026-10-01 10:17:20 UTC] [HistoricalBarBroker] EURUSD: carry is UNMODELLED (spot_fx). This replay omits a financing cost that the instrument really pays. [2026-10-01 10:17:20 UTC] [HistoricalBarBroker] Bar replay (cached aggregates) started: EURUSD --- OUT: [2026-10-01 10:17:21 UTC] [HistoricalBarBroker] Bar replay completed. closed trades 4670: swap nights a trade, mean 0.743, none 60.4% short: swap adds -0.38% of the risk to the cost share coin : swap adds +0.48% of the risk to the cost share long : swap adds +1.33% of the risk to the cost share cost share, commission only : 1.44% of the risk cost share, commission and spread : 2.87% of the risk cost share, random side, swap charged : 3.35% of the risk cost share, random side, with the asides : 7.18% of the risk payout clock 7 trades at 2.03 days a trade; gate horizon 541 trades, three years ######## CELL 105 [code] # the assessment at the cap and at the deployed margin; the funded line search per scenario, a few minutes CAP25 = 0.35 * PA.TARGET rows = [] for name, g in G25.items(): cap = PA.eval_chain(CAP25, g * CAP25, rr=1.0, clip_up=True, clip_dn=True) dep = PA.eval_chain(0.03, g * 0.03, rr=1.0, clip_up=True, clip_dn=True) rows.append(dict(scenario=name, cost=g, pass_cap=cap["p_pass"], pass_3=dep["p_pass"], trades_3=dep["e_trades"])) A25 = pd.DataFrame(rows) print(f"assessment at reward-to-risk 1: the cap {CAP25:.2%} (gross) against the deployed 3%") print(A25.to_string(index=False, formatters={"cost": "{:.2%}".format, "pass_cap": "{:.2%}".format, "pass_3": "{:.2%}".format, "trades_3": "{:.1f}".format})) LS25, PICK25 = {}, {} for name, g in G25.items(): rows_ = PA.funded_line_search(g, lo=0.006, hi=0.020, step=0.00025, wait=WT25) LS25[name] = rows_ plat = PA.plateau(rows_) PICK25[name] = min(plat, key=lambda r: (r["med_first_pay"], -r["e_W"])) best = max(rows_, key=lambda r: r["p_any"]) teeth = [e for e in PA.tooth_edges(g, n=WT25) if 0.006 < e < 0.35 * 100 / 0.7 / 3000] print(f"{name:30} best {best['risk']:.3%} ({best['p_any']:.2%}); plateau {plat[0]['risk']:.3%} to {plat[-1]['risk']:.3%}; " f"pick {PICK25[name]['risk']:.3%} ({PICK25[name]['p_any']:.2%}, first payout {PICK25[name]['med_first_pay']} trades); " f"teeth at {', '.join(f'{e:.3%}' for e in teeth)}") --- OUT: assessment at reward-to-risk 1: the cap 3.15% (gross) against the deployed 3% scenario cost pass_cap pass_3 trades_3 commission only 1.44% 47.84% 47.70% 9.6 commission and spread 2.87% 45.63% 45.38% 9.6 random side, swap charged 3.35% 44.84% 44.61% 9.7 random side, with the asides 7.18% 38.91% 38.56% 9.6 --- OUT: commission only best 1.325% (58.93%); plateau 0.850% to 1.425%; pick 1.425% (58.18%, first payout 16 trades); teeth at 1.642%, 1.221%, 0.972%, 0.807%, 0.690%, 0.603% --- OUT: commission and spread best 1.350% (55.01%); plateau 1.050% to 1.550%; pick 1.550% (54.10%, first payout 14 trades); teeth at 1.254%, 0.992%, 0.821%, 0.700%, 0.611% --- OUT: random side, swap charged best 1.375% (53.86%); plateau 1.150% to 1.575%; pick 1.575% (52.88%, first payout 14 trades); teeth at 1.265%, 0.999%, 0.826%, 0.704%, 0.613% --- OUT: random side, with the asides best 1.600% (45.21%); plateau 1.475% to 1.700%; pick 1.700% (44.40%, first payout 12 trades); teeth at 1.361%, 1.059%, 0.866%, 0.733%, 0.635% ######## CELL 106 [code] fig, ax = plt.subplots(1, 1, figsize=(10, 4.2)) cols = [PALETTE["MUT"], PALETTE["BLUE"], PALETTE["GREEN"], PALETTE["RED"]] for (name, rows_), col in zip(LS25.items(), cols): r_ = np.array([x["risk"] for x in rows_]); a_ = np.array([x["p_any"] for x in rows_]) ax.plot(100 * r_, 100 * a_, color=col, lw=1.2, label=f"{name} ({100 * G25[name]:.2f}% of risk)") ax.scatter([100 * PICK25[name]["risk"]], [100 * PICK25[name]["p_any"]], color=col, s=30, zorder=5) for e in PA.tooth_edges(G25[name], n=WT25): if 0.6 < 100 * e < 100 * 0.35 * 100 / 0.7 / 3000: ax.axvline(100 * e, color=col, lw=0.6, ls=":") ax.axvline(100 * 0.35 * 100 / 0.7 / 3000, color=PALETTE["INK"], lw=1, ls="--", label="kink: 0.35 x the minimum request") ax.set_xlabel("funded risk per trade, % of the bankroll"); ax.set_ylabel("chance of any payout, %") ax.legend(frameon=False, fontsize=7.5, loc="lower center") style_axes(ax) fig.tight_layout() fig.savefig("src/notebooks/reports/topics/prime_academy/figures/funded_sawtooth.png", dpi=130) plt.show() --- OUT:
######## CELL 107 [markdown] **Figure.** The funded chance of any payout along the risk at reward-to-risk 1, one line per cost scenario, the tooth positions r = m1 / (j - n gamma) dotted, the kink dashed, each scenario's pick marked. Check that every jump sits on a dotted line: a jump off them would mean the chain and the formula disagree about the lattice. ######## CELL 108 [code] # the purchase gate: the wallet at the deployed cell, per scenario, about two minutes T3_25 = next(t for t in TIERS if t.bankroll == 3000) rows = [] for name, g in G25.items(): rf = PICK25[name]["risk"] e = PA.eval_chain(0.03, g * 0.03, rr=1.0, clip_up=True, clip_dn=True) f = PA.funded_chain(rf, g * rf, PA.payout_threshold(rf, 1.0, 3000, SPLIT), rr=1.0, clip_dn=True, wait=WT25) cash = SPLIT * 3000 * e["p_pass"] * f["e_W"] g_ = {} for honour in (1.0, 0.8): w = PA.wallet_mc(T3_25, 0.03, g * 0.03, SPLIT, honour, 1000, horizon_days=H25, n=10_000, seed=SEED, rr=1.0, wait=WT25, funded_risk=rf, funded_cost=g * rf, clip_up=True, clip_dn=True) g_[honour] = w["e_log_growth"] rows.append(dict(scenario=name, cost=g, funded_risk=rf, p_pass=e["p_pass"], p_any=f["p_any"], p_cash=e["p_pass"] * f["p_any"], cash_fee=cash / T3_25.fee, breakeven=T3_25.fee / cash, g_full=g_[1.0], g_80=g_[0.8], gate=g_[0.8] > 0)) GATE25 = pd.DataFrame(rows) print("the deployed cell per cost scenario: assessment 3%, funded at the scenario's pick, $1,000 on the $3,000 tier") print(GATE25.to_string(index=False, formatters={"cost": "{:.2%}".format, "funded_risk": "{:.3%}".format, "p_pass": "{:.1%}".format, "p_any": "{:.1%}".format, "p_cash": "{:.1%}".format, "cash_fee": "{:.2f}".format, "breakeven": "{:.0%}".format, "g_full": "{:+.3f}".format, "g_80": "{:+.3f}".format})) --- OUT: the deployed cell per cost scenario: assessment 3%, funded at the scenario's pick, $1,000 on the $3,000 tier scenario cost funded_risk p_pass p_any p_cash cash_fee breakeven g_full g_80 gate commission only 1.44% 1.425% 47.7% 58.2% 27.7% 2.04 49% +0.336 +0.170 True commission and spread 2.87% 1.550% 45.4% 54.1% 24.5% 1.71 58% +0.246 +0.060 True random side, swap charged 3.35% 1.575% 44.6% 52.9% 23.6% 1.61 62% +0.206 +0.013 True random side, with the asides 7.18% 1.700% 38.6% 44.4% 17.1% 1.01 99% -0.294 -0.568 False ######## CELL 109 [code] # the paper reads this file dec25 = {"commit": subprocess.run(["git", "rev-parse", "--short", "HEAD"], capture_output=True, text=True).stdout.strip(), "nights_mean": float(NIGHTS25.mean()), "nights_none": float(np.mean(NIGHTS25 == 0)), "n_trades": int(len(NIGHTS25)), "side_share": {k: float(v) for k, v in side_share.items()}, "stop": STOP25, "cap": CAP25, "wait": WT25, "horizon": H25, "scenarios": {name: {"cost": float(G25[name]), "assess": A25[A25.scenario == name].iloc[0][["pass_cap", "pass_3", "trades_3"]].astype(float).to_dict(), "pick": {k: float(v) for k, v in PICK25[name].items()}, "plateau": [float(PA.plateau(LS25[name])[0]["risk"]), float(PA.plateau(LS25[name])[-1]["risk"])], "teeth": [float(e) for e in PA.tooth_edges(G25[name], n=WT25) if 0.006 < e < 0.35 * 100 / 0.7 / 3000], "curve": [[float(x["risk"]), float(x["p_any"])] for x in LS25[name]], "gate": {k: (bool(v) if k == "gate" else float(v)) for k, v in GATE25[GATE25.scenario == name].iloc[0].drop("scenario").items()}} for name in G25}} json.dump(dec25, open("src/notebooks/reports/topics/prime_academy/paper/decision.json", "w"), indent=1) open_ = [n for n in G25 if dec25["scenarios"][n]["gate"]["gate"]] verdict25 = (f"GATE OPEN in {', '.join(open_)}; CLOSED in the others" if open_ else "GATE CLOSED in every scenario") print(f"25 verdict by the declared rule: {verdict25}. The scenario that applies is set by the pending measurements.") --- OUT: 25 verdict by the declared rule: GATE OPEN in commission only, commission and spread, random side, swap charged; CLOSED in the others. The scenario that applies is set by the pending measurements. ######## CELL 110 [markdown] ## 26. The optimisation: three objectives and the front (2026-09-30) **The question.** The operator wants money soon, money in total, and a shallow wallet drawdown, without a weighted sum, since any weight between days and dollars would be arbitrary. This section states the criteria as three objectives and a set of limits, reduces the decision vector by calculus, computes every remaining cell on the chains and the wallet, and reports the Pareto front: the cells that no other cell beats on all three objectives at once. #### Concepts used in this section **Pareto front.** What it is: the feasible cells that no other feasible cell beats on every objective at once. How it is used: a cell is dropped when another is no worse on T, G and D and strictly better on one; what is left is the menu. How it affects the result: no weight is ever chosen; a drawdown cap in dollars, which the operator states, picks from the menu. Expected against found: below. **T, days to first cash.** What it is: the median calendar days from the first purchase until the wallet receives its first honoured payout, counting failed purchases and their replacements. How it is measured: the wallet simulation over three years, a path with no cash counted as never, so the median is over every path: $$T = \operatorname{median}\ \tau_{\text{cash}}$$ where τ_cash is the day of the first honoured payout into the wallet. How it affects the result: it is the "money soon" axis. Expected against found: below. **G, the cash rate.** What it is: the wallet's long-run net cash in dollars a year, at 80% of payouts honoured. How it is computed: a purchase costs the fee and returns honoured payouts over its life, and the next purchase follows the last one's death, so by the renewal-reward theorem the rate is the expected reward of one purchase over its expected length: $$G = N \cdot \frac{365\,(h \alpha B P\, E[W] - F)}{d\,(E[n_A] + P\, E[L_F])}$$ with N accounts held at once, h = 0.8 the honour rate, α = 0.7 the split, B = $3,000 the bankroll, P the pass rate, E[W] the gross withdrawn by a funded account as a share of B, F = $38 the fee, d the calendar days per trade, E[n_A] the expected trades to resolve the assessment and E[L_F] the expected funded life in trades. Every term but d comes exactly from the chains. How it affects the result: it is the "money in total" axis. Expected against found: below. **D, wallet drawdown.** What it is: the 90th percentile over wallet paths of the largest peak-to-trough fall in the first year, the peak floored at the opening $1,000. How it is measured: the same simulation. How it affects the result: it is the drawdown axis, and every fee is a dollar of it until cash arrives. Expected against found: below. **The pace along the stop.** What it is: calendar days per trade at a stop of ℓ pips. How it is measured: Wald's identity makes a bracket's expected length a function of the product of its legs alone, so the broker's measured pace at ratio RR and the deployed stop (section 24) is the pace of a ratio-1 bracket whose stop is $$\ell = \sqrt{RR}\ \ell_0$$ with ℓ₀ = 34.8 pips the deployed mean stop. Below the smallest ratio measured (0.5, a 24.6-pip stop) the line through the two lowest points is extended, floored at one entry a trading day, 7/5 calendar days. How it affects the result: it converts every duration and the 14-day payout clock into days. Expected against found: below. #### Briefing, stated before scoring - **Decision vector.** Stop ℓ, reward-to-risk, the two stage risks, trades a day k, tier, accounts held at once N, cost scenario. Calculus fixes all but ℓ and N: reward-to-risk 1, the assessment at 3% (the 35% cap read gross, 3.15%), the tier $3,000 (the wallet's ruin cap), the funded risk by the line search of section 25 within its plateau at each stop, and k = 1 (checked below). - **Cells.** Stops 15, 20, 25, 28, 30, 34.8, 40, 45 pips; N = 1, 2, 3, the accounts entered at hours whose outcomes correlate as section 15 measured; the four cost scenarios of section 25, each component scaled with the stop (commission and spread as 1/ℓ, swap and step-asides as ℓ); 96 cells, 10,000 wallet paths each, $1,000 wallet, 80% honoured, the payout clock 14 days in trades at each stop's pace. - **Limits.** Ruin within three years at most 5%; the purchase gate, expected log growth over three years above zero; the funded chance of any payout at least 50%; T finite. - **Dominance.** No worse on all three and better on one, where T and D must differ by more than two standard errors of the difference (bootstrap over paths) and G, exact given its inputs, by any amount. - **Pick.** For a drawdown cap D* of $300, $400, $500 and $600, the fastest and the richest front cell with D ≤ D*. The operator chooses D* and between the two. - **What would change the plan.** A front cell at N = 1 other than the deployed stop that beats it on T and G within the same drawdown; a cell at N = 2 on the front; or no feasible cell at all in a scenario, which is the gate closed at every stop. ######## CELL 111 [code] # the cost share and the calendar pace along the stop, seconds L26 = [15.0, 20.0, 25.0, 28.0, 30.0, STOP25, 40.0, 45.0] ASIDES26 = 1.33 # step-asides per trade at the deployed stop, section 18 FLOOR26 = 7 / 5 # one entry a trading day, in calendar days SCEN26 = ["commission only", "commission and spread", "random side, swap charged", "random side, with the asides"] X26 = np.array(BM.RR, float) # a b / stop^2 at the deployed stop is the ratio itself D26 = np.array([pace[r] for r in BM.RR]) # the broker's calendar days per trade, section 24 def pace26(l): """Calendar days per trade at a stop of l pips, ratio 1: the broker's pace at equal a b.""" x = (l / STOP24) ** 2 if x < X26[0]: slope = (D26[1] - D26[0]) / (X26[1] - X26[0]) return max(FLOOR26, float(D26[0] + slope * (x - X26[0]))) return float(np.interp(x, X26, D26)) def cost26(l, scen): """Cost share of the risk at a stop of l pips. Swap nights and step-asides scale with the holding time, l^2 by Wald, so their shares scale as l.""" g = PA.cost_share(l, s=0.0) if scen == "commission only" else PA.cost_share(l) if scen.startswith("random side"): g += side_share["coin"] * l / STOP25 if scen.endswith("asides"): g += ASIDES26 * PA.cost_share(l) * (l / STOP25) ** 2 return g print("stop days/trade clock(trades) " + " ".join(f"{s[:22]:>22}" for s in SCEN26)) for l in L26: d = pace26(l) print(f"{l:5.1f} {d:6.2f} {max(PA.MIN_DAYS, round(PA.WAIT / d)):3d} " + " ".join(f"{cost26(l, s):22.2%}" for s in SCEN26)) --- OUT: stop days/trade clock(trades) commission only commission and spread random side, swap char random side, with the 15.0 1.40 10 3.33% 6.67% 6.87% 8.52% 20.0 1.49 9 2.50% 5.00% 5.28% 7.47% 25.0 1.63 9 2.00% 4.00% 4.34% 7.09% 28.0 1.73 8 1.79% 3.57% 3.96% 7.03% 30.0 1.80 8 1.67% 3.33% 3.75% 7.04% 34.8 2.03 7 1.44% 2.87% 3.35% 7.18% 40.0 2.28 6 1.25% 2.50% 3.05% 7.45% 45.0 2.53 6 1.11% 2.22% 2.84% 7.79% ######## CELL 112 [code] # the deployed rule's knobs for each mean stop, on the section 24 entries: the multiple of yesterday's sigma at the 30-pip floor, and the floor at 0.75 SIG26 = sig24[entry24] def mean_stop26(beta, floor): return float(np.mean(np.maximum(beta * SIG26, floor))) def knob26(l): """(beta at a 30-pip floor, floor at beta 0.75) whose mean stop is l pips; nan where the knob cannot reach l.""" beta = brentq(lambda b: mean_stop26(b, 30.0) - l, 1e-3, 5.0) if l > mean_stop26(1e-3, 30.0) else np.nan floor = brentq(lambda f: mean_stop26(0.75, f) - l, 0.0, 300.0) if l > mean_stop26(0.75, 0.0) else np.nan return beta, floor RULE26 = {l: knob26(l) for l in L26} print(f"entries {len(SIG26)}; yesterday's sigma median {np.median(SIG26):.1f} pips; mean of 0.75 sigma alone {mean_stop26(0.75, 0.0):.1f} pips") for l, (b, f) in RULE26.items(): print(f"mean stop {l:5.1f} pips: max({b:.3f} sigma, 30) or max(0.75 sigma, {f:.1f})" if np.isfinite(b) and np.isfinite(f) else f"mean stop {l:5.1f} pips: " + (f"max(0.75 sigma, {f:.1f})" if np.isfinite(f) else "below both knobs: a fixed stop")) --- OUT: entries 2084; yesterday's sigma median 38.5 pips; mean of 0.75 sigma alone 31.9 pips mean stop 15.0 pips: below both knobs: a fixed stop mean stop 20.0 pips: below both knobs: a fixed stop mean stop 25.0 pips: below both knobs: a fixed stop mean stop 28.0 pips: below both knobs: a fixed stop mean stop 30.0 pips: below both knobs: a fixed stop mean stop 34.8 pips: max(0.750 sigma, 30) or max(0.75 sigma, 30.0) mean stop 40.0 pips: max(0.924 sigma, 30) or max(0.75 sigma, 38.3) mean stop 45.0 pips: max(1.056 sigma, 30) or max(0.75 sigma, 44.3) ######## CELL 113 [markdown] **One trade a day against several.** With up to k fair brackets a day and the day ended at the first loss, the trades taken in a day have mean $$E[n_k] = \sum_{j=1}^{k} 2^{-(j-1)} = 2\,(1 - 2^{-k})$$ and the day's largest gain is k r, so the 35% cap gives r at most 3.15% / k. Ended at the first win instead, the day's largest loss is k r (1 + γ), and the daily rule at the floor gives r at most 4.55% / (1 + γ) / k. The account's pace in days is set by the variance a day, r² E[n_k], and its odds in the diffusion limit by the drift over the variance a trade, 2γ / r. Both move against k: the variance a day falls, and the smaller risk raises 2γ / r. Checked below on plain barriers at the deployed cost, 200,000 accounts each; the one-a-day row carries the lattice trap of an unclipped 3% step, which the clip removes (section 25: 45.4%). ######## CELL 114 [code] # one trade a day against several, the assessment on plain barriers, about a minute g26 = PA.cost_share(STOP25) CAP26 = {"loss": 0.35 * PA.TARGET, # k wins in a day: the 35% cap on the gain "win": PA.DAILY * (1 - PA.MAXDD) / (1 + g26)} # k losses in a day: the daily rule at the floor rows = [dict(k=1, rule="-", risk=0.03, **PA.day_split_mc(1, 0.03, g26 * 0.03))] for rule in ("loss", "win"): for k in (2, 3): r = CAP26[rule] / k rows.append(dict(k=k, rule=f"stop after a {rule}", risk=r, **PA.day_split_mc(k, r, g26 * r, rule))) K26 = pd.DataFrame(rows) K26["days_vs_1"] = K26.days_pass / K26.days_pass.iloc[0] K26["var_vs_1"] = [(r["risk"] ** 2 * 2 * (1 - 2.0 ** -r["k"])) / 0.03 ** 2 if r["k"] > 1 else 1.0 for _, r in K26.iterrows()] print(K26.to_string(index=False, formatters={"risk": "{:.3%}".format, "p_pass": "{:.1%}".format, "days_pass": "{:.1f}".format, "trades": "{:.1f}".format, "days_vs_1": "{:.2f}".format, "var_vs_1": "{:.2f}".format})) --- OUT: k rule risk p_pass days_pass trades days_vs_1 var_vs_1 1 - 3.000% 42.5% 13.1 12.0 1.00 1.00 2 stop after a loss 1.575% 39.6% 25.8 40.1 1.98 0.41 3 stop after a loss 1.050% 35.5% 46.2 84.7 3.54 0.21 2 stop after a win 2.211% 44.1% 15.8 21.8 1.21 0.82 3 stop after a win 1.474% 42.5% 28.2 46.4 2.16 0.42 ######## CELL 115 [markdown] **The cells.** 32 chains, a line search of the funded risk in each, then the wallet at one, two and three accounts for each: about 25 minutes, progress printed per cell. ######## CELL 116 [code] # the front's cells: chains per stop and scenario, then the wallet at 1 to 3 accounts, ~10 minutes N26, YEARS26, HONOUR26 = 10_000, 3, 0.8 def chain26(l, scen): g, d = cost26(l, scen), pace26(l) wt = max(PA.MIN_DAYS, int(round(PA.WAIT / d))) e = PA.eval_chain(0.03, g * 0.03, rr=1.0, clip_up=True, clip_dn=True) rows_ = PA.funded_line_search(g, lo=0.006, hi=0.020, step=0.00025, wait=wt) pk = min(PA.plateau(rows_), key=lambda r: (r["med_first_pay"], -r["e_W"])) f = PA.funded_chain(pk["risk"], g * pk["risk"], PA.payout_threshold(pk["risk"], 1.0, 3000, SPLIT), rr=1.0, clip_dn=True, wait=wt) cash = SPLIT * 3000 * e["p_pass"] * f["e_W"] days = d * (e["e_trades"] + e["p_pass"] * f["e_life"]) return dict(stop=l, scenario=scen, cost=g, pace=d, wait=wt, rf=pk["risk"], p_pass=float(e["p_pass"]), p_any=float(f["p_any"]), cash_fee=cash / T3_25.fee, cycle_days=days, G1=(HONOUR26 * cash - T3_25.fee) * 365 / days) def boot_se(x, stat, reps=200, seed=0): rng = np.random.default_rng(seed) return float(np.std([stat(x[rng.integers(0, len(x), len(x))]) for _ in range(reps)], ddof=1)) def wallet26(c, rho): H, H1 = int(round(YEARS26 * 365 / c["pace"])), int(round(365 / c["pace"])) out = [] for k, F, G in SP.family(T3_25, rho, 0.03, c["cost"] * 0.03, SPLIT, 1.0, H, N26, SEED, k_max=3, p_paid=HONOUR26, funded_risk=c["rf"], funded_cost=c["cost"] * c["rf"], clip_up=True, clip_dn=True, wait=c["wait"]): w = HG.shared_wallet(F, 1000.0, G, paths=True) p = w.pop("paths") dd1 = HG.shared_wallet(F[:, :H1], 1000.0, G[:, :H1], paths=True)["paths"]["maxdd"] t = np.where(np.isnan(p["first_cash"]), np.inf, p["first_cash"] + 1) * c["pace"] q90 = lambda x: np.percentile(x, 90) out.append(dict(c, N=k, G=k * c["G1"], T=float(np.median(t)), T_se=boot_se(t, np.median), D=float(q90(dd1)), D_se=boot_se(dd1, q90), D_med=float(np.median(dd1)), ruin=w["p_ruin"], log_g=w["e_log_growth"], log_se=float(p["log_g"].std(ddof=1) / np.sqrt(N26)), mean_final=w["mean_final"])) return out t0 = time.time() CH26 = [chain26(l, s) for s in SCEN26 for l in L26] print(f"chains {time.time() - t0:.0f} s") rows = [] for c in CH26: rows += wallet26(c, SP_RHOS["staggered"]) print(f"{c['scenario'][:24]:24} {c['stop']:5.1f}: {time.time() - t0:.0f} s", flush=True) FR26 = pd.DataFrame(rows) gc.collect() --- OUT: chains 673 s --- OUT: commission only 15.0: 685 s --- OUT: commission only 20.0: 699 s --- OUT: commission only 25.0: 709 s --- OUT: commission only 28.0: 719 s --- OUT: commission only 30.0: 729 s --- OUT: commission only 34.8: 737 s --- OUT: commission only 40.0: 744 s --- OUT: commission only 45.0: 750 s --- OUT: commission and spread 15.0: 763 s --- OUT: commission and spread 20.0: 776 s --- OUT: commission and spread 25.0: 785 s --- OUT: commission and spread 28.0: 793 s --- OUT: commission and spread 30.0: 801 s --- OUT: commission and spread 34.8: 809 s --- OUT: commission and spread 40.0: 817 s --- OUT: commission and spread 45.0: 823 s --- OUT: random side, swap charge 15.0: 834 s --- OUT: random side, swap charge 20.0: 844 s --- OUT: random side, swap charge 25.0: 853 s --- OUT: random side, swap charge 28.0: 861 s --- OUT: random side, swap charge 30.0: 870 s --- OUT: random side, swap charge 34.8: 880 s --- OUT: random side, swap charge 40.0: 887 s --- OUT: random side, swap charge 45.0: 892 s --- OUT: random side, with the as 15.0: 902 s --- OUT: random side, with the as 20.0: 911 s --- OUT: random side, with the as 25.0: 920 s --- OUT: random side, with the as 28.0: 927 s --- OUT: random side, with the as 30.0: 942 s --- OUT: random side, with the as 34.8: 950 s --- OUT: random side, with the as 40.0: 959 s --- OUT: random side, with the as 45.0: 965 s --- OUT: 55708 ######## CELL 117 [code] # the declared rule: the feasible cells, then the front, per scenario PAYFLOOR26, RUIN26 = 0.50, 0.05 DSTAR26 = [300.0, 400.0, 500.0, 600.0] def dominated26(df): """A cell is dominated when another is no worse on T, G and D and better on one, where T and D differ only beyond two standard errors of their difference and G, exact given its inputs, by any amount.""" T, Ts, G, D, Ds = (df[k].to_numpy() for k in ("T", "T_se", "G", "D", "D_se")) out = np.zeros(len(df), bool) for i in range(len(df)): mT, mD = 2 * np.hypot(Ts[i], Ts), 2 * np.hypot(Ds[i], Ds) no_worse = (T <= T[i] + mT) & (G >= G[i]) & (D <= D[i] + mD) better = (T < T[i] - mT) | (G > G[i]) | (D < D[i] - mD) hit = no_worse & better hit[i] = False out[i] = hit.any() return out FR26["feasible"] = ((FR26.ruin <= RUIN26) & (FR26.log_g > 0) & (FR26.p_any >= PAYFLOOR26) & np.isfinite(FR26["T"])) FR26["front"] = False for s in SCEN26: m = (FR26.scenario == s) & FR26.feasible FR26.loc[m, "front"] = ~dominated26(FR26[m]) def picks26(s): """The fastest and the richest front cell under each drawdown cap.""" f = FR26[(FR26.scenario == s) & FR26.front] out = [] for cap in DSTAR26: ok = f[f.D <= cap] if len(ok): out.append(dict(scenario=s, cap=cap, fastest=ok.loc[ok["T"].idxmin()], richest=ok.loc[ok.G.idxmax()])) return out PICK26 = [p for s in SCEN26 for p in picks26(s)] for s in SCEN26: d = FR26[FR26.scenario == s] print(f"\n{s}: {int(d.feasible.sum())} of {len(d)} cells feasible, {int(d.front.sum())} on the front") for _, r in d.iterrows(): tag = "front" if r.front else ("dominated" if r.feasible else "infeasible") print(f" stop {r.stop:4.1f} N {r.N} T {r['T']:5.0f} d (se {r.T_se:3.0f}) G {r.G:+6.0f} $/yr D p90 ${r.D:4.0f} (se {r.D_se:3.0f}) " f"ruin {r.ruin:5.1%} log g {r.log_g:+.3f} any payout {r.p_any:5.1%} funded {r.rf:.3%} {tag}") print() for p in PICK26: fa, ri = p["fastest"], p["richest"] print(f"{p['scenario'][:26]:26} D* ${p['cap']:.0f}: fastest stop {fa.stop:.1f} N {fa.N} ({fa['T']:.0f} d, {fa.G:+.0f} $/yr, ${fa.D:.0f}); " f"richest stop {ri.stop:.1f} N {ri.N} ({ri['T']:.0f} d, {ri.G:+.0f} $/yr, ${ri.D:.0f})") --- OUT: commission only: 16 of 24 cells feasible, 10 on the front stop 15.0 N 1 T 104 d (se 2) G +91 $/yr D p90 $ 420 (se 10) ruin 1.5% log g +0.013 any payout 52.2% funded 1.575% front stop 15.0 N 2 T 67 d (se 1) G +182 $/yr D p90 $ 694 (se 10) ruin 10.1% log g -0.168 any payout 52.2% funded 1.575% infeasible stop 15.0 N 3 T 53 d (se 1) G +273 $/yr D p90 $ 948 (se 5) ruin 20.7% log g -0.457 any payout 52.2% funded 1.575% infeasible stop 20.0 N 1 T 110 d (se 1) G +118 $/yr D p90 $ 380 (se 1) ruin 0.6% log g +0.132 any payout 54.4% funded 1.525% front stop 20.0 N 2 T 68 d (se 1) G +237 $/yr D p90 $ 643 (se 6) ruin 5.9% log g +0.096 any payout 54.4% funded 1.525% infeasible stop 20.0 N 3 T 55 d (se 1) G +355 $/yr D p90 $ 848 (se 11) ruin 13.6% log g -0.047 any payout 54.4% funded 1.525% infeasible stop 25.0 N 1 T 117 d (se 2) G +123 $/yr D p90 $ 342 (se 3) ruin 0.3% log g +0.171 any payout 55.9% funded 1.475% dominated stop 25.0 N 2 T 75 d (se 1) G +246 $/yr D p90 $ 570 (se 1) ruin 3.7% log g +0.211 any payout 55.9% funded 1.475% dominated stop 25.0 N 3 T 59 d (se 0) G +368 $/yr D p90 $ 766 (se 7) ruin 9.4% log g +0.133 any payout 55.9% funded 1.475% infeasible stop 28.0 N 1 T 121 d (se 2) G +126 $/yr D p90 $ 342 (se 0) ruin 0.2% log g +0.178 any payout 57.0% funded 1.475% front stop 28.0 N 2 T 76 d (se 1) G +251 $/yr D p90 $ 550 (se 12) ruin 2.9% log g +0.262 any payout 57.0% funded 1.475% front stop 28.0 N 3 T 59 d (se 1) G +377 $/yr D p90 $ 735 (se 11) ruin 7.3% log g +0.245 any payout 57.0% funded 1.475% infeasible stop 30.0 N 1 T 126 d (se 2) G +122 $/yr D p90 $ 342 (se 0) ruin 0.1% log g +0.179 any payout 57.5% funded 1.450% dominated stop 30.0 N 2 T 78 d (se 1) G +243 $/yr D p90 $ 532 (se 0) ruin 2.5% log g +0.255 any payout 57.5% funded 1.450% dominated stop 30.0 N 3 T 63 d (se 1) G +365 $/yr D p90 $ 722 (se 4) ruin 7.4% log g +0.218 any payout 57.5% funded 1.450% infeasible stop 34.8 N 1 T 140 d (se 2) G +113 $/yr D p90 $ 304 (se 0) ruin 0.1% log g +0.170 any payout 58.2% funded 1.425% front stop 34.8 N 2 T 87 d (se 1) G +226 $/yr D p90 $ 494 (se 0) ruin 1.9% log g +0.250 any payout 58.2% funded 1.425% front stop 34.8 N 3 T 69 d (se 1) G +339 $/yr D p90 $ 652 (se 8) ruin 5.7% log g +0.248 any payout 58.2% funded 1.425% infeasible stop 40.0 N 1 T 148 d (se 2) G +107 $/yr D p90 $ 304 (se 9) ruin 0.0% log g +0.165 any payout 59.1% funded 1.425% dominated stop 40.0 N 2 T 96 d (se 1) G +213 $/yr D p90 $ 456 (se 5) ruin 1.2% log g +0.253 any payout 59.1% funded 1.425% front stop 40.0 N 3 T 75 d (se 1) G +320 $/yr D p90 $ 640 (se 13) ruin 4.7% log g +0.255 any payout 59.1% funded 1.425% front stop 45.0 N 1 T 170 d (se 2) G +97 $/yr D p90 $ 266 (se 0) ruin 0.0% log g +0.146 any payout 59.6% funded 1.400% front stop 45.0 N 2 T 106 d (se 1) G +194 $/yr D p90 $ 456 (se 8) ruin 1.0% log g +0.232 any payout 59.6% funded 1.400% dominated stop 45.0 N 3 T 84 d (se 1) G +290 $/yr D p90 $ 608 (se 6) ruin 3.7% log g +0.242 any payout 59.6% funded 1.400% front commission and spread: 6 of 24 cells feasible, 5 on the front stop 15.0 N 1 T 120 d (se 2) G -61 $/yr D p90 $ 532 (se 10) ruin 10.7% log g -0.778 any payout 44.7% funded 1.700% infeasible stop 15.0 N 2 T 76 d (se 1) G -123 $/yr D p90 $ 940 (se 10) ruin 42.0% log g -1.872 any payout 44.7% funded 1.700% infeasible stop 15.0 N 3 T 60 d (se 1) G -184 $/yr D p90 $ 988 (se 0) ruin 61.2% log g -2.518 any payout 44.7% funded 1.700% infeasible stop 20.0 N 1 T 119 d (se 2) G +19 $/yr D p90 $ 490 (se 9) ruin 4.0% log g -0.291 any payout 48.3% funded 1.675% infeasible stop 20.0 N 2 T 76 d (se 1) G +38 $/yr D p90 $ 797 (se 3) ruin 21.8% log g -0.879 any payout 48.3% funded 1.675% infeasible stop 20.0 N 3 T 60 d (se 1) G +58 $/yr D p90 $ 981 (se 1) ruin 37.5% log g -1.380 any payout 48.3% funded 1.675% infeasible stop 25.0 N 1 T 124 d (se 1) G +56 $/yr D p90 $ 418 (se 0) ruin 1.7% log g -0.078 any payout 50.6% funded 1.625% infeasible stop 25.0 N 2 T 78 d (se 1) G +112 $/yr D p90 $ 684 (se 4) ruin 12.2% log g -0.383 any payout 50.6% funded 1.625% infeasible stop 25.0 N 3 T 62 d (se 1) G +167 $/yr D p90 $ 943 (se 6) ruin 24.7% log g -0.765 any payout 50.6% funded 1.625% infeasible stop 28.0 N 1 T 128 d (se 2) G +70 $/yr D p90 $ 407 (se 14) ruin 0.9% log g -0.013 any payout 52.3% funded 1.600% infeasible stop 28.0 N 2 T 80 d (se 1) G +139 $/yr D p90 $ 646 (se 3) ruin 8.4% log g -0.181 any payout 52.3% funded 1.600% infeasible stop 28.0 N 3 T 62 d (se 1) G +209 $/yr D p90 $ 874 (se 5) ruin 19.1% log g -0.482 any payout 52.3% funded 1.600% infeasible stop 30.0 N 1 T 132 d (se 2) G +73 $/yr D p90 $ 380 (se 0) ruin 0.6% log g +0.013 any payout 52.9% funded 1.575% front stop 30.0 N 2 T 81 d (se 1) G +147 $/yr D p90 $ 611 (se 9) ruin 7.6% log g -0.144 any payout 52.9% funded 1.575% infeasible stop 30.0 N 3 T 65 d (se 1) G +220 $/yr D p90 $ 836 (se 5) ruin 17.0% log g -0.393 any payout 52.9% funded 1.575% infeasible stop 34.8 N 1 T 146 d (se 2) G +79 $/yr D p90 $ 342 (se 0) ruin 0.4% log g +0.058 any payout 54.1% funded 1.550% front stop 34.8 N 2 T 91 d (se 1) G +158 $/yr D p90 $ 568 (se 4) ruin 5.1% log g -0.015 any payout 54.1% funded 1.550% infeasible ######## CELL 118 [code] open26 = [s for s in SCEN26 if FR26[FR26.scenario == s].feasible.any()] fig, ax = plt.subplots(2, max(1, len(open26)), figsize=(4.2 * max(1, len(open26)), 6.4), sharex="col", squeeze=False) cols26 = {1: PALETTE["BLUE"], 2: PALETTE["ORANGE"], 3: PALETTE["RED"]} for j, s in enumerate(open26): d = FR26[FR26.scenario == s] for n, g in d.groupby("N"): g = g.sort_values("stop") for i, key in enumerate(("G", "D")): ax[i, j].plot(g["T"], g[key], color=cols26[n], lw=0.8, label=f"{n} account{'s' if n > 1 else ''}") for _, r in g.iterrows(): face = cols26[n] if r.front else "white" mark = "o" if r.feasible else "x" ax[i, j].scatter([r["T"]], [r[key]], s=18, marker=mark, facecolor=face if mark == "o" else cols26[n], edgecolor=cols26[n], zorder=5) if n == 1 and i == 0: ax[i, j].annotate(f"{r.stop:.0f}", (r["T"], r[key]), fontsize=6, xytext=(3, 3), textcoords="offset points") ax[0, j].set_title(s, fontsize=9) ax[0, j].set_ylabel("G, $ a year at 80% honoured") ax[1, j].set_ylabel("D, p90 year-one drawdown, $") ax[1, j].set_xlabel("T, median days to first cash") ax[0, j].axhline(0, color=PALETTE["INK"], lw=0.6) for a_ in ax[:, j]: style_axes(a_) ax[0, 0].legend(frameon=False, fontsize=7) fig.tight_layout() fig.savefig("src/notebooks/reports/topics/prime_academy/figures/front.png", dpi=130) plt.show() --- OUT: /tmp/ipykernel_819469/1188946121.py:13: UserWarning: You passed a edgecolor/edgecolors ('#eb6834') for an unfilled marker ('x'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future. ax[i, j].scatter([r["T"]], [r[key]], s=18, marker=mark, facecolor=face if mark == "o" else cols26[n], /tmp/ipykernel_819469/1188946121.py:13: UserWarning: You passed a edgecolor/edgecolors ('#c62828') for an unfilled marker ('x'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future. ax[i, j].scatter([r["T"]], [r[key]], s=18, marker=mark, facecolor=face if mark == "o" else cols26[n], /tmp/ipykernel_819469/1188946121.py:13: UserWarning: You passed a edgecolor/edgecolors ('#2a78d6') for an unfilled marker ('x'). Matplotlib is ignoring the edgecolor in favor of the facecolor. This behavior may change in the future. ax[i, j].scatter([r["T"]], [r[key]], s=18, marker=mark, facecolor=face if mark == "o" else cols26[n], --- OUT:
######## CELL 119 [markdown] **Figure.** One column per cost scenario with any feasible cell. Top: the cash rate G against the days to first cash T; bottom: the year-one drawdown D against T. One line per number of accounts through the stops, each one-account point labelled by its stop. Filled: on the front; hollow: feasible but dominated; cross: fails a limit. A front that ran up and to the left in the top panel while falling in the bottom one would mean speed, cash and drawdown do not conflict and one cell wins outright; they do conflict wherever the lines rise to the left in both panels. ######## CELL 120 [code] # the paper reads this file fr26 = {"commit": subprocess.run(["git", "rev-parse", "--short", "HEAD"], capture_output=True, text=True).stdout.strip(), "paths": N26, "years": YEARS26, "honour": HONOUR26, "payfloor": PAYFLOOR26, "ruin_cap": RUIN26, "stop0": STOP24, "floor_days": FLOOR26, "asides": ASIDES26, "swap_coin": side_share["coin"], "pace_rr": [[float(x), float(y)] for x, y in zip(X26, D26)], "ksplit": K26.to_dict(orient="records"), "rule": [[float(l), float(b), float(f)] for l, (b, f) in RULE26.items()], "cells": json.loads(FR26.to_json(orient="records")), "picks": [dict(scenario=p["scenario"], cap=p["cap"], fastest=dict(stop=float(p["fastest"].stop), N=int(p["fastest"].N)), richest=dict(stop=float(p["richest"].stop), N=int(p["richest"].N))) for p in PICK26]} json.dump(fr26, open("src/notebooks/reports/topics/prime_academy/paper/front.json", "w"), indent=1) n_front = {s: int(FR26[(FR26.scenario == s) & FR26.front].shape[0]) for s in SCEN26} print("26 verdict by the declared rule: front cells per scenario " + ", ".join(f"{s}: {n}" for s, n in n_front.items())) --- OUT: 26 verdict by the declared rule: front cells per scenario commission only: 10, commission and spread: 5, random side, swap charged: 3, random side, with the asides: 0 ######## CELL 121 [markdown] ## 12. What this doesn't show **It does not show that the firm pays.** Every number here is conditional on `P(paid)`, and nothing in a rulebook measures it. Governing law is Seychelles and unresolved disputes go to LCIA arbitration in London, one arbitrator, registration alone near GBP 1,950 and non-refundable. Any payout this play generates is smaller than the cost of contesting a refusal, so the discretion is final in practice. General Terms 23.1 also permits termination in the Company's sole discretion at any time, 24.1(b) keeps the fee, and clause 16 forfeits "any existing or future right or entitlement" to payouts. **No rule here is broken.** A fixed-size entry method with a real stop is not martingale sizing, is not the named arbitrage conduct, and is not "gambling-focused". Random entry directions were how `eval_convexity` proved zero edge in simulation; they are not required in deployment, because the pass rate depends only on the barrier ratio and not on how entries are chosen. News trading is banned within 10 minutes either side of high-impact releases, on opening and on closing. Section 18 prices the rule on the exit side, where the venue-held bracket breaks it, and adds the dark rule and the guard the strategy now carries. The venue side of that rule is measured (2026-09-21): deleting a protective leg by its id detaches it with the position left open, and a PATCH re-attaches both under new ids. What is not verified is that the firm's high-impact list is the all-currency one the calendar uses. Expert Advisors and HFT are banned, and this play needs neither. **Both barrier overshoots are assumptions, not measurements.** Every pass rate above absorbs on crossing, so a win lands past the target and a loss past the floor. Section 19 prices what happens if either is wrong. The target overshoot is a free choice and removing it gains several points. The floor overshoot is the firm's to impose, the rulebook's wording is ambiguous, and the reading moves the headline pass rate by about seven points. The lattice, the parametric simulation and the real-path control agree with each other because all three encode the same assumption, which is not evidence that it holds. **The path model is a proxy.** The parametric walk is the right object for a scale-invariant barrier problem, but the real-path control runs on MNQ futures sessions, not forex. It bounds the intrabar and autocorrelation penalty at about 3 points at 4% risk; it does not establish that forex paths carry the same penalty. **The cost stack is documented at the low end.** Commission is $5 per lot at opening on forex (Rules and Conditions V.2 p.3) and the account is RAW with spreads quoted from 0.0 pips (FAQ), so at the 60-pip intraday stop of section 3c the commission is 0.83% of risk and a conservative 0.5-pip spread another 0.83%, the derived 1.67%. The 5% cost column is a stress case. The pair's daily sigma, 60 pips, is an input and sets the stop cap and through it the cost. Evaluation accounts carry standard swaps, so an overnight hold pays a cost this model does not include. Still unverified: whether the 35% distribution cap applies during the assessment, any recurring charge once funded, where the 14-day payout clock starts, the live spread behind the login, and the 0.01 minimum lot the tier-free pass rate rests on. The complaint policy is read: email or live chat first, then LCIA. Whether the firm liquidates AT the drawdown limit or after it turns out **not** to matter. Withdrawals all happen before the account dies, so the trade that kills it cannot be withdrawn either way. Measured both ways: E[withdrawn] 9.63% with overshoot allowed against 9.69% with a hard floor, while the firm's booked loss moves from 10.27% to 9.00%. The rule moves the firm's loss and nothing of the trader's. **The wallet model of sections 6 to 14 holds one account at a time.** Section 15 lifts that. Both ignore the 30-day inactivity rule, which is slack at one trade per day, and assume the wallet is used for nothing else. **Maven (section 13).** Its funded floor trails the cycle's highest equity, and the simulation reads equity once a day, so an intraday peak above the day's close would set the floor higher than modelled; the number is optimistic by that gap. Four rules are unverified and each moves the result: whether the 3% minimum and the 10-day cadence apply to the BNPL funded stage, whether the trailing floor caps at breakeven, the live spread, and any evaluation time limit. The 2% account saver is modelled as a hard cap on the stop, not simulated; a stop filled 0.5% through it on a gap would halve the split. No Maven rule is broken by one bracket trade a day at RR 1.5: EAs are not used, the bracket is above the 1:1.25 "gamifying" line, and 4% of the account is not "a large percentage". **Hedging (section 14).** The mirror is exact in the model. One uniform decides both accounts, so on every day one wins and the other loses. On two live platforms the feeds differ by a fraction of a pip, so a touch at one level can close one account and leave the other open, and that trade is no longer offset. Nothing here models that, or detection, or a payout refused because of the pairing. The first removes part of the offset the gain comes from, and the other two lower P(paid). The Prime Academy leg trades RR 2/3 on a 73.5-pip stop, where the cost share is 1.36% of risk against the traded cell's 1.67%. Its pass rate of 49.12% against 48.67% comes from that wider stop, not from the lower ratio, and section 3b's ranking of ratios at matched cost is unchanged. Maven's side is the section 13 simulation, with the same four unverified rules. **Spreading (section 15).** The k accounts share one common factor with the pairwise correlation of two entry hours, 07:00 and 16:00 UTC on the 30-pip stop. A third and fourth account need more entry hours, and hours closer together correlate more (0.45 at 07:00 against 12:00), so the staggered family is optimistic for k above 2. The measurement is one pair of hours on one pair over 720 days, on hourly bars with the stop taken on a tie. Twelve hand-placed brackets a day is an assumed ceiling, not a rule; the rulebook's own ceiling is $300,000 across all active accounts. Clause 15(h) allows the accounts, and nothing here prices what a risk team makes of one person holding twelve of them at payout time. Every number is at P(paid) = 1. **Which instrument (section 16).** The spread is a top-of-book snapshot at three hours of one day, not a distribution, and the ranking moves with it. The daily bars are the venue's, unadjusted, 250 at most and about 90 for anything listed in May 2026. The universe is the 174 instruments the interface lists, read off the rendered page; the API returns 320 and says leverage 30 on all of them, where the interface enforces 2 on crypto and 5 on stocks. The swap is the interface's figure on the day it was read, and swap rates move. The pace that turns a swap per night into a cost per trade is EURUSD's 3.6 days applied to every instrument, since no other instrument's pace has been measured; the corner's one-day pace is shown as the other end. Nothing here re-runs the real-path control or the walk-forward on another instrument. The interface's markets list once showed NDX100 at 5.53 while its details dialog and the API read 29,092; quotes come from the API, and the list is used for the universe and the leverage only. **GARCH (section 17).** One fit, on 396 days, sits on a + b = 1, so what was tested is not a model with a long-run level but an integrated GARCH with a drift term. A longer sample might identify a level, and a different family with a level this sample does identify has not been tried. Normal errors were assumed in the fit; a heavier-tailed likelihood changes the parameters but not the boundary. The comparison is one split of one pair, the same as section 11. **Verification.** `eval_convexity` loads its path array from a /tmp scratchpad belonging to a session that ended 2026-08-07; the file survives only by luck and nothing in the repo rebuilds it. `core.session_paths()` here reconstructs the same 467 x 350 x 4 array from committed `historical_data/MNQ/ohlcv/60/` bars and caches it under `reports/_cache/prime_academy/`. Re-run clean with `jupyter nbconvert --execute --to notebook --inplace` from the repo root.