File size: 2,326 Bytes
ce3c7ff
 
 
 
 
 
 
 
 
 
bf9d545
ce3c7ff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4435002
ce3c7ff
 
 
 
 
 
 
 
 
 
 
 
 
bf9d545
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100

export interface MungerStock {
    symbol: string;
    price: number;
    wma200: number;
    roe: number;
    debtToEquity: number;
    isQuality: boolean;
    lastCandleColor: 'GREEN' | 'RED';
    touchedWMA: boolean;
    signal: 'BUY_TRIGGER' | 'WATCHLIST' | 'IGNORE' | 'WAIT' | 'PORTFOLIO';
    details: string;
    sector?: string;
    marketCap?: number;
    mungerScore?: number;
    lastUpdated: string;
    tradePlan?: TradePlan;
}

export interface TradeOrder {
    role: 'ENTRY' | 'PROTECTIVE_STOP' | 'TAKE_PROFIT' | 'EXIT' | 'EXIT_AFTER_FILL';
    type: 'MARKET' | 'LIMIT' | 'STOP' | 'STOP_LIMIT' | 'OCO';
    side: 'BUY' | 'SELL';
    limitPrice?: number;
    stopPrice?: number;
    takeProfitLimit?: number;
    stopLossStop?: number;
    timeInForce?: 'GTC' | 'DAY';
    qty?: number;
    expireAfterDays?: number;
}

export interface TradePlan {
    symbol: string;
    recommendation: 'BUY' | 'SELL' | 'NO_TRADE';
    playbook: string;
    riskModel?: {
        atrPeriod: number;
        atr: number;
        kAtr: number;
        rr: number;
    };
    levels?: {
        entry: number;
        entryLimit?: number;
        stopLoss: number;
        takeProfit: number;
    };
    sizing?: {
        equity: number;
        buyingPower: number;
        riskPct: number;
        riskBudget: number;
        riskPerShare: number;
        qty: number;
        caps: {
            maxPositionPct: number;
            qtyByRisk: number;
            qtyByNotional: number;
            qtyByBuyingPower: number;
        };
    };
    orders: TradeOrder[];
    followUp: string[];
    reasons: string[];
}


export interface EngineStatus {
    status: 'IDLE' | 'SCANNING' | 'SYNCING' | 'ERROR';
    lastSyncTimestamp: string;
    apiLatencyMs: number;
    totalAssets: number;
    assetsAnalyzed: number;
    buyTriggers: number;
    errors: string[];
}

export interface SyncPayload {
    force?: boolean;
    segments?: ('mega' | 'large')[];
    symbols?: string[];
}

export interface AlpacaOrder {
    id: string;
    symbol: string;
    side: 'buy' | 'sell';
    type: string;
    qty: string;
    status: string;
    limitPrice?: string;
    stopPrice?: string;
    filledQty?: string;
    filledAvgPrice?: string; // Average fill price
    submittedAt: string;
    orderClass?: string;
    legs?: any[];
}