hedgequantx 2.6.163 → 2.7.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 +15 -88
- package/bin/cli.js +0 -11
- package/dist/lib/api.jsc +0 -0
- package/dist/lib/api2.jsc +0 -0
- package/dist/lib/core.jsc +0 -0
- package/dist/lib/core2.jsc +0 -0
- package/dist/lib/data.js +1 -1
- package/dist/lib/data.jsc +0 -0
- package/dist/lib/data2.jsc +0 -0
- package/dist/lib/decoder.jsc +0 -0
- package/dist/lib/m/mod1.jsc +0 -0
- package/dist/lib/m/mod2.jsc +0 -0
- package/dist/lib/n/r1.jsc +0 -0
- package/dist/lib/n/r2.jsc +0 -0
- package/dist/lib/n/r3.jsc +0 -0
- package/dist/lib/n/r4.jsc +0 -0
- package/dist/lib/n/r5.jsc +0 -0
- package/dist/lib/n/r6.jsc +0 -0
- package/dist/lib/n/r7.jsc +0 -0
- package/dist/lib/o/util1.jsc +0 -0
- package/dist/lib/o/util2.jsc +0 -0
- package/package.json +8 -5
- package/src/app.js +40 -162
- package/src/config/constants.js +31 -33
- package/src/config/propfirms.js +13 -217
- package/src/config/settings.js +0 -43
- package/src/lib/api.js +198 -0
- package/src/lib/api2.js +353 -0
- package/src/lib/core.js +539 -0
- package/src/lib/core2.js +341 -0
- package/src/lib/data.js +555 -0
- package/src/lib/data2.js +492 -0
- package/src/lib/decoder.js +599 -0
- package/src/lib/m/s1.js +804 -0
- package/src/lib/m/s2.js +34 -0
- package/src/lib/n/r1.js +454 -0
- package/src/lib/n/r2.js +514 -0
- package/src/lib/n/r3.js +631 -0
- package/src/lib/n/r4.js +401 -0
- package/src/lib/n/r5.js +335 -0
- package/src/lib/n/r6.js +425 -0
- package/src/lib/n/r7.js +530 -0
- package/src/lib/o/l1.js +44 -0
- package/src/lib/o/l2.js +427 -0
- package/src/lib/python-bridge.js +206 -0
- package/src/menus/connect.js +14 -176
- package/src/menus/dashboard.js +65 -110
- package/src/pages/accounts.js +18 -18
- package/src/pages/algo/copy-trading.js +210 -240
- package/src/pages/algo/index.js +41 -104
- package/src/pages/algo/one-account.js +386 -33
- package/src/pages/algo/ui.js +312 -151
- package/src/pages/orders.js +3 -3
- package/src/pages/positions.js +3 -3
- package/src/pages/stats/chart.js +74 -0
- package/src/pages/stats/display.js +228 -0
- package/src/pages/stats/index.js +236 -0
- package/src/pages/stats/metrics.js +213 -0
- package/src/pages/user.js +6 -6
- package/src/services/hqx-server/constants.js +55 -0
- package/src/services/hqx-server/index.js +401 -0
- package/src/services/hqx-server/latency.js +81 -0
- package/src/services/index.js +12 -3
- package/src/services/rithmic/accounts.js +7 -32
- package/src/services/rithmic/connection.js +1 -204
- package/src/services/rithmic/contracts.js +116 -99
- package/src/services/rithmic/handlers.js +21 -196
- package/src/services/rithmic/index.js +63 -120
- package/src/services/rithmic/market.js +31 -0
- package/src/services/rithmic/orders.js +5 -111
- package/src/services/rithmic/protobuf.js +384 -138
- package/src/services/session.js +22 -173
- package/src/ui/box.js +10 -18
- package/src/ui/index.js +1 -3
- package/src/ui/menu.js +1 -1
- package/src/utils/prompts.js +2 -2
- package/dist/lib/m/s1.js +0 -1
- package/src/menus/ai-agent-connect.js +0 -181
- package/src/menus/ai-agent-models.js +0 -219
- package/src/menus/ai-agent-oauth.js +0 -292
- package/src/menus/ai-agent-ui.js +0 -141
- package/src/menus/ai-agent.js +0 -484
- package/src/pages/algo/algo-config.js +0 -195
- package/src/pages/algo/algo-multi.js +0 -801
- package/src/pages/algo/algo-utils.js +0 -58
- package/src/pages/algo/copy-engine.js +0 -449
- package/src/pages/algo/custom-strategy.js +0 -459
- package/src/pages/algo/logger.js +0 -245
- package/src/pages/algo/smart-logs-data.js +0 -218
- package/src/pages/algo/smart-logs.js +0 -387
- package/src/pages/algo/ui-constants.js +0 -144
- package/src/pages/algo/ui-summary.js +0 -184
- package/src/pages/stats-calculations.js +0 -191
- package/src/pages/stats-ui.js +0 -381
- package/src/pages/stats.js +0 -339
- package/src/services/ai/client-analysis.js +0 -194
- package/src/services/ai/client-models.js +0 -333
- package/src/services/ai/client.js +0 -343
- package/src/services/ai/index.js +0 -384
- package/src/services/ai/oauth-anthropic.js +0 -265
- package/src/services/ai/oauth-gemini.js +0 -223
- package/src/services/ai/oauth-iflow.js +0 -269
- package/src/services/ai/oauth-openai.js +0 -233
- package/src/services/ai/oauth-qwen.js +0 -279
- package/src/services/ai/providers/direct-providers.js +0 -323
- package/src/services/ai/providers/index.js +0 -62
- package/src/services/ai/providers/other-providers.js +0 -104
- package/src/services/ai/proxy-install.js +0 -249
- package/src/services/ai/proxy-manager.js +0 -494
- package/src/services/ai/proxy-remote.js +0 -161
- package/src/services/ai/strategy-supervisor.js +0 -1312
- package/src/services/ai/supervisor-data.js +0 -195
- package/src/services/ai/supervisor-optimize.js +0 -215
- package/src/services/ai/supervisor-sync.js +0 -178
- package/src/services/ai/supervisor-utils.js +0 -158
- package/src/services/ai/supervisor.js +0 -484
- package/src/services/ai/validation.js +0 -250
- package/src/services/hqx-server-events.js +0 -110
- package/src/services/hqx-server-handlers.js +0 -217
- package/src/services/hqx-server-latency.js +0 -136
- package/src/services/hqx-server.js +0 -403
- package/src/services/position-constants.js +0 -28
- package/src/services/position-exit-logic.js +0 -174
- package/src/services/position-manager.js +0 -438
- package/src/services/position-momentum.js +0 -206
- package/src/services/projectx/accounts.js +0 -142
- package/src/services/projectx/index.js +0 -443
- package/src/services/projectx/market.js +0 -172
- package/src/services/projectx/stats.js +0 -110
- package/src/services/projectx/trading.js +0 -180
- package/src/services/rithmic/latency-tracker.js +0 -182
- package/src/services/rithmic/market-data-decoders.js +0 -229
- package/src/services/rithmic/market-data.js +0 -272
- package/src/services/rithmic/orders-fast.js +0 -246
- package/src/services/rithmic/proto-decoders.js +0 -403
- package/src/services/rithmic/specs.js +0 -146
- package/src/services/rithmic/trade-history.js +0 -254
- package/src/services/session-history.js +0 -475
- package/src/services/strategy/hft-signal-calc.js +0 -147
- package/src/services/strategy/hft-tick.js +0 -407
- package/src/services/strategy/recovery-math.js +0 -402
- package/src/services/tradovate/constants.js +0 -109
- package/src/services/tradovate/index.js +0 -392
- package/src/services/tradovate/market.js +0 -47
- package/src/services/tradovate/orders.js +0 -145
- package/src/services/tradovate/websocket.js +0 -97
package/src/app.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview Main application router
|
|
2
|
+
* @fileoverview Main application router - Rithmic Only
|
|
3
3
|
* @module app
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -19,24 +19,13 @@ const { showAccounts } = require('./pages/accounts');
|
|
|
19
19
|
const { algoTradingMenu } = require('./pages/algo');
|
|
20
20
|
|
|
21
21
|
// Menus
|
|
22
|
-
const {
|
|
23
|
-
projectXMenu,
|
|
24
|
-
rithmicMenu,
|
|
25
|
-
tradovateMenu,
|
|
26
|
-
addPropAccountMenu,
|
|
27
|
-
dashboardMenu,
|
|
28
|
-
handleUpdate,
|
|
29
|
-
} = require('./menus');
|
|
30
|
-
const { aiAgentMenu } = require('./menus/ai-agent');
|
|
22
|
+
const { rithmicMenu, dashboardMenu, handleUpdate } = require('./menus');
|
|
31
23
|
|
|
32
24
|
/** @type {Object|null} */
|
|
33
25
|
let currentService = null;
|
|
34
26
|
|
|
35
27
|
// ==================== TERMINAL ====================
|
|
36
28
|
|
|
37
|
-
/**
|
|
38
|
-
* Restore terminal state
|
|
39
|
-
*/
|
|
40
29
|
const restoreTerminal = () => {
|
|
41
30
|
try {
|
|
42
31
|
process.stdout.write('\x1B[?1049l');
|
|
@@ -50,7 +39,6 @@ const restoreTerminal = () => {
|
|
|
50
39
|
}
|
|
51
40
|
};
|
|
52
41
|
|
|
53
|
-
// Signal handlers
|
|
54
42
|
process.on('exit', restoreTerminal);
|
|
55
43
|
process.on('SIGINT', () => { restoreTerminal(); process.exit(0); });
|
|
56
44
|
process.on('SIGTERM', () => { restoreTerminal(); process.exit(0); });
|
|
@@ -71,9 +59,6 @@ process.on('unhandledRejection', (reason) => {
|
|
|
71
59
|
|
|
72
60
|
// ==================== STATS ====================
|
|
73
61
|
|
|
74
|
-
/**
|
|
75
|
-
* Refresh cached stats from all connections
|
|
76
|
-
*/
|
|
77
62
|
const refreshStats = async () => {
|
|
78
63
|
if (connections.count() === 0) {
|
|
79
64
|
clearCachedStats();
|
|
@@ -114,45 +99,9 @@ const refreshStats = async () => {
|
|
|
114
99
|
|
|
115
100
|
// ==================== BANNER ====================
|
|
116
101
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
* @param {boolean} [clear=true] - Whether to clear screen first
|
|
120
|
-
*/
|
|
121
|
-
const banner = async (clear = true) => {
|
|
122
|
-
if (clear) console.clear();
|
|
123
|
-
|
|
124
|
-
const termWidth = process.stdout.columns || 100;
|
|
125
|
-
const isMobile = termWidth < 60;
|
|
126
|
-
const boxWidth = isMobile ? Math.max(termWidth - 2, 40) : Math.max(getLogoWidth(), 98);
|
|
127
|
-
const innerWidth = boxWidth - 2;
|
|
128
|
-
const version = require('../package.json').version;
|
|
129
|
-
|
|
130
|
-
console.log(chalk.cyan('╔' + '═'.repeat(innerWidth) + '╗'));
|
|
131
|
-
|
|
132
|
-
// Logo
|
|
133
|
-
const logoLines = isMobile ? getMobileLogo() : getFullLogo();
|
|
134
|
-
|
|
135
|
-
for (const [hq, x] of logoLines) {
|
|
136
|
-
const fullLine = chalk.cyan(hq) + chalk.yellow(x);
|
|
137
|
-
const totalLen = hq.length + x.length;
|
|
138
|
-
const padding = innerWidth - totalLen;
|
|
139
|
-
const leftPad = Math.floor(padding / 2);
|
|
140
|
-
console.log(chalk.cyan('║') + ' '.repeat(leftPad) + fullLine + ' '.repeat(padding - leftPad) + chalk.cyan('║'));
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
console.log(chalk.cyan('╠' + '═'.repeat(innerWidth) + '╣'));
|
|
144
|
-
|
|
145
|
-
const tagline = isMobile ? `HQX v${version}` : `PROP FUTURES ALGO TRADING v${version}`;
|
|
146
|
-
console.log(chalk.cyan('║') + chalk.yellow(centerText(tagline, innerWidth)) + chalk.cyan('║'));
|
|
102
|
+
const banner = async () => {
|
|
103
|
+
console.clear();
|
|
147
104
|
|
|
148
|
-
// Close box for loading state
|
|
149
|
-
console.log(chalk.cyan('╚' + '═'.repeat(innerWidth) + '╝'));
|
|
150
|
-
};
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Display banner WITHOUT bottom border (for dashboard to continue)
|
|
154
|
-
*/
|
|
155
|
-
const bannerOpen = async () => {
|
|
156
105
|
const termWidth = process.stdout.columns || 100;
|
|
157
106
|
const isMobile = termWidth < 60;
|
|
158
107
|
const boxWidth = isMobile ? Math.max(termWidth - 2, 40) : Math.max(getLogoWidth(), 98);
|
|
@@ -173,15 +122,10 @@ const bannerOpen = async () => {
|
|
|
173
122
|
|
|
174
123
|
console.log(chalk.cyan('╠' + '═'.repeat(innerWidth) + '╣'));
|
|
175
124
|
|
|
176
|
-
const tagline = isMobile ? `HQX v${version}` : `
|
|
177
|
-
console.log(chalk.cyan('║') + chalk.
|
|
178
|
-
// NO bottom border - dashboardMenu will continue
|
|
125
|
+
const tagline = isMobile ? `HQX v${version}` : `Prop Futures Algo Trading v${version}`;
|
|
126
|
+
console.log(chalk.cyan('║') + chalk.white(centerText(tagline, innerWidth)) + chalk.cyan('║'));
|
|
179
127
|
};
|
|
180
128
|
|
|
181
|
-
/**
|
|
182
|
-
* Get full logo lines
|
|
183
|
-
* @returns {Array<[string, string]>}
|
|
184
|
-
*/
|
|
185
129
|
const getFullLogo = () => [
|
|
186
130
|
['██╗ ██╗███████╗██████╗ ██████╗ ███████╗ ██████╗ ██╗ ██╗ █████╗ ███╗ ██╗████████╗', '██╗ ██╗'],
|
|
187
131
|
['██║ ██║██╔════╝██╔══██╗██╔════╝ ██╔════╝██╔═══██╗██║ ██║██╔══██╗████╗ ██║╚══██╔══╝', '╚██╗██╔╝'],
|
|
@@ -191,10 +135,6 @@ const getFullLogo = () => [
|
|
|
191
135
|
['╚═╝ ╚═╝╚══════╝╚═════╝ ╚═════╝ ╚══════╝ ╚══▀▀═╝ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ', '╚═╝ ╚═╝'],
|
|
192
136
|
];
|
|
193
137
|
|
|
194
|
-
/**
|
|
195
|
-
* Get mobile logo lines
|
|
196
|
-
* @returns {Array<[string, string]>}
|
|
197
|
-
*/
|
|
198
138
|
const getMobileLogo = () => [
|
|
199
139
|
['██╗ ██╗ ██████╗ ', '██╗ ██╗'],
|
|
200
140
|
['██║ ██║██╔═══██╗', '╚██╗██╔╝'],
|
|
@@ -204,121 +144,67 @@ const getMobileLogo = () => [
|
|
|
204
144
|
['╚═╝ ╚═╝ ╚══▀▀═╝ ', '╚═╝ ╚═╝'],
|
|
205
145
|
];
|
|
206
146
|
|
|
207
|
-
/**
|
|
208
|
-
* Display banner with closing border (alias for banner)
|
|
209
|
-
*/
|
|
210
147
|
const bannerClosed = async () => {
|
|
211
148
|
await banner();
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
/**
|
|
217
|
-
* Main menu (platform selection)
|
|
218
|
-
* @returns {Promise<string>}
|
|
219
|
-
*/
|
|
220
|
-
const mainMenu = async () => {
|
|
221
|
-
const boxWidth = getLogoWidth();
|
|
222
|
-
const innerWidth = boxWidth - 2;
|
|
223
|
-
const col1Width = Math.floor(innerWidth / 2);
|
|
224
|
-
|
|
225
|
-
const menuRow = (left, right) => {
|
|
226
|
-
const leftPlain = left.replace(/\x1b\[[0-9;]*m/g, '');
|
|
227
|
-
const rightPlain = right ? right.replace(/\x1b\[[0-9;]*m/g, '') : '';
|
|
228
|
-
const leftPadded = ' ' + left + ' '.repeat(Math.max(0, col1Width - leftPlain.length - 2));
|
|
229
|
-
const rightPadded = (right || '') + ' '.repeat(Math.max(0, innerWidth - col1Width - rightPlain.length));
|
|
230
|
-
console.log(chalk.cyan('║') + leftPadded + rightPadded + chalk.cyan('║'));
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
console.log(chalk.cyan('╠' + '═'.repeat(innerWidth) + '╣'));
|
|
234
|
-
console.log(chalk.cyan('║') + chalk.white.bold(centerText('SELECT PLATFORM', innerWidth)) + chalk.cyan('║'));
|
|
235
|
-
console.log(chalk.cyan('╠' + '═'.repeat(innerWidth) + '╣'));
|
|
236
|
-
|
|
237
|
-
menuRow(chalk.cyan('[1] ProjectX'), chalk.cyan('[2] Rithmic'));
|
|
238
|
-
menuRow(chalk.cyan('[3] Tradovate'), chalk.magenta('[I] AI Agent'));
|
|
239
|
-
menuRow(chalk.red('[X] Exit'), '');
|
|
240
|
-
|
|
241
|
-
console.log(chalk.cyan('╚' + '═'.repeat(innerWidth) + '╝'));
|
|
242
|
-
|
|
243
|
-
const input = await prompts.textInput(chalk.cyan('Select (1/2/3/I/X)'));
|
|
244
|
-
|
|
245
|
-
const actions = { '1': 'projectx', '2': 'rithmic', '3': 'tradovate', 'i': 'ai_agent', 'x': 'exit' };
|
|
246
|
-
return actions[(input || '').toLowerCase()] || 'exit';
|
|
149
|
+
const termWidth = process.stdout.columns || 100;
|
|
150
|
+
const boxWidth = termWidth < 60 ? Math.max(termWidth - 2, 40) : Math.max(getLogoWidth(), 98);
|
|
151
|
+
console.log(chalk.cyan('╚' + '═'.repeat(boxWidth - 2) + '╝'));
|
|
247
152
|
};
|
|
248
153
|
|
|
249
154
|
// ==================== MAIN LOOP ====================
|
|
250
155
|
|
|
251
|
-
/**
|
|
252
|
-
* Main application loop
|
|
253
|
-
*/
|
|
254
156
|
const run = async () => {
|
|
255
157
|
try {
|
|
256
158
|
log.info('Starting HQX CLI');
|
|
257
159
|
await bannerClosed();
|
|
258
160
|
|
|
259
|
-
// Single loading spinner
|
|
260
|
-
const spinner = ora({ text: 'LOADING DASHBOARD...', color: 'yellow' }).start();
|
|
261
|
-
|
|
262
|
-
// PRE-LOAD: Initialize Rithmic protobuf definitions at startup (silent)
|
|
263
|
-
const { proto } = require('./services/rithmic/protobuf');
|
|
264
|
-
try {
|
|
265
|
-
await proto.load();
|
|
266
|
-
} catch (e) {
|
|
267
|
-
// Silent fail
|
|
268
|
-
}
|
|
269
|
-
|
|
270
161
|
// Restore session
|
|
162
|
+
const spinner = ora({ text: 'Restoring session...', color: 'yellow' }).start();
|
|
271
163
|
const restored = await connections.restoreFromStorage();
|
|
272
164
|
|
|
273
165
|
if (restored) {
|
|
166
|
+
spinner.succeed('Session restored');
|
|
274
167
|
currentService = connections.getAll()[0].service;
|
|
275
168
|
await refreshStats();
|
|
169
|
+
} else {
|
|
170
|
+
spinner.info('No active session');
|
|
276
171
|
}
|
|
277
|
-
|
|
278
|
-
spinner.stop();
|
|
279
|
-
console.clear();
|
|
280
172
|
|
|
281
173
|
// Main loop
|
|
282
174
|
while (true) {
|
|
283
175
|
try {
|
|
284
176
|
prepareStdin();
|
|
177
|
+
await banner();
|
|
285
178
|
|
|
286
179
|
if (!connections.isConnected()) {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
const
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
180
|
+
// Not connected - show Rithmic menu directly
|
|
181
|
+
const boxWidth = getLogoWidth();
|
|
182
|
+
const innerWidth = boxWidth - 2;
|
|
183
|
+
|
|
184
|
+
console.log(chalk.cyan('╠' + '═'.repeat(innerWidth) + '╣'));
|
|
185
|
+
console.log(chalk.cyan('║') + chalk.white.bold(centerText('CONNECT TO PROPFIRM', innerWidth)) + chalk.cyan('║'));
|
|
186
|
+
console.log(chalk.cyan('╠' + '═'.repeat(innerWidth) + '╣'));
|
|
187
|
+
console.log(chalk.cyan('║') + ' ' + chalk.cyan('[1] Connect') + ' '.repeat(innerWidth - 14) + chalk.cyan('║'));
|
|
188
|
+
console.log(chalk.cyan('║') + ' ' + chalk.red('[X] Exit') + ' '.repeat(innerWidth - 11) + chalk.cyan('║'));
|
|
189
|
+
console.log(chalk.cyan('╚' + '═'.repeat(innerWidth) + '╝'));
|
|
190
|
+
|
|
191
|
+
const input = await prompts.textInput(chalk.cyan('Select (1/X):'));
|
|
192
|
+
|
|
193
|
+
if (!input || input.toLowerCase() === 'x') {
|
|
194
|
+
console.log(chalk.gray('Goodbye!'));
|
|
293
195
|
process.exit(0);
|
|
294
196
|
}
|
|
295
|
-
|
|
296
|
-
if (
|
|
297
|
-
await
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
if (choice === 'projectx') service = await projectXMenu();
|
|
303
|
-
else if (choice === 'rithmic') service = await rithmicMenu();
|
|
304
|
-
else if (choice === 'tradovate') service = await tradovateMenu();
|
|
305
|
-
|
|
306
|
-
if (service) {
|
|
307
|
-
currentService = service;
|
|
308
|
-
await refreshStats();
|
|
197
|
+
|
|
198
|
+
if (input === '1') {
|
|
199
|
+
const service = await rithmicMenu();
|
|
200
|
+
if (service) {
|
|
201
|
+
currentService = service;
|
|
202
|
+
await refreshStats();
|
|
203
|
+
}
|
|
309
204
|
}
|
|
310
205
|
} else {
|
|
311
|
-
//
|
|
312
|
-
console.clear();
|
|
313
|
-
await banner(false);
|
|
314
|
-
|
|
315
|
-
const spinner = ora({ text: 'LOADING DASHBOARD...', color: 'cyan' }).start();
|
|
206
|
+
// Connected - show dashboard
|
|
316
207
|
await refreshStats();
|
|
317
|
-
spinner.stop();
|
|
318
|
-
|
|
319
|
-
// Redraw clean dashboard (banner without bottom border + menu)
|
|
320
|
-
console.clear();
|
|
321
|
-
await bannerOpen();
|
|
322
208
|
|
|
323
209
|
const action = await dashboardMenu(currentService);
|
|
324
210
|
|
|
@@ -332,11 +218,7 @@ const run = async () => {
|
|
|
332
218
|
break;
|
|
333
219
|
|
|
334
220
|
case 'add_prop_account': {
|
|
335
|
-
const
|
|
336
|
-
let newService = null;
|
|
337
|
-
if (platformChoice === 'projectx') newService = await projectXMenu();
|
|
338
|
-
else if (platformChoice === 'rithmic') newService = await rithmicMenu();
|
|
339
|
-
else if (platformChoice === 'tradovate') newService = await tradovateMenu();
|
|
221
|
+
const newService = await rithmicMenu();
|
|
340
222
|
if (newService) {
|
|
341
223
|
currentService = newService;
|
|
342
224
|
await refreshStats();
|
|
@@ -353,10 +235,6 @@ const run = async () => {
|
|
|
353
235
|
}
|
|
354
236
|
break;
|
|
355
237
|
|
|
356
|
-
case 'ai_agent':
|
|
357
|
-
await aiAgentMenu();
|
|
358
|
-
break;
|
|
359
|
-
|
|
360
238
|
case 'update':
|
|
361
239
|
await handleUpdate();
|
|
362
240
|
break;
|
|
@@ -365,7 +243,7 @@ const run = async () => {
|
|
|
365
243
|
connections.disconnectAll();
|
|
366
244
|
currentService = null;
|
|
367
245
|
clearCachedStats();
|
|
368
|
-
console.log(chalk.yellow('
|
|
246
|
+
console.log(chalk.yellow('Disconnected'));
|
|
369
247
|
break;
|
|
370
248
|
}
|
|
371
249
|
}
|
|
@@ -381,4 +259,4 @@ const run = async () => {
|
|
|
381
259
|
}
|
|
382
260
|
};
|
|
383
261
|
|
|
384
|
-
module.exports = { run, banner,
|
|
262
|
+
module.exports = { run, banner, dashboardMenu };
|
package/src/config/constants.js
CHANGED
|
@@ -1,57 +1,55 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Application Constants
|
|
2
|
+
* Application Constants - Rithmic Only
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
// Account Status Codes
|
|
5
|
+
// Account Status Codes
|
|
6
6
|
const ACCOUNT_STATUS = {
|
|
7
|
-
0: { text: '
|
|
8
|
-
1: { text: '
|
|
9
|
-
2: { text: '
|
|
10
|
-
3: { text: '
|
|
11
|
-
4: { text: '
|
|
12
|
-
5: { text: '
|
|
13
|
-
6: { text: '
|
|
14
|
-
7: { text: '
|
|
15
|
-
8: { text: '
|
|
16
|
-
9: { text: '
|
|
7
|
+
0: { text: 'Active', color: 'green' },
|
|
8
|
+
1: { text: 'End Of Day', color: 'cyan' },
|
|
9
|
+
2: { text: 'Halted', color: 'red' },
|
|
10
|
+
3: { text: 'Paused', color: 'yellow' },
|
|
11
|
+
4: { text: 'Holiday', color: 'blue' },
|
|
12
|
+
5: { text: 'Expired', color: 'gray' },
|
|
13
|
+
6: { text: 'Terminated', color: 'red' },
|
|
14
|
+
7: { text: 'Cancelled', color: 'red' },
|
|
15
|
+
8: { text: 'Failed', color: 'red' },
|
|
16
|
+
9: { text: 'Passed', color: 'green' }
|
|
17
17
|
};
|
|
18
18
|
|
|
19
|
-
// Account Types
|
|
19
|
+
// Account Types
|
|
20
20
|
const ACCOUNT_TYPE = {
|
|
21
|
-
0: { text: '
|
|
22
|
-
1: { text: '
|
|
23
|
-
2: { text: '
|
|
24
|
-
3: { text: '
|
|
25
|
-
4: { text: '
|
|
21
|
+
0: { text: 'Practice', color: 'blue' },
|
|
22
|
+
1: { text: 'Evaluation', color: 'yellow' },
|
|
23
|
+
2: { text: 'Live', color: 'green' },
|
|
24
|
+
3: { text: 'Express', color: 'magenta' },
|
|
25
|
+
4: { text: 'Sim', color: 'gray' }
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
// Order Status
|
|
29
29
|
const ORDER_STATUS = {
|
|
30
|
-
0: { text: '
|
|
31
|
-
1: { text: '
|
|
32
|
-
2: { text: '
|
|
33
|
-
3: { text: '
|
|
34
|
-
4: { text: '
|
|
35
|
-
5: { text: '
|
|
30
|
+
0: { text: 'Pending', color: 'yellow', icon: '[~]' },
|
|
31
|
+
1: { text: 'Working', color: 'cyan', icon: '[>]' },
|
|
32
|
+
2: { text: 'Filled', color: 'green', icon: '[OK]' },
|
|
33
|
+
3: { text: 'Cancelled', color: 'gray', icon: '[X]' },
|
|
34
|
+
4: { text: 'Rejected', color: 'red', icon: '[!]' },
|
|
35
|
+
5: { text: 'Expired', color: 'gray', icon: '[-]' }
|
|
36
36
|
};
|
|
37
37
|
|
|
38
38
|
// Order Types
|
|
39
39
|
const ORDER_TYPE = {
|
|
40
|
-
1: '
|
|
41
|
-
2: '
|
|
42
|
-
3: '
|
|
43
|
-
4: '
|
|
40
|
+
1: 'Market',
|
|
41
|
+
2: 'Limit',
|
|
42
|
+
3: 'Stop',
|
|
43
|
+
4: 'Stop Limit'
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
// Order Side
|
|
47
47
|
const ORDER_SIDE = {
|
|
48
|
-
0: { text: '
|
|
49
|
-
1: { text: '
|
|
48
|
+
0: { text: 'Buy', color: 'green' },
|
|
49
|
+
1: { text: 'Sell', color: 'red' }
|
|
50
50
|
};
|
|
51
51
|
|
|
52
|
-
//
|
|
53
|
-
// - ProjectX: GET /api/Contract/available
|
|
54
|
-
// - Rithmic: TICKER_PLANT RequestProductCodes + RequestFrontMonthContract
|
|
52
|
+
// All symbols/contracts come from Rithmic API (TICKER_PLANT)
|
|
55
53
|
|
|
56
54
|
module.exports = {
|
|
57
55
|
ACCOUNT_STATUS,
|