"""Actual Backtrader demo, synthetic bars, cash-only stock-like commission model, no live broker."""
from pathlib import Path
import json
import backtrader as bt

class SmaStudy(bt.Strategy):
    def __init__(self):
        self.fast = bt.ind.SMA(self.data.close, period=3)
        self.slow = bt.ind.SMA(self.data.close, period=8)
        self.pending = None
        self.orders = []
    def next(self):
        if self.pending: return
        if not self.position and self.fast[0] > self.slow[0]: self.pending = self.buy(size=1000)
        elif self.position and self.fast[0] <= self.slow[0]: self.pending = self.close()
    def notify_order(self, order):
        if order.status == order.Completed:
            self.orders.append({"date":bt.num2date(order.executed.dt).isoformat(),
                                "size":order.executed.size,"price":order.executed.price,"commission":order.executed.comm})
        if order.status in [order.Completed,order.Canceled,order.Rejected,order.Margin,order.Expired]: self.pending=None

if __name__ == "__main__":
    root=Path(__file__).resolve().parent
    engine=bt.Cerebro(stdstats=False)
    data=bt.feeds.GenericCSVData(dataname=str(root/"ohlcv-synthetic.csv"),dtformat="%Y-%m-%dT%H:%M:%SZ",
        datetime=0,open=1,high=2,low=3,close=4,volume=5,openinterest=-1,headers=True)
    engine.adddata(data); engine.addstrategy(SmaStudy)
    engine.broker.setcash(10000); engine.broker.setcommission(commission=0.0001)
    # Default next-open market execution; NO cheat-on-close and no slippage fitted to results.
    result=engine.run()[0]
    assert len(result.orders)>0
    assert all(o["commission"]>=0 for o in result.orders)
    report={"kind":"synthetic; no live orders","final_equity":engine.broker.getvalue(),
            "open_units":result.position.size,"orders":result.orders,
            "model":"default next-open market orders, one-way 1bp stock-like commission, no leverage"}
    out=Path("backtrader-results");out.mkdir(exist_ok=True)
    (out/"report.json").write_text(json.dumps(report,indent=2),encoding="utf-8")
    print(json.dumps({"final_equity":report["final_equity"],"order_events":len(result.orders)}))
