diff --git a/.gitignore b/.gitignore index 3a414f8..b72680b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /target Cargo.lock *.so +__pycache__/ ### My claude md file CLAUDE.md data/ diff --git a/backtestingfx/__pycache__/__init__.cpython-314.pyc b/backtestingfx/__pycache__/__init__.cpython-314.pyc deleted file mode 100644 index 2ccd0a3..0000000 Binary files a/backtestingfx/__pycache__/__init__.cpython-314.pyc and /dev/null differ diff --git a/backtestingfx/__pycache__/backtest.cpython-314.pyc b/backtestingfx/__pycache__/backtest.cpython-314.pyc deleted file mode 100644 index d7b8e74..0000000 Binary files a/backtestingfx/__pycache__/backtest.cpython-314.pyc and /dev/null differ diff --git a/python/__pycache__/backtest.cpython-314.pyc b/python/__pycache__/backtest.cpython-314.pyc deleted file mode 100644 index 60751d0..0000000 Binary files a/python/__pycache__/backtest.cpython-314.pyc and /dev/null differ diff --git a/python/backtest.py b/python/backtest.py deleted file mode 100644 index ce71e28..0000000 --- a/python/backtest.py +++ /dev/null @@ -1,100 +0,0 @@ -from typing import Any - -import backtestingfx as _rust # type: ignore -import pandas as pd - - -class Strategy: - def __init__(self): - self._bars: Any = None - self._bar: Any = None - self._broker: Any = None - - def init(self): - pass - - def next(self): - pass - - def buy(self, lot_size, stop_loss=None, take_profit=None): - self._broker.buy( - self._bar.close, lot_size, self._bar.timestamp, stop_loss, take_profit - ) - - def sell(self, lot_size, stop_loss=None, take_profit=None): - self._broker.sell( - self._bar.close, lot_size, self._bar.timestamp, stop_loss, take_profit - ) - - def close_all(self): - self._broker.close_all(self._bar.close, self._bar.timestamp) - - def close_position(self, id): - self._broker.close_position(id, self._bar.close, self._bar.timestamp) - - -class _Adapter: - def __init__(self, strategy): - self._strategy = strategy - - def init(self, bars): - self._strategy._bars = bars - self._strategy.init() - - def next(self, bar, broker): - self._strategy._bar = bar - self._strategy._broker = broker - self._strategy.next() - - -class Backtest: - def __init__( - self, - df, - strategy_class, - cash=10000.0, - commission=0.0, - spread=0.0, - contract_size=100000.0, - quote_to_account=1.0, - ): - self._df = df - self._strategy_class = strategy_class - self._cash = cash - self._commission = commission - self._spread = spread - self._contract_size = contract_size - self._quote_to_account = quote_to_account - - def _to_bars(self): - bars = [] - for idx, row in self._df.iterrows(): - if isinstance(idx, pd.Timestamp): - ts = int(idx.timestamp()) - else: - ts = int(pd.Timestamp(row["timestamp"]).timestamp()) # type: ignore - - bars.append( - _rust.Bar( # type: ignore - timestamp=ts, - open=float(row["open"]), - high=float(row["high"]), - low=float(row["low"]), - close=float(row["close"]), - volume=float(row.get("volume", 0.0)), - ) - ) - return bars - - def run(self): - bars = self._to_bars() - engine = _rust.Engine( # type: ignore - bars, - self._cash, - self._commission, - self._spread, - self._contract_size, - self._quote_to_account, - ) - strategy = self._strategy_class() - return engine.run(_Adapter(strategy)) diff --git a/python/simple_strategy.py b/python/simple_strategy.py deleted file mode 100644 index 61344f6..0000000 --- a/python/simple_strategy.py +++ /dev/null @@ -1,28 +0,0 @@ -import os - -import pandas as pd -from backtestingfx import Backtest, Strategy -from dotenv import load_dotenv -from lse import LSE - -load_dotenv() - -client = LSE(api_key=os.environ["LSE_API_KEY"]) - -rows = client.candles("EUR/USD", "1h", limit=2000) -df = pd.DataFrame(rows) -df.to_csv("data/EURUSD_1H.csv", index=False) - - -class BuyEveryBar(Strategy): - def next(self): - self.close_all() - self.buy(0.1) - - -df = pd.read_csv("data/EURUSD_1H.csv") - -bt = Backtest(df, BuyEveryBar, cash=10000.0, commission=0.0, spread=0.0001) -stats = bt.run() - -print(stats)