mirror of
https://github.com/KhizarImran/backtestingfx.git
synced 2026-08-05 00:07:46 +00:00
feat: add standalone HTML reports
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
import math
|
||||
|
||||
import pandas as pd
|
||||
|
||||
from backtestingfx import Backtest, Strategy
|
||||
|
||||
|
||||
class MovingAverageCycle(Strategy):
|
||||
fast = 8
|
||||
slow = 24
|
||||
|
||||
def next(self):
|
||||
if self.index + 1 < self.slow:
|
||||
return
|
||||
|
||||
closes = [bar.close for bar in self.data[-self.slow :]]
|
||||
fast_average = sum(closes[-self.fast :]) / self.fast
|
||||
slow_average = sum(closes) / self.slow
|
||||
should_be_long = fast_average > slow_average
|
||||
|
||||
if self.positions and self.positions[0].is_long != should_be_long:
|
||||
self.close_all()
|
||||
|
||||
if not self.positions:
|
||||
if should_be_long:
|
||||
self.buy(0.1)
|
||||
else:
|
||||
self.sell(0.1)
|
||||
|
||||
|
||||
def sample_data():
|
||||
timestamps = pd.date_range("2025-01-01", periods=360, freq="h", tz="UTC")
|
||||
closes = [
|
||||
1.1000 + 0.0040 * math.sin(i / 13) + 0.0010 * math.sin(i / 3)
|
||||
for i in range(len(timestamps))
|
||||
]
|
||||
opens = [closes[0], *closes[:-1]]
|
||||
|
||||
return pd.DataFrame(
|
||||
{
|
||||
"open": opens,
|
||||
"high": [max(open_, close) + 0.0004 for open_, close in zip(opens, closes)],
|
||||
"low": [min(open_, close) - 0.0004 for open_, close in zip(opens, closes)],
|
||||
"close": closes,
|
||||
"volume": [800 + int(300 * abs(math.sin(i / 9))) for i in range(len(timestamps))],
|
||||
},
|
||||
index=timestamps,
|
||||
)
|
||||
|
||||
|
||||
data = sample_data()
|
||||
backtest = Backtest(
|
||||
data,
|
||||
MovingAverageCycle,
|
||||
cash=10_000,
|
||||
commission=3.5,
|
||||
spread=0.00002,
|
||||
)
|
||||
|
||||
print(backtest.run())
|
||||
print(f"\nReport written to: {backtest.plot('backtestingfx-report.html')}")
|
||||
Reference in New Issue
Block a user