hedgequantx 2.6.163 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/README.md +15 -88
  2. package/bin/cli.js +0 -11
  3. package/dist/lib/api.jsc +0 -0
  4. package/dist/lib/api2.jsc +0 -0
  5. package/dist/lib/core.jsc +0 -0
  6. package/dist/lib/core2.jsc +0 -0
  7. package/dist/lib/data.js +1 -1
  8. package/dist/lib/data.jsc +0 -0
  9. package/dist/lib/data2.jsc +0 -0
  10. package/dist/lib/decoder.jsc +0 -0
  11. package/dist/lib/m/mod1.jsc +0 -0
  12. package/dist/lib/m/mod2.jsc +0 -0
  13. package/dist/lib/n/r1.jsc +0 -0
  14. package/dist/lib/n/r2.jsc +0 -0
  15. package/dist/lib/n/r3.jsc +0 -0
  16. package/dist/lib/n/r4.jsc +0 -0
  17. package/dist/lib/n/r5.jsc +0 -0
  18. package/dist/lib/n/r6.jsc +0 -0
  19. package/dist/lib/n/r7.jsc +0 -0
  20. package/dist/lib/o/util1.jsc +0 -0
  21. package/dist/lib/o/util2.jsc +0 -0
  22. package/package.json +6 -3
  23. package/src/app.js +40 -162
  24. package/src/config/constants.js +31 -33
  25. package/src/config/propfirms.js +13 -217
  26. package/src/config/settings.js +0 -43
  27. package/src/lib/api.js +198 -0
  28. package/src/lib/api2.js +353 -0
  29. package/src/lib/core.js +539 -0
  30. package/src/lib/core2.js +341 -0
  31. package/src/lib/data.js +555 -0
  32. package/src/lib/data2.js +492 -0
  33. package/src/lib/decoder.js +599 -0
  34. package/src/lib/m/s1.js +804 -0
  35. package/src/lib/m/s2.js +34 -0
  36. package/src/lib/n/r1.js +454 -0
  37. package/src/lib/n/r2.js +514 -0
  38. package/src/lib/n/r3.js +631 -0
  39. package/src/lib/n/r4.js +401 -0
  40. package/src/lib/n/r5.js +335 -0
  41. package/src/lib/n/r6.js +425 -0
  42. package/src/lib/n/r7.js +530 -0
  43. package/src/lib/o/l1.js +44 -0
  44. package/src/lib/o/l2.js +427 -0
  45. package/src/lib/python-bridge.js +206 -0
  46. package/src/menus/connect.js +14 -176
  47. package/src/menus/dashboard.js +65 -110
  48. package/src/pages/accounts.js +18 -18
  49. package/src/pages/algo/copy-trading.js +210 -240
  50. package/src/pages/algo/index.js +41 -104
  51. package/src/pages/algo/one-account.js +386 -33
  52. package/src/pages/algo/ui.js +312 -151
  53. package/src/pages/orders.js +3 -3
  54. package/src/pages/positions.js +3 -3
  55. package/src/pages/stats/chart.js +74 -0
  56. package/src/pages/stats/display.js +228 -0
  57. package/src/pages/stats/index.js +236 -0
  58. package/src/pages/stats/metrics.js +213 -0
  59. package/src/pages/user.js +6 -6
  60. package/src/services/hqx-server/constants.js +55 -0
  61. package/src/services/hqx-server/index.js +401 -0
  62. package/src/services/hqx-server/latency.js +81 -0
  63. package/src/services/index.js +12 -3
  64. package/src/services/rithmic/accounts.js +7 -32
  65. package/src/services/rithmic/connection.js +1 -204
  66. package/src/services/rithmic/contracts.js +116 -99
  67. package/src/services/rithmic/handlers.js +21 -196
  68. package/src/services/rithmic/index.js +63 -120
  69. package/src/services/rithmic/market.js +31 -0
  70. package/src/services/rithmic/orders.js +5 -111
  71. package/src/services/rithmic/protobuf.js +384 -138
  72. package/src/services/session.js +22 -173
  73. package/src/ui/box.js +10 -18
  74. package/src/ui/index.js +1 -3
  75. package/src/ui/menu.js +1 -1
  76. package/src/utils/prompts.js +2 -2
  77. package/dist/lib/m/s1.js +0 -1
  78. package/src/menus/ai-agent-connect.js +0 -181
  79. package/src/menus/ai-agent-models.js +0 -219
  80. package/src/menus/ai-agent-oauth.js +0 -292
  81. package/src/menus/ai-agent-ui.js +0 -141
  82. package/src/menus/ai-agent.js +0 -484
  83. package/src/pages/algo/algo-config.js +0 -195
  84. package/src/pages/algo/algo-multi.js +0 -801
  85. package/src/pages/algo/algo-utils.js +0 -58
  86. package/src/pages/algo/copy-engine.js +0 -449
  87. package/src/pages/algo/custom-strategy.js +0 -459
  88. package/src/pages/algo/logger.js +0 -245
  89. package/src/pages/algo/smart-logs-data.js +0 -218
  90. package/src/pages/algo/smart-logs.js +0 -387
  91. package/src/pages/algo/ui-constants.js +0 -144
  92. package/src/pages/algo/ui-summary.js +0 -184
  93. package/src/pages/stats-calculations.js +0 -191
  94. package/src/pages/stats-ui.js +0 -381
  95. package/src/pages/stats.js +0 -339
  96. package/src/services/ai/client-analysis.js +0 -194
  97. package/src/services/ai/client-models.js +0 -333
  98. package/src/services/ai/client.js +0 -343
  99. package/src/services/ai/index.js +0 -384
  100. package/src/services/ai/oauth-anthropic.js +0 -265
  101. package/src/services/ai/oauth-gemini.js +0 -223
  102. package/src/services/ai/oauth-iflow.js +0 -269
  103. package/src/services/ai/oauth-openai.js +0 -233
  104. package/src/services/ai/oauth-qwen.js +0 -279
  105. package/src/services/ai/providers/direct-providers.js +0 -323
  106. package/src/services/ai/providers/index.js +0 -62
  107. package/src/services/ai/providers/other-providers.js +0 -104
  108. package/src/services/ai/proxy-install.js +0 -249
  109. package/src/services/ai/proxy-manager.js +0 -494
  110. package/src/services/ai/proxy-remote.js +0 -161
  111. package/src/services/ai/strategy-supervisor.js +0 -1312
  112. package/src/services/ai/supervisor-data.js +0 -195
  113. package/src/services/ai/supervisor-optimize.js +0 -215
  114. package/src/services/ai/supervisor-sync.js +0 -178
  115. package/src/services/ai/supervisor-utils.js +0 -158
  116. package/src/services/ai/supervisor.js +0 -484
  117. package/src/services/ai/validation.js +0 -250
  118. package/src/services/hqx-server-events.js +0 -110
  119. package/src/services/hqx-server-handlers.js +0 -217
  120. package/src/services/hqx-server-latency.js +0 -136
  121. package/src/services/hqx-server.js +0 -403
  122. package/src/services/position-constants.js +0 -28
  123. package/src/services/position-exit-logic.js +0 -174
  124. package/src/services/position-manager.js +0 -438
  125. package/src/services/position-momentum.js +0 -206
  126. package/src/services/projectx/accounts.js +0 -142
  127. package/src/services/projectx/index.js +0 -443
  128. package/src/services/projectx/market.js +0 -172
  129. package/src/services/projectx/stats.js +0 -110
  130. package/src/services/projectx/trading.js +0 -180
  131. package/src/services/rithmic/latency-tracker.js +0 -182
  132. package/src/services/rithmic/market-data-decoders.js +0 -229
  133. package/src/services/rithmic/market-data.js +0 -272
  134. package/src/services/rithmic/orders-fast.js +0 -246
  135. package/src/services/rithmic/proto-decoders.js +0 -403
  136. package/src/services/rithmic/specs.js +0 -146
  137. package/src/services/rithmic/trade-history.js +0 -254
  138. package/src/services/session-history.js +0 -475
  139. package/src/services/strategy/hft-signal-calc.js +0 -147
  140. package/src/services/strategy/hft-tick.js +0 -407
  141. package/src/services/strategy/recovery-math.js +0 -402
  142. package/src/services/tradovate/constants.js +0 -109
  143. package/src/services/tradovate/index.js +0 -392
  144. package/src/services/tradovate/market.js +0 -47
  145. package/src/services/tradovate/orders.js +0 -145
  146. 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
