- Both clients track which accounts this process has loaded history for (historyReady). An account restarted, rebuilt, wiped or newly listed is ineligible until its fetch lands, instead of trading as a fresh stage-1 first day; a failed fetch with no cache no longer reads as empty history. Waiting accounts get a targeted fetch on the next sync. - Tradovate holds an account whose start-of-day balance moves without a fill (a payout between hourly Cash History runs) until a Cash History books it, so a payout-pending account isn't re-traded on its ended cycle. - Wipe routes forget history through the client and count accounts whose history didn't come back as failures. - TopstepX sendOrder picks up a fill that arrived before the place response, and its REST backstop uses the documented Trade/search and Order/search. - POINT_VALUES: SI 5000 (was 50), M2K 5 (was 10). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { getClients } from '@/lib/clients';
|
|
import { wipeAccountData } from '@/lib/db';
|
|
|
|
/**
|
|
* POST /api/accounts/wipe-all — the bulk form of /api/accounts/[id]/wipe:
|
|
* drop every account's cached rows on every firm and rebuild them all from
|
|
* fresh Tradovate reports. One report per account, so this takes a while on
|
|
* big rosters; firms run in parallel, accounts within a firm sequentially
|
|
* (that's fetchDaysTraded's own pacing against the flaky report server).
|
|
*
|
|
* Same destructive caveat as the single wipe: cached rows older than the
|
|
* report's 28-day window cannot be refetched. The UI confirms first.
|
|
*/
|
|
export async function POST() {
|
|
const clients = [...getClients().values()];
|
|
|
|
let wiped = 0;
|
|
let failedAccounts = 0;
|
|
|
|
await Promise.all(clients.map(async (client) => {
|
|
// Forgotten, the accounts read unloaded and stay out of trading
|
|
// until the refetch below (or, if it fails, a later one) lands.
|
|
const ids = client.accountList.map((account) => account.id);
|
|
for (const account of client.accountList) {
|
|
wipeAccountData(account.id);
|
|
client.forgetHistory(account.id, account.name);
|
|
wiped++;
|
|
}
|
|
await client.fetchDaysTraded();
|
|
// Counted from the result, not the fetch's own tally: a client with
|
|
// no session fetches nothing and reports no failures.
|
|
failedAccounts += ids.filter((id) => !client.historyReady(id)).length;
|
|
}));
|
|
|
|
return NextResponse.json({ ok: true, wiped, failedAccounts });
|
|
}
|