@timmeck/trading-brain 1.0.0

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 (247) hide show
  1. package/README.md +306 -0
  2. package/dist/api/server.d.ts +21 -0
  3. package/dist/api/server.js +157 -0
  4. package/dist/api/server.js.map +1 -0
  5. package/dist/cli/colors.d.ts +46 -0
  6. package/dist/cli/colors.js +70 -0
  7. package/dist/cli/colors.js.map +1 -0
  8. package/dist/cli/commands/config.d.ts +2 -0
  9. package/dist/cli/commands/config.js +70 -0
  10. package/dist/cli/commands/config.js.map +1 -0
  11. package/dist/cli/commands/doctor.d.ts +2 -0
  12. package/dist/cli/commands/doctor.js +61 -0
  13. package/dist/cli/commands/doctor.js.map +1 -0
  14. package/dist/cli/commands/export.d.ts +2 -0
  15. package/dist/cli/commands/export.js +23 -0
  16. package/dist/cli/commands/export.js.map +1 -0
  17. package/dist/cli/commands/import.d.ts +2 -0
  18. package/dist/cli/commands/import.js +42 -0
  19. package/dist/cli/commands/import.js.map +1 -0
  20. package/dist/cli/commands/insights.d.ts +2 -0
  21. package/dist/cli/commands/insights.js +29 -0
  22. package/dist/cli/commands/insights.js.map +1 -0
  23. package/dist/cli/commands/network.d.ts +2 -0
  24. package/dist/cli/commands/network.js +43 -0
  25. package/dist/cli/commands/network.js.map +1 -0
  26. package/dist/cli/commands/query.d.ts +2 -0
  27. package/dist/cli/commands/query.js +27 -0
  28. package/dist/cli/commands/query.js.map +1 -0
  29. package/dist/cli/commands/rules.d.ts +2 -0
  30. package/dist/cli/commands/rules.js +26 -0
  31. package/dist/cli/commands/rules.js.map +1 -0
  32. package/dist/cli/commands/start.d.ts +2 -0
  33. package/dist/cli/commands/start.js +86 -0
  34. package/dist/cli/commands/start.js.map +1 -0
  35. package/dist/cli/commands/status.d.ts +2 -0
  36. package/dist/cli/commands/status.js +58 -0
  37. package/dist/cli/commands/status.js.map +1 -0
  38. package/dist/cli/commands/stop.d.ts +2 -0
  39. package/dist/cli/commands/stop.js +34 -0
  40. package/dist/cli/commands/stop.js.map +1 -0
  41. package/dist/cli/ipc-helper.d.ts +2 -0
  42. package/dist/cli/ipc-helper.js +26 -0
  43. package/dist/cli/ipc-helper.js.map +1 -0
  44. package/dist/config.d.ts +2 -0
  45. package/dist/config.js +107 -0
  46. package/dist/config.js.map +1 -0
  47. package/dist/db/connection.d.ts +2 -0
  48. package/dist/db/connection.js +19 -0
  49. package/dist/db/connection.js.map +1 -0
  50. package/dist/db/migrations/001_core.d.ts +2 -0
  51. package/dist/db/migrations/001_core.js +42 -0
  52. package/dist/db/migrations/001_core.js.map +1 -0
  53. package/dist/db/migrations/002_synapses.d.ts +2 -0
  54. package/dist/db/migrations/002_synapses.js +43 -0
  55. package/dist/db/migrations/002_synapses.js.map +1 -0
  56. package/dist/db/migrations/003_learning.d.ts +2 -0
  57. package/dist/db/migrations/003_learning.js +48 -0
  58. package/dist/db/migrations/003_learning.js.map +1 -0
  59. package/dist/db/migrations/004_research.d.ts +2 -0
  60. package/dist/db/migrations/004_research.js +29 -0
  61. package/dist/db/migrations/004_research.js.map +1 -0
  62. package/dist/db/migrations/index.d.ts +2 -0
  63. package/dist/db/migrations/index.js +45 -0
  64. package/dist/db/migrations/index.js.map +1 -0
  65. package/dist/db/repositories/calibration.repository.d.ts +25 -0
  66. package/dist/db/repositories/calibration.repository.js +66 -0
  67. package/dist/db/repositories/calibration.repository.js.map +1 -0
  68. package/dist/db/repositories/chain.repository.d.ts +28 -0
  69. package/dist/db/repositories/chain.repository.js +52 -0
  70. package/dist/db/repositories/chain.repository.js.map +1 -0
  71. package/dist/db/repositories/graph.repository.d.ts +33 -0
  72. package/dist/db/repositories/graph.repository.js +73 -0
  73. package/dist/db/repositories/graph.repository.js.map +1 -0
  74. package/dist/db/repositories/insight.repository.d.ts +30 -0
  75. package/dist/db/repositories/insight.repository.js +60 -0
  76. package/dist/db/repositories/insight.repository.js.map +1 -0
  77. package/dist/db/repositories/rule.repository.d.ts +35 -0
  78. package/dist/db/repositories/rule.repository.js +48 -0
  79. package/dist/db/repositories/rule.repository.js.map +1 -0
  80. package/dist/db/repositories/signal.repository.d.ts +17 -0
  81. package/dist/db/repositories/signal.repository.js +35 -0
  82. package/dist/db/repositories/signal.repository.js.map +1 -0
  83. package/dist/db/repositories/synapse.repository.d.ts +25 -0
  84. package/dist/db/repositories/synapse.repository.js +50 -0
  85. package/dist/db/repositories/synapse.repository.js.map +1 -0
  86. package/dist/db/repositories/trade.repository.d.ts +36 -0
  87. package/dist/db/repositories/trade.repository.js +64 -0
  88. package/dist/db/repositories/trade.repository.js.map +1 -0
  89. package/dist/graph/weighted-graph.d.ts +58 -0
  90. package/dist/graph/weighted-graph.js +149 -0
  91. package/dist/graph/weighted-graph.js.map +1 -0
  92. package/dist/index.d.ts +2 -0
  93. package/dist/index.js +49 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/ipc/client.d.ts +16 -0
  96. package/dist/ipc/client.js +95 -0
  97. package/dist/ipc/client.js.map +1 -0
  98. package/dist/ipc/protocol.d.ts +8 -0
  99. package/dist/ipc/protocol.js +29 -0
  100. package/dist/ipc/protocol.js.map +1 -0
  101. package/dist/ipc/router.d.ts +32 -0
  102. package/dist/ipc/router.js +70 -0
  103. package/dist/ipc/router.js.map +1 -0
  104. package/dist/ipc/server.d.ts +18 -0
  105. package/dist/ipc/server.js +142 -0
  106. package/dist/ipc/server.js.map +1 -0
  107. package/dist/learning/calibrator.d.ts +6 -0
  108. package/dist/learning/calibrator.js +57 -0
  109. package/dist/learning/calibrator.js.map +1 -0
  110. package/dist/learning/chain-detector.d.ts +17 -0
  111. package/dist/learning/chain-detector.js +29 -0
  112. package/dist/learning/chain-detector.js.map +1 -0
  113. package/dist/learning/learning-engine.d.ts +31 -0
  114. package/dist/learning/learning-engine.js +85 -0
  115. package/dist/learning/learning-engine.js.map +1 -0
  116. package/dist/learning/pattern-extractor.d.ts +14 -0
  117. package/dist/learning/pattern-extractor.js +40 -0
  118. package/dist/learning/pattern-extractor.js.map +1 -0
  119. package/dist/mcp/http-server.d.ts +14 -0
  120. package/dist/mcp/http-server.js +117 -0
  121. package/dist/mcp/http-server.js.map +1 -0
  122. package/dist/mcp/server.d.ts +1 -0
  123. package/dist/mcp/server.js +67 -0
  124. package/dist/mcp/server.js.map +1 -0
  125. package/dist/mcp/tools.d.ts +7 -0
  126. package/dist/mcp/tools.js +158 -0
  127. package/dist/mcp/tools.js.map +1 -0
  128. package/dist/research/research-engine.d.ts +21 -0
  129. package/dist/research/research-engine.js +204 -0
  130. package/dist/research/research-engine.js.map +1 -0
  131. package/dist/services/analytics.service.d.ts +16 -0
  132. package/dist/services/analytics.service.js +64 -0
  133. package/dist/services/analytics.service.js.map +1 -0
  134. package/dist/services/insight.service.d.ts +11 -0
  135. package/dist/services/insight.service.js +25 -0
  136. package/dist/services/insight.service.js.map +1 -0
  137. package/dist/services/signal.service.d.ts +22 -0
  138. package/dist/services/signal.service.js +96 -0
  139. package/dist/services/signal.service.js.map +1 -0
  140. package/dist/services/strategy.service.d.ts +29 -0
  141. package/dist/services/strategy.service.js +115 -0
  142. package/dist/services/strategy.service.js.map +1 -0
  143. package/dist/services/synapse.service.d.ts +20 -0
  144. package/dist/services/synapse.service.js +48 -0
  145. package/dist/services/synapse.service.js.map +1 -0
  146. package/dist/services/trade.service.d.ts +37 -0
  147. package/dist/services/trade.service.js +114 -0
  148. package/dist/services/trade.service.js.map +1 -0
  149. package/dist/signals/fingerprint.d.ts +29 -0
  150. package/dist/signals/fingerprint.js +98 -0
  151. package/dist/signals/fingerprint.js.map +1 -0
  152. package/dist/signals/wilson-score.d.ts +10 -0
  153. package/dist/signals/wilson-score.js +19 -0
  154. package/dist/signals/wilson-score.js.map +1 -0
  155. package/dist/synapses/decay.d.ts +6 -0
  156. package/dist/synapses/decay.js +17 -0
  157. package/dist/synapses/decay.js.map +1 -0
  158. package/dist/synapses/hebbian.d.ts +11 -0
  159. package/dist/synapses/hebbian.js +21 -0
  160. package/dist/synapses/hebbian.js.map +1 -0
  161. package/dist/synapses/synapse-manager.d.ts +22 -0
  162. package/dist/synapses/synapse-manager.js +99 -0
  163. package/dist/synapses/synapse-manager.js.map +1 -0
  164. package/dist/trading-core.d.ts +17 -0
  165. package/dist/trading-core.js +235 -0
  166. package/dist/trading-core.js.map +1 -0
  167. package/dist/types/config.types.d.ts +52 -0
  168. package/dist/types/config.types.js +2 -0
  169. package/dist/types/config.types.js.map +1 -0
  170. package/dist/types/ipc.types.d.ts +11 -0
  171. package/dist/types/ipc.types.js +2 -0
  172. package/dist/types/ipc.types.js.map +1 -0
  173. package/dist/utils/events.d.ts +48 -0
  174. package/dist/utils/events.js +23 -0
  175. package/dist/utils/events.js.map +1 -0
  176. package/dist/utils/hash.d.ts +1 -0
  177. package/dist/utils/hash.js +5 -0
  178. package/dist/utils/hash.js.map +1 -0
  179. package/dist/utils/logger.d.ts +8 -0
  180. package/dist/utils/logger.js +39 -0
  181. package/dist/utils/logger.js.map +1 -0
  182. package/dist/utils/paths.d.ts +3 -0
  183. package/dist/utils/paths.js +18 -0
  184. package/dist/utils/paths.js.map +1 -0
  185. package/package.json +47 -0
  186. package/src/api/server.ts +160 -0
  187. package/src/cli/colors.ts +80 -0
  188. package/src/cli/commands/config.ts +76 -0
  189. package/src/cli/commands/doctor.ts +62 -0
  190. package/src/cli/commands/export.ts +24 -0
  191. package/src/cli/commands/import.ts +44 -0
  192. package/src/cli/commands/insights.ts +30 -0
  193. package/src/cli/commands/network.ts +43 -0
  194. package/src/cli/commands/query.ts +28 -0
  195. package/src/cli/commands/rules.ts +27 -0
  196. package/src/cli/commands/start.ts +93 -0
  197. package/src/cli/commands/status.ts +64 -0
  198. package/src/cli/commands/stop.ts +33 -0
  199. package/src/cli/ipc-helper.ts +22 -0
  200. package/src/config.ts +103 -0
  201. package/src/db/connection.ts +22 -0
  202. package/src/db/migrations/001_core.ts +43 -0
  203. package/src/db/migrations/002_synapses.ts +44 -0
  204. package/src/db/migrations/003_learning.ts +49 -0
  205. package/src/db/migrations/004_research.ts +30 -0
  206. package/src/db/migrations/index.ts +60 -0
  207. package/src/db/repositories/calibration.repository.ts +86 -0
  208. package/src/db/repositories/chain.repository.ts +70 -0
  209. package/src/db/repositories/graph.repository.ts +103 -0
  210. package/src/db/repositories/insight.repository.ts +80 -0
  211. package/src/db/repositories/rule.repository.ts +67 -0
  212. package/src/db/repositories/signal.repository.ts +48 -0
  213. package/src/db/repositories/synapse.repository.ts +71 -0
  214. package/src/db/repositories/trade.repository.ts +97 -0
  215. package/src/graph/weighted-graph.ts +194 -0
  216. package/src/index.ts +55 -0
  217. package/src/ipc/client.ts +112 -0
  218. package/src/ipc/protocol.ts +35 -0
  219. package/src/ipc/router.ts +113 -0
  220. package/src/ipc/server.ts +150 -0
  221. package/src/learning/calibrator.ts +57 -0
  222. package/src/learning/chain-detector.ts +43 -0
  223. package/src/learning/learning-engine.ts +94 -0
  224. package/src/learning/pattern-extractor.ts +53 -0
  225. package/src/mcp/http-server.ts +118 -0
  226. package/src/mcp/server.ts +72 -0
  227. package/src/mcp/tools.ts +256 -0
  228. package/src/research/research-engine.ts +223 -0
  229. package/src/services/analytics.service.ts +68 -0
  230. package/src/services/insight.service.ts +29 -0
  231. package/src/services/signal.service.ts +109 -0
  232. package/src/services/strategy.service.ts +130 -0
  233. package/src/services/synapse.service.ts +58 -0
  234. package/src/services/trade.service.ts +139 -0
  235. package/src/signals/fingerprint.ts +93 -0
  236. package/src/signals/wilson-score.ts +17 -0
  237. package/src/synapses/decay.ts +19 -0
  238. package/src/synapses/hebbian.ts +23 -0
  239. package/src/synapses/synapse-manager.ts +112 -0
  240. package/src/trading-core.ts +285 -0
  241. package/src/types/config.types.ts +60 -0
  242. package/src/types/ipc.types.ts +8 -0
  243. package/src/utils/events.ts +42 -0
  244. package/src/utils/hash.ts +5 -0
  245. package/src/utils/logger.ts +48 -0
  246. package/src/utils/paths.ts +19 -0
  247. package/tsconfig.json +18 -0
