| | #[cfg(test)] |
| | mod tests { |
| | use crate::compiler::lexer::Lexer; |
| | use crate::compiler::lexer::Token; |
| | use crate::engine::backtester::{Backtester, BacktestConfig, OrderType}; |
| |
|
| | #[test] |
| | fn test_mql5_lexer() { |
| | let code = r#" |
| | double input lotSize = 0.1; |
| | void OnTick() { |
| | OrderSend("EURUSD", OP_BUY, lotSize, Ask, 10, 0, 0); |
| | } |
| | "#; |
| | |
| | |
| | let result = Lexer::tokenize(code); |
| | assert!(result.is_ok()); |
| | |
| | let (_, tokens) = result.unwrap(); |
| | assert!(!tokens.is_empty()); |
| | assert!(tokens.contains(&Token::Double)); |
| | assert!(tokens.contains(&Token::Input)); |
| | assert!(tokens.contains(&Token::Identifier("lotSize".to_string()))); |
| | } |
| | |
| | #[test] |
| | fn test_backtest_engine_equity() { |
| | let config = BacktestConfig { |
| | initial_deposit: 10000.0, |
| | leverage: 100.0, |
| | spread_modifier: 0, |
| | }; |
| | |
| | let mut bt = Backtester::new(config); |
| | |
| | |
| | bt.update_tick("EURUSD", 1.00000, 1.00010); |
| | |
| | let ticket = bt.market_order("EURUSD", OrderType::Buy, 1.0, None, None, "10:00".to_string()).unwrap(); |
| | |
| | |
| | bt.update_tick("EURUSD", 1.00100, 1.00110); |
| | |
| | |
| | |
| | assert!(bt.equity > 10080.0 && bt.equity < 10100.0); |
| | |
| | |
| | bt.close_position(ticket, "10:05".to_string()).unwrap(); |
| | assert!(bt.balance > 10080.0 && bt.balance < 10100.0); |
| | assert_eq!(bt.open_positions.len(), 0); |
| | assert_eq!(bt.history.len(), 1); |
| | } |
| | } |
| |
|