输入/搜索内容

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); }

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

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;。

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()函数。