package/README.md ADDED
@@ -0,0 +1,306 @@
1
+ # Trading Brain
2
+
3
+ **Adaptive Trading Intelligence & Signal Learning System for Claude Code**
4
+
5
+ Trading Brain is an MCP server that gives Claude Code a persistent trading memory. It learns from every trade outcome — strengthening connections between signals, strategies, and results through a Hebbian synapse network. Over time, it develops confidence in signal combinations, adapts calibration parameters, and surfaces research insights about your trading patterns.
6
+
7
+ ## Why Trading Brain?
8
+
9
+ Without Trading Brain, every trading decision starts from zero. With Trading Brain:
10
+
11
+ - **Signals are weighted by experience** — Brain tracks which signal combinations actually lead to winning trades, not just theory
12
+ - **Confidence is statistical** — Wilson Score intervals provide conservative confidence bounds, not just raw win rates
13
+ - **DCA multipliers adapt** — Brain-recommended position sizes adjust based on regime awareness and historical performance
14
+ - **Grid parameters tune themselves** — Volatility-aware grid spacing multipliers based on actual outcomes
15
+ - **Patterns emerge automatically** — The learning engine extracts rules from signal fingerprint groupings
16
+ - **Streaks are detected** — Chain detection identifies winning and losing streaks per pair
17
+ - **Knowledge compounds** — Every trade outcome makes Brain smarter through Hebbian learning
18
+ - **Research runs continuously** — Trend analysis, gap detection, synergy mapping, and regime shift detection
19
+
20
+ ## Features
21
+
22
+ ### Core Intelligence
23
+ - **Trade Outcome Memory** — Record and query trade outcomes with full signal context
24
+ - **Signal Fingerprinting** — RSI, MACD, Trend, and Volatility classification into discrete categories
25
+ - **Wilson Score Confidence** — Statistical confidence intervals with adaptive z-scores based on data volume
26
+ - **Hebbian Synapse Network** — Weighted graph connecting signals, combos, outcomes, pairs, and regimes
27
+ - **Spreading Activation** — Explore related knowledge by activating nodes in the synapse network
28
+ - **Adaptive Calibration** — Learning rate, Wilson z-score, and decay half-life auto-calibrate across 4 stages
29
+
30
+ ### Learning Engine
31
+ - **Pattern Extraction** — Fingerprint grouping with similarity threshold → rules when confidence exceeds gate
32
+ - **Chain Detection** — Identifies 3+ consecutive same-result trades on the same pair
33
+ - **Temporal Decay** — Exponential half-life decay keeps recent trades more relevant
34
+ - **Recalibration** — Auto-recalibrates every 25 trades based on data volume and synapse density
35
+
36
+ ### Research Engine
37
+ - **Trend Detection** — Identifies pairs with consistently improving or declining win rates
38
+ - **Gap Detection** — Finds signal combinations with few data points that need more testing
39
+ - **Synergy Detection** — Discovers which signal pairs frequently co-occur in winning trades
40
+ - **Performance Analysis** — Ranks pairs and strategies by statistical confidence
41
+ - **Regime Shift Detection** — Alerts when a pair's recent performance deviates from its baseline
42
+
43
+ ### Strategy Recommendations
44
+ - **DCA Multiplier** — Brain-recommended multiplier (0.3x–2.5x) based on regime and RSI context
45
+ - **Grid Parameters** — Volatility-aware grid spacing with historical performance adjustment
46
+
47
+ ### Universal Access
48
+ - **MCP Server** — Stdio transport for Claude Code integration
49
+ - **MCP HTTP/SSE** — Standard MCP protocol over HTTP for Cursor, Windsurf, Cline, Continue
50
+ - **REST API** — Full HTTP API on port 7779 with RPC endpoint
51
+
52
+ ## Quick Start
53
+
54
+ ### Installation
55
+
56
+ ```bash
57
+ npm install -g @timmeck/trading-brain
58
+ ```
59
+
60
+ Or from source:
61
+
62
+ ```bash
63
+ git clone https://github.com/timmeck/trading-brain.git
64
+ cd trading-brain
65
+ npm install
66
+ npm run build
67
+ ```
68
+
69
+ ### Setup with Claude Code
70
+
71
+ Add Trading Brain's MCP server to your Claude Code configuration (`~/.claude/settings.json`):
72
+
73
+ ```json
74
+ {
75
+ "mcpServers": {
76
+ "trading-brain": {
77
+ "command": "trading",
78
+ "args": ["mcp-server"]
79
+ }
80
+ }
81
+ }
82
+ ```
83
+
84
+ ### Setup with Cursor / Windsurf / Cline / Continue
85
+
86
+ Trading Brain supports MCP over HTTP with SSE transport:
87
+
88
+ ```json
89
+ {
90
+ "trading-brain": {
91
+ "url": "http://localhost:7780/sse"
92
+ }
93
+ }
94
+ ```
95
+
96
+ Make sure the daemon is running (`trading start`).
97
+
98
+ ### Start the Daemon
99
+
100
+ ```bash
101
+ trading start
102
+ trading status
103
+ trading doctor # verify everything is configured correctly
104
+ ```
105
+
106
+ The daemon runs background tasks: learning cycles, research analysis, synapse decay, and recalibration.
107
+
108
+ ## Architecture
109
+
110
+ ```
111
+ +------------------+ +------------------+ +------------------+
112
+ | Claude Code | | Cursor/Windsurf | | Browser/CI/CD |
113
+ | (MCP stdio) | | (MCP HTTP/SSE) | | (REST API) |
114
+ +--------+---------+ +--------+---------+ +--------+---------+
115
+ | | |
116
+ v v v
117
+ +--------+---------+ +--------+---------+ +--------+---------+
118
+ | MCP Server | | MCP HTTP/SSE | | REST API |
119
+ | (stdio) | | (port 7780) | | (port 7779) |
120
+ +--------+---------+ +--------+---------+ +--------+---------+
121
+ | | |
122
+ +----------+-------------+------------------------+
123
+ |
124
+ v
125
+ +----------+------------+
126
+ | TradingCore |
127
+ | (Daemon / Services) |
128
+ +----------+------------+
129
+ |
130
+ +-------+-------+--------+--------+
131
+ | | | | |
132
+ v v v v v
133
+ +---+--+ +--+---+ +-+-----+ +-+----+ +-+--------+
134
+ |Trade | |Signal| |Synapse | |Strat | |Research |
135
+ |Memory| |Brain | |Network | |Brain | |Engine |
136
+ +---+--+ +--+---+ +-+-----+ +-+----+ +-+--------+
137
+ | | | | |
138
+ v v v v v
139
+ +---+--+ +--+---+ +-+-----+ +-+----+ +-+--------+
140
+ |Learn | |Wilson| |Hebbian | |DCA/ | |Trend/Gap |
141
+ |Engine| |Score | |Learn | |Grid | |Synergy |
142
+ +------+ +------+ +-------+ +------+ +----------+
143
+ |
144
+ v
145
+ +----------+-----------+
146
+ | SQLite (DB) |
147
+ | better-sqlite3 |
148
+ +----------------------+
149
+ ```
150
+
151
+ ### Core Components
152
+
153
+ | Component | Purpose |
154
+ |-----------|---------|
155
+ | **Trade Memory** | Stores trade outcomes with signal fingerprints, pairs, bot types, and results |
156
+ | **Signal Brain** | Computes weighted signal strengths via direct synapses + spreading activation + similar combo boost |
157
+ | **Synapse Network** | Weighted graph connecting signals, combos, outcomes, pairs. Hebbian: "signals that win together wire together" |
158
+ | **Strategy Brain** | DCA multiplier and grid parameter recommendations based on regime and volatility awareness |
159
+ | **Learning Engine** | Pattern extraction, chain detection, temporal decay, adaptive recalibration |
160
+ | **Research Engine** | Automated analysis: trends, gaps, synergies, performance rankings, regime shifts |
161
+ | **Calibrator** | 4-stage adaptive calibration: learningRate, wilsonZ, decayHalfLife based on trade count |
162
+ | **REST API** | HTTP API exposing all Trading Brain methods as RPC endpoints |
163
+ | **MCP HTTP Server** | SSE transport enabling non-Claude MCP clients |
164
+
165
+ ## CLI Commands
166
+
167
+ ```
168
+ trading start Start the Trading Brain daemon
169
+ trading stop Stop the daemon
170
+ trading status Show stats (trades, rules, chains, insights, synapses)
171
+ trading doctor Health check: daemon, DB, IPC, ports
172
+ trading query <text> Search trades by fingerprint, pair, or bot type
173
+ trading insights Show research insights with severity
174
+ trading rules Show learned rules with confidence and win rate
175
+ trading network Explore the synapse network
176
+ trading config View and manage configuration
177
+ trading export Export all data as JSON
178
+ trading import <file> Import trades from JSON array
179
+ ```
180
+
181
+ ## MCP Tools
182
+
183
+ These tools are available to Claude Code (and other MCP clients) when Trading Brain is configured:
184
+
185
+ | Tool | Description |
186
+ |------|-------------|
187
+ | `trading_record_outcome` | Record a trade outcome (main entry point for learning loop) |
188
+ | `trading_signal_weights` | Get Brain-weighted signal strengths for a signal combination |
189
+ | `trading_signal_confidence` | Wilson Score confidence interval for a signal pattern |
190
+ | `trading_dca_multiplier` | Brain-recommended DCA position size multiplier |
191
+ | `trading_grid_params` | Brain-recommended grid trading parameters |
192
+ | `trading_explore` | Spreading Activation network exploration from a query node |
193
+ | `trading_connections` | Find the shortest path between two nodes in the graph |
194
+ | `trading_rules` | Get all learned trading rules |
195
+ | `trading_insights` | Get research insights (trends, gaps, synergies) |
196
+ | `trading_chains` | Get detected winning/losing streaks |
197
+ | `trading_query` | Search trades by fingerprint, pair, or bot type |
198
+ | `trading_status` | Current Trading Brain stats |
199
+ | `trading_calibration` | Current adaptive calibration parameters |
200
+ | `trading_learn` | Manually trigger a learning cycle |
201
+ | `trading_reset` | Reset all data (use with caution) |
202
+
203
+ ## REST API
204
+
205
+ Trading Brain includes a REST API on port 7779 (default).
206
+
207
+ ### Generic RPC Endpoint
208
+
209
+ ```bash
210
+ # Call any Trading Brain method
211
+ curl -X POST http://localhost:7779/api/v1/rpc \
212
+ -H "Content-Type: application/json" \
213
+ -d '{"method": "analytics.summary", "params": {}}'
214
+
215
+ # Batch multiple calls
216
+ curl -X POST http://localhost:7779/api/v1/rpc \
217
+ -H "Content-Type: application/json" \
218
+ -d '[
219
+ {"id": 1, "method": "analytics.summary", "params": {}},
220
+ {"id": 2, "method": "synapse.stats", "params": {}}
221
+ ]'
222
+ ```
223
+
224
+ ### Authentication
225
+
226
+ Set an API key via environment variable:
227
+
228
+ ```bash
229
+ TRADING_BRAIN_API_KEY=your-secret-key trading start
230
+ ```
231
+
232
+ Then include it in requests:
233
+
234
+ ```bash
235
+ curl -H "X-API-Key: your-secret-key" http://localhost:7779/api/v1/rpc \
236
+ -d '{"method": "analytics.summary", "params": {}}'
237
+ ```
238
+
239
+ ## Configuration
240
+
241
+ Trading Brain is configured via `config.json` in the data directory or environment variables:
242
+
243
+ | Env Variable | Default | Description |
244
+ |---|---|---|
245
+ | `TRADING_BRAIN_DATA_DIR` | `~/.trading-brain` | Data directory |
246
+ | `TRADING_BRAIN_LOG_LEVEL` | `info` | Log level |
247
+ | `TRADING_BRAIN_API_PORT` | `7779` | REST API port |
248
+ | `TRADING_BRAIN_API_KEY` | — | API authentication key |
249
+ | `TRADING_BRAIN_MCP_HTTP_PORT` | `7780` | MCP HTTP/SSE port |
250
+ | `TRADING_BRAIN_API_ENABLED` | `true` | Enable REST API |
251
+ | `TRADING_BRAIN_MCP_HTTP_ENABLED` | `true` | Enable MCP HTTP |
252
+
253
+ ## How It Learns
254
+
255
+ 1. **Trade Outcome Recorded** — A bot completes a trade and reports the result via `trading_record_outcome`
256
+ 2. **Signal Fingerprinted** — RSI, MACD, Trend, and Volatility are classified into discrete categories
257
+ 3. **Synapses Form** — Hebbian connections link signal → combo → outcome → pair. Winners strengthen, losers weaken
258
+ 4. **Graph Updated** — Nodes and edges are created/strengthened in the weighted graph
259
+ 5. **Chain Checked** — If 3+ consecutive same-result trades on a pair, a chain is recorded
260
+ 6. **Confidence Computed** — Wilson Score provides statistical lower bound on true win rate
261
+ 7. **Patterns Extracted** — Similar fingerprints are grouped; rules generated when confidence exceeds threshold
262
+ 8. **Calibration Adapts** — Every 25 trades, learning rate, Wilson z, and decay half-life recalibrate
263
+ 9. **Research Runs** — Background analysis finds trends, gaps, synergies, and regime shifts
264
+ 10. **Next Trade** — Signal weights, DCA multiplier, and grid params incorporate all learned knowledge
265
+
266
+ ## Algorithms
267
+
268
+ ### Wilson Score Confidence
269
+ Conservative statistical confidence interval for win rates. Adaptive z-score: starts at 1.0 (few trades) → reaches 1.96 (500+ trades).
270
+
271
+ ### Hebbian Learning
272
+ "Signals that win together wire together." Asymmetric updates:
273
+ - **Strengthen** (win): `weight += (1 - weight) * learningRate` (asymptotic approach to 1.0)
274
+ - **Weaken** (loss): `weight *= penalty` (multiplicative decay)
275
+
276
+ ### Spreading Activation
277
+ BFS-based energy propagation through the weighted graph. Decay factor 0.6, threshold 0.05, max depth 4. Used for signal weight bonuses and network exploration.
278
+
279
+ ### Adaptive Calibration
280
+ 4 stages based on trade count:
281
+ | Stage | Trades | Learning Rate | Wilson Z | Decay Half-Life |
282
+ |-------|--------|--------------|----------|-----------------|
283
+ | 1 | <20 | 0.3 | 1.0 | 60 days |
284
+ | 2 | 20–100 | 0.15 | 1.44 | 45 days |
285
+ | 3 | 100–500 | 0.08 | 1.65 | 30 days |
286
+ | 4 | >500 | 0.05 | 1.96 | 21 days |
287
+
288
+ ### Signal Fingerprinting
289
+ Each signal dimension is classified:
290
+ - **RSI**: oversold (<30), neutral (30–70), overbought (>70)
291
+ - **MACD**: strong_bull (>0.5), bull (>0), bear (<0), strong_bear (<-0.5)
292
+ - **Trend**: strong_up (>0.5), up (>0), down (<0), strong_down (<-0.5)
293
+ - **Volatility**: low (<0.3), medium (0.3–0.7), high (>0.7)
294
+
295
+ ## Tech Stack
296
+
297
+ - **TypeScript** — Full type safety, ES2022 target, ESM modules
298
+ - **better-sqlite3** — Fast, embedded, synchronous database with WAL mode
299
+ - **MCP SDK** — Model Context Protocol integration (stdio + HTTP/SSE transports)
300
+ - **Commander** — CLI framework
301
+ - **Chalk** — Colored terminal output
302
+ - **Winston** — Structured logging
303
+
304
+ ## License
305
+
306
+ [MIT](LICENSE)
@@ -0,0 +1,21 @@
1
+ import type { IpcRouter } from '../ipc/router.js';
2
+ export interface ApiServerOptions {
3
+ port: number;
4
+ router: IpcRouter;
5
+ apiKey?: string;
6
+ }
7
+ export declare class ApiServer {
8
+ private options;
9
+ private server;
10
+ private logger;
11
+ private sseClients;
12
+ private statsTimer;
13
+ constructor(options: ApiServerOptions);
14
+ start(): void;
15
+ stop(): void;
16
+ private handleRequest;
17
+ private json;
18
+ private readBody;
19
+ private setupSSE;
20
+ private broadcastSSE;
21
+ }
@@ -0,0 +1,157 @@
1
+ import http from 'node:http';
2
+ import { getLogger } from '../utils/logger.js';
3
+ import { getEventBus } from '../utils/events.js';
4
+ export class ApiServer {
5
+ options;
6
+ server = null;
7
+ logger = getLogger();
8
+ sseClients = new Set();
9
+ statsTimer = null;
10
+ constructor(options) {
11
+ this.options = options;
12
+ }
13
+ start() {
14
+ const { port, apiKey } = this.options;
15
+ this.server = http.createServer((req, res) => {
16
+ res.setHeader('Access-Control-Allow-Origin', '*');
17
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
18
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-API-Key');
19
+ if (req.method === 'OPTIONS') {
20
+ res.writeHead(204);
21
+ res.end();
22
+ return;
23
+ }
24
+ if (apiKey) {
25
+ const provided = req.headers['x-api-key'] ?? req.headers.authorization?.replace('Bearer ', '');
26
+ if (provided !== apiKey) {
27
+ this.json(res, 401, { error: 'Unauthorized' });
28
+ return;
29
+ }
30
+ }
31
+ this.handleRequest(req, res).catch((err) => {
32
+ this.logger.error('API error:', err);
33
+ this.json(res, 500, { error: err instanceof Error ? err.message : String(err) });
34
+ });
35
+ });
36
+ this.server.listen(port, () => {
37
+ this.logger.info(`REST API server started on http://localhost:${port}`);
38
+ });
39
+ this.setupSSE();
40
+ }
41
+ stop() {
42
+ if (this.statsTimer) {
43
+ clearInterval(this.statsTimer);
44
+ this.statsTimer = null;
45
+ }
46
+ for (const client of this.sseClients) {
47
+ try {
48
+ client.end();
49
+ }
50
+ catch { /* ignore */ }
51
+ }
52
+ this.sseClients.clear();
53
+ this.server?.close();
54
+ this.server = null;
55
+ this.logger.info('REST API server stopped');
56
+ }
57
+ async handleRequest(req, res) {
58
+ const url = new URL(req.url ?? '/', 'http://localhost');
59
+ const pathname = url.pathname;
60
+ const method = req.method ?? 'GET';
61
+ if (pathname === '/api/v1/health') {
62
+ this.json(res, 200, { status: 'ok', timestamp: new Date().toISOString() });
63
+ return;
64
+ }
65
+ if (pathname === '/api/v1/events' && method === 'GET') {
66
+ res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' });
67
+ res.write('data: {"type":"connected"}\n\n');
68
+ this.sseClients.add(res);
69
+ req.on('close', () => this.sseClients.delete(res));
70
+ return;
71
+ }
72
+ if (pathname === '/api/v1/methods' && method === 'GET') {
73
+ const methods = this.options.router.listMethods();
74
+ this.json(res, 200, { methods, rpcEndpoint: '/api/v1/rpc' });
75
+ return;
76
+ }
77
+ if (pathname === '/api/v1/rpc' && method === 'POST') {
78
+ const body = await this.readBody(req);
79
+ if (!body) {
80
+ this.json(res, 400, { error: 'Empty request body' });
81
+ return;
82
+ }
83
+ const parsed = JSON.parse(body);
84
+ if (Array.isArray(parsed)) {
85
+ const results = parsed.map((call) => {
86
+ try {
87
+ const result = this.options.router.handle(call.method, call.params ?? {});
88
+ return { id: call.id, result };
89
+ }
90
+ catch (err) {
91
+ return { id: call.id, error: err instanceof Error ? err.message : String(err) };
92
+ }
93
+ });
94
+ this.json(res, 200, results);
95
+ return;
96
+ }
97
+ if (!parsed.method) {
98
+ this.json(res, 400, { error: 'Missing "method" field' });
99
+ return;
100
+ }
101
+ try {
102
+ const result = this.options.router.handle(parsed.method, parsed.params ?? {});
103
+ this.json(res, 200, { result });
104
+ }
105
+ catch (err) {
106
+ this.json(res, 400, { error: err instanceof Error ? err.message : String(err) });
107
+ }
108
+ return;
109
+ }
110
+ this.json(res, 404, { error: `No route for ${method} ${pathname}` });
111
+ }
112
+ json(res, status, data) {
113
+ res.writeHead(status, { 'Content-Type': 'application/json' });
114
+ res.end(JSON.stringify(data));
115
+ }
116
+ readBody(req) {
117
+ return new Promise((resolve, reject) => {
118
+ const chunks = [];
119
+ req.on('data', (chunk) => chunks.push(chunk));
120
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
121
+ req.on('error', reject);
122
+ });
123
+ }
124
+ setupSSE() {
125
+ const bus = getEventBus();
126
+ const eventNames = [
127
+ 'trade:recorded', 'synapse:updated', 'rule:learned',
128
+ 'chain:detected', 'insight:created', 'calibration:updated',
129
+ ];
130
+ for (const eventName of eventNames) {
131
+ bus.on(eventName, (data) => {
132
+ this.broadcastSSE({ type: 'event', event: eventName, data });
133
+ });
134
+ }
135
+ this.statsTimer = setInterval(() => {
136
+ if (this.sseClients.size > 0) {
137
+ try {
138
+ const summary = this.options.router.handle('analytics.summary', {});
139
+ this.broadcastSSE({ type: 'stats_update', stats: summary });
140
+ }
141
+ catch { /* ignore */ }
142
+ }
143
+ }, 30_000);
144
+ }
145
+ broadcastSSE(data) {
146
+ const msg = `data: ${JSON.stringify(data)}\n\n`;
147
+ for (const client of this.sseClients) {
148
+ try {
149
+ client.write(msg);
150
+ }
151
+ catch {
152
+ this.sseClients.delete(client);
153
+ }
154
+ }
155
+ }
156
+ }
157
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare const c: {
2
+ blue: import("chalk").ChalkInstance;
3
+ purple: import("chalk").ChalkInstance;
4
+ cyan: import("chalk").ChalkInstance;
5
+ green: import("chalk").ChalkInstance;
6
+ red: import("chalk").ChalkInstance;
7
+ orange: import("chalk").ChalkInstance;
8
+ dim: import("chalk").ChalkInstance;
9
+ dimmer: import("chalk").ChalkInstance;
10
+ label: import("chalk").ChalkInstance;
11
+ value: import("chalk").ChalkInstance;
12
+ heading: import("chalk").ChalkInstance;
13
+ success: import("chalk").ChalkInstance;
14
+ error: import("chalk").ChalkInstance;
15
+ warn: import("chalk").ChalkInstance;
16
+ info: import("chalk").ChalkInstance;
17
+ };
18
+ export declare const icons: {
19
+ brain: string;
20
+ chart: string;
21
+ check: string;
22
+ cross: string;
23
+ arrow: string;
24
+ dot: string;
25
+ bar: string;
26
+ barLight: string;
27
+ dash: string;
28
+ pipe: string;
29
+ star: string;
30
+ bolt: string;
31
+ search: string;
32
+ gear: string;
33
+ synapse: string;
34
+ insight: string;
35
+ warn: string;
36
+ error: string;
37
+ ok: string;
38
+ clock: string;
39
+ trade: string;
40
+ rule: string;
41
+ chain: string;
42
+ };
43
+ export declare function header(title: string, icon?: string): string;
44
+ export declare function keyValue(key: string, value: string | number, indent?: number): string;
45
+ export declare function divider(width?: number): string;
46
+ export declare function table(rows: string[][], colWidths?: number[]): string;
@@ -0,0 +1,70 @@
1
+ import chalk from 'chalk';
2
+ export const c = {
3
+ blue: chalk.hex('#5b9cff'),
4
+ purple: chalk.hex('#b47aff'),
5
+ cyan: chalk.hex('#47e5ff'),
6
+ green: chalk.hex('#3dffa0'),
7
+ red: chalk.hex('#ff5577'),
8
+ orange: chalk.hex('#ffb347'),
9
+ dim: chalk.hex('#8b8fb0'),
10
+ dimmer: chalk.hex('#4a4d6e'),
11
+ label: chalk.hex('#8b8fb0'),
12
+ value: chalk.white.bold,
13
+ heading: chalk.hex('#5b9cff').bold,
14
+ success: chalk.hex('#3dffa0').bold,
15
+ error: chalk.hex('#ff5577').bold,
16
+ warn: chalk.hex('#ffb347').bold,
17
+ info: chalk.hex('#47e5ff'),
18
+ };
19
+ export const icons = {
20
+ brain: '🧠',
21
+ chart: '📊',
22
+ check: '✓',
23
+ cross: '✗',
24
+ arrow: '→',
25
+ dot: '●',
26
+ bar: '█',
27
+ barLight: '░',
28
+ dash: '─',
29
+ pipe: '│',
30
+ star: '★',
31
+ bolt: '⚡',
32
+ search: '🔍',
33
+ gear: '⚙',
34
+ synapse: '🔗',
35
+ insight: '💡',
36
+ warn: '⚠',
37
+ error: '❌',
38
+ ok: '✅',
39
+ clock: '⏱',
40
+ trade: '💹',
41
+ rule: '📋',
42
+ chain: '⛓',
43
+ };
44
+ export function header(title, icon) {
45
+ const prefix = icon ? `${icon} ` : '';
46
+ const line = c.dimmer(icons.dash.repeat(40));
47
+ return `\n${line}\n${prefix}${c.heading(title)}\n${line}`;
48
+ }
49
+ export function keyValue(key, value, indent = 2) {
50
+ const pad = ' '.repeat(indent);
51
+ return `${pad}${c.label(key + ':')} ${c.value(String(value))}`;
52
+ }
53
+ export function divider(width = 40) {
54
+ return c.dimmer(icons.dash.repeat(width));
55
+ }
56
+ function stripAnsi(str) {
57
+ // eslint-disable-next-line no-control-regex
58
+ return str.replace(/\x1b\[[0-9;]*m/g, '');
59
+ }
60
+ export function table(rows, colWidths) {
61
+ if (rows.length === 0)
62
+ return '';
63
+ const widths = colWidths ?? rows[0].map((_, i) => Math.max(...rows.map(r => stripAnsi(r[i] ?? '').length)));
64
+ return rows.map(row => row.map((cell, i) => {
65
+ const stripped = stripAnsi(cell);
66
+ const pad = Math.max(0, (widths[i] ?? stripped.length) - stripped.length);
67
+ return cell + ' '.repeat(pad);
68
+ }).join(' ')).join('\n');
69
+ }
70
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/cli/colors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function configCommand(): Command;