输入/搜索内容
欢迎使用发明者量化交易平台
编程语言
JavaScript
TypeScript
Python
C++
My语言(麦语言)
PINE语言
Blockly可视化
Workflow工作流
密钥安全性
实盘
策略库
托管者
部署托管者
一键租用托管者
手动部署托管者
托管者操作注意事项
全局指定IP地址
命令行版本托管者程序的参数
实盘数据迁移
托管者监控
交易所
策略编辑器
回测系统
策略入口函数
策略框架与API函数
模板类库
策略参数
交互控件
期权交易
C++策略编写说明
JavaScript策略编写说明
Web3
内置库
扩展API接口
MCP 服务
交易终端
数据探索
Alpha因子分析工具
通用协议
调试工具
远程编辑
完整策略的导入与导出
多语言支持
实盘、策略分组
实盘展示
策略分享与出租
实盘消息推送
实盘报错、异常退出的常见原因
交易所特殊说明

支持JavaScript语言,集成了以下JavaScript库:

程序异常报错、接口业务报错
JavaScript语言策略中,发生程序异常报错或接口业务报错时,错误日志将显示策略代码中发生错误的具体行号,便于策略调试与BUG排查。

支持JavaScript异步编程特性:

  • setTimeout / clearTimeout

    javascript
    function main() { let symbol = "ETH_USDT" let delay = 10 let depth = exchange.GetDepth(symbol) let callback = function(e, id, msg) { Log(msg + ", canceling order.") e.CancelOrder(id) } let ordersLen = 3 let arrTimerId = [] for (let i = 1 ; i <= ordersLen ; i++) { let orderId = exchange.CreateOrder(symbol, "buy", depth.Bids[i * 3].Price, i * 0.1) let timerId = setTimeout(callback, delay * 1000, exchange, orderId, `Delayed ${delay} seconds`) Log("i:", i, ", timerId:", timerId) arrTimerId.push(timerId) } // clearTimeout let clearTimeoutIdx = 1 Log("clearTimeoutIdx:", clearTimeoutIdx, `, arrTimerId[clearTimeoutIdx]:`, arrTimerId[clearTimeoutIdx]) clearTimeout(arrTimerId[clearTimeoutIdx]) Sleep(60 * 1000) }
  • fetch
    fetch函数是HttpQuery函数的异步版本重载。

    使用await关键字以同步语法处理异步操作:

    javascript
    function main() { let url = "https://www.okx.com/api/v5/market/books?instId=BTC-USDT" const promiseBooks = new Promise(async function(resolve, reject) { Log("Start execution") let data = await fetch(url) Log("data.ok:", data.ok, ", data.text():", data.text()) if (data.ok) { Log("Successfully retrieved data:", data) return resolve(data.text()) } else { return reject(new Error("data 无效")) } }) promiseBooks.then(function(ret) { Log("ret:", ret) }).catch(function(err) { Log("err.name:", err.name, "err.stack:", err.stack, "err.message:", err.message) }) }
  • 使用Promise.all并发执行多个异步网络请求:

    javascript
    async function main() { // let symbols = ["BTC-USDT", "ETH-USDT", "LTC-USDT"] // 等待请求耗时:99毫秒 let symbols = ["BTC-USDT", "ETH-USDT", "LTC-USDT", "SOL-USDT", "BNB-USDT", "ADA-USDT"] // 等待请求耗时:99毫秒 let arr = [] let beginTs1 = new Date().getTime() for (let symbol of symbols) { let url = `https://www.okx.com/api/v5/market/books?instId=${symbol}` arr.push(fetch(url).then(function(resp) { if (resp.ok) { return {"symbol": symbol, "json": resp.json()} } else { throw "req failed" } })) } let endTs1 = new Date().getTime() let beginTs2 = new Date().getTime() const ret = await Promise.all(arr) for (let data of ret) { Log(data) } let endTs2 = new Date().getTime() Log("Request creation time:", endTs1 - beginTs1, "ms") Log("Request waiting time:", endTs2 - beginTs2, "ms") LogStatus(_D(), ret) }
  • 使用Promise.race获取多个异步请求中最先resolvedrejected的结果:

    javascript
    async function getTicker(e) { return Promise.resolve().then(function() { /* 测试 if (e.GetName() == "Huobi" || e.GetName() == "Binance") { Sleep(1000) } */ let ret = e.GetTicker("BTC_USDT") return {"name": e.GetName(), "ret": ret} }) } async function main() { Log("begin") let arrPromise = [] for (let e of exchanges) { arrPromise.push(getTicker(e)) } let ret = await Promise.race(arrPromise) Log(ret) }
  • threading.Thread中使用setTimeout()函数:

    javascript
    function test() { Log("Test function started") // step 3. Test function started let timerId1 = setTimeout(function() { Log("Timeout callback executed after 5 seconds") // step 5. Timeout callback executed after 5 seconds }, 5000) Log("Test function completed") // step 4. Test function completed } function main() { Log("Main function started") // step 1. Main function started let t1 = threading.Thread(test) Log("Worker thread created successfully") // step 2. Worker thread created successfully t1.join() Log("Main function completed") // step 6. Main function completed }
  • 多线程并发获取ticker数据的异步处理示例:
    由于exchange.GetTicker()是同步阻塞操作,即使包装在Promise中,内部执行仍是同步的;JavaScript是单线程的,同步操作会阻塞事件循环;微任务队列中的回调函数仍然是串行执行的。

    javascript
    async function getTicker(symbol) { Log("getTicker symbol:", symbol) return Promise.resolve().then(function() { // 注意与fetch请求数据时的区别 let ret = exchange.GetTicker(symbol) Log(ret) return ret }) } async function main() { let symbols = ["BTC_USDT", "ETH_USDT", "SOL_USDT"] let t1 = threading.Thread(async function(symbols, func) { let arrPromise = [] for (let symbol of symbols) { arrPromise.push(func(symbol)) } let ret = await Promise.all(arrPromise) Log("ret:", ret) }, symbols, getTicker) t1.join() }