@reefclaw/connect 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/assets/bridge/gateway/event-parser.d.ts +6 -1
  2. package/assets/bridge/gateway/event-parser.js +19 -2
  3. package/assets/bridge/gateway/heartbeat-cron.d.ts +27 -0
  4. package/assets/bridge/gateway/heartbeat-cron.js +85 -0
  5. package/assets/bridge/gateway/poller.d.ts +1 -0
  6. package/assets/bridge/gateway/poller.js +14 -2
  7. package/assets/bridge/providers/gateway.d.ts +24 -2
  8. package/assets/bridge/providers/gateway.js +124 -25
  9. package/assets/bridge/setup.js +6 -51
  10. package/assets/shared/signals/conditions/registry.js +11 -2
  11. package/assets/shared/signals/strategy-adapter.js +17 -7
  12. package/assets/skill/SKILL.md +2 -0
  13. package/dist/deps.js +2 -2
  14. package/dist/plugin.js +35 -7
  15. package/package.json +1 -1
  16. package/assets/plugin/audit/mode-transition-audit.d.ts +0 -11
  17. package/assets/plugin/audit/mode-transition-audit.js +0 -29
  18. package/assets/plugin/balance-utils.d.ts +0 -36
  19. package/assets/plugin/balance-utils.js +0 -98
  20. package/assets/plugin/ccxt/binance-ban-gate.d.ts +0 -47
  21. package/assets/plugin/ccxt/binance-ban-gate.js +0 -420
  22. package/assets/plugin/ccxt/binance-private.d.ts +0 -346
  23. package/assets/plugin/ccxt/binance-private.js +0 -1525
  24. package/assets/plugin/ccxt/binance-public.d.ts +0 -34
  25. package/assets/plugin/ccxt/binance-public.js +0 -180
  26. package/assets/plugin/ccxt/intel-public.d.ts +0 -25
  27. package/assets/plugin/ccxt/intel-public.js +0 -80
  28. package/assets/plugin/ccxt/public-market-data-api.d.ts +0 -12
  29. package/assets/plugin/ccxt/public-market-data-api.js +0 -9
  30. package/assets/plugin/config/agent-config-client.d.ts +0 -77
  31. package/assets/plugin/config/agent-config-client.js +0 -188
  32. package/assets/plugin/config/agent-config-poller.d.ts +0 -32
  33. package/assets/plugin/config/agent-config-poller.js +0 -101
  34. package/assets/plugin/config/brackets-config.d.ts +0 -22
  35. package/assets/plugin/config/brackets-config.js +0 -58
  36. package/assets/plugin/config/entitlement-gate.d.ts +0 -51
  37. package/assets/plugin/config/entitlement-gate.js +0 -137
  38. package/assets/plugin/config/gate-store.d.ts +0 -18
  39. package/assets/plugin/config/gate-store.js +0 -61
  40. package/assets/plugin/config/plugin-config-io.d.ts +0 -215
  41. package/assets/plugin/config/plugin-config-io.js +0 -111
  42. package/assets/plugin/config/position-review-config.d.ts +0 -35
  43. package/assets/plugin/config/position-review-config.js +0 -105
  44. package/assets/plugin/config/tool-gate.d.ts +0 -53
  45. package/assets/plugin/config/tool-gate.js +0 -128
  46. package/assets/plugin/config/user-data-stream-config.d.ts +0 -89
  47. package/assets/plugin/config/user-data-stream-config.js +0 -239
  48. package/assets/plugin/connector-supervisor.d.ts +0 -36
  49. package/assets/plugin/connector-supervisor.js +0 -149
  50. package/assets/plugin/exchange-adapter.d.ts +0 -65
  51. package/assets/plugin/exchange-adapter.js +0 -4
  52. package/assets/plugin/index.d.ts +0 -30
  53. package/assets/plugin/index.js +0 -2678
  54. package/assets/plugin/ingest/pending-entry-metadata.d.ts +0 -74
  55. package/assets/plugin/ingest/pending-entry-metadata.js +0 -236
  56. package/assets/plugin/ingest/position-auto-capture.d.ts +0 -103
  57. package/assets/plugin/ingest/position-auto-capture.js +0 -411
  58. package/assets/plugin/ingest/position-decisions-client.d.ts +0 -322
  59. package/assets/plugin/ingest/position-decisions-client.js +0 -296
  60. package/assets/plugin/ingest/readiness-reporter.d.ts +0 -42
  61. package/assets/plugin/ingest/readiness-reporter.js +0 -163
  62. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +0 -13
  63. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +0 -114
  64. package/assets/plugin/ingest/reconciler-cleanup.d.ts +0 -37
  65. package/assets/plugin/ingest/reconciler-cleanup.js +0 -147
  66. package/assets/plugin/ingest/rest-gap-filler.d.ts +0 -191
  67. package/assets/plugin/ingest/rest-gap-filler.js +0 -565
  68. package/assets/plugin/ingest/touched-symbols-store.d.ts +0 -25
  69. package/assets/plugin/ingest/touched-symbols-store.js +0 -96
  70. package/assets/plugin/ingest/trade-store-client.d.ts +0 -40
  71. package/assets/plugin/ingest/trade-store-client.js +0 -125
  72. package/assets/plugin/ingest/ws-ingest.d.ts +0 -43
  73. package/assets/plugin/ingest/ws-ingest.js +0 -126
  74. package/assets/plugin/learning/setup-family.d.ts +0 -21
  75. package/assets/plugin/learning/setup-family.js +0 -103
  76. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +0 -33
  77. package/assets/plugin/lifecycle/install-signal-handlers.js +0 -112
  78. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +0 -43
  79. package/assets/plugin/lifecycle/shutdown-coordinator.js +0 -131
  80. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +0 -17
  81. package/assets/plugin/lifecycle/trading-operation-lock.js +0 -14
  82. package/assets/plugin/live/bracket-id.d.ts +0 -26
  83. package/assets/plugin/live/bracket-id.js +0 -112
  84. package/assets/plugin/live/bracket-ledger.d.ts +0 -54
  85. package/assets/plugin/live/bracket-ledger.js +0 -267
  86. package/assets/plugin/live/bracket-manager.d.ts +0 -82
  87. package/assets/plugin/live/bracket-manager.js +0 -478
  88. package/assets/plugin/live/bracket-params.d.ts +0 -22
  89. package/assets/plugin/live/bracket-params.js +0 -124
  90. package/assets/plugin/live/bracket-reconciler.d.ts +0 -95
  91. package/assets/plugin/live/bracket-reconciler.js +0 -573
  92. package/assets/plugin/live/bracket-types.d.ts +0 -102
  93. package/assets/plugin/live/bracket-types.js +0 -8
  94. package/assets/plugin/live/deposit-tracker.d.ts +0 -62
  95. package/assets/plugin/live/deposit-tracker.js +0 -97
  96. package/assets/plugin/live/emergency-controls.d.ts +0 -32
  97. package/assets/plugin/live/emergency-controls.js +0 -226
  98. package/assets/plugin/live/exchange-errors.d.ts +0 -12
  99. package/assets/plugin/live/exchange-errors.js +0 -130
  100. package/assets/plugin/live/exchange-info-cache.d.ts +0 -37
  101. package/assets/plugin/live/exchange-info-cache.js +0 -134
  102. package/assets/plugin/live/fact-subscriber.d.ts +0 -78
  103. package/assets/plugin/live/fact-subscriber.js +0 -182
  104. package/assets/plugin/live/intent-journal.d.ts +0 -42
  105. package/assets/plugin/live/intent-journal.js +0 -122
  106. package/assets/plugin/live/listen-key-manager.d.ts +0 -70
  107. package/assets/plugin/live/listen-key-manager.js +0 -169
  108. package/assets/plugin/live/live-adapter.d.ts +0 -287
  109. package/assets/plugin/live/live-adapter.js +0 -1777
  110. package/assets/plugin/live/live-balance-enricher.d.ts +0 -32
  111. package/assets/plugin/live/live-balance-enricher.js +0 -104
  112. package/assets/plugin/live/live-bracket-api.d.ts +0 -13
  113. package/assets/plugin/live/live-bracket-api.js +0 -20
  114. package/assets/plugin/live/live-state-store.d.ts +0 -194
  115. package/assets/plugin/live/live-state-store.js +0 -450
  116. package/assets/plugin/live/local-signal-service.d.ts +0 -57
  117. package/assets/plugin/live/local-signal-service.js +0 -151
  118. package/assets/plugin/live/local-strategy-evaluator.d.ts +0 -62
  119. package/assets/plugin/live/local-strategy-evaluator.js +0 -131
  120. package/assets/plugin/live/microstructure-assembler.d.ts +0 -54
  121. package/assets/plugin/live/microstructure-assembler.js +0 -148
  122. package/assets/plugin/live/order-poller.d.ts +0 -29
  123. package/assets/plugin/live/order-poller.js +0 -125
  124. package/assets/plugin/live/position-state-store.d.ts +0 -83
  125. package/assets/plugin/live/position-state-store.js +0 -237
  126. package/assets/plugin/live/proposal-decision-listener.d.ts +0 -70
  127. package/assets/plugin/live/proposal-decision-listener.js +0 -292
  128. package/assets/plugin/live/proposal-manager.d.ts +0 -76
  129. package/assets/plugin/live/proposal-manager.js +0 -140
  130. package/assets/plugin/live/rate-limiter.d.ts +0 -47
  131. package/assets/plugin/live/rate-limiter.js +0 -159
  132. package/assets/plugin/live/reconciler.d.ts +0 -39
  133. package/assets/plugin/live/reconciler.js +0 -175
  134. package/assets/plugin/live/setup-buckets.d.ts +0 -7
  135. package/assets/plugin/live/setup-buckets.js +0 -33
  136. package/assets/plugin/live/slippage-tracker.d.ts +0 -45
  137. package/assets/plugin/live/slippage-tracker.js +0 -78
  138. package/assets/plugin/live/stop-watcher.d.ts +0 -60
  139. package/assets/plugin/live/stop-watcher.js +0 -215
  140. package/assets/plugin/live/user-data-active-probe.d.ts +0 -54
  141. package/assets/plugin/live/user-data-active-probe.js +0 -180
  142. package/assets/plugin/live/user-data-stream-controller.d.ts +0 -200
  143. package/assets/plugin/live/user-data-stream-controller.js +0 -579
  144. package/assets/plugin/live/user-data-stream-ws.d.ts +0 -22
  145. package/assets/plugin/live/user-data-stream-ws.js +0 -63
  146. package/assets/plugin/live/user-data-stream.d.ts +0 -243
  147. package/assets/plugin/live/user-data-stream.js +0 -704
  148. package/assets/plugin/logger.d.ts +0 -2
  149. package/assets/plugin/logger.js +0 -2
  150. package/assets/plugin/mfe.d.ts +0 -21
  151. package/assets/plugin/mfe.js +0 -68
  152. package/assets/plugin/onboarding/mode-ladder.d.ts +0 -1
  153. package/assets/plugin/onboarding/mode-ladder.js +0 -3
  154. package/assets/plugin/onboarding/runtime.d.ts +0 -84
  155. package/assets/plugin/onboarding/runtime.js +0 -173
  156. package/assets/plugin/openclaw.plugin.json +0 -92
  157. package/assets/plugin/paper-adapter.d.ts +0 -24
  158. package/assets/plugin/paper-adapter.js +0 -91
  159. package/assets/plugin/persistence/state-manager.d.ts +0 -66
  160. package/assets/plugin/persistence/state-manager.js +0 -222
  161. package/assets/plugin/pinned-plan.d.ts +0 -9
  162. package/assets/plugin/pinned-plan.js +0 -23
  163. package/assets/plugin/portfolio/wave9-admission.d.ts +0 -67
  164. package/assets/plugin/portfolio/wave9-admission.js +0 -262
  165. package/assets/plugin/portfolio/wave9-policy.d.ts +0 -36
  166. package/assets/plugin/portfolio/wave9-policy.js +0 -183
  167. package/assets/plugin/risk/pre-trade-check.d.ts +0 -38
  168. package/assets/plugin/risk/pre-trade-check.js +0 -345
  169. package/assets/plugin/risk/pre-trade-types.d.ts +0 -60
  170. package/assets/plugin/risk/pre-trade-types.js +0 -3
  171. package/assets/plugin/shadow/shadow-tracker.d.ts +0 -36
  172. package/assets/plugin/shadow/shadow-tracker.js +0 -151
  173. package/assets/plugin/shadow/types.d.ts +0 -42
  174. package/assets/plugin/shadow/types.js +0 -20
  175. package/assets/plugin/shared/indicators-extended.d.ts +0 -52
  176. package/assets/plugin/shared/indicators-extended.js +0 -291
  177. package/assets/plugin/shared/indicators.d.ts +0 -15
  178. package/assets/plugin/shared/indicators.js +0 -114
  179. package/assets/plugin/signals/conditions/registry.d.ts +0 -16
  180. package/assets/plugin/signals/conditions/registry.js +0 -1324
  181. package/assets/plugin/signals/conditions/types.d.ts +0 -1
  182. package/assets/plugin/signals/conditions/types.js +0 -4
  183. package/assets/plugin/signals/direction-rules.d.ts +0 -3
  184. package/assets/plugin/signals/direction-rules.js +0 -24
  185. package/assets/plugin/signals/entry-rules.d.ts +0 -6
  186. package/assets/plugin/signals/entry-rules.js +0 -33
  187. package/assets/plugin/signals/serialize-context.d.ts +0 -4
  188. package/assets/plugin/signals/serialize-context.js +0 -39
  189. package/assets/plugin/signals/stop-rules.d.ts +0 -3
  190. package/assets/plugin/signals/stop-rules.js +0 -48
  191. package/assets/plugin/signals/strategy-adapter.d.ts +0 -47
  192. package/assets/plugin/signals/strategy-adapter.js +0 -199
  193. package/assets/plugin/signals/types.d.ts +0 -1
  194. package/assets/plugin/signals/types.js +0 -8
  195. package/assets/plugin/simulator/exchange-simulator.d.ts +0 -93
  196. package/assets/plugin/simulator/exchange-simulator.js +0 -689
  197. package/assets/plugin/simulator/fill-engine.d.ts +0 -53
  198. package/assets/plugin/simulator/fill-engine.js +0 -280
  199. package/assets/plugin/simulator/paper-market-feed.d.ts +0 -26
  200. package/assets/plugin/simulator/paper-market-feed.js +0 -104
  201. package/assets/plugin/simulator/realistic-fills.d.ts +0 -59
  202. package/assets/plugin/simulator/realistic-fills.js +0 -175
  203. package/assets/plugin/simulator/types.d.ts +0 -224
  204. package/assets/plugin/simulator/types.js +0 -43
  205. package/assets/plugin/strategy/builtin-strategies.d.ts +0 -2
  206. package/assets/plugin/strategy/builtin-strategies.js +0 -113
  207. package/assets/plugin/strategy/condition-registry.d.ts +0 -3
  208. package/assets/plugin/strategy/condition-registry.js +0 -153
  209. package/assets/plugin/strategy/evaluator.d.ts +0 -70
  210. package/assets/plugin/strategy/evaluator.js +0 -98
  211. package/assets/plugin/tools/assessment-validation.d.ts +0 -120
  212. package/assets/plugin/tools/assessment-validation.js +0 -415
  213. package/assets/plugin/tools/attach-brackets.d.ts +0 -39
  214. package/assets/plugin/tools/attach-brackets.js +0 -399
  215. package/assets/plugin/tools/audit-bracket-protection.d.ts +0 -49
  216. package/assets/plugin/tools/audit-bracket-protection.js +0 -527
  217. package/assets/plugin/tools/cancel-all-orders.d.ts +0 -9
  218. package/assets/plugin/tools/cancel-all-orders.js +0 -8
  219. package/assets/plugin/tools/cancel-order.d.ts +0 -14
  220. package/assets/plugin/tools/cancel-order.js +0 -60
  221. package/assets/plugin/tools/check-position-health.d.ts +0 -46
  222. package/assets/plugin/tools/check-position-health.js +0 -194
  223. package/assets/plugin/tools/clear-exchange-credentials.d.ts +0 -24
  224. package/assets/plugin/tools/clear-exchange-credentials.js +0 -70
  225. package/assets/plugin/tools/close-position.d.ts +0 -45
  226. package/assets/plugin/tools/close-position.js +0 -722
  227. package/assets/plugin/tools/create-order.d.ts +0 -82
  228. package/assets/plugin/tools/create-order.js +0 -1516
  229. package/assets/plugin/tools/exit-gate.d.ts +0 -58
  230. package/assets/plugin/tools/exit-gate.js +0 -162
  231. package/assets/plugin/tools/fetch-balance.d.ts +0 -5
  232. package/assets/plugin/tools/fetch-balance.js +0 -4
  233. package/assets/plugin/tools/fetch-ohlcv.d.ts +0 -11
  234. package/assets/plugin/tools/fetch-ohlcv.js +0 -8
  235. package/assets/plugin/tools/fetch-open-orders.d.ts +0 -7
  236. package/assets/plugin/tools/fetch-open-orders.js +0 -4
  237. package/assets/plugin/tools/fetch-positions.d.ts +0 -7
  238. package/assets/plugin/tools/fetch-positions.js +0 -4
  239. package/assets/plugin/tools/fetch-ticker.d.ts +0 -11
  240. package/assets/plugin/tools/fetch-ticker.js +0 -5
  241. package/assets/plugin/tools/get-agent-profile.d.ts +0 -4
  242. package/assets/plugin/tools/get-agent-profile.js +0 -6
  243. package/assets/plugin/tools/get-analytics.d.ts +0 -6
  244. package/assets/plugin/tools/get-analytics.js +0 -7
  245. package/assets/plugin/tools/get-backtest.d.ts +0 -12
  246. package/assets/plugin/tools/get-backtest.js +0 -91
  247. package/assets/plugin/tools/get-basis.d.ts +0 -7
  248. package/assets/plugin/tools/get-basis.js +0 -7
  249. package/assets/plugin/tools/get-bracket-config.d.ts +0 -11
  250. package/assets/plugin/tools/get-bracket-config.js +0 -24
  251. package/assets/plugin/tools/get-cascade-risk.d.ts +0 -7
  252. package/assets/plugin/tools/get-cascade-risk.js +0 -8
  253. package/assets/plugin/tools/get-crypto-metrics.d.ts +0 -18
  254. package/assets/plugin/tools/get-crypto-metrics.js +0 -62
  255. package/assets/plugin/tools/get-cvd.d.ts +0 -6
  256. package/assets/plugin/tools/get-cvd.js +0 -6
  257. package/assets/plugin/tools/get-divergences.d.ts +0 -6
  258. package/assets/plugin/tools/get-divergences.js +0 -6
  259. package/assets/plugin/tools/get-funding-context.d.ts +0 -6
  260. package/assets/plugin/tools/get-funding-context.js +0 -16
  261. package/assets/plugin/tools/get-liquidation-levels.d.ts +0 -7
  262. package/assets/plugin/tools/get-liquidation-levels.js +0 -7
  263. package/assets/plugin/tools/get-liquidation-pulse.d.ts +0 -9
  264. package/assets/plugin/tools/get-liquidation-pulse.js +0 -22
  265. package/assets/plugin/tools/get-market-breadth.d.ts +0 -6
  266. package/assets/plugin/tools/get-market-breadth.js +0 -8
  267. package/assets/plugin/tools/get-market-intel.d.ts +0 -19
  268. package/assets/plugin/tools/get-market-intel.js +0 -116
  269. package/assets/plugin/tools/get-market-structure.d.ts +0 -47
  270. package/assets/plugin/tools/get-market-structure.js +0 -198
  271. package/assets/plugin/tools/get-my-mined-patterns.d.ts +0 -20
  272. package/assets/plugin/tools/get-my-mined-patterns.js +0 -61
  273. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +0 -20
  274. package/assets/plugin/tools/get-my-proposed-learnings.js +0 -55
  275. package/assets/plugin/tools/get-my-recent-reviews.d.ts +0 -22
  276. package/assets/plugin/tools/get-my-recent-reviews.js +0 -66
  277. package/assets/plugin/tools/get-orderbook.d.ts +0 -21
  278. package/assets/plugin/tools/get-orderbook.js +0 -32
  279. package/assets/plugin/tools/get-pattern-scan.d.ts +0 -7
  280. package/assets/plugin/tools/get-pattern-scan.js +0 -8
  281. package/assets/plugin/tools/get-regime.d.ts +0 -6
  282. package/assets/plugin/tools/get-regime.js +0 -7
  283. package/assets/plugin/tools/get-relevant-learnings.d.ts +0 -21
  284. package/assets/plugin/tools/get-relevant-learnings.js +0 -65
  285. package/assets/plugin/tools/get-resting-liquidity.d.ts +0 -6
  286. package/assets/plugin/tools/get-resting-liquidity.js +0 -11
  287. package/assets/plugin/tools/get-risk-scenario.d.ts +0 -29
  288. package/assets/plugin/tools/get-risk-scenario.js +0 -47
  289. package/assets/plugin/tools/get-risk-summary.d.ts +0 -51
  290. package/assets/plugin/tools/get-risk-summary.js +0 -118
  291. package/assets/plugin/tools/get-sentiment.d.ts +0 -4
  292. package/assets/plugin/tools/get-sentiment.js +0 -6
  293. package/assets/plugin/tools/get-session-review.d.ts +0 -7
  294. package/assets/plugin/tools/get-session-review.js +0 -8
  295. package/assets/plugin/tools/get-setup-detail.d.ts +0 -7
  296. package/assets/plugin/tools/get-setup-detail.js +0 -311
  297. package/assets/plugin/tools/get-signals.d.ts +0 -15
  298. package/assets/plugin/tools/get-signals.js +0 -54
  299. package/assets/plugin/tools/get-sizing.d.ts +0 -6
  300. package/assets/plugin/tools/get-sizing.js +0 -6
  301. package/assets/plugin/tools/get-trade-feedback.d.ts +0 -7
  302. package/assets/plugin/tools/get-trade-feedback.js +0 -8
  303. package/assets/plugin/tools/get-trade-flow.d.ts +0 -7
  304. package/assets/plugin/tools/get-trade-flow.js +0 -7
  305. package/assets/plugin/tools/get-volume-analysis.d.ts +0 -21
  306. package/assets/plugin/tools/get-volume-analysis.js +0 -74
  307. package/assets/plugin/tools/get-volume-profile.d.ts +0 -7
  308. package/assets/plugin/tools/get-volume-profile.js +0 -7
  309. package/assets/plugin/tools/get-wave9-status.d.ts +0 -127
  310. package/assets/plugin/tools/get-wave9-status.js +0 -796
  311. package/assets/plugin/tools/helpers.d.ts +0 -26
  312. package/assets/plugin/tools/helpers.js +0 -39
  313. package/assets/plugin/tools/intel-api.d.ts +0 -34
  314. package/assets/plugin/tools/intel-api.js +0 -119
  315. package/assets/plugin/tools/intel-cache.d.ts +0 -25
  316. package/assets/plugin/tools/intel-cache.js +0 -148
  317. package/assets/plugin/tools/list-strategies.d.ts +0 -17
  318. package/assets/plugin/tools/list-strategies.js +0 -23
  319. package/assets/plugin/tools/modify-stop.d.ts +0 -21
  320. package/assets/plugin/tools/modify-stop.js +0 -120
  321. package/assets/plugin/tools/modify-target.d.ts +0 -21
  322. package/assets/plugin/tools/modify-target.js +0 -110
  323. package/assets/plugin/tools/propose-learning.d.ts +0 -22
  324. package/assets/plugin/tools/propose-learning.js +0 -65
  325. package/assets/plugin/tools/query-review-outcomes.d.ts +0 -30
  326. package/assets/plugin/tools/query-review-outcomes.js +0 -64
  327. package/assets/plugin/tools/query-trades.d.ts +0 -21
  328. package/assets/plugin/tools/query-trades.js +0 -37
  329. package/assets/plugin/tools/record-position-reviews.d.ts +0 -38
  330. package/assets/plugin/tools/record-position-reviews.js +0 -147
  331. package/assets/plugin/tools/save-strategy.d.ts +0 -16
  332. package/assets/plugin/tools/save-strategy.js +0 -46
  333. package/assets/plugin/tools/scan-pairs.d.ts +0 -18
  334. package/assets/plugin/tools/scan-pairs.js +0 -231
  335. package/assets/plugin/tools/score-setup.d.ts +0 -31
  336. package/assets/plugin/tools/score-setup.js +0 -268
  337. package/assets/plugin/tools/set-bracket-requirement.d.ts +0 -18
  338. package/assets/plugin/tools/set-bracket-requirement.js +0 -81
  339. package/assets/plugin/tools/set-exchange-credentials.d.ts +0 -25
  340. package/assets/plugin/tools/set-exchange-credentials.js +0 -80
  341. package/assets/plugin/tools/set-trading-mode.d.ts +0 -26
  342. package/assets/plugin/tools/set-trading-mode.js +0 -135
  343. package/assets/plugin/tools/test-exchange-credentials.d.ts +0 -16
  344. package/assets/plugin/tools/test-exchange-credentials.js +0 -100
  345. package/assets/plugin/tools/toggle-strategy.d.ts +0 -8
  346. package/assets/plugin/tools/toggle-strategy.js +0 -15
  347. package/assets/plugin/trading-params-cache.d.ts +0 -26
  348. package/assets/plugin/trading-params-cache.js +0 -52
  349. package/assets/plugin/types.d.ts +0 -134
  350. package/assets/plugin/types.js +0 -7
  351. package/assets/plugin/util/plugin-paths.d.ts +0 -3
  352. package/assets/plugin/util/plugin-paths.js +0 -15
  353. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +0 -116
  354. package/assets/plugin/venues/hyperliquid/hl-balance.js +0 -145
  355. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +0 -102
  356. package/assets/plugin/venues/hyperliquid/hl-brackets.js +0 -172
  357. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +0 -22
  358. package/assets/plugin/venues/hyperliquid/hl-cloid.js +0 -82
  359. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +0 -46
  360. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +0 -125
  361. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +0 -88
  362. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +0 -353
  363. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +0 -61
  364. package/assets/plugin/venues/hyperliquid/hl-precision.js +0 -176
  365. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +0 -88
  366. package/assets/plugin/venues/hyperliquid/hl-private.js +0 -357
  367. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +0 -79
  368. package/assets/plugin/venues/hyperliquid/hl-public.js +0 -429
  369. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +0 -57
  370. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +0 -220
  371. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +0 -90
  372. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +0 -220
  373. package/assets/plugin/venues/registry.d.ts +0 -38
  374. package/assets/plugin/venues/registry.js +0 -46
  375. package/assets/plugin/venues/symbols.d.ts +0 -43
  376. package/assets/plugin/venues/symbols.js +0 -107
  377. package/assets/plugin/wave9/live-account-capture.d.ts +0 -67
  378. package/assets/plugin/wave9/live-account-capture.js +0 -435
  379. package/assets/plugin/wave9/live-autonomous-protection.d.ts +0 -39
  380. package/assets/plugin/wave9/live-autonomous-protection.js +0 -112
  381. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +0 -33
  382. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +0 -115
  383. package/assets/plugin/wave9/live-execution-ledger.d.ts +0 -107
  384. package/assets/plugin/wave9/live-execution-ledger.js +0 -498
  385. package/assets/plugin/wave9/live-position-confirmation.d.ts +0 -18
  386. package/assets/plugin/wave9/live-position-confirmation.js +0 -111
  387. package/assets/plugin/wave9/live-residual-protection.d.ts +0 -18
  388. package/assets/plugin/wave9/live-residual-protection.js +0 -250
  389. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +0 -38
  390. package/assets/plugin/wave9/live-startup-reconciliation.js +0 -454
  391. package/assets/plugin/wave9/live-symbol-ownership.d.ts +0 -20
  392. package/assets/plugin/wave9/live-symbol-ownership.js +0 -132
  393. package/assets/plugin/wave9/paper-admission-guard.d.ts +0 -199
  394. package/assets/plugin/wave9/paper-admission-guard.js +0 -650
  395. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +0 -42
  396. package/assets/plugin/wave9/usdm-evidence-provider.js +0 -133
