失败与空值
调用失败返回空值
交易所对象的函数和大多数全局函数调用失败时(网络错误、超时、交易所拒绝请求、参数不被交易所接受等)不会中止策略,而是:
- 记录一条错误日志(可以用
SetErrorFilter过滤); - 把错误信息记为最近一次错误,用
GetLastError读取; - 返回空值:
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),
}
}