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

1、使用Rust编写策略与使用JavaScript编写策略的区别,主要在于平台API函数返回数据形式的不同,例如exchange.GetTicker()函数:

  • JavaScript
    exchange.GetTicker()调用成功时返回一个对象;若调用失败(如交易所服务器问题、网络问题等)则返回null

    javascript
    function main() { var ticker = exchange.GetTicker() // 判断exchange.GetTicker函数是否调用失败(返回null) if (ticker) { Log(ticker) } }
  • Rust
    可能失败的API调用统一返回Result<T>类型,可采用Rust惯用的方式处理错误:

    rust
    fn main() { // 方式一:模式匹配,判断exchange.GetTicker函数是否调用成功 if let Ok(ticker) = exchange.GetTicker(None) { Log!(ticker); } // 方式二:使用_C!宏自动重试,直到调用成功返回 let ticker = _C!(exchange.GetTicker(None)); Log!(ticker); }

    可选参数(例如GetTickersymbol参数)在不传时使用None占位,需要传值时直接传入,例如exchange.GetTicker("BTC_USDT")

2、策略入口与生命周期:Rust策略的入口为fn main()(与标准Rust程序的入口同名,但由平台调用,且无返回值)。与JavaScript一样,可以选择性地定义fn init()(策略开始运行时首先自动执行)和fn onexit()(策略退出时执行扫尾工作),引导层会自动调用;此外,也可以在策略代码中调用OnExit()注册额外的退出钩子:

rust
fn main() { // 策略逻辑... } fn init() { Log!("初始化"); } fn onexit() { Log!("策略退出,执行扫尾处理"); }

3、日志与全局功能以宏的形式提供:Log!()LogStatus!()Panic!()_G!()_C!()等为Rust宏(注意末尾的感叹号);而LogProfit()Sleep()_D()_N()HttpQuery()等则为普通函数。

4、策略参数注入为全局常量:界面上配置的策略参数按其值类型注入策略代码(number对应f64、boolean对应bool、string/密码对应&str、下拉框按其选项值类型),可直接以参数名引用。若需用作整数,请自行转换,例如let n = Period as usize;。完整的参数集可通过params()函数获取JSON文本后自行解析。

5、JSON数据处理:平台API返回的原始JSON文本(例如exchange.IO()的返回值、各结构体的Info字段)可使用内置的JSONParse()函数解析为JsonValue,并以v["key"]v[0]的形式进行索引导航,再通过as_f64()as_str()as_bool()等方法获取标量值。由于SDK未内置JSON序列化功能,构造JSON文本时可使用format!宏拼接,或引入第三方crate(如serde_json)。

6、第三方crate与TLS注意事项:策略源码是唯一的代码文件,需在源码最顶部用---包裹的[dependencies] frontmatter中声明依赖(详见「编程语言 - Rust」一节)。由于编译沙盒中没有系统OpenSSL,对于需要TLS的crate,请选择纯Rust实现的rustls,避免依赖native-tls/openssl-sys;WebSocket连接则优先使用内置的Dial()函数。