Documentation Open Backtest
SDK Python

Exemple — croisement de SMA

Un backtest complet de croisement de moyennes mobiles en environ 40 lignes.

Cet exemple reproduit sdk/python/examples/sma_cross.py : une position longue est ouverte lorsque la SMA sur 20 périodes passe au-dessus de celle sur 50 périodes, puis elle est clôturée lors du croisement inverse.

import os
from openbacktest import OpenBacktest

client = OpenBacktest(api_key=os.environ["OPENBACKTEST_API_KEY"])

candles = client.get_candles("BTCUSDT", "1h", count=1500)
candles["sma20"] = candles["close"].rolling(20).mean()
candles["sma50"] = candles["close"].rolling(50).mean()

project = client.create_project("Documentation croisement SMA", "BTCUSDT", "1h")
session = client.create_session(
    project.id, "sma 20/50", initial_balance=10_000,
    fees={"entryFee": 0.1, "exitFee": 0.1, "type": "percent"},
)

for time, row in candles.dropna().iterrows():
    above = row["sma20"] > row["sma50"]
    if above and session.position is None:
        session.buy(qty=0.1, price=row["close"], time=time)
    elif not above and session.position is not None:
        session.close(price=row["close"], time=time)

# Clôturer une éventuelle position encore ouverte sur la dernière bougie
if session.position is not None:
    last = candles.iloc[-1]
    session.close(price=last["close"], time=candles.index[-1])

stats = session.finish()
print(f"trades      : {stats.trade_count}")
print(f"winrate     : {stats.winrate:.1%}")
print(f"P&L net     : {stats.pl_net:,.2f}")
print(f"drawdown max: {stats.max_drawdown:,.2f}")

Ouvrez ensuite la session dans l'application web : la courbe de capital, la liste des trades et les graphiques de distribution sont disponibles comme pour un replay manuel.