polymarket-trader-mcp 1.0.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/.env.example +20 -0
- package/README.md +158 -0
- package/dist/db/queries.d.ts +93 -0
- package/dist/db/queries.d.ts.map +1 -0
- package/dist/db/queries.js +161 -0
- package/dist/db/queries.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +88 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +124 -0
- package/dist/index.js.map +1 -0
- package/dist/services/backtester.d.ts +30 -0
- package/dist/services/backtester.d.ts.map +1 -0
- package/dist/services/backtester.js +96 -0
- package/dist/services/backtester.js.map +1 -0
- package/dist/services/budget-manager.d.ts +16 -0
- package/dist/services/budget-manager.d.ts.map +1 -0
- package/dist/services/budget-manager.js +42 -0
- package/dist/services/budget-manager.js.map +1 -0
- package/dist/services/conviction-scorer.d.ts +14 -0
- package/dist/services/conviction-scorer.d.ts.map +1 -0
- package/dist/services/conviction-scorer.js +88 -0
- package/dist/services/conviction-scorer.js.map +1 -0
- package/dist/services/leaderboard.d.ts +28 -0
- package/dist/services/leaderboard.d.ts.map +1 -0
- package/dist/services/leaderboard.js +45 -0
- package/dist/services/leaderboard.js.map +1 -0
- package/dist/services/market-filter.d.ts +19 -0
- package/dist/services/market-filter.d.ts.map +1 -0
- package/dist/services/market-filter.js +50 -0
- package/dist/services/market-filter.js.map +1 -0
- package/dist/services/market-resolver.d.ts +10 -0
- package/dist/services/market-resolver.d.ts.map +1 -0
- package/dist/services/market-resolver.js +28 -0
- package/dist/services/market-resolver.js.map +1 -0
- package/dist/services/position-tracker.d.ts +13 -0
- package/dist/services/position-tracker.d.ts.map +1 -0
- package/dist/services/position-tracker.js +152 -0
- package/dist/services/position-tracker.js.map +1 -0
- package/dist/services/price-history.d.ts +18 -0
- package/dist/services/price-history.d.ts.map +1 -0
- package/dist/services/price-history.js +46 -0
- package/dist/services/price-history.js.map +1 -0
- package/dist/services/price-service.d.ts +14 -0
- package/dist/services/price-service.d.ts.map +1 -0
- package/dist/services/price-service.js +62 -0
- package/dist/services/price-service.js.map +1 -0
- package/dist/services/smart-flow.d.ts +22 -0
- package/dist/services/smart-flow.d.ts.map +1 -0
- package/dist/services/smart-flow.js +91 -0
- package/dist/services/smart-flow.js.map +1 -0
- package/dist/services/trade-executor.d.ts +44 -0
- package/dist/services/trade-executor.d.ts.map +1 -0
- package/dist/services/trade-executor.js +153 -0
- package/dist/services/trade-executor.js.map +1 -0
- package/dist/services/trader-analyzer.d.ts +19 -0
- package/dist/services/trader-analyzer.d.ts.map +1 -0
- package/dist/services/trader-analyzer.js +100 -0
- package/dist/services/trader-analyzer.js.map +1 -0
- package/dist/services/wallet-monitor.d.ts +51 -0
- package/dist/services/wallet-monitor.d.ts.map +1 -0
- package/dist/services/wallet-monitor.js +192 -0
- package/dist/services/wallet-monitor.js.map +1 -0
- package/dist/services/wta-discovery.d.ts +29 -0
- package/dist/services/wta-discovery.d.ts.map +1 -0
- package/dist/services/wta-discovery.js +155 -0
- package/dist/services/wta-discovery.js.map +1 -0
- package/dist/tools/analyze-trader.d.ts +6 -0
- package/dist/tools/analyze-trader.d.ts.map +1 -0
- package/dist/tools/analyze-trader.js +28 -0
- package/dist/tools/analyze-trader.js.map +1 -0
- package/dist/tools/backtest-trader.d.ts +7 -0
- package/dist/tools/backtest-trader.d.ts.map +1 -0
- package/dist/tools/backtest-trader.js +39 -0
- package/dist/tools/backtest-trader.js.map +1 -0
- package/dist/tools/buy.d.ts +14 -0
- package/dist/tools/buy.d.ts.map +1 -0
- package/dist/tools/buy.js +48 -0
- package/dist/tools/buy.js.map +1 -0
- package/dist/tools/cancel-orders.d.ts +5 -0
- package/dist/tools/cancel-orders.d.ts.map +1 -0
- package/dist/tools/cancel-orders.js +26 -0
- package/dist/tools/cancel-orders.js.map +1 -0
- package/dist/tools/check-exits.d.ts +3 -0
- package/dist/tools/check-exits.d.ts.map +1 -0
- package/dist/tools/check-exits.js +14 -0
- package/dist/tools/check-exits.js.map +1 -0
- package/dist/tools/check-market.d.ts +8 -0
- package/dist/tools/check-market.d.ts.map +1 -0
- package/dist/tools/check-market.js +31 -0
- package/dist/tools/check-market.js.map +1 -0
- package/dist/tools/close-position.d.ts +8 -0
- package/dist/tools/close-position.d.ts.map +1 -0
- package/dist/tools/close-position.js +26 -0
- package/dist/tools/close-position.js.map +1 -0
- package/dist/tools/discover-flow.d.ts +8 -0
- package/dist/tools/discover-flow.d.ts.map +1 -0
- package/dist/tools/discover-flow.js +36 -0
- package/dist/tools/discover-flow.js.map +1 -0
- package/dist/tools/discover-markets.d.ts +14 -0
- package/dist/tools/discover-markets.d.ts.map +1 -0
- package/dist/tools/discover-markets.js +67 -0
- package/dist/tools/discover-markets.js.map +1 -0
- package/dist/tools/discover-traders.d.ts +15 -0
- package/dist/tools/discover-traders.d.ts.map +1 -0
- package/dist/tools/discover-traders.js +64 -0
- package/dist/tools/discover-traders.js.map +1 -0
- package/dist/tools/discover-wta.d.ts +7 -0
- package/dist/tools/discover-wta.d.ts.map +1 -0
- package/dist/tools/discover-wta.js +26 -0
- package/dist/tools/discover-wta.js.map +1 -0
- package/dist/tools/get-balance.d.ts +4 -0
- package/dist/tools/get-balance.d.ts.map +1 -0
- package/dist/tools/get-balance.js +21 -0
- package/dist/tools/get-balance.js.map +1 -0
- package/dist/tools/get-dashboard.d.ts +5 -0
- package/dist/tools/get-dashboard.d.ts.map +1 -0
- package/dist/tools/get-dashboard.js +57 -0
- package/dist/tools/get-dashboard.js.map +1 -0
- package/dist/tools/get-portfolio.d.ts +3 -0
- package/dist/tools/get-portfolio.d.ts.map +1 -0
- package/dist/tools/get-portfolio.js +45 -0
- package/dist/tools/get-portfolio.js.map +1 -0
- package/dist/tools/get-positions.d.ts +11 -0
- package/dist/tools/get-positions.d.ts.map +1 -0
- package/dist/tools/get-positions.js +34 -0
- package/dist/tools/get-positions.js.map +1 -0
- package/dist/tools/get-price-history.d.ts +13 -0
- package/dist/tools/get-price-history.d.ts.map +1 -0
- package/dist/tools/get-price-history.js +55 -0
- package/dist/tools/get-price-history.js.map +1 -0
- package/dist/tools/get-price.d.ts +8 -0
- package/dist/tools/get-price.d.ts.map +1 -0
- package/dist/tools/get-price.js +37 -0
- package/dist/tools/get-price.js.map +1 -0
- package/dist/tools/get-trade-history.d.ts +10 -0
- package/dist/tools/get-trade-history.d.ts.map +1 -0
- package/dist/tools/get-trade-history.js +32 -0
- package/dist/tools/get-trade-history.js.map +1 -0
- package/dist/tools/get-trader-positions.d.ts +7 -0
- package/dist/tools/get-trader-positions.d.ts.map +1 -0
- package/dist/tools/get-trader-positions.js +27 -0
- package/dist/tools/get-trader-positions.js.map +1 -0
- package/dist/tools/go-live.d.ts +8 -0
- package/dist/tools/go-live.d.ts.map +1 -0
- package/dist/tools/go-live.js +22 -0
- package/dist/tools/go-live.js.map +1 -0
- package/dist/tools/list-watchlist.d.ts +3 -0
- package/dist/tools/list-watchlist.d.ts.map +1 -0
- package/dist/tools/list-watchlist.js +16 -0
- package/dist/tools/list-watchlist.js.map +1 -0
- package/dist/tools/log-cycle.d.ts +24 -0
- package/dist/tools/log-cycle.d.ts.map +1 -0
- package/dist/tools/log-cycle.js +23 -0
- package/dist/tools/log-cycle.js.map +1 -0
- package/dist/tools/place-stink-bid.d.ts +10 -0
- package/dist/tools/place-stink-bid.d.ts.map +1 -0
- package/dist/tools/place-stink-bid.js +53 -0
- package/dist/tools/place-stink-bid.js.map +1 -0
- package/dist/tools/rebalance.d.ts +9 -0
- package/dist/tools/rebalance.d.ts.map +1 -0
- package/dist/tools/rebalance.js +79 -0
- package/dist/tools/rebalance.js.map +1 -0
- package/dist/tools/score-trader.d.ts +6 -0
- package/dist/tools/score-trader.d.ts.map +1 -0
- package/dist/tools/score-trader.js +28 -0
- package/dist/tools/score-trader.js.map +1 -0
- package/dist/tools/search-markets.d.ts +8 -0
- package/dist/tools/search-markets.d.ts.map +1 -0
- package/dist/tools/search-markets.js +44 -0
- package/dist/tools/search-markets.js.map +1 -0
- package/dist/tools/sell.d.ts +10 -0
- package/dist/tools/sell.d.ts.map +1 -0
- package/dist/tools/sell.js +46 -0
- package/dist/tools/sell.js.map +1 -0
- package/dist/tools/set-config.d.ts +13 -0
- package/dist/tools/set-config.d.ts.map +1 -0
- package/dist/tools/set-config.js +24 -0
- package/dist/tools/set-config.js.map +1 -0
- package/dist/tools/set-exit-rules.d.ts +9 -0
- package/dist/tools/set-exit-rules.d.ts.map +1 -0
- package/dist/tools/set-exit-rules.js +39 -0
- package/dist/tools/set-exit-rules.js.map +1 -0
- package/dist/tools/start-monitor.d.ts +9 -0
- package/dist/tools/start-monitor.d.ts.map +1 -0
- package/dist/tools/start-monitor.js +24 -0
- package/dist/tools/start-monitor.js.map +1 -0
- package/dist/tools/stop-monitor.d.ts +3 -0
- package/dist/tools/stop-monitor.d.ts.map +1 -0
- package/dist/tools/stop-monitor.js +14 -0
- package/dist/tools/stop-monitor.js.map +1 -0
- package/dist/tools/watch-market.d.ts +15 -0
- package/dist/tools/watch-market.d.ts.map +1 -0
- package/dist/tools/watch-market.js +68 -0
- package/dist/tools/watch-market.js.map +1 -0
- package/dist/tools/watch-wallet.d.ts +13 -0
- package/dist/tools/watch-wallet.d.ts.map +1 -0
- package/dist/tools/watch-wallet.js +30 -0
- package/dist/tools/watch-wallet.js.map +1 -0
- package/dist/utils/config.d.ts +22 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +40 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fetch.d.ts +5 -0
- package/dist/utils/fetch.d.ts.map +1 -0
- package/dist/utils/fetch.js +57 -0
- package/dist/utils/fetch.js.map +1 -0
- package/dist/utils/license.d.ts +4 -0
- package/dist/utils/license.d.ts.map +1 -0
- package/dist/utils/license.js +49 -0
- package/dist/utils/license.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +23 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/tool-wrapper.d.ts +10 -0
- package/dist/utils/tool-wrapper.d.ts.map +1 -0
- package/dist/utils/tool-wrapper.js +15 -0
- package/dist/utils/tool-wrapper.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { log } from "../utils/logger.js";
|
|
2
|
+
import { fetchWithRetry } from "../utils/fetch.js";
|
|
3
|
+
const ESPN_WTA_URL = "https://site.api.espn.com/apis/site/v2/sports/tennis/wta/scoreboard";
|
|
4
|
+
const GAMMA_EVENTS_URL = "https://gamma-api.polymarket.com/events";
|
|
5
|
+
const CLOB_MARKETS_URL = "https://clob.polymarket.com/markets";
|
|
6
|
+
/** Fetch today's WTA matches from ESPN */
|
|
7
|
+
export async function getWtaSchedule() {
|
|
8
|
+
try {
|
|
9
|
+
const res = await fetchWithRetry(ESPN_WTA_URL);
|
|
10
|
+
if (!res.ok)
|
|
11
|
+
return [];
|
|
12
|
+
const data = await res.json();
|
|
13
|
+
const matches = [];
|
|
14
|
+
for (const event of data.events ?? []) {
|
|
15
|
+
const competition = event.competitions?.[0];
|
|
16
|
+
if (!competition)
|
|
17
|
+
continue;
|
|
18
|
+
const competitors = competition.competitors ?? [];
|
|
19
|
+
const players = competitors.map((c) => {
|
|
20
|
+
const athlete = c.athlete ?? {};
|
|
21
|
+
return athlete.shortName || athlete.displayName || "";
|
|
22
|
+
}).filter(Boolean);
|
|
23
|
+
if (players.length < 2)
|
|
24
|
+
continue;
|
|
25
|
+
matches.push({
|
|
26
|
+
player1: players[0],
|
|
27
|
+
player2: players[1],
|
|
28
|
+
tournament: event.name ?? "",
|
|
29
|
+
status: event.status?.type?.name ?? "UNKNOWN",
|
|
30
|
+
startTime: event.date ?? "",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
log("info", `ESPN WTA: ${matches.length} matches found`);
|
|
34
|
+
return matches;
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
log("error", `ESPN WTA API error: ${err}`);
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** Generate Polymarket slug candidates from player names */
|
|
42
|
+
export function generateSlugs(player1, player2, date) {
|
|
43
|
+
const normalize = (name) => {
|
|
44
|
+
// Take last name, lowercase, remove accents, truncate to 6-8 chars
|
|
45
|
+
const parts = name.split(/[\s.]+/);
|
|
46
|
+
const lastName = parts[parts.length - 1]
|
|
47
|
+
.toLowerCase()
|
|
48
|
+
.normalize("NFD")
|
|
49
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
50
|
+
.replace(/[^a-z]/g, "");
|
|
51
|
+
return lastName.slice(0, 7);
|
|
52
|
+
};
|
|
53
|
+
const p1 = normalize(player1);
|
|
54
|
+
const p2 = normalize(player2);
|
|
55
|
+
// Polymarket uses both orderings
|
|
56
|
+
return [
|
|
57
|
+
`wta-${p1}-${p2}-${date}`,
|
|
58
|
+
`wta-${p2}-${p1}-${date}`,
|
|
59
|
+
];
|
|
60
|
+
}
|
|
61
|
+
/** Lookup a WTA event on Polymarket by slug */
|
|
62
|
+
async function lookupEvent(slug) {
|
|
63
|
+
try {
|
|
64
|
+
const url = `${GAMMA_EVENTS_URL}?slug=${slug}`;
|
|
65
|
+
const res = await fetchWithRetry(url);
|
|
66
|
+
if (!res.ok)
|
|
67
|
+
return null;
|
|
68
|
+
const data = await res.json();
|
|
69
|
+
if (!Array.isArray(data) || data.length === 0)
|
|
70
|
+
return null;
|
|
71
|
+
return data[0];
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/** Get detailed market info from CLOB API */
|
|
78
|
+
async function getClobMarket(conditionId) {
|
|
79
|
+
try {
|
|
80
|
+
const url = `${CLOB_MARKETS_URL}/${conditionId}`;
|
|
81
|
+
const res = await fetchWithRetry(url);
|
|
82
|
+
if (!res.ok)
|
|
83
|
+
return null;
|
|
84
|
+
return await res.json();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Discover WTA markets on Polymarket for today's matches */
|
|
91
|
+
export async function discoverWtaMarkets(discountPct = 30) {
|
|
92
|
+
const schedule = await getWtaSchedule();
|
|
93
|
+
if (schedule.length === 0) {
|
|
94
|
+
log("info", "No WTA matches scheduled today");
|
|
95
|
+
return [];
|
|
96
|
+
}
|
|
97
|
+
const today = new Date().toISOString().split("T")[0];
|
|
98
|
+
const markets = [];
|
|
99
|
+
for (const match of schedule) {
|
|
100
|
+
const slugs = generateSlugs(match.player1, match.player2, today);
|
|
101
|
+
let event = null;
|
|
102
|
+
for (const slug of slugs) {
|
|
103
|
+
event = await lookupEvent(slug);
|
|
104
|
+
if (event)
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
if (!event) {
|
|
108
|
+
log("info", `No Polymarket event found for ${match.player1} vs ${match.player2}`);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
// Find the moneyline market (main match winner, not O/U or spreads)
|
|
112
|
+
const eventMarkets = event.markets ?? [];
|
|
113
|
+
const moneyline = eventMarkets.find((m) => {
|
|
114
|
+
const q = (m.question ?? "").toLowerCase();
|
|
115
|
+
// Moneyline is typically just "Player A vs Player B" without O/U or spread
|
|
116
|
+
return !q.includes("o/u") && !q.includes("over") && !q.includes("under") && !q.includes("spread");
|
|
117
|
+
});
|
|
118
|
+
if (!moneyline) {
|
|
119
|
+
log("info", `No moneyline market for ${match.player1} vs ${match.player2}`);
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
// Get detailed info from CLOB API
|
|
123
|
+
const clobMarket = await getClobMarket(moneyline.conditionId);
|
|
124
|
+
if (!clobMarket || clobMarket.closed)
|
|
125
|
+
continue;
|
|
126
|
+
const tokens = clobMarket.tokens ?? [];
|
|
127
|
+
if (tokens.length < 2)
|
|
128
|
+
continue;
|
|
129
|
+
// Determine favorite (higher price) and underdog
|
|
130
|
+
const sorted = [...tokens].sort((a, b) => (b.price ?? 0) - (a.price ?? 0));
|
|
131
|
+
const favorite = sorted[0];
|
|
132
|
+
const underdog = sorted[1];
|
|
133
|
+
const favPrice = parseFloat(favorite.price ?? "0");
|
|
134
|
+
const stinkPrice = Math.round(favPrice * (1 - discountPct / 100) * 1000) / 1000;
|
|
135
|
+
markets.push({
|
|
136
|
+
conditionId: moneyline.conditionId,
|
|
137
|
+
question: moneyline.question ?? clobMarket.question ?? "",
|
|
138
|
+
slug: event.slug ?? "",
|
|
139
|
+
favoriteOutcome: favorite.outcome ?? "",
|
|
140
|
+
favoritePrice: favPrice,
|
|
141
|
+
favoriteTokenId: favorite.token_id ?? "",
|
|
142
|
+
underdogOutcome: underdog.outcome ?? "",
|
|
143
|
+
underdogPrice: parseFloat(underdog.price ?? "0"),
|
|
144
|
+
underdogTokenId: underdog.token_id ?? "",
|
|
145
|
+
stinkBidPrice: stinkPrice,
|
|
146
|
+
tickSize: clobMarket.minimum_tick_size?.toString() ?? "0.01",
|
|
147
|
+
negRisk: clobMarket.neg_risk ?? false,
|
|
148
|
+
closed: false,
|
|
149
|
+
});
|
|
150
|
+
log("info", `WTA market: ${moneyline.question} | Fav: ${favorite.outcome} @ ${favPrice} | Stink: ${stinkPrice}`);
|
|
151
|
+
}
|
|
152
|
+
log("info", `WTA discovery complete: ${markets.length} markets`);
|
|
153
|
+
return markets;
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=wta-discovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wta-discovery.js","sourceRoot":"","sources":["../../src/services/wta-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const analyzeTraderSchema: z.ZodObject<{
|
|
3
|
+
address: z.ZodString;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export declare function handleAnalyzeTrader(input: z.infer<typeof analyzeTraderSchema>): Promise<string>;
|
|
6
|
+
//# sourceMappingURL=analyze-trader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-trader.d.ts","sourceRoot":"","sources":["../../src/tools/analyze-trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mBAAmB;;iBAE9B,CAAC;AAEH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBrG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { analyzeTrader } from "../services/trader-analyzer.js";
|
|
3
|
+
import { checkLicense } from "../utils/license.js";
|
|
4
|
+
export const analyzeTraderSchema = z.object({
|
|
5
|
+
address: z.string(),
|
|
6
|
+
});
|
|
7
|
+
export async function handleAnalyzeTrader(input) {
|
|
8
|
+
const isPro = await checkLicense();
|
|
9
|
+
const profile = await analyzeTrader(input.address, isPro);
|
|
10
|
+
let output = `## Trader Analysis: ${input.address.slice(0, 6)}...${input.address.slice(-4)}\n\n`;
|
|
11
|
+
output += `| Metric | Value |\n|--------|-------|\n`;
|
|
12
|
+
output += `| Active Positions | ${profile.activePositions} |\n`;
|
|
13
|
+
output += `| Win Rate | ${profile.winRate.toFixed(1)}% |\n`;
|
|
14
|
+
output += `| Avg Position Size | $${profile.avgPositionSize.toFixed(2)} |\n`;
|
|
15
|
+
if (isPro && profile.recentTrades.length > 0) {
|
|
16
|
+
output += `\n### Recent Trades\n\n`;
|
|
17
|
+
output += `| Time | Market | Side | Size | Price |\n|------|--------|------|------|-------|\n`;
|
|
18
|
+
for (const t of profile.recentTrades) {
|
|
19
|
+
const time = t.timestamp?.split("T")[1]?.slice(0, 5) ?? "-";
|
|
20
|
+
output += `| ${time} | ${t.title.slice(0, 30)} | ${t.side} | ${t.size.toFixed(2)} | $${t.price.toFixed(2)} |\n`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else if (!isPro) {
|
|
24
|
+
output += `\n_Upgrade to Pro for detailed trade history._\n`;
|
|
25
|
+
}
|
|
26
|
+
return output;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=analyze-trader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyze-trader.js","sourceRoot":"","sources":["../../src/tools/analyze-trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,KAA0C;IAClF,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE1D,IAAI,MAAM,GAAG,uBAAuB,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACjG,MAAM,IAAI,0CAA0C,CAAC;IACrD,MAAM,IAAI,wBAAwB,OAAO,CAAC,eAAe,MAAM,CAAC;IAChE,MAAM,IAAI,gBAAgB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC5D,MAAM,IAAI,0BAA0B,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAE7E,IAAI,KAAK,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,yBAAyB,CAAC;QACpC,MAAM,IAAI,oFAAoF,CAAC;QAC/F,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;YAC5D,MAAM,IAAI,KAAK,IAAI,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAClH,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,IAAI,kDAAkD,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const backtestTraderSchema: z.ZodObject<{
|
|
3
|
+
address: z.ZodString;
|
|
4
|
+
copy_budget: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
5
|
+
}, z.core.$strip>;
|
|
6
|
+
export declare function handleBacktestTrader(input: z.infer<typeof backtestTraderSchema>): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=backtest-trader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backtest-trader.d.ts","sourceRoot":"","sources":["../../src/tools/backtest-trader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,oBAAoB;;;iBAG/B,CAAC;AAEH,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAoCvG"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { backtestTrader } from "../services/backtester.js";
|
|
3
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
4
|
+
export const backtestTraderSchema = z.object({
|
|
5
|
+
address: z.string(),
|
|
6
|
+
copy_budget: z.number().min(1).max(100).optional().default(5).describe("Simulated $ amount per trade (default: $5)"),
|
|
7
|
+
});
|
|
8
|
+
export async function handleBacktestTrader(input) {
|
|
9
|
+
const isPro = await checkLicense();
|
|
10
|
+
if (!isPro)
|
|
11
|
+
return requirePro("backtest_trader");
|
|
12
|
+
const result = await backtestTrader(input.address, input.copy_budget);
|
|
13
|
+
const s = result.summary;
|
|
14
|
+
let output = `## Backtest: ${input.address.slice(0, 8)}..${input.address.slice(-4)}\n\n`;
|
|
15
|
+
output += `**Period:** ${result.period} | **Copy Budget:** $${input.copy_budget}/trade\n\n`;
|
|
16
|
+
output += `| Metric | Value |\n|--------|-------|\n`;
|
|
17
|
+
output += `| Total Trades | ${s.totalTrades} |\n`;
|
|
18
|
+
output += `| Wins / Losses / Open | ${s.wins} / ${s.losses} / ${s.open} |\n`;
|
|
19
|
+
output += `| Win Rate | ${s.winRate.toFixed(1)}% |\n`;
|
|
20
|
+
output += `| Simulated P&L | $${s.simulatedCopyPnl.toFixed(2)} |\n`;
|
|
21
|
+
output += `| Avg P&L/Trade | $${s.avgPnl.toFixed(2)} |\n`;
|
|
22
|
+
output += `| Best Trade | $${s.bestTrade.toFixed(2)} |\n`;
|
|
23
|
+
output += `| Worst Trade | $${s.worstTrade.toFixed(2)} |\n`;
|
|
24
|
+
if (result.trades.length > 0) {
|
|
25
|
+
output += `\n### Trade Details\n\n`;
|
|
26
|
+
output += `| # | Market | Entry | Exit | P&L | Status |\n|---|--------|-------|------|-----|--------|\n`;
|
|
27
|
+
for (let i = 0; i < Math.min(result.trades.length, 15); i++) {
|
|
28
|
+
const t = result.trades[i];
|
|
29
|
+
const exit = t.exitPrice !== null ? `$${t.exitPrice.toFixed(2)}` : "open";
|
|
30
|
+
const pnlStr = t.pnl >= 0 ? `+$${t.pnl.toFixed(2)}` : `-$${Math.abs(t.pnl).toFixed(2)}`;
|
|
31
|
+
output += `| ${i + 1} | ${t.title.slice(0, 30)} | $${t.entryPrice.toFixed(2)} | ${exit} | ${pnlStr} | ${t.status} |\n`;
|
|
32
|
+
}
|
|
33
|
+
if (result.trades.length > 15) {
|
|
34
|
+
output += `\n_...and ${result.trades.length - 15} more trades_\n`;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return output;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=backtest-trader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backtest-trader.js","sourceRoot":"","sources":["../../src/tools/backtest-trader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
import { TradeExecutor } from "../services/trade-executor.js";
|
|
4
|
+
export declare const buySchema: z.ZodObject<{
|
|
5
|
+
condition_id: z.ZodString;
|
|
6
|
+
amount: z.ZodNumber;
|
|
7
|
+
price: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
outcome: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
9
|
+
YES: "YES";
|
|
10
|
+
NO: "NO";
|
|
11
|
+
}>>>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export declare function handleBuy(db: Database.Database, executor: TradeExecutor, input: z.infer<typeof buySchema>): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=buy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buy.d.ts","sourceRoot":"","sources":["../../src/tools/buy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,aAAa,EAAmB,MAAM,+BAA+B,CAAC;AAM/E,eAAO,MAAM,SAAS;;;;;;;;iBAKpB,CAAC;AAEH,wBAAsB,SAAS,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAsCjI"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { resolveMarketByConditionId } from "../services/market-resolver.js";
|
|
3
|
+
import { checkMarketQuality } from "../services/market-filter.js";
|
|
4
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
5
|
+
import { log } from "../utils/logger.js";
|
|
6
|
+
export const buySchema = z.object({
|
|
7
|
+
condition_id: z.string(),
|
|
8
|
+
amount: z.number().min(0.5).describe("Amount in USDC to spend"),
|
|
9
|
+
price: z.number().min(0.01).max(0.99).optional().describe("Limit price (omit for market price from order book)"),
|
|
10
|
+
outcome: z.enum(["YES", "NO"]).optional().default("YES"),
|
|
11
|
+
});
|
|
12
|
+
export async function handleBuy(db, executor, input) {
|
|
13
|
+
// Live mode requires Pro
|
|
14
|
+
if (executor.getMode() === "live") {
|
|
15
|
+
const isPro = await checkLicense();
|
|
16
|
+
if (!isPro)
|
|
17
|
+
return requirePro("buy (live mode)");
|
|
18
|
+
}
|
|
19
|
+
const marketInfo = await resolveMarketByConditionId(input.condition_id);
|
|
20
|
+
if (!marketInfo)
|
|
21
|
+
return "Could not resolve market. Check the condition_id is correct.";
|
|
22
|
+
// Market quality check
|
|
23
|
+
const quality = await checkMarketQuality(marketInfo.tokenId);
|
|
24
|
+
if (!quality.pass) {
|
|
25
|
+
return `Market quality check failed:\n${quality.reasons.map((r) => "- " + r).join("\n")}\n\nUse \`check_market\` for details or proceed with caution.`;
|
|
26
|
+
}
|
|
27
|
+
const price = input.price ?? quality.metrics.midPrice;
|
|
28
|
+
if (price <= 0)
|
|
29
|
+
return "Could not determine market price. Provide a `price` parameter.";
|
|
30
|
+
const order = {
|
|
31
|
+
traderAddress: "direct",
|
|
32
|
+
marketSlug: marketInfo.slug,
|
|
33
|
+
conditionId: input.condition_id,
|
|
34
|
+
tokenId: marketInfo.tokenId,
|
|
35
|
+
price,
|
|
36
|
+
amount: input.amount,
|
|
37
|
+
originalAmount: input.amount,
|
|
38
|
+
tickSize: marketInfo.tickSize ?? "0.01",
|
|
39
|
+
negRisk: marketInfo.negRisk ?? false,
|
|
40
|
+
orderSide: "BUY",
|
|
41
|
+
};
|
|
42
|
+
const result = await executor.execute(order);
|
|
43
|
+
if (result.status === "failed")
|
|
44
|
+
return `Buy failed: ${result.message}`;
|
|
45
|
+
log("trade", `Direct BUY $${input.amount} @ $${price.toFixed(2)} on ${marketInfo.slug}`);
|
|
46
|
+
return `**${result.mode === "preview" ? "Simulated" : "Executed"}** BUY $${input.amount} @ $${price.toFixed(4)} on ${marketInfo.slug}\n\nTrade ID: #${result.tradeId} | Mode: ${result.mode}`;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=buy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buy.js","sourceRoot":"","sources":["../../src/tools/buy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { TradeExecutor } from "../services/trade-executor.js";
|
|
3
|
+
export declare const cancelOrdersSchema: z.ZodObject<{}, z.core.$strip>;
|
|
4
|
+
export declare function handleCancelOrders(executor: TradeExecutor): Promise<string>;
|
|
5
|
+
//# sourceMappingURL=cancel-orders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel-orders.d.ts","sourceRoot":"","sources":["../../src/tools/cancel-orders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAI9D,eAAO,MAAM,kBAAkB,gCAAe,CAAC;AAE/C,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBjF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
3
|
+
import { log } from "../utils/logger.js";
|
|
4
|
+
export const cancelOrdersSchema = z.object({});
|
|
5
|
+
export async function handleCancelOrders(executor) {
|
|
6
|
+
const isPro = await checkLicense();
|
|
7
|
+
if (!isPro)
|
|
8
|
+
return requirePro("cancel_orders");
|
|
9
|
+
if (executor.getMode() !== "live") {
|
|
10
|
+
return "Cancel orders only works in live mode. Use `go_live` to switch to live trading first.";
|
|
11
|
+
}
|
|
12
|
+
try {
|
|
13
|
+
const result = await executor.cancelAllOrders();
|
|
14
|
+
if (result.cancelled === 0) {
|
|
15
|
+
return "No open orders to cancel.";
|
|
16
|
+
}
|
|
17
|
+
log("trade", `Cancelled ${result.cancelled} open orders`);
|
|
18
|
+
return `Cancelled ${result.cancelled} open orders.`;
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
log("error", `Cancel orders failed: ${err}`);
|
|
22
|
+
const hint = err?.message?.includes("credentials") ? " Check your API credentials in .env." : "";
|
|
23
|
+
return `Failed to cancel orders. The Polymarket API returned an error.${hint} Check the event log for details.`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cancel-orders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cancel-orders.js","sourceRoot":"","sources":["../../src/tools/cancel-orders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAuB;IAC9D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;IAE/C,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;QAClC,OAAO,uFAAuF,CAAC;IACjG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,EAAE,CAAC;QAEhD,IAAI,MAAM,CAAC,SAAS,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,2BAA2B,CAAC;QACrC,CAAC;QAED,GAAG,CAAC,OAAO,EAAE,aAAa,MAAM,CAAC,SAAS,cAAc,CAAC,CAAC;QAC1D,OAAO,aAAa,MAAM,CAAC,SAAS,eAAe,CAAC;IACtD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,GAAG,CAAC,OAAO,EAAE,yBAAyB,GAAG,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjG,OAAO,iEAAiE,IAAI,mCAAmC,CAAC;IAClH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-exits.d.ts","sourceRoot":"","sources":["../../src/tools/check-exits.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAItC,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7E"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PositionTracker } from "../services/position-tracker.js";
|
|
2
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
3
|
+
export async function handleCheckExits(db) {
|
|
4
|
+
const isPro = await checkLicense();
|
|
5
|
+
if (!isPro)
|
|
6
|
+
return requirePro("check_exits");
|
|
7
|
+
const tracker = new PositionTracker(db);
|
|
8
|
+
const closed = await tracker.checkExits();
|
|
9
|
+
if (closed === 0) {
|
|
10
|
+
return "No positions resolved this cycle.";
|
|
11
|
+
}
|
|
12
|
+
return `${closed} position(s) resolved and P&L updated.`;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=check-exits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-exits.js","sourceRoot":"","sources":["../../src/tools/check-exits.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,EAAqB;IAC1D,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAAC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,aAAa,CAAC,CAAC;IACjF,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;IAE1C,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,mCAAmC,CAAC;IAC7C,CAAC;IAED,OAAO,GAAG,MAAM,wCAAwC,CAAC;AAC3D,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const checkMarketSchema: z.ZodObject<{
|
|
3
|
+
token_id: z.ZodString;
|
|
4
|
+
max_spread: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
min_depth: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export declare function handleCheckMarket(input: z.infer<typeof checkMarketSchema>): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=check-market.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-market.d.ts","sourceRoot":"","sources":["../../src/tools/check-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,iBAAiB;;;;iBAI5B,CAAC;AAEH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { checkMarketQuality } from "../services/market-filter.js";
|
|
3
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
4
|
+
export const checkMarketSchema = z.object({
|
|
5
|
+
token_id: z.string(),
|
|
6
|
+
max_spread: z.number().min(0).max(1).optional().describe("Max acceptable spread (default: 0.10)"),
|
|
7
|
+
min_depth: z.number().min(0).optional().describe("Min $ depth per side (default: $50)"),
|
|
8
|
+
});
|
|
9
|
+
export async function handleCheckMarket(input) {
|
|
10
|
+
const isPro = await checkLicense();
|
|
11
|
+
if (!isPro)
|
|
12
|
+
return requirePro("check_market");
|
|
13
|
+
const result = await checkMarketQuality(input.token_id, {
|
|
14
|
+
maxSpread: input.max_spread,
|
|
15
|
+
minDepth: input.min_depth,
|
|
16
|
+
});
|
|
17
|
+
const m = result.metrics;
|
|
18
|
+
const verdict = result.pass ? "PASS" : "FAIL";
|
|
19
|
+
let output = `## Market Quality: ${verdict}\n\n`;
|
|
20
|
+
output += `| Metric | Value |\n|--------|-------|\n`;
|
|
21
|
+
output += `| Spread | ${(m.spread * 100).toFixed(1)}% |\n`;
|
|
22
|
+
output += `| Bid Depth | $${m.bidDepth.toFixed(0)} |\n`;
|
|
23
|
+
output += `| Ask Depth | $${m.askDepth.toFixed(0)} |\n`;
|
|
24
|
+
output += `| Mid Price | $${m.midPrice.toFixed(4)} |\n`;
|
|
25
|
+
if (!result.pass) {
|
|
26
|
+
output += `\n### Issues\n\n`;
|
|
27
|
+
result.reasons.forEach((r) => { output += `- ${r}\n`; });
|
|
28
|
+
}
|
|
29
|
+
return output;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=check-market.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-market.js","sourceRoot":"","sources":["../../src/tools/check-market.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;IACpB,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;IACjG,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;CACxF,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAwC;IAC9E,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IAAC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC;IAClF,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,KAAK,CAAC,QAAQ,EAAE;QACtD,SAAS,EAAE,KAAK,CAAC,UAAU;QAC3B,QAAQ,EAAE,KAAK,CAAC,SAAS;KAC1B,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9C,IAAI,MAAM,GAAG,sBAAsB,OAAO,MAAM,CAAC;IACjD,MAAM,IAAI,0CAA0C,CAAC;IACrD,MAAM,IAAI,cAAc,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3D,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IACxD,MAAM,IAAI,kBAAkB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;IAExD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,IAAI,kBAAkB,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import Database from "better-sqlite3";
|
|
3
|
+
export declare const closePositionSchema: z.ZodObject<{
|
|
4
|
+
trade_id: z.ZodNumber;
|
|
5
|
+
reason: z.ZodDefault<z.ZodOptional<z.ZodString>>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export declare function handleClosePosition(db: Database.Database, input: z.infer<typeof closePositionSchema>): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=close-position.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-position.d.ts","sourceRoot":"","sources":["../../src/tools/close-position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAKtC,eAAO,MAAM,mBAAmB;;;iBAG9B,CAAC;AAEH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAqB5H"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { updateTradeExit } from "../db/queries.js";
|
|
3
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
4
|
+
import { log } from "../utils/logger.js";
|
|
5
|
+
export const closePositionSchema = z.object({
|
|
6
|
+
trade_id: z.number().int(),
|
|
7
|
+
reason: z.string().optional().default("manual"),
|
|
8
|
+
});
|
|
9
|
+
export async function handleClosePosition(db, input) {
|
|
10
|
+
const isPro = await checkLicense();
|
|
11
|
+
if (!isPro)
|
|
12
|
+
return requirePro("close_position");
|
|
13
|
+
const trade = db.prepare("SELECT * FROM trades WHERE id = ? AND status IN ('simulated', 'executed')").get(input.trade_id);
|
|
14
|
+
if (!trade) {
|
|
15
|
+
return `No open position found with ID ${input.trade_id}. Use \`get_positions\` to see your open positions and their IDs.`;
|
|
16
|
+
}
|
|
17
|
+
// Get current market price for P&L calculation
|
|
18
|
+
const { getMarketPriceByCondition } = await import("../services/price-service.js");
|
|
19
|
+
const priceInfo = await getMarketPriceByCondition(trade.condition_id);
|
|
20
|
+
const exitPrice = priceInfo?.price ?? trade.price;
|
|
21
|
+
const pnl = trade.price > 0 ? ((exitPrice - trade.price) * trade.amount) / trade.price : 0;
|
|
22
|
+
updateTradeExit(db, input.trade_id, exitPrice, input.reason, pnl);
|
|
23
|
+
log("trade", `Position #${input.trade_id} closed manually: ${trade.market_slug}`);
|
|
24
|
+
return `Position #${input.trade_id} closed (${trade.market_slug}). Exit reason: ${input.reason}`;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=close-position.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"close-position.js","sourceRoot":"","sources":["../../src/tools/close-position.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAEzC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;CAChD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,EAAqB,EAAE,KAA0C;IACzG,MAAM,KAAK,GAAG,MAAM,YAAY,EAAE,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEhD,MAAM,KAAK,GAAG,EAAE,CAAC,OAAO,CAAC,2EAA2E,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAQ,CAAC;IAEjI,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,kCAAkC,KAAK,CAAC,QAAQ,mEAAmE,CAAC;IAC7H,CAAC;IAED,+CAA+C;IAC/C,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,8BAA8B,CAAC,CAAC;IACnF,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,SAAS,EAAE,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC;IAClD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3F,eAAe,CAAC,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAElE,GAAG,CAAC,OAAO,EAAE,aAAa,KAAK,CAAC,QAAQ,qBAAqB,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAElF,OAAO,aAAa,KAAK,CAAC,QAAQ,YAAY,KAAK,CAAC,WAAW,mBAAmB,KAAK,CAAC,MAAM,EAAE,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const discoverFlowSchema: z.ZodObject<{
|
|
3
|
+
top_traders: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
4
|
+
max_age_minutes: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
5
|
+
min_traders: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
6
|
+
}, z.core.$strip>;
|
|
7
|
+
export declare function handleDiscoverFlow(input: z.infer<typeof discoverFlowSchema>): Promise<string>;
|
|
8
|
+
//# sourceMappingURL=discover-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-flow.d.ts","sourceRoot":"","sources":["../../src/tools/discover-flow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,kBAAkB;;;;iBAI7B,CAAC;AAEH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CA+BnG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { discoverSmartFlow } from "../services/smart-flow.js";
|
|
3
|
+
import { checkLicense, requirePro } from "../utils/license.js";
|
|
4
|
+
export const discoverFlowSchema = z.object({
|
|
5
|
+
top_traders: z.number().int().min(5).max(100).optional().default(30).describe("Number of top traders to scan"),
|
|
6
|
+
max_age_minutes: z.number().min(5).max(1440).optional().default(60).describe("Max trade age in minutes"),
|
|
7
|
+
min_traders: z.number().int().min(2).max(20).optional().default(2).describe("Min unique traders for a signal"),
|
|
8
|
+
});
|
|
9
|
+
export async function handleDiscoverFlow(input) {
|
|
10
|
+
const isPro = await checkLicense();
|
|
11
|
+
if (!isPro)
|
|
12
|
+
return requirePro("discover_flow");
|
|
13
|
+
const signals = await discoverSmartFlow({
|
|
14
|
+
topN: input.top_traders,
|
|
15
|
+
maxAgeMinutes: input.max_age_minutes,
|
|
16
|
+
minSignalTraders: input.min_traders,
|
|
17
|
+
});
|
|
18
|
+
if (signals.length === 0) {
|
|
19
|
+
return `No smart money signals found in the last ${input.max_age_minutes} minutes from top ${input.top_traders} traders. Try increasing the time window or reducing min_traders.`;
|
|
20
|
+
}
|
|
21
|
+
let output = `## Smart Money Flow (last ${input.max_age_minutes}min)\n\n`;
|
|
22
|
+
output += `Scanned **${input.top_traders}** top traders. Found **${signals.length}** signals.\n\n`;
|
|
23
|
+
for (let i = 0; i < signals.length; i++) {
|
|
24
|
+
const s = signals[i];
|
|
25
|
+
const icon = s.strength === "strong" ? "***" : s.strength === "moderate" ? "**" : "*";
|
|
26
|
+
output += `### ${i + 1}. ${s.title}\n`;
|
|
27
|
+
output += `${icon}${s.strength.toUpperCase()}${icon} — ${s.traders.length} traders ${s.side} | Total: $${s.totalAmount.toFixed(0)} | Avg: $${s.avgPrice.toFixed(2)}\n\n`;
|
|
28
|
+
output += `| Trader | Rank | Amount | Price |\n|--------|------|--------|-------|\n`;
|
|
29
|
+
for (const t of s.traders) {
|
|
30
|
+
output += `| ${t.name.slice(0, 20)} | #${t.rank} | $${t.amount.toFixed(0)} | $${t.price.toFixed(2)} |\n`;
|
|
31
|
+
}
|
|
32
|
+
output += `\n`;
|
|
33
|
+
}
|
|
34
|
+
return output;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=discover-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-flow.js","sourceRoot":"","sources":["../../src/tools/discover-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const discoverMarketsSchema: z.ZodObject<{
|
|
3
|
+
ending: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
4
|
+
all: "all";
|
|
5
|
+
today: "today";
|
|
6
|
+
this_week: "this_week";
|
|
7
|
+
}>>>;
|
|
8
|
+
category: z.ZodOptional<z.ZodString>;
|
|
9
|
+
min_volume: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
10
|
+
limit: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
|
|
11
|
+
}, z.core.$strip>;
|
|
12
|
+
export type DiscoverMarketsInput = z.infer<typeof discoverMarketsSchema>;
|
|
13
|
+
export declare function handleDiscoverMarkets(input: DiscoverMarketsInput): Promise<string>;
|
|
14
|
+
//# sourceMappingURL=discover-markets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discover-markets.d.ts","sourceRoot":"","sources":["../../src/tools/discover-markets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,qBAAqB;;;;;;;;;iBAKhC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEzE,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CA0DxF"}
|