58 lines
1.6 KiB
TypeScript
58 lines
1.6 KiB
TypeScript
import { logger } from '@stock-bot/logger';
|
|
import { Order, OrderResult } from '@stock-bot/types';
|
|
import { BrokerInterface } from '../broker/interface.ts';
|
|
|
|
export class OrderManager {
|
|
private broker: BrokerInterface;
|
|
private pendingOrders: Map<string, Order> = new Map();
|
|
|
|
constructor(broker: BrokerInterface) {
|
|
this.broker = broker;
|
|
}
|
|
|
|
async executeOrder(order: Order): Promise<OrderResult> {
|
|
try {
|
|
logger.info(
|
|
`Executing order: ${order.symbol} ${order.side} ${order.quantity} @ ${order.price}`
|
|
);
|
|
|
|
// Add to pending orders
|
|
const orderId = `order_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
this.pendingOrders.set(orderId, order);
|
|
|
|
// Execute with broker
|
|
const result = await this.broker.executeOrder(order);
|
|
|
|
// Remove from pending
|
|
this.pendingOrders.delete(orderId);
|
|
|
|
logger.info(`Order executed successfully: ${result.orderId}`);
|
|
return result;
|
|
} catch (error) {
|
|
logger.error('Order execution failed', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async cancelOrder(orderId: string): Promise<boolean> {
|
|
try {
|
|
const success = await this.broker.cancelOrder(orderId);
|
|
if (success) {
|
|
this.pendingOrders.delete(orderId);
|
|
logger.info(`Order cancelled: ${orderId}`);
|
|
}
|
|
return success;
|
|
} catch (error) {
|
|
logger.error('Order cancellation failed', error);
|
|
throw error;
|
|
}
|
|
}
|
|
|
|
async getOrderStatus(orderId: string) {
|
|
return await this.broker.getOrderStatus(orderId);
|
|
}
|
|
|
|
getPendingOrders(): Order[] {
|
|
return Array.from(this.pendingOrders.values());
|
|
}
|
|
}
|