Add multi-factor conviction gate to activation
Make "qualified" mean an edge candidate, not just R:R + confidence. The gate now also requires (all admin-configurable, defaults on): - high conviction: recommended_action LONG_HIGH / SHORT_HIGH only - clean read: risk_level Low (no contradicting signals) - probable primary target: best target probability >= min (default 60) - Shared predicate: app/services/qualification.py + frontend/src/lib/qualification.ts (mirrored) - Activation config extended (min_target_probability, require_high_conviction, exclude_conflicts) with bool-aware get/update + validation - /trades/performance switched to ?qualified_only=true, applying the full gate server-side; confidence breakdown stays unfiltered - Dashboard "Qualified", Signals "Qualified only" toggle, and Track Record all use the one gate; Admin gains the new controls Sentiment provider runtime config (prior change) included. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,8 @@ import type {
|
||||
AdminUser,
|
||||
PipelineReadiness,
|
||||
RecommendationConfig,
|
||||
SentimentProviderConfig,
|
||||
SentimentTestResult,
|
||||
SystemSetting,
|
||||
TickerUniverse,
|
||||
TickerUniverseBootstrapResult,
|
||||
@@ -81,6 +83,28 @@ export function updateActivationSettings(payload: Partial<ActivationConfig>) {
|
||||
.then((r) => r.data);
|
||||
}
|
||||
|
||||
export function getSentimentSettings() {
|
||||
return apiClient
|
||||
.get<SentimentProviderConfig>('admin/settings/sentiment')
|
||||
.then((r) => r.data);
|
||||
}
|
||||
|
||||
export function updateSentimentSettings(payload: {
|
||||
provider?: string;
|
||||
model?: string;
|
||||
api_key?: string;
|
||||
}) {
|
||||
return apiClient
|
||||
.put<SentimentProviderConfig>('admin/settings/sentiment', payload)
|
||||
.then((r) => r.data);
|
||||
}
|
||||
|
||||
export function testSentimentSettings(ticker: string) {
|
||||
return apiClient
|
||||
.post<SentimentTestResult>('admin/settings/sentiment/test', { ticker })
|
||||
.then((r) => r.data);
|
||||
}
|
||||
|
||||
export function getTickerUniverseSetting() {
|
||||
return apiClient
|
||||
.get<TickerUniverseSetting>('admin/settings/ticker-universe')
|
||||
|
||||
@@ -2,8 +2,7 @@ import apiClient from './client';
|
||||
import type { PerformanceStats } from '../lib/types';
|
||||
|
||||
export interface PerformanceParams {
|
||||
min_rr?: number;
|
||||
min_confidence?: number;
|
||||
qualified_only?: boolean;
|
||||
}
|
||||
|
||||
export function getPerformance(params?: PerformanceParams) {
|
||||
|
||||
Reference in New Issue
Block a user