custom indicators fixed

This commit is contained in:
2026-04-09 17:00:43 -04:00
parent a70dcd954f
commit fd431516cc
17 changed files with 778 additions and 440 deletions

View File

@@ -40,7 +40,8 @@ interface SymbolDenominators {
export class WebSocketDatafeed implements IBasicDataFeed {
private pendingRequests: Map<string, PendingRequest> = new Map()
private subscriptions: Map<string, Subscription> = new Map()
private requestTimeout = 10000 // 10 seconds
private requestTimeout = 10000 // 10 seconds (used for all requests except getBars)
private barsRequestTimeout = 60000 // 60 seconds (cold-cache pipeline may take a while)
private configuration: DatafeedConfiguration | null = null
private messageHandler: MessageHandler
private symbolDenominators: Map<string, SymbolDenominators> = new Map() // Track denominators per symbol
@@ -56,7 +57,7 @@ export class WebSocketDatafeed implements IBasicDataFeed {
return `tv_${Date.now()}_${Math.random().toString(36).substring(7)}`
}
private sendRequest<T>(message: any): Promise<T> {
private sendRequest<T>(message: any, timeoutMs?: number): Promise<T> {
const requestId = message.request_id || this.generateRequestId()
message.request_id = requestId
@@ -67,7 +68,7 @@ export class WebSocketDatafeed implements IBasicDataFeed {
console.error('[TradingView Datafeed] Request timeout:', requestId, message.type)
this.pendingRequests.delete(requestId)
reject(new Error('Request timeout'))
}, this.requestTimeout)
}, timeoutMs ?? this.requestTimeout)
this.pendingRequests.set(requestId, { resolve, reject, timeout })
@@ -244,14 +245,23 @@ export class WebSocketDatafeed implements IBasicDataFeed {
const symbolKey = symbolInfo.ticker || symbolInfo.name
const denoms = this.symbolDenominators.get(symbolKey) || { tick: 1, base: 1 }
this.sendRequest<any>({
const doRequest = () => this.sendRequest<any>({
type: 'get_bars',
symbol: symbolKey,
period_seconds: intervalToSeconds(resolution),
from_time: periodParams.from,
to_time: periodParams.to,
countback: periodParams.countBack
})
}, this.barsRequestTimeout)
doRequest()
.catch((err: Error) => {
if (err.message === 'Request timeout') {
console.warn('[TradingView Datafeed] getBars timed out, retrying once (data may now be in cache)...')
return doRequest()
}
throw err
})
.then((response) => {
if (response.history) {
console.log('[TradingView Datafeed] Raw bar sample:', response.history.bars?.[0])