# Auto Trading [github](https://github.com/86maid/auto-trading) [![Latest version](https://img.shields.io/crates/v/auto-trading)](https://crates.io/crates/auto-trading) [![Documentation](https://docs.rs/auto-trading/badge.svg)](https://docs.rs/auto-trading) [![Apache](https://img.shields.io/badge/license-Apache-blue.svg)](https://github.com/86maid/auto-trading/blob/master/LICENSE) 回测,策略,多平台,量化交易框架。 backtest, strategy, multiple platforms, quantitative trading framework. # Dependencies ``` [dependencies] auto-trading = "0.8.6" ``` # Examples 1 使用欧易交易所进行回测。 Perform backtesting using the Okx exchange. * `product`: BTC-USDT-SWAP * `level`: Hour4 * `range`: 1692963462000.. * `buy`: cci(close, 20) <= -350 * `sell`: cci(close, 20) >= 100 ```rust 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::()); } ``` 使用币安交易所只需要做简单的修改。 Making modifications to use the Binance exchange is a straightforward process. ```rust let exchange = Binance::new().unwrap(); ``` 使用本地交易所,从文件获取读取 k 线数据。 Using a local exchange, retrieve candlestick (k-line) data from a file. ```rust 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. ```rust cx.order_condition( side, price, quantity, margin, stop_profit_condition, stop_loss_condition, stop_profit, stop_loss, ); ``` # Examples 2 使用 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. ## 强烈建议使用 1 分钟级别的 k 线数据进行回测。 ## Backtesting with 1-minute level k-line data is highly recommended. ```rust use auto_trading::*; #[tokio::test] async fn test_2() { // 使用 1 分钟的 k 线数据。 let k = serde_json::from_str::>(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(); } ``` # Built-in Functions 在 `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. ```rust 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() ); } ``` # Data series 策略的 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. ```rust #[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); } ``` # Visualize 使用 `to_html` 函数将回测结果可视化。 Use the `to_html` function to visualize the backtest results. # Architecture * `exchange` 交易所。 * `config` 交易配置。 * `backtester` 回测器。 * `match engine` 撮合引擎。 * `strategy` 策略。 ``` +========+ | config | +========+ || || +================+ vv | okx | +==========+ +============+ +==========+ | binance | --> | exchange | --> | backtester | <-- | strategy | | local exchange | +==========+ +============+ +==========+ +================+ ^| || |v +==============+ | match engine | +==============+ ```