Bot & Automation
Market AI
/root/hermes-projects/Market AI
src/domain/types.ts
text
export type MarketCategory = "forex" | "gold" | "crypto";
export type SignalAction = "BUY" | "SELL" | "WAIT";
export type ExecutableSignalAction = Exclude<SignalAction, "WAIT">;
export type TradingMode =
| "scalping"
| "intraday"
| "swing"
| "conservative"
| "aggressive";
export type Timeframe = "M1" | "M5" | "M15" | "H1" | "H4" | "D1" | "W1";
export type TradingRuntimeMode = "paper" | "semi_auto" | "full_auto";
export type MarketDataProviderName = "demo" | "twelvedata";
export type BrokerProviderName = "disabled" | "paper" | "mt5_bridge";
export type BrokerAccountType = "demo" | "real";
export type BrokerExecutionMode = "demo" | "real";
export type BrokerRuntimeMode = BrokerExecutionMode | "paper" | "unknown";
export type RiskLevel = "Low" | "Medium" | "High";
export interface MarketSymbol {
code: string;
label: string;
category: MarketCategory;
aliases: string[];
pipSize: number;
pipValuePerLot: number;
minLot: number;
maxLot: number;
defaultSpreadPips: number;
}
export interface Candle {
time: string;
open: number;
high: number;
low: number;
close: number;
volume: number;
}
export interface MarketDataResult {
candles: Candle[];
source: MarketDataProviderName;
warning?: string;
}
export interface ModeConfig {
label: string;
timeframes: Timeframe[];
confidenceThreshold: number;
riskMultiplier: number;
atrStopMultiplier: number;
targetRiskReward: number;
}
export interface TechnicalSnapshot {
ema20: number;
ema50: number;
ema200: number;
rsi: number;
atr: number;
macdHistogram: number;
support: number;
resistance: number;
volatilityPercent: number;
}
export interface TradingSignal {
id: string;
symbol: MarketSymbol;
mode: TradingMode;
timeframe: Timeframe;
action: SignalAction;
confidence: number;
currentPrice: number;
trend: string;
entry: number | null;
stopLoss: number | null;
takeProfit1: number | null;
takeProfit2: number | null;
riskLevel: RiskLevel;
riskRewardRatio: number;
reasons: string[];
invalidation: string;
snapshot: TechnicalSnapshot;
dataWarning?: string;
createdAt: string;
}
export interface RiskConfig {
accountBalance: number;
riskPerTradePercent: number;
maxDailyLossPercent: number;
maxOpenTrades: number;
maxLotPerOrder: number;
}
export interface PositionSizing {
lotSize: number;
riskAmount: number;
stopDistancePips: number;
}
export interface OrderIntent {
id: string;
chatId: number;
userId: number;
signalId: string;
symbolCode: string;
action: ExecutableSignalAction;
mode: TradingMode;
entry: number;
stopLoss: number;
takeProfit1: number;
takeProfit2: number;
confidence: number;
riskLevel: RiskLevel;
riskRewardRatio: number;
positionSizing: PositionSizing;
status: "pending" | "executed" | "rejected";
createdAt: string;
}
export interface ExecutedTrade extends OrderIntent {
executedAt: string;
broker: "paper" | "mt5_demo" | "real" | "dry_run";
brokerOrderId: string;
closedAt?: string;
closePrice?: number;
pnl?: number;
}
export interface OpenPosition {
ticket: string;
symbolCode: string;
action: ExecutableSignalAction;
lotSize: number;
entryPrice: number;
stopLoss: number;
takeProfit1: number;
takeProfit2: number;
floatingPnl: number;
openedAt: string;
chatId: number;
orderId: string;
}
export interface BrokerExecutionStatus {
provider: BrokerProviderName | "guarded";
connected: boolean;
currentMode: BrokerRuntimeMode;
allowDemoTrading: boolean;
allowRealTrading: boolean;
detail: string;
accountServer?: string;
accountLoginLast4?: string;
}
export interface WatchlistEntry {
chatId: number;
symbolCode: string;
addedAt: string;
}
export interface UserSettings {
chatId: number;
defaultMode: TradingMode;
}