UNPKG

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
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 };