Add per-stage withdrawal targets with consistency and min trading days
- Add withdrawal stage system: each stage defines profit target, consistency, and min trading days for post-withdrawal challenge cycles - Target Same Equity mode accounts for withdrawn amounts when computing effective profit target (profitTarget - remainingProfit) - Store fund transaction timestamps for time-aware cycle filtering (withdrawals before 9 AM CT include that day in new cycle) - Expose full P&L history (fullDailyPnL) for calendar/equity curve display across all cycles, with DB fallback for pre-restart data - Show stage number (#1, #2, etc.) on calendar cells - Hide consistency reference line when consistency is 0% or 100% - Settings UI: "After First W/D" column with same-equity checkbox, expandable stage sub-rows with profit/consistency/days inputs - Default target_same_equity to 1 for new and existing account configs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
c54073e4b8
commit
70b1362d3e
@@ -1,3 +1,54 @@
|
||||
/**
|
||||
* Resolve the effective profit target and consistency for an account based on its withdrawal strategy.
|
||||
*
|
||||
* Mode A (targetSameEquity=true): the account must reach the same cumulative equity level.
|
||||
* remainingProfit = priorProfit + totalWithdrawals (profit still in the account after payouts)
|
||||
* effectiveProfitTarget = profitTarget − remainingProfit
|
||||
*
|
||||
* Mode B (withdrawalStages non-empty): Stage 1 (no withdrawals yet) uses base profitTarget/consistency.
|
||||
* After the Nth withdrawal, use withdrawalStages[N-1]; last stage repeats.
|
||||
* Fallback: returns base profitTarget and consistency unchanged.
|
||||
*/
|
||||
export function resolveEffectiveConfig(
|
||||
profitTarget: number,
|
||||
consistency: number,
|
||||
minTradingDays: number,
|
||||
targetSameEquity: boolean,
|
||||
withdrawalStages: { profit: number; consistency: number; minTradingDays: number }[],
|
||||
priorProfit: number,
|
||||
fundTransactions: { date: string; amount: number }[]
|
||||
): { profitTarget: number; consistency: number; minTradingDays: number } {
|
||||
if (targetSameEquity) {
|
||||
// Withdrawals reduce the profit remaining in the account
|
||||
const totalWithdrawals = fundTransactions
|
||||
.filter((f) => f.amount < 0)
|
||||
.reduce((s, f) => s + f.amount, 0); // negative sum
|
||||
const remainingProfit = priorProfit + totalWithdrawals;
|
||||
return { profitTarget: Math.max(0, profitTarget - remainingProfit), consistency, minTradingDays };
|
||||
}
|
||||
if (withdrawalStages.length > 0) {
|
||||
const withdrawalCount = fundTransactions.filter((f) => f.amount < 0).length;
|
||||
if (withdrawalCount === 0) {
|
||||
return { profitTarget, consistency, minTradingDays }; // Stage 1 = base values
|
||||
}
|
||||
const idx = Math.min(withdrawalCount - 1, withdrawalStages.length - 1);
|
||||
const stage = withdrawalStages[idx];
|
||||
return { profitTarget: stage.profit, consistency: stage.consistency, minTradingDays: stage.minTradingDays };
|
||||
}
|
||||
return { profitTarget, consistency, minTradingDays };
|
||||
}
|
||||
|
||||
/** @deprecated Use resolveEffectiveConfig instead */
|
||||
export function resolveEffectiveProfitTarget(
|
||||
profitTarget: number,
|
||||
targetSameEquity: boolean,
|
||||
withdrawalStages: { profit: number; consistency: number; minTradingDays: number }[],
|
||||
priorProfit: number,
|
||||
fundTransactions: { date: string; amount: number }[]
|
||||
): number {
|
||||
return resolveEffectiveConfig(profitTarget, 0, 0, targetSameEquity, withdrawalStages, priorProfit, fundTransactions).profitTarget;
|
||||
}
|
||||
|
||||
/** Dollar-per-point value for common futures products. */
|
||||
export const POINT_VALUES: { [symbol: string]: number } = {
|
||||
NQ: 20, MNQ: 2, ES: 50, MES: 5,
|
||||
|
||||
Reference in New Issue
Block a user