{"_id":"@barfinex/signal-engine","name":"@barfinex/signal-engine","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@barfinex/signal-engine","version":"1.0.0","private":false,"description":"Domain signal decision engine for Barfinex detectors.","author":{"name":"Barfinex"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","require":"./dist/index.js","types":"./dist/index.d.ts"}},"sideEffects":false,"scripts":{"clean":"rimraf dist tsconfig.tsbuildinfo","prebuild":"node ../../tools/hygiene/clean-compiled-in-src.js","build":"tsc -p tsconfig.app.json","postbuild":"node ../../tools/hygiene/verify-no-compiled-in-src.js","prebuild:npm":"node ../../tools/hygiene/clean-compiled-in-src.js","build:npm":"tsc -p tsconfig.build.json","postbuild:npm":"node ../../tools/hygiene/verify-no-compiled-in-src.js","rebuild":"npm run clean && npm run build"},"keywords":["barfinex","signal","engine","trading","typescript"],"dependencies":{"@barfinex/types":"latest"},"devDependencies":{"typescript":"^5.6.3","rimraf":"^5.0.5"},"buildDate":"2026-03-26T11:35:00","_id":"@barfinex/signal-engine@1.0.0","gitHead":"22e06c041a000c89ea05413d1ba4efe30516b15a","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-TUwybNxOlEfIWWVxyghrs6U5QGeHoHYnrH4L/L9G8o9HvNQ6xP/IEmzonf7Z4J789Zte1BjJN+9Au+6u/AAIdA==","shasum":"74119e758fdbc7ea01864d157316462de96d4401","tarball":"https://registry.npmjs.org/@barfinex/signal-engine/-/signal-engine-1.0.0.tgz","fileCount":106,"unpackedSize":127973,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC3Y2WaBdgV/9gIG+kEJKB/vjn104eZxpz9a+xrWqJx7wIhANBWMYEuzmZtQUP0HtWLL8kPYytvANAu7u61Q8z3PunO"}]},"_npmUser":{"name":"vvsur","email":"info@barfin.org"},"directories":{},"maintainers":[{"name":"vvsur","email":"info@barfin.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/signal-engine_1.0.0_1774527221766_0.1092813439494067"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-26T12:13:41.655Z","1.0.0":"2026-03-26T12:13:41.914Z","modified":"2026-03-26T12:13:42.115Z"},"maintainers":[{"name":"vvsur","email":"info@barfin.org"}],"description":"Domain signal decision engine for Barfinex detectors.","keywords":["barfinex","signal","engine","trading","typescript"],"author":{"name":"Barfinex"},"license":"MIT","readme":"# @barfinex/signal-engine\n\nДоменный decision-layer для сигналов Barfinex.\n\n`Indicators (math) -> Signal Engine (decision) -> Detector (execution)`\n\nБиблиотека остаётся чистой:\n- без NestJS;\n- без `IndicatorsService`;\n- без зависимости от detector implementation.\n\n---\n\n## v2: что доступно\n\n- **Core**\n  - `SignalFeatureSet`, `IntervalSignalScore`, `AggregateSignalScore`\n  - `SignalRuntimeContext`, `SignalScorer<TFeatures>`\n  - `SignalPipeline`, `SignalStage`\n  - `SignalDiagnostics`\n- **Regime**\n  - `MarketRegime`\n  - `RegimeProfile`\n  - `RegimeClassifier`\n- **Volatility**\n  - `VolatilityMetrics`\n  - `VolatilityProfile`\n  - `readVolatility(...)`\n  - `VolatilityStage`\n- **Trend**\n  - `TrendSignalEngine`\n  - `TrendSignalProfile`\n  - `TrendFeatures` (типизированный `SignalFeatureSet`)\n- **ML**\n  - `MLAdapter`, `MLInputBuilder`, `MLOutputParser`\n  - `MLSignalRequest`, `MLSignalResponse`, `MLDirection`\n  - `buildSystemInstructions()`, strict JSON schema contract\n  - `HybridPolicy`, `combineDecisions(...)`\n- **Advisor facade**\n  - `DefaultAdvisorSignalFacade`\n  - `AdvisorSignalFacade` contracts for build/parse/combine\n\n---\n\n## Структура\n\n```text\nlibs/signal-engine/\n  src/\n    core/\n      signal.types.ts\n      signal.runtime.ts\n      signal.scorer.ts\n      signal.pipeline.ts\n      signal.diagnostics.ts\n    regime/\n      regime.types.ts\n      regime.profile.ts\n      regime.classifier.ts\n    volatility/\n      volatility.types.ts\n      volatility.profile.ts\n      volatility.metrics.ts\n    trend/\n      trend.types.ts\n      trend.profile.ts\n      trend.engine.ts\n      trend.engine.spec.ts\n    index.ts\n```\n\n---\n\n## Быстрый пример v2\n\n```ts\nimport {\n  DEFAULT_TREND_PROFILE,\n  SignalDirection,\n  TrendSignalEngine,\n} from '@barfinex/signal-engine';\nimport { TimeFrame } from '@barfinex/types';\n\nconst engine = new TrendSignalEngine({\n  ...DEFAULT_TREND_PROFILE,\n  regime: {\n    enabled: true,\n  },\n  volatility: {\n    enabled: true,\n    blockHighVol: true,\n  },\n});\n\nconst intervalScore = engine.evaluateInterval(\n  {\n    interval: TimeFrame.min5,\n    price: 102,\n    values: {\n      smaFast: 100,\n      smaMid: 99,\n      smaSlow: 97,\n      rsi: 58,\n      adx: 24,\n      macdHistogram: 0.4,\n      atrPct: 0.012,\n      rangePct: 0.008,\n    },\n  },\n  { barsCount: 180 },\n);\n\nconst aggregate = engine.aggregate([intervalScore]);\n\nif (aggregate.direction === SignalDirection.Up) {\n  // execution в detector слое\n}\n```\n\n---\n\n## Pipeline (stages)\n\n```ts\nimport {\n  SignalPipeline,\n  SignalFeatureSet,\n  VolatilityStage,\n} from '@barfinex/signal-engine';\n\nconst pipeline = new SignalPipeline<SignalFeatureSet>([\n  new VolatilityStage(),\n]);\n\nconst enriched = pipeline.run(featureSet, runtime);\nconst score = engine.evaluateInterval(enriched, runtime);\n```\n\n---\n\n## Диагностика\n\nНа interval и aggregate уровне доступны:\n- `diagnostics.regime`\n- `diagnostics.volatility` (`atr`, `atrPct`, `rangePct`, flags)\n- `diagnostics.confidence`\n- `diagnostics.notes` (explainability reasons)\n\n---\n\n## FollowTrend integration (v2)\n\n`FollowTrendService` в detector:\n- собирает `SignalFeatureSet` из indicator values;\n- прокидывает `rangePct` и/или `atrPct` в `values`;\n- вызывает `engine.evaluateInterval(...)`;\n- агрегирует через `engine.aggregate(...)`.\n\n---\n\n## Тесты\n\n```bash\nnpm run test -- libs/signal-engine/src/trend/trend.engine.spec.ts\n```\n\nML/Advisor facade tests:\n\n```bash\nnpx jest \"libs/signal-engine/src/ml/ml.adapter.spec.ts\" \"libs/signal-engine/src/advisor/advisor.facade.spec.ts\"\n```\n\n---\n\n## Advisor hybrid integration\n\n`signal-engine` предоставляет pure layer для `apps/advisor`:\n\n- build ML request (deterministic payload),\n- parse ML response (strict JSON contract),\n- merge rule + ml decision (policy-driven).\n\nВажно:\n\n- никаких сетевых вызовов внутри `signal-engine`;\n- никаких секретов/токенов в библиотеке;\n- реальные LLM вызовы остаются на стороне `apps/advisor`/`libs/advisor`.\n\nДетальный гайд:\n\n- `docs/advisor-signal-engine-hybrid-integration.md`\n\n","readmeFilename":"README.md","_rev":"1-9f84c1359411cebb536d0fc042eac194"}