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;
}