borsajs 0.1.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.
- package/LICENSE +201 -0
- package/README.en.md +209 -0
- package/README.md +57 -0
- package/dist/cache.d.ts +24 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +40 -0
- package/dist/cache.js.map +1 -0
- package/dist/crypto.d.ts +17 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +25 -0
- package/dist/crypto.js.map +1 -0
- package/dist/exceptions.d.ts +34 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +70 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/fund.d.ts +28 -0
- package/dist/fund.d.ts.map +1 -0
- package/dist/fund.js +29 -0
- package/dist/fund.js.map +1 -0
- package/dist/fx.d.ts +16 -0
- package/dist/fx.d.ts.map +1 -0
- package/dist/fx.js +22 -0
- package/dist/fx.js.map +1 -0
- package/dist/index-class.d.ts +21 -0
- package/dist/index-class.d.ts.map +1 -0
- package/dist/index-class.js +31 -0
- package/dist/index-class.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/inflation.d.ts +12 -0
- package/dist/inflation.d.ts.map +1 -0
- package/dist/inflation.js +28 -0
- package/dist/inflation.js.map +1 -0
- package/dist/market.d.ts +7 -0
- package/dist/market.d.ts.map +1 -0
- package/dist/market.js +7 -0
- package/dist/market.js.map +1 -0
- package/dist/multi.d.ts +26 -0
- package/dist/multi.d.ts.map +1 -0
- package/dist/multi.js +46 -0
- package/dist/multi.js.map +1 -0
- package/dist/providers/base.d.ts +24 -0
- package/dist/providers/base.d.ts.map +1 -0
- package/dist/providers/base.js +28 -0
- package/dist/providers/base.js.map +1 -0
- package/dist/providers/btcturk.d.ts +43 -0
- package/dist/providers/btcturk.d.ts.map +1 -0
- package/dist/providers/btcturk.js +94 -0
- package/dist/providers/btcturk.js.map +1 -0
- package/dist/providers/dovizcom.d.ts +42 -0
- package/dist/providers/dovizcom.d.ts.map +1 -0
- package/dist/providers/dovizcom.js +105 -0
- package/dist/providers/dovizcom.js.map +1 -0
- package/dist/providers/index.d.ts +20 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +12 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/kap.d.ts +37 -0
- package/dist/providers/kap.d.ts.map +1 -0
- package/dist/providers/kap.js +110 -0
- package/dist/providers/kap.js.map +1 -0
- package/dist/providers/paratic.d.ts +41 -0
- package/dist/providers/paratic.d.ts.map +1 -0
- package/dist/providers/paratic.js +85 -0
- package/dist/providers/paratic.js.map +1 -0
- package/dist/providers/tcmb.d.ts +49 -0
- package/dist/providers/tcmb.d.ts.map +1 -0
- package/dist/providers/tcmb.js +99 -0
- package/dist/providers/tcmb.js.map +1 -0
- package/dist/providers/tefas.d.ts +51 -0
- package/dist/providers/tefas.d.ts.map +1 -0
- package/dist/providers/tefas.js +89 -0
- package/dist/providers/tefas.js.map +1 -0
- package/dist/providers/viop.d.ts +35 -0
- package/dist/providers/viop.d.ts.map +1 -0
- package/dist/providers/viop.js +140 -0
- package/dist/providers/viop.js.map +1 -0
- package/dist/ticker.d.ts +18 -0
- package/dist/ticker.d.ts.map +1 -0
- package/dist/ticker.js +23 -0
- package/dist/ticker.js.map +1 -0
- package/dist/viop.d.ts +19 -0
- package/dist/viop.d.ts.map +1 -0
- package/dist/viop.js +31 -0
- package/dist/viop.js.map +1 -0
- package/package.json +52 -0
- package/src/cache.ts +42 -0
- package/src/crypto.ts +30 -0
- package/src/exceptions.ts +77 -0
- package/src/fund.ts +37 -0
- package/src/fx.ts +26 -0
- package/src/index-class.ts +39 -0
- package/src/index.ts +38 -0
- package/src/inflation.ts +31 -0
- package/src/market.ts +7 -0
- package/src/multi.ts +46 -0
- package/src/providers/base.ts +35 -0
- package/src/providers/btcturk.ts +100 -0
- package/src/providers/dovizcom.ts +98 -0
- package/src/providers/kap.ts +98 -0
- package/src/providers/paratic.ts +95 -0
- package/src/providers/tcmb.ts +96 -0
- package/src/providers/tefas.ts +85 -0
- package/src/ticker.ts +30 -0
- package/src/viop.ts +35 -0
- package/test/demo.ts +99 -0
- package/tsconfig.json +34 -0
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BtcTurk provider for cryptocurrency data.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseProvider } from './base.js';
|
|
5
|
+
import { TTL } from '../cache.js';
|
|
6
|
+
import { APIError, DataNotAvailableError } from '../exceptions.js';
|
|
7
|
+
export class BtcTurkProvider extends BaseProvider {
|
|
8
|
+
static BASE_URL = 'https://api.btcturk.com/api/v2';
|
|
9
|
+
static GRAPH_API_URL = 'https://graph-api.btcturk.com';
|
|
10
|
+
static RESOLUTION_MAP = { '1m': 1, '5m': 5, '15m': 15, '30m': 30, '1h': 60, '4h': 240, '1d': 1440, '1wk': 10080 };
|
|
11
|
+
static PERIOD_DAYS = { '1d': 1, '5d': 5, '1mo': 30, '3mo': 90, '6mo': 180, '1y': 365 };
|
|
12
|
+
constructor(options) { super(options); }
|
|
13
|
+
async getTicker(pair) {
|
|
14
|
+
pair = pair.toUpperCase();
|
|
15
|
+
const cacheKey = `btcturk:ticker:${pair}`;
|
|
16
|
+
const cached = this.cacheGet(cacheKey);
|
|
17
|
+
if (cached)
|
|
18
|
+
return cached;
|
|
19
|
+
try {
|
|
20
|
+
const response = await this.get(`${BtcTurkProvider.BASE_URL}/ticker`, { params: { pairSymbol: pair } });
|
|
21
|
+
const data = response.data;
|
|
22
|
+
if (!data.success)
|
|
23
|
+
throw new APIError(data.message ?? 'Unknown error');
|
|
24
|
+
if (!data.data || data.data.length === 0)
|
|
25
|
+
throw new DataNotAvailableError(`No data for pair: ${pair}`);
|
|
26
|
+
const ticker = data.data[0];
|
|
27
|
+
const result = {
|
|
28
|
+
symbol: ticker.pair, last: Number(ticker.last) || 0, open: Number(ticker.open) || 0,
|
|
29
|
+
high: Number(ticker.high) || 0, low: Number(ticker.low) || 0, bid: Number(ticker.bid) || 0,
|
|
30
|
+
ask: Number(ticker.ask) || 0, volume: Number(ticker.volume) || 0, change: Number(ticker.daily) || 0,
|
|
31
|
+
changePercent: Number(ticker.dailyPercent) || 0, timestamp: ticker.timestamp,
|
|
32
|
+
};
|
|
33
|
+
this.cacheSet(cacheKey, result, TTL.REALTIME_PRICE);
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof APIError || error instanceof DataNotAvailableError)
|
|
38
|
+
throw error;
|
|
39
|
+
throw new APIError(`Failed to fetch ticker for ${pair}: ${error}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async getHistory(pair, options = {}) {
|
|
43
|
+
pair = pair.toUpperCase();
|
|
44
|
+
const { period = '1mo', interval = '1d', start, end } = options;
|
|
45
|
+
const endDt = end ?? new Date();
|
|
46
|
+
const startDt = start ?? new Date(endDt.getTime() - (BtcTurkProvider.PERIOD_DAYS[period] ?? 30) * 24 * 60 * 60 * 1000);
|
|
47
|
+
const fromTs = Math.floor(startDt.getTime() / 1000);
|
|
48
|
+
const toTs = Math.floor(endDt.getTime() / 1000);
|
|
49
|
+
const cacheKey = `btcturk:history:${pair}:${interval}:${fromTs}:${toTs}`;
|
|
50
|
+
const cached = this.cacheGet(cacheKey);
|
|
51
|
+
if (cached)
|
|
52
|
+
return cached;
|
|
53
|
+
try {
|
|
54
|
+
const resolution = BtcTurkProvider.RESOLUTION_MAP[interval] ?? 1440;
|
|
55
|
+
const response = await this.get(`${BtcTurkProvider.GRAPH_API_URL}/v1/klines/history`, { params: { symbol: pair, resolution, from: fromTs, to: toTs } });
|
|
56
|
+
const data = response.data;
|
|
57
|
+
if (data.s !== 'ok')
|
|
58
|
+
throw new DataNotAvailableError(`No data available for ${pair}`);
|
|
59
|
+
const records = data.t.map((ts, i) => ({
|
|
60
|
+
date: new Date(ts * 1000), open: Number(data.o[i]) || 0, high: Number(data.h[i]) || 0,
|
|
61
|
+
low: Number(data.l[i]) || 0, close: Number(data.c[i]) || 0, volume: Number(data.v[i]) || 0,
|
|
62
|
+
}));
|
|
63
|
+
records.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
64
|
+
this.cacheSet(cacheKey, records, TTL.OHLCV_HISTORY);
|
|
65
|
+
return records;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
if (error instanceof DataNotAvailableError)
|
|
69
|
+
throw error;
|
|
70
|
+
throw new APIError(`Failed to fetch history for ${pair}: ${error}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async getPairs(quote = 'TRY') {
|
|
74
|
+
const cacheKey = `btcturk:pairs:${quote}`;
|
|
75
|
+
const cached = this.cacheGet(cacheKey);
|
|
76
|
+
if (cached)
|
|
77
|
+
return cached;
|
|
78
|
+
try {
|
|
79
|
+
const response = await this.get(`${BtcTurkProvider.BASE_URL}/ticker`);
|
|
80
|
+
if (!response.data.success)
|
|
81
|
+
return [];
|
|
82
|
+
const pairs = response.data.data.map(t => t.pair).filter(p => p.endsWith(quote.toUpperCase()));
|
|
83
|
+
this.cacheSet(cacheKey, pairs, TTL.COMPANY_LIST);
|
|
84
|
+
return pairs;
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return [];
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
let provider = null;
|
|
92
|
+
export function getBtcTurkProvider() { if (!provider)
|
|
93
|
+
provider = new BtcTurkProvider(); return provider; }
|
|
94
|
+
//# sourceMappingURL=btcturk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"btcturk.js","sourceRoot":"","sources":["../../src/providers/btcturk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doviz.com provider for forex and commodity data.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseProvider, ProviderOptions } from './base.js';
|
|
5
|
+
export interface FXCurrentData {
|
|
6
|
+
symbol: string;
|
|
7
|
+
last: number;
|
|
8
|
+
open: number;
|
|
9
|
+
high: number;
|
|
10
|
+
low: number;
|
|
11
|
+
updateTime?: Date;
|
|
12
|
+
}
|
|
13
|
+
export interface FXHistoryData {
|
|
14
|
+
date: Date;
|
|
15
|
+
open: number;
|
|
16
|
+
high: number;
|
|
17
|
+
low: number;
|
|
18
|
+
close: number;
|
|
19
|
+
}
|
|
20
|
+
export interface HistoryOptions {
|
|
21
|
+
period?: string;
|
|
22
|
+
start?: Date;
|
|
23
|
+
end?: Date;
|
|
24
|
+
}
|
|
25
|
+
export declare class DovizcomProvider extends BaseProvider {
|
|
26
|
+
private static readonly BASE_URL;
|
|
27
|
+
private static readonly FALLBACK_TOKEN;
|
|
28
|
+
private static readonly PERIOD_DAYS;
|
|
29
|
+
private static readonly SUPPORTED_ASSETS;
|
|
30
|
+
private static readonly FUEL_ASSETS;
|
|
31
|
+
private token;
|
|
32
|
+
private tokenExpiry;
|
|
33
|
+
constructor(options?: ProviderOptions);
|
|
34
|
+
private getToken;
|
|
35
|
+
private getOrigin;
|
|
36
|
+
getCurrent(asset: string): Promise<FXCurrentData>;
|
|
37
|
+
getHistory(asset: string, options?: HistoryOptions): Promise<FXHistoryData[]>;
|
|
38
|
+
private getFromDaily;
|
|
39
|
+
private getFromArchive;
|
|
40
|
+
}
|
|
41
|
+
export declare function getDovizcomProvider(): DovizcomProvider;
|
|
42
|
+
//# sourceMappingURL=dovizcom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dovizcom.d.ts","sourceRoot":"","sources":["../../src/providers/dovizcom.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,aAAa;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,IAAI,CAAC;CAAE;AAC5H,MAAM,WAAW,aAAa;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;CAAE;AACtG,MAAM,WAAW,cAAc;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CAAE;AAI9E,qBAAa,gBAAiB,SAAQ,YAAY;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAsE;IAC5G,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA6F;IAChI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAA0K;IAClN,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAA0C;IAC7E,OAAO,CAAC,KAAK,CAAuB;IAAC,OAAO,CAAC,WAAW,CAAa;gBAEzD,OAAO,CAAC,EAAE,eAAe;YAEvB,QAAQ;IAUtB,OAAO,CAAC,SAAS;IAEX,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAoBjD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;YA2BzE,YAAY;YAMZ,cAAc;CAM/B;AAGD,wBAAgB,mBAAmB,IAAI,gBAAgB,CAAuE"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* doviz.com provider for forex and commodity data.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseProvider } from './base.js';
|
|
5
|
+
import { TTL } from '../cache.js';
|
|
6
|
+
import { APIError, DataNotAvailableError } from '../exceptions.js';
|
|
7
|
+
export class DovizcomProvider extends BaseProvider {
|
|
8
|
+
static BASE_URL = 'https://api.doviz.com/api/v12';
|
|
9
|
+
static FALLBACK_TOKEN = '3e75d7fabf1c50c8b962626dd0e5ea22d8000815e1b0920d0a26afd77fcd6609';
|
|
10
|
+
static PERIOD_DAYS = { '1d': 1, '5d': 5, '1mo': 30, '3mo': 90, '6mo': 180, '1y': 365 };
|
|
11
|
+
static SUPPORTED_ASSETS = new Set(['USD', 'EUR', 'GBP', 'JPY', 'CHF', 'CAD', 'AUD', 'gram-altin', 'gumus', 'ons', 'XAG-USD', 'XPT-USD', 'XPD-USD', 'BRENT', 'WTI', 'diesel', 'gasoline', 'lpg']);
|
|
12
|
+
static FUEL_ASSETS = new Set(['gasoline', 'diesel', 'lpg']);
|
|
13
|
+
token = null;
|
|
14
|
+
tokenExpiry = 0;
|
|
15
|
+
constructor(options) { super(options); }
|
|
16
|
+
async getToken() {
|
|
17
|
+
if (this.token && Date.now() < this.tokenExpiry)
|
|
18
|
+
return this.token;
|
|
19
|
+
try {
|
|
20
|
+
const response = await this.get('https://www.doviz.com/', { responseType: 'text' });
|
|
21
|
+
const match = response.data.match(/token["']?\s*:\s*["']([a-f0-9]{64})["']/i) || response.data.match(/Bearer\s+([a-f0-9]{64})/i);
|
|
22
|
+
if (match) {
|
|
23
|
+
this.token = match[1];
|
|
24
|
+
this.tokenExpiry = Date.now() + 3600000;
|
|
25
|
+
return this.token;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch { /* fallback */ }
|
|
29
|
+
return DovizcomProvider.FALLBACK_TOKEN;
|
|
30
|
+
}
|
|
31
|
+
getOrigin(asset) { return ['gram-altin', 'gumus', 'ons'].includes(asset) ? 'https://altin.doviz.com' : 'https://www.doviz.com'; }
|
|
32
|
+
async getCurrent(asset) {
|
|
33
|
+
const normalizedAsset = DovizcomProvider.SUPPORTED_ASSETS.has(asset.toUpperCase()) ? asset.toUpperCase() : asset;
|
|
34
|
+
if (!DovizcomProvider.SUPPORTED_ASSETS.has(normalizedAsset))
|
|
35
|
+
throw new DataNotAvailableError(`Unsupported asset: ${asset}`);
|
|
36
|
+
const cacheKey = `dovizcom:current:${normalizedAsset}`;
|
|
37
|
+
const cached = this.cacheGet(cacheKey);
|
|
38
|
+
if (cached)
|
|
39
|
+
return cached;
|
|
40
|
+
try {
|
|
41
|
+
const data = DovizcomProvider.FUEL_ASSETS.has(normalizedAsset) ? await this.getFromArchive(normalizedAsset, 7) : await this.getFromDaily(normalizedAsset);
|
|
42
|
+
if (!data)
|
|
43
|
+
throw new DataNotAvailableError(`No data for ${asset}`);
|
|
44
|
+
const result = { symbol: normalizedAsset, last: Number(data.close) || 0, open: Number(data.open) || 0, high: Number(data.highest) || 0, low: Number(data.lowest) || 0, updateTime: data.update_date ? new Date(data.update_date * 1000) : undefined };
|
|
45
|
+
this.cacheSet(cacheKey, result, TTL.FX_RATES);
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof DataNotAvailableError)
|
|
50
|
+
throw error;
|
|
51
|
+
throw new APIError(`Failed to fetch current for ${asset}: ${error}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async getHistory(asset, options = {}) {
|
|
55
|
+
const { period = '1mo', start, end } = options;
|
|
56
|
+
const normalizedAsset = DovizcomProvider.SUPPORTED_ASSETS.has(asset.toUpperCase()) ? asset.toUpperCase() : asset;
|
|
57
|
+
if (!DovizcomProvider.SUPPORTED_ASSETS.has(normalizedAsset))
|
|
58
|
+
throw new DataNotAvailableError(`Unsupported asset: ${asset}`);
|
|
59
|
+
const endDt = end ?? new Date();
|
|
60
|
+
const startDt = start ?? new Date(endDt.getTime() - (DovizcomProvider.PERIOD_DAYS[period] ?? 30) * 24 * 60 * 60 * 1000);
|
|
61
|
+
const cacheKey = `dovizcom:history:${normalizedAsset}:${startDt.toISOString()}:${endDt.toISOString()}`;
|
|
62
|
+
const cached = this.cacheGet(cacheKey);
|
|
63
|
+
if (cached)
|
|
64
|
+
return cached;
|
|
65
|
+
try {
|
|
66
|
+
const token = await this.getToken();
|
|
67
|
+
const origin = this.getOrigin(normalizedAsset);
|
|
68
|
+
const response = await this.get(`${DovizcomProvider.BASE_URL}/assets/${normalizedAsset}/archive`, {
|
|
69
|
+
params: { start: Math.floor(startDt.getTime() / 1000), end: Math.floor(endDt.getTime() / 1000) },
|
|
70
|
+
headers: { 'Authorization': `Bearer ${token}`, 'Origin': origin, 'Referer': `${origin}/` },
|
|
71
|
+
});
|
|
72
|
+
const records = (response.data?.data?.archive ?? []).map(item => ({
|
|
73
|
+
date: new Date((item.update_date ?? 0) * 1000), open: Number(item.open) || 0, high: Number(item.highest) || 0, low: Number(item.lowest) || 0, close: Number(item.close) || 0,
|
|
74
|
+
}));
|
|
75
|
+
records.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
76
|
+
this.cacheSet(cacheKey, records, TTL.OHLCV_HISTORY);
|
|
77
|
+
return records;
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof DataNotAvailableError)
|
|
81
|
+
throw error;
|
|
82
|
+
throw new APIError(`Failed to fetch history for ${asset}: ${error}`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async getFromDaily(asset) {
|
|
86
|
+
const token = await this.getToken();
|
|
87
|
+
const origin = this.getOrigin(asset);
|
|
88
|
+
const response = await this.get(`${DovizcomProvider.BASE_URL}/assets/${asset}/daily`, { params: { limit: 1 }, headers: { 'Authorization': `Bearer ${token}`, 'Origin': origin, 'Referer': `${origin}/` } });
|
|
89
|
+
const archive = response.data?.data?.archive ?? [];
|
|
90
|
+
return archive.length > 0 ? archive[0] : null;
|
|
91
|
+
}
|
|
92
|
+
async getFromArchive(asset, days) {
|
|
93
|
+
const token = await this.getToken();
|
|
94
|
+
const origin = this.getOrigin(asset);
|
|
95
|
+
const endTime = Math.floor(Date.now() / 1000);
|
|
96
|
+
const startTime = endTime - (days * 86400);
|
|
97
|
+
const response = await this.get(`${DovizcomProvider.BASE_URL}/assets/${asset}/archive`, { params: { start: startTime, end: endTime }, headers: { 'Authorization': `Bearer ${token}`, 'Origin': origin, 'Referer': `${origin}/` } });
|
|
98
|
+
const archive = response.data?.data?.archive ?? [];
|
|
99
|
+
return archive.length > 0 ? archive[archive.length - 1] : null;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
let provider = null;
|
|
103
|
+
export function getDovizcomProvider() { if (!provider)
|
|
104
|
+
provider = new DovizcomProvider(); return provider; }
|
|
105
|
+
//# sourceMappingURL=dovizcom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dovizcom.js","sourceRoot":"","sources":["../../src/providers/dovizcom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider exports for advanced usage.
|
|
3
|
+
*/
|
|
4
|
+
export { BaseProvider } from './base.js';
|
|
5
|
+
export type { ProviderOptions } from './base.js';
|
|
6
|
+
export { getBtcTurkProvider, BtcTurkProvider } from './btcturk.js';
|
|
7
|
+
export type { TickerData, OHLCVData as CryptoOHLCVData, HistoryOptions as CryptoHistoryOptions } from './btcturk.js';
|
|
8
|
+
export { getParaticProvider, ParaticProvider } from './paratic.js';
|
|
9
|
+
export type { QuoteData, OHLCVData, HistoryOptions } from './paratic.js';
|
|
10
|
+
export { getDovizcomProvider, DovizcomProvider } from './dovizcom.js';
|
|
11
|
+
export type { FXCurrentData, FXHistoryData, HistoryOptions as FXHistoryOptions } from './dovizcom.js';
|
|
12
|
+
export { getTefasProvider, TefasProvider } from './tefas.js';
|
|
13
|
+
export type { FundInfo, FundHistoryData, HistoryOptions as FundHistoryOptions, SearchResult } from './tefas.js';
|
|
14
|
+
export { getTcmbProvider, TcmbProvider } from './tcmb.js';
|
|
15
|
+
export type { InflationLatest, InflationData, InflationCalculation, InflationDataOptions } from './tcmb.js';
|
|
16
|
+
export { getViopProvider, ViopProvider } from './viop.js';
|
|
17
|
+
export type { ContractData, ContractCategory } from './viop.js';
|
|
18
|
+
export { getKapProvider, KapProvider } from './kap.js';
|
|
19
|
+
export type { Company, Disclosure } from './kap.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,UAAU,EAAE,SAAS,IAAI,eAAe,EAAE,cAAc,IAAI,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAErH,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,IAAI,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtG,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,IAAI,kBAAkB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhH,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAE5G,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAEhE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider exports for advanced usage.
|
|
3
|
+
*/
|
|
4
|
+
export { BaseProvider } from './base.js';
|
|
5
|
+
export { getBtcTurkProvider, BtcTurkProvider } from './btcturk.js';
|
|
6
|
+
export { getParaticProvider, ParaticProvider } from './paratic.js';
|
|
7
|
+
export { getDovizcomProvider, DovizcomProvider } from './dovizcom.js';
|
|
8
|
+
export { getTefasProvider, TefasProvider } from './tefas.js';
|
|
9
|
+
export { getTcmbProvider, TcmbProvider } from './tcmb.js';
|
|
10
|
+
export { getViopProvider, ViopProvider } from './viop.js';
|
|
11
|
+
export { getKapProvider, KapProvider } from './kap.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGnE,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { BaseProvider, ProviderOptions } from './base.js';
|
|
2
|
+
export interface Company {
|
|
3
|
+
ticker: string;
|
|
4
|
+
name: string;
|
|
5
|
+
city: string;
|
|
6
|
+
}
|
|
7
|
+
export interface Disclosure {
|
|
8
|
+
id: string;
|
|
9
|
+
date: Date;
|
|
10
|
+
title: string;
|
|
11
|
+
type: string;
|
|
12
|
+
url: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class KapProvider extends BaseProvider {
|
|
15
|
+
private static readonly BASE_URL;
|
|
16
|
+
constructor(options?: ProviderOptions);
|
|
17
|
+
getCompanies(): Promise<Company[]>;
|
|
18
|
+
search(query: string): Promise<Company[]>;
|
|
19
|
+
}
|
|
20
|
+
export interface ContractData {
|
|
21
|
+
code: string;
|
|
22
|
+
contract: string;
|
|
23
|
+
price: number;
|
|
24
|
+
change: number;
|
|
25
|
+
volumeTl: number;
|
|
26
|
+
volumeQty: number;
|
|
27
|
+
category: string;
|
|
28
|
+
}
|
|
29
|
+
export declare class ViopProvider extends BaseProvider {
|
|
30
|
+
private static readonly BASE_URL;
|
|
31
|
+
constructor(options?: ProviderOptions);
|
|
32
|
+
getFutures(category?: 'all' | 'stock' | 'index' | 'currency' | 'commodity'): Promise<ContractData[]>;
|
|
33
|
+
getOptions(category?: 'all' | 'stock' | 'index'): Promise<ContractData[]>;
|
|
34
|
+
}
|
|
35
|
+
export declare function getKapProvider(): KapProvider;
|
|
36
|
+
export declare function getViopProvider(): ViopProvider;
|
|
37
|
+
//# sourceMappingURL=kap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kap.d.ts","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,OAAO;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;CAAE;AACxE,MAAM,WAAW,UAAU;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;CAAE;AAEjG,qBAAa,WAAY,SAAQ,YAAY;IACzC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;gBAChD,OAAO,CAAC,EAAE,eAAe;IAE/B,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAiBlC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAKlD;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;CAAE;AAEvJ,qBAAa,YAAa,SAAQ,YAAY;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuE;gBAC3F,OAAO,CAAC,EAAE,eAAe;IAE/B,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,WAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAyB3G,UAAU,CAAC,QAAQ,GAAE,KAAK,GAAG,OAAO,GAAG,OAAe,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAsBzF;AAGD,wBAAgB,cAAc,IAAI,WAAW,CAA2E;AAExH,wBAAgB,eAAe,IAAI,YAAY,CAA+E"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KAP provider for company data and VIOP provider.
|
|
3
|
+
*/
|
|
4
|
+
import * as cheerio from 'cheerio';
|
|
5
|
+
import { BaseProvider } from './base.js';
|
|
6
|
+
import { TTL } from '../cache.js';
|
|
7
|
+
import { APIError } from '../exceptions.js';
|
|
8
|
+
export class KapProvider extends BaseProvider {
|
|
9
|
+
static BASE_URL = 'https://www.kap.org.tr';
|
|
10
|
+
constructor(options) { super(options); }
|
|
11
|
+
async getCompanies() {
|
|
12
|
+
const cacheKey = 'kap:companies';
|
|
13
|
+
const cached = this.cacheGet(cacheKey);
|
|
14
|
+
if (cached)
|
|
15
|
+
return cached;
|
|
16
|
+
try {
|
|
17
|
+
const response = await this.get(`${KapProvider.BASE_URL}/tr/bist-sirketleri`, { responseType: 'text' });
|
|
18
|
+
const $ = cheerio.load(response.data);
|
|
19
|
+
const companies = [];
|
|
20
|
+
$('table.dataTable tbody tr').each((_, row) => {
|
|
21
|
+
const cells = $(row).find('td');
|
|
22
|
+
if (cells.length >= 3)
|
|
23
|
+
companies.push({ ticker: $(cells[0]).text().trim(), name: $(cells[1]).text().trim(), city: $(cells[2]).text().trim() });
|
|
24
|
+
});
|
|
25
|
+
this.cacheSet(cacheKey, companies, TTL.COMPANY_LIST);
|
|
26
|
+
return companies;
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw new APIError(`Failed to fetch companies: ${error}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async search(query) {
|
|
33
|
+
const companies = await this.getCompanies();
|
|
34
|
+
const q = query.toLowerCase();
|
|
35
|
+
return companies.filter(c => c.ticker.toLowerCase().includes(q) || c.name.toLowerCase().includes(q));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export class ViopProvider extends BaseProvider {
|
|
39
|
+
static BASE_URL = 'https://www.isyatirim.com.tr/tr-tr/analiz/Sayfalar/viop-akis.aspx';
|
|
40
|
+
constructor(options) { super(options); }
|
|
41
|
+
async getFutures(category = 'all') {
|
|
42
|
+
const cacheKey = `viop:futures:${category}`;
|
|
43
|
+
const cached = this.cacheGet(cacheKey);
|
|
44
|
+
if (cached)
|
|
45
|
+
return cached;
|
|
46
|
+
try {
|
|
47
|
+
const response = await this.get(ViopProvider.BASE_URL, { responseType: 'text' });
|
|
48
|
+
const $ = cheerio.load(response.data);
|
|
49
|
+
const contracts = [];
|
|
50
|
+
$('table.dataTable tbody tr').each((_, row) => {
|
|
51
|
+
const cells = $(row).find('td');
|
|
52
|
+
if (cells.length < 6)
|
|
53
|
+
return;
|
|
54
|
+
const code = $(cells[0]).text().trim();
|
|
55
|
+
let cat = 'stock';
|
|
56
|
+
if (code.includes('XU') || code.includes('XLBNK'))
|
|
57
|
+
cat = 'index';
|
|
58
|
+
else if (code.includes('USD') || code.includes('EUR'))
|
|
59
|
+
cat = 'currency';
|
|
60
|
+
else if (code.includes('GAU') || code.includes('XAU'))
|
|
61
|
+
cat = 'commodity';
|
|
62
|
+
if (category !== 'all' && cat !== category)
|
|
63
|
+
return;
|
|
64
|
+
const parseNum = (t) => parseFloat(t.replace(/\./g, '').replace(',', '.').replace(/[^\d.-]/g, '')) || 0;
|
|
65
|
+
contracts.push({ code, contract: $(cells[1]).text().trim(), price: parseNum($(cells[2]).text()), change: parseNum($(cells[3]).text()), volumeTl: parseNum($(cells[4]).text()), volumeQty: parseNum($(cells[5]).text()), category: cat });
|
|
66
|
+
});
|
|
67
|
+
this.cacheSet(cacheKey, contracts, TTL.VIOP);
|
|
68
|
+
return contracts;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
throw new APIError(`Failed to fetch futures: ${error}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async getOptions(category = 'all') {
|
|
75
|
+
const cacheKey = `viop:options:${category}`;
|
|
76
|
+
const cached = this.cacheGet(cacheKey);
|
|
77
|
+
if (cached)
|
|
78
|
+
return cached;
|
|
79
|
+
try {
|
|
80
|
+
const response = await this.get(ViopProvider.BASE_URL, { responseType: 'text' });
|
|
81
|
+
const $ = cheerio.load(response.data);
|
|
82
|
+
const contracts = [];
|
|
83
|
+
$('table.optionsTable tbody tr').each((_, row) => {
|
|
84
|
+
const cells = $(row).find('td');
|
|
85
|
+
if (cells.length < 6)
|
|
86
|
+
return;
|
|
87
|
+
const code = $(cells[0]).text().trim();
|
|
88
|
+
let cat = 'stock';
|
|
89
|
+
if (code.includes('XU') || code.includes('XLBNK'))
|
|
90
|
+
cat = 'index';
|
|
91
|
+
if (category !== 'all' && cat !== category)
|
|
92
|
+
return;
|
|
93
|
+
const parseNum = (t) => parseFloat(t.replace(/\./g, '').replace(',', '.').replace(/[^\d.-]/g, '')) || 0;
|
|
94
|
+
contracts.push({ code, contract: $(cells[1]).text().trim(), price: parseNum($(cells[2]).text()), change: parseNum($(cells[3]).text()), volumeTl: parseNum($(cells[4]).text()), volumeQty: parseNum($(cells[5]).text()), category: cat });
|
|
95
|
+
});
|
|
96
|
+
this.cacheSet(cacheKey, contracts, TTL.VIOP);
|
|
97
|
+
return contracts;
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
throw new APIError(`Failed to fetch options: ${error}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
let kapProvider = null;
|
|
105
|
+
export function getKapProvider() { if (!kapProvider)
|
|
106
|
+
kapProvider = new KapProvider(); return kapProvider; }
|
|
107
|
+
let viopProvider = null;
|
|
108
|
+
export function getViopProvider() { if (!viopProvider)
|
|
109
|
+
viopProvider = new ViopProvider(); return viopProvider; }
|
|
110
|
+
//# sourceMappingURL=kap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kap.js","sourceRoot":"","sources":["../../src/providers/kap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paratic provider for historical OHLCV data.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseProvider, ProviderOptions } from './base.js';
|
|
5
|
+
export interface QuoteData {
|
|
6
|
+
symbol: string;
|
|
7
|
+
last: number;
|
|
8
|
+
open: number;
|
|
9
|
+
high: number;
|
|
10
|
+
low: number;
|
|
11
|
+
close: number;
|
|
12
|
+
volume: number;
|
|
13
|
+
change: number;
|
|
14
|
+
changePercent: number;
|
|
15
|
+
updateTime: Date;
|
|
16
|
+
}
|
|
17
|
+
export interface OHLCVData {
|
|
18
|
+
date: Date;
|
|
19
|
+
open: number;
|
|
20
|
+
high: number;
|
|
21
|
+
low: number;
|
|
22
|
+
close: number;
|
|
23
|
+
volume: number;
|
|
24
|
+
}
|
|
25
|
+
export interface HistoryOptions {
|
|
26
|
+
period?: string;
|
|
27
|
+
interval?: string;
|
|
28
|
+
start?: Date;
|
|
29
|
+
end?: Date;
|
|
30
|
+
}
|
|
31
|
+
export declare class ParaticProvider extends BaseProvider {
|
|
32
|
+
private static readonly BASE_URL;
|
|
33
|
+
private static readonly PERIOD_MAP;
|
|
34
|
+
private static readonly INTERVAL_MAP;
|
|
35
|
+
constructor(options?: ProviderOptions);
|
|
36
|
+
private formatDate;
|
|
37
|
+
getQuote(symbol: string): Promise<QuoteData>;
|
|
38
|
+
getHistory(symbol: string, options?: HistoryOptions): Promise<OHLCVData[]>;
|
|
39
|
+
}
|
|
40
|
+
export declare function getParaticProvider(): ParaticProvider;
|
|
41
|
+
//# sourceMappingURL=paratic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paratic.d.ts","sourceRoot":"","sources":["../../src/providers/paratic.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI1D,MAAM,WAAW,SAAS;IACtB,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IACrF,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,IAAI,CAAC;CAC3E;AAED,MAAM,WAAW,SAAS;IAAG,IAAI,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;CAAE;AAClH,MAAM,WAAW,cAAc;IAAG,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CAAE;AAGjG,qBAAa,eAAgB,SAAQ,YAAY;IAC7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA0C;IAC1E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAA8I;IAChL,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAA4I;gBAEpK,OAAO,CAAC,EAAE,eAAe;IAErC,OAAO,CAAC,UAAU;IAMZ,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAgC5C,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CA8BvF;AAGD,wBAAgB,kBAAkB,IAAI,eAAe,CAAsE"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Paratic provider for historical OHLCV data.
|
|
3
|
+
*/
|
|
4
|
+
import { BaseProvider } from './base.js';
|
|
5
|
+
import { TTL } from '../cache.js';
|
|
6
|
+
import { APIError, DataNotAvailableError, TickerNotFoundError } from '../exceptions.js';
|
|
7
|
+
export class ParaticProvider extends BaseProvider {
|
|
8
|
+
static BASE_URL = 'https://piyasa.paratic.com/API/g.php';
|
|
9
|
+
static PERIOD_MAP = { '1d': 1, '5d': 5, '1mo': 30, '3mo': 90, '6mo': 180, '1y': 365, '2y': 730, '5y': 1825, '10y': 3650, 'max': 3650 };
|
|
10
|
+
static INTERVAL_MAP = { '1m': 1, '3m': 3, '5m': 5, '15m': 15, '30m': 30, '45m': 45, '1h': 60, '1d': 1440, '1wk': 10080, '1mo': 43200 };
|
|
11
|
+
constructor(options) { super(options); }
|
|
12
|
+
formatDate(date) {
|
|
13
|
+
const y = date.getFullYear(), m = String(date.getMonth() + 1).padStart(2, '0'), d = String(date.getDate()).padStart(2, '0');
|
|
14
|
+
const h = String(date.getHours()).padStart(2, '0'), mi = String(date.getMinutes()).padStart(2, '0'), s = String(date.getSeconds()).padStart(2, '0');
|
|
15
|
+
return `${y}${m}${d}${h}${mi}${s}`;
|
|
16
|
+
}
|
|
17
|
+
async getQuote(symbol) {
|
|
18
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
19
|
+
const cacheKey = `paratic:quote:${symbol}`;
|
|
20
|
+
const cached = this.cacheGet(cacheKey);
|
|
21
|
+
if (cached)
|
|
22
|
+
return cached;
|
|
23
|
+
const params = { a: 'd', c: symbol, p: 1440, from: '', at: this.formatDate(new Date()), group: 'f' };
|
|
24
|
+
try {
|
|
25
|
+
const response = await this.get(ParaticProvider.BASE_URL, { params });
|
|
26
|
+
const data = response.data;
|
|
27
|
+
if (!data || data.length === 0)
|
|
28
|
+
throw new TickerNotFoundError(symbol);
|
|
29
|
+
const latest = data[data.length - 1];
|
|
30
|
+
const prev = data.length > 1 ? data[data.length - 2] : null;
|
|
31
|
+
const prevClose = prev ? Number(prev.c) || 0 : 0;
|
|
32
|
+
const last = Number(latest.c) || 0;
|
|
33
|
+
const change = prevClose ? last - prevClose : 0;
|
|
34
|
+
const changePct = prevClose ? (change / prevClose) * 100 : 0;
|
|
35
|
+
const result = {
|
|
36
|
+
symbol, last, open: Number(latest.o) || 0, high: Number(latest.h) || 0, low: Number(latest.l) || 0,
|
|
37
|
+
close: prevClose, volume: Number(latest.v) || 0, change: Math.round(change * 100) / 100,
|
|
38
|
+
changePercent: Math.round(changePct * 100) / 100, updateTime: new Date(latest.d),
|
|
39
|
+
};
|
|
40
|
+
this.cacheSet(cacheKey, result, TTL.REALTIME_PRICE);
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
if (error instanceof TickerNotFoundError)
|
|
45
|
+
throw error;
|
|
46
|
+
throw new APIError(`Failed to fetch quote for ${symbol}: ${error}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async getHistory(symbol, options = {}) {
|
|
50
|
+
symbol = symbol.toUpperCase().replace('.IS', '').replace('.E', '');
|
|
51
|
+
const { period = '1mo', interval = '1d', start, end } = options;
|
|
52
|
+
const endDt = end ?? new Date();
|
|
53
|
+
const startDt = start ?? new Date(endDt.getTime() - (ParaticProvider.PERIOD_MAP[period] ?? 30) * 24 * 60 * 60 * 1000);
|
|
54
|
+
let cacheKey = `paratic:history:${symbol}:${period}:${interval}`;
|
|
55
|
+
if (start)
|
|
56
|
+
cacheKey += `:${start.toISOString()}`;
|
|
57
|
+
if (end)
|
|
58
|
+
cacheKey += `:${end.toISOString()}`;
|
|
59
|
+
const cached = this.cacheGet(cacheKey);
|
|
60
|
+
if (cached)
|
|
61
|
+
return cached;
|
|
62
|
+
const intervalMinutes = ParaticProvider.INTERVAL_MAP[interval] ?? 1440;
|
|
63
|
+
const params = { a: 'd', c: symbol, p: intervalMinutes, from: '', at: this.formatDate(endDt), group: 'f' };
|
|
64
|
+
try {
|
|
65
|
+
const response = await this.get(ParaticProvider.BASE_URL, { params });
|
|
66
|
+
const data = response.data;
|
|
67
|
+
if (!data || data.length === 0)
|
|
68
|
+
throw new DataNotAvailableError(`No data available for ${symbol}`);
|
|
69
|
+
const records = data.filter(item => item.d && new Date(item.d) >= startDt && new Date(item.d) <= endDt)
|
|
70
|
+
.map(item => ({ date: new Date(item.d), open: Number(item.o) || 0, high: Number(item.h) || 0, low: Number(item.l) || 0, close: Number(item.c) || 0, volume: Number(item.v) || 0 }));
|
|
71
|
+
records.sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
72
|
+
this.cacheSet(cacheKey, records, TTL.OHLCV_HISTORY);
|
|
73
|
+
return records;
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (error instanceof DataNotAvailableError)
|
|
77
|
+
throw error;
|
|
78
|
+
throw new APIError(`Failed to fetch data for ${symbol}: ${error}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
let provider = null;
|
|
83
|
+
export function getParaticProvider() { if (!provider)
|
|
84
|
+
provider = new ParaticProvider(); return provider; }
|
|
85
|
+
//# sourceMappingURL=paratic.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paratic.js","sourceRoot":"","sources":["../../src/providers/paratic.ts"],"names":[],"mappings":"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"}
|