diff --git a/packages/bot/src/bot.manager.ts b/packages/bot/src/bot.manager.ts index 35cc1bdc..f950ce8a 100644 --- a/packages/bot/src/bot.manager.ts +++ b/packages/bot/src/bot.manager.ts @@ -3,6 +3,7 @@ import { logger } from "@opentrader/logger"; import { Bot } from "./bot.js"; import { MarketsStream } from "./streams/markets.stream.js"; import { OrdersStream } from "./streams/orders.stream.js"; +import { TradeManager } from "./trade.manager.js"; export class BotManager { bots: Bot[] = []; @@ -10,6 +11,7 @@ export class BotManager { constructor( private ordersStream: OrdersStream, private marketsStream: MarketsStream, + private tradeManager: TradeManager, ) {} async start(id: number) { @@ -22,7 +24,7 @@ export class BotManager { include: { exchangeAccount: true }, }); - const bot = new Bot(data, this.ordersStream, this.marketsStream); + const bot = new Bot(data, this.ordersStream, this.marketsStream, this.tradeManager); try { await bot.start(); @@ -47,7 +49,7 @@ export class BotManager { where: { id }, include: { exchangeAccount: true }, }); - const bot = new Bot(data, this.ordersStream, this.marketsStream); + const bot = new Bot(data, this.ordersStream, this.marketsStream, this.tradeManager); await bot.stop(); return; diff --git a/packages/bot/src/bot.ts b/packages/bot/src/bot.ts index 87364d09..17d1e539 100644 --- a/packages/bot/src/bot.ts +++ b/packages/bot/src/bot.ts @@ -8,6 +8,7 @@ import { BotProcessing, getWatchers, shouldRunStrategy } from "@opentrader/proce import { MarketEvent, MarketId, MarketEventType } from "@opentrader/types"; import { MarketsStream } from "./streams/markets.stream.js"; import { OrderEvent, OrdersStream } from "./streams/orders.stream.js"; +import { TradeManager } from "./trade.manager.js"; type OrderFilledEvent = { type: typeof MarketEventType.onOrderFilled; @@ -33,6 +34,7 @@ export class Bot { public bot: TBotWithExchangeAccount, private ordersStream: OrdersStream, private marketsStream: MarketsStream, + private tradeManager: TradeManager, ) { this.strategy = findStrategy(this.bot.template); this.queue = cargoQueue(this.queueHandler); @@ -178,6 +180,12 @@ export class Bot { this.queue.kill(); this.stopped = true; + // Stop all trades executors + const trades = this.tradeManager.trades.filter((trade) => trade.smartTrade.botId === this.bot.id); + for (const trade of trades) { + trade.destroy(); + } + // Mark the bot as disabled this.bot = await xprisma.bot.custom.update({ where: { id: this.bot.id }, diff --git a/packages/bot/src/platform.ts b/packages/bot/src/platform.ts index 1e5eb9dc..c2984ec9 100644 --- a/packages/bot/src/platform.ts +++ b/packages/bot/src/platform.ts @@ -33,8 +33,8 @@ export class Platform { this.marketStream = new MarketsStream([]); this.marketStream.on("market", this.handleMarketEvent); - this.botManager = new BotManager(this.ordersStream, this.marketStream); this.tradeManager = new TradeManager(this.ordersStream); + this.botManager = new BotManager(this.ordersStream, this.marketStream, this.tradeManager); } async bootstrap() {