From 49580c6bb43ebe994d0a2c2eb274dedb623849b5 Mon Sep 17 00:00:00 2001 From: Senofy <63175905+Senofy@users.noreply.github.com> Date: Mon, 9 Mar 2026 03:51:09 -0500 Subject: [PATCH] Add max_position_size to account configs - DB migration: ALTER TABLE account_configs ADD COLUMN max_position_size INTEGER NOT NULL DEFAULT 0 - Added max_position_size to AccountConfigRow, createAccountConfig, updateAccountConfig in lib/db.ts - Added maxPositionSize to AccountConfig type in types.ts (0 = no limit) - GET /api/firms/[id] now returns maxPositionSize per account - POST /api/firms/[id]/accounts and PUT /api/account-configs/[id] accept maxPositionSize - Firm settings page: new Max Contracts column (blank = no limit) - auto-trade: contracts capped at maxPositionSize when > 0 Co-Authored-By: Claude Sonnet 4.6 --- app/api/account-configs/[id]/route.ts | 4 +++- app/api/firms/[id]/accounts/route.ts | 5 ++++- app/api/firms/[id]/route.ts | 2 ++ app/firms/[id]/settings/page.tsx | 25 +++++++++++++++++++++++-- lib/auto-trade.ts | 4 +++- lib/db.ts | 18 ++++++++++++++---- types.ts | 3 ++- 7 files changed, 51 insertions(+), 10 deletions(-) diff --git a/app/api/account-configs/[id]/route.ts b/app/api/account-configs/[id]/route.ts index bd13cbe..7ba3326 100644 --- a/app/api/account-configs/[id]/route.ts +++ b/app/api/account-configs/[id]/route.ts @@ -20,9 +20,10 @@ export async function PUT( minTradingDays?: number; accountSize?: number; maxLoss?: number; + maxPositionSize?: number; }; - const { prefix, profitTarget, consistency, minDayPnL, minTradingDays, accountSize, maxLoss } = body; + const { prefix, profitTarget, consistency, minDayPnL, minTradingDays, accountSize, maxLoss, maxPositionSize } = body; if ( typeof prefix !== 'string' || !prefix.trim() || @@ -44,6 +45,7 @@ export async function PUT( minTradingDays, accountSize, maxLoss: maxLoss ?? 0, + maxPositionSize: maxPositionSize ?? 0, }); if (!updated) { diff --git a/app/api/firms/[id]/accounts/route.ts b/app/api/firms/[id]/accounts/route.ts index 07acf41..1992399 100644 --- a/app/api/firms/[id]/accounts/route.ts +++ b/app/api/firms/[id]/accounts/route.ts @@ -24,9 +24,10 @@ export async function POST( minTradingDays?: number; accountSize?: number; maxLoss?: number; + maxPositionSize?: number; }; - const { prefix, profitTarget, consistency, minDayPnL, minTradingDays, accountSize, maxLoss } = body; + const { prefix, profitTarget, consistency, minDayPnL, minTradingDays, accountSize, maxLoss, maxPositionSize } = body; if ( typeof prefix !== 'string' || !prefix.trim() || @@ -48,6 +49,7 @@ export async function POST( minTradingDays, accountSize, maxLoss: maxLoss ?? 0, + maxPositionSize: maxPositionSize ?? 0, }); return NextResponse.json({ @@ -59,6 +61,7 @@ export async function POST( minTradingDays: row.min_trading_days, accountSize: row.account_size, maxLoss: row.max_loss, + maxPositionSize: row.max_position_size, }, { status: 201 }); } catch (err) { console.error('[POST /api/firms/:id/accounts]', err); diff --git a/app/api/firms/[id]/route.ts b/app/api/firms/[id]/route.ts index dcb6f2d..e6d0759 100644 --- a/app/api/firms/[id]/route.ts +++ b/app/api/firms/[id]/route.ts @@ -31,6 +31,8 @@ export async function GET( minDayPnL: a.min_day_pnl, minTradingDays: a.min_trading_days, accountSize: a.account_size, + maxLoss: a.max_loss, + maxPositionSize: a.max_position_size, })), }); } diff --git a/app/firms/[id]/settings/page.tsx b/app/firms/[id]/settings/page.tsx index 767c194..3d49804 100644 --- a/app/firms/[id]/settings/page.tsx +++ b/app/firms/[id]/settings/page.tsx @@ -13,6 +13,7 @@ interface AccountConfig { minDayPnL: number; minTradingDays: number; accountSize: number; + maxPositionSize: number; } interface FirmConfig { @@ -49,6 +50,7 @@ function newRow(): RowState { minDayPnL: -999, minTradingDays: 5, accountSize: 50_000, + maxPositionSize: 0, dirty: true, saving: false, error: '', @@ -115,6 +117,7 @@ export default function FirmSettingsPage() { minDayPnL: row.minDayPnL, minTradingDays: row.minTradingDays, accountSize: row.accountSize, + maxPositionSize: row.maxPositionSize, }; if (row.id < 0) { @@ -223,13 +226,14 @@ export default function FirmSettingsPage() { Consistency Min Day P&L Min Trading Days + Max Contracts {rows.length === 0 && firmName && ( - + No account types yet @@ -354,6 +358,23 @@ export default function FirmSettingsPage() { /> + {/* Max Contracts */} + + + updateRow(row.id, { + maxPositionSize: e.target.value === '' ? 0 : Number(e.target.value), + }) + } + /> + + {/* Actions */}
@@ -402,7 +423,7 @@ export default function FirmSettingsPage() { {/* Add row */} - +