From 621d3a91203e140e32a30696c6c5c7fcc10b2b1b Mon Sep 17 00:00:00 2001 From: Mike Johnston Date: Fri, 20 Mar 2026 13:26:22 -0400 Subject: [PATCH] try to fix shorts/bankruptcy --- src/app/api/admin/users/[userId]/reset/route.ts | 7 ++++++- src/app/api/user/me/reset/route.ts | 7 ++++++- src/lib/pricing.ts | 8 ++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/app/api/admin/users/[userId]/reset/route.ts b/src/app/api/admin/users/[userId]/reset/route.ts index c549502..a7d7990 100644 --- a/src/app/api/admin/users/[userId]/reset/route.ts +++ b/src/app/api/admin/users/[userId]/reset/route.ts @@ -84,7 +84,12 @@ export async function POST( data: { userId: params.userId, type: 'ACCOUNT_OPEN', shares: 0, price: 0, total: STARTING_BALANCE, profit: STARTING_BALANCE }, }), ] - : [prisma.trade.deleteMany({ where: { userId: params.userId } })] + : [ + prisma.trade.deleteMany({ where: { userId: params.userId } }), + prisma.trade.create({ + data: { userId: params.userId, type: 'ACCOUNT_OPEN', shares: 0, price: 0, total: STARTING_BALANCE, profit: STARTING_BALANCE }, + }), + ] await prisma.$transaction([ ...fundUpdates, diff --git a/src/app/api/user/me/reset/route.ts b/src/app/api/user/me/reset/route.ts index 689a9b5..3bf92f9 100644 --- a/src/app/api/user/me/reset/route.ts +++ b/src/app/api/user/me/reset/route.ts @@ -86,7 +86,12 @@ export async function POST(req: NextRequest) { data: { userId, type: 'ACCOUNT_OPEN', shares: 0, price: 0, total: STARTING_BALANCE, profit: STARTING_BALANCE }, }), ] - : [prisma.trade.deleteMany({ where: { userId } })] + : [ + prisma.trade.deleteMany({ where: { userId } }), + prisma.trade.create({ + data: { userId, type: 'ACCOUNT_OPEN', shares: 0, price: 0, total: STARTING_BALANCE, profit: STARTING_BALANCE }, + }), + ] await prisma.$transaction([ ...fundUpdates, diff --git a/src/lib/pricing.ts b/src/lib/pricing.ts index 6259031..bdc1b9e 100644 --- a/src/lib/pricing.ts +++ b/src/lib/pricing.ts @@ -78,8 +78,12 @@ export function calcTrade( return { total, balanceDelta: -total, profit: 0 } } case 'SELL_SHORT': { - const returned = Math.max(0, (2 * avgBuyPrice - price) * shares) - const profit = returned - avgBuyPrice * shares + // The collateral model: BUY_SHORT debited avgBuyPrice*shares. On close the + // formula (2*avgBuyPrice - price)*shares returns the net credit/debit so that + // the combined two-leg P&L equals (avgBuyPrice - price)*shares. + // No cap: when price > 2*avgBuyPrice the balance goes negative (realistic loss). + const returned = (2 * avgBuyPrice - price) * shares + const profit = returned - avgBuyPrice * shares // = (avgBuyPrice - price) * shares return { total: returned, balanceDelta: returned, profit } } }