mirror of
https://github.com/KhizarImran/backtestingfx.git
synced 2026-07-27 20:17:44 +00:00
chore: remove stale python/ dir and __pycache__ from tracking
python/backtest.py and python/simple_strategy.py were leftover duplicates from before the PyO3 restructure; nothing referenced them. __pycache__ was never gitignored.
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
/target
|
/target
|
||||||
Cargo.lock
|
Cargo.lock
|
||||||
*.so
|
*.so
|
||||||
|
__pycache__/
|
||||||
### My claude md file
|
### My claude md file
|
||||||
CLAUDE.md
|
CLAUDE.md
|
||||||
data/
|
data/
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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))
|
|
||||||
@@ -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)
|
|
||||||
Reference in New Issue
Block a user