dukascopy-node-jason
Version:
Node.js library for downloading historical market tick data for for Crypto, Stocks, ETFs, CFDs, Forex
1,816 lines (1,809 loc) • 34.7 kB
JavaScript
import {
BufferFetcher,
CacheManager,
Format,
Instrument,
Price,
Timeframe,
URL_ROOT,
__export,
defaultConfig,
fetchJason,
formatBytes,
generateUrls,
instrumentMetaData,
instrument_meta_data_exports,
normaliseDates,
processData,
proxyConfig,
schema,
validateConfig,
validateConfigNode,
version
} from "./chunk-R63PZQ7H.js";
// src/output-formatter/index.ts
var headers = ["timestamp", "open", "high", "low", "close", "volume"];
var tickHeaders = ["timestamp", "askPrice", "bidPrice", "askVolume", "bidVolume"];
function formatOutput({
processedData,
format,
timeframe
}) {
if (processedData.length === 0) {
return [];
}
const bodyHeaders = timeframe === "tick" /* tick */ ? tickHeaders : headers;
if (format === "json" /* json */) {
const data = processedData.map((arr) => {
return arr.reduce((all, item, i) => {
const name = bodyHeaders[i];
all[name] = item;
return all;
}, {});
});
return data;
}
if (format === "csv" /* csv */) {
const csvHeaders = bodyHeaders.filter((_2, i) => processedData[0][i] !== void 0);
const csv = [csvHeaders, ...processedData].map((arr) => arr.join(",")).join("\n");
return csv;
}
return processedData;
}
// src/index.ts
import { RuleDate, RuleBoolean, RuleNumber, RuleString, RuleObject } from "fastest-validator";
// src/getHistoricalRates.ts
import debug from "debug";
import os from "os";
import _ from "lodash";
var DEBUG_NAMESPACE = "dukascopy-node-jason";
var proxyObjToExport = {};
var setProxyConfig = (proxyConfigSet = {}) => {
if (_.isEmpty(proxyConfig)) {
Object.keys(proxyConfigSet).forEach((keyProxyConfig) => {
proxyConfig[keyProxyConfig] = proxyConfigSet[keyProxyConfig];
});
}
};
async function getHistoricalRates(config, proxyObj = {}) {
debug(`${DEBUG_NAMESPACE}:proxyObj`)(proxyObj);
debug(`${DEBUG_NAMESPACE}:version`)(version);
debug(`${DEBUG_NAMESPACE}:nodejs`)(process.version);
debug(`${DEBUG_NAMESPACE}:os`)(`${os.type()}, ${os.release()} (${os.platform()})`);
Object.keys(proxyObj).forEach((key) => {
proxyObjToExport[key] = proxyObj[key];
if (key == "proxyConfig" && _.isEmpty(proxyConfig)) {
Object.keys(proxyObj[key]).forEach((keyProxyConfig) => {
proxyConfig[keyProxyConfig] = proxyObj[key][keyProxyConfig];
});
}
});
const { input, isValid, validationErrors } = validateConfigNode(config);
debug(`${DEBUG_NAMESPACE}:config`)("%O", {
input,
isValid,
validationErrors
});
if (!isValid) {
throw { validationErrors };
}
const {
instrument,
dates: { from, to },
timeframe,
priceType,
volumes,
volumeUnits,
utcOffset,
ignoreFlats,
format,
batchSize,
pauseBetweenBatchesMs,
useCache,
cacheFolderPath,
retryCount,
pauseBetweenRetriesMs,
retryOnEmpty
} = input;
const [startDate, endDate] = normaliseDates({
instrument,
startDate: from,
endDate: to,
timeframe,
utcOffset
});
const urls = generateUrls({
instrument,
timeframe,
priceType,
startDate,
endDate
});
debug(`${DEBUG_NAMESPACE}:urls`)(`Generated ${urls.length} urls`);
debug(`${DEBUG_NAMESPACE}:urls`)(`%O`, urls);
const onItemFetch = process.env.DEBUG ? (url, buffer, isCacheHit) => {
debug(`${DEBUG_NAMESPACE}:fetcher`)(
url,
`| ${formatBytes(buffer.length)} |`,
`${isCacheHit ? "cache" : "network"}`
);
} : void 0;
const bufferFetcher = new BufferFetcher({
batchSize,
pauseBetweenBatchesMs,
cacheManager: useCache ? new CacheManager({ cacheFolderPath }) : void 0,
retryCount,
pauseBetweenRetriesMs,
onItemFetch,
retryOnEmpty
});
const bufferredData = await bufferFetcher.fetch(urls);
const processedData = processData({
instrument,
requestedTimeframe: timeframe,
bufferObjects: bufferredData,
priceType,
volumes,
volumeUnits,
ignoreFlats
});
const [startDateMs, endDateMs] = [+startDate, +endDate];
const filteredData = processedData.filter(
([timestamp]) => timestamp && timestamp >= startDateMs && timestamp < endDateMs
);
debug(`${DEBUG_NAMESPACE}:data`)(
`Generated ${filteredData.length} ${timeframe === "tick" /* tick */ ? "ticks" : "OHLC candles"}`
);
const formattedData = formatOutput({
processedData: filteredData,
format,
timeframe
});
return formattedData;
}
var getHistoricRates = getHistoricalRates;
// src/getCurrentRates.ts
var timeframeMap = {
tick: "TICK",
s1: "1SEC",
m1: "1MIN",
m5: "5MIN",
m15: "15MIN",
m30: "30MIN",
h1: "1HOUR",
h4: "4HOUR",
d1: "1DAY",
mn1: "1MONTH"
};
async function getCurrentRates({
instrument,
priceType = "bid",
timeframe = "d1",
volumes = true,
format = "array",
dates,
limit
}) {
const mappedTimeframe = timeframeMap[timeframe];
const instrumentName = instrumentMetaData[instrument].name;
const offerSide = priceType === "bid" ? "B" : "A";
const timeDirection = "N";
const now = new Date();
let fromDate = now;
let toDate = now;
if (dates) {
const { from, to = now } = dates;
fromDate = typeof from === "string" || typeof from === "number" ? new Date(from) : from;
toDate = typeof to === "string" || typeof to === "number" ? new Date(to) : to;
} else {
fromDate = getTimeframeLimit(timeframe, now, limit || 10);
toDate = now;
}
let targetTimestamp = +toDate;
let shouldFetch = true;
let rates = [];
while (targetTimestamp > +fromDate && shouldFetch) {
const fetchSeed = generateSeed();
const urlParams = new URLSearchParams({
path: "chart/json3",
instrument: instrumentName,
offer_side: offerSide,
interval: mappedTimeframe,
splits: "true",
stocks: "true",
init: "true",
time_direction: timeDirection,
timestamp: String(targetTimestamp),
jsonp: `_callbacks____${fetchSeed}`
});
const url = `https://freeserv.dukascopy.com/2.0/index.php?${urlParams.toString()}`;
let fetchedRates = [];
try {
const rawResponse = await fetchJason(url, {
headers: {
Referer: "https://freeserv.dukascopy.com/2.0"
}
});
const rawResponseText = await rawResponse.text();
const responseClean = rawResponseText.replace(`_callbacks____${fetchSeed}(`, "").replace(");", "");
fetchedRates = JSON.parse(responseClean);
if (fetchedRates.length > 0) {
const start = +new Date(fetchedRates[0][0]);
targetTimestamp = start;
rates.unshift(...fetchedRates);
} else {
shouldFetch = false;
}
} catch (err) {
shouldFetch = false;
}
}
const shouldSlice = !dates && (typeof limit === "undefined" || typeof limit === "number");
let filteredRates = shouldSlice ? rates.slice((limit || 10) * -1) : rates.filter(function(item) {
let key = item[0];
const isWithinBounds = item[0] >= +fromDate && item[0] < +toDate;
const isUnique = !this.has(key);
if (isWithinBounds && isUnique) {
this.add(key);
return true;
}
return false;
}, /* @__PURE__ */ new Set());
if (!volumes) {
if (timeframe === "tick") {
filteredRates = filteredRates.map((item) => [item[0], item[1], item[2]]);
} else {
filteredRates = filteredRates.map((item) => [item[0], item[1], item[2], item[3], item[4]]);
}
}
const output = formatOutput({ processedData: filteredRates, format, timeframe });
return output;
}
function generateSeed() {
const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
for (let i = 10; i > 0; --i)
result += chars[Math.floor(Math.random() * chars.length)];
return result;
}
function getTimeframeLimit(timeframe, now, limit) {
const nowTimestamp = +now;
const bufferMultiplier = 5;
const timeframeLimits = {
tick: 1e3,
s1: 1e3,
m1: 60 * 1e3,
m5: 5 * 60 * 1e3,
m15: 15 * 60 * 1e3,
m30: 30 * 60 * 1e3,
h1: 60 * 60 * 1e3,
h4: 4 * 60 * 60 * 1e3,
d1: 24 * 60 * 60 * 1e3,
mn1: 30 * 24 * 60 * 60 * 1e3
};
return new Date(nowTimestamp - limit * bufferMultiplier * timeframeLimits[timeframe]);
}
// src/utils/instrument-meta-data/generated/instrument-groups.json
var instrument_groups_exports = {};
__export(instrument_groups_exports, {
default: () => instrument_groups_default
});
var instrument_groups_default = [
{
id: "bnd_cfd",
instruments: [
"bundtreur",
"ukgilttrgbp",
"ustbondtrusd"
]
},
{
id: "vccy",
instruments: [
"adausd",
"aveusd",
"batusd",
"bchchf",
"bcheur",
"bchgbp",
"bchusd",
"btcchf",
"btceur",
"btcgbp",
"btcusd",
"cmpusd",
"dshusd",
"enjusd",
"eosusd",
"ethchf",
"etheur",
"ethgbp",
"ethusd",
"lnkusd",
"ltcchf",
"ltceur",
"ltcgbp",
"ltcusd",
"matusd",
"mkrusd",
"trxusd",
"uniusd",
"xlmchf",
"xlmeur",
"xlmgbp",
"xlmusd",
"yfiusd"
]
},
{
id: "cmd_agricultural",
instruments: [
"cocoacmdusd",
"coffeecmdusx",
"cottoncmdusx",
"ojuicecmdusx",
"soybeancmdusx",
"sugarcmdusd"
]
},
{
id: "cmd_energy",
instruments: [
"dieselcmdusd",
"brentcmdusd",
"lightcmdusd",
"gascmdusd"
]
},
{
id: "cmd_metals",
instruments: [
"coppercmdusd",
"xpdcmdusd",
"xptcmdusd"
]
},
{
id: "etf_cfd_de",
instruments: [
"tecdaxedeeur"
]
},
{
id: "etf_cfd_fr",
instruments: [
"dsbfreur",
"lvcfreur",
"lyxbnkfreur"
]
},
{
id: "etf_cfd_hk",
instruments: [
"2822hkhkd",
"2828hkhkd",
"2836hkhkd",
"3188hkhkd"
]
},
{
id: "etf_cfd_us",
instruments: [
"diaususd",
"dvyususd",
"eemususd",
"efaususd",
"embususd",
"ewhususd",
"ewjususd",
"ewwususd",
"ewzususd",
"ezuususd",
"fxiususd",
"gdxususd",
"gdxjususd",
"gldususd",
"ibbususd",
"iefususd",
"ijhususd",
"ijrususd",
"iveususd",
"ivwususd",
"iwdususd",
"iwfususd",
"iwmususd",
"iyrususd",
"jnkususd",
"qqqususd",
"slvususd",
"spyususd",
"tltususd",
"usoususd",
"veaususd",
"vgkususd",
"vnqususd",
"vxxususd",
"xleususd",
"xlfususd",
"xliususd",
"xlkususd",
"xlpususd",
"xluususd",
"xlvususd",
"xlyususd",
"xopususd",
"arkqususd",
"arkxususd",
"awayususd",
"bitoususd",
"btfususd",
"espoususd",
"finxususd",
"ftxgususd",
"iakususd",
"itaususd",
"jetsususd",
"kieususd",
"kreususd",
"pbjususd",
"pejususd",
"ppaususd",
"roboususd",
"vdeususd",
"xresususd"
]
},
{
id: "fx_crosses",
instruments: [
"audcad",
"audchf",
"audjpy",
"audnzd",
"audsgd",
"cadchf",
"cadhkd",
"cadjpy",
"chfjpy",
"chfsgd",
"euraud",
"eurcad",
"eurchf",
"eurczk",
"eurdkk",
"eurgbp",
"eurhkd",
"eurhuf",
"eurjpy",
"eurnok",
"eurnzd",
"eurpln",
"eursek",
"eursgd",
"eurtry",
"gbpaud",
"gbpcad",
"gbpchf",
"gbpjpy",
"gbpnzd",
"hkdjpy",
"nzdcad",
"nzdchf",
"nzdjpy",
"sgdjpy",
"tryjpy",
"usdaed",
"usdcnh",
"usdczk",
"usddkk",
"usdhkd",
"usdhuf",
"usdils",
"usdmxn",
"usdnok",
"usdpln",
"usdron",
"usdsar",
"usdsek",
"usdsgd",
"usdthb",
"usdtry",
"usdzar",
"zarjpy"
]
},
{
id: "fx_majors",
instruments: [
"audusd",
"eurusd",
"gbpusd",
"nzdusd",
"usdcad",
"usdchf",
"usdjpy"
]
},
{
id: "fx_metals",
instruments: [
"xagusd",
"xauusd"
]
},
{
id: "idx_america",
instruments: [
"dollaridxusd",
"usa30idxusd",
"usatechidxusd",
"usa500idxusd",
"ussc2000idxusd",
"volidxusd"
]
},
{
id: "idx_asia",
instruments: [
"chiidxusd",
"hkgidxhkd",
"jpnidxjpy",
"ausidxaud",
"indidxusd",
"sgdidxsgd"
]
},
{
id: "idx_europe",
instruments: [
"fraidxeur",
"deuidxeur",
"eusidxeur",
"gbridxgbp",
"espidxeur",
"cheidxchf",
"itaidxeur",
"nldidxeur",
"plnidxpln"
]
},
{
id: "idx_africa",
instruments: [
"soaidxzar"
]
},
{
id: "austria",
instruments: [
"ebsateur",
"rbiateur",
"voeateur"
]
},
{
id: "belgium",
instruments: [
"abibeeur",
"agsbeeur",
"belgbeeur",
"kbcbeeur",
"solbbeeur",
"ucbbeeur",
"umibeeur"
]
},
{
id: "denmark",
instruments: [
"carlbdkdkk",
"colobdkdkk",
"danskedkdkk",
"maerskbdkdkk",
"novobdkdkk",
"nzymbdkdkk",
"pndoradkdkk",
"vwsdkdkk"
]
},
{
id: "finland",
instruments: [
"eli1vfieur",
"nes1vfieur",
"nre1vfieur",
"ote1vfieur",
"out1vfieur",
"stervfieur",
"tls1vfieur"
]
},
{
id: "france",
instruments: [
"acfreur",
"acafreur",
"affreur",
"aifreur",
"airfreur",
"alofreur",
"atofreur",
"bnfreur",
"bnpfreur",
"cafreur",
"capfreur",
"csfreur",
"dgfreur",
"dsyfreur",
"edffreur",
"enfreur",
"engifreur",
"fpfreur",
"frfreur",
"glefreur",
"hofreur",
"kerfreur",
"lifreur",
"lrfreur",
"mcfreur",
"mlfreur",
"orfreur",
"orafreur",
"pubfreur",
"rifreur",
"rmsfreur",
"rnofreur",
"saffreur",
"sanfreur",
"sgofreur",
"sufreur",
"swfreur",
"ugfreur",
"viefreur",
"vivfreur",
"vkfreur"
]
},
{
id: "germany",
instruments: [
"adsdeeur",
"alvdeeur",
"basdeeur",
"bayndeeur",
"beideeur",
"bmwdeeur",
"bnrdeeur",
"bossdeeur",
"cbkdeeur",
"condeeur",
"covdeeur",
"daideeur",
"db1deeur",
"dbkdeeur",
"dhrdeeur",
"dpwdeeur",
"dtedeeur",
"eoandeeur",
"fmedeeur",
"fredeeur",
"heideeur",
"hen3deeur",
"hfgdeeur",
"hnrdeeur",
"ifxdeeur",
"lhadeeur",
"lindeeur",
"lxsdeeur",
"mrkdeeur",
"mtxdeeur",
"muv2deeur",
"pah3deeur",
"psmdeeur",
"pumdeeur",
"rwedeeur",
"sapdeeur",
"sdfdeeur",
"siedeeur",
"srtdeeur",
"sy1deeur",
"tkadeeur",
"tui1deeur",
"vnadeeur",
"vow3deeur"
]
},
{
id: "hong-kong",
instruments: [
"0005hkhkd",
"0027hkhkd",
"0175hkhkd",
"0291hkhkd",
"0386hkhkd",
"0388hkhkd",
"0700hkhkd",
"0857hkhkd",
"0883hkhkd",
"0939hkhkd",
"0941hkhkd",
"0998hkhkd",
"1093hkhkd",
"1177hkhkd",
"1288hkhkd",
"1299hkhkd",
"1398hkhkd",
"1810hkhkd",
"1918hkhkd",
"2007hkhkd",
"2018hkhkd",
"2318hkhkd",
"2388hkhkd",
"2628hkhkd",
"3333hkhkd",
"3968hkhkd",
"3988hkhkd"
]
},
{
id: "ireland",
instruments: [
"birgieeur",
"crgieeur",
"krxieeur",
"krzieeur",
"ry4cieeur"
]
},
{
id: "italy",
instruments: [
"a2aiteur",
"agliteur",
"ampiteur",
"atliteur",
"azmiteur",
"bamiiteur",
"bciteur",
"bmpsiteur",
"bpeiteur",
"breiteur",
"bzuiteur",
"cassiteur",
"cerviteur",
"cpriteur",
"cvaliteur",
"daniteur",
"diaiteur",
"eneliteur",
"eniiteur",
"ergiteur",
"fbkiteur",
"fcaiteur",
"giteur",
"igiteur",
"inwiteur",
"ispiteur",
"juveiteur",
"ldoiteur",
"mbiteur",
"monciteur",
"msiteur",
"piaiteur",
"pryiteur",
"raceiteur",
"reciteur",
"sferiteur",
"spmiteur",
"srgiteur",
"srsiteur",
"stmiteur",
"teniteur",
"tisiteur",
"tititeur",
"toditeur",
"trniteur",
"ucgiteur",
"usiteur",
"wbditeur"
]
},
{
id: "japan",
instruments: [
"2502jpjpy",
"2503jpjpy",
"2914jpjpy",
"3382jpjpy",
"3436jpjpy",
"4004jpjpy",
"4005jpjpy",
"4063jpjpy",
"4452jpjpy",
"4502jpjpy",
"4503jpjpy",
"4507jpjpy",
"4523jpjpy",
"4543jpjpy",
"4689jpjpy",
"4911jpjpy",
"5108jpjpy",
"5301jpjpy",
"5401jpjpy",
"6098jpjpy",
"6301jpjpy",
"6367jpjpy",
"6501jpjpy",
"6502jpjpy",
"6503jpjpy",
"6506jpjpy",
"6702jpjpy",
"6752jpjpy",
"6758jpjpy",
"6762jpjpy",
"6902jpjpy",
"6954jpjpy",
"6971jpjpy",
"7201jpjpy",
"7203jpjpy",
"7261jpjpy",
"7267jpjpy",
"7269jpjpy",
"7270jpjpy",
"7751jpjpy",
"7974jpjpy",
"8031jpjpy",
"8035jpjpy",
"8306jpjpy",
"8316jpjpy",
"8411jpjpy",
"8766jpjpy",
"8801jpjpy",
"8802jpjpy",
"9020jpjpy",
"9432jpjpy",
"9433jpjpy",
"9501jpjpy",
"9983jpjpy",
"9984jpjpy"
]
},
{
id: "mexico",
instruments: [
"alfaamxmxn",
"alseamxmxn",
"amxlmxmxn",
"arcamxmxn",
"asurbmxmxn",
"bbajioomxmxn",
"bolsaamxmxn",
"cemexcpomxmxn",
"elektramxmxn",
"femsaubdmxmxn",
"gapbmxmxn",
"gcarsoa1mxmxn",
"gccmxmxn",
"gfnorteomxmxn",
"gmexicobmxmxn",
"grumabmxmxn",
"kimberamxmxn",
"kofublmxmxn",
"labbmxmxn",
"livepolc1mxmxn",
"megacpomxmxn",
"omabmxmxn",
"orbiamxmxn",
"peolesmxmxn",
"pinframxmxn",
"qmxmxn",
"ramxmxn",
"volaramxmxn",
"walmexmxmxn"
]
},
{
id: "netherlands",
instruments: [
"agnnleur",
"ahnleur",
"akzanleur",
"asmlnleur",
"dsmnleur",
"heianleur",
"inganleur",
"kpnnleur",
"mtnleur",
"phianleur",
"qianleur",
"randnleur",
"rdsanleur",
"rennleur",
"unanleur",
"vpknleur",
"wklnleur"
]
},
{
id: "norway",
instruments: [
"dnbnonok",
"mhgnonok",
"nhynonok",
"orknonok",
"stlnonok",
"telnonok"
]
},
{
id: "portugal",
instruments: [
"edppteur",
"galppteur"
]
},
{
id: "spain",
instruments: [
"acseseur",
"acxeseur",
"aenaeseur",
"amseseur",
"appeseur",
"bbvaeseur",
"cabkeseur",
"diaeseur",
"ebreseur",
"eleeseur",
"engeseur",
"fcceseur",
"fereseur",
"gameseur",
"gaseseur",
"grfeseur",
"ibeeseur",
"itxeseur",
"mapeseur",
"reeeseur",
"repeseur",
"saneseur",
"tefeseur",
"viseseur"
]
},
{
id: "sweden",
instruments: [
"abbsesek",
"alfasesek",
"atcoasesek",
"eluxbsesek",
"ericbsesek",
"getibsesek",
"hmbsesek",
"invebsesek",
"ndasesek",
"sandsesek",
"scabsesek",
"sebasesek",
"secubsesek",
"skabsesek",
"skfbsesek",
"swedasesek",
"swmasesek",
"tel2bsesek",
"tlsnsesek",
"volvbsesek"
]
},
{
id: "switzerland",
instruments: [
"abbnchchf",
"adenchchf",
"baerchchf",
"cfrchchf",
"clnchchf",
"csgnchchf",
"givnchchf",
"kninchchf",
"lhnchchf",
"lispchchf",
"lognchchf",
"lonnchchf",
"mbtnchchf",
"nesnchchf",
"novnchchf",
"oerlchchf",
"rogchchf",
"scmnchchf",
"sgsnchchf",
"slhnchchf",
"soonchchf",
"srenchchf",
"temnchchf",
"ubsgchchf",
"uhrchchf",
"uhrnchchf",
"vifnchchf",
"zurnchchf"
]
},
{
id: "uk",
instruments: [
"aalgbgbx",
"abfgbgbx",
"admgbgbx",
"agkgbgbx",
"ahtgbgbx",
"antogbgbx",
"avgbgbx",
"avvgbgbx",
"azngbgbx",
"bagbgbx",
"babgbgbx",
"barcgbgbx",
"batsgbgbx",
"bdevgbgbx",
"blndgbgbx",
"bltgbgbx",
"bnzlgbgbx",
"bpgbgbx",
"brbygbgbx",
"btgbgbx",
"cclgbgbx",
"cnagbgbx",
"cpggbgbx",
"cpigbgbx",
"crdagbgbx",
"crhgbgbx",
"dccgbgbx",
"dgegbgbx",
"dphgbgbx",
"ecmgbgbx",
"expngbgbx",
"ezjgbgbx",
"fresgbgbx",
"gfsgbgbx",
"glengbgbx",
"gskgbgbx",
"hikgbgbx",
"hlmagbgbx",
"hmsogbgbx",
"hsbagbgbx",
"iaggbgbx",
"icpgbgbx",
"ihggbgbx",
"iiigbgbx",
"imtgbgbx",
"itrkgbgbx",
"itvgbgbx",
"kgfgbgbx",
"landgbgbx",
"lgengbgbx",
"lloygbgbx",
"lsegbgbx",
"mggtgbgbx",
"mksgbgbx",
"mndigbgbx",
"mnggbgbx",
"mrwgbgbx",
"nggbgbx",
"nxtgbgbx",
"ocdogbgbx",
"pfcgbgbx",
"phnxgbgbx",
"prugbgbx",
"psngbgbx",
"psongbgbx",
"rbgbgbx",
"rbsgbgbx",
"rdsbgbgbx",
"relgbgbx",
"riogbgbx",
"rmggbgbx",
"rmvgbgbx",
"rrgbgbx",
"rsagbgbx",
"rtogbgbx",
"sbrygbgbx",
"sdrgbgbx",
"sgegbgbx",
"sgrogbgbx",
"skygbgbx",
"slagbgbx",
"smdsgbgbx",
"smingbgbx",
"smtgbgbx",
"sngbgbx",
"spxgbgbx",
"ssegbgbx",
"stangbgbx",
"stjgbgbx",
"svtgbgbx",
"tategbgbx",
"tlwgbgbx",
"tpkgbgbx",
"tscogbgbx",
"twgbgbx",
"ulvrgbgbx",
"uugbgbx",
"vodgbgbx",
"weirgbgbx",
"wosgbgbx",
"wppgbgbx",
"wtbgbgbx"
]
},
{
id: "us",
instruments: [
"aususd",
"aaususd",
"aabvususd",
"aalususd",
"aapususd",
"aaplususd",
"abcususd",
"abevususd",
"abmdususd",
"abtususd",
"acglususd",
"acmususd",
"acnususd",
"adbeususd",
"adiususd",
"adpususd",
"adskususd",
"aepususd",
"afgususd",
"agncususd",
"aigususd",
"ajgususd",
"albususd",
"algnususd",
"alkususd",
"alksususd",
"allususd",
"alleususd",
"allyususd",
"alnyususd",
"alxnususd",
"amatususd",
"amcrususd",
"amdususd",
"amgnususd",
"amhususd",
"ampususd",
"amtususd",
"amwlususd",
"amznususd",
"anetususd",
"anssususd",
"antmususd",
"aonususd",
"aosususd",
"apaususd",
"apdususd",
"aptvususd",
"arususd",
"areususd",
"armkususd",
"arwususd",
"atoususd",
"atviususd",
"avbususd",
"avgoususd",
"avlrususd",
"avtrususd",
"awkususd",
"axpususd",
"axtaususd",
"ayxususd",
"aznususd",
"azoususd",
"azpnususd",
"baususd",
"babaususd",
"bacususd",
"bahususd",
"bbdususd",
"bbwiususd",
"bbyususd",
"bdxususd",
"beryususd",
"bgususd",
"biduususd",
"biibususd",
"bioususd",
"bkususd",
"bkiususd",
"bkrususd",
"blkususd",
"bmrnususd",
"bmyususd",
"bpususd",
"bpopususd",
"brususd",
"brkbususd",
"brkrususd",
"broususd",
"brxususd",
"bsxususd",
"burlususd",
"bwaususd",
"byndususd",
"cususd",
"caccususd",
"caciususd",
"cagususd",
"cahususd",
"carrususd",
"casyususd",
"catususd",
"cbususd",
"cboeususd",
"cciususd",
"cckususd",
"cclususd",
"cdayususd",
"cdevususd",
"cdkususd",
"cdnsususd",
"cdwususd",
"ceususd",
"cernususd",
"cfususd",
"cfgususd",
"cfrususd",
"cgnxususd",
"chdususd",
"chngususd",
"ciususd",
"clususd",
"clrususd",
"cmcsaususd",
"cmeususd",
"cmgususd",
"cmiususd",
"cncususd",
"cofususd",
"cohrususd",
"coldususd",
"cooususd",
"copususd",
"costususd",
"coupususd",
"cpriususd",
"cprtususd",
"cptususd",
"crlususd",
"crmususd",
"csususd",
"cscoususd",
"csgpususd",
"cslususd",
"csxususd",
"ctlususd",
"ctltususd",
"ctshususd",
"ctvaususd",
"ctxsususd",
"cubeususd",
"cvnaususd",
"cvsususd",
"cvxususd",
"czrususd",
"dususd",
"dalususd",
"dbxususd",
"deususd",
"dellususd",
"dfsususd",
"dgususd",
"dhiususd",
"dhrususd",
"disususd",
"dksususd",
"dlrususd",
"dltrususd",
"docuususd",
"doxususd",
"dpzususd",
"dreususd",
"dtususd",
"dukususd",
"dvaususd",
"dvnususd",
"dxcususd",
"dxcmususd",
"eaususd",
"ebayususd",
"eeftususd",
"efxususd",
"ehcususd",
"eixususd",
"elususd",
"elanususd",
"elsususd",
"emrususd",
"enphususd",
"entgususd",
"eogususd",
"epamususd",
"eqhususd",
"eqtususd",
"esususd",
"essususd",
"estcususd",
"etnususd",
"etsyususd",
"evrgususd",
"ewususd",
"ewbcususd",
"excususd",
"exelususd",
"expeususd",
"exrususd",
"fususd",
"fangususd",
"fbususd",
"fbhsususd",
"fcncaususd",
"fcxususd",
"fdsususd",
"fdxususd",
"feususd",
"ficoususd",
"fitbususd",
"fiveususd",
"flususd",
"fltususd",
"fndususd",
"fnfususd",
"foxaususd",
"frcususd",
"ftiususd",
"ftntususd",
"ftvususd",
"gususd",
"gdususd",
"gddyususd",
"geususd",
"gggususd",
"ghususd",
"gildususd",
"gisususd",
"glususd",
"glpiususd",
"glwususd",
"gmususd",
"gnrcususd",
"googususd",
"googlususd",
"gpnususd",
"gpsususd",
"gsususd",
"gwwususd",
"hususd",
"halususd",
"hbiususd",
"hcaususd",
"hcnususd",
"hdususd",
"heiususd",
"hesususd",
"hiiususd",
"hltususd",
"hogususd",
"honususd",
"hpeususd",
"hpqususd",
"htaususd",
"hubbususd",
"hubsususd",
"humususd",
"hwmususd",
"hznpususd",
"ibkrususd",
"ibmususd",
"iceususd",
"idxxususd",
"iexususd",
"ilmnususd",
"incyususd",
"intcususd",
"intuususd",
"invhususd",
"ionsususd",
"ipgususd",
"ipgpususd",
"iqvususd",
"irususd",
"isrgususd",
"itususd",
"itubususd",
"itwususd",
"ivzususd",
"jazzususd",
"jbluususd",
"jciususd",
"jefususd",
"jkhyususd",
"jllususd",
"jnjususd",
"jpmususd",
"jwnususd",
"kususd",
"keyususd",
"keysususd",
"khcususd",
"kmbususd",
"kmiususd",
"kmxususd",
"knxususd",
"koususd",
"krususd",
"krcususd",
"kssususd",
"lususd",
"lamrususd",
"ldosususd",
"leaususd",
"lenususd",
"lhxususd",
"lkqususd",
"llyususd",
"lmtususd",
"lncususd",
"lngususd",
"lntususd",
"lowususd",
"lplaususd",
"lrcxususd",
"lsiususd",
"lstrususd",
"luluususd",
"luvususd",
"lvsususd",
"lwususd",
"lybususd",
"lyftususd",
"lyvususd",
"mususd",
"maususd",
"maaususd",
"manhususd",
"marususd",
"masiususd",
"matususd",
"mcdususd",
"mchpususd",
"mckususd",
"mdbususd",
"mdlzususd",
"mdtususd",
"metususd",
"mgmususd",
"mhkususd",
"middususd",
"mklususd",
"mksiususd",
"mktxususd",
"mlmususd",
"mmmususd",
"mndtususd",
"moususd",
"mohususd",
"mpcususd",
"mpwususd",
"mpwrususd",
"mrkususd",
"mrnaususd",
"mroususd",
"mrvlususd",
"msususd",
"msciususd",
"msftususd",
"mtchususd",
"mtdususd",
"mtnususd",
"muususd",
"nbixususd",
"nclhususd",
"ndsnususd",
"neeususd",
"nemususd",
"nflxususd",
"nioususd",
"nkeususd",
"nlokususd",
"nlsnususd",
"nlyususd",
"nocususd",
"nowususd",
"nrgususd",
"nscususd",
"ntnxususd",
"nvdaususd",
"nvrususd",
"nwlususd",
"nwsususd",
"nxstususd",
"nytususd",
"oususd",
"ocususd",
"odflususd",
"ogeususd",
"ognususd",
"ohiususd",
"okeususd",
"oktaususd",
"oledususd",
"olliususd",
"olnususd",
"omcususd",
"omfususd",
"onususd",
"orclususd",
"orlyususd",
"otisususd",
"oxyususd",
"panwususd",
"paraususd",
"paycususd",
"payxususd",
"pbfususd",
"pbrususd",
"pcarususd",
"pcgususd",
"pclnususd",
"pctyususd",
"peakususd",
"pennususd",
"pepususd",
"pfeususd",
"pgususd",
"pgrususd",
"phususd",
"piiususd",
"pkgususd",
"planususd",
"plntususd",
"pltrususd",
"plugususd",
"pmususd",
"pncususd",
"pnrususd",
"poddususd",
"poolususd",
"ppgususd",
"prgoususd",
"pruususd",
"psaususd",
"pstgususd",
"psxususd",
"ptcususd",
"ptenususd",
"ptonususd",
"pvhususd",
"pxdususd",
"pyplususd",
"qcomususd",
"qrvoususd",
"rclususd",
"reususd",
"regususd",
"regnususd",
"rfususd",
"rgaususd",
"rgldususd",
"rjfususd",
"rmdususd",
"rngususd",
"rnrususd",
"rokuususd",
"rolususd",
"rostususd",
"rpmususd",
"rrcususd",
"rrxususd",
"rsususd",
"rtxususd",
"sabrususd",
"sbnyususd",
"sbuxususd",
"sccoususd",
"schwususd",
"sciususd",
"sedgususd",
"seicususd",
"sfmususd",
"sgenususd",
"shwususd",
"sivbususd",
"sjmususd",
"slbususd",
"slmususd",
"snapususd",
"snowususd",
"snpsususd",
"soususd",
"spgususd",
"spgiususd",
"splkususd",
"spotususd",
"sprususd",
"sqususd",
"srptususd",
"ssncususd",
"steususd",
"sttususd",
"stzususd",
"suiususd",
"swkususd",
"swksususd",
"syfususd",
"sykususd",
"syyususd",
"tususd",
"tapususd",
"tdgususd",
"tdyususd",
"teamususd",
"techususd",
"telususd",
"tevaususd",
"tfcususd",
"tfxususd",
"tgtususd",
"tjxususd",
"tmoususd",
"tmusususd",
"tolususd",
"tprususd",
"tpxususd",
"trgpususd",
"trmbususd",
"trowususd",
"truususd",
"trvususd",
"tslaususd",
"tsmususd",
"tsnususd",
"ttususd",
"ttdususd",
"ttwoususd",
"twloususd",
"twtrususd",
"txnususd",
"tylususd",
"uaususd",
"uaaususd",
"uberususd",
"udrususd",
"ugiususd",
"uhsususd",
"ultaususd",
"unhususd",
"unpususd",
"upsususd",
"uriususd",
"usbususd",
"usfdususd",
"uthrususd",
"vususd",
"valeususd",
"veevususd",
"vfcususd",
"viciususd",
"virtususd",
"vloususd",
"vmcususd",
"vmwususd",
"voyaususd",
"vrtxususd",
"vstususd",
"ualususd",
"vzususd",
"wususd",
"wabususd",
"walususd",
"wbaususd",
"wbsususd",
"wdayususd",
"wdcususd",
"wenususd",
"wexususd",
"wfcususd",
"whususd",
"whrususd",
"wlkususd",
"wmtususd",
"wpcususd",
"wrbususd",
"wrkususd",
"wsmususd",
"wsoususd",
"wstususd",
"wtrgususd",
"wtwususd",
"wwdususd",
"wynnususd",
"xususd",
"xlnxususd",
"xomususd",
"xpevususd",
"xpoususd",
"xylususd",
"yususd",
"yumususd",
"yumcususd",
"zususd",
"zbhususd",
"zbraususd",
"zenususd",
"zmususd",
"zsususd",
"ztsususd"
]
},
{
id: "etf_cfd",
instruments: [
"arkiususd",
"bugggbgbx",
"csh2gbgbx",
"cysegbgbx",
"esihgbgbx",
"iglnususd",
"iufsususd",
"semigbgbx",
"sgldususd",
"smhususd",
"smtcususd",
"wtaiususd",
"xdergbgbx",
"xdwhususd",
"xdwtususd",
"xresususd",
"csh2freur"
]
}
];
// src/index.ts
var instrumentsGroupExp = () => {
return instrument_groups_exports;
};
var instrumentsMetadataExp = () => {
return instrument_meta_data_exports;
};
export {
BufferFetcher,
CacheManager,
Format,
Instrument,
Price,
RuleBoolean,
RuleDate,
RuleNumber,
RuleObject,
RuleString,
Timeframe,
URL_ROOT,
defaultConfig,
formatOutput,
generateUrls,
getCurrentRates,
getHistoricRates,
getHistoricalRates,
instrumentsGroupExp,
instrumentsMetadataExp,
normaliseDates,
processData,
schema,
setProxyConfig,
validateConfig,
validateConfigNode
};