Files
2026-07-17 14:54:59 +00:00

62 lines
1.6 KiB
Python

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')}")