Add configurable trading hours setting

Dropdown on settings page with two options:
- Full CME (5:00 PM – 3:00 PM CT) with 5 min buffer
- Equity Hours (8:30 AM – 3:00 PM CT) with 5 min buffer
Setting is read live each tick, no restart needed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Senofy
2026-03-15 19:57:48 -05:00
co-authored by Claude Opus 4.6
parent 11144612c7
commit f498594b16
4 changed files with 59 additions and 22 deletions
+23 -2
View File
@@ -19,12 +19,14 @@ interface AppSettings {
max_concurrent_accounts: string | null;
master_dashboard_url: string | null;
instance_name: string | null;
trading_hours: string | null;
}
export default function SettingsPage() {
const [instruments, setInstruments] = useState<Instrument[]>([]);
const [contracts, setContracts] = useState<Record<string, ResolvedContract | null>>({});
const [maxConcurrent, setMaxConcurrent] = useState<string>('5');
const [tradingHours, setTradingHours] = useState<string>('full_cme');
const [masterUrl, setMasterUrl] = useState<string>('');
const [instanceName, setInstanceName] = useState<string>('');
const [saving, setSaving] = useState(false);
@@ -41,6 +43,9 @@ export default function SettingsPage() {
if (s.max_concurrent_accounts != null) {
setMaxConcurrent(s.max_concurrent_accounts);
}
if (s.trading_hours != null) {
setTradingHours(s.trading_hours);
}
if (s.master_dashboard_url != null) {
setMasterUrl(s.master_dashboard_url);
}
@@ -101,7 +106,7 @@ export default function SettingsPage() {
await fetch('/api/settings', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ max_concurrent_accounts: maxConcurrent, master_dashboard_url: masterUrl, instance_name: instanceName }),
body: JSON.stringify({ max_concurrent_accounts: maxConcurrent, trading_hours: tradingHours, master_dashboard_url: masterUrl, instance_name: instanceName }),
});
setSaving(false);
setSaved(true);
@@ -127,7 +132,7 @@ export default function SettingsPage() {
Trading
</h2>
<div className="bg-white border border-slate-200 rounded-xl shadow-sm mb-8">
<div className="flex items-center justify-between px-4 py-3">
<div className="flex items-center justify-between px-4 py-3 border-b border-slate-100">
<div>
<p className="text-sm font-medium text-slate-800">Max concurrent accounts</p>
<p className="text-xs text-slate-400 mt-0.5">
@@ -156,6 +161,22 @@ export default function SettingsPage() {
</button>
</div>
</div>
<div className="flex items-center justify-between px-4 py-3">
<div>
<p className="text-sm font-medium text-slate-800">Allowed trading hours</p>
<p className="text-xs text-slate-400 mt-0.5">
5 min buffer
</p>
</div>
<select
value={tradingHours}
onChange={(e) => setTradingHours(e.target.value)}
className="rounded-lg border border-slate-200 bg-slate-50 px-3 py-1.5 text-sm font-mono text-slate-800 focus:outline-none focus:ring-2 focus:ring-blue-500"
>
<option value="full_cme">Full CME (5:00 PM 3:00 PM CT)</option>
<option value="equity_hours">Equity Hours (8:30 AM 3:00 PM CT)</option>
</select>
</div>
</div>
{/* ── Master Dashboard ── */}