import { Alpaca } from "./alpaca"; import { Indicator } from "./indicator"; import { logger } from "./logger"; import { wait } from "./trading"; export interface MomentumResult { direction: 'up' | 'down'; priceBefore: number; priceAfter: number; } export interface MomentumIndicatorConfig { symbol: string; settleDelay: number; sampleDelay: number; } const defaultConfig: MomentumIndicatorConfig = { symbol: 'QQQ', settleDelay: 60_000, sampleDelay: 1_000, }; export class MomentumIndicator implements Indicator { name = 'momentum-indicator'; private config: MomentumIndicatorConfig; constructor(config: Partial = {}) { this.config = { ...defaultConfig, ...config }; } async evaluate(alpaca: Alpaca): Promise { logger.debug(`waiting ${this.config.settleDelay}ms for market to settle`); await wait(this.config.settleDelay); const priceBefore = await alpaca.getLatestAsk(this.config.symbol); logger.debug(`${this.config.symbol} priceBefore: ${priceBefore}`); await wait(this.config.sampleDelay); const priceAfter = await alpaca.getLatestAsk(this.config.symbol); const direction = priceAfter >= priceBefore ? 'up' : 'down'; logger.debug(`${this.config.symbol} priceAfter: ${priceAfter} → direction: ${direction}`); return { direction, priceBefore, priceAfter }; } }