diff --git a/backtestingfx/backtest.py b/backtestingfx/backtest.py index 4994666..7ff87c6 100644 --- a/backtestingfx/backtest.py +++ b/backtestingfx/backtest.py @@ -91,6 +91,11 @@ class Backtest: self._quote_to_account = quote_to_account def _to_bars(self): + required = {"open", "high", "low", "close"} + missing = required - set(self._df.columns.str.lower()) + if missing: + raise ValueError(f"DataFrame missing required columns: {sorted(missing)}") + bars = [] for idx, row in self._df.iterrows(): if isinstance(idx, pd.Timestamp): diff --git a/src/types.rs b/src/types.rs index 600ba9b..5597377 100644 --- a/src/types.rs +++ b/src/types.rs @@ -53,6 +53,19 @@ pub struct Position { pub take_profit: Option, } +#[pymethods] +impl Position { + fn __repr__(&self) -> String { + format!( + "Position(id={}, {} {:.2} lots @ {:.5})", + self.id, + if self.is_long { "LONG" } else { "SHORT" }, + self.lot_size, + self.entry_price, + ) + } +} + #[derive(Debug, Clone)] pub struct Trade { // the actual trade