{"id":41285286,"url":"https://github.com/pseudocodes/tqsdk-go","last_synced_at":"2026-01-23T03:02:40.944Z","repository":{"id":188886650,"uuid":"357905722","full_name":"pseudocodes/tqsdk-go","owner":"pseudocodes","description":"天勤 tqsdk 期货期权行情/历史数据/交易 go 语言协议接口","archived":false,"fork":false,"pushed_at":"2025-11-24T03:02:28.000Z","size":250,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-24T06:39:41.312Z","etag":null,"topics":["future","quote","shinnytech","tqsdk","tqsdk-go","trader","trading-bot"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pseudocodes.png","metadata":{"files":{"readme":"Readme.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-04-14T12:57:09.000Z","updated_at":"2025-11-24T01:48:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"a3bd8df2-76fb-4b4e-8546-2511b7756df6","html_url":"https://github.com/pseudocodes/tqsdk-go","commit_stats":null,"previous_names":["pseudocodes/tqsdk-go"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/pseudocodes/tqsdk-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pseudocodes%2Ftqsdk-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pseudocodes%2Ftqsdk-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pseudocodes%2Ftqsdk-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pseudocodes%2Ftqsdk-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pseudocodes","download_url":"https://codeload.github.com/pseudocodes/tqsdk-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pseudocodes%2Ftqsdk-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28679140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T01:00:35.747Z","status":"online","status_checked_at":"2026-01-23T02:00:08.296Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["future","quote","shinnytech","tqsdk","tqsdk-go","trader","trading-bot"],"created_at":"2026-01-23T03:01:52.924Z","updated_at":"2026-01-23T03:02:40.938Z","avatar_url":"https://github.com/pseudocodes.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# TQSDK-GO V2\n\n天勤 [DIFF 协议](https://www.shinnytech.com/diff/) 的 Go 语言封装 - 全新重构版本\n\nTQSDK-GO V2 提供了类型安全、并发安全、易用的 Go 语言 API，支持期货行情订阅、K线数据获取、交易操作等功能。\n\n## 特性\n\n- **类型安全**：强类型 API 设计，消除 `map[string]interface{}` 的使用\n- **并发安全**：完善的并发控制和数据竞争保护\n- **易用性**：符合 Go 语言习惯的 API 设计，支持 Context、Channel、Callback 等多种模式\n- **高性能**：优化的数据管理和内存使用，支持 ViewWidth 控制\n- **多合约对齐**：基于 TQSDK 协议的 binding 机制，自动对齐不同合约的 K线数据\n- **零竞态条件**：延迟启动设计，确保回调注册后再接收数据\n\n## 安装\n\n```bash\ngo get github.com/pseudocodes/tqsdk-go@latest\n```\n\n## 快速开始\n\n### 基础示例\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"time\"\n\n    tqsdk \"github.com/pseudocodes/tqsdk-go/shinny\"\n)\n\nfunc main() {\n    ctx := context.Background()\n    \n    // 1. 创建客户端\n    client, err := tqsdk.NewClient(ctx, \"username\", \"password\",\n        tqsdk.WithLogLevel(\"info\"),\n        tqsdk.WithViewWidth(500),\n    )\n    if err != nil {\n        panic(err)\n    }\n    defer client.Close()\n\n    // 2. 初始化行情功能 (必须调用)\n    if err := client.InitMarket(); err != nil {\n        panic(err)\n    }\n    \n    // 3. 订阅 Quote\n    quoteSub, _ := client.SubscribeQuote(ctx, \"SHFE.au2602\")\n    defer quoteSub.Close()\n    \n    quoteSub.OnQuote(func(quote *tqsdk.Quote) {\n        fmt.Printf(\"黄金: %.2f\\n\", quote.LastPrice)\n    })\n    \n    // 4. 订阅 K线（延迟启动，避免竞态条件）\n    klineSub, _ := client.Series().Kline(ctx, \"SHFE.au2602\", time.Minute, 100)\n    defer klineSub.Close()\n    \n    // 先注册回调\n    klineSub.OnNewBar(func(data *tqsdk.SeriesData) {\n        klines := data.GetSymbolKlines(\"SHFE.au2602\")\n        if len(klines.Data) \u003e 0 {\n            latest := klines.Data[len(klines.Data)-1]\n            fmt.Printf(\"新 K线: %.2f\\n\", latest.Close)\n        }\n    })\n    \n    // 再启动监听（确保不会错过数据）\n    klineSub.Start()\n    \n    // 保持运行\n    time.Sleep(30 * time.Second)\n}\n```\n\n## 核心概念\n\n### Client - 客户端\n\n`Client` 是 TQSDK-GO 的核心入口，负责管理连接、认证、数据订阅等。\n\n#### 创建客户端\n\n```go\nclient, err := tqsdk.NewClient(ctx, username, password, options...)\n```\n\n#### 初始化行情\n\n在使用行情相关功能（Quote, Series）之前，**必须**先调用 `InitMarket()`：\n\n```go\nif err := client.InitMarket(); err != nil {\n    // 处理错误\n}\n```\n\n#### 配置选项\n\n```go\n// 设置日志级别\ntqsdk.WithLogLevel(\"debug\")  // debug, info, warn, error\n\n// 设置默认视图宽度\ntqsdk.WithViewWidth(1000)\n\n// 设置客户端信息\ntqsdk.WithClientInfo(\"MyApp\", \"v1.0.0\")\n\n// 启用开发模式（使用测试服务器）\ntqsdk.WithDevelopment(true)\n```\n\n### Quote 订阅\n\nQuote 订阅用于获取实时行情数据，支持多合约订阅。\n\n#### 基础用法\n\n```go\n// 订阅单个或多个合约\nquoteSub, err := client.SubscribeQuote(ctx, \"SHFE.au2602\", \"SHFE.ag2512\")\ndefer quoteSub.Close()\n\n// 方式 1: 使用 Channel（流式处理）\ngo func() {\n    for quote := range quoteSub.QuoteChannel() {\n        fmt.Printf(\"%s: %.2f\\n\", quote.InstrumentID, quote.LastPrice)\n    }\n}()\n\n// 方式 2: 使用回调（事件驱动）\nquoteSub.OnQuote(func(quote *tqsdk.Quote) {\n    fmt.Printf(\"%s: %.2f\\n\", quote.InstrumentID, quote.LastPrice)\n})\n```\n\n#### 动态添加/移除合约\n\n```go\n// 添加合约\nquoteSub.AddSymbols(\"DCE.m2512\", \"CZCE.CF512\")\n\n// 移除合约\nquoteSub.RemoveSymbols(\"SHFE.ag2512\")\n```\n\n### Series API - 序列数据\n\nSeries API 提供 K线、Tick 等序列数据的订阅功能。\n\n#### 延迟启动模式（推荐，零竞态条件）\n\n```go\n// 1. 创建订阅（不立即启动）\nsub, err := client.Series().Kline(ctx, \"SHFE.au2602\", time.Minute, 100)\ndefer sub.Close()\n\n// 2. 注册所有回调函数\nsub.OnNewBar(func(data *tqsdk.SeriesData) {\n    klines := data.GetSymbolKlines(\"SHFE.au2602\")\n    if len(klines.Data) \u003e 0 {\n        latest := klines.Data[len(klines.Data)-1]\n        fmt.Printf(\"新 K线: O=%.2f H=%.2f L=%.2f C=%.2f\\n\",\n            latest.Open, latest.High, latest.Low, latest.Close)\n    }\n})\n\nsub.OnBarUpdate(func(data *tqsdk.SeriesData) {\n    klines := data.GetSymbolKlines(\"SHFE.au2602\")\n    if len(klines.Data) \u003e 0 {\n        latest := klines.Data[len(klines.Data)-1]\n        fmt.Printf(\"K线更新: C=%.2f\\n\", latest.Close)\n    }\n})\n\n// 3. 启动监听（不会错过任何数据）\nif err := sub.Start(); err != nil {\n    panic(err)\n}\n```\n\n#### 自动启动模式（兼容模式）\n\n如果需要向后兼容或快速原型开发，可以使用 `AndStart` 后缀的方法：\n\n```go\n// 创建并立即启动（注意：可能错过早期数据）\nsub, err := client.Series().KlineAndStart(ctx, \"SHFE.au2602\", time.Minute, 100)\ndefer sub.Close()\n\n// 注册回调（可能已经错过了一些数据）\nsub.OnNewBar(func(data *tqsdk.SeriesData) {\n    // ...\n})\n```\n\n#### 详细更新信息\n\n使用 `OnUpdate` 可以获取详细的更新信息：\n\n```go\nsub.OnUpdate(func(data *tqsdk.SeriesData, info *tqsdk.UpdateInfo) {\n    if info.HasNewBar {\n        // 新增了一根 K线\n        fmt.Printf(\"新 K线! ID=%d\\n\", info.NewBarIDs[\"SHFE.au2602\"])\n    }\n    \n    if info.HasBarUpdate \u0026\u0026 !info.HasNewBar {\n        // 更新了最后一根 K线（盘中实时更新）\n        fmt.Printf(\"K线更新\\n\")\n    }\n    \n    if info.ChartRangeChanged {\n        // Chart 范围发生变化\n        fmt.Printf(\"Chart 范围: [%d,%d] -\u003e [%d,%d]\\n\",\n            info.OldLeftID, info.OldRightID,\n            info.NewLeftID, info.NewRightID)\n    }\n    \n    if info.HasChartSync {\n        // Chart 初次同步完成\n        fmt.Printf(\"Chart 同步完成!\\n\")\n    }\n})\n```\n\n#### 多合约 K线订阅（自动对齐）\n\n```go\n// 订阅多个合约的 K线，自动对齐到相同时间点\nsub, err := client.Series().KlineMulti(ctx,\n    []string{\"SHFE.au2602\", \"SHFE.ag2512\", \"INE.sc2601\"},\n    time.Minute, 100)\ndefer sub.Close()\n\n// 注册回调\nsub.OnUpdate(func(data *tqsdk.SeriesData, info *tqsdk.UpdateInfo) {\n    if info.HasNewBar {\n        // 获取最新的对齐数据集\n        if len(data.Multi.Data) \u003e 0 {\n            latest := data.Multi.Data[len(data.Multi.Data)-1]\n            fmt.Printf(\"时间: %s\\n\", latest.Timestamp.Format(\"15:04:05\"))\n            \n            // 遍历所有合约的 K线\n            for symbol, kline := range latest.Klines {\n                fmt.Printf(\"  %s: C=%.2f V=%d\\n\", symbol, kline.Close, kline.Volume)\n            }\n        }\n    }\n})\n\n// 启动监听\nsub.Start()\n```\n\n#### Tick 订阅\n\n```go\n// 创建 Tick 订阅\nsub, err := client.Series().Tick(ctx, \"SHFE.au2602\", 100)\ndefer sub.Close()\n\n// 注册回调\nsub.OnNewBar(func(data *tqsdk.SeriesData) {\n    if data.TickData != nil \u0026\u0026 len(data.TickData.Data) \u003e 0 {\n        tick := data.TickData.Data[len(data.TickData.Data)-1]\n        fmt.Printf(\"新 Tick: 价格=%.2f 买一=%.2f 卖一=%.2f\\n\",\n            tick.LastPrice, tick.BidPrice1, tick.AskPrice1)\n    }\n})\n\n// 启动监听\nsub.Start()\n```\n\n### 历史数据订阅\n\nTQSDK 支持订阅历史数据，适用于回测、数据分析等场景。\n\n#### 使用 left_kline_id 订阅\n\n```go\n// 从指定 K线 ID 开始订阅历史数据\nleftKlineID := int64(105761)\nsub, err := client.Series().KlineHistory(ctx, \"SHFE.au2602\", time.Minute, 8000, leftKlineID)\ndefer sub.Close()\n\nsub.OnUpdate(func(data *tqsdk.SeriesData, info *tqsdk.UpdateInfo) {\n    if info.ChartReady {\n        // 历史数据传输完成\n        fmt.Printf(\"历史数据传输完成！数据量: %d\\n\", len(data.Single.Data))\n    }\n})\n\nsub.Start()\n```\n\n#### 使用 focus_datetime 订阅\n\n```go\n// 从指定时间点开始订阅\nfocusTime := time.Date(2025, 9, 1, 0, 0, 0, 0, time.UTC)\n// focusPosition \u003e 0: 起始时间从焦点时间向左扩展\nsub, err := client.Series().KlineHistoryWithFocus(ctx, \n    \"SHFE.au2602\", time.Minute, 8000, focusTime, 100)\ndefer sub.Close()\n\nsub.OnUpdate(func(data *tqsdk.SeriesData, info *tqsdk.UpdateInfo) {\n    if info.ChartReady {\n        fmt.Printf(\"历史数据加载完成\\n\")\n    }\n})\n\nsub.Start()\n```\n\n### TradeSession - 交易会话\n\nTradeSession 提供交易相关功能，支持多账户管理。\n\n#### 登录交易账户\n\n```go\n// 登录交易账户（快期模拟、SimNow 等）\nsession, err := client.LoginTrade(ctx, \"快期模拟\", \"userID\", \"password\")\nif err != nil {\n    panic(err)\n}\ndefer session.Close()\n```\n\n#### 下单\n\n```go\n// 构建下单请求\nreq := \u0026tqsdk.InsertOrderRequest{\n    Symbol:     \"SHFE.au2602\",\n    Direction:  tqsdk.DirectionBuy,\n    Offset:     tqsdk.OffsetOpen,\n    PriceType:  tqsdk.PriceTypeLimit,\n    LimitPrice: 500.00,\n    Volume:     1,\n}\n\n// 下单\norder, err := session.InsertOrder(ctx, req)\nif err != nil {\n    fmt.Printf(\"下单失败: %v\\n\", err)\n} else {\n    fmt.Printf(\"下单成功，订单ID: %s\\n\", order.OrderID)\n}\n```\n\n#### 撤单\n\n```go\nerr := session.CancelOrder(ctx, orderID)\n```\n\n#### 查询账户信息\n\n```go\n// 同步查询\naccount, err := session.GetAccount(ctx)\nif err == nil {\n    fmt.Printf(\"账户权益: %.2f\\n\", account.Balance)\n    fmt.Printf(\"可用资金: %.2f\\n\", account.Available)\n    fmt.Printf(\"风险度: %.2f%%\\n\", account.RiskRatio*100)\n}\n```\n\n#### 查询持仓\n\n```go\n// 查询所有持仓\npositions, err := session.GetPositions(ctx)\nfor symbol, pos := range positions {\n    fmt.Printf(\"%s: 多头=%d 空头=%d 浮盈=%.2f\\n\",\n        symbol, pos.VolumeLongToday, pos.VolumeShortToday, pos.FloatProfit)\n}\n\n// 查询指定合约持仓\npos, err := session.GetPosition(ctx, \"SHFE.au2602\")\n```\n\n#### 实时监听（Callback 模式）\n\n```go\n// 注册账户更新回调\nsession.OnAccount(func(account *tqsdk.Account) {\n    fmt.Printf(\"账户权益: %.2f\\n\", account.Balance)\n})\n\n// 注册持仓更新回调\nsession.OnPosition(func(symbol string, pos *tqsdk.Position) {\n    fmt.Printf(\"持仓更新: %s 浮盈=%.2f\\n\", symbol, pos.FloatProfit)\n})\n\n// 注册订单更新回调\nsession.OnOrder(func(order *tqsdk.Order) {\n    fmt.Printf(\"订单 %s: %s\\n\", order.OrderID, order.Status)\n})\n\n// 注册成交回调\nsession.OnTrade(func(trade *tqsdk.Trade) {\n    fmt.Printf(\"成交: %s %.2f x %d\\n\", trade.InstrumentID, trade.Price, trade.Volume)\n})\n\n// 注册通知回调\nsession.OnNotification(func(notify *tqsdk.Notification) {\n    fmt.Printf(\"[%s] %s\\n\", notify.Level, notify.Content)\n})\n```\n\n#### 实时监听（Channel 模式）\n\n```go\n// 监听账户更新\ngo func() {\n    for account := range session.AccountChannel() {\n        fmt.Printf(\"账户更新: %.2f\\n\", account.Balance)\n    }\n}()\n\n// 监听持仓更新\ngo func() {\n    for update := range session.PositionChannel() {\n        fmt.Printf(\"持仓更新: %s\\n\", update.Symbol)\n    }\n}()\n\n// 监听订单更新\ngo func() {\n    for order := range session.OrderChannel() {\n        fmt.Printf(\"订单更新: %s %s\\n\", order.OrderID, order.Status)\n    }\n}()\n\n// 监听成交更新\ngo func() {\n    for trade := range session.TradeChannel() {\n        fmt.Printf(\"成交: %s\\n\", trade.TradeID)\n    }\n}()\n```\n\n## API 参考\n\n### 订阅方法对照表\n\n| 功能 | 延迟启动（推荐） | 自动启动（兼容） |\n|------|-----------------|-----------------|\n| 通用订阅 | `Subscribe()` | `SubscribeAndStart()` |\n| K线订阅 | `Kline()` | `KlineAndStart()` |\n| 多K线订阅 | `KlineMulti()` | `KlineMultiAndStart()` |\n| Tick订阅 | `Tick()` | `TickAndStart()` |\n| 历史K线 | `KlineHistory()` | `KlineHistoryAndStart()` |\n| 焦点历史K线 | `KlineHistoryWithFocus()` | `KlineHistoryWithFocusAndStart()` |\n| 历史Tick | `TickHistory()` | `TickHistoryAndStart()` |\n\n**推荐使用延迟启动方法**，确保所有回调注册完成后再启动监听，避免竞态条件。\n\n### 核心数据结构\n\n#### Quote - 行情报价\n\n```go\ntype Quote struct {\n    InstrumentID     string  // 合约代码\n    Datetime         string  // 行情时间\n    LastPrice        float64 // 最新价\n    AskPrice1        float64 // 卖一价\n    AskVolume1       int64   // 卖一量\n    BidPrice1        float64 // 买一价\n    BidVolume1       int64   // 买一量\n    Highest          float64 // 最高价\n    Lowest           float64 // 最低价\n    Open             float64 // 开盘价\n    Close            float64 // 收盘价\n    Volume           int64   // 成交量\n    OpenInterest     int64   // 持仓量\n    Change           float64 // 涨跌\n    ChangePercent    float64 // 涨跌幅\n    // ... 更多字段\n}\n```\n\n#### Kline - K线数据\n\n```go\ntype Kline struct {\n    ID       int64   // K线ID\n    Datetime int64   // K线起点时间(纳秒)\n    Open     float64 // 开盘价\n    Close    float64 // 收盘价\n    High     float64 // 最高价\n    Low      float64 // 最低价\n    OpenOI   int64   // 起始持仓量\n    CloseOI  int64   // 结束持仓量\n    Volume   int64   // 成交量\n}\n```\n\n#### Tick - Tick数据\n\n```go\ntype Tick struct {\n    ID           int64   // Tick ID\n    Datetime     int64   // tick时间(纳秒)\n    LastPrice    float64 // 最新价\n    Average      float64 // 均价\n    Volume       int64   // 成交量\n    OpenInterest int64   // 持仓量\n    AskPrice1    float64 // 卖一价\n    AskVolume1   int64   // 卖一量\n    BidPrice1    float64 // 买一价\n    BidVolume1   int64   // 买一量\n    // ... 更多盘口数据\n}\n```\n\n## 高级功能\n\n### ViewWidth 控制\n\nViewWidth 用于控制返回的数据量，只保留最新的 N 条数据，优化内存使用。\n\n```go\n// 全局设置\nclient, _ := tqsdk.NewClient(ctx, username, password,\n    tqsdk.WithViewWidth(1000))\n\n// 订阅时指定\nsub, _ := client.Series().Kline(ctx, \"SHFE.au2602\", time.Minute, 500)\n```\n\n### 多合约对齐\n\n基于 TQSDK 协议的 binding 机制，自动对齐不同合约的 K线数据到相同的时间点。\n\n```go\nsub, _ := client.Series().KlineMulti(ctx,\n    []string{\"SHFE.au2602\", \"SHFE.ag2512\"},\n    time.Minute, 100)\n\nsub.OnNewBar(func(data *tqsdk.SeriesData) {\n    // data.Multi.Data 中的每个 AlignedKlineSet 包含同一时间点的多个合约 K线\n    for _, set := range data.Multi.Data {\n        fmt.Printf(\"时间: %s\\n\", set.Timestamp.Format(\"15:04:05\"))\n        for symbol, kline := range set.Klines {\n            fmt.Printf(\"  %s: %.2f\\n\", symbol, kline.Close)\n        }\n    }\n})\n\nsub.Start()\n```\n\n## 完整示例\n\n完整示例代码请参考 `examples/` 目录：\n\n- **[examples/quote/](examples/quote/)** - 行情订阅示例\n  - Quote 订阅（Channel 和 Callback 模式）\n  - 单合约 K线订阅\n  - 多合约 K线订阅（自动对齐）\n  - Tick 订阅\n  \n- **[examples/history/](examples/history/)** - 历史数据订阅示例\n  - 使用 `left_kline_id` 订阅\n  - 使用 `focus_datetime` 订阅\n  - 大数据量分片传输\n  \n- **[examples/trade/](examples/trade/)** - 交易操作示例\n  - 账户登录和会话管理\n  - 下单、撤单操作\n  - 账户、持仓、订单查询\n  - 实时监听（Callback 和 Channel 模式）\n  \n- **[examples/datamanager/](examples/datamanager/)** - DataManager 高级功能\n  - 路径监听（Watch/UnWatch）\n  - 动态配置管理\n  - 多路径同时监听\n\n## 常量定义\n\n### 方向\n\n```go\nconst (\n    DirectionBuy  = \"BUY\"   // 买入\n    DirectionSell = \"SELL\"  // 卖出\n)\n```\n\n### 开平\n\n```go\nconst (\n    OffsetOpen       = \"OPEN\"       // 开仓\n    OffsetClose      = \"CLOSE\"      // 平仓\n    OffsetCloseToday = \"CLOSETODAY\" // 平今\n)\n```\n\n### 价格类型\n\n```go\nconst (\n    PriceTypeLimit = \"LIMIT\"  // 限价单\n    PriceTypeAny   = \"ANY\"    // 市价单\n)\n```\n\n### 订单状态\n\n```go\nconst (\n    OrderStatusAlive    = \"ALIVE\"    // 活动（未成交或部分成交）\n    OrderStatusFinished = \"FINISHED\" // 已完成（全部成交或已撤销）\n)\n```\n\n## 环境变量\n\n运行示例程序需要设置以下环境变量：\n\n```bash\n# 天勤账号（必需）\nexport SHINNYTECH_ID=\"your_username\"\nexport SHINNYTECH_PW=\"your_password\"\n\n# SimNow 账号（仅交易示例需要）\nexport SIMNOW_USER_0=\"your_simnow_user\"\nexport SIMNOW_PASS_0=\"your_simnow_pass\"\n```\n\n## 许可证\n\nApache License 2.0\n\n## 更新日志\n\n查看 [CHANGELOG.md](CHANGELOG.md) 了解版本更新历史和最新变更。\n\n## 相关链接\n\n- [天勤量化官网](https://www.shinnytech.com/)\n- [DIFF 协议文档](https://www.shinnytech.com/diff/)\n- [GitHub 仓库](https://github.com/pseudocodes/tqsdk-go)\n- [更新日志](CHANGELOG.md) / [中文版](CHANGELOG_CN.md)\n\n## 免责声明\n\n本项目明确拒绝对产品做任何明示或暗示的担保。由于软件系统开发本身的复杂性，无法保证本项目完全没有错误。如选择使用本项目表示您同意错误和/或遗漏的存在，在任何情况下本项目对于直接、间接、特殊的、偶然的、或间接产生的、使用或无法使用本项目进行交易和投资造成的盈亏、直接或间接引起的赔偿、损失、债务或是任何交易中止均不承担责任和义务。\n\n## 致谢\n\n感谢 [天勤量化](https://www.shinnytech.com/) 提供优秀的 DIFF 协议和服务支持。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpseudocodes%2Ftqsdk-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpseudocodes%2Ftqsdk-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpseudocodes%2Ftqsdk-go/lists"}