All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
getOptionKline签名变更:新增必填参数beginTime: number和endTime: number(毫秒时间戳,传-1为服务端默认值)。旧调用getOptionKline(identifiers, period)需改为getOptionKline(identifiers, period, -1, -1)。
getOptionExpiration新增可选market参数:getOptionExpiration(symbols, market?)— 查询 HK 期权时传'HK'。getOptionChain/getOptionQuote/getOptionKline时区参数:支持timezone可选参数覆盖自动推断;US 期权默认America/New_York,HK 期权(.HK后缀)默认Asia/Hong_Kong。
- 期权到期日时区错误:
localMidnightMs原使用T00:00:00Z(UTC),导致 US/HK 期权到期日时间戳偏差 4–8 小时。现使用正确本地午夜时间戳。
- 多 symbol 支持(行情接口签名变更):下列接口参数由单 symbol 改为数组,调用方需更新:
getKline(symbol: string, period)→getKline(symbols: string[], period)getOptionExpiration(symbol: string)→getOptionExpiration(symbols: string[])getOptionChain(symbol: string, expiry: string)→getOptionChain(items: Array<[string, string]>)(每项为[symbol, "YYYY-MM-DD"]对)getOptionKline(identifier: string, period)→getOptionKline(identifiers: string[], period)
- 删除重复方法
getOptionBars:该方法与getOptionKline均对应option_klineAPI,已删除,请统一使用getOptionKline。同时删除OptionBarsRequest类型。 getKline签名变更(Request 对象):getKline(symbols: string[], period: string)→getKline(req: KlineRequest);删除同名getBars方法及BarsRequest类型。getKlineByPage重命名:getBarsByPage(req: BarsByPageRequest)→getKlineByPage(req: KlineByPageRequest);删除BarsByPageRequest类型。getFutureBars删除:改用getFutureKline(req: FutureKlineRequest);删除FutureBarsRequest类型。getFutureKlineByPage重命名:getFutureBarsByPage(req: FutureBarsByPageRequest)→getFutureKlineByPage(req: FutureKlineByPageRequest);删除FutureBarsByPageRequest类型。
QuoteClient.fromConfig(config):直接从ClientConfig创建QuoteClient,内部自动使用 quote server URL,无需手动构造HttpClient。TradeClient.fromConfig(config, account, secretKey?):直接从ClientConfig创建TradeClient,无需手动构造HttpClient。
getBrief→getRealTimeQuote:方法名与 wire methodquote_real_time不一致,现以getRealTimeQuote为主,旧名保留并标记@deprecated。getOptionBrief→getOptionQuote:wire method 为option_brief,更名为getOptionQuote。getStockDelayBriefs→getDelayedQuote:wire method 为quote_delay,更名与之对齐。getWarrantBriefs→getWarrantQuote:wire method 为warrant_briefs,更名保持接口层风格一致。
createClientConfig不读secret_key:机构账号的 secret_key 无法从 properties 文件或TIGEROPEN_SECRET_KEY环境变量自动加载,导致所有交易接口报access forbidden;现已在ClientConfig/ClientConfigOptions新增secretKey字段,并在配置加载时同步读取
- 冰山单支持:新增
icebergOrder()(基础参数)和icebergOrderFull()(完整参数,含minDisplaySize、checkIntervals、priceType、startTime、endTime)两个订单构造辅助函数。 IcebergPriceType枚举:LIMIT_PRICE/OPPONENT_PRICE。Order类型新增冰山单字段:displaySize、minDisplaySize、checkIntervals、priceType、startTime、endTime。- 单元测试:
icebergOrder/icebergOrderFull覆盖基础构造、完整参数及零值省略三个场景。
index.ts补全公共导出:原入口文件仅导出VERSION常量,导致 JS/TS 项目无法通过import { TradeClient } from '@tigeropenapi/tigeropen'引入任何功能。现已 re-export 所有公共 API:TradeClient、QuoteClient、PushClient、HttpClient、createClientConfig、TokenManager、全部 model 类型及枚举。- ESM 构建缺少
.js扩展名:Node.js ESM 规范要求相对路径导入必须带完整文件扩展名,但 TypeScriptmoduleResolution: node不自动生成扩展名,导致import ... from '@tigeropenapi/tigeropen'在 Node.js ESM 项目中报ERR_MODULE_NOT_FOUND/ERR_UNSUPPORTED_DIR_IMPORT。新增scripts/fix-esm-imports.mjspostbuild 脚本,自动为dist/esm/所有相对导入补充.js//index.js,已接入npm run build。
- 期权行权 5 个接口:新增
checkOptionExercise、getOptionExercisePositions、submitOptionExercise、getOptionExerciseRecords、cancelOptionExercise,对应 wire methodoption_exercise_check / option_exercise_position / option_exercise_submit / option_exercise_record / option_exercise_cancel。全部接口自动注入account。 - 请求/响应模型:新增
OptionExerciseCheckRequest、OptionExercisePositionRequest、OptionExerciseSubmitRequest、OptionExerciseRecordsRequest、OptionExerciseCancelRequest及对应结果类型OptionExerciseCheckResult、OptionExercisePositionPageResult、OptionExerciseRecordPageResult。
- 将
OptionExercisePageRequest重命名为OptionExerciseRecordsRequest,与方法名getOptionExerciseRecords对齐。
- Token 自动刷新:新增
TokenManager(后台setInterval+timer.unref()避免进程挂起)、tokenLoader/tokenWriter回调、syncToken()内存同步方法,与 Go SDK v0.3.6 功能对齐。 HttpClient.close():停止后台 token 刷新 timer,避免长期运行服务中的泄漏。TIGEROPEN_TOKEN_FILE环境变量:支持通过环境变量指定 token 文件路径。HttpClient.queryToken()/refreshToken()/startTokenAutoRefresh():手动刷新与自动刷新控制接口。- Push
accountSubs改为Map<SubjectType, string>:记录订阅时的 account,重连后自动恢复订阅,避免断连后 account 丢失。
Transaction响应模型修正(对应 Go SDK v0.3.1):transactedAt类型number→string(服务端返回 "YYYY-MM-DD HH:MM:SS" 格式字符串非时间戳);新增accountId、filledPrice、filledAmount、filledQuantityScale、transactionTime字段与服务端实际响应对齐。- 请求时间戳修正:原
toISOString()生成 UTC 时间,改为本地时间格式YYYY-MM-DD HH:MM:SS,与 Go SDK 签名格式对齐,避免服务端拒绝请求。 keysToSnakeCase守卫移除:移除阻止嵌套对象 key 转换的错误typeof v !== 'object'守卫,确保orderLegs、algoParams等嵌套字段的 key 正确转为 snake_case。- 域名查询优化:
queryDomains()仅调用一次,结果同时用于serverUrl和quoteServerUrl,消除冗余请求。 - Token 加载优先级修正:
TIGEROPEN_TOKEN环境变量 >tokenLoader> token 文件,与 Go SDK 保持一致。
FundingHistoryItem字段修正:对照服务端FundDepositWithdrawDTO及真实响应重写。id类型string→number,移除不存在的segType/submitTime/updateTime,新增refId/type/typeDesc/businessDate/statusDesc/completedStatus/createdAt/updatedAt。
getFutureTradeTicks响应解包修正:服务端返回{contractCode, items:[...]}结构,现正确解包 items 并回填 contractCode 到每条记录。endIndex未设置时默认 30(与 Python/Go SDK 一致)。SegmentFundHistoryItem字段名修正:submitTime/updateTime→createdAt/updatedAt/settledAt,补充statusDesc字段,与服务端实际响应对齐。SegmentFundAvailable返回类型修正:由SegmentFund[]改为专用SegmentFundAvailableItem[](仅含fromSegment/currency/amount)。SegmentFund模型更新:ID类型改为string | number,补充statusDesc/message/settledAt/createdAt/updatedAt字段。getFundingHistory响应解析修正:服务端返回裸 list(无 items 包装),改用callInto替代callIntoItems。- 响应签名验证修正:部分接口不返回 sign 字段,不再抛异常,改为跳过验证。
- 重试逻辑修正:API 业务错误(code != 0)不再触发指数退避重试(之前会重试 5 次导致 ~30s 假超时)。
- HTTP 连接管理:添加
Connection: closeheader,避免 keep-alive 连接未释放。
propertiesFilePath支持目录路径:传入目录时自动拼接tiger_openapi_config.properties,简化配置加载。
本次发布达到与 Python / Java / Go SDK 100% API 覆盖。新增约 65 个方法,重构 12 个方法签名。包含多处 breaking change。
Trade (17 个新方法)
getOrder(req)— 按 ID 查询单个订单详情(orderswire,传 id/order_id)getManagedAccounts(req?)— 查询机构子账户列表(accounts)getDerivativeContracts(req)— 衍生品合约列表(quote_contract)getAnalyticsAsset(req)— 按日资产分析(analytics_asset)getAggregateAssets(req?)— 综合账户资产汇总(aggregate_assets)getEstimateTradableQuantity(req)— 可交易数量估算(estimate_tradable_quantity)placeForexOrder(req)— 外汇下单(place_forex_order)getSegmentFundAvailable(req)/getSegmentFundHistory(req)/transferSegmentFund(req)/cancelSegmentFund(req)— 子账户资金调拨getFundDetails(req)— 资金流水明细(fund_details)getFundingHistory(req)— 资金调拨记录(transfer_fund)transferPosition(req)— 内部转股(position_transfer)getPositionTransferRecords(req)/getPositionTransferDetail(req)/getPositionTransferExternalRecords(req)— 转股记录查询
Quote (47 个新方法)
- 股票基础扩展(15):
getSymbols/getSymbolNames/getTradeMetas/getStockDetails/getStockDelayBriefs/getBars/getBarsByPage/getTimelineHistory/getTradeRank/getShortInterest/getStockBroker/getStockFundamental/getStockIndustry/getQuotePermission/getKlineQuota - 期权扩展(6):
getOptionBars/getOptionTradeTicks/getOptionTimeline/getOptionDepth/getOptionSymbols/getOptionAnalysis - 期货扩展(10):
getFutureContract/getAllFutureContracts/getCurrentFutureContract/getFutureContinuousContracts/getFutureHistoryMainContract/getFutureBars/getFutureBarsByPage/getFutureTradeTicks/getFutureDepth/getFutureTradingTimes - 基金(4):
getFundSymbols/getFundContracts/getFundQuote/getFundHistoryQuote - 窝轮(2):
getWarrantBriefs/getWarrantFilter - 行业(2):
getIndustryList/getIndustryStocks - 公司行动/财务/日历(6):
getCorporateSplit/getCorporateDividend/getCorporateEarningsCalendar/getFinancialCurrency/getFinancialExchangeRate/getTradingCalendar - 其他(2):
getMarketScannerTags/getQuoteOvernight
Push (4 对新订阅方法)
subscribeStockTop(market, indicators)/unsubscribeStockTop(market, indicators)— 股票排行榜(v0.3.0 已有onStockTop回调)subscribeOptionTop(market, indicators)/unsubscribeOptionTop(market, indicators)— 期权排行榜subscribeCc(symbols)/unsubscribeCc(symbols?)— 加密货币实时行情(复用onQuote回调)subscribeMarket(market)/unsubscribeMarket(market)— 市场状态推送(复用onQuote回调)
Enums (7 个新专属枚举)
OrderSortBy— 订单排序字段(LATEST_CREATED / LATEST_STATUS_UPDATED)SegmentType— 账户分部类型(SEC / FUT / FUND / ALL)CorporateActionType— 公司行动类型(split / dividend / earning)IndustryLevel— 行业级别(GSECTOR / GGROUP / GIND / GSUBIND)SortDirection— 排序方向OptionAnalysisPeriod— 期权分析周期FinancialReportPeriod— 财报类型(Annual / Quarterly / LTM)orderStatusCode(status)工具函数 — 返回订单状态对应的服务端数字码
OrderStatusData push message
- 合并了
updateTime(field 44) 和latestTime(field 45) 两个字段(原 0.3.1 条目)
-
OrderStatus 枚举对齐 Java SDK — 移除
PendingNew和PartiallyFilled(这两个是 Python 客户端派生,服务端不返回),新增PendingSubmit。最终 8 个值:Invalid/Initial/PendingCancel/Cancelled/Submitted/Filled/Inactive/PendingSubmit,与 Java SDKOrderStatus.java完全一致。 -
8 个 Trade 方法改签名为 Request 对象 (原位置参数 / 无参):
getOrders()→getOrders(req?: OrdersRequest)getActiveOrders()→getActiveOrders(req?: OrdersRequest)getInactiveOrders()→getInactiveOrders(req?: OrdersRequest)getFilledOrders(startMs, endMs)→getFilledOrders(req?: OrdersRequest)(startMs/endMs 改为 req.startDate/req.endDate)getOrderTransactions(id, symbol, secType)→getOrderTransactions(req: OrderTransactionsRequest)(全部字段可选,不再要求 symbol/secType)getPositions()→getPositions(req?: PositionsRequest)getAssets()→getAssets(req?: AssetsRequest)getPrimeAssets()→getPrimeAssets(req?: AssetsRequest)
-
4 个 Quote 方法改签名为 Request 对象:
getBrief(symbols)→getBrief(req: BriefRequest)getQuoteDepth(symbol, market)→getQuoteDepth(req: DepthQuoteRequest)getTradeTick(symbols)→getTradeTick(req: TradeTickRequest)getFutureRealTimeQuote(contractCodes)→getFutureRealTimeQuote(req: FutureBriefRequest)
- Push dispatcher 补 Cc dataType 路由:之前收到 Cc 推送会抛 "Unknown DataType"(dispatcher 默认分支)。现路由到
onQuote回调,与 Java / Python / Go SDK 一致。 Order.status反序列化时自动把整数转字符串:服务端同时返回整数(-2/-1/3/4/5/6/7/8)和字符串(Invalid/Initial/...)的 status,现在客户端统一归一为 Java 风格字符串。不做跨别名合并(Submitted↔Held 等保持原样)。getFutureRealTimeQuotewire method 修正为future_real_time_quote(不是早先误用的future_brief)。
// Before (0.3.x)
const orders = await tc.getOrders();
const filled = await tc.getFilledOrders(startMs, endMs);
const txs = await tc.getOrderTransactions(id, symbol, secType);
const pos = await tc.getPositions();
const assets = await tc.getAssets();
const briefs = await qc.getBrief(['AAPL']);
const depth = await qc.getQuoteDepth('AAPL', 'US');
// After (0.4.0)
const orders = await tc.getOrders({}); // 或 tc.getOrders()
const filled = await tc.getFilledOrders({ startDate: startMs, endDate: endMs });
const txs = await tc.getOrderTransactions({ orderId: id, symbol, secType });
const pos = await tc.getPositions({});
const assets = await tc.getAssets({});
const briefs = await qc.getBrief({ symbols: ['AAPL'] });
const depth = await qc.getQuoteDepth({ symbols: ['AAPL'], market: 'US' });
// OrderStatus 迁移
// OrderStatus.PendingNew → 移除(服务端从不返回,Python 派生)
// OrderStatus.PartiallyFilled → 移除(同上,用户自己根据 filledQuantity 判断)
// OrderStatus.PendingSubmit → 新增(对应服务端数字 8)- Request interface 字段名 = 服务端 wire 真名(camelCase 转换后),不学 Python 客户端做参数别名。Trade 时间字段统一用
startDate/endDate(wirestart_date/end_date,ms 时间戳)。 - 所有 Request 字段都可选,
account留空时自动填 client 初始化的默认账户。 - 枚举字符串值对齐 Java SDK;专属业务枚举对齐 Python SDK。
OrderStatusDatapush message: new fieldsupdateTime(field 44, timestamp ms of order info update) andlatestTime(field 45, timestamp ms of order status update). Regeneratedsrc/push/pb/OrderStatusData.ts.
- Typed request/response API across all quote and trade methods. All
QuoteClientandTradeClientmethods now return typed response objects (e.g.MarketState,Brief,Kline,Asset,Order,PlaceOrderResult) instead of untypedApiResponseenvelopes. Callers no longer need to destructureresponse.dataor deal withitemswrappers — the client unwraps these internally and hands back the domain object. - Idiomatic camelCase request models. Request parameters are written in
camelCase in TypeScript and converted to
snake_caseon the wire automatically by the transport layer (client/case-convert.ts). This matches the server's wire format while keeping idiomatic TS at the call site. - Split
OrderintoOrder(response) andOrderRequest(for place/modify/preview). The response type exposes the full set of fields returned by the server; the request type only contains the fields the server accepts. Helper factories inmodel/order-helpers.ts(marketOrder,limitOrder, etc.) now returnOrderRequest. - Unwrap
{items: [...]}envelopes for trade endpoints.getOrders,getActiveOrders,getInactiveOrders,getFilledOrders,getPositions,getAssets,getOrderTransactions,getContract(s), andgetQuoteContractnow return arrays directly. - Method signature corrections to match server contract:
getQuoteDepth(symbol, market)— added requiredmarketgetFutureContracts(exchangeCode)— method renamed tofuture_contract_by_exchange_code; parameter isexchange_codegetFutureRealTimeQuote(contractCodes)— accepts arraygetFutureKline(req: FutureKlineRequest)— structured request withbeginTime/endTime(both default to-1when omitted on the server)getFinancialDaily / getFinancialReport / getCorporateAction— structured*Requestobjects for complex parameter setsgetCapitalFlow(symbol, market, period)andgetCapitalDistribution(symbol, market)— flat parameters matching servermarketScanner(req: MarketScannerRequest)— structured requestgetOrderTransactions(orderId, symbol, secType)— sendsorder_idgetFilledOrders(startDateMs, endDateMs)— sendsstart_date/end_datein millisecondsgetQuoteContract(symbol, secType, expiry)— wraps single symbol insymbolsarray and sendsexpiry
src/client/case-convert.ts—keysToSnakeCase/camelToSnakeutilities applied automatically bycreateApiRequest. Keys that already contain_are left untouched, sosnake_caseinputs still work.src/client/api-response.ts—unmarshalData<T>()helper handles both JSON-string and already-parseddatapayloads returned by the server.src/model/quote.ts— 30+ response interfaces covering every quote endpoint (MarketState,Brief,Kline+KlineItem,Timeline,TradeTick,Depth,OptionExpiration,OptionChain,FutureExchange,FutureContractInfo,FutureQuote,FutureKline,FinancialDailyItem,FinancialReportItem,CorporateAction,CapitalFlow,CapitalDistribution,ScannerResult,QuotePermission, etc.) and 5 request interfaces (FinancialDailyRequest,FinancialReportRequest,CorporateActionRequest,FutureKlineRequest,MarketScannerRequest).src/model/trade.ts—Asset,AssetSegment,PrimeAsset,PrimeAssetSegment,PreviewResult,PlaceOrderResult,OrderIdResult,Transaction.- Expanded contract / position / order fields to cover what the server
actually returns (e.g.
Contract.primaryExchange,Contract.isEtf,Position.positionQty,Position.todayPnl, etc.). examples/quote-example.tsandexamples/trade-example.ts— full end-to-end coverage of everyQuoteClient/TradeClientmethod with aPASS / FAIL / SKIPsummary, auto-discovering config from./tiger_openapi_config.propertiesor~/.tigeropen/tiger_openapi_config.properties.
- Double-encoded JSON payloads (server occasionally returns
dataas a JSON string) are now transparently parsed. getCorporateActionflattens the server's{symbol: [...]}map into a single array.parseOptionIdentifiernow returnsexpiryMsas a number andstrikeas a number (previously strings).
- Push / streaming client (
src/push) is protobuf-based and already uses the correct wire format — not affected by this release.
- Retry policy, protobuf push client, initial trade/quote clients.
- Initial release.