1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//! Strategy trait for strategy-driven backtests.
//!
//! Implement [`Strategy`] to define custom trading logic that reacts to
//! market events and produces [`Action`]s for the engine to process.
use Action;
use crateMarketEvent;
/// A trading strategy that reacts to market events.
///
/// The backtest runner calls [`on_event`](Strategy::on_event) for every
/// market event (tick or bar) in the data feed. The strategy inspects the
/// event and returns zero or more [`Action`]s that the engine will process.
///
/// # Example
///
/// ```ignore
/// use qs_backtest::{Strategy, MarketEvent};
/// use qs_core::types::{Action, OrderType, Side};
///
/// struct BuyAndHold { entered: bool }
///
/// impl Strategy for BuyAndHold {
/// fn on_event(&mut self, event: &MarketEvent) -> Vec<Action> {
/// if self.entered { return vec![]; }
/// if let MarketEvent::Tick { symbol, ask, .. } = event {
/// self.entered = true;
/// return vec![Action::Open {
/// symbol: symbol.clone(),
/// side: Side::Buy,
/// order_type: OrderType::Market,
/// price: Some(*ask),
/// size: 1.0,
/// stoploss: None,
/// targets: vec![],
/// rules: vec![],
/// group: None,
/// }];
/// }
/// vec![]
/// }
///
/// fn on_finished(&mut self) -> Vec<Action> {
/// vec![Action::CloseAll]
/// }
/// }
/// ```