tradeblocks-mcp 3.0.2 → 3.3.1
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.
- package/README.md +85 -80
- package/dist/{chunk-LDKTV7GW.js → chunk-27S67XW3.js} +24 -52
- package/dist/chunk-27S67XW3.js.map +1 -0
- package/dist/{chunk-FGZH632F.js → chunk-2E63THNI.js} +13 -11
- package/dist/chunk-2E63THNI.js.map +1 -0
- package/dist/{chunk-QTTR7AAW.js → chunk-2I3S2ZLT.js} +325 -84
- package/dist/chunk-2I3S2ZLT.js.map +1 -0
- package/dist/{chunk-4BLCXNQ6.js → chunk-4HZLVUOZ.js} +179 -183
- package/dist/chunk-4HZLVUOZ.js.map +1 -0
- package/dist/{chunk-XXYOUIZY.js → chunk-NWNSKALN.js} +63 -80
- package/dist/chunk-NWNSKALN.js.map +1 -0
- package/dist/{chunk-PRAYH3RT.js → chunk-WNTYA7ER.js} +29 -12
- package/dist/chunk-WNTYA7ER.js.map +1 -0
- package/dist/{chunk-BKQ4PM4Y.js → chunk-YZA4RS76.js} +24 -18
- package/dist/chunk-YZA4RS76.js.map +1 -0
- package/dist/{chunk-W2PP3LEH.js → chunk-ZTJXC3LS.js} +17 -8
- package/dist/chunk-ZTJXC3LS.js.map +1 -0
- package/dist/daily-log-processor-MZW2XBZY.js +9 -0
- package/dist/{daily-logs-store-D3QC2XPV.js → daily-logs-store-3C3OTGPK.js} +2 -2
- package/dist/iv-solver-worker.js +9 -1
- package/dist/market-provider-6U33TQUT.js +16 -0
- package/dist/{proto-3HZTCWK4.js → proto-V23GIZG2.js} +2 -2
- package/dist/{sync-PO4IPCYV.js → sync-3UBC37VW.js} +7 -7
- package/dist/test-exports.js +876 -483
- package/dist/test-exports.js.map +1 -1
- package/dist/trade-processor-DKDCWGKD.js +9 -0
- package/dist/{trades-store-LOL3FQSF.js → trades-store-R3NL25T2.js} +2 -2
- package/package.json +2 -6
- package/server/{chunk-CSDVJPBB.js → chunk-536NSFED.js} +29 -12
- package/server/chunk-536NSFED.js.map +1 -0
- package/server/{chunk-WA5AAPCH.js → chunk-A3UKD64A.js} +17 -8
- package/server/chunk-A3UKD64A.js.map +1 -0
- package/server/{chunk-PNKG7RY7.js → chunk-OMUDNJBJ.js} +63 -80
- package/server/chunk-OMUDNJBJ.js.map +1 -0
- package/server/{chunk-72GKJE2U.js → chunk-RJDJHZ5Y.js} +934 -335
- package/server/chunk-RJDJHZ5Y.js.map +1 -0
- package/server/{chunk-NZO6PT64.js → chunk-RM4B2VKS.js} +167 -177
- package/server/chunk-RM4B2VKS.js.map +1 -0
- package/server/{chunk-5EBXHT6C.js → chunk-SY6GDNVI.js} +24 -18
- package/server/chunk-SY6GDNVI.js.map +1 -0
- package/server/{chunk-FBNDMCT5.js → chunk-T66KH2XH.js} +13 -11
- package/server/chunk-T66KH2XH.js.map +1 -0
- package/server/{chunk-NRFXAJF7.js → chunk-W5E7FHC4.js} +24 -52
- package/server/chunk-W5E7FHC4.js.map +1 -0
- package/server/{config-6IZXEFEX.js → config-DK7KOMNL.js} +1 -1
- package/server/config-DK7KOMNL.js.map +1 -0
- package/server/daily-log-processor-B2VPU2FQ.js +10 -0
- package/server/{daily-logs-store-NU7M4L5C.js → daily-logs-store-YFNXTB7J.js} +2 -2
- package/server/http-server.js +2 -5
- package/server/index.js +2497 -2029
- package/server/index.js.map +1 -1
- package/server/iv-solver-worker.js +9 -1
- package/server/market-provider-L56RFHAC.js +17 -0
- package/server/{proto-DWRZJO4E.js → proto-YZ4TLX2N.js} +2 -2
- package/server/{sync-QFI5L7S7.js → sync-CENKDN53.js} +7 -7
- package/server/trade-processor-3PI4LHZI.js +10 -0
- package/server/{trades-store-VY26MWER.js → trades-store-RTTEYMXH.js} +2 -2
- package/src/auth/clients-store.ts +4 -4
- package/src/auth/code-store.ts +1 -1
- package/src/auth/config.ts +11 -12
- package/src/auth/login-page.ts +8 -10
- package/src/auth/provider.ts +35 -30
- package/src/auth/token.ts +17 -15
- package/src/db/backtest-schemas.ts +38 -8
- package/src/db/connection.ts +107 -40
- package/src/db/data-root.ts +22 -0
- package/src/db/index.ts +37 -5
- package/src/db/json-adapters.ts +22 -31
- package/src/db/json-migration.ts +11 -15
- package/src/db/json-store.ts +5 -3
- package/src/db/market-datasets.ts +48 -15
- package/src/db/market-schemas.ts +11 -5
- package/src/db/market-views.ts +119 -32
- package/src/db/parquet-writer.ts +7 -7
- package/src/db/profile-schemas.ts +39 -22
- package/src/db/schemas.ts +2 -2
- package/src/http-server.ts +7 -12
- package/src/index.ts +8 -9
- package/src/market/ingestor/index.ts +1 -4
- package/src/market/ingestor/market-ingestor.ts +140 -67
- package/src/market/ingestor/types.ts +1 -3
- package/src/market/stores/chain-sql.ts +2 -8
- package/src/market/stores/chain-store.ts +1 -4
- package/src/market/stores/duckdb-chain-store.ts +3 -14
- package/src/market/stores/duckdb-enriched-store.ts +3 -13
- package/src/market/stores/duckdb-quote-store.ts +10 -27
- package/src/market/stores/duckdb-spot-store.ts +4 -20
- package/src/market/stores/enriched-sql.ts +3 -9
- package/src/market/stores/enriched-store.ts +2 -2
- package/src/market/stores/parquet-chain-store.ts +5 -22
- package/src/market/stores/parquet-enriched-store.ts +4 -16
- package/src/market/stores/parquet-oi-daily-store.ts +3 -14
- package/src/market/stores/parquet-quote-store.ts +9 -29
- package/src/market/stores/parquet-spot-store.ts +14 -33
- package/src/market/stores/quote-store.ts +2 -10
- package/src/market/stores/spot-sql.ts +3 -15
- package/src/market/stores/spot-store.ts +1 -1
- package/src/market/tickers/defaults.json +6 -6
- package/src/market/tickers/loader.ts +2 -7
- package/src/market/tickers/registry.ts +5 -15
- package/src/market/tickers/schemas.ts +2 -6
- package/src/models/strategy-profile.ts +39 -39
- package/src/sync/block-sync.ts +44 -65
- package/src/sync/index.ts +1 -4
- package/src/sync/metadata.ts +14 -20
- package/src/test-exports.ts +139 -123
- package/src/tools/analysis.ts +180 -159
- package/src/tools/batch-exit-analysis.ts +100 -59
- package/src/tools/blocks/analysis.ts +116 -101
- package/src/tools/blocks/comparison.ts +281 -364
- package/src/tools/blocks/core.ts +208 -253
- package/src/tools/blocks/health.ts +571 -563
- package/src/tools/blocks/index.ts +2 -0
- package/src/tools/blocks/paired-comparison.ts +425 -0
- package/src/tools/blocks/similarity.ts +316 -283
- package/src/tools/edge-decay.ts +124 -197
- package/src/tools/exit-analysis.ts +130 -77
- package/src/tools/greeks-attribution.ts +84 -35
- package/src/tools/guides.ts +4 -6
- package/src/tools/imports.ts +11 -14
- package/src/tools/market-data.ts +1067 -757
- package/src/tools/market-enrichment.ts +3 -3
- package/src/tools/market-fetch.ts +148 -67
- package/src/tools/market-imports.ts +12 -12
- package/src/tools/middleware/sync-middleware.ts +5 -6
- package/src/tools/performance.ts +185 -302
- package/src/tools/profile-analysis.ts +52 -66
- package/src/tools/profiles.ts +106 -69
- package/src/tools/regime-advisor.ts +20 -45
- package/src/tools/replay.ts +81 -77
- package/src/tools/reports/discrepancies.ts +298 -328
- package/src/tools/reports/fields.ts +7 -25
- package/src/tools/reports/helpers.ts +18 -49
- package/src/tools/reports/predictive.ts +27 -70
- package/src/tools/reports/slippage-trends.ts +315 -345
- package/src/tools/reports/slippage.ts +1 -4
- package/src/tools/reports/strategy-matches.ts +399 -441
- package/src/tools/schema.ts +43 -40
- package/src/tools/shared/filters.ts +3 -9
- package/src/tools/snapshot.ts +9 -30
- package/src/tools/sql.ts +15 -14
- package/src/tools/tickers.ts +1 -4
- package/src/utils/batch-exit-analysis.ts +31 -42
- package/src/utils/black-scholes.ts +39 -29
- package/src/utils/block-loader.ts +69 -83
- package/src/utils/calibration-probe.ts +3 -4
- package/src/utils/chain-loader.ts +3 -3
- package/src/utils/csv-discovery.ts +16 -22
- package/src/utils/data-quality.ts +24 -36
- package/src/utils/exit-triggers.ts +91 -96
- package/src/utils/field-timing.ts +94 -79
- package/src/utils/filter-predicates.ts +13 -9
- package/src/utils/flatfile-importer.ts +94 -64
- package/src/utils/greeks-decomposition.ts +152 -100
- package/src/utils/iv-solver-pool.ts +55 -25
- package/src/utils/iv-solver-worker.ts +5 -5
- package/src/utils/market-enricher.ts +528 -497
- package/src/utils/market-importer.ts +31 -12
- package/src/utils/market-provider.ts +21 -23
- package/src/utils/massive-tier.ts +5 -7
- package/src/utils/migrate-option-data-helpers.ts +2 -8
- package/src/utils/option-quote-greeks.ts +25 -31
- package/src/utils/option-time.ts +4 -8
- package/src/utils/output-formatter.ts +1 -4
- package/src/utils/provider-capabilities.ts +1 -4
- package/src/utils/providers/massive.ts +59 -93
- package/src/utils/providers/thetadata/backfill.ts +14 -23
- package/src/utils/providers/thetadata/client.ts +12 -8
- package/src/utils/providers/thetadata/decode.ts +2 -20
- package/src/utils/providers/thetadata/endpoints.ts +32 -40
- package/src/utils/providers/thetadata/join.ts +11 -10
- package/src/utils/providers/thetadata/proto.ts +12 -10
- package/src/utils/providers/thetadata/quote-mid-greeks.ts +5 -5
- package/src/utils/providers/thetadata.ts +11 -10
- package/src/utils/quote-enricher.ts +4 -4
- package/src/utils/quote-parquet-projection.ts +3 -11
- package/src/utils/sample-date-selector.ts +3 -5
- package/src/utils/schema-metadata.ts +102 -70
- package/src/utils/ticker.ts +5 -9
- package/src/utils/trade-replay.ts +77 -68
- package/dist/chunk-4BLCXNQ6.js.map +0 -1
- package/dist/chunk-BKQ4PM4Y.js.map +0 -1
- package/dist/chunk-FGZH632F.js.map +0 -1
- package/dist/chunk-LDKTV7GW.js.map +0 -1
- package/dist/chunk-PRAYH3RT.js.map +0 -1
- package/dist/chunk-QTTR7AAW.js.map +0 -1
- package/dist/chunk-W2PP3LEH.js.map +0 -1
- package/dist/chunk-XXYOUIZY.js.map +0 -1
- package/dist/daily-log-processor-6MWJ23JK.js +0 -9
- package/dist/market-provider-VDRJUEF2.js +0 -16
- package/dist/trade-processor-NHU4VWRX.js +0 -9
- package/manifest.json +0 -141
- package/server/chunk-5EBXHT6C.js.map +0 -1
- package/server/chunk-72GKJE2U.js.map +0 -1
- package/server/chunk-CSDVJPBB.js.map +0 -1
- package/server/chunk-FBNDMCT5.js.map +0 -1
- package/server/chunk-NRFXAJF7.js.map +0 -1
- package/server/chunk-NZO6PT64.js.map +0 -1
- package/server/chunk-PNKG7RY7.js.map +0 -1
- package/server/chunk-WA5AAPCH.js.map +0 -1
- package/server/config-6IZXEFEX.js.map +0 -1
- package/server/daily-log-processor-Y3PVSVBM.js +0 -10
- package/server/market-provider-VOYYVYWT.js +0 -17
- package/server/trade-processor-JWVS37KM.js +0 -10
- /package/dist/{daily-log-processor-6MWJ23JK.js.map → daily-log-processor-MZW2XBZY.js.map} +0 -0
- /package/dist/{daily-logs-store-D3QC2XPV.js.map → daily-logs-store-3C3OTGPK.js.map} +0 -0
- /package/dist/{market-provider-VDRJUEF2.js.map → market-provider-6U33TQUT.js.map} +0 -0
- /package/dist/{proto-3HZTCWK4.js.map → proto-V23GIZG2.js.map} +0 -0
- /package/dist/{sync-PO4IPCYV.js.map → sync-3UBC37VW.js.map} +0 -0
- /package/dist/{trade-processor-NHU4VWRX.js.map → trade-processor-DKDCWGKD.js.map} +0 -0
- /package/dist/{trades-store-LOL3FQSF.js.map → trades-store-R3NL25T2.js.map} +0 -0
- /package/server/{daily-log-processor-Y3PVSVBM.js.map → daily-log-processor-B2VPU2FQ.js.map} +0 -0
- /package/server/{daily-logs-store-NU7M4L5C.js.map → daily-logs-store-YFNXTB7J.js.map} +0 -0
- /package/server/{market-provider-VOYYVYWT.js.map → market-provider-L56RFHAC.js.map} +0 -0
- /package/server/{proto-DWRZJO4E.js.map → proto-YZ4TLX2N.js.map} +0 -0
- /package/server/{sync-QFI5L7S7.js.map → sync-CENKDN53.js.map} +0 -0
- /package/server/{trade-processor-JWVS37KM.js.map → trade-processor-3PI4LHZI.js.map} +0 -0
- /package/server/{trades-store-VY26MWER.js.map → trades-store-RTTEYMXH.js.map} +0 -0
|
@@ -59,34 +59,55 @@ async function mapWithLimit<T, R>(
|
|
|
59
59
|
// ---------------------------------------------------------------------------
|
|
60
60
|
|
|
61
61
|
const triggerTypeEnum = z.enum([
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
"profitTarget",
|
|
63
|
+
"stopLoss",
|
|
64
|
+
"trailingStop",
|
|
65
|
+
"profitAction",
|
|
66
|
+
"dteExit",
|
|
67
|
+
"ditExit",
|
|
68
|
+
"clockTimeExit",
|
|
69
|
+
"underlyingPriceMove",
|
|
70
|
+
"positionDelta",
|
|
71
|
+
"perLegDelta",
|
|
72
|
+
"vixMove",
|
|
73
|
+
"vix9dMove",
|
|
74
|
+
"vix9dVixRatio",
|
|
75
|
+
"slRatioThreshold",
|
|
76
|
+
"slRatioMove",
|
|
67
77
|
]);
|
|
68
78
|
|
|
69
79
|
const triggerConfigSchema = z.object({
|
|
70
80
|
type: triggerTypeEnum,
|
|
71
81
|
threshold: z.number(),
|
|
72
|
-
unit: z.enum([
|
|
82
|
+
unit: z.enum(["percent", "dollar"]).default("dollar").optional(),
|
|
73
83
|
expiry: z.string().optional(),
|
|
74
84
|
openDate: z.string().optional(),
|
|
75
85
|
clockTime: z.string().optional(),
|
|
76
86
|
trailAmount: z.number().optional(),
|
|
77
|
-
steps: z
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
steps: z
|
|
88
|
+
.array(
|
|
89
|
+
z.object({
|
|
90
|
+
armAt: z.number(),
|
|
91
|
+
stopAt: z.number(),
|
|
92
|
+
closeAllocationPct: z
|
|
93
|
+
.number()
|
|
94
|
+
.min(0)
|
|
95
|
+
.max(1)
|
|
96
|
+
.optional()
|
|
97
|
+
.describe("Fraction of REMAINING position to close at this milestone (0-1)"),
|
|
98
|
+
}),
|
|
99
|
+
)
|
|
100
|
+
.optional(),
|
|
83
101
|
spreadWidth: z.number().optional(),
|
|
84
102
|
contracts: z.number().optional(),
|
|
85
|
-
legIndex: z
|
|
103
|
+
legIndex: z
|
|
104
|
+
.number()
|
|
105
|
+
.optional()
|
|
86
106
|
.describe("0-based leg index for perLegDelta — targets specific leg"),
|
|
87
|
-
exitAbove: z.number().optional()
|
|
88
|
-
|
|
89
|
-
|
|
107
|
+
exitAbove: z.number().optional().describe("Fire when value exceeds this (directional, no abs)"),
|
|
108
|
+
exitBelow: z
|
|
109
|
+
.number()
|
|
110
|
+
.optional()
|
|
90
111
|
.describe("Fire when value drops below this (directional, no abs)"),
|
|
91
112
|
});
|
|
92
113
|
|
|
@@ -97,40 +118,60 @@ const triggerConfigSchema = z.object({
|
|
|
97
118
|
export const batchExitAnalysisSchema = z.object({
|
|
98
119
|
block_id: z.string().describe("Block ID to analyze trades from"),
|
|
99
120
|
|
|
100
|
-
strategy: z
|
|
121
|
+
strategy: z
|
|
122
|
+
.string()
|
|
123
|
+
.optional()
|
|
101
124
|
.describe("Filter trades by strategy name (case-insensitive ILIKE)"),
|
|
102
125
|
|
|
103
|
-
date_range: z
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
126
|
+
date_range: z
|
|
127
|
+
.object({
|
|
128
|
+
from: z.string().optional().describe("Start date YYYY-MM-DD"),
|
|
129
|
+
to: z.string().optional().describe("End date YYYY-MM-DD"),
|
|
130
|
+
})
|
|
131
|
+
.optional()
|
|
132
|
+
.describe("Filter trades by date range"),
|
|
107
133
|
|
|
108
|
-
candidate_policy: z
|
|
134
|
+
candidate_policy: z
|
|
135
|
+
.array(triggerConfigSchema)
|
|
109
136
|
.describe("Candidate exit policy triggers to evaluate -- same schema as analyze_exit_triggers"),
|
|
110
137
|
|
|
111
|
-
leg_groups: z
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
138
|
+
leg_groups: z
|
|
139
|
+
.array(
|
|
140
|
+
z.object({
|
|
141
|
+
label: z.string(),
|
|
142
|
+
leg_indices: z.array(z.number()),
|
|
143
|
+
triggers: z.array(triggerConfigSchema),
|
|
144
|
+
}),
|
|
145
|
+
)
|
|
146
|
+
.optional()
|
|
147
|
+
.describe("Per-leg-group exit triggers for multi-structure strategies"),
|
|
148
|
+
|
|
149
|
+
baseline_mode: z
|
|
150
|
+
.enum(["actual", "holdToEnd"])
|
|
151
|
+
.default("actual")
|
|
152
|
+
.describe(
|
|
153
|
+
"'actual' compares candidate vs trade's actual P&L; 'holdToEnd' compares vs last replay timestamp",
|
|
154
|
+
),
|
|
155
|
+
|
|
156
|
+
limit: z
|
|
157
|
+
.number()
|
|
158
|
+
.min(1)
|
|
159
|
+
.max(200)
|
|
160
|
+
.default(50)
|
|
121
161
|
.describe("Max trades to analyze. Most recent trades selected"),
|
|
122
162
|
|
|
123
|
-
min_pl: z.number().optional()
|
|
124
|
-
.describe("Only include trades with actual P&L >= this value"),
|
|
163
|
+
min_pl: z.number().optional().describe("Only include trades with actual P&L >= this value"),
|
|
125
164
|
|
|
126
|
-
max_pl: z.number().optional()
|
|
127
|
-
.describe("Only include trades with actual P&L <= this value"),
|
|
165
|
+
max_pl: z.number().optional().describe("Only include trades with actual P&L <= this value"),
|
|
128
166
|
|
|
129
|
-
multiplier: z.number().default(100)
|
|
130
|
-
.describe("Contract multiplier (default 100)"),
|
|
167
|
+
multiplier: z.number().default(100).describe("Contract multiplier (default 100)"),
|
|
131
168
|
|
|
132
|
-
format: z
|
|
133
|
-
.
|
|
169
|
+
format: z
|
|
170
|
+
.enum(["summary", "full"])
|
|
171
|
+
.default("summary")
|
|
172
|
+
.describe(
|
|
173
|
+
"'summary' returns aggregate stats + trigger attribution; 'full' adds per-trade breakdown",
|
|
174
|
+
),
|
|
134
175
|
});
|
|
135
176
|
|
|
136
177
|
// ---------------------------------------------------------------------------
|
|
@@ -140,7 +181,7 @@ export const batchExitAnalysisSchema = z.object({
|
|
|
140
181
|
export async function handleBatchExitAnalysis(
|
|
141
182
|
params: z.infer<typeof batchExitAnalysisSchema>,
|
|
142
183
|
baseDir: string,
|
|
143
|
-
stores: MarketStores,
|
|
184
|
+
stores: MarketStores, // Phase 4 CONSUMER-01 — threaded through for Wave 2+ rewrite.
|
|
144
185
|
injectedConn?: import("@duckdb/node-api").DuckDBConnection,
|
|
145
186
|
): Promise<BatchExitResult> {
|
|
146
187
|
const {
|
|
@@ -158,7 +199,7 @@ export async function handleBatchExitAnalysis(
|
|
|
158
199
|
} = params;
|
|
159
200
|
|
|
160
201
|
// 1. Query trades from DuckDB with deterministic ROW_NUMBER ordering
|
|
161
|
-
const conn = injectedConn ?? await getConnection(baseDir);
|
|
202
|
+
const conn = injectedConn ?? (await getConnection(baseDir));
|
|
162
203
|
const escapedBlockId = block_id.replace(/'/g, "''");
|
|
163
204
|
|
|
164
205
|
// Build WHERE clauses
|
|
@@ -193,7 +234,7 @@ export async function handleBatchExitAnalysis(
|
|
|
193
234
|
)
|
|
194
235
|
SELECT trade_idx, pl, date_opened
|
|
195
236
|
FROM numbered
|
|
196
|
-
${filterClauses.length > 0 ?
|
|
237
|
+
${filterClauses.length > 0 ? "WHERE " + filterClauses.join(" AND ") : ""}
|
|
197
238
|
ORDER BY date_opened DESC
|
|
198
239
|
LIMIT ${limit}
|
|
199
240
|
`;
|
|
@@ -226,7 +267,7 @@ export async function handleBatchExitAnalysis(
|
|
|
226
267
|
triggerAttribution: [],
|
|
227
268
|
perTrade: [],
|
|
228
269
|
baselineMode: baseline_mode,
|
|
229
|
-
summary:
|
|
270
|
+
summary: "Analyzed 0 trades: no matching trades found.",
|
|
230
271
|
};
|
|
231
272
|
return emptyResult;
|
|
232
273
|
}
|
|
@@ -244,7 +285,7 @@ export async function handleBatchExitAnalysis(
|
|
|
244
285
|
async (row): Promise<ReplayOutcome> => {
|
|
245
286
|
const tradeIdx = Number(row[0] ?? 0);
|
|
246
287
|
const pl = Number(row[1] ?? 0);
|
|
247
|
-
const dateOpened = String(row[2] ??
|
|
288
|
+
const dateOpened = String(row[2] ?? "");
|
|
248
289
|
|
|
249
290
|
try {
|
|
250
291
|
// Always pass format:'full' to get complete pnlPath for analyzeBatch.
|
|
@@ -254,8 +295,8 @@ export async function handleBatchExitAnalysis(
|
|
|
254
295
|
block_id,
|
|
255
296
|
trade_index: tradeIdx,
|
|
256
297
|
multiplier,
|
|
257
|
-
format:
|
|
258
|
-
close_at:
|
|
298
|
+
format: "full",
|
|
299
|
+
close_at: "trade",
|
|
259
300
|
skip_quotes: false,
|
|
260
301
|
},
|
|
261
302
|
baseDir,
|
|
@@ -283,7 +324,7 @@ export async function handleBatchExitAnalysis(
|
|
|
283
324
|
return {
|
|
284
325
|
ok: false,
|
|
285
326
|
tradeIndex: Number(row[0] ?? 0),
|
|
286
|
-
dateOpened: String(row[2] ??
|
|
327
|
+
dateOpened: String(row[2] ?? ""),
|
|
287
328
|
error: err instanceof Error ? err.message : String(err),
|
|
288
329
|
};
|
|
289
330
|
}
|
|
@@ -308,7 +349,7 @@ export async function handleBatchExitAnalysis(
|
|
|
308
349
|
// 3. Build BatchExitConfig
|
|
309
350
|
const config: BatchExitConfig = {
|
|
310
351
|
candidatePolicy: candidate_policy as ExitTriggerConfig[],
|
|
311
|
-
legGroups: leg_groups?.map(g => ({
|
|
352
|
+
legGroups: leg_groups?.map((g) => ({
|
|
312
353
|
label: g.label,
|
|
313
354
|
legIndices: g.leg_indices,
|
|
314
355
|
triggers: g.triggers as ExitTriggerConfig[],
|
|
@@ -332,14 +373,12 @@ export async function handleBatchExitAnalysis(
|
|
|
332
373
|
// 6. Load profile context if strategy is specified (per D-16)
|
|
333
374
|
if (strategy) {
|
|
334
375
|
try {
|
|
335
|
-
const profileConn = injectedConn ?? await getConnection(baseDir);
|
|
376
|
+
const profileConn = injectedConn ?? (await getConnection(baseDir));
|
|
336
377
|
const profile = await getProfile(profileConn, block_id, strategy, baseDir);
|
|
337
378
|
if (profile) {
|
|
338
379
|
result.profileContext = {
|
|
339
380
|
structureType: profile.structureType,
|
|
340
|
-
exitRules: profile.exitRules.map(r =>
|
|
341
|
-
r.description ?? `${r.type} ${r.trigger}`
|
|
342
|
-
),
|
|
381
|
+
exitRules: profile.exitRules.map((r) => r.description ?? `${r.type} ${r.trigger}`),
|
|
343
382
|
};
|
|
344
383
|
}
|
|
345
384
|
} catch {
|
|
@@ -357,7 +396,7 @@ export async function handleBatchExitAnalysis(
|
|
|
357
396
|
export function registerBatchExitAnalysisTools(
|
|
358
397
|
server: McpServer,
|
|
359
398
|
baseDir: string,
|
|
360
|
-
stores: MarketStores,
|
|
399
|
+
stores: MarketStores, // Phase 4 CONSUMER-01 — threaded through for Wave 2+ rewrite.
|
|
361
400
|
): void {
|
|
362
401
|
server.registerTool(
|
|
363
402
|
"batch_exit_analysis",
|
|
@@ -378,13 +417,15 @@ export function registerBatchExitAnalysisTools(
|
|
|
378
417
|
return createToolOutput(result.summary, result);
|
|
379
418
|
} catch (error) {
|
|
380
419
|
return {
|
|
381
|
-
content: [
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
420
|
+
content: [
|
|
421
|
+
{
|
|
422
|
+
type: "text" as const,
|
|
423
|
+
text: `Error in batch exit analysis: ${(error as Error).message}`,
|
|
424
|
+
},
|
|
425
|
+
],
|
|
385
426
|
isError: true,
|
|
386
427
|
};
|
|
387
428
|
}
|
|
388
|
-
}
|
|
429
|
+
},
|
|
389
430
|
);
|
|
390
431
|
}
|