Improve local defaults and replay candle fetch

This commit is contained in:
dirtydishes 2026-01-09 15:29:41 -05:00
parent b9ad182473
commit 1583a50412
11 changed files with 193 additions and 42 deletions

View file

@ -76,10 +76,10 @@ const logger = createLogger({ service });
const envSchema = z.object({
API_PORT: z.coerce.number().int().positive().default(4000),
NATS_URL: z.string().default("nats://localhost:4222"),
CLICKHOUSE_URL: z.string().default("http://localhost:8123"),
NATS_URL: z.string().default("nats://127.0.0.1:4222"),
CLICKHOUSE_URL: z.string().default("http://127.0.0.1:8123"),
CLICKHOUSE_DATABASE: z.string().default("default"),
REDIS_URL: z.string().default("redis://localhost:6379"),
REDIS_URL: z.string().default("redis://127.0.0.1:6379"),
REST_DEFAULT_LIMIT: z.coerce.number().int().positive().default(200)
});
@ -311,7 +311,7 @@ const run = async () => {
servers: env.NATS_URL,
name: service
},
{ attempts: 20, delayMs: 500 }
{ attempts: 120, delayMs: 500 }
);
await ensureStream(jsm, {

View file

@ -26,11 +26,11 @@ const logger = createLogger({ service });
const metrics = createMetrics({ service });
const envSchema = z.object({
NATS_URL: z.string().default("nats://localhost:4222"),
CLICKHOUSE_URL: z.string().default("http://localhost:8123"),
NATS_URL: z.string().default("nats://127.0.0.1:4222"),
CLICKHOUSE_URL: z.string().default("http://127.0.0.1:8123"),
CLICKHOUSE_DATABASE: z.string().default("default"),
REDIS_URL: z.string().default("redis://localhost:6379"),
CANDLE_INTERVALS_MS: z.string().default("1000,5000,60000"),
REDIS_URL: z.string().default("redis://127.0.0.1:6379"),
CANDLE_INTERVALS_MS: z.string().default("60000,300000"),
CANDLE_MAX_LATE_MS: z.coerce.number().int().nonnegative().default(0),
CANDLE_CACHE_LIMIT: z.coerce.number().int().nonnegative().default(2000),
CANDLE_DELIVER_POLICY: z
@ -185,7 +185,7 @@ const emitCandle = async (
const run = async () => {
logger.info("service starting");
const intervalsMs = parseIntervals(env.CANDLE_INTERVALS_MS, [1000, 5000, 60000]);
const intervalsMs = parseIntervals(env.CANDLE_INTERVALS_MS, [60000, 300000]);
if (intervalsMs.length === 0) {
throw new Error("CANDLE_INTERVALS_MS produced no valid intervals");
}
@ -200,7 +200,7 @@ const run = async () => {
servers: env.NATS_URL,
name: service
},
{ attempts: 20, delayMs: 500 }
{ attempts: 120, delayMs: 500 }
);
await ensureStream(jsm, {

View file

@ -74,10 +74,10 @@ const service = "compute";
const logger = createLogger({ service });
const envSchema = z.object({
NATS_URL: z.string().default("nats://localhost:4222"),
CLICKHOUSE_URL: z.string().default("http://localhost:8123"),
NATS_URL: z.string().default("nats://127.0.0.1:4222"),
CLICKHOUSE_URL: z.string().default("http://127.0.0.1:8123"),
CLICKHOUSE_DATABASE: z.string().default("default"),
REDIS_URL: z.string().default("redis://localhost:6379"),
REDIS_URL: z.string().default("redis://127.0.0.1:6379"),
CLUSTER_WINDOW_MS: z.coerce.number().int().positive().default(500),
ROLLING_WINDOW_SIZE: z.coerce.number().int().positive().default(50),
ROLLING_TTL_SEC: z.coerce.number().int().nonnegative().default(86400),
@ -758,7 +758,7 @@ const run = async () => {
servers: env.NATS_URL,
name: service
},
{ attempts: 20, delayMs: 500 }
{ attempts: 120, delayMs: 500 }
);
await ensureStream(jsm, {

View file

@ -22,6 +22,10 @@ const DARK_SEQUENCE: DarkScenario[] = [
"sell",
"sell"
];
const SYNTHETIC_SYMBOLS = [
"SPY",
...SP500_SYMBOLS.filter((symbol) => symbol !== "SPY")
];
const hashSymbol = (value: string): number => {
let hash = 0;
@ -138,7 +142,7 @@ export const createSyntheticEquitiesAdapter = (
const now = Date.now();
const batchSize = 3;
const darkSymbol = SP500_SYMBOLS[darkSymbolIndex % SP500_SYMBOLS.length];
const darkSymbol = SYNTHETIC_SYMBOLS[darkSymbolIndex % SYNTHETIC_SYMBOLS.length];
const darkHash = hashSymbol(darkSymbol);
const darkBase = 25 + (darkHash % 475);
const darkDrift = ((darkStep % 24) - 12) * 0.08;
@ -189,7 +193,7 @@ export const createSyntheticEquitiesAdapter = (
for (let i = 0; i < batchSize; i += 1) {
seq += 1;
const symbol = SP500_SYMBOLS[(seq + i) % SP500_SYMBOLS.length];
const symbol = SYNTHETIC_SYMBOLS[(seq + i) % SYNTHETIC_SYMBOLS.length];
const symbolHash = hashSymbol(symbol);
const basePrice = 25 + (symbolHash % 475);
const mid = formatPrice(basePrice + ((seq % 40) - 20) * 0.05);

View file

@ -30,8 +30,8 @@ const service = "ingest-equities";
const logger = createLogger({ service });
const envSchema = z.object({
NATS_URL: z.string().default("nats://localhost:4222"),
CLICKHOUSE_URL: z.string().default("http://localhost:8123"),
NATS_URL: z.string().default("nats://127.0.0.1:4222"),
CLICKHOUSE_URL: z.string().default("http://127.0.0.1:8123"),
CLICKHOUSE_DATABASE: z.string().default("default"),
EQUITIES_INGEST_ADAPTER: z.string().min(1).default("synthetic"),
EMIT_INTERVAL_MS: z.coerce.number().int().positive().default(1000),
@ -129,7 +129,7 @@ const run = async () => {
servers: env.NATS_URL,
name: service
},
{ attempts: 20, delayMs: 500 }
{ attempts: 120, delayMs: 500 }
);
await ensureStream(jsm, {

View file

@ -17,6 +17,10 @@ type Burst = {
seed: number;
};
const SYNTHETIC_SYMBOLS = [
"SPY",
...SP500_SYMBOLS.filter((symbol) => symbol !== "SPY")
];
const MS_PER_DAY = 24 * 60 * 60 * 1000;
const EXPIRY_OFFSETS = [0, 1, 7, 14, 28, 45, 60, 90];
const EXCHANGES = ["CBOE", "PHLX", "ISE", "ARCA", "BOX", "MIAX"];
@ -177,7 +181,7 @@ const formatExpiry = (now: number, offsetDays: number): string => {
};
const buildBurst = (burstIndex: number, now: number): Burst => {
const symbol = SP500_SYMBOLS[burstIndex % SP500_SYMBOLS.length];
const symbol = SYNTHETIC_SYMBOLS[burstIndex % SYNTHETIC_SYMBOLS.length];
const symbolHash = hashSymbol(symbol);
const seed = symbolHash + burstIndex * 7;
const scenario = pickWeighted(SCENARIOS, seed);

View file

@ -28,8 +28,8 @@ const service = "ingest-options";
const logger = createLogger({ service });
const envSchema = z.object({
NATS_URL: z.string().default("nats://localhost:4222"),
CLICKHOUSE_URL: z.string().default("http://localhost:8123"),
NATS_URL: z.string().default("nats://127.0.0.1:4222"),
CLICKHOUSE_URL: z.string().default("http://127.0.0.1:8123"),
CLICKHOUSE_DATABASE: z.string().default("default"),
OPTIONS_INGEST_ADAPTER: z.string().min(1).default("synthetic"),
ALPACA_KEY_ID: z.string().default(""),
@ -225,7 +225,7 @@ const run = async () => {
servers: env.NATS_URL,
name: service
},
{ attempts: 20, delayMs: 500 }
{ attempts: 120, delayMs: 500 }
);
await ensureStream(jsm, {