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.