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
相关产品推荐
相关产品推荐