@@ -1,53 +0,0 @@
1
- import type { Order, Position, Wallet, Trade, OrderBookDepth, SimulationConfig, ExecutionQuality, PositionMetadata } from './types.js';
2
- /** Result of filling an order */
3
- export interface FillResult {
4
- /** The filled order (status set to 'closed') */
5
- order: Order;
6
- /** Updated or new position (null if position was fully closed) */
7
- position: Position | null;
8
- /** Closed trade record (only when closing/reducing a position) */
9
- trade: Trade | null;
10
- /** Wallet balance changes: { currency: delta } */
11
- walletDeltas: Record<string, number>;
12
- /** Execution quality metrics (Phase 9a) */
13
- executionQuality?: ExecutionQuality;
14
- }
15
- /**
16
- * Compute simulated slippage for a market order (legacy mode).
17
- * Returns basis points: random 0-2 bps, signed based on order side.
18
- * BUY: positive slippage (pay more), SELL: negative slippage (receive less).
19
- */
20
- export declare function computeSlippage(side: 'buy' | 'sell'): number;
21
- /**
22
- * Apply slippage to a price.
23
- * @param price Base price
24
- * @param slippageBps Slippage in basis points (signed)
25
- * @returns Adjusted price
26
- */
27
- export declare function applySlippage(price: number, slippageBps: number): number;
28
- /**
29
- * Parse the base and quote currencies from a symbol like "BTC/USDT".
30
- */
31
- export declare function parseSymbol(symbol: string): {
32
- base: string;
33
- quote: string;
34
- };
35
- /** Options for realistic market fills (Phase 9a). */
36
- export interface RealisticFillOptions {
37
- orderbook?: OrderBookDepth | null;
38
- config?: SimulationConfig;
39
- volFactor?: number;
40
- /** Position metadata to attach on new position creation. */
41
- metadata?: PositionMetadata;
42
- }
43
- /**
44
- * Fill a market order immediately at the given price (plus slippage).
45
- * When realistic options are provided, uses book-aware VWAP + latency + maker/taker fees.
46
- * Otherwise falls back to legacy random slippage + flat fee.
47
- */
48
- export declare function fillMarketOrder(order: Order, currentPrice: number, wallet: Wallet, existingPosition: Position | null, realistic?: RealisticFillOptions): FillResult;
49
- /**
50
- * Fill a limit order (when price crosses the limit price).
51
- * Limit orders fill at the limit price. When config is provided, uses maker fee rate.
52
- */
53
- export declare function fillLimitOrder(order: Order, wallet: Wallet, existingPosition: Position | null, config?: SimulationConfig, decisionPrice?: number, metadata?: PositionMetadata): FillResult;
@@ -1,280 +0,0 @@
1
- // Fill engine for simulated order execution (derivatives model).
2
- // All accounting in quote currency (USDT). Supports long and short positions.
3
- // Opening any direction: deduct notional + fee from USDT.
4
- // Closing: credit margin + PnL - fee to USDT.
5
- //
6
- // Phase 9a: Supports realistic fills (book-aware VWAP, latency, maker/taker fees)
7
- // when SimulationConfig and OrderBookDepth are provided. Falls back to legacy
8
- // behavior (0-2 bps random slippage, 0.1% flat fee) when not provided.
9
- import { FEE_RATE } from './types.js';
10
- import { computeRealisticMarketFill, computeLimitFillQuality, getFeeRate, } from './realistic-fills.js';
11
- /** On NEW-position creation only, freeze the at-fill stop into
12
- * `originalStopPrice` and seed `mfePeakPrice` to the entry price. Component C
13
- * uses these as immutable denominators / starting points for MFE tracking.
14
- * Scale-ins and partial closes preserve whatever was set on the first fill —
15
- * this helper is intentionally only called from the brand-new and flip code
16
- * paths, never from the scale-in path. */
17
- function seedMfeMetadata(metadata, fillPrice) {
18
- const seeded = { ...(metadata ?? {}) };
19
- if (seeded.originalEntryPrice === undefined) {
20
- seeded.originalEntryPrice = fillPrice; // frozen R/MFE entry reference
21
- }
22
- if (seeded.originalStopPrice === undefined && seeded.stopPrice !== undefined) {
23
- seeded.originalStopPrice = seeded.stopPrice;
24
- }
25
- if (seeded.mfePeakPrice === undefined) {
26
- seeded.mfePeakPrice = fillPrice;
27
- }
28
- return seeded;
29
- }
30
- /**
31
- * Compute simulated slippage for a market order (legacy mode).
32
- * Returns basis points: random 0-2 bps, signed based on order side.
33
- * BUY: positive slippage (pay more), SELL: negative slippage (receive less).
34
- */
35
- export function computeSlippage(side) {
36
- const bps = Math.random() * 2; // 0 to 2 bps
37
- return side === 'buy' ? bps : -bps;
38
- }
39
- /**
40
- * Apply slippage to a price.
41
- * @param price Base price
42
- * @param slippageBps Slippage in basis points (signed)
43
- * @returns Adjusted price
44
- */
45
- export function applySlippage(price, slippageBps) {
46
- return price * (1 + slippageBps / 10_000);
47
- }
48
- /**
49
- * Parse the base and quote currencies from a symbol like "BTC/USDT".
50
- */
51
- export function parseSymbol(symbol) {
52
- const parts = symbol.split('/');
53
- if (parts.length !== 2) {
54
- throw new Error(`Invalid symbol format: ${symbol}. Expected BASE/QUOTE`);
55
- }
56
- const [quote, settle, ...extra] = parts[1].split(':');
57
- if (!quote || extra.length > 0 || (settle !== undefined && settle !== quote)) {
58
- throw new Error(`Invalid symbol format: ${symbol}. Expected BASE/QUOTE or BASE/QUOTE:QUOTE`);
59
- }
60
- return { base: parts[0], quote };
61
- }
62
- /**
63
- * Ensure a currency exists in the wallet with at least zero balance.
64
- */
65
- function ensureCurrency(wallet, currency) {
66
- if (!wallet[currency]) {
67
- wallet[currency] = { total: 0, available: 0, locked: 0 };
68
- }
69
- return wallet[currency];
70
- }
71
- /**
72
- * Fill a market order immediately at the given price (plus slippage).
73
- * When realistic options are provided, uses book-aware VWAP + latency + maker/taker fees.
74
- * Otherwise falls back to legacy random slippage + flat fee.
75
- */
76
- export function fillMarketOrder(order, currentPrice, wallet, existingPosition, realistic) {
77
- if (realistic?.config) {
78
- // Phase 9a: Realistic fill path
79
- const { fillPrice, executionQuality } = computeRealisticMarketFill(order.side, order.amount, currentPrice, realistic.orderbook ?? null, realistic.volFactor ?? 1.0, realistic.config);
80
- const feeRate = getFeeRate('market', realistic.config);
81
- return executeOrderFill(order, fillPrice, wallet, existingPosition, feeRate, executionQuality, realistic.metadata);
82
- }
83
- // Legacy path: random 0-2 bps slippage + flat 0.1% fee
84
- const slippageBps = computeSlippage(order.side);
85
- const fillPrice = applySlippage(currentPrice, slippageBps);
86
- return executeOrderFill(order, fillPrice, wallet, existingPosition);
87
- }
88
- /**
89
- * Fill a limit order (when price crosses the limit price).
90
- * Limit orders fill at the limit price. When config is provided, uses maker fee rate.
91
- */
92
- export function fillLimitOrder(order, wallet, existingPosition, config, decisionPrice, metadata) {
93
- if (order.price === null) {
94
- throw new Error('Limit order must have a price');
95
- }
96
- const feeRate = config ? getFeeRate('limit', config) : undefined;
97
- const executionQuality = config && decisionPrice !== undefined
98
- ? computeLimitFillQuality(order.side, order.amount, order.price, decisionPrice, config)
99
- : undefined;
100
- return executeOrderFill(order, order.price, wallet, existingPosition, feeRate, executionQuality, metadata);
101
- }
102
- /**
103
- * Core fill logic (derivatives model).
104
- * All accounting in quote currency. Both longs and shorts use USDT as collateral.
105
- *
106
- * Opening: deduct notional + fee from quote balance.
107
- * Closing: credit (entry_notional + directional_PnL - fee) to quote balance.
108
- * Flip: close existing + open opposite, fees split proportionally.
109
- *
110
- * Trade PnL is directional only (no fee deduction) — fees are tracked separately
111
- * and already reflected in wallet balance changes.
112
- *
113
- * @param feeRateOverride When provided, overrides the legacy FEE_RATE (Phase 9a maker/taker)
114
- * @param executionQuality When provided, attached to the Trade record (Phase 9a)
115
- */
116
- function executeOrderFill(order, fillPrice, wallet, existingPosition, feeRateOverride, executionQuality, metadata) {
117
- const { quote } = parseSymbol(order.symbol);
118
- const activeFeeRate = feeRateOverride ?? FEE_RATE;
119
- const notional = order.amount * fillPrice;
120
- const fee = notional * activeFeeRate;
121
- const now = new Date().toISOString();
122
- const quoteBalance = ensureCurrency(wallet, quote);
123
- let position = null;
124
- let trade = null;
125
- let totalWalletDelta = 0;
126
- let totalFee = fee;
127
- // Determine relationship to existing position
128
- const isClosing = existingPosition && ((existingPosition.side === 'long' && order.side === 'sell') ||
129
- (existingPosition.side === 'short' && order.side === 'buy'));
130
- if (existingPosition && isClosing) {
131
- // --- CLOSING / REDUCING / FLIPPING ---
132
- const closeQty = Math.min(order.amount, existingPosition.quantity);
133
- const closeNotional = closeQty * fillPrice;
134
- const closeFee = closeNotional * activeFeeRate;
135
- // Directional PnL (no fee — fee tracked separately in trade record)
136
- const pnl = existingPosition.side === 'long'
137
- ? (fillPrice - existingPosition.entryPrice) * closeQty
138
- : (existingPosition.entryPrice - fillPrice) * closeQty;
139
- // Open-side fee attributable to this close (proportional for partial closes).
140
- // Older positions without `openFee` are treated as 0 (legacy roundtrip error).
141
- const totalOpenFee = existingPosition.openFee ?? 0;
142
- const openFeeShare = existingPosition.quantity > 0
143
- ? totalOpenFee * (closeQty / existingPosition.quantity)
144
- : 0;
145
- // Credit: release original margin + PnL - close fee
146
- const credit = existingPosition.entryPrice * closeQty + pnl - closeFee;
147
- quoteBalance.available += credit;
148
- quoteBalance.total += credit;
149
- totalWalletDelta += credit;
150
- trade = {
151
- id: `trade-${order.id}`,
152
- orderId: order.id,
153
- symbol: order.symbol,
154
- side: order.side,
155
- entryPrice: existingPosition.entryPrice,
156
- exitPrice: fillPrice,
157
- quantity: closeQty,
158
- realizedPnl: pnl,
159
- fee: closeFee,
160
- openFee: openFeeShare,
161
- openedAt: existingPosition.openedAt,
162
- closedAt: now,
163
- executionQuality,
164
- metadata: existingPosition.metadata,
165
- };
166
- const remaining = existingPosition.quantity - closeQty;
167
- if (remaining > 0) {
168
- // Partial close — position reduced, metadata preserved, remaining openFee proportional
169
- position = {
170
- ...existingPosition,
171
- quantity: remaining,
172
- openFee: totalOpenFee - openFeeShare,
173
- };
174
- }
175
- else if (order.amount > existingPosition.quantity) {
176
- // Flip: close existing + open opposite (must be atomic)
177
- const flipQty = order.amount - existingPosition.quantity;
178
- const flipNotional = flipQty * fillPrice;
179
- const flipFee = flipNotional * activeFeeRate;
180
- // Affordability check for the flip leg. The close credit was already
181
- // applied to quoteBalance.available above, so `available` IS the true
182
- // post-close figure — do NOT add `credit` again. Double-counting the
183
- // released margin would pass an unaffordable flip and overdraw the
184
- // wallet negative. On failure we roll the credit back below.
185
- const projectedAvailable = quoteBalance.available;
186
- if (projectedAvailable < flipNotional + flipFee) {
187
- // Rollback the close credit already applied above
188
- quoteBalance.available -= credit;
189
- quoteBalance.total -= credit;
190
- totalWalletDelta -= credit;
191
- throw new Error(`Insufficient ${quote} balance for position flip. After closing, would have ${projectedAvailable.toFixed(2)} but need ${(flipNotional + flipFee).toFixed(2)}`);
192
- }
193
- quoteBalance.available -= flipNotional + flipFee;
194
- quoteBalance.total -= flipNotional + flipFee;
195
- totalWalletDelta -= flipNotional + flipFee;
196
- // Accounting invariant: the affordability check above guarantees a
197
- // non-negative balance. If this ever fires, the flip math regressed.
198
- if (quoteBalance.available < -1e-6) {
199
- throw new Error(`Wallet overdrawn during flip (available=${quoteBalance.available.toFixed(2)}) — accounting invariant violated`);
200
- }
201
- position = {
202
- symbol: order.symbol,
203
- side: order.side === 'buy' ? 'long' : 'short',
204
- entryPrice: fillPrice,
205
- quantity: flipQty,
206
- openedAt: now,
207
- metadata: seedMfeMetadata(metadata, fillPrice),
208
- openFee: flipFee,
209
- };
210
- totalFee = closeFee + flipFee;
211
- }
212
- // else: fully closed, position remains null, totalFee = closeFee
213
- else {
214
- totalFee = closeFee;
215
- }
216
- }
217
- else if (existingPosition && !isClosing) {
218
- // --- ADDING TO EXISTING POSITION (same direction) ---
219
- if (quoteBalance.available < notional + fee) {
220
- throw new Error(`Insufficient ${quote} balance. Need ${(notional + fee).toFixed(2)}, have ${quoteBalance.available.toFixed(2)}`);
221
- }
222
- quoteBalance.available -= notional + fee;
223
- quoteBalance.total -= notional + fee;
224
- totalWalletDelta = -(notional + fee);
225
- // Average entry price
226
- const totalQty = existingPosition.quantity + order.amount;
227
- const avgEntry = (existingPosition.entryPrice * existingPosition.quantity + fillPrice * order.amount) / totalQty;
228
- // Scale-in: preserve frozen MFE state (originalStopPrice + the running
229
- // peak) from the first fill, while letting the agent override mutable
230
- // entry-context fields like updated stopPrice / thesis on this fill.
231
- const baseMeta = existingPosition.metadata ?? {};
232
- const incomingMeta = metadata ?? {};
233
- const mergedMeta = {
234
- ...baseMeta,
235
- ...incomingMeta,
236
- originalEntryPrice: baseMeta.originalEntryPrice ?? incomingMeta.originalEntryPrice,
237
- originalStopPrice: baseMeta.originalStopPrice ?? incomingMeta.originalStopPrice,
238
- mfePeakPrice: baseMeta.mfePeakPrice ?? incomingMeta.mfePeakPrice,
239
- };
240
- position = {
241
- ...existingPosition,
242
- entryPrice: avgEntry,
243
- quantity: totalQty,
244
- metadata: mergedMeta,
245
- openFee: (existingPosition.openFee ?? 0) + fee,
246
- };
247
- }
248
- else {
249
- // --- NEW POSITION ---
250
- if (quoteBalance.available < notional + fee) {
251
- throw new Error(`Insufficient ${quote} balance. Need ${(notional + fee).toFixed(2)}, have ${quoteBalance.available.toFixed(2)}`);
252
- }
253
- quoteBalance.available -= notional + fee;
254
- quoteBalance.total -= notional + fee;
255
- totalWalletDelta = -(notional + fee);
256
- position = {
257
- symbol: order.symbol,
258
- side: order.side === 'buy' ? 'long' : 'short',
259
- entryPrice: fillPrice,
260
- quantity: order.amount,
261
- openedAt: now,
262
- metadata: seedMfeMetadata(metadata, fillPrice),
263
- openFee: fee,
264
- };
265
- }
266
- // Build the filled order
267
- const filledOrder = {
268
- ...order,
269
- status: 'closed',
270
- filled: order.amount,
271
- average: fillPrice,
272
- cost: notional,
273
- fee: { cost: totalFee, currency: quote },
274
- };
275
- const walletDeltas = {};
276
- if (totalWalletDelta !== 0) {
277
- walletDeltas[quote] = totalWalletDelta;
278
- }
279
- return { order: filledOrder, position, trade, walletDeltas, executionQuality };
280
- }
@@ -1,26 +0,0 @@
1
- import type { CcxtTicker } from '../types.js';
2
- import type { ExchangeSimulator } from './exchange-simulator.js';
3
- export declare const DEFAULT_FEED_INTERVAL_MS = 5000;
4
- export declare const MAX_SYMBOLS_PER_TICK = 30;
5
- /** Narrow ticker source — only the method the feed needs. Lets tests inject a
6
- * fake without constructing a real CCXT client. */
7
- export interface TickerSource {
8
- fetchTicker(symbol: string): Promise<CcxtTicker | null>;
9
- }
10
- export declare class PaperMarketFeed {
11
- private readonly tickerSource;
12
- private readonly simulator;
13
- private readonly intervalMs;
14
- private interval;
15
- private ticking;
16
- constructor(tickerSource: TickerSource, simulator: ExchangeSimulator, intervalMs?: number);
17
- /** Idempotent — a second start() while running is a no-op. */
18
- start(): void;
19
- stop(): void;
20
- isRunning(): boolean;
21
- /** One refresh cycle. Exposed for tests (no setInterval). Never throws —
22
- * a fetch failure on one symbol is logged and skipped; state self-heals on
23
- * the next tick. Overlapping ticks are suppressed (a slow fetch round can
24
- * outlast the interval). */
25
- tick(): Promise<void>;
26
- }
@@ -1,104 +0,0 @@
1
- // Paper-mode background market-data feed.
2
- //
3
- // WHY: in paper mode the simulator's per-symbol lastTicker map is the SOLE
4
- // source of mark price, unrealized PnL, NAV, MFE, the stop-watcher breach
5
- // check, AND the resting-limit fill trigger. Nothing else refreshes it on a
6
- // timer — updateTicker fires only when the agent happens to call a price tool.
7
- // The skill gateway poller refreshes only the ONE dashboard symbol, so every
8
- // other symbol the agent trades (routine — it scans/trades many pairs) had its
9
- // mark FROZEN at entry until the next heartbeat: the stop-watcher compared a
10
- // stale mark and never fired, NAV/uPnL went stale, and resting limits missed.
11
- //
12
- // This poller closes that gap: every `intervalMs` it collects the symbols with
13
- // an open position OR an open order and refreshes each via the simulator's
14
- // updateTicker (which also runs MFE + the pending-limit-fill check). It is
15
- // paper-only and skips entirely when the book is flat, so it adds zero Binance
16
- // weight when there is nothing to track.
17
- //
18
- // Weight: it reuses the single-symbol, ban-gated BinancePublicApi.fetchTicker
19
- // (Binance GET /fapi/v1/ticker/24hr with a symbol = weight 1) one symbol at a
20
- // time. For a realistic paper book (a handful of open symbols) this is lighter
21
- // than CCXT fetchTickers(), which hits the all-symbols endpoint (weight 40).
22
- import { logger, formatError } from '../logger.js';
23
- const TAG = 'paper-market-feed';
24
- // 5s: well inside the 10s stop-watcher interval (so a breach is seen with a
25
- // fresh mark on the next watcher tick) and trivial weight for a small book.
26
- export const DEFAULT_FEED_INTERVAL_MS = 5_000;
27
- // Defensive upper bound on symbols refreshed per tick, so a pathological book
28
- // can't issue an unbounded burst of reads. A real paper book is far smaller;
29
- // if we ever hit the cap we log it (no silent truncation).
30
- export const MAX_SYMBOLS_PER_TICK = 30;
31
- export class PaperMarketFeed {
32
- tickerSource;
33
- simulator;
34
- intervalMs;
35
- interval = null;
36
- ticking = false;
37
- constructor(tickerSource, simulator, intervalMs = DEFAULT_FEED_INTERVAL_MS) {
38
- this.tickerSource = tickerSource;
39
- this.simulator = simulator;
40
- this.intervalMs = intervalMs;
41
- }
42
- /** Idempotent — a second start() while running is a no-op. */
43
- start() {
44
- if (this.interval)
45
- return;
46
- logger.info(TAG, `Starting paper market feed (interval: ${this.intervalMs}ms)`);
47
- this.interval = setInterval(() => {
48
- void this.tick();
49
- }, this.intervalMs);
50
- }
51
- stop() {
52
- if (this.interval) {
53
- clearInterval(this.interval);
54
- this.interval = null;
55
- }
56
- }
57
- isRunning() {
58
- return this.interval !== null;
59
- }
60
- /** One refresh cycle. Exposed for tests (no setInterval). Never throws —
61
- * a fetch failure on one symbol is logged and skipped; state self-heals on
62
- * the next tick. Overlapping ticks are suppressed (a slow fetch round can
63
- * outlast the interval). */
64
- async tick() {
65
- if (this.ticking)
66
- return;
67
- this.ticking = true;
68
- try {
69
- const state = this.simulator.getState();
70
- const symbols = new Set();
71
- for (const p of state.positions)
72
- symbols.add(p.symbol);
73
- for (const o of state.openOrders)
74
- symbols.add(o.symbol);
75
- if (symbols.size === 0)
76
- return; // flat — no work, no Binance weight
77
- let list = Array.from(symbols);
78
- if (list.length > MAX_SYMBOLS_PER_TICK) {
79
- logger.warn(TAG, `Open-symbol count ${list.length} exceeds per-tick cap ${MAX_SYMBOLS_PER_TICK} — refreshing the first ${MAX_SYMBOLS_PER_TICK}; the rest refresh next tick`);
80
- list = list.slice(0, MAX_SYMBOLS_PER_TICK);
81
- }
82
- for (const symbol of list) {
83
- let ticker;
84
- try {
85
- ticker = await this.tickerSource.fetchTicker(symbol);
86
- }
87
- catch (err) {
88
- // fetchTicker already swallows + returns null, but guard the
89
- // weight-pacer throw path too so one symbol never aborts the loop.
90
- logger.warn(TAG, `fetchTicker(${symbol}) threw: ${formatError(err)}`);
91
- continue;
92
- }
93
- // Reject garbage marks (a null/0 last would poison NAV / open a
94
- // 0-priced fill — mirrors the simulator's own mark > 0 guard).
95
- if (ticker && Number.isFinite(ticker.last) && ticker.last > 0) {
96
- this.simulator.updateTicker(ticker);
97
- }
98
- }
99
- }
100
- finally {
101
- this.ticking = false;
102
- }
103
- }
104
- }
@@ -1,59 +0,0 @@
1
- import type { OrderBookDepth, SimulationConfig, ExecutionQuality } from './types.js';
2
- /**
3
- * Walk the order book to compute a volume-weighted average fill price.
4
- *
5
- * For BUY: walks asks (sellers) from best ask upward.
6
- * For SELL: walks bids (buyers) from best bid downward.
7
- *
8
- * If the order exceeds available depth, the remainder fills at the worst
9
- * available price + 10 bps penalty (simulating thin-book impact).
10
- *
11
- * @returns { vwap, levelsConsumed, fillRatio } where fillRatio < 1 only
12
- * if we want to model partial fills (currently always fills completely).
13
- */
14
- export declare function computeBookAwareFillPrice(side: 'buy' | 'sell', amount: number, orderbook: OrderBookDepth): {
15
- vwap: number;
16
- levelsConsumed: number;
17
- };
18
- /**
19
- * Simulate latency-induced price drift.
20
- *
21
- * During the latency window, the price can move against the trader.
22
- * The drift is proportional to latency duration and current volatility.
23
- *
24
- * @param basePrice The VWAP price before latency adjustment
25
- * @param side Order side (buy drift is positive, sell drift is negative)
26
- * @param latencyMs Simulated latency in milliseconds
27
- * @param volFactor Current volatility factor (1.0 = normal, >1 = elevated)
28
- * @returns { adjustedPrice, latencyImpactBps }
29
- */
30
- export declare function applyLatencyDrift(basePrice: number, side: 'buy' | 'sell', latencyMs: number, volFactor: number): {
31
- adjustedPrice: number;
32
- latencyImpactBps: number;
33
- };
34
- /**
35
- * Generate a random simulated latency within the configured range.
36
- */
37
- export declare function generateLatency(config: SimulationConfig): number;
38
- /**
39
- * Compute the fee rate based on order type (maker vs taker).
40
- * Market orders = taker. Limit orders = maker.
41
- */
42
- export declare function getFeeRate(orderType: 'market' | 'limit', config: SimulationConfig): number;
43
- /**
44
- * Compute a complete realistic fill for a market order.
45
- *
46
- * Combines: orderbook VWAP + latency drift + appropriate fee rate.
47
- * Falls back to simple random slippage if no orderbook is available.
48
- *
49
- * @returns fillPrice and ExecutionQuality metrics
50
- */
51
- export declare function computeRealisticMarketFill(side: 'buy' | 'sell', amount: number, decisionPrice: number, orderbook: OrderBookDepth | null, volFactor: number, config?: SimulationConfig): {
52
- fillPrice: number;
53
- executionQuality: ExecutionQuality;
54
- };
55
- /**
56
- * Compute execution quality metrics for a limit order fill.
57
- * Limit orders fill at the limit price (maker) with no market impact.
58
- */
59
- export declare function computeLimitFillQuality(side: 'buy' | 'sell', amount: number, limitPrice: number, decisionPrice: number, config?: SimulationConfig): ExecutionQuality;