Bot & Automation

Market AI

/root/hermes-projects/Market AI

src/app.ts text
import { Telegraf } from "telegraf";
import { env } from "./config/env";
import { createMarketDataService } from "./services/market-data/marketDataService";
import { ForexStrategy } from "./services/strategy/forexStrategy";
import { RiskManager } from "./services/riskManager";
import { JsonStore } from "./services/storage/jsonStore";
import { GuardedRealBrokerAdapter, Mt5BridgeBrokerAdapter, PaperBrokerAdapter } from "./services/broker/broker";
import { TradingService } from "./services/tradingService";
import { AutoTradingService } from "./services/autoTradingService";
import { registerHandlers } from "./bot/handlers/registerHandlers";
import type { BrokerAdapter } from "./services/broker/broker";
import type { MarketDataService } from "./services/market-data/marketDataService";

export interface AppComponents {
  tradingService: TradingService;
  broker: BrokerAdapter;
  marketDataService: MarketDataService;
  store: JsonStore;
}

export function createAppComponents(): AppComponents {
  const store = new JsonStore(env.dataDir);
  const marketDataService = createMarketDataService(env.marketDataProvider, env.twelveDataApiKey);
  const strategy = new ForexStrategy(marketDataService);
  const riskManager = new RiskManager(env.risk);
  const broker = createBrokerAdapter(store);
  const tradingService = new TradingService(strategy, riskManager, store, broker);

  return { tradingService, broker, marketDataService, store };
}

/** @deprecated Gunakan createAppComponents(). Tetap dipertahankan untuk backward compat. */
export function createTradingService(): TradingService {
  return createAppComponents().tradingService;
}

function createBrokerAdapter(store: JsonStore): BrokerAdapter {
  if (!env.enableRealTrading || env.tradingMode === "paper") {
    return new PaperBrokerAdapter(store);
  }

  if (env.brokerProvider === "mt5_bridge" && env.exness.mt5BridgeUrl && env.exness.mt5BridgeToken) {
    return new Mt5BridgeBrokerAdapter(env.exness.mt5BridgeUrl, env.exness.mt5BridgeToken);
  }

  return new GuardedRealBrokerAdapter();
}

export function createBot(
): Telegraf {
  if (!env.telegramBotToken) {
    throw new Error("TELEGRAM_BOT_TOKEN belum diisi.");
  }

  return new Telegraf(env.telegramBotToken);
}

export function registerBot(
  bot: Telegraf,
  components: AppComponents,
  autoTradingService?: AutoTradingService
): Telegraf {
  registerHandlers(bot, components.tradingService, autoTradingService);
  return bot;
}

export function createAutoTradingService(
  components: AppComponents,
  bot: Telegraf
): AutoTradingService {
  return new AutoTradingService(
    components.tradingService,
    components.broker,
    components.marketDataService,
    env.autoTrading,
    bot.telegram
  );
}