export interface TradingConfig { symbol: string; tradeAmount: number; lossLimit: number; trailingProfit: number; trailingCallbackRate: number; profitLockTriggerUsd: number; profitLockOffsetUsd: number; pollIntervalMs: number; maxLogEntries: number; klineInterval: string; maxCloseSlippagePct: number; priceTick: number; // price tick size, e.g. 0.1 for BTCUSDT qtyStep: number; // quantity step size, e.g. 0.001 BTC bollingerLength: number; bollingerStdMultiplier: number; minBollingerBandwidth: number; } function parseNumber(value: string | undefined, fallback: number): number { if (!value) return fallback; const next = Number(value); return Number.isFinite(next) ? next : fallback; } export const tradingConfig: TradingConfig = { symbol: process.env.TRADE_SYMBOL ?? "BTCUSDT", tradeAmount: parseNumber(process.env.TRADE_AMOUNT, 0.001), lossLimit: parseNumber(process.env.LOSS_LIMIT, 0.03), trailingProfit: parseNumber(process.env.TRAILING_PROFIT, 0.2), trailingCallbackRate: parseNumber(process.env.TRAILING_CALLBACK_RATE, 0.2), profitLockTriggerUsd: parseNumber(process.env.PROFIT_LOCK_TRIGGER_USD, 0.1), profitLockOffsetUsd: parseNumber(process.env.PROFIT_LOCK_OFFSET_USD, 0.05), pollIntervalMs: parseNumber(process.env.POLL_INTERVAL_MS, 500), maxLogEntries: parseNumber(process.env.MAX_LOG_ENTRIES, 200), klineInterval: process.env.KLINE_INTERVAL ?? "1m", maxCloseSlippagePct: parseNumber(process.env.MAX_CLOSE_SLIPPAGE_PCT, 0.05), priceTick: parseNumber(process.env.PRICE_TICK, 0.1), qtyStep: parseNumber(process.env.QTY_STEP, 0.001), bollingerLength: parseNumber(process.env.BOLLINGER_LENGTH, 20), bollingerStdMultiplier: parseNumber(process.env.BOLLINGER_STD_MULTIPLIER, 2), minBollingerBandwidth: parseNumber(process.env.MIN_BOLLINGER_BANDWIDTH, 0.001), }; export interface MakerConfig { symbol: string; tradeAmount: number; lossLimit: number; bidOffset: number; askOffset: number; refreshIntervalMs: number; maxLogEntries: number; maxCloseSlippagePct: number; priceTick: number; } export const makerConfig: MakerConfig = { symbol: process.env.TRADE_SYMBOL ?? "BTCUSDT", tradeAmount: parseNumber(process.env.TRADE_AMOUNT, 0.001), lossLimit: parseNumber(process.env.MAKER_LOSS_LIMIT, parseNumber(process.env.LOSS_LIMIT, 0.03)), bidOffset: parseNumber(process.env.MAKER_BID_OFFSET, 0), askOffset: parseNumber(process.env.MAKER_ASK_OFFSET, 0), refreshIntervalMs: parseNumber(process.env.MAKER_REFRESH_INTERVAL_MS, 1500), maxLogEntries: parseNumber(process.env.MAKER_MAX_LOG_ENTRIES, 200), maxCloseSlippagePct: parseNumber( process.env.MAKER_MAX_CLOSE_SLIPPAGE_PCT ?? process.env.MAX_CLOSE_SLIPPAGE_PCT, 0.05 ), priceTick: parseNumber(process.env.MAKER_PRICE_TICK ?? process.env.PRICE_TICK, 0.1), };