hedgequantx 2.6.162 → 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 (138) 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 +235 -0
  67. package/src/services/rithmic/handlers.js +21 -196
  68. package/src/services/rithmic/index.js +60 -291
  69. package/src/services/rithmic/market.js +31 -0
  70. package/src/services/rithmic/orders.js +5 -361
  71. package/src/services/rithmic/protobuf.js +5 -195
  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/index.js +0 -526
  106. package/src/services/ai/proxy-install.js +0 -249
  107. package/src/services/ai/proxy-manager.js +0 -494
  108. package/src/services/ai/proxy-remote.js +0 -161
  109. package/src/services/ai/strategy-supervisor.js +0 -1312
  110. package/src/services/ai/supervisor-data.js +0 -195
  111. package/src/services/ai/supervisor-optimize.js +0 -215
  112. package/src/services/ai/supervisor-sync.js +0 -178
  113. package/src/services/ai/supervisor-utils.js +0 -158
  114. package/src/services/ai/supervisor.js +0 -484
  115. package/src/services/ai/validation.js +0 -250
  116. package/src/services/hqx-server-events.js +0 -110
  117. package/src/services/hqx-server-handlers.js +0 -217
  118. package/src/services/hqx-server-latency.js +0 -136
  119. package/src/services/hqx-server.js +0 -403
  120. package/src/services/position-constants.js +0 -28
  121. package/src/services/position-manager.js +0 -528
  122. package/src/services/position-momentum.js +0 -206
  123. package/src/services/projectx/accounts.js +0 -142
  124. package/src/services/projectx/index.js +0 -443
  125. package/src/services/projectx/market.js +0 -172
  126. package/src/services/projectx/stats.js +0 -110
  127. package/src/services/projectx/trading.js +0 -180
  128. package/src/services/rithmic/latency-tracker.js +0 -182
  129. package/src/services/rithmic/market-data.js +0 -549
  130. package/src/services/rithmic/specs.js +0 -146
  131. package/src/services/rithmic/trade-history.js +0 -254
  132. package/src/services/session-history.js +0 -475
  133. package/src/services/strategy/hft-tick.js +0 -507
  134. package/src/services/strategy/recovery-math.js +0 -402
  135. package/src/services/tradovate/constants.js +0 -109
  136. package/src/services/tradovate/index.js +0 -505
  137. package/src/services/tradovate/market.js +0 -47
  138. 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,