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