{"_id":"@aluckylife/node-tdx-sdk","_rev":"3-87e9d2df7d0bb4bbd91b697f91b004d4","name":"@aluckylife/node-tdx-sdk","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"@aluckylife/node-tdx-sdk","version":"1.0.0","private":false,"description":"a tdx interface implemention by pure nodejs","dependencies":{"bufferpack":"0.0.6","iconv-lite":"^0.6.3","promise-socket":"^7.0.0","@aluckylife/node-utils":"1.0.0"},"devDependencies":{"@aluckylife/shared-interface":"1.0.0"},"main":"index.js","types":"index.d.ts","scripts":{"test:market":"node ./test/testMarket","test:exmarket":"node ./test/testExMarket","clean":"rm -rf dist build","clean:all":"npm run clean && rm -rf node_modules"},"_id":"@aluckylife/node-tdx-sdk@1.0.0","_integrity":"sha512-5Jm8LSl8sOcezzabGKHrW2P9boeujpza5bPNvYEMeAlBRh8Q0XdXN+J20c/mK/o44NcOglWpaO0CRoo0G8dBIg==","_resolved":"C:\\Users\\Administrator\\AppData\\Local\\Temp\\019247fd78dde750934c7e30da6ac7cd\\aluckylife-node-tdx-sdk-1.0.0.tgz","_from":"file:aluckylife-node-tdx-sdk-1.0.0.tgz","_nodeVersion":"20.9.0","_npmVersion":"10.1.0","dist":{"integrity":"sha512-5Jm8LSl8sOcezzabGKHrW2P9boeujpza5bPNvYEMeAlBRh8Q0XdXN+J20c/mK/o44NcOglWpaO0CRoo0G8dBIg==","shasum":"ddb6f2bad0da3739bb710d5eada205f97732a0d6","tarball":"https://registry.npmjs.org/@aluckylife/node-tdx-sdk/-/node-tdx-sdk-1.0.0.tgz","fileCount":5,"unpackedSize":15142,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH2x5PiTP0moLe5EqvsTTsq+vbz4aAiJIE56G6SnxOndAiEAslCq3RFEhOB9fW7LUXc9FoMySGRJU/Sxx45Wm/CFcps="}]},"_npmUser":{"name":"iamweilee","email":"383523223@qq.com"},"directories":{},"maintainers":[{"name":"iamweilee","email":"383523223@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-tdx-sdk_1.0.0_1705688097387_0.9773472170043196"},"_hasShrinkwrap":false},"1.0.1":{"name":"@aluckylife/node-tdx-sdk","version":"1.0.1","private":false,"description":"a tdx interface implemention by pure nodejs","dependencies":{"bufferpack":"0.0.6","iconv-lite":"^0.6.3","promise-socket":"^7.0.0","@aluckylife/node-utils":"1.0.0"},"devDependencies":{"@aluckylife/shared-interface":"1.0.0"},"main":"index.js","types":"index.d.ts","scripts":{"test:market":"node ./test/testMarket","test:exmarket":"node ./test/testExMarket","clean":"rm -rf dist build","clean:all":"npm run clean && rm -rf node_modules"},"_id":"@aluckylife/node-tdx-sdk@1.0.1","_integrity":"sha512-JnmIFMN5wuOzuxfEhB1JaZuJbl9PvlodnlR1sJ15Ol/vKYyuAYj2ere/b9DEQQlbcwg5CPfNRuNtaQ1HhUsyCQ==","_resolved":"C:\\Users\\Administrator\\AppData\\Local\\Temp\\83705e1b938aa7fce1bbda2ed73b515d\\aluckylife-node-tdx-sdk-1.0.1.tgz","_from":"file:aluckylife-node-tdx-sdk-1.0.1.tgz","_nodeVersion":"20.9.0","_npmVersion":"10.1.0","dist":{"integrity":"sha512-JnmIFMN5wuOzuxfEhB1JaZuJbl9PvlodnlR1sJ15Ol/vKYyuAYj2ere/b9DEQQlbcwg5CPfNRuNtaQ1HhUsyCQ==","shasum":"cc01d4c34c040c71c483aea4c01f843525348d80","tarball":"https://registry.npmjs.org/@aluckylife/node-tdx-sdk/-/node-tdx-sdk-1.0.1.tgz","fileCount":51,"unpackedSize":645426,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGibYmzj5tEh2HsAT1ahkdEgqgrbIgrP0FQof/rdihE/AiB2xfiL7NQ+OPdKVX651nJTM+a1aTzqX+uSdWCTBGNJHA=="}]},"_npmUser":{"name":"iamweilee","email":"383523223@qq.com"},"directories":{},"maintainers":[{"name":"iamweilee","email":"383523223@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-tdx-sdk_1.0.1_1705689265872_0.12875327832116779"},"_hasShrinkwrap":false},"1.1.0":{"name":"@aluckylife/node-tdx-sdk","version":"1.1.0","private":false,"description":"a tdx interface implemention by pure nodejs","dependencies":{"bufferpack":"0.0.6","iconv-lite":"^0.6.3","promise-socket":"^7.0.0","@aluckylife/node-utils":"1.0.0"},"devDependencies":{"@aluckylife/shared-interface":"1.1.0"},"main":"index.js","types":"index.d.ts","scripts":{"test:market":"node ./test/testMarket","test:exmarket":"node ./test/testExMarket","clean":"rm -rf dist build","clean:all":"npm run clean && rm -rf node_modules"},"_id":"@aluckylife/node-tdx-sdk@1.1.0","_integrity":"sha512-hKRaEiiI+zkHSqBX1+x2uW7pm2B5xKD76meL4gaSmTpsawcoTEYQRQDXySiY9nM4nkVgEmiDOnbWdXQY7zr1KA==","_resolved":"C:\\Users\\Administrator\\AppData\\Local\\Temp\\3ef97e814a7adde8b1f94cdb7cfc971a\\aluckylife-node-tdx-sdk-1.1.0.tgz","_from":"file:aluckylife-node-tdx-sdk-1.1.0.tgz","_nodeVersion":"20.9.0","_npmVersion":"10.1.0","dist":{"integrity":"sha512-hKRaEiiI+zkHSqBX1+x2uW7pm2B5xKD76meL4gaSmTpsawcoTEYQRQDXySiY9nM4nkVgEmiDOnbWdXQY7zr1KA==","shasum":"60590876ae1aacf58cdfbfa7eddc55942944f066","tarball":"https://registry.npmjs.org/@aluckylife/node-tdx-sdk/-/node-tdx-sdk-1.1.0.tgz","fileCount":51,"unpackedSize":645426,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDPHhoKzbwvD2YOKbQSNXFb6+D5Piu/3RAbRt93SKZiVgIgZWZvGQib7Z3Qkk3YTA9ozQ8QrctB6PlrXgJneJrNsa0="}]},"_npmUser":{"name":"iamweilee","email":"383523223@qq.com"},"directories":{},"maintainers":[{"name":"iamweilee","email":"383523223@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-tdx-sdk_1.1.0_1705931310432_0.9637748226128353"},"_hasShrinkwrap":false},"1.2.0":{"name":"@aluckylife/node-tdx-sdk","version":"1.2.0","private":false,"description":"a tdx interface implemention by pure nodejs","dependencies":{"bufferpack":"0.0.6","iconv-lite":"^0.6.3","promise-socket":"^7.0.0","@aluckylife/node-utils":"1.0.0"},"devDependencies":{"@aluckylife/shared-interface":"1.2.0"},"main":"index.js","types":"index.d.ts","scripts":{"test:market":"node ./test/testMarket","test:exmarket":"node ./test/testExMarket","clean":"rm -rf dist build","clean:all":"npm run clean && rm -rf node_modules"},"_id":"@aluckylife/node-tdx-sdk@1.2.0","_integrity":"sha512-biEb942xV89rYqdpK+cJL23V0ZSxdG23UAWVklrS6KUtRhx7eU08zTO5H4SWeZU794b/zTUJ3ZD3FSCNejyeDA==","_resolved":"C:\\Users\\Administrator\\AppData\\Local\\Temp\\e92f90ce2b7021899f3fb2224b71d5d5\\aluckylife-node-tdx-sdk-1.2.0.tgz","_from":"file:aluckylife-node-tdx-sdk-1.2.0.tgz","_nodeVersion":"20.9.0","_npmVersion":"10.1.0","dist":{"integrity":"sha512-biEb942xV89rYqdpK+cJL23V0ZSxdG23UAWVklrS6KUtRhx7eU08zTO5H4SWeZU794b/zTUJ3ZD3FSCNejyeDA==","shasum":"0a21751035f2cb95cdb19f17fc468eaf75e9a9e4","tarball":"https://registry.npmjs.org/@aluckylife/node-tdx-sdk/-/node-tdx-sdk-1.2.0.tgz","fileCount":51,"unpackedSize":645426,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDwt/7J7AMO/15uUlpVPynhM1zAFyQIpyfMcJxE/3/TKwIgFZbbQQqexaL5COp+28LFKra04xtZ2DTRKkepz14RBK8="}]},"_npmUser":{"name":"iamweilee","email":"383523223@qq.com"},"directories":{},"maintainers":[{"name":"iamweilee","email":"383523223@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-tdx-sdk_1.2.0_1705935937702_0.12262907041911952"},"_hasShrinkwrap":false}},"time":{"created":"2024-01-19T18:14:57.323Z","1.0.0":"2024-01-19T18:14:57.572Z","modified":"2024-01-22T15:05:38.170Z","1.0.1":"2024-01-19T18:34:26.146Z","1.1.0":"2024-01-22T13:48:30.698Z","1.2.0":"2024-01-22T15:05:37.965Z"},"maintainers":[{"name":"iamweilee","email":"383523223@qq.com"}],"description":"a tdx interface implemention by pure nodejs","readme":"# node-tdx-sdk\r\n\r\n# 通达信数据SDK\r\n\r\n## 概述\r\n\r\n使用纯nodejs类似TradeX的获取通达信行情接口的实现\r\n\r\n## 声明\r\n\r\n此代码用于个人对网络协议的研究和习作，不对外提供服务，任何人使用本代码遇到问题请自行解决，也可以在github提issue给我，但是我不保证能即时处理。\r\n由于我们连接的是既有的通达信兼容行情服务器，机构请不要使用此代码，对此造成的任何问题本人概不负责。\r\n\r\n## 安装\r\n\r\n```bash\r\n> npm install @aluckylife/node-tdx\r\n或\r\n> yarn add @aluckylife/node-tdx\r\n```\r\n\r\n### 服务器\r\n\r\n## 目前可用服务器\r\n\r\n[1] :招商证券深圳行情 (119.147.212.81:7709)\r\n\r\n[2] :上海双线主站 (101.133.214.242:7709)\r\n\r\n---\r\n\r\n功能列表：\r\n\r\n1 : 获取股票行情\r\n\r\n2 : 获取k线\r\n\r\n3 : 获取市场股票数量\r\n\r\n4 : 获取股票列表\r\n\r\n5 : 获取指数k线\r\n\r\n6 : 查询分时行情\r\n\r\n7 : 查询历史分时行情\r\n\r\n8 : 查询分笔成交\r\n\r\n9 : 查询历史分笔成交\r\n\r\n10 : 查询公司信息目录\r\n\r\n11 : 读取公司信息详情\r\n\r\n12 : 读取除权除息信息\r\n\r\n13 : 读取财务信息\r\n\r\n## 接口API\r\n\r\n下面是如何在程序里面调用本接口(这里行情数据的接口都是promise接口)\r\n\r\n首先需要引入\r\n\r\n```javascript\r\nconst { TdxMarketApi } = require('nodetdx');\r\n```\r\n\r\n然后，创建对象\r\n\r\n```javascript\r\nconst api = new TdxMarketApi();\r\n```\r\n\r\n之后，通常是如下的格式\r\n\r\n```javascript\r\nif (await api.connect('119.147.212.81', 7709)) {\r\n  // ... same codes...\r\n  api.disconnect();\r\n}\r\n```\r\n\r\n或者\r\n\r\n```javascript\r\n// 不传参数时将自动从hosts列表里挑选ping延迟最低的服务器\r\n// 需要注意的是ping延迟最低的服务器更新quote的时间未必是最及时的、最快的\r\n// 也就是说某些ping延迟低的服务器返回的quote可能比一些ping延迟高一点的服务器返回的quote更新的速度还慢\r\n// 这取决于服务器更新quote的速度\r\n// 所以当遇到这样的情况时最好手动指定host和port, 当然这个host和port必然是要经过自己的测试证明quote的更新速度的确是没有问题的\r\nif (await api.connect()) {\r\n  // ... same codes...\r\n  api.disconnect();\r\n}\r\n```\r\n\r\n可以使用的api方法有下列的几个。\r\n\r\n### api方法列表\r\n\r\n#### 参数一般性约定\r\n\r\n一般来说，股票代码和文件名称使用字符串类型，其它参数都使用数值类型\r\n\r\n#### 1 : 获取股票行情\r\n\r\n可以获取**多**只股票的行情信息\r\n\r\n需要传入 市场代码 + '.' + 股票代码 构成的symbol， 可同时查询多个symbol的行情\r\n`symbol1, symbol2, ..., symbolN`\r\n\r\n如：\r\n\r\n```javascript\r\nawait api.getSecurityQuotes('SZ.000001', 'SH.600300');\r\n```\r\n\r\n#### 2 : 获取k线\r\n\r\n- period->\r\n\r\n```\r\n周期代码\r\n1m  :  1分钟K线\r\n5m  :  5分钟K线\r\n15m :  15分钟K线\r\n30m :  30分钟K线\r\nH   :  1小时K线\r\nD   :  日K线\r\nW   :  周K线\r\nM   :  月K线\r\nQ   :  季K线\r\nY   :  年K线\r\n```\r\n\r\n- symbol -> 证券代码 + '.' + 市场代码;\r\n- start -> 指定的范围开始位置;\r\n- count -> 用户要请求的 K 线数目，最大值为 800\r\n\r\n如：\r\n\r\n```javascript\r\nawait api.getSecurityBars('D', 'SZ.000001', 0, 100);\r\n```\r\n\r\n#### 3 : 获取市场股票数量\r\n\r\n'SZ' - 深圳， 'SH' - 上海\r\n\r\n```javascript\r\nawait api.getSecurityCount('SH');\r\n```\r\n\r\n#### 4 : 获取股票列表\r\n\r\n参数：市场代码, 起始位置， 数量 如： 'SH',0 或 'SH',100\r\n\r\n```javascript\r\nawait api.getSecurityList('SH', 0);\r\n```\r\n\r\n#### 5 : 获取指数k线\r\n\r\n- period->\r\n\r\n```\r\n周期代码\r\n1m  :  1分钟K线\r\n5m  :  5分钟K线\r\n15m :  15分钟K线\r\n30m :  30分钟K线\r\nH   :  1小时K线\r\nD   :  日K线\r\nW   :  周K线\r\nM   :  月K线\r\nQ   :  季K线\r\nY   :  年K线\r\n```\r\n\r\n- symbol -> 证券代码 + '.' + 市场代码;\r\n- start -> 指定的范围开始位置;\r\n- count -> 用户要请求的 K 线数目，最大值为 800\r\n\r\n如：\r\n\r\n```javascript\r\nawait api.getIndexBars('D', 'SH.000001', 1, 2);\r\n```\r\n\r\n#### 6 : 查询分时行情\r\n\r\n参数：股票代码， 如： 'SZ.000001' 或 'SH.600300'\r\n\r\n```javascript\r\nawait api.getMinuteTimeData('SH.600300');\r\n```\r\n\r\n#### 7 : 查询历史分时行情\r\n\r\n参数：股票代码，时间 如： 'SH.600300', 20161209\r\n\r\n```javascript\r\nawait api.getHistoryMinuteTimeData('SH.600300', 20161209);\r\n```\r\n\r\n#### 8 : 查询分笔成交\r\n\r\n参数：股票代码，起始位置， 数量 如： SZ.000001\r\n\r\n```javascript\r\nawait api.getTransactionData('SZ.000001', 0, 30);\r\n```\r\n\r\n#### 9 : 查询历史分笔成交\r\n\r\n参数：股票代码，起始位置，日期 数量 如： 'SZ.000001',0,10,20170209\r\n\r\n```javascript\r\nawait api.getHistoryTransactionData('SZ.000001', 0, 10, 20170209);\r\n```\r\n\r\n#### 10 : 查询公司信息目录\r\n\r\n参数：股票代码， 如： 'SZ.000001'\r\n\r\n```javascript\r\nawait api.getCompanyInfoCategory('SZ.000001');\r\n```\r\n\r\n#### 11 : 读取公司信息详情\r\n\r\n参数：股票代码, 文件名, 起始位置， 数量, 如：'SZ.000001','000001.txt',2054363,9221\r\n\r\n```javascript\r\nawait api.getCompanyInfoContent('SZ.000001', '000001.txt', 0, 10000);\r\n```\r\n\r\n注意这里的 起始位置， 数量 参考上面接口的返回结果。\r\n\r\n#### 12 : 读取除权除息信息\r\n\r\n参数：股票代码， 如： 'SH.600300'\r\n\r\n```javascript\r\nawait api.getExRightInfo('SH.600300');\r\n```\r\n\r\n#### 13 : 读取财务信息\r\n\r\n参数：股票代码， 如： 'SZ.000001'\r\n\r\n```javascript\r\nawait api.getFinanceInfo('SZ.000001');\r\n```\r\n\r\n#### 14 : 获取k线(不区分是指数还是股票，会自动根据symbol进行区分)\r\n\r\n- period->\r\n\r\n```\r\n周期代码\r\n1m  :  1分钟K线\r\n5m  :  5分钟K线\r\n15m :  15分钟K线\r\n30m :  30分钟K线\r\nH   :  1小时K线\r\nD   :  日K线\r\nW   :  周K线\r\nM   :  月K线\r\nQ   :  季K线\r\nY   :  年K线\r\n```\r\n\r\n- symbol -> 证券代码 + '.' + 市场代码;\r\n- startDatetime -> 指定开始时间;\r\n- endDatetime -> 指定结束时间; (可省，若省略则endDatetime为当前时间)\r\n- count -> K线数量; (可省)\r\n\r\n如：\r\n\r\n```javascript\r\nawait api.findBars('1m', 'SH.000001', '2021-03-02', '2021-04-06');\r\nawait api.findBars('1m', 'SH.000001', null, '2021-04-06', 1000); // 查询2021-04-06之前1000条K线\r\nawait api.findBars('1m', 'SH.000001', '2021-03-02', null, 1000); // 查询2021-03-02之后1000条K线\r\nawait api.findBars('1m', 'SH.000001', '2021-03-02', '2021-04-06', 1000); // 查询2021-03-02和2021-04-06之间从2021-03-02开始的1000条K线，若K线数量少于1000条则取实际数量\r\n```\r\n\r\n#### 15 : 订阅信息（数据变化推送, 无变化不推送）\r\n\r\n- 第一个参数：函数名， 如： 'getSecurityQuotes'\r\n- 最后一个参数：回调函数, 用于接收订阅的数据\r\n- 剩余的参数：需要传递给第一个参数指定的函数需要的参数\r\n\r\n**注：在不支持线程的node版本, 该函数会开子进程轮询, 为防止子进程耗尽资源应谨慎使用, 通常用于订阅行情和K线比较合适**\r\n\r\n```javascript\r\napi.subscribe('getSecurityQuotes', 'SH.600519', callback);\r\n```\r\n\r\n#### 16 : 订阅行情（数据变化推送, 无变化不推送）\r\n\r\n- 最后一个参数：回调函数, 用于接收订阅的数据\r\n- 剩余的参数：需要订阅的股票symbol\r\n- 若要订阅全市场的股票行情则只需传一个回调函数作为参数\r\n\r\n**注：在不支持线程的node版本, 该函数会开子进程轮询, 为防止子进程耗尽资源应谨慎使用, 通常用于订阅行情和K线比较合适**\r\n\r\n```javascript\r\n// 订阅'SH.600519', 'SH.000001'的行情\r\napi.subscribeQuotes('SH.600519', 'SH.000001', callback);\r\n// 订阅全市场股票的行情\r\napi.subscribeQuotes(callback);\r\n```\r\n\r\n#### 17 : 查询指定市场所有股票信息列表\r\n\r\n- 参数：市场代码\r\n- 若参数为空则查询沪深两市所有股票信息列表\r\n\r\n```javascript\r\n// 查询沪市所有股票信息列表\r\nawait api.findStockList('SH');\r\n// 查询深市所有股票信息列表\r\nawait api.findStockList('SZ');\r\n// 查询沪市、深市所有股票信息列表\r\nawait api.findStockList();\r\n```\r\n\r\n#### 18 : 读取扩展行情\r\n\r\n待完善, 可参考标准行情用法\r\n\r\n#### 19 : 解析盘后下载的1分钟K线数据文件(\\*.lc1)\r\n\r\n可参考test/testReader.js\r\n\r\n```javascript\r\nconst path = require('path');\r\nconst { TdxMinuteBarReader } = require('nodetdx');\r\n\r\nconst reader = new TdxMinuteBarReader();\r\n\r\nconst result = reader.parseDataFromFile(path.join(__dirname, './sz000001.lc1'));\r\nconsole.log(JSON.stringify(result));\r\n```\r\n\r\n#### 18 : 一些常用代码\r\n\r\n市场代码（仅列出已被程序定义和实现的部分代码）：\r\n\r\n```\r\nSH       :   上证\r\nSZ       :   深证\r\nDCE      :   大商\r\nCZCE     :   郑商\r\nSHFE     :   上期\r\nCFFEX    :   中金\r\nO@CZCE   :   郑州商品期权\r\nO@DCE    :   大连商品期权\r\nO@SHFE   :   上海商品期权\r\nO@CFFEX  :   中金所期权\r\nO@SH     :   上海股票期权\r\nO@SZ     :   深圳股票期权\r\nMFC      :   主力期货合约\r\n```\r\n\r\n---\r\n\r\n查询k线支持的时间周期代码：\r\n\r\n```\r\n1m  :  1分钟\r\n5m  :  5分钟\r\n15m :  15分钟\r\n30m :  30分钟\r\nH   :  时\r\nD   :  日\r\nW   :  周\r\nM   :  月\r\nQ   :  季\r\nY   :  年\r\n```\r\n\r\n## 版本说明\r\n\r\nv3.8.0 支持 `node 8.*.*` 环境, ** 不支持多线程 **\r\nv4.0.0 支持 `node 10` 以上环境, ** 支持多线程 **\r\n\r\n## 其它\r\n\r\n本项目fork自[https://github.com/rainx/pytdx](https://github.com/rainx/pytdx)，在pytdx基础上修改而来，并修复了一些bug\r\n\r\n在此感谢pytdx的作者[RainX](https://github.com/rainx)\r\n","readmeFilename":"README.md"}