@senpi/trading-recipe 1.0.21

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 (553) hide show
  1. package/README.md +117 -0
  2. package/dist/actions/close-position/close-position.action.d.ts +16 -0
  3. package/dist/actions/close-position/close-position.action.d.ts.map +1 -0
  4. package/dist/actions/close-position/close-position.action.js +215 -0
  5. package/dist/actions/close-position/close-position.action.js.map +1 -0
  6. package/dist/actions/decision-engine.d.ts +32 -0
  7. package/dist/actions/decision-engine.d.ts.map +1 -0
  8. package/dist/actions/decision-engine.js +103 -0
  9. package/dist/actions/decision-engine.js.map +1 -0
  10. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts +12 -0
  11. package/dist/actions/llm-decision/anthropic-llm-decision.d.ts.map +1 -0
  12. package/dist/actions/llm-decision/anthropic-llm-decision.js +74 -0
  13. package/dist/actions/llm-decision/anthropic-llm-decision.js.map +1 -0
  14. package/dist/actions/llm-decision/factory.d.ts +17 -0
  15. package/dist/actions/llm-decision/factory.d.ts.map +1 -0
  16. package/dist/actions/llm-decision/factory.js +29 -0
  17. package/dist/actions/llm-decision/factory.js.map +1 -0
  18. package/dist/actions/llm-decision/index.d.ts +8 -0
  19. package/dist/actions/llm-decision/index.d.ts.map +1 -0
  20. package/dist/actions/llm-decision/index.js +5 -0
  21. package/dist/actions/llm-decision/index.js.map +1 -0
  22. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts +14 -0
  23. package/dist/actions/llm-decision/openclaw-llm-decision.d.ts.map +1 -0
  24. package/dist/actions/llm-decision/openclaw-llm-decision.js +58 -0
  25. package/dist/actions/llm-decision/openclaw-llm-decision.js.map +1 -0
  26. package/dist/actions/llm-decision/shared.d.ts +41 -0
  27. package/dist/actions/llm-decision/shared.d.ts.map +1 -0
  28. package/dist/actions/llm-decision/shared.js +117 -0
  29. package/dist/actions/llm-decision/shared.js.map +1 -0
  30. package/dist/actions/open-position/open-position.action.d.ts +16 -0
  31. package/dist/actions/open-position/open-position.action.d.ts.map +1 -0
  32. package/dist/actions/open-position/open-position.action.js +275 -0
  33. package/dist/actions/open-position/open-position.action.js.map +1 -0
  34. package/dist/actions/types.d.ts +123 -0
  35. package/dist/actions/types.d.ts.map +1 -0
  36. package/dist/actions/types.js +3 -0
  37. package/dist/actions/types.js.map +1 -0
  38. package/dist/cli/guide-commands.d.ts +26 -0
  39. package/dist/cli/guide-commands.d.ts.map +1 -0
  40. package/dist/cli/guide-commands.js +345 -0
  41. package/dist/cli/guide-commands.js.map +1 -0
  42. package/dist/cli/senpi-commands.d.ts +20 -0
  43. package/dist/cli/senpi-commands.d.ts.map +1 -0
  44. package/dist/cli/senpi-commands.js +115 -0
  45. package/dist/cli/senpi-commands.js.map +1 -0
  46. package/dist/constants/dsl/index.d.ts +45 -0
  47. package/dist/constants/dsl/index.d.ts.map +1 -0
  48. package/dist/constants/dsl/index.js +45 -0
  49. package/dist/constants/dsl/index.js.map +1 -0
  50. package/dist/context/context-builder.d.ts +14 -0
  51. package/dist/context/context-builder.d.ts.map +1 -0
  52. package/dist/context/context-builder.js +36 -0
  53. package/dist/context/context-builder.js.map +1 -0
  54. package/dist/context/index.d.ts +5 -0
  55. package/dist/context/index.d.ts.map +1 -0
  56. package/dist/context/index.js +5 -0
  57. package/dist/context/index.js.map +1 -0
  58. package/dist/context/interpolate.d.ts +6 -0
  59. package/dist/context/interpolate.d.ts.map +1 -0
  60. package/dist/context/interpolate.js +15 -0
  61. package/dist/context/interpolate.js.map +1 -0
  62. package/dist/context/providers/asset-trend.provider.d.ts +42 -0
  63. package/dist/context/providers/asset-trend.provider.d.ts.map +1 -0
  64. package/dist/context/providers/asset-trend.provider.js +94 -0
  65. package/dist/context/providers/asset-trend.provider.js.map +1 -0
  66. package/dist/context/providers/index.d.ts +5 -0
  67. package/dist/context/providers/index.d.ts.map +1 -0
  68. package/dist/context/providers/index.js +5 -0
  69. package/dist/context/providers/index.js.map +1 -0
  70. package/dist/context/providers/regime.provider.d.ts +14 -0
  71. package/dist/context/providers/regime.provider.d.ts.map +1 -0
  72. package/dist/context/providers/regime.provider.js +29 -0
  73. package/dist/context/providers/regime.provider.js.map +1 -0
  74. package/dist/context/providers/signal.provider.d.ts +11 -0
  75. package/dist/context/providers/signal.provider.d.ts.map +1 -0
  76. package/dist/context/providers/signal.provider.js +27 -0
  77. package/dist/context/providers/signal.provider.js.map +1 -0
  78. package/dist/context/providers/strategy.provider.d.ts +14 -0
  79. package/dist/context/providers/strategy.provider.d.ts.map +1 -0
  80. package/dist/context/providers/strategy.provider.js +68 -0
  81. package/dist/context/providers/strategy.provider.js.map +1 -0
  82. package/dist/context/types.d.ts +30 -0
  83. package/dist/context/types.d.ts.map +1 -0
  84. package/dist/context/types.js +2 -0
  85. package/dist/context/types.js.map +1 -0
  86. package/dist/dsl/config/index.d.ts +59 -0
  87. package/dist/dsl/config/index.d.ts.map +1 -0
  88. package/dist/dsl/config/index.js +171 -0
  89. package/dist/dsl/config/index.js.map +1 -0
  90. package/dist/dsl/constants/index.d.ts +3 -0
  91. package/dist/dsl/constants/index.d.ts.map +1 -0
  92. package/dist/dsl/constants/index.js +3 -0
  93. package/dist/dsl/constants/index.js.map +1 -0
  94. package/dist/dsl/engine/index.d.ts +7 -0
  95. package/dist/dsl/engine/index.d.ts.map +1 -0
  96. package/dist/dsl/engine/index.js +310 -0
  97. package/dist/dsl/engine/index.js.map +1 -0
  98. package/dist/dsl/events/bus-types.d.ts +7 -0
  99. package/dist/dsl/events/bus-types.d.ts.map +1 -0
  100. package/dist/dsl/events/bus-types.js +6 -0
  101. package/dist/dsl/events/bus-types.js.map +1 -0
  102. package/dist/dsl/events/guards.d.ts +17 -0
  103. package/dist/dsl/events/guards.d.ts.map +1 -0
  104. package/dist/dsl/events/guards.js +94 -0
  105. package/dist/dsl/events/guards.js.map +1 -0
  106. package/dist/dsl/events/handlers.d.ts +15 -0
  107. package/dist/dsl/events/handlers.d.ts.map +1 -0
  108. package/dist/dsl/events/handlers.js +252 -0
  109. package/dist/dsl/events/handlers.js.map +1 -0
  110. package/dist/dsl/events/index.d.ts +4 -0
  111. package/dist/dsl/events/index.d.ts.map +1 -0
  112. package/dist/dsl/events/index.js +4 -0
  113. package/dist/dsl/events/index.js.map +1 -0
  114. package/dist/dsl/index.d.ts +13 -0
  115. package/dist/dsl/index.d.ts.map +1 -0
  116. package/dist/dsl/index.js +35 -0
  117. package/dist/dsl/index.js.map +1 -0
  118. package/dist/dsl/monitor/index.d.ts +18 -0
  119. package/dist/dsl/monitor/index.d.ts.map +1 -0
  120. package/dist/dsl/monitor/index.js +310 -0
  121. package/dist/dsl/monitor/index.js.map +1 -0
  122. package/dist/dsl/plugin/index.d.ts +29 -0
  123. package/dist/dsl/plugin/index.d.ts.map +1 -0
  124. package/dist/dsl/plugin/index.js +85 -0
  125. package/dist/dsl/plugin/index.js.map +1 -0
  126. package/dist/dsl/types/index.d.ts +3 -0
  127. package/dist/dsl/types/index.d.ts.map +1 -0
  128. package/dist/dsl/types/index.js +3 -0
  129. package/dist/dsl/types/index.js.map +1 -0
  130. package/dist/health/index.d.ts +9 -0
  131. package/dist/health/index.d.ts.map +1 -0
  132. package/dist/health/index.js +9 -0
  133. package/dist/health/index.js.map +1 -0
  134. package/dist/index.d.ts +95 -0
  135. package/dist/index.d.ts.map +1 -0
  136. package/dist/index.js +235 -0
  137. package/dist/index.js.map +1 -0
  138. package/dist/leverage/max-leverage-cache.d.ts +10 -0
  139. package/dist/leverage/max-leverage-cache.d.ts.map +1 -0
  140. package/dist/leverage/max-leverage-cache.js +51 -0
  141. package/dist/leverage/max-leverage-cache.js.map +1 -0
  142. package/dist/leverage/resolve-leverage.d.ts +9 -0
  143. package/dist/leverage/resolve-leverage.d.ts.map +1 -0
  144. package/dist/leverage/resolve-leverage.js +15 -0
  145. package/dist/leverage/resolve-leverage.js.map +1 -0
  146. package/dist/risk/index.d.ts +9 -0
  147. package/dist/risk/index.d.ts.map +1 -0
  148. package/dist/risk/index.js +9 -0
  149. package/dist/risk/index.js.map +1 -0
  150. package/dist/runtime/action-registry.d.ts +12 -0
  151. package/dist/runtime/action-registry.d.ts.map +1 -0
  152. package/dist/runtime/action-registry.js +20 -0
  153. package/dist/runtime/action-registry.js.map +1 -0
  154. package/dist/runtime/build-action-scan-payload.d.ts +20 -0
  155. package/dist/runtime/build-action-scan-payload.d.ts.map +1 -0
  156. package/dist/runtime/build-action-scan-payload.js +40 -0
  157. package/dist/runtime/build-action-scan-payload.js.map +1 -0
  158. package/dist/runtime/bus.d.ts +6 -0
  159. package/dist/runtime/bus.d.ts.map +1 -0
  160. package/dist/runtime/bus.js +19 -0
  161. package/dist/runtime/bus.js.map +1 -0
  162. package/dist/runtime/create-action-context.d.ts +34 -0
  163. package/dist/runtime/create-action-context.d.ts.map +1 -0
  164. package/dist/runtime/create-action-context.js +22 -0
  165. package/dist/runtime/create-action-context.js.map +1 -0
  166. package/dist/runtime/create-actions.d.ts +30 -0
  167. package/dist/runtime/create-actions.d.ts.map +1 -0
  168. package/dist/runtime/create-actions.js +71 -0
  169. package/dist/runtime/create-actions.js.map +1 -0
  170. package/dist/runtime/create-runtime-context.d.ts +35 -0
  171. package/dist/runtime/create-runtime-context.d.ts.map +1 -0
  172. package/dist/runtime/create-runtime-context.js +33 -0
  173. package/dist/runtime/create-runtime-context.js.map +1 -0
  174. package/dist/runtime/create-scanner-module.d.ts +14 -0
  175. package/dist/runtime/create-scanner-module.d.ts.map +1 -0
  176. package/dist/runtime/create-scanner-module.js +26 -0
  177. package/dist/runtime/create-scanner-module.js.map +1 -0
  178. package/dist/runtime/create-scanner-providers-for-run.d.ts +20 -0
  179. package/dist/runtime/create-scanner-providers-for-run.d.ts.map +1 -0
  180. package/dist/runtime/create-scanner-providers-for-run.js +34 -0
  181. package/dist/runtime/create-scanner-providers-for-run.js.map +1 -0
  182. package/dist/runtime/default-state-dir.d.ts +10 -0
  183. package/dist/runtime/default-state-dir.d.ts.map +1 -0
  184. package/dist/runtime/default-state-dir.js +22 -0
  185. package/dist/runtime/default-state-dir.js.map +1 -0
  186. package/dist/runtime/env-resolve.d.ts +17 -0
  187. package/dist/runtime/env-resolve.d.ts.map +1 -0
  188. package/dist/runtime/env-resolve.js +45 -0
  189. package/dist/runtime/env-resolve.js.map +1 -0
  190. package/dist/runtime/hook-system.d.ts +7 -0
  191. package/dist/runtime/hook-system.d.ts.map +1 -0
  192. package/dist/runtime/hook-system.js +16 -0
  193. package/dist/runtime/hook-system.js.map +1 -0
  194. package/dist/runtime/index.d.ts +37 -0
  195. package/dist/runtime/index.d.ts.map +1 -0
  196. package/dist/runtime/index.js +26 -0
  197. package/dist/runtime/index.js.map +1 -0
  198. package/dist/runtime/load-trading-strategy.d.ts +23 -0
  199. package/dist/runtime/load-trading-strategy.d.ts.map +1 -0
  200. package/dist/runtime/load-trading-strategy.js +130 -0
  201. package/dist/runtime/load-trading-strategy.js.map +1 -0
  202. package/dist/runtime/map-exit-config.d.ts +12 -0
  203. package/dist/runtime/map-exit-config.d.ts.map +1 -0
  204. package/dist/runtime/map-exit-config.js +91 -0
  205. package/dist/runtime/map-exit-config.js.map +1 -0
  206. package/dist/runtime/map-strategies-registration.d.ts +12 -0
  207. package/dist/runtime/map-strategies-registration.d.ts.map +1 -0
  208. package/dist/runtime/map-strategies-registration.js +52 -0
  209. package/dist/runtime/map-strategies-registration.js.map +1 -0
  210. package/dist/runtime/map-strategies.d.ts +12 -0
  211. package/dist/runtime/map-strategies.d.ts.map +1 -0
  212. package/dist/runtime/map-strategies.js +66 -0
  213. package/dist/runtime/map-strategies.js.map +1 -0
  214. package/dist/runtime/notifications.d.ts +12 -0
  215. package/dist/runtime/notifications.d.ts.map +1 -0
  216. package/dist/runtime/notifications.js +83 -0
  217. package/dist/runtime/notifications.js.map +1 -0
  218. package/dist/runtime/parse-interval.d.ts +11 -0
  219. package/dist/runtime/parse-interval.d.ts.map +1 -0
  220. package/dist/runtime/parse-interval.js +35 -0
  221. package/dist/runtime/parse-interval.js.map +1 -0
  222. package/dist/runtime/reconcile-state.d.ts +25 -0
  223. package/dist/runtime/reconcile-state.d.ts.map +1 -0
  224. package/dist/runtime/reconcile-state.js +112 -0
  225. package/dist/runtime/reconcile-state.js.map +1 -0
  226. package/dist/runtime/risk-guard.d.ts +6 -0
  227. package/dist/runtime/risk-guard.d.ts.map +1 -0
  228. package/dist/runtime/risk-guard.js +14 -0
  229. package/dist/runtime/risk-guard.js.map +1 -0
  230. package/dist/runtime/run.d.ts +21 -0
  231. package/dist/runtime/run.d.ts.map +1 -0
  232. package/dist/runtime/run.js +35 -0
  233. package/dist/runtime/run.js.map +1 -0
  234. package/dist/runtime/runtime.d.ts +40 -0
  235. package/dist/runtime/runtime.d.ts.map +1 -0
  236. package/dist/runtime/runtime.js +251 -0
  237. package/dist/runtime/runtime.js.map +1 -0
  238. package/dist/runtime/scanner-registry.d.ts +22 -0
  239. package/dist/runtime/scanner-registry.d.ts.map +1 -0
  240. package/dist/runtime/scanner-registry.js +83 -0
  241. package/dist/runtime/scanner-registry.js.map +1 -0
  242. package/dist/runtime/strategy-registry.d.ts +49 -0
  243. package/dist/runtime/strategy-registry.d.ts.map +1 -0
  244. package/dist/runtime/strategy-registry.js +156 -0
  245. package/dist/runtime/strategy-registry.js.map +1 -0
  246. package/dist/runtime/trading-strategy-config.d.ts +6 -0
  247. package/dist/runtime/trading-strategy-config.d.ts.map +1 -0
  248. package/dist/runtime/trading-strategy-config.js +5 -0
  249. package/dist/runtime/trading-strategy-config.js.map +1 -0
  250. package/dist/runtime/trading-strategy-schema.d.ts +20093 -0
  251. package/dist/runtime/trading-strategy-schema.d.ts.map +1 -0
  252. package/dist/runtime/trading-strategy-schema.js +115 -0
  253. package/dist/runtime/trading-strategy-schema.js.map +1 -0
  254. package/dist/scanners/__tests__/fixtures/index.d.ts +3 -0
  255. package/dist/scanners/__tests__/fixtures/index.d.ts.map +1 -0
  256. package/dist/scanners/__tests__/fixtures/index.js +3 -0
  257. package/dist/scanners/__tests__/fixtures/index.js.map +1 -0
  258. package/dist/scanners/__tests__/fixtures/scan-results.d.ts +23 -0
  259. package/dist/scanners/__tests__/fixtures/scan-results.d.ts.map +1 -0
  260. package/dist/scanners/__tests__/fixtures/scan-results.js +128 -0
  261. package/dist/scanners/__tests__/fixtures/scan-results.js.map +1 -0
  262. package/dist/scanners/__tests__/fixtures/signals.d.ts +18 -0
  263. package/dist/scanners/__tests__/fixtures/signals.d.ts.map +1 -0
  264. package/dist/scanners/__tests__/fixtures/signals.js +84 -0
  265. package/dist/scanners/__tests__/fixtures/signals.js.map +1 -0
  266. package/dist/scanners/__tests__/test-helpers.d.ts +4 -0
  267. package/dist/scanners/__tests__/test-helpers.d.ts.map +1 -0
  268. package/dist/scanners/__tests__/test-helpers.js +23 -0
  269. package/dist/scanners/__tests__/test-helpers.js.map +1 -0
  270. package/dist/scanners/artifacts.d.ts +119 -0
  271. package/dist/scanners/artifacts.d.ts.map +1 -0
  272. package/dist/scanners/artifacts.js +72 -0
  273. package/dist/scanners/artifacts.js.map +1 -0
  274. package/dist/scanners/create-scanner.d.ts +13 -0
  275. package/dist/scanners/create-scanner.d.ts.map +1 -0
  276. package/dist/scanners/create-scanner.js +11 -0
  277. package/dist/scanners/create-scanner.js.map +1 -0
  278. package/dist/scanners/engine/config-validator.d.ts +7 -0
  279. package/dist/scanners/engine/config-validator.d.ts.map +1 -0
  280. package/dist/scanners/engine/config-validator.js +16 -0
  281. package/dist/scanners/engine/config-validator.js.map +1 -0
  282. package/dist/scanners/engine/data-providers.d.ts +47 -0
  283. package/dist/scanners/engine/data-providers.d.ts.map +1 -0
  284. package/dist/scanners/engine/data-providers.js +8 -0
  285. package/dist/scanners/engine/data-providers.js.map +1 -0
  286. package/dist/scanners/engine/engine.d.ts +76 -0
  287. package/dist/scanners/engine/engine.d.ts.map +1 -0
  288. package/dist/scanners/engine/engine.js +399 -0
  289. package/dist/scanners/engine/engine.js.map +1 -0
  290. package/dist/scanners/engine/index.d.ts +9 -0
  291. package/dist/scanners/engine/index.d.ts.map +1 -0
  292. package/dist/scanners/engine/index.js +7 -0
  293. package/dist/scanners/engine/index.js.map +1 -0
  294. package/dist/scanners/engine/input-resolver.d.ts +21 -0
  295. package/dist/scanners/engine/input-resolver.d.ts.map +1 -0
  296. package/dist/scanners/engine/input-resolver.js +149 -0
  297. package/dist/scanners/engine/input-resolver.js.map +1 -0
  298. package/dist/scanners/engine/lifecycle.d.ts +21 -0
  299. package/dist/scanners/engine/lifecycle.d.ts.map +1 -0
  300. package/dist/scanners/engine/lifecycle.js +2 -0
  301. package/dist/scanners/engine/lifecycle.js.map +1 -0
  302. package/dist/scanners/engine/result-builder.d.ts +30 -0
  303. package/dist/scanners/engine/result-builder.d.ts.map +1 -0
  304. package/dist/scanners/engine/result-builder.js +129 -0
  305. package/dist/scanners/engine/result-builder.js.map +1 -0
  306. package/dist/scanners/engine/strategy-registry.d.ts +45 -0
  307. package/dist/scanners/engine/strategy-registry.d.ts.map +1 -0
  308. package/dist/scanners/engine/strategy-registry.js +93 -0
  309. package/dist/scanners/engine/strategy-registry.js.map +1 -0
  310. package/dist/scanners/events.d.ts +41 -0
  311. package/dist/scanners/events.d.ts.map +1 -0
  312. package/dist/scanners/events.js +33 -0
  313. package/dist/scanners/events.js.map +1 -0
  314. package/dist/scanners/implementations/emerging-movers.d.ts +215 -0
  315. package/dist/scanners/implementations/emerging-movers.d.ts.map +1 -0
  316. package/dist/scanners/implementations/emerging-movers.js +709 -0
  317. package/dist/scanners/implementations/emerging-movers.js.map +1 -0
  318. package/dist/scanners/implementations/index.d.ts +8 -0
  319. package/dist/scanners/implementations/index.d.ts.map +1 -0
  320. package/dist/scanners/implementations/index.js +8 -0
  321. package/dist/scanners/implementations/index.js.map +1 -0
  322. package/dist/scanners/implementations/indicators.d.ts +40 -0
  323. package/dist/scanners/implementations/indicators.d.ts.map +1 -0
  324. package/dist/scanners/implementations/indicators.js +114 -0
  325. package/dist/scanners/implementations/indicators.js.map +1 -0
  326. package/dist/scanners/implementations/liquidation-watchdog.d.ts +74 -0
  327. package/dist/scanners/implementations/liquidation-watchdog.d.ts.map +1 -0
  328. package/dist/scanners/implementations/liquidation-watchdog.js +268 -0
  329. package/dist/scanners/implementations/liquidation-watchdog.js.map +1 -0
  330. package/dist/scanners/implementations/market-regime.d.ts +52 -0
  331. package/dist/scanners/implementations/market-regime.d.ts.map +1 -0
  332. package/dist/scanners/implementations/market-regime.js +201 -0
  333. package/dist/scanners/implementations/market-regime.js.map +1 -0
  334. package/dist/scanners/implementations/momentum.d.ts +21 -0
  335. package/dist/scanners/implementations/momentum.d.ts.map +1 -0
  336. package/dist/scanners/implementations/momentum.js +128 -0
  337. package/dist/scanners/implementations/momentum.js.map +1 -0
  338. package/dist/scanners/implementations/oi-tracker.d.ts +13 -0
  339. package/dist/scanners/implementations/oi-tracker.d.ts.map +1 -0
  340. package/dist/scanners/implementations/oi-tracker.js +67 -0
  341. package/dist/scanners/implementations/oi-tracker.js.map +1 -0
  342. package/dist/scanners/implementations/opportunity.d.ts +104 -0
  343. package/dist/scanners/implementations/opportunity.d.ts.map +1 -0
  344. package/dist/scanners/implementations/opportunity.js +441 -0
  345. package/dist/scanners/implementations/opportunity.js.map +1 -0
  346. package/dist/scanners/implementations/prescreener.d.ts +20 -0
  347. package/dist/scanners/implementations/prescreener.d.ts.map +1 -0
  348. package/dist/scanners/implementations/prescreener.js +97 -0
  349. package/dist/scanners/implementations/prescreener.js.map +1 -0
  350. package/dist/scanners/implementations/sm-flip.d.ts +43 -0
  351. package/dist/scanners/implementations/sm-flip.d.ts.map +1 -0
  352. package/dist/scanners/implementations/sm-flip.js +200 -0
  353. package/dist/scanners/implementations/sm-flip.js.map +1 -0
  354. package/dist/scanners/index.d.ts +25 -0
  355. package/dist/scanners/index.d.ts.map +1 -0
  356. package/dist/scanners/index.js +18 -0
  357. package/dist/scanners/index.js.map +1 -0
  358. package/dist/scanners/input-descriptors.d.ts +61 -0
  359. package/dist/scanners/input-descriptors.d.ts.map +1 -0
  360. package/dist/scanners/input-descriptors.js +43 -0
  361. package/dist/scanners/input-descriptors.js.map +1 -0
  362. package/dist/scanners/protocol/context.d.ts +75 -0
  363. package/dist/scanners/protocol/context.d.ts.map +1 -0
  364. package/dist/scanners/protocol/context.js +2 -0
  365. package/dist/scanners/protocol/context.js.map +1 -0
  366. package/dist/scanners/protocol/hooks.d.ts +18 -0
  367. package/dist/scanners/protocol/hooks.d.ts.map +1 -0
  368. package/dist/scanners/protocol/hooks.js +12 -0
  369. package/dist/scanners/protocol/hooks.js.map +1 -0
  370. package/dist/scanners/protocol/index.d.ts +5 -0
  371. package/dist/scanners/protocol/index.d.ts.map +1 -0
  372. package/dist/scanners/protocol/index.js +2 -0
  373. package/dist/scanners/protocol/index.js.map +1 -0
  374. package/dist/scanners/protocol/scanner.d.ts +47 -0
  375. package/dist/scanners/protocol/scanner.d.ts.map +1 -0
  376. package/dist/scanners/protocol/scanner.js +2 -0
  377. package/dist/scanners/protocol/scanner.js.map +1 -0
  378. package/dist/scanners/providers/adapter.d.ts +23 -0
  379. package/dist/scanners/providers/adapter.d.ts.map +1 -0
  380. package/dist/scanners/providers/adapter.js +227 -0
  381. package/dist/scanners/providers/adapter.js.map +1 -0
  382. package/dist/scanners/providers/cache.d.ts +20 -0
  383. package/dist/scanners/providers/cache.d.ts.map +1 -0
  384. package/dist/scanners/providers/cache.js +61 -0
  385. package/dist/scanners/providers/cache.js.map +1 -0
  386. package/dist/scanners/providers/client.d.ts +53 -0
  387. package/dist/scanners/providers/client.d.ts.map +1 -0
  388. package/dist/scanners/providers/client.js +174 -0
  389. package/dist/scanners/providers/client.js.map +1 -0
  390. package/dist/scanners/providers/factory.d.ts +43 -0
  391. package/dist/scanners/providers/factory.d.ts.map +1 -0
  392. package/dist/scanners/providers/factory.js +192 -0
  393. package/dist/scanners/providers/factory.js.map +1 -0
  394. package/dist/scanners/providers/types.d.ts +61 -0
  395. package/dist/scanners/providers/types.d.ts.map +1 -0
  396. package/dist/scanners/providers/types.js +6 -0
  397. package/dist/scanners/providers/types.js.map +1 -0
  398. package/dist/scanners/runtime-module.d.ts +54 -0
  399. package/dist/scanners/runtime-module.d.ts.map +1 -0
  400. package/dist/scanners/runtime-module.js +90 -0
  401. package/dist/scanners/runtime-module.js.map +1 -0
  402. package/dist/scanners/scanner-definition.d.ts +58 -0
  403. package/dist/scanners/scanner-definition.d.ts.map +1 -0
  404. package/dist/scanners/scanner-definition.js +19 -0
  405. package/dist/scanners/scanner-definition.js.map +1 -0
  406. package/dist/scanners/schema-utils.d.ts +6 -0
  407. package/dist/scanners/schema-utils.d.ts.map +1 -0
  408. package/dist/scanners/schema-utils.js +14 -0
  409. package/dist/scanners/schema-utils.js.map +1 -0
  410. package/dist/scanners/score-utils.d.ts +19 -0
  411. package/dist/scanners/score-utils.d.ts.map +1 -0
  412. package/dist/scanners/score-utils.js +47 -0
  413. package/dist/scanners/score-utils.js.map +1 -0
  414. package/dist/scanners/store/fs-utils.d.ts +12 -0
  415. package/dist/scanners/store/fs-utils.d.ts.map +1 -0
  416. package/dist/scanners/store/fs-utils.js +47 -0
  417. package/dist/scanners/store/fs-utils.js.map +1 -0
  418. package/dist/scanners/store/index.d.ts +5 -0
  419. package/dist/scanners/store/index.d.ts.map +1 -0
  420. package/dist/scanners/store/index.js +5 -0
  421. package/dist/scanners/store/index.js.map +1 -0
  422. package/dist/scanners/store/runtime-store.d.ts +50 -0
  423. package/dist/scanners/store/runtime-store.d.ts.map +1 -0
  424. package/dist/scanners/store/runtime-store.js +91 -0
  425. package/dist/scanners/store/runtime-store.js.map +1 -0
  426. package/dist/scanners/store/shared-artifact-store.d.ts +31 -0
  427. package/dist/scanners/store/shared-artifact-store.d.ts.map +1 -0
  428. package/dist/scanners/store/shared-artifact-store.js +89 -0
  429. package/dist/scanners/store/shared-artifact-store.js.map +1 -0
  430. package/dist/scanners/store/signal-store.d.ts +36 -0
  431. package/dist/scanners/store/signal-store.d.ts.map +1 -0
  432. package/dist/scanners/store/signal-store.js +135 -0
  433. package/dist/scanners/store/signal-store.js.map +1 -0
  434. package/dist/scanners/types.d.ts +115 -0
  435. package/dist/scanners/types.d.ts.map +1 -0
  436. package/dist/scanners/types.js +3 -0
  437. package/dist/scanners/types.js.map +1 -0
  438. package/dist/scripts/run-dsl-standalone-live.d.ts +27 -0
  439. package/dist/scripts/run-dsl-standalone-live.d.ts.map +1 -0
  440. package/dist/scripts/run-dsl-standalone-live.js +207 -0
  441. package/dist/scripts/run-dsl-standalone-live.js.map +1 -0
  442. package/dist/scripts/run-dsl-standalone-mock.d.ts +13 -0
  443. package/dist/scripts/run-dsl-standalone-mock.d.ts.map +1 -0
  444. package/dist/scripts/run-dsl-standalone-mock.js +255 -0
  445. package/dist/scripts/run-dsl-standalone-mock.js.map +1 -0
  446. package/dist/senpi/client.d.ts +77 -0
  447. package/dist/senpi/client.d.ts.map +1 -0
  448. package/dist/senpi/client.js +523 -0
  449. package/dist/senpi/client.js.map +1 -0
  450. package/dist/senpi/constants.d.ts +7 -0
  451. package/dist/senpi/constants.d.ts.map +1 -0
  452. package/dist/senpi/constants.js +7 -0
  453. package/dist/senpi/constants.js.map +1 -0
  454. package/dist/senpi/index.d.ts +3 -0
  455. package/dist/senpi/index.d.ts.map +1 -0
  456. package/dist/senpi/index.js +2 -0
  457. package/dist/senpi/index.js.map +1 -0
  458. package/dist/senpi/types.d.ts +132 -0
  459. package/dist/senpi/types.d.ts.map +1 -0
  460. package/dist/senpi/types.js +3 -0
  461. package/dist/senpi/types.js.map +1 -0
  462. package/dist/state/index.d.ts +3 -0
  463. package/dist/state/index.d.ts.map +1 -0
  464. package/dist/state/index.js +3 -0
  465. package/dist/state/index.js.map +1 -0
  466. package/dist/state/paths.d.ts +8 -0
  467. package/dist/state/paths.d.ts.map +1 -0
  468. package/dist/state/paths.js +19 -0
  469. package/dist/state/paths.js.map +1 -0
  470. package/dist/state/state-manager.d.ts +58 -0
  471. package/dist/state/state-manager.d.ts.map +1 -0
  472. package/dist/state/state-manager.js +221 -0
  473. package/dist/state/state-manager.js.map +1 -0
  474. package/dist/strategy/index.d.ts +2 -0
  475. package/dist/strategy/index.d.ts.map +1 -0
  476. package/dist/strategy/index.js +2 -0
  477. package/dist/strategy/index.js.map +1 -0
  478. package/dist/strategy/strategy-state.d.ts +48 -0
  479. package/dist/strategy/strategy-state.d.ts.map +1 -0
  480. package/dist/strategy/strategy-state.js +185 -0
  481. package/dist/strategy/strategy-state.js.map +1 -0
  482. package/dist/types/action.d.ts +15 -0
  483. package/dist/types/action.d.ts.map +1 -0
  484. package/dist/types/action.js +2 -0
  485. package/dist/types/action.js.map +1 -0
  486. package/dist/types/dsl/index.d.ts +215 -0
  487. package/dist/types/dsl/index.d.ts.map +1 -0
  488. package/dist/types/dsl/index.js +5 -0
  489. package/dist/types/dsl/index.js.map +1 -0
  490. package/dist/types/event-bus.d.ts +11 -0
  491. package/dist/types/event-bus.d.ts.map +1 -0
  492. package/dist/types/event-bus.js +6 -0
  493. package/dist/types/event-bus.js.map +1 -0
  494. package/dist/types/hooks.d.ts +27 -0
  495. package/dist/types/hooks.d.ts.map +1 -0
  496. package/dist/types/hooks.js +15 -0
  497. package/dist/types/hooks.js.map +1 -0
  498. package/dist/types/index.d.ts +6 -0
  499. package/dist/types/index.d.ts.map +1 -0
  500. package/dist/types/index.js +6 -0
  501. package/dist/types/index.js.map +1 -0
  502. package/dist/types/notification.d.ts +4 -0
  503. package/dist/types/notification.d.ts.map +1 -0
  504. package/dist/types/notification.js +3 -0
  505. package/dist/types/notification.js.map +1 -0
  506. package/dist/types/runtime.d.ts +18 -0
  507. package/dist/types/runtime.d.ts.map +1 -0
  508. package/dist/types/runtime.js +2 -0
  509. package/dist/types/runtime.js.map +1 -0
  510. package/dist/types/scanner.d.ts +59 -0
  511. package/dist/types/scanner.d.ts.map +1 -0
  512. package/dist/types/scanner.js +13 -0
  513. package/dist/types/scanner.js.map +1 -0
  514. package/dist/types/strategy.d.ts +100 -0
  515. package/dist/types/strategy.d.ts.map +1 -0
  516. package/dist/types/strategy.js +2 -0
  517. package/dist/types/strategy.js.map +1 -0
  518. package/dist/utils/logger/dsl.d.ts +8 -0
  519. package/dist/utils/logger/dsl.d.ts.map +1 -0
  520. package/dist/utils/logger/dsl.js +7 -0
  521. package/dist/utils/logger/dsl.js.map +1 -0
  522. package/dist/utils/logger.d.ts +13 -0
  523. package/dist/utils/logger.d.ts.map +1 -0
  524. package/dist/utils/logger.js +65 -0
  525. package/dist/utils/logger.js.map +1 -0
  526. package/dist/utils/response.d.ts +14 -0
  527. package/dist/utils/response.d.ts.map +1 -0
  528. package/dist/utils/response.js +44 -0
  529. package/dist/utils/response.js.map +1 -0
  530. package/dist/version.d.ts +2 -0
  531. package/dist/version.d.ts.map +1 -0
  532. package/dist/version.js +2 -0
  533. package/dist/version.js.map +1 -0
  534. package/examples/.env.example +15 -0
  535. package/examples/README.md +75 -0
  536. package/examples/scanners-consumer-quickstart.mjs +134 -0
  537. package/examples/scanners-emerging-movers-v4.mjs +285 -0
  538. package/examples/scanners-liquidation-watchdog.mjs +331 -0
  539. package/examples/scanners-live-mcp.mjs +208 -0
  540. package/examples/scanners-multi-strategy.mjs +165 -0
  541. package/examples/scanners-scheduled-events.mjs +95 -0
  542. package/examples/scanners-senpi-provider-client.mjs +182 -0
  543. package/examples/scanners-single-strategy.mjs +198 -0
  544. package/examples/strategies/README.md +45 -0
  545. package/examples/strategies/dsl-showcase.yaml +60 -0
  546. package/examples/strategies/fox-minimal-loosened.yaml +201 -0
  547. package/examples/strategies/fox-minimal.yaml +209 -0
  548. package/examples/strategies/minimal.yaml +49 -0
  549. package/examples/strategies/viper.yaml +64 -0
  550. package/examples/strategies/wolf.yaml +62 -0
  551. package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +116 -0
  552. package/openclaw.plugin.json +15 -0
  553. package/package.json +52 -0
