You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ClojureScript中使用@stoqey/ib连接TWS API时的构造函数错误及配置咨询

ClojureScript中使用@stoqey/ib连接TWS API时的构造函数错误及配置咨询

看起来你在把JavaScript里正常运行的@stoqey/ib代码迁移到ClojureScript时遇到了构造函数调用的问题,同时对deps.edn的npm依赖配置有疑问,我来帮你逐个解决:


1. 如何在ClojureScript中正确访问@stoqey/ib的构造函数?

你遇到的module$node_modules$$stoqey$ib$dist$index.IBApi is not a constructor错误,大概率是因为ClojureScript处理ES模块命名导出的方式和原生JS略有差异。

在原生JS中你用的是命名导入import { IBApi, EventName } from "@stoqey/ib",但在ClojureScript里,建议先把整个模块导入为一个命名空间对象,再从中访问构造函数和常量,这样能避免导出结构的适配问题:

;; 替换原来的require方式
(ns trading-system.core
  (:require
   ["@stoqey/ib" :as ib-lib]))

;; 然后这样调用构造函数
(def ib
  (ib-lib/IBApi. #js {:port 7497})) ;; 或者用(new ib-lib/IBApi #js {:port 7497}),两种写法都可行

如果想确认模块的导出结构,还可以在REPL里执行以下代码查看:

(require ["@stoqey/ib" :as ib-lib])
(js/console.log ib-lib)

从控制台输出里就能清楚看到IBApi和EventName是否存在,以及它们的结构。


2. 是否需要修改deps.edn中的npm-deps配置?

当然需要!你现在把@stoqey/ib的依赖注释掉了,ClojureScript的工具链(比如shadow-cljs或者cljs.main)无法自动安装和加载这个模块,这也是导致构造函数找不到的潜在原因之一。

修改后的:npm-deps部分应该是这样:

:npm-deps {mathjs "^14.0.0"
           "@stoqey/ib" "^1.4.4"}

保存后,重新启动你的ClojureScript环境,工具会自动下载安装这个npm依赖。


修改后的完整示例代码

这里给你调整好的完整core.cljs代码,直接替换原来的内容即可:

(ns trading-system.core
  (:require
   ["@stoqey/ib" :as ib-lib]))

;; Create IBApi object with configuration
(def ib
  (ib-lib/IBApi. #js {:port 7497}))
  ;; 可选配置,需要时取消注释
  ;; {:clientId 0
  ;;  :host "127.0.0.1"
  ;;  :port 7497})

;; 初始化持仓计数的原子变量
(def positions-count (atom 0))

;; 注册错误事件处理器
(.on ib ib-lib/EventName.error
     (fn [err code reqId]
       (js/console.error
        (str (.-message err) " - code: " code " - reqId: " reqId))))

;; 注册持仓数据事件处理器
(.on ib ib-lib/EventName.position
     (fn [account contract pos avgCost]
       (js/console.log
        (str account ": " pos " x " (.-symbol contract) " @ " avgCost))
       (swap! positions-count inc)))

;; 注册持仓数据结束的一次性事件处理器
(.once ib ib-lib/EventName.positionEnd
       (fn []
         (js/console.log
          (str "Total: " @positions-count " positions."))
         ;; 处理完成后断开连接
         (.disconnect ib)))

;; 连接到IB API
(.connect ib)

;; 请求当前持仓数据
(.reqPositions ib)

这样调整后,应该就能正常调用IBApi构造函数并连接到TWS API了。

备注:内容来源于stack exchange,提问作者madeinQuant

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:18:06