输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
品种代码
失败与空值
交易所

调用失败返回空值

交易所对象的函数和大多数全局函数调用失败时(网络错误、超时、交易所拒绝请求、参数不被交易所接受等)不会中止策略,而是:

  1. 记录一条错误日志(可以用SetErrorFilter过滤);
  2. 把错误信息记为最近一次错误,用GetLastError读取;
  3. 返回空值:JavaScript返回null,Python返回None,Rust返回Err(错误信息在Err里)。

查询成功但没有数据时返回空数组[](例如没有挂单时的exchange.GetOrders()),与失败的空值不同。判断结果时要区分这两种情况,不能把空值当成「没有数据」继续计算。少数函数的失败返回值不同,以各函数页「返回值」为准(例如HttpQuery()失败时返回空字符串)。

不支持的接口

交易所或运行环境不支持某个函数、某种查询范围时,按调用失败处理:记录一条「不支持」的错误(错误日志 + GetLastError()),返回空值,策略不中断。不会返回[]、{}、0这类看起来像正常数据的值。

编程错误会抛出异常

调用方式本身有误时(例如没有设置交易对就调用不传symbol的函数、参数格式无法解析),JavaScript、Python抛出异常,没有捕获时策略停止;Rust返回Err。这类错误需要修改代码,重试没有意义。

写法

调用后先判断空值,再使用结果;需要自动重试的调用可以用_C包装。

示例

区分调用失败(空值)与查询成功但没有数据(空数组)。

javascript
function main() { var ticker = exchange.GetTicker("BTC_USDT") if (ticker === null) { // 调用失败:错误日志已经记录,GetLastError()可以读取原因 Log("GetTicker failed:", GetLastError()) return } var orders = exchange.GetOrders("BTC_USDT") if (orders === null) { Log("GetOrders failed:", GetLastError()) } else if (orders.length === 0) { Log("no open orders") } else { Log("open orders:", orders.length) } }
python
def main(): ticker = exchange.GetTicker("BTC_USDT") if ticker is None: # 调用失败:错误日志已经记录,GetLastError()可以读取原因 Log("GetTicker failed:", GetLastError()) return orders = exchange.GetOrders("BTC_USDT") if orders is None: Log("GetOrders failed:", GetLastError()) elif len(orders) == 0: Log("no open orders") else: Log("open orders:", len(orders))
rust
fn main() { let ticker = match exchange.GetTicker("BTC_USDT") { Ok(t) => t, Err(e) => { // 调用失败:Err 里是错误信息 Log!("GetTicker failed:", e); return; } }; Log!("last:", ticker.Last); match exchange.GetOrders("BTC_USDT") { Ok(orders) if orders.is_empty() => Log!("no open orders"), Ok(orders) => Log!("open orders:", orders.len()), Err(e) => Log!("GetOrders failed:", e), } }