dexbot 1.4.25 → 1.5.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/CHANGELOG.md +54 -0
- package/README.md +6 -2
- package/analysis/README.md +14 -7
- package/analysis/ama_fitting/package.json +1 -1
- package/analysis/analyze_derivatives.ts +1 -1
- package/analysis/bot_key_utils.ts +272 -3
- package/analysis/bot_usage/discover_bot_accounts.ts +64 -9
- package/analysis/bot_usage/kibana_bot_queries.ts +40 -1
- package/analysis/chart_utils.ts +6 -3
- package/analysis/grid_correction_check.ts +56 -20
- package/analysis/resolve_bot_accounts.ts +199 -0
- package/analysis/trade_profitability.ts +36 -8
- package/analysis/tradingview/README.md +25 -0
- package/analysis/tradingview/analyze_tradingview.ts +2 -2
- package/analysis/trend_detection/package.json +1 -1
- package/claw/modules/claw_launcher.ts +5 -4
- package/claw/modules/credit_runtime_adapter.ts +2 -1
- package/claw/modules/dexbot_profiles.ts +4 -3
- package/claw/package.json +1 -1
- package/claw/runtimes/openclaw-plugin/openclaw.plugin.json +1 -1
- package/claw/runtimes/openclaw-plugin/package.json +1 -1
- package/claw/tests/test_claw_mcp_transport.ts +2 -2
- package/dist/analysis/analyze_derivatives.js +1 -1
- package/dist/analysis/bot_key_utils.d.ts +28 -1
- package/dist/analysis/bot_key_utils.d.ts.map +1 -1
- package/dist/analysis/bot_key_utils.js +385 -3
- package/dist/analysis/bot_key_utils.js.map +1 -1
- package/dist/analysis/bot_usage/discover_bot_accounts.js +60 -10
- package/dist/analysis/bot_usage/discover_bot_accounts.js.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts +45 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.d.ts.map +1 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.js +39 -1
- package/dist/analysis/bot_usage/kibana_bot_queries.js.map +1 -1
- package/dist/analysis/chart_utils.d.ts +2 -1
- package/dist/analysis/chart_utils.d.ts.map +1 -1
- package/dist/analysis/chart_utils.js +4 -1
- package/dist/analysis/chart_utils.js.map +1 -1
- package/dist/analysis/grid_correction_check.d.ts.map +1 -1
- package/dist/analysis/grid_correction_check.js +60 -20
- package/dist/analysis/grid_correction_check.js.map +1 -1
- package/dist/analysis/resolve_bot_accounts.d.ts +3 -0
- package/dist/analysis/resolve_bot_accounts.d.ts.map +1 -0
- package/dist/analysis/resolve_bot_accounts.js +216 -0
- package/dist/analysis/resolve_bot_accounts.js.map +1 -0
- package/dist/analysis/trade_profitability.d.ts.map +1 -1
- package/dist/analysis/trade_profitability.js +40 -8
- package/dist/analysis/trade_profitability.js.map +1 -1
- package/dist/analysis/tradingview/analyze_tradingview.js +2 -2
- package/dist/analysis/tradingview/analyze_tradingview.js.map +1 -1
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +2 -1
- package/dist/bot.js.map +1 -1
- package/dist/dexbot.d.ts.map +1 -1
- package/dist/dexbot.js +73 -17
- package/dist/dexbot.js.map +1 -1
- package/dist/market_adapter/ama_signal_runner.js +2 -2
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js +2 -1
- package/dist/market_adapter/inputs/fetch_cex_synthetic_data.js.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts +4 -1
- package/dist/market_adapter/inputs/fetch_lp_data.d.ts.map +1 -1
- package/dist/market_adapter/inputs/fetch_lp_data.js +3 -2
- package/dist/market_adapter/inputs/fetch_lp_data.js.map +1 -1
- package/dist/modules/account_bots.d.ts +42 -1
- package/dist/modules/account_bots.d.ts.map +1 -1
- package/dist/modules/account_bots.js +168 -17
- package/dist/modules/account_bots.js.map +1 -1
- package/dist/modules/account_orders.d.ts +7 -1
- package/dist/modules/account_orders.d.ts.map +1 -1
- package/dist/modules/account_orders.js +34 -1
- package/dist/modules/account_orders.js.map +1 -1
- package/dist/modules/bitshares_client.d.ts +4 -1
- package/dist/modules/bitshares_client.d.ts.map +1 -1
- package/dist/modules/bitshares_client.js +12 -4
- package/dist/modules/bitshares_client.js.map +1 -1
- package/dist/modules/bot_settings.d.ts.map +1 -1
- package/dist/modules/bot_settings.js +2 -1
- package/dist/modules/bot_settings.js.map +1 -1
- package/dist/modules/cli_colors.d.ts +39 -0
- package/dist/modules/cli_colors.d.ts.map +1 -0
- package/dist/modules/cli_colors.js +42 -0
- package/dist/modules/cli_colors.js.map +1 -0
- package/dist/modules/constants.d.ts +2 -0
- package/dist/modules/constants.d.ts.map +1 -1
- package/dist/modules/constants.js +27 -11
- package/dist/modules/constants.js.map +1 -1
- package/dist/modules/credit_pricing.d.ts +61 -0
- package/dist/modules/credit_pricing.d.ts.map +1 -0
- package/dist/modules/credit_pricing.js +237 -0
- package/dist/modules/credit_pricing.js.map +1 -0
- package/dist/modules/credit_runtime.d.ts +1 -0
- package/dist/modules/credit_runtime.d.ts.map +1 -1
- package/dist/modules/credit_runtime.js +49 -107
- package/dist/modules/credit_runtime.js.map +1 -1
- package/dist/modules/dexbot_class.d.ts +3 -1
- package/dist/modules/dexbot_class.d.ts.map +1 -1
- package/dist/modules/dexbot_class.js +22 -6
- package/dist/modules/dexbot_class.js.map +1 -1
- package/dist/modules/dexbot_cow_runtime.d.ts +36 -2
- package/dist/modules/dexbot_cow_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_cow_runtime.js +434 -20
- package/dist/modules/dexbot_cow_runtime.js.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.d.ts +15 -16
- package/dist/modules/dexbot_maintenance_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_maintenance_runtime.js +69 -42
- package/dist/modules/dexbot_maintenance_runtime.js.map +1 -1
- package/dist/modules/dexbot_startup_runtime.d.ts +1 -0
- package/dist/modules/dexbot_startup_runtime.d.ts.map +1 -1
- package/dist/modules/dexbot_startup_runtime.js +12 -1
- package/dist/modules/dexbot_startup_runtime.js.map +1 -1
- package/dist/modules/dexbot_state_recovery.d.ts.map +1 -1
- package/dist/modules/dexbot_state_recovery.js +7 -0
- package/dist/modules/dexbot_state_recovery.js.map +1 -1
- package/dist/modules/fund_registry.d.ts +1 -1
- package/dist/modules/fund_registry.js +1 -1
- package/dist/modules/launcher/adapter_requirement.d.ts +38 -0
- package/dist/modules/launcher/adapter_requirement.d.ts.map +1 -0
- package/dist/modules/launcher/adapter_requirement.js +141 -0
- package/dist/modules/launcher/adapter_requirement.js.map +1 -0
- package/dist/modules/launcher/bot_supervisor.d.ts +2 -2
- package/dist/modules/launcher/bot_supervisor.d.ts.map +1 -1
- package/dist/modules/launcher/bot_supervisor.js +32 -3
- package/dist/modules/launcher/bot_supervisor.js.map +1 -1
- package/dist/modules/launcher/launch_modes.d.ts.map +1 -1
- package/dist/modules/launcher/launch_modes.js +5 -4
- package/dist/modules/launcher/launch_modes.js.map +1 -1
- package/dist/modules/launcher/monolithic_runtime.d.ts +1 -1
- package/dist/modules/launcher/monolithic_runtime.d.ts.map +1 -1
- package/dist/modules/launcher/monolithic_runtime.js +12 -8
- package/dist/modules/launcher/monolithic_runtime.js.map +1 -1
- package/dist/modules/launcher/status_reporting.d.ts +6 -6
- package/dist/modules/launcher/status_reporting.d.ts.map +1 -1
- package/dist/modules/launcher/status_reporting.js +9 -6
- package/dist/modules/launcher/status_reporting.js.map +1 -1
- package/dist/modules/order/accounting.d.ts +34 -0
- package/dist/modules/order/accounting.d.ts.map +1 -1
- package/dist/modules/order/accounting.js +182 -5
- package/dist/modules/order/accounting.js.map +1 -1
- package/dist/modules/order/export.d.ts +1 -1
- package/dist/modules/order/export.js +1 -1
- package/dist/modules/order/grid.d.ts.map +1 -1
- package/dist/modules/order/grid.js +68 -28
- package/dist/modules/order/grid.js.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.d.ts.map +1 -1
- package/dist/modules/order/grid_reconcile_internal.js +72 -0
- package/dist/modules/order/grid_reconcile_internal.js.map +1 -1
- package/dist/modules/order/logger.d.ts +23 -1
- package/dist/modules/order/logger.d.ts.map +1 -1
- package/dist/modules/order/logger.js +60 -17
- package/dist/modules/order/logger.js.map +1 -1
- package/dist/modules/order/manager.d.ts +41 -1
- package/dist/modules/order/manager.d.ts.map +1 -1
- package/dist/modules/order/manager.js +186 -17
- package/dist/modules/order/manager.js.map +1 -1
- package/dist/modules/order/strategy.d.ts.map +1 -1
- package/dist/modules/order/strategy.js +17 -2
- package/dist/modules/order/strategy.js.map +1 -1
- package/dist/modules/order/sync_engine.d.ts.map +1 -1
- package/dist/modules/order/sync_engine.js +59 -9
- package/dist/modules/order/sync_engine.js.map +1 -1
- package/dist/modules/order/utils/math.d.ts +42 -1
- package/dist/modules/order/utils/math.d.ts.map +1 -1
- package/dist/modules/order/utils/math.js +91 -1
- package/dist/modules/order/utils/math.js.map +1 -1
- package/dist/modules/order/utils/order.d.ts +52 -1
- package/dist/modules/order/utils/order.d.ts.map +1 -1
- package/dist/modules/order/utils/order.js +137 -7
- package/dist/modules/order/utils/order.js.map +1 -1
- package/dist/modules/order/utils/system.d.ts +66 -4
- package/dist/modules/order/utils/system.d.ts.map +1 -1
- package/dist/modules/order/utils/system.js +156 -16
- package/dist/modules/order/utils/system.js.map +1 -1
- package/dist/modules/order/utils/validate.d.ts +30 -3
- package/dist/modules/order/utils/validate.d.ts.map +1 -1
- package/dist/modules/order/utils/validate.js +206 -11
- package/dist/modules/order/utils/validate.js.map +1 -1
- package/dist/modules/utils/chain_logs.d.ts +11 -0
- package/dist/modules/utils/chain_logs.d.ts.map +1 -0
- package/dist/modules/utils/chain_logs.js +23 -0
- package/dist/modules/utils/chain_logs.js.map +1 -0
- package/dist/modules/utils/sanitize_key.d.ts +7 -0
- package/dist/modules/utils/sanitize_key.d.ts.map +1 -1
- package/dist/modules/utils/sanitize_key.js +15 -0
- package/dist/modules/utils/sanitize_key.js.map +1 -1
- package/dist/pm2.d.ts +11 -1
- package/dist/pm2.d.ts.map +1 -1
- package/dist/pm2.js +66 -15
- package/dist/pm2.js.map +1 -1
- package/dist/scripts/analyze-credit.d.ts +4 -0
- package/dist/scripts/analyze-credit.d.ts.map +1 -0
- package/dist/scripts/analyze-credit.js +760 -0
- package/dist/scripts/analyze-credit.js.map +1 -0
- package/dist/scripts/analyze-orders.d.ts +1 -10
- package/dist/scripts/analyze-orders.d.ts.map +1 -1
- package/dist/scripts/analyze-orders.js +11 -34
- package/dist/scripts/analyze-orders.js.map +1 -1
- package/dist/scripts/test-credit-renewal.d.ts.map +1 -1
- package/dist/scripts/test-credit-renewal.js +37 -5
- package/dist/scripts/test-credit-renewal.js.map +1 -1
- package/dist/scripts/tv.d.ts +11 -0
- package/dist/scripts/tv.d.ts.map +1 -0
- package/dist/scripts/tv.js +357 -0
- package/dist/scripts/tv.js.map +1 -0
- package/dist/scripts/update.js +77 -10
- package/dist/scripts/update.js.map +1 -1
- package/dist/unlock.d.ts.map +1 -1
- package/dist/unlock.js +20 -8
- package/dist/unlock.js.map +1 -1
- package/docs/DEXBOT_COMPARISON.md +3 -3
- package/docs/EVOLUTION.md +8 -6
- package/docs/FUND_MOVEMENT_AND_ACCOUNTING.md +3 -1
- package/docs/GRID_RECONCILE.md +1 -0
- package/docs/LOGGING.md +3 -0
- package/docs/MPA_CREDIT_USAGE.md +3 -1
- package/docs/README.md +2 -2
- package/docs/WORKFLOW.md +3 -1
- package/package.json +2 -1
- package/scripts/README.md +12 -0
|
@@ -3,7 +3,8 @@ import fs from 'node:fs';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import { PATHS } from '../modules/paths.js';
|
|
5
5
|
import { getStorage } from '../modules/storage/index.js';
|
|
6
|
-
const { readJSON } = getStorage();
|
|
6
|
+
const { readJSON, writeJSON } = getStorage();
|
|
7
|
+
import { parseJsonWithComments } from '../modules/order/utils/system.js';
|
|
7
8
|
import { MARKET_ADAPTER } from '../modules/constants.js';
|
|
8
9
|
import { loadMarketProfiles } from './tradingview/tradingview_uplot_chart_generator.js';
|
|
9
10
|
import { sanitizeKey } from '../modules/utils/sanitize_key.js';
|
|
@@ -20,7 +21,14 @@ function loadBotSettings(filePath = PATHS.PROFILES.BOTS_JSON) {
|
|
|
20
21
|
return readJSON(filePath);
|
|
21
22
|
}
|
|
22
23
|
catch (_) {
|
|
23
|
-
|
|
24
|
+
// The bot editor reads/writes through a comment-tolerant parser, so
|
|
25
|
+
// operator comments may legally exist — fall back before giving up.
|
|
26
|
+
try {
|
|
27
|
+
return parseJsonWithComments(fs.readFileSync(filePath, 'utf8'));
|
|
28
|
+
}
|
|
29
|
+
catch (_) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
24
32
|
}
|
|
25
33
|
}
|
|
26
34
|
function computeBotKey(bot, index) {
|
|
@@ -68,6 +76,380 @@ function loadBotMeta(botKey, filePath = PATHS.PROFILES.BOTS_JSON) {
|
|
|
68
76
|
const loose = entries.find((bot) => sanitizeKey(bot?.name) === normalizedKey.replace(/-\d+$/, ''));
|
|
69
77
|
return loose || null;
|
|
70
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* Locate the source span of the entryIndex-th object literal inside the
|
|
81
|
+
* top-level "bots" array of a (possibly comment-bearing) JSON document.
|
|
82
|
+
* Strings and // + block comments are skipped while scanning, so braces
|
|
83
|
+
* inside them never disturb the balance count. Returns null when the
|
|
84
|
+
* document shape is unexpected — callers fall back to a full rewrite.
|
|
85
|
+
*/
|
|
86
|
+
function findBotsEntrySpan(raw, entryIndex) {
|
|
87
|
+
const m = /"bots"\s*:\s*\[/.exec(raw);
|
|
88
|
+
if (!m)
|
|
89
|
+
return null;
|
|
90
|
+
let i = m.index + m[0].length; // just past '['
|
|
91
|
+
const n = raw.length;
|
|
92
|
+
let count = 0;
|
|
93
|
+
const skipWsComments = () => {
|
|
94
|
+
while (i < n) {
|
|
95
|
+
const c = raw[i];
|
|
96
|
+
if (c === ' ' || c === '\t' || c === '\n' || c === '\r') {
|
|
97
|
+
i++;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
if (c === '/' && raw[i + 1] === '/') {
|
|
101
|
+
while (i < n && raw[i] !== '\n')
|
|
102
|
+
i++;
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
if (c === '/' && raw[i + 1] === '*') {
|
|
106
|
+
i += 2;
|
|
107
|
+
while (i < n && !(raw[i] === '*' && raw[i + 1] === '/'))
|
|
108
|
+
i++;
|
|
109
|
+
i += 2;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const skipString = () => {
|
|
116
|
+
const q = raw[i];
|
|
117
|
+
i++;
|
|
118
|
+
while (i < n) {
|
|
119
|
+
const c = raw[i];
|
|
120
|
+
if (c === '\\') {
|
|
121
|
+
i += 2;
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
if (c === q) {
|
|
125
|
+
i++;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
i++;
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
// Skip one JSON value starting at raw[i]; false on malformed input.
|
|
132
|
+
const skipValue = () => {
|
|
133
|
+
skipWsComments();
|
|
134
|
+
if (i >= n)
|
|
135
|
+
return false;
|
|
136
|
+
const c = raw[i];
|
|
137
|
+
if (c === '"' || c === "'") {
|
|
138
|
+
skipString();
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
if (c === '{' || c === '[') {
|
|
142
|
+
const open = c;
|
|
143
|
+
const close = c === '{' ? '}' : ']';
|
|
144
|
+
i++;
|
|
145
|
+
let depth = 1;
|
|
146
|
+
while (i < n && depth > 0) {
|
|
147
|
+
const d = raw[i];
|
|
148
|
+
if (d === '"' || d === "'") {
|
|
149
|
+
skipString();
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
if (d === '/' && raw[i + 1] === '/') {
|
|
153
|
+
while (i < n && raw[i] !== '\n')
|
|
154
|
+
i++;
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (d === '/' && raw[i + 1] === '*') {
|
|
158
|
+
i += 2;
|
|
159
|
+
while (i < n && !(raw[i] === '*' && raw[i + 1] === '/'))
|
|
160
|
+
i++;
|
|
161
|
+
i += 2;
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
if (d === open)
|
|
165
|
+
depth++;
|
|
166
|
+
else if (d === close)
|
|
167
|
+
depth--;
|
|
168
|
+
i++;
|
|
169
|
+
}
|
|
170
|
+
return depth === 0;
|
|
171
|
+
}
|
|
172
|
+
while (i < n && raw[i] !== ',' && raw[i] !== ']' && raw[i] !== '}')
|
|
173
|
+
i++;
|
|
174
|
+
return true;
|
|
175
|
+
};
|
|
176
|
+
for (;;) {
|
|
177
|
+
skipWsComments();
|
|
178
|
+
if (i >= n)
|
|
179
|
+
return null;
|
|
180
|
+
if (raw[i] === ']')
|
|
181
|
+
return null; // array ended before entryIndex
|
|
182
|
+
if (raw[i] === '{') {
|
|
183
|
+
const start = i;
|
|
184
|
+
if (!skipValue())
|
|
185
|
+
return null;
|
|
186
|
+
if (count === entryIndex)
|
|
187
|
+
return { start, end: i };
|
|
188
|
+
count++;
|
|
189
|
+
}
|
|
190
|
+
else if (!skipValue()) {
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
skipWsComments();
|
|
194
|
+
if (i < n && raw[i] === ',') {
|
|
195
|
+
i++;
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (i < n && raw[i] === ']')
|
|
199
|
+
return null;
|
|
200
|
+
return null; // malformed separator
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Locate the string value of a top-level key inside one bot-entry source
|
|
205
|
+
* span. Unlike a regex, this scan skips over // and block comments as well
|
|
206
|
+
* as string literals, so a key-looking fragment inside a comment (e.g.
|
|
207
|
+
* `// "accountId": "1.2.9999" (old)`) can never be mistaken for the real
|
|
208
|
+
* key. Returns the span of the quoted value (including quotes), or null
|
|
209
|
+
* when the key is absent or its value is not a string.
|
|
210
|
+
*/
|
|
211
|
+
function findEntryKeyValueSpan(entrySrc, key) {
|
|
212
|
+
const n = entrySrc.length;
|
|
213
|
+
const isWs = (c) => c === ' ' || c === '\t' || c === '\n' || c === '\r';
|
|
214
|
+
let i = 0;
|
|
215
|
+
let depth = 0;
|
|
216
|
+
while (i < n) {
|
|
217
|
+
const c = entrySrc[i];
|
|
218
|
+
if (isWs(c)) {
|
|
219
|
+
i++;
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
if (c === '/' && entrySrc[i + 1] === '/') {
|
|
223
|
+
while (i < n && entrySrc[i] !== '\n')
|
|
224
|
+
i++;
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
if (c === '/' && entrySrc[i + 1] === '*') {
|
|
228
|
+
i += 2;
|
|
229
|
+
while (i < n && !(entrySrc[i] === '*' && entrySrc[i + 1] === '/'))
|
|
230
|
+
i++;
|
|
231
|
+
i += 2;
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
if (c === '{' || c === '[') {
|
|
235
|
+
depth++;
|
|
236
|
+
i++;
|
|
237
|
+
continue;
|
|
238
|
+
}
|
|
239
|
+
if (c === '}' || c === ']') {
|
|
240
|
+
depth--;
|
|
241
|
+
i++;
|
|
242
|
+
continue;
|
|
243
|
+
}
|
|
244
|
+
if (c !== '"') {
|
|
245
|
+
i++;
|
|
246
|
+
continue;
|
|
247
|
+
}
|
|
248
|
+
// String literal: read it (honoring backslash escapes).
|
|
249
|
+
let j = i + 1;
|
|
250
|
+
let str = '';
|
|
251
|
+
while (j < n) {
|
|
252
|
+
const d = entrySrc[j];
|
|
253
|
+
if (d === '\\') {
|
|
254
|
+
str += entrySrc.slice(j, j + 2);
|
|
255
|
+
j += 2;
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
if (d === '"')
|
|
259
|
+
break;
|
|
260
|
+
str += d;
|
|
261
|
+
j++;
|
|
262
|
+
}
|
|
263
|
+
if (j >= n)
|
|
264
|
+
return null;
|
|
265
|
+
const closingQuote = j;
|
|
266
|
+
if (depth !== 1 || str !== key) {
|
|
267
|
+
i = closingQuote + 1;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
// Candidate key at top level: expect `:` then a quoted value.
|
|
271
|
+
let k = closingQuote + 1;
|
|
272
|
+
while (k < n && isWs(entrySrc[k]))
|
|
273
|
+
k++;
|
|
274
|
+
if (entrySrc[k] !== ':') {
|
|
275
|
+
i = closingQuote + 1;
|
|
276
|
+
continue;
|
|
277
|
+
}
|
|
278
|
+
k++;
|
|
279
|
+
while (k < n && isWs(entrySrc[k]))
|
|
280
|
+
k++;
|
|
281
|
+
if (entrySrc[k] !== '"') {
|
|
282
|
+
i = closingQuote + 1;
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
let m = k + 1;
|
|
286
|
+
while (m < n) {
|
|
287
|
+
const e = entrySrc[m];
|
|
288
|
+
if (e === '\\') {
|
|
289
|
+
m += 2;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (e === '"')
|
|
293
|
+
return { valueStart: k, valueEnd: m + 1 };
|
|
294
|
+
m++;
|
|
295
|
+
}
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
return null;
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Byte-preserving accountId update: replaces the value in place, or inserts
|
|
302
|
+
* `"accountId"` right after `"preferredAccount"` keeping the line indent, so
|
|
303
|
+
* comments, key order and formatting elsewhere in the file survive. The
|
|
304
|
+
* patched document is re-parsed (comments allowed) and the value asserted
|
|
305
|
+
* before the atomic tmp+rename write. Returns false on any uncertainty —
|
|
306
|
+
* callers fall back to a full rewrite.
|
|
307
|
+
*/
|
|
308
|
+
function patchAccountIdInRaw(filePath, entryIndex, accountId) {
|
|
309
|
+
let raw;
|
|
310
|
+
try {
|
|
311
|
+
raw = fs.readFileSync(filePath, 'utf8');
|
|
312
|
+
}
|
|
313
|
+
catch (_) {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
const span = findBotsEntrySpan(raw, entryIndex);
|
|
317
|
+
if (!span)
|
|
318
|
+
return false;
|
|
319
|
+
const entrySrc = raw.slice(span.start, span.end);
|
|
320
|
+
let patchedEntry = null;
|
|
321
|
+
const idSpan = findEntryKeyValueSpan(entrySrc, 'accountId');
|
|
322
|
+
if (idSpan) {
|
|
323
|
+
patchedEntry = entrySrc.slice(0, idSpan.valueStart)
|
|
324
|
+
+ `"${accountId}"`
|
|
325
|
+
+ entrySrc.slice(idSpan.valueEnd);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
const prefSpan = findEntryKeyValueSpan(entrySrc, 'preferredAccount');
|
|
329
|
+
if (!prefSpan)
|
|
330
|
+
return false;
|
|
331
|
+
const lineStart = entrySrc.lastIndexOf('\n', prefSpan.valueEnd) + 1;
|
|
332
|
+
const indentMatch = /^[ \t]*/.exec(entrySrc.slice(lineStart));
|
|
333
|
+
const indent = indentMatch ? indentMatch[0] : ' ';
|
|
334
|
+
patchedEntry = entrySrc.slice(0, prefSpan.valueEnd)
|
|
335
|
+
+ `,\n${indent}"accountId": "${accountId}"`
|
|
336
|
+
+ entrySrc.slice(prefSpan.valueEnd);
|
|
337
|
+
}
|
|
338
|
+
if (!patchedEntry || patchedEntry === entrySrc)
|
|
339
|
+
return false;
|
|
340
|
+
const patched = raw.slice(0, span.start) + patchedEntry + raw.slice(span.end);
|
|
341
|
+
try {
|
|
342
|
+
const reparsed = parseJsonWithComments(patched);
|
|
343
|
+
const checkEntries = Array.isArray(reparsed?.bots) ? reparsed.bots : [];
|
|
344
|
+
if (checkEntries[entryIndex]?.accountId !== accountId)
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
catch (_) {
|
|
348
|
+
return false;
|
|
349
|
+
}
|
|
350
|
+
const tmpPath = `${filePath}.tmp-persist-${process.pid}-${Date.now()}`;
|
|
351
|
+
try {
|
|
352
|
+
fs.writeFileSync(tmpPath, patched, 'utf8');
|
|
353
|
+
fs.renameSync(tmpPath, filePath);
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
catch (_) {
|
|
357
|
+
try {
|
|
358
|
+
fs.unlinkSync(tmpPath);
|
|
359
|
+
}
|
|
360
|
+
catch (_) { /* best-effort cleanup */ }
|
|
361
|
+
return false;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Persist a resolved account name → ID mapping onto the bot entry in
|
|
366
|
+
* profiles/bots.json (`accountId` next to `preferredAccount`), so analysis
|
|
367
|
+
* tools can skip the chain lookup on subsequent runs. No-op when the stored
|
|
368
|
+
* value already matches. Prefers a byte-preserving textual patch (comments,
|
|
369
|
+
* key order and formatting survive); falls back to a full rewrite using the
|
|
370
|
+
* same atomic writeJSON serialization the bot editor uses. Returns true when
|
|
371
|
+
* the file was updated.
|
|
372
|
+
*/
|
|
373
|
+
function persistBotAccountId(botKey, accountId, filePath = PATHS.PROFILES.BOTS_JSON) {
|
|
374
|
+
if (!botKey || !/^1\.2\.\d+$/.test(String(accountId)))
|
|
375
|
+
return false;
|
|
376
|
+
let settings = null;
|
|
377
|
+
try {
|
|
378
|
+
settings = loadBotSettings(filePath);
|
|
379
|
+
}
|
|
380
|
+
catch (_) {
|
|
381
|
+
return false;
|
|
382
|
+
}
|
|
383
|
+
const entries = Array.isArray(settings?.bots) ? settings.bots : [];
|
|
384
|
+
const normalizedKey = String(botKey).toLowerCase();
|
|
385
|
+
const index = entries.findIndex((bot, i) => computeBotKey(bot, i) === normalizedKey);
|
|
386
|
+
if (index < 0 || entries[index]?.accountId === accountId)
|
|
387
|
+
return false;
|
|
388
|
+
try {
|
|
389
|
+
if (patchAccountIdInRaw(filePath, index, String(accountId)))
|
|
390
|
+
return true;
|
|
391
|
+
}
|
|
392
|
+
catch (_) {
|
|
393
|
+
// Fall through to the full rewrite below.
|
|
394
|
+
}
|
|
395
|
+
entries[index].accountId = String(accountId);
|
|
396
|
+
try {
|
|
397
|
+
writeJSON(filePath, settings);
|
|
398
|
+
return true;
|
|
399
|
+
}
|
|
400
|
+
catch (_) {
|
|
401
|
+
return false;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Return the stored chain account ID for a bot key, or null when none is
|
|
406
|
+
* stamped yet. When expectedRef is given, the stored ID is only returned if
|
|
407
|
+
* the entry's current preferredAccount still matches it — a rename must
|
|
408
|
+
* never silently reuse a stale ID.
|
|
409
|
+
*/
|
|
410
|
+
function getStoredBotAccountId(botKey, expectedRef, filePath = PATHS.PROFILES.BOTS_JSON) {
|
|
411
|
+
if (!botKey)
|
|
412
|
+
return null;
|
|
413
|
+
let meta = null;
|
|
414
|
+
try {
|
|
415
|
+
meta = loadBotMeta(botKey, filePath);
|
|
416
|
+
}
|
|
417
|
+
catch (_) {
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
const stored = meta && /^1\.2\.\d+$/.test(String(meta.accountId ?? '')) ? String(meta.accountId) : null;
|
|
421
|
+
if (!stored)
|
|
422
|
+
return null;
|
|
423
|
+
if (expectedRef != null && String(meta.preferredAccount ?? '').toLowerCase() !== String(expectedRef).toLowerCase())
|
|
424
|
+
return null;
|
|
425
|
+
return stored;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* Find the bot entry whose preferredAccount matches a raw account reference
|
|
429
|
+
* (case-insensitive). Used by tools that accept a bare account name to locate
|
|
430
|
+
* the stored accountId and the persist target. Returns null for 1.2.x input
|
|
431
|
+
* or when no bot claims the name.
|
|
432
|
+
*/
|
|
433
|
+
function findBotKeyByAccountRef(ref, filePath = PATHS.PROFILES.BOTS_JSON) {
|
|
434
|
+
if (!ref || /^1\.2\.\d+$/.test(String(ref)))
|
|
435
|
+
return null;
|
|
436
|
+
let settings = null;
|
|
437
|
+
try {
|
|
438
|
+
settings = loadBotSettings(filePath);
|
|
439
|
+
}
|
|
440
|
+
catch (_) {
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
const entries = Array.isArray(settings?.bots) ? settings.bots : [];
|
|
444
|
+
const want = String(ref).toLowerCase();
|
|
445
|
+
for (let i = 0; i < entries.length; i++) {
|
|
446
|
+
const entry = entries[i];
|
|
447
|
+
if (entry && String(entry.preferredAccount ?? '').toLowerCase() === want) {
|
|
448
|
+
return { botKey: computeBotKey(entry, i), meta: entry };
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
return null;
|
|
452
|
+
}
|
|
71
453
|
function resolveAmaConfig(botKey) {
|
|
72
454
|
const botMeta = loadBotMeta(botKey);
|
|
73
455
|
// Unknown bot key: fall back to the global erSmoothPeriod default (same
|
|
@@ -152,5 +534,5 @@ function resolveAmaKey(botKey) {
|
|
|
152
534
|
}
|
|
153
535
|
return 'AMA3';
|
|
154
536
|
}
|
|
155
|
-
export { loadBotSettings, sanitizeKey, computeBotKey, resolveBotKey, candleFileForBot, resolveCandleFile, loadBotMeta, resolveAmaConfig, resolveAmaKey };
|
|
537
|
+
export { loadBotSettings, sanitizeKey, computeBotKey, resolveBotKey, candleFileForBot, resolveCandleFile, loadBotMeta, getStoredBotAccountId, findBotKeyByAccountRef, persistBotAccountId, resolveAmaConfig, resolveAmaKey };
|
|
156
538
|
//# sourceMappingURL=bot_key_utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bot_key_utils.js","sourceRoot":"","sources":["../../analysis/bot_key_utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bot_key_utils.js","sourceRoot":"","sources":["../../analysis/bot_key_utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,12 +15,16 @@ const { writeJSON } = getStorage();
|
|
|
15
15
|
* Q1 — top 100 accounts by limit_order_create count
|
|
16
16
|
* Q2 — top 100 accounts by limit_order_cancel count
|
|
17
17
|
* Q3 — top 100 accounts by fill_order count
|
|
18
|
+
* Q4 — top 200 accounts by limit_order_update count (op 77, DEXBot2 fingerprint)
|
|
18
19
|
* 2. Merge & pre-filter:
|
|
19
20
|
* creates ≥ MIN_CREATES (grid analysis determines DEXBot candidacy)
|
|
20
21
|
* 3. Grid analysis (parallel, batches of 5):
|
|
21
22
|
* Fetch 200 raw orders per candidate → per-session geometric spacing test
|
|
22
23
|
* 4. BitShares: resolve account IDs → names (batch db.get_objects call)
|
|
23
|
-
* 5. Rank by DEX score and print table
|
|
24
|
+
* 5. Rank by DEX score and print table.
|
|
25
|
+
* HIGH tier (80+) is split by op-77 usage:
|
|
26
|
+
* updates ≥ 1 → DEXBot2 (native limit_order_update in-place re-price)
|
|
27
|
+
* updates = 0 → DEXBot1-style (cancel-only, cancel + recreate)
|
|
24
28
|
*
|
|
25
29
|
* Usage:
|
|
26
30
|
* node dist/analysis/bot_usage/discover_bot_accounts.js
|
|
@@ -41,7 +45,7 @@ const { writeJSON } = getStorage();
|
|
|
41
45
|
* --verbose Print extra debug/diagnostic info
|
|
42
46
|
* --help, -h Show this help
|
|
43
47
|
*/
|
|
44
|
-
import { kibanaSearch, buildOrderPriceQuery, buildTopSellerAccountsQuery, buildTopCancellerAccountsQuery, buildTopFilledAccountsQuery, DEFAULT_CONFIG, } from './kibana_bot_queries.js';
|
|
48
|
+
import { kibanaSearch, buildOrderPriceQuery, buildTopSellerAccountsQuery, buildTopCancellerAccountsQuery, buildTopFilledAccountsQuery, buildTopUpdaterAccountsQuery, DEFAULT_CONFIG, } from './kibana_bot_queries.js';
|
|
45
49
|
import { NODE_MANAGEMENT } from '../../modules/constants.js';
|
|
46
50
|
// ─── Configuration ────────────────────────────────────────────────────────────
|
|
47
51
|
// Node pool from central node management (failover-capable) instead of a
|
|
@@ -287,14 +291,16 @@ async function run() {
|
|
|
287
291
|
console.log('');
|
|
288
292
|
// ── Phase 1: Discovery queries ─────────────────────────────────────────────
|
|
289
293
|
console.log('Phase 1: Querying Kibana for top active accounts...');
|
|
290
|
-
const [createRes, cancelRes, fillRes] = await Promise.all([
|
|
294
|
+
const [createRes, cancelRes, fillRes, updateRes] = await Promise.all([
|
|
291
295
|
withRetry(() => kibanaSearch(KIBANA_CFG, buildTopSellerAccountsQuery(lookbackH, 200, opts.minCreates)), 'top-seller query'),
|
|
292
296
|
withRetry(() => kibanaSearch(KIBANA_CFG, buildTopCancellerAccountsQuery(lookbackH, 200, 5)), 'top-canceller query'),
|
|
293
297
|
withRetry(() => kibanaSearch(KIBANA_CFG, buildTopFilledAccountsQuery(lookbackH, 200, 3)), 'top-fills query'),
|
|
298
|
+
withRetry(() => kibanaSearch(KIBANA_CFG, buildTopUpdaterAccountsQuery(lookbackH, 200, 1)), 'top-updater query'),
|
|
294
299
|
]);
|
|
295
300
|
const createBuckets = createRes?.aggregations?.by_account?.buckets ?? [];
|
|
296
301
|
const cancelBuckets = cancelRes?.aggregations?.by_account?.buckets ?? [];
|
|
297
302
|
const fillBuckets = fillRes?.aggregations?.by_account?.buckets ?? [];
|
|
303
|
+
const updateBuckets = updateRes?.aggregations?.by_account?.buckets ?? [];
|
|
298
304
|
if (opts.verbose) {
|
|
299
305
|
console.log(` [verbose] createRes keys: ${Object.keys(createRes ?? {}).join(', ')}`);
|
|
300
306
|
console.log(` [verbose] createRes took: ${createRes?.took ?? '?'}ms`);
|
|
@@ -302,6 +308,7 @@ async function run() {
|
|
|
302
308
|
console.log(` Creates: ${createBuckets.length} accounts with ≥${opts.minCreates} creates`);
|
|
303
309
|
console.log(` Cancels: ${cancelBuckets.length} accounts with ≥5 cancels`);
|
|
304
310
|
console.log(` Fills: ${fillBuckets.length} accounts with ≥3 fills`);
|
|
311
|
+
console.log(` Updates: ${updateBuckets.length} accounts with ≥1 limit_order_update (op 77)`);
|
|
305
312
|
if (createBuckets.length === 0) {
|
|
306
313
|
console.log('');
|
|
307
314
|
console.log(' No accounts found. Try a larger --days window or lower --min-creates.');
|
|
@@ -315,18 +322,25 @@ async function run() {
|
|
|
315
322
|
console.log('\nPhase 2: Merging and filtering candidates...');
|
|
316
323
|
const accounts = {};
|
|
317
324
|
for (const b of createBuckets)
|
|
318
|
-
accounts[b.key] = { creates: b.doc_count, cancels: 0, fills: 0 };
|
|
325
|
+
accounts[b.key] = { creates: b.doc_count, cancels: 0, fills: 0, updates: 0 };
|
|
319
326
|
for (const b of cancelBuckets) {
|
|
320
327
|
if (!accounts[b.key])
|
|
321
|
-
accounts[b.key] = { creates: 0, cancels: 0, fills: 0 };
|
|
328
|
+
accounts[b.key] = { creates: 0, cancels: 0, fills: 0, updates: 0 };
|
|
322
329
|
accounts[b.key].cancels = b.doc_count;
|
|
323
330
|
}
|
|
324
331
|
for (const b of fillBuckets) {
|
|
325
332
|
if (!accounts[b.key])
|
|
326
|
-
accounts[b.key] = { creates: 0, cancels: 0, fills: 0 };
|
|
333
|
+
accounts[b.key] = { creates: 0, cancels: 0, fills: 0, updates: 0 };
|
|
327
334
|
accounts[b.key].fills = b.doc_count;
|
|
328
335
|
}
|
|
336
|
+
for (const b of updateBuckets) {
|
|
337
|
+
if (!accounts[b.key])
|
|
338
|
+
accounts[b.key] = { creates: 0, cancels: 0, fills: 0, updates: 0 };
|
|
339
|
+
accounts[b.key].updates = b.doc_count;
|
|
340
|
+
}
|
|
329
341
|
// Pre-filter: must have creates ≥ minCreates (grid analysis determines DEXBot candidacy)
|
|
342
|
+
// Flavor: any limit_order_update (op 77) in-window → DEXBot2 (native in-place
|
|
343
|
+
// re-price); zero updates → DEXBot1-style (cancel-only: cancel + recreate).
|
|
330
344
|
const candidates = Object.entries(accounts)
|
|
331
345
|
.filter(([, s]) => s.creates >= opts.minCreates)
|
|
332
346
|
.map(([id, s]) => ({
|
|
@@ -334,6 +348,8 @@ async function run() {
|
|
|
334
348
|
creates: s.creates,
|
|
335
349
|
cancels: s.cancels,
|
|
336
350
|
fills: s.fills,
|
|
351
|
+
updates: s.updates,
|
|
352
|
+
flavor: (s.updates >= 1 ? 'DEXBot2' : 'DEXBot1'),
|
|
337
353
|
cancelRatio: s.cancels / Math.max(s.creates, 1),
|
|
338
354
|
fillRate: s.creates > 0 ? (s.fills / s.creates * 100) : 0,
|
|
339
355
|
}))
|
|
@@ -419,9 +435,40 @@ async function run() {
|
|
|
419
435
|
console.log(' Discovery Results — Ranked by DEX Score');
|
|
420
436
|
console.log('════════════════════════════════════════════════════════════════════════════════════');
|
|
421
437
|
console.log('');
|
|
422
|
-
// Print by DEX score tier
|
|
438
|
+
// Print by DEX score tier. HIGH tier (80+) splits by update-order usage:
|
|
439
|
+
// DEXBot2 — broadcast limit_order_update (op 77) in-window (in-place re-price)
|
|
440
|
+
// DEXBot1-style — cancel-only, no op 77 (cancel + recreate)
|
|
441
|
+
const highV2 = results.filter(r => r.dexScore >= 80 && r.updates >= 1);
|
|
442
|
+
const highV1 = results.filter(r => r.dexScore >= 80 && r.updates < 1);
|
|
443
|
+
const hdrHigh = ' # Name ID Creates Fills Cancel Fill% C/C MaxBatch Incr% Grid DEX Updates';
|
|
444
|
+
function printHighGroup(label, rows) {
|
|
445
|
+
if (!rows.length)
|
|
446
|
+
return;
|
|
447
|
+
console.log(` ── ${label}`);
|
|
448
|
+
console.log('');
|
|
449
|
+
console.log(hdrHigh);
|
|
450
|
+
console.log(' ' + '─'.repeat(hdrHigh.length - 1));
|
|
451
|
+
for (const r of rows) {
|
|
452
|
+
const rank = String(results.indexOf(r) + 1).padStart(2);
|
|
453
|
+
const name = r.name.padEnd(22).slice(0, 22);
|
|
454
|
+
const id = r.id.padEnd(14);
|
|
455
|
+
const creates = String(r.creates).padStart(7);
|
|
456
|
+
const fills = String(r.fills).padStart(6);
|
|
457
|
+
const cancels = String(r.cancels).padStart(7);
|
|
458
|
+
const fr = (r.fillRate.toFixed(1) + '%').padStart(5);
|
|
459
|
+
const cr = r.cancelRatio.toFixed(2).padStart(4);
|
|
460
|
+
const batch = String(r.maxBatch || '-').padStart(9);
|
|
461
|
+
const inc = (r.impliedInc != null ? r.impliedInc.toFixed(2) + '%' : 'n/a').padStart(6);
|
|
462
|
+
const grid = String(r.gridScore).padStart(5);
|
|
463
|
+
const dex = String(r.dexScore).padStart(4);
|
|
464
|
+
const upd = String(r.updates).padStart(7);
|
|
465
|
+
console.log(` ${rank} ${name} ${id} ${creates} ${fills} ${cancels} ${fr} ${cr} ${batch} ${inc} ${grid} ${dex} ${upd}`);
|
|
466
|
+
}
|
|
467
|
+
console.log('');
|
|
468
|
+
}
|
|
469
|
+
printHighGroup('HIGH confidence — DEXBot2 (80+, uses limit_order_update op 77)', highV2);
|
|
470
|
+
printHighGroup('HIGH confidence — DEXBot1-style (80+, cancel-only, no op 77)', highV1);
|
|
423
471
|
const tiers = [
|
|
424
|
-
{ label: 'HIGH confidence (80+) — almost certainly DEXBot/DEXBot2', min: 80, max: 101 },
|
|
425
472
|
{ label: 'MEDIUM confidence (50–79) — likely a grid bot', min: 50, max: 80 },
|
|
426
473
|
{ label: 'LOW confidence (25–49) — some automation detected', min: 25, max: 50 },
|
|
427
474
|
{ label: 'WEAK signal (<25) — create/cancel pattern, no grid', min: 0, max: 25 },
|
|
@@ -453,12 +500,12 @@ async function run() {
|
|
|
453
500
|
console.log('');
|
|
454
501
|
}
|
|
455
502
|
// ── Summary ───────────────────────────────────────────────────────────────
|
|
456
|
-
const high =
|
|
503
|
+
const high = highV2.length + highV1.length;
|
|
457
504
|
const medium = results.filter(r => r.dexScore >= 50 && r.dexScore < 80).length;
|
|
458
505
|
const low = results.filter(r => r.dexScore >= 25 && r.dexScore < 50).length;
|
|
459
506
|
console.log('════════════════════════════════════════════════════════════════════════════════════');
|
|
460
507
|
console.log(` Total candidates scanned: ${results.length}`);
|
|
461
|
-
console.log(` HIGH (80+): ${high} accounts —
|
|
508
|
+
console.log(` HIGH (80+): ${high} accounts — DEXBot2: ${highV2.length} (op 77 updates) / DEXBot1-style: ${highV1.length} (cancel-only)`);
|
|
462
509
|
console.log(` MEDIUM (50+): ${medium} accounts — likely grid bots`);
|
|
463
510
|
console.log(` LOW (25+): ${low} accounts — weak signal`);
|
|
464
511
|
console.log('');
|
|
@@ -466,15 +513,18 @@ async function run() {
|
|
|
466
513
|
console.log(' C/C = cancel/create ratio (grid bots: ~1.0)');
|
|
467
514
|
console.log(' Incr% = implied grid increment from price spacing');
|
|
468
515
|
console.log(' Grid = grid quality 0-100 | DEX = DEXBot confidence 0-100');
|
|
516
|
+
console.log(' Updates = limit_order_update (op 77) count — DEXBot2 only; 0 = cancel-only (DEXBot1-style)');
|
|
469
517
|
console.log('');
|
|
470
518
|
// ── Export JSON ────────────────────────────────────────────────────────────
|
|
471
519
|
if (opts.outputJson) {
|
|
472
520
|
const exportData = results.map(r => ({
|
|
473
521
|
id: r.id,
|
|
474
522
|
name: r.name,
|
|
523
|
+
flavor: r.flavor,
|
|
475
524
|
creates: r.creates,
|
|
476
525
|
fills: r.fills,
|
|
477
526
|
cancels: r.cancels,
|
|
527
|
+
updates: r.updates,
|
|
478
528
|
fillPct: r.fillRate,
|
|
479
529
|
cancelRatio: r.cancelRatio,
|
|
480
530
|
maxBatch: r.maxBatch,
|