2026-06-06 16:18:45 +01:00
|
|
|
use backtestingfx::types::Bar;
|
|
|
|
|
use backtestingfx::broker::Broker;
|
|
|
|
|
use backtestingfx::strategy::Strategy;
|
|
|
|
|
use backtestingfx::engine::Engine;
|
|
|
|
|
use backtestingfx::data::load_csv;
|
2026-06-06 17:16:32 +01:00
|
|
|
use backtestingfx::stats::Stats;
|
|
|
|
|
|
2026-06-06 16:18:45 +01:00
|
|
|
|
|
|
|
|
struct BuyEveryBar;
|
|
|
|
|
|
|
|
|
|
impl Strategy for BuyEveryBar {
|
|
|
|
|
fn next (&mut self, bar: &Bar, broker: &mut Broker) {
|
|
|
|
|
broker.close_all(bar.close, bar.timestamp); //closes any open positions
|
|
|
|
|
broker.buy(bar.close, 1.0, bar.timestamp); // can be more complicated with buy, sells, close position, close all etc.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
|
let data = load_csv("examples/data/eurusd_lse_1h.csv");
|
2026-06-06 17:16:32 +01:00
|
|
|
let mut engine = Engine::new(data, 10_000.0, 0.0, 0.00010);
|
2026-06-06 16:18:45 +01:00
|
|
|
let mut strategy = BuyEveryBar;
|
|
|
|
|
|
|
|
|
|
engine.run(&mut strategy); // main line that runs the strategy
|
|
|
|
|
|
2026-06-06 17:16:32 +01:00
|
|
|
let stats = Stats::compute(&engine.broker, 10_000.0);
|
|
|
|
|
println!("{}", stats);
|
2026-06-06 16:18:45 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|