1566b84379
Applies the backtest-validated trailing stop to live paper trading, and surfaces it transparently. Exit (A): - New paper-trade exit policy (paper_exit_mode=trailing, paper_trailing_pct=12), tunable in Admin → Paper-Trade Exit. resolve_open_trades runs a trailing stop (initial stop as floor, ratchets up from the peak; target ignored — the validated rule) and records close_reason (trailing|stop|target|manual; +migration 013). - list_trades enriches open trades with the live trailing-stop level + distance %. Open Trades panel shows the active tactic and a Trail Stop column. Alerts (B): - Daily digest now lists open trades with unrealized gain, trailing stop, and how far away it is. - New "trade closed" alert: one summary per auto-close (trailing/target/stop, not manual) — direction, reason, days held, P&L abs+%/R — covering wins AND stop-loss losses. Deduped by trade id; toggle in Admin alerts. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
2.3 KiB
TypeScript
57 lines
2.3 KiB
TypeScript
import { useState } from 'react';
|
|
import { ActivationSettings } from '../components/admin/ActivationSettings';
|
|
import { ExitPolicySettings } from '../components/admin/ExitPolicySettings';
|
|
import { AlertSettings } from '../components/admin/AlertSettings';
|
|
import { SentimentProviderSettings } from '../components/admin/SentimentProviderSettings';
|
|
import { DataCleanup } from '../components/admin/DataCleanup';
|
|
import { JobControls } from '../components/admin/JobControls';
|
|
import { PipelineReadinessPanel } from '../components/admin/PipelineReadinessPanel';
|
|
import { RecommendationSettings } from '../components/admin/RecommendationSettings';
|
|
import { ScheduleSettings } from '../components/admin/ScheduleSettings';
|
|
import { SettingsForm } from '../components/admin/SettingsForm';
|
|
import { TickerManagement } from '../components/admin/TickerManagement';
|
|
import { TickerUniverseBootstrap } from '../components/admin/TickerUniverseBootstrap';
|
|
import { UserTable } from '../components/admin/UserTable';
|
|
import { PageHeader } from '../components/ui/PageHeader';
|
|
import { Tabs } from '../components/ui/Tabs';
|
|
|
|
const tabs = ['Users', 'Tickers', 'Settings', 'Jobs', 'Cleanup'] as const;
|
|
type Tab = (typeof tabs)[number];
|
|
|
|
export default function AdminPage() {
|
|
const [activeTab, setActiveTab] = useState<Tab>('Users');
|
|
|
|
return (
|
|
<div className="space-y-6 animate-slide-up">
|
|
<PageHeader title="Admin" subtitle="System management" />
|
|
|
|
<Tabs tabs={tabs} active={activeTab} onChange={setActiveTab} />
|
|
|
|
{/* Tab content */}
|
|
<div className="animate-fade-in">
|
|
{activeTab === 'Users' && <UserTable />}
|
|
{activeTab === 'Tickers' && <TickerManagement />}
|
|
{activeTab === 'Settings' && (
|
|
<div className="space-y-4">
|
|
<ActivationSettings />
|
|
<ExitPolicySettings />
|
|
<AlertSettings />
|
|
<SentimentProviderSettings />
|
|
<TickerUniverseBootstrap />
|
|
<RecommendationSettings />
|
|
<SettingsForm />
|
|
</div>
|
|
)}
|
|
{activeTab === 'Jobs' && (
|
|
<div className="space-y-4">
|
|
<ScheduleSettings />
|
|
<JobControls />
|
|
<PipelineReadinessPanel />
|
|
</div>
|
|
)}
|
|
{activeTab === 'Cleanup' && <DataCleanup />}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|