3 个版本
0.8.6 | 2023年11月12日 |
---|---|
0.8.4 | 2023年10月26日 |
0.1.0 |
|
#9 in #量化
160KB
3.5K SLoC
自动交易
回测,策略,多平台,量化交易框架。
backtest, strategy, multiple platforms, quantitative trading framework.
依赖
[dependencies]
auto-trading = "0.8.6"
示例 1
使用欧易交易所进行回测。
使用欧易交易所进行回测。
product
: BTC-USDT-SWAPlevel
: Hour4范围
: 1692963462000..buy
: cci(close, 20) <= -350sell
: cci(close, 20) >= 100
use auto_trading::*;
#[tokio::test]
async fn test_1() {
let exchange = Okx::new().unwrap();
let config = Config::new()
.initial_margin(1000.0)
.quantity(Unit::Quantity(0.01))
.margin(Unit::Quantity(10.0))
.lever(100)
.open_fee(0.0002)
.close_fee(0.0005)
.maintenance(0.004);
let backtester = Backtester::new(exchange, config);
let result = backtester
.start(
|cx| {
if cx.position().is_none() {
if cci(cx.close, 20) <= -350.0 {
let result = cx.order(Side::BuyLong, 0.0);
println!(
"开仓委托结果 {} {} {:?}",
time_to_string(cx.time),
cx.close,
result
);
}
} else {
if cci(cx.close, 20) >= 100.0 {
let result = cx.order(Side::BuySell, 0.0);
println!(
"平仓委托结果 {} {} {:?}",
time_to_string(cx.time),
cx.close,
result
);
}
}
},
"BTC-USDT-SWAP",
Level::Hour4,
1692963462000..,
)
.await
.unwrap();
println!("历史仓位 {:#?}", result);
println!("所有盈亏 {}", result.iter().map(|v| v.profit).sum::<f64>());
}
使用币安交易所只需要做简单的修改。
使用币安交易所只需进行简单修改。
let exchange = Binance::new().unwrap();
使用本地交易所,从文件获取读取 k 线数据。
使用本地交易所,从文件中读取 k 线数据。
let exchange = LocalExchange::new().push(
"BTC-USDT-SWAP",
Level::Hour4,
serde_json::from_str(include_str!("BTC-USDT-SWAP-4h.json")).unwrap(),
0.01,
0.0,
);
更多的委托参数。
更多委托参数。
cx.order_condition(
side,
price,
quantity,
margin,
stop_profit_condition,
stop_loss_condition,
stop_profit,
stop_loss,
);
示例 2
使用 1 分钟时间级别的 k 线数据在 4 小时的策略上回测,你的强平,平仓,开仓,盈亏会按照 1 分钟的时间级别刷新,而策略的调用周期为 4 小时。
使用 1 分钟时间级别的 k 线数据对 4 小时策略进行回测,你的强制平仓、平仓、开仓和盈亏会按照 1 分钟的时间级别刷新,而策略的调用周期为 4 小时。
强烈建议使用 1 分钟级别的 k 线数据进行回测。
强烈建议使用 1 分钟级别的 k 线数据进行回测。
use auto_trading::*;
#[tokio::test]
async fn test_2() {
// 使用 1 分钟的 k 线数据。
let k = serde_json::from_str::<Vec<K>>(include_str!("../BTC-USDT-SWAP-1m.json")).unwrap();
let exchange = LocalExchange::new()
.push("BTC-USDT-SWAP", Level::Minute1, k.clone(), 0.01, 0.0)
.push(
"BTC-USDT-SWAP",
Level::Hour4,
// k 线转换
k_convert(k, Level::Hour4),
0.01,
0.0,
);
// Level::Minute1 -> Level::Hour4
Backtester::new(exchange, Config::new())
.start_amplifier(
|cx| println!("{} {}", cx.time, time_to_string(cx.time)),
"BTC-USDT-SWAP",
Level::Minute1,
Level::Hour4,
0,
)
.await
.unwrap();
}
内置函数
在 auto_trading::util
内置了 crossover, crossunder, highest, lowest, sma, ema, rma, cci, macd 等其他函数。
在 auto_trading::util
中包含 crossover, crossunder, highest, lowest, sma, ema, rma, cci, macd 等其他内置函数。
use auto_trading::*;
#[tokio::test]
async fn test_3() {
println!("{}", time_to_string(1145141919810));
println!("{}", string_to_time("2006-04-16 06:58:39"));
println!(
"{:?}",
get_k_range(
&Okx::new().unwrap(),
"BTC-USDT-SWAP",
Level::Hour4,
1695212739000..1695644739000
)
.await
.unwrap()
);
}
数据系列
策略的 cx.open, cx.high, cx.low, cx.close 的数据类型为 auto_trading::base::Source
,它不会因为越界而发生 panic。
策略中 cx.open, cx.high, cx.low, cx.close 的数据类型为 auto_trading::base::Source
,它们不会因为越界错误而引发 panic。
#[test]
fn test_4() {
let array = vec![1.0, 2.0, 3.0, 4.0, 5.0, 6.0];
let source = Source::new(&array);
assert!(source == 1.0);
assert!(source[2] == 3.0);
assert!(source[10].is_nan());
assert!((&source[1..4]) == &[2.0, 3.0, 4.0][..]);
assert!((&source[10..]).len() == 0);
}
可视化
使用 to_html
函数将回测结果可视化。
使用 to_html
函数来可视化回测结果。
架构
exchange
交易所。config
交易配置。backtester
回测器。match 引擎
撮合引擎。strategy
策略。
+========+
| config |
+========+
||
||
+================+ vv
| okx | +==========+ +============+ +==========+
| binance | --> | exchange | --> | backtester | <-- | strategy |
| local exchange | +==========+ +============+ +==========+
+================+ ^|
||
|v
+==============+
| match engine |
+==============+
依赖
~7–23MB
~306K SLoC