hedgequantx 2.9.146 → 2.9.148
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/package.json
CHANGED
|
@@ -302,6 +302,9 @@ const oneAccountMenu = async (service) => {
|
|
|
302
302
|
const selectMultipleSymbols = async (service, account) => {
|
|
303
303
|
const spinner = ora({ text: 'Loading symbols...', color: 'yellow' }).start();
|
|
304
304
|
|
|
305
|
+
// Debug: log service type
|
|
306
|
+
const serviceType = service.constructor?.name || 'Unknown';
|
|
307
|
+
|
|
305
308
|
// Ensure we have a logged-in service
|
|
306
309
|
if (!service.loginInfo && service.credentials) {
|
|
307
310
|
spinner.text = 'Reconnecting to broker...';
|
|
@@ -312,19 +315,24 @@ const selectMultipleSymbols = async (service, account) => {
|
|
|
312
315
|
}
|
|
313
316
|
}
|
|
314
317
|
|
|
315
|
-
|
|
318
|
+
let contractsResult;
|
|
319
|
+
try {
|
|
320
|
+
contractsResult = await service.getContracts();
|
|
321
|
+
} catch (err) {
|
|
322
|
+
spinner.fail(`getContracts exception: ${err.message}`);
|
|
323
|
+
console.log(chalk.gray(` Service: ${serviceType} | Tip: Try "hqx login"`));
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
316
326
|
if (!contractsResult.success || !contractsResult.contracts?.length) {
|
|
317
327
|
spinner.fail(`Failed to load contracts: ${contractsResult.error || 'No contracts'}`);
|
|
328
|
+
console.log(chalk.gray(` Service: ${serviceType} | Tip: Try "hqx login"`));
|
|
318
329
|
return null;
|
|
319
330
|
}
|
|
320
331
|
|
|
321
332
|
const contracts = sortContracts(contractsResult.contracts);
|
|
322
333
|
spinner.succeed(`Found ${contracts.length} contracts`);
|
|
323
|
-
|
|
324
|
-
console.log();
|
|
325
|
-
console.log(chalk.cyan(' Select up to 5 symbols (one at a time)'));
|
|
326
|
-
console.log(chalk.gray(' Select "Done" when finished'));
|
|
327
|
-
console.log();
|
|
334
|
+
console.log(chalk.cyan('\n Select up to 5 symbols (one at a time)'));
|
|
335
|
+
console.log(chalk.gray(' Select "Done" when finished\n'));
|
|
328
336
|
|
|
329
337
|
const selectedContracts = [];
|
|
330
338
|
const maxSymbols = 5;
|
|
@@ -356,30 +364,17 @@ const selectMultipleSymbols = async (service, account) => {
|
|
|
356
364
|
: `Select Symbol ${selectedContracts.length + 1}/${maxSymbols} (${remaining} remaining):`;
|
|
357
365
|
|
|
358
366
|
const selection = await prompts.selectOption(chalk.yellow(promptText), options);
|
|
359
|
-
|
|
360
|
-
if (selection === '
|
|
361
|
-
return null;
|
|
362
|
-
}
|
|
363
|
-
if (selection === 'done') {
|
|
364
|
-
break;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
+
if (selection === 'back' || selection === null) return null;
|
|
368
|
+
if (selection === 'done') break;
|
|
367
369
|
selectedContracts.push(selection);
|
|
368
370
|
console.log(chalk.green(` ✓ Added: ${selection.symbol}`));
|
|
369
371
|
}
|
|
370
|
-
|
|
371
|
-
if (selectedContracts.length === 0) {
|
|
372
|
-
return null;
|
|
373
|
-
}
|
|
372
|
+
if (selectedContracts.length === 0) return null;
|
|
374
373
|
|
|
375
374
|
// Display summary
|
|
375
|
+
console.log(chalk.cyan(`\n Selected ${selectedContracts.length} symbol(s):`));
|
|
376
|
+
for (const c of selectedContracts) console.log(chalk.white(` - ${c.symbol} (${c.baseSymbol || c.name})`));
|
|
376
377
|
console.log();
|
|
377
|
-
console.log(chalk.cyan(` Selected ${selectedContracts.length} symbol(s):`));
|
|
378
|
-
for (const c of selectedContracts) {
|
|
379
|
-
console.log(chalk.white(` - ${c.symbol} (${c.baseSymbol || c.name})`));
|
|
380
|
-
}
|
|
381
|
-
console.log();
|
|
382
|
-
|
|
383
378
|
return selectedContracts;
|
|
384
379
|
};
|
|
385
380
|
|
|
@@ -389,8 +384,11 @@ const selectMultipleSymbols = async (service, account) => {
|
|
|
389
384
|
const selectSymbol = async (service, account) => {
|
|
390
385
|
const spinner = ora({ text: 'Loading symbols...', color: 'yellow' }).start();
|
|
391
386
|
|
|
392
|
-
//
|
|
393
|
-
|
|
387
|
+
// Debug: log service type
|
|
388
|
+
const serviceType = service.constructor?.name || 'Unknown';
|
|
389
|
+
|
|
390
|
+
// Ensure we have a logged-in service (for direct RithmicService, not BrokerClient)
|
|
391
|
+
if (!service.loginInfo && service.credentials && typeof service.login === 'function') {
|
|
394
392
|
spinner.text = 'Reconnecting to broker...';
|
|
395
393
|
const loginResult = await service.login(service.credentials.username, service.credentials.password);
|
|
396
394
|
if (!loginResult.success) {
|
|
@@ -399,9 +397,17 @@ const selectSymbol = async (service, account) => {
|
|
|
399
397
|
}
|
|
400
398
|
}
|
|
401
399
|
|
|
402
|
-
|
|
400
|
+
let contractsResult;
|
|
401
|
+
try {
|
|
402
|
+
contractsResult = await service.getContracts();
|
|
403
|
+
} catch (err) {
|
|
404
|
+
spinner.fail(`getContracts exception: ${err.message}`);
|
|
405
|
+
console.log(chalk.gray(` Service: ${serviceType} | Tip: Try "hqx login"`));
|
|
406
|
+
return null;
|
|
407
|
+
}
|
|
403
408
|
if (!contractsResult.success || !contractsResult.contracts?.length) {
|
|
404
|
-
spinner.fail(`Failed to load contracts: ${contractsResult.error || 'No contracts'}`);
|
|
409
|
+
spinner.fail(`Failed to load contracts: ${contractsResult.error || 'No contracts available'}`);
|
|
410
|
+
console.log(chalk.gray(` Service: ${serviceType} | Tip: Try "hqx login"`));
|
|
405
411
|
return null;
|
|
406
412
|
}
|
|
407
413
|
|
|
@@ -211,7 +211,13 @@ class RithmicBrokerClient extends EventEmitter {
|
|
|
211
211
|
*/
|
|
212
212
|
async getContracts() {
|
|
213
213
|
const result = await this._request('getContracts', { propfirmKey: this.propfirmKey });
|
|
214
|
-
if (result.error)
|
|
214
|
+
if (result.error) {
|
|
215
|
+
// Debug: show exactly what error came from daemon
|
|
216
|
+
if (process.env.HQX_DEBUG === '1') {
|
|
217
|
+
console.log('[BrokerClient] getContracts error:', result.error, 'propfirmKey:', this.propfirmKey);
|
|
218
|
+
}
|
|
219
|
+
return { success: false, contracts: [], error: result.error };
|
|
220
|
+
}
|
|
215
221
|
return result.payload || { success: true, contracts: [] };
|
|
216
222
|
}
|
|
217
223
|
|
|
@@ -299,8 +299,29 @@ class RithmicBrokerDaemon {
|
|
|
299
299
|
|
|
300
300
|
async _handleGetContracts(payload, requestId) {
|
|
301
301
|
const conn = this.connections.get(payload.propfirmKey);
|
|
302
|
-
if (!conn?.service)
|
|
303
|
-
|
|
302
|
+
if (!conn?.service) {
|
|
303
|
+
log('WARN', 'getContracts: Not connected', { propfirm: payload.propfirmKey, hasConn: !!conn });
|
|
304
|
+
return { error: 'Not connected to broker', requestId };
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Log service state for debugging
|
|
308
|
+
const hasCredentials = !!conn.service.credentials;
|
|
309
|
+
const hasTickerConn = !!conn.service.tickerConn;
|
|
310
|
+
log('DEBUG', 'getContracts request', { propfirm: payload.propfirmKey, hasCredentials, hasTickerConn });
|
|
311
|
+
|
|
312
|
+
try {
|
|
313
|
+
const result = await conn.service.getContracts();
|
|
314
|
+
log('DEBUG', 'getContracts result', {
|
|
315
|
+
propfirm: payload.propfirmKey,
|
|
316
|
+
success: result.success,
|
|
317
|
+
count: result.contracts?.length || 0,
|
|
318
|
+
error: result.error
|
|
319
|
+
});
|
|
320
|
+
return { type: 'contracts', payload: result, requestId };
|
|
321
|
+
} catch (err) {
|
|
322
|
+
log('ERROR', 'getContracts exception', { propfirm: payload.propfirmKey, error: err.message, stack: err.stack?.split('\n')[1] });
|
|
323
|
+
return { type: 'contracts', payload: { success: false, error: err.message, contracts: [] }, requestId };
|
|
324
|
+
}
|
|
304
325
|
}
|
|
305
326
|
|
|
306
327
|
async _handleSearchContracts(payload, requestId) {
|