Rust策略编写说明
1、使用Rust编写策略与使用JavaScript编写策略的区别,主要在于平台API函数返回数据形式的不同,例如exchange.GetTicker()函数:
-
JavaScript
exchange.GetTicker()调用成功时返回一个对象;若调用失败(如交易所服务器问题、网络问题等)则返回null。javascriptfunction main() { var ticker = exchange.GetTicker() // 判断exchange.GetTicker函数是否调用失败(返回null) if (ticker) { Log(ticker) } } -
Rust
可能失败的API调用统一返回Result<T>类型,可采用Rust惯用的方式处理错误:rustfn main() { // 方式一:模式匹配,判断exchange.GetTicker函数是否调用成功 if let Ok(ticker) = exchange.GetTicker(None) { Log!(ticker); } // 方式二:使用_C!宏自动重试,直到调用成功返回 let ticker = _C!(exchange.GetTicker(None)); Log!(ticker); }可选参数(例如
GetTicker的symbol参数)在不传时使用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()函数。