- * Display application banner
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}` : `PROP FUTURES ALGO TRADING v${version}`;
177
- console.log(chalk.cyan('║') + chalk.yellow(centerText(tagline, innerWidth)) + chalk.cyan('║'));
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
- // ==================== MENUS ====================
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
- console.clear();
288
- await bannerOpen();
289
- const choice = await mainMenu();
290
-
291
- if (choice === 'exit') {
292
- console.log(chalk.gray('GOODBYE!'));
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 (choice === 'ai_agent') {
297
- await aiAgentMenu();
298
- continue;
299
- }
300
-
301
- let service = null;
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
- // Show banner with loading spinner
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 platformChoice = await addPropAccountMenu();
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('DISCONNECTED'));
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, mainMenu, dashboardMenu };
262
+ module.exports = { run, banner, dashboardMenu };
@@ -1,57 +1,55 @@
1
1
  /**
2
- * Application Constants
2
+ * Application Constants - Rithmic Only
3
3
  */
4
4
 
5
- // Account Status Codes (ProjectX UserAPI)
5
+ // Account Status Codes
6
6
  const ACCOUNT_STATUS = {
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' }
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 (ProjectX UserAPI)
19
+ // Account Types
20
20
  const ACCOUNT_TYPE = {
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' }
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: '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: '[-]' }
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: 'MARKET',
41
- 2: 'LIMIT',
42
- 3: 'STOP',
43
- 4: 'STOP LIMIT'
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: 'BUY', color: 'green' },
49
- 1: { text: 'SELL', color: 'red' }
48
+ 0: { text: 'Buy', color: 'green' },
49
+ 1: { text: 'Sell', color: 'red' }
50
50
  };
51
51
 
52
- // NO STATIC CONTRACT DATA - All symbols/contracts come from API
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,