回测,策略,多平台,量化交易框架。
backtest, strategy, multiple platforms, quantitative trading framework.
[dependencies]
auto-trading = "0.8.6"
使用欧易交易所进行回测。
Perform backtesting using the Okx exchange.
product
: BTC-USDT-SWAPlevel
: Hour4range
: 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>());
}
使用币安交易所只需要做简单的修改。
Making modifications to use the Binance exchange is a straightforward process.
let exchange = Binance::new().unwrap();
使用本地交易所,从文件获取读取 k 线数据。
Using a local exchange, retrieve candlestick (k-line) data from a file.
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,
);
更多的委托参数。
More delegate parameters.
cx.order_condition(
side,
price,
quantity,
margin,
stop_profit_condition,
stop_loss_condition,
stop_profit,
stop_loss,
);
使用 1 分钟时间级别的 k 线数据在 4 小时的策略上回测,你的强平,平仓,开仓,盈亏会按照 1 分钟的时间级别刷新,而策略的调用周期为 4 小时。
Backtesting a 4-hour strategy using 1-minute candlestick data means that your liquidation, closing, opening, and profit/loss calculations will refresh at the 1-minute time interval, while the strategy's invocation period is set at 4 hours.
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 等其他函数。
In auto_trading::util
, there are other built-in functions such as crossover, crossunder, highest, lowest, sma, ema, rma, cci, macd, and more.
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。
The data types for cx.open
, cx.high
, cx.low
, and cx.close
in the strategy are auto_trading::base::Source
, and they won't panic due to index out of bounds errors.
#[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
函数将回测结果可视化。
Use the to_html
function to visualize the backtest results.
exchange
交易所。config
交易配置。backtester
回测器。match engine
撮合引擎。strategy
策略。
+========+
| config |
+========+
||
||
+================+ vv
| okx | +==========+ +============+ +==========+
| binance | --> | exchange | --> | backtester | <-- | strategy |
| local exchange | +==========+ +============+ +==========+
+================+ ^|
||
|v
+==============+
| match engine |
+==============+