@@ -0,0 +1,198 @@
1
+ import { mkdtemp, rm } from "node:fs/promises";
2
+ import { tmpdir } from "node:os";
3
+ import { join } from "node:path";
4
+ import {
5
+ createScannerRuntimeModule,
6
+ emergingMoversScanner,
7
+ momentumScanner,
8
+ oiTrackerScanner,
9
+ prescreenerScanner,
10
+ } from "../dist/scanners/index.js";
11
+
12
+ function createInstruments() {
13
+ return [
14
+ {
15
+ name: "BTC",
16
+ isDelisted: false,
17
+ maxLeverage: 10,
18
+ context: {
19
+ markPx: 106,
20
+ prevDayPx: 100,
21
+ midPx: 106,
22
+ dayNtlVlm: 80_000_000,
23
+ openInterest: 2_000_000_000,
24
+ funding: 0.001,
25
+ },
26
+ },
27
+ {
28
+ name: "ETH",
29
+ isDelisted: false,
30
+ maxLeverage: 8,
31
+ context: {
32
+ markPx: 101,
33
+ prevDayPx: 100,
34
+ midPx: 101,
35
+ dayNtlVlm: 40_000_000,
36
+ openInterest: 1_000_000_000,
37
+ funding: 0.001,
38
+ },
39
+ },
40
+ ];
41
+ }
42
+
43
+ function createCandles() {
44
+ return {
45
+ BTC: {
46
+ candles: {
47
+ "1h": [
48
+ {
49
+ timestamp: 1,
50
+ open: 100,
51
+ high: 102,
52
+ low: 99,
53
+ close: 100,
54
+ volume: 1000,
55
+ },
56
+ {
57
+ timestamp: 2,
58
+ open: 100,
59
+ high: 107,
60
+ low: 100,
61
+ close: 106,
62
+ volume: 1400,
63
+ },
64
+ ],
65
+ },
66
+ },
67
+ ETH: {
68
+ candles: {
69
+ "1h": [
70
+ {
71
+ timestamp: 1,
72
+ open: 100,
73
+ high: 101,
74
+ low: 99,
75
+ close: 100,
76
+ volume: 900,
77
+ },
78
+ {
79
+ timestamp: 2,
80
+ open: 100,
81
+ high: 101,
82
+ low: 99,
83
+ close: 100.4,
84
+ volume: 920,
85
+ },
86
+ ],
87
+ },
88
+ },
89
+ };
90
+ }
91
+
92
+ function createSmDataRun1() {
93
+ return [
94
+ {
95
+ token: "SOL",
96
+ direction: "up",
97
+ pctOfTopTradersGain: 0.18,
98
+ traderCount: 220,
99
+ tokenPriceChangePct4h: 2.1,
100
+ },
101
+ {
102
+ token: "AVAX",
103
+ direction: "up",
104
+ pctOfTopTradersGain: 0.16,
105
+ traderCount: 200,
106
+ tokenPriceChangePct4h: 1.9,
107
+ },
108
+ ];
109
+ }
110
+
111
+ function createSmDataRun2() {
112
+ return [
113
+ {
114
+ token: "AVAX",
115
+ direction: "up",
116
+ pctOfTopTradersGain: 0.17,
117
+ traderCount: 230,
118
+ tokenPriceChangePct4h: 2.0,
119
+ },
120
+ {
121
+ token: "SOL",
122
+ direction: "up",
123
+ pctOfTopTradersGain: 0.35,
124
+ traderCount: 250,
125
+ tokenPriceChangePct4h: 4.2,
126
+ },
127
+ ];
128
+ }
129
+
130
+ async function main() {
131
+ const stateDir = await mkdtemp(join(tmpdir(), "scanners-example-single-"));
132
+ let smDataRun = 0;
133
+
134
+ const module = createScannerRuntimeModule({
135
+ stateDir,
136
+ scanners: [prescreenerScanner, oiTrackerScanner, momentumScanner, emergingMoversScanner],
137
+ strategies: [
138
+ {
139
+ id: "alpha",
140
+ name: "Alpha",
141
+ scannerOverrides: {
142
+ momentum: {
143
+ config: {
144
+ timeframe: "1h",
145
+ minMovePct: 1.5,
146
+ maxCandidates: 10,
147
+ minDayVolume: 1_000_000,
148
+ minSignalScore: 0.2,
149
+ requirePrescreened: true,
150
+ },
151
+ },
152
+ "emerging-movers": {
153
+ config: {
154
+ topN: 10,
155
+ minRankJump: 1,
156
+ minTopTradersGain: 0.15,
157
+ minScansBeforeSignals: 2,
158
+ historyLimit: 30,
159
+ },
160
+ },
161
+ },
162
+ },
163
+ ],
164
+ providers: {
165
+ getInstruments: async () => createInstruments(),
166
+ getCandles: async () => createCandles(),
167
+ getSmData: async () => {
168
+ smDataRun += 1;
169
+ return smDataRun === 1 ? createSmDataRun1() : createSmDataRun2();
170
+ },
171
+ },
172
+ });
173
+
174
+ try {
175
+ await module.runOnce("alpha", "prescreener");
176
+ await module.runOnce("alpha", "oi-tracker");
177
+ const momentumResult = await module.runOnce("alpha", "momentum");
178
+ await module.runOnce("alpha", "emerging-movers");
179
+ const emergingResult = await module.runOnce("alpha", "emerging-movers");
180
+
181
+ const signals = await module.querySignals({
182
+ strategyId: "alpha",
183
+ limit: 20,
184
+ });
185
+
186
+ console.log("single-strategy: momentum signals =", momentumResult.signals.length);
187
+ console.log("single-strategy: emerging signals =", emergingResult.signals.length);
188
+ console.log("single-strategy: queried signals =", signals.length);
189
+ } finally {
190
+ await module.stop();
191
+ await rm(stateDir, { recursive: true, force: true });
192
+ }
193
+ }
194
+
195
+ main().catch((error) => {
196
+ console.error(error);
197
+ process.exit(1);
198
+ });
@@ -0,0 +1,45 @@
1
+ # Strategy Templates
2
+
3
+ | File | Style | Scanners | Decision | Use case |
4
+ |------|-------|----------|----------|----------|
5
+ | minimal.yaml | Watch-only | emerging_movers | no_decision | Verify setup; no positions |
6
+ | wolf.yaml | Aggressive | emerging_movers | llm | Early entry on FIRST_JUMP |
7
+ | viper.yaml | Moderate | prescreener + momentum | llm | Candle-based breakouts |
8
+ | fox.yaml | OI-driven | prescreener + oi_tracker | no_decision | OI spike entries |
9
+ | dsl-showcase.yaml | DSL reference | emerging_movers | no_decision | Annotated exit config |
10
+
11
+ ## Quickstart
12
+
13
+ 1. Install the plugin:
14
+ ```bash
15
+ openclaw plugins install @senpi/trading-recipe
16
+ ```
17
+
18
+ 2. Copy a template and fill in your wallet:
19
+ ```bash
20
+ cp wolf.yaml my-strategy.yaml
21
+ # edit: replace ${WALLET_ADDRESS}
22
+ ```
23
+
24
+ 3. Set environment variables:
25
+ ```bash
26
+ cp ../.env.example .env
27
+ # edit: SENPI_API_KEY, WALLET_ADDRESS
28
+ source .env
29
+ ```
30
+
31
+ 4. Load the strategy (hot-loads, no gateway restart):
32
+ ```bash
33
+ openclaw senpi trading-strategy create -p my-strategy.yaml
34
+ ```
35
+
36
+ 5. Verify:
37
+ ```bash
38
+ openclaw senpi trading-strategy list
39
+ ```
40
+
41
+ ## CLI reference
42
+
43
+ - `senpi guide scanners` — scanner config fields
44
+ - `senpi guide dsl` — DSL exit: phases, lock modes, tiers, time-based cuts
45
+ - `senpi guide schema` — full YAML schema
@@ -0,0 +1,60 @@
1
+ # DSL showcase — every DSL field annotated for reference.
2
+ # Use as a copy-paste reference when tuning exit behavior.
3
+ name: dsl-showcase
4
+ version: 1.0.0
5
+ description: Annotated DSL exit config reference.
6
+
7
+ strategies:
8
+ ref:
9
+ wallet: "${WALLET_ADDRESS}"
10
+ budget: 500
11
+ slots: 2
12
+ margin_per_slot: 200
13
+ trading_risk: conservative
14
+ enabled: true
15
+
16
+ scanners:
17
+ - name: emerging_movers
18
+ type: emerging_movers
19
+ interval: 30s
20
+ config:
21
+ topN: 20
22
+ minRankJump: 5
23
+ minScansBeforeSignals: 2
24
+
25
+ actions:
26
+ - name: open_ref
27
+ action_type: OPEN_POSITION
28
+ decision_mode: no_decision
29
+ scanners: [emerging_movers]
30
+ min_confidence: 0
31
+
32
+ exit:
33
+ engine: dsl
34
+ # interval_seconds — how often the price monitor runs
35
+ interval_seconds: 30
36
+ dsl_presets:
37
+ default:
38
+ # lock_mode: pctOfHighWater (default) = floor trails with high-water %; fixedRoe = fixed % of (entry→HW) per tier
39
+ lock_mode: pctOfHighWater
40
+ # phase1 — fixed floor from entry (max_loss_pct)
41
+ phase1:
42
+ enabled: true
43
+ # max_loss_pct — max loss % from entry (floor = entry × (1 − max_loss_pct/100/leverage) for LONG)
44
+ max_loss_pct: 4.0
45
+ # consecutive_breaches_required — ticks below floor before exit fires
46
+ consecutive_breaches_required: 1
47
+ # phase2_trigger_tier — 0 = phase2 starts when first tier is hit
48
+ phase2_trigger_tier: 0
49
+ # phase2 — trailing floor from high-water mark
50
+ phase2:
51
+ enabled: true
52
+ # retrace_threshold — ROE % below HWM for trailing floor (0.015 → 1.5%; engine divides by leverage)
53
+ retrace_threshold: 1.5
54
+ consecutive_breaches_required: 1
55
+ # tiers — trigger_pct = ROE % from entry that activates tier; lock_hw_pct = % of highWaterRoe to lock; breaches = per-tier override
56
+ tiers:
57
+ - { trigger_pct: 7, lock_hw_pct: 40, breaches: 3 }
58
+ - { trigger_pct: 12, lock_hw_pct: 55, breaches: 2 }
59
+ - { trigger_pct: 15, lock_hw_pct: 75, breaches: 2 }
60
+ - { trigger_pct: 20, lock_hw_pct: 85, breaches: 1 }
@@ -0,0 +1,201 @@
1
+ name: fox-minimal-loosened
2
+ version: 1.6.0
3
+ description: >
4
+ FOX v1.6 — loosened configuration for functional evaluation.
5
+ Scanner thresholds relaxed, LLM gauntlet simplified, and slots increased
6
+ to maximize signal volume. NOT for live trading.
7
+
8
+ strategies:
9
+ fox-primary:
10
+ wallet: "${FOX_WALLET}"
11
+ budget: "3010"
12
+ slots: 3
13
+ margin_per_slot: 1000
14
+ trading_risk: aggressive
15
+ enabled: true
16
+
17
+ scanners:
18
+ # ── Primary signal: emerging movers (every 60s, faster for eval) ──
19
+ - name: emerging_movers
20
+ type: emerging_movers
21
+ interval: 60s
22
+ blocked_assets: []
23
+ config:
24
+ topN: 100
25
+ minRankJump: 2
26
+ minTopTradersGain: 0.02
27
+ minScansBeforeSignals: 1
28
+ historyLimit: 60
29
+ immediateJumpThreshold: 5
30
+ deepClimbRankThreshold: 40
31
+ contribExplosionMultiplier: 1.5
32
+ contribAccelThreshold: 0.001
33
+ minVelocityForDeepClimber: 0.0001
34
+ erraticReversalThreshold: 10
35
+ climbStreakScans: 2
36
+ rankClimbThreshold: 2
37
+ firstJumpMinPrevRank: 15
38
+ minLeverage: 2
39
+ blacklist: []
40
+
41
+ # ── Macro context: BTC+ETH regime classification (every 4h) ──
42
+ - name: market_regime
43
+ type: market_regime
44
+ interval: 14400s
45
+ config:
46
+ btcWeight: 0.6
47
+ ethWeight: 0.4
48
+ emaFast: 9
49
+ emaSlow: 21
50
+ neutralThreshold: 0.3
51
+
52
+ # ── SM conviction reversal detection (every 5 min) ──
53
+ - name: sm_flip
54
+ type: sm_flip
55
+ interval: 300s
56
+ config:
57
+ minConviction: 4
58
+
59
+ # ── Margin safety net (every 5 min) ──
60
+ - name: watchdog
61
+ type: liquidation_watchdog
62
+ interval: 300s
63
+ config:
64
+ bufferWarningPct: 50
65
+ bufferCriticalPct: 30
66
+ liqDistanceWarningPct: 30
67
+ liqDistanceIsolatedWarningPct: 15
68
+ roeDangerPct: -15
69
+
70
+ # ── Infrastructure: prescreener for opportunity scanner (every 60s) ──
71
+ - name: prescreener
72
+ type: prescreener
73
+ interval: 60s
74
+ config:
75
+ topN: 50
76
+ minDayVolume: 200000
77
+ minLeverage: 2
78
+
79
+ # ── Secondary deep scan: 4-pillar opportunity scoring (every 10 min) ──
80
+ - name: opportunity
81
+ type: opportunity
82
+ interval: 600s
83
+ config:
84
+ minCompositeScore: 30
85
+ maxCandidates: 30
86
+ minDayVolume: 200000
87
+
88
+ actions:
89
+ # ── Entry: LLM relaxed filter on emerging mover signals ──
90
+ - name: fox_entry
91
+ action_type: OPEN_POSITION
92
+ decision_mode: llm
93
+ decision_model: claude-sonnet-4-6
94
+ scanners: [emerging_movers]
95
+ min_confidence: 4
96
+ context:
97
+ - type: signal
98
+ value: emerging_movers
99
+ - type: market_regime
100
+ value: regime
101
+ decision_prompt: |
102
+ You are the FOX v1.6 entry filter in EVALUATION MODE. Evaluate emerging mover
103
+ signals with relaxed thresholds to maximize signal throughput for functional testing.
104
+
105
+ SIGNAL DATA:
106
+ {{emerging_movers}}
107
+
108
+ MARKET REGIME:
109
+ {{regime}}
110
+
111
+ ═══ LAYER 1: SIGNAL DETECTION (relaxed) ═══
112
+ - Must have at least one of: FIRST_JUMP, IMMEDIATE_MOVER, DEEP_CLIMBER, CONTRIB_EXPLOSION
113
+ - rankJumpThisScan ≥ 5 OR contribVelocity > 5
114
+ - Asset at #1-5 for 3+ scans → SKIP (move is over)
115
+
116
+ ═══ LAYER 2: SCORING (minimum 4 points) ═══
117
+ FIRST_JUMP: +3
118
+ IMMEDIATE_MOVER: +2
119
+ contribVelocity > 5: +2
120
+ CONTRIB_EXPLOSION: +2
121
+ DEEP_CLIMBER: +1
122
+ RANK_UP: +1
123
+ CLIMBING: +1
124
+ ACCEL: +1
125
+ STREAK: +1
126
+ BTC 1h bias aligned: +1
127
+
128
+ Minimum requirements: score ≥ 4, reasons ≥ 2, contribVelocity > 2
129
+
130
+ ═══ LAYER 3: VELOCITY & PRICE ACTION (relaxed) ═══
131
+ - Negative velocity without any jump reason → SKIP
132
+ - Any positive velocity is sufficient for all signal types
133
+ - Erratic rank history → SKIP only if no strong reason (FIRST_JUMP/CONTRIB_EXPLOSION)
134
+
135
+ ═══ LAYER 4: LEVERAGE & ASSET CHECKS (relaxed) ═══
136
+ - Max leverage for asset must be ≥ 2x
137
+ - XYZ equities: ignore trader count, use leverageType "ISOLATED" and dex "xyz"
138
+ - ≥ 5 SM traders required (crypto only, waived for XYZ)
139
+
140
+ ═══ LAYER 5: MARKET REGIME (relaxed) ═══
141
+ - BEARISH: prefer SHORT, but LONG allowed if score ≥ 6
142
+ - BULLISH: prefer LONG, but SHORT allowed if score ≥ 6
143
+ - NEUTRAL or stale: both directions allowed
144
+
145
+ ═══ ROTATION (slots full + new signal) ═══
146
+ - Weakest position has negative ROE → CUT and ENTER new
147
+ - Weakest has positive ROE or SM conviction 3+ → HOLD
148
+ - Never rotate positions younger than 5 minutes
149
+
150
+ ═══ ANTI-PATTERNS (hard blocks) ═══
151
+ - Rank #1-5 for 3+ scans → move is over
152
+ - Burned/blacklisted asset → SKIP
153
+
154
+ Respond:
155
+ {
156
+ "execute": true/false,
157
+ "actionType": "OPEN_POSITION",
158
+ "confidence": 1-10,
159
+ "reasoning": "one sentence",
160
+ "payload": {
161
+ "signals": [
162
+ { "asset": "<ticker>", "direction": "LONG" or "SHORT", "reason": "one sentence", "rotate_out": "<asset_to_cut>" }
163
+ ]
164
+ }
165
+ }
166
+
167
+ # ── SM flip: immediate close on conviction reversal ──
168
+ - name: sm_flip_close
169
+ action_type: CLOSE_POSITION
170
+ decision_mode: rule
171
+ scanners: [sm_flip]
172
+ min_confidence: 1
173
+
174
+ # ── Watchdog: emergency close on margin danger ──
175
+ - name: watchdog_close
176
+ action_type: CLOSE_POSITION
177
+ decision_mode: rule
178
+ scanners: [watchdog]
179
+ min_confidence: 1
180
+
181
+ # ── DSL — trailing exit
182
+ exit:
183
+ engine: dsl
184
+ interval_seconds: 30
185
+ dsl_presets:
186
+ with_phases:
187
+ lock_mode: pctOfHighWater
188
+ phase1:
189
+ enabled: true
190
+ max_loss_pct: 2.0
191
+ consecutive_breaches_required: 3
192
+ phase2_trigger_tier: 0
193
+ phase2:
194
+ enabled: true
195
+ retrace_threshold: 1.5
196
+ consecutive_breaches_required: 1
197
+ tiers:
198
+ - { trigger_pct: 7, lock_hw_pct: 40, breaches: 3 }
199
+ - { trigger_pct: 12, lock_hw_pct: 55, breaches: 2 }
200
+ - { trigger_pct: 15, lock_hw_pct: 75, breaches: 2 }
201
+ - { trigger_pct: 20, lock_hw_pct: 85, breaches: 1 }
@@ -0,0 +1,209 @@
1
+ name: fox-minimal
2
+ version: 1.6.0
3
+ description: >
4
+ FOX v1.6 — autonomous momentum trading via senpi-trading-recipe.
5
+ Emerging movers detect first jumps, LLM entry filter applies the five-layer
6
+ gauntlet, DSL v5.3.1 manages trailing exits, watchdog guards margin health,
7
+ market-regime provides macro context, sm-flip detects conviction reversals.
8
+
9
+ strategies:
10
+ fox-primary:
11
+ wallet: "${FOX_WALLET}"
12
+ budget: "3010"
13
+ slots: 1
14
+ margin_per_slot: 1500
15
+ trading_risk: aggressive
16
+ enabled: true
17
+
18
+ scanners:
19
+ # ── Primary signal: emerging movers (every 90s, matching Fox 3-min cron) ──
20
+ - name: emerging_movers
21
+ type: emerging_movers
22
+ interval: 90s
23
+ blocked_assets: []
24
+ config:
25
+ topN: 50
26
+ minRankJump: 5
27
+ minTopTradersGain: 0.1
28
+ minScansBeforeSignals: 2
29
+ historyLimit: 60
30
+ immediateJumpThreshold: 10
31
+ deepClimbRankThreshold: 25
32
+ contribExplosionMultiplier: 3
33
+ contribAccelThreshold: 0.003
34
+ minVelocityForDeepClimber: 0.0003
35
+ erraticReversalThreshold: 5
36
+ climbStreakScans: 3
37
+ rankClimbThreshold: 3
38
+ firstJumpMinPrevRank: 30
39
+ minLeverage: 7
40
+ blacklist: ["XPL", "kPEPE"]
41
+
42
+ # ── Macro context: BTC+ETH regime classification (every 4h) ──
43
+ - name: market_regime
44
+ type: market_regime
45
+ interval: 14400s
46
+ config:
47
+ btcWeight: 0.6
48
+ ethWeight: 0.4
49
+ emaFast: 9
50
+ emaSlow: 21
51
+ neutralThreshold: 0.3
52
+
53
+ # ── SM conviction reversal detection (every 5 min) ──
54
+ - name: sm_flip
55
+ type: sm_flip
56
+ interval: 300s
57
+ config:
58
+ minConviction: 4
59
+
60
+ # ── Margin safety net (every 5 min) ──
61
+ - name: watchdog
62
+ type: liquidation_watchdog
63
+ interval: 300s
64
+ config:
65
+ bufferWarningPct: 50
66
+ bufferCriticalPct: 30
67
+ liqDistanceWarningPct: 30
68
+ liqDistanceIsolatedWarningPct: 15
69
+ roeDangerPct: -15
70
+
71
+ # ── Infrastructure: prescreener for opportunity scanner (every 60s) ──
72
+ - name: prescreener
73
+ type: prescreener
74
+ interval: 60s
75
+ config:
76
+ topN: 30
77
+ minDayVolume: 500000
78
+ minLeverage: 2
79
+
80
+ # ── Secondary deep scan: 4-pillar opportunity scoring (every 15 min) ──
81
+ - name: opportunity
82
+ type: opportunity
83
+ interval: 900s
84
+ config:
85
+ minCompositeScore: 60
86
+ maxCandidates: 15
87
+ minDayVolume: 500000
88
+
89
+ actions:
90
+ # ── Entry: LLM five-layer gauntlet on emerging mover signals ──
91
+ - name: fox_entry
92
+ action_type: OPEN_POSITION
93
+ decision_mode: llm
94
+ decision_model: claude-sonnet-4-6
95
+ scanners: [emerging_movers]
96
+ min_confidence: 7
97
+ context:
98
+ - type: signal
99
+ value: emerging_movers
100
+ - type: market_regime
101
+ value: regime
102
+ decision_prompt: |
103
+ You are the FOX v1.6 entry filter. Evaluate emerging mover signals through
104
+ a strict five-layer gauntlet. Speed is edge — enter on FIRST signal or skip.
105
+
106
+ SIGNAL DATA:
107
+ {{emerging_movers}}
108
+
109
+ MARKET REGIME:
110
+ {{regime}}
111
+
112
+ ═══ LAYER 1: FIRST JUMP DETECTION (mandatory) ═══
113
+ - Must have FIRST_JUMP reason (jumped 10+ ranks from #25+ in one scan)
114
+ - Previous rank must be ≥ 20 (outside top 20)
115
+ - rankJumpThisScan ≥ 15 OR contribVelocity > 15 (small jumps eliminated)
116
+ - Asset already at #1-10 for 2+ scans → SKIP (move is over)
117
+
118
+ ═══ LAYER 2: SCORING (minimum 7 points, 8 for NEUTRAL regime) ═══
119
+ FIRST_JUMP: +3 (mandatory)
120
+ IMMEDIATE_MOVER: +2
121
+ contribVelocity > 10: +2
122
+ CONTRIB_EXPLOSION: +2
123
+ DEEP_CLIMBER: +1
124
+ RANK_UP: +1
125
+ CLIMBING: +1
126
+ ACCEL: +1
127
+ STREAK: +1
128
+ BTC 1h bias aligned: +1
129
+ UTC 04:00-13:59: +1 (time-of-day bonus)
130
+ UTC 18:00-02:00: -2 (evening penalty — needs score 9+ effective)
131
+
132
+ Minimum requirements: score ≥ 7, reasons ≥ 3, contribVelocity > 7 (hard gate)
133
+
134
+ ═══ LAYER 3: VELOCITY & PRICE ACTION ═══
135
+ - Negative velocity without big jump → SKIP
136
+ - IMMEDIATE_MOVER/FIRST_JUMP: vel > 0 sufficient
137
+ - DEEP_CLIMBER: vel ≥ 0.03% (0.0003 decimal)
138
+ - Erratic rank history (zigzag) → SKIP unless CONTRIB_EXPLOSION
139
+
140
+ ═══ LAYER 4: LEVERAGE & ASSET CHECKS ═══
141
+ - Max leverage for asset must be ≥ 7x — skip if capped at 3-5x
142
+ - XYZ equities: ignore trader count, require score ≥ 10,
143
+ use leverageType "ISOLATED" and dex "xyz"
144
+ - ≥ 10 SM traders required (crypto only, waived for XYZ)
145
+
146
+ ═══ LAYER 5: MARKET REGIME ═══
147
+ - BEARISH (bear ≥ 60, conf ≥ 50): SHORT only
148
+ - BULLISH (bull ≥ 60, conf ≥ 50): LONG only
149
+ - NEUTRAL or stale (> 1h): both directions if score ≥ 8
150
+
151
+ ═══ ROTATION (slots full + explosive FIRST_JUMP) ═══
152
+ - Weakest position has negative ROE → CUT and ENTER new
153
+ - Weakest has positive ROE or SM conviction 3+ → HOLD
154
+ - Never rotate positions younger than 10 minutes
155
+
156
+ ═══ ANTI-PATTERNS (hard blocks) ═══
157
+ - Rank #1-10 for 2+ scans → move is over
158
+ - 4+ reasons at rank #5 → already peaked
159
+ - Counter to BTC hourly trend → hard block
160
+ - Burned/blacklisted asset → SKIP
161
+
162
+ Respond:
163
+ {
164
+ "execute": true/false,
165
+ "actionType": "OPEN_POSITION",
166
+ "confidence": 1-10,
167
+ "reasoning": "one sentence",
168
+ "payload": {
169
+ "signals": [
170
+ { "asset": "<ticker>", "direction": "LONG" or "SHORT", "reason": "one sentence", "rotate_out": "<asset_to_cut>" }
171
+ ]
172
+ }
173
+ }
174
+
175
+ # ── SM flip: immediate close on conviction reversal ──
176
+ - name: sm_flip_close
177
+ action_type: CLOSE_POSITION
178
+ decision_mode: rule
179
+ scanners: [sm_flip]
180
+ min_confidence: 1
181
+
182
+ # ── Watchdog: emergency close on margin danger ──
183
+ - name: watchdog_close
184
+ action_type: CLOSE_POSITION
185
+ decision_mode: rule
186
+ scanners: [watchdog]
187
+ min_confidence: 1
188
+
189
+ # ── DSL — trailing exit
190
+ exit:
191
+ engine: dsl
192
+ interval_seconds: 30
193
+ dsl_presets:
194
+ with_phases:
195
+ lock_mode: pctOfHighWater
196
+ phase1:
197
+ enabled: true
198
+ max_loss_pct: 2.0
199
+ consecutive_breaches_required: 3
200
+ phase2_trigger_tier: 0
201
+ phase2:
202
+ enabled: true
203
+ retrace_threshold: 1.5
204
+ consecutive_breaches_required: 1
205
+ tiers:
206
+ - { trigger_pct: 7, lock_hw_pct: 40, breaches: 3 }
207
+ - { trigger_pct: 12, lock_hw_pct: 55, breaches: 2 }
208
+ - { trigger_pct: 15, lock_hw_pct: 75, breaches: 2 }
209
+ - { trigger_pct: 20, lock_hw_pct: 85, breaches: 1 }