Honor the catalog's min-legs setting and carve $500 pieces
Big days (> the $1,700 split threshold) must carve at least the account type's minLegs from the catalog — pickLegAmount reserves the minimum piece for each leg still owed, forcing a carve even once the residual dips below the threshold, clamped to what the pieces allow. Days at or below the threshold still trade as one leg. The smallest split piece drops from $800 to $500. An older master without the field means no minimum. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
620ab54d42
commit
ae0f93a44f
+17
-4
@@ -13,7 +13,7 @@ import { getTradableFirms } from './firm-catalog';
|
||||
import { getAccountConfig } from './account-type-resolver';
|
||||
import {
|
||||
combineCmeSessions, computeDayPlan, groupLegFraction, pickLegAmount, resolveEffectiveConfig, currentTradeDateCT,
|
||||
LEG_COMPLETION_EPSILON, MAX_LEGS_PER_DAY, POINT_VALUES,
|
||||
BIG_DAY_THRESHOLD, LEG_COMPLETION_EPSILON, MAX_LEGS_PER_DAY, POINT_VALUES,
|
||||
type DayPlan,
|
||||
} from './trading-logic';
|
||||
import { getSetting, setSetting } from './db';
|
||||
@@ -354,11 +354,19 @@ export async function runTrade(action: 'Buy' | 'Sell' | 'Auto', symbol: string)
|
||||
}
|
||||
|
||||
// Trade one leg toward today's remaining target. Split-allowed big days carve a
|
||||
// ≥$800 piece; everything else trades the full remaining amount in one go. The
|
||||
// ≥$500 piece; everything else trades the full remaining amount in one go. The
|
||||
// carve fraction is seeded per (prefix, date, leg number) so like accounts in a
|
||||
// batch split their targets the same way, or close to it when remainders differ.
|
||||
// An account type's min-legs setting forces at least that many carves
|
||||
// on BIG days only — a day at or below the threshold still trades as
|
||||
// one leg. Set per prefix, so like accounts still split alike.
|
||||
const minLegs = item.plan.dayTarget > BIG_DAY_THRESHOLD ? (cfg.minLegs ?? 0) : 0;
|
||||
const legAmount = item.plan.splitAllowed
|
||||
? pickLegAmount(item.plan.remainingToday, () => groupLegFraction(item.prefix, tradeDate, legsToday(acc.id, tradeDate)))
|
||||
? pickLegAmount(
|
||||
item.plan.remainingToday,
|
||||
() => groupLegFraction(item.prefix, tradeDate, legsToday(acc.id, tradeDate)),
|
||||
minLegs - legsToday(acc.id, tradeDate),
|
||||
)
|
||||
: item.plan.remainingToday;
|
||||
recordLeg(acc.id, tradeDate);
|
||||
|
||||
@@ -567,8 +575,13 @@ export async function copyTrade() {
|
||||
const { client, acc, contract } = item;
|
||||
const cfg = getAccountConfig(acc.id).accountType!;
|
||||
|
||||
const minLegs = item.plan.dayTarget > BIG_DAY_THRESHOLD ? (cfg.minLegs ?? 0) : 0;
|
||||
const legAmount = item.plan.splitAllowed
|
||||
? pickLegAmount(item.plan.remainingToday, () => groupLegFraction(item.prefix, tradeDate, legsToday(acc.id, tradeDate)))
|
||||
? pickLegAmount(
|
||||
item.plan.remainingToday,
|
||||
() => groupLegFraction(item.prefix, tradeDate, legsToday(acc.id, tradeDate)),
|
||||
minLegs - legsToday(acc.id, tradeDate),
|
||||
)
|
||||
: item.plan.remainingToday;
|
||||
recordLeg(acc.id, tradeDate);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user