SDK Python
Le paquet openbacktest — des bougies en DataFrames et des sessions sous forme d'objets.
Le paquet openbacktest encapsule l'API REST dans un client idiomatique pour
Python. Les bougies sont fournies sous forme de DataFrames pandas, les sessions
sont des objets avec état dotés des méthodes buy/sell/close, et les
statistiques sont calculées par le même moteur que celui de l'application.
Le client utilise l'API publique de la version actuelle par défaut. Définissez
OPENBACKTEST_BASE_URL pour cibler un autre environnement, notamment un
serveur local.
Installation
Le SDK se trouve dans le dépôt, sous sdk/python. Sa publication sur PyPI est
prévue :
python -m venv .venv
.venv\Scripts\Activate.ps1 # Windows — utilisez source .venv/bin/activate ailleurs
pip install -e "sdk/python[dev]"Démarrage rapide
import os
from openbacktest import OpenBacktest
client = OpenBacktest(
api_key=os.environ["OPENBACKTEST_API_KEY"],
)
print(client.me()) # vérifie la clé et l'accès Pro
# Bougies dans un DataFrame (index datetime UTC et colonnes OHLCV)
candles = client.get_candles("BTCUSDT", "1h", count=1500)
# Bougies continues du contrat trimestriel courant Binance USD-M
futures = client.get_candles(
"BTCUSDT",
"1h",
count=1500,
feed="binance-usdm-current-quarter",
)
print(candles.tail())
# Projet et session
project = client.create_project("Croisement de SMA", "BTCUSDT", "1h")
session = client.create_session(
project.id, "exécution 1", initial_balance=10_000,
fees={"entryFee": 0.1, "exitFee": 0.1, "type": "percent"},
)
# Ouvrir avec buy()/sell(), puis clôturer avec close().
session.buy(qty=0.1, price=60_000, time=candles.index[100])
session.close(price=61_000, time=candles.index[110])
stats = session.finish(break_even_threshold=2.5)
print(stats.winrate, stats.pl_net, stats.max_drawdown)Pour lancer un replay aléatoire, aveugle et reproductible, fournissez une
période candidate ainsi que la durée et la seed. Le SessionInfo renvoyé
expose la plage réellement tirée et le fuseau du compte figé dans la session :
session = client.create_session(
project.id,
"replay aléatoire aveugle",
initial_balance=10_000,
range_start=1704067200000,
range_end=1767225600000,
replay_randomization={"seed": 42, "durationMs": 7 * 86_400_000},
blind_mode=True,
smooth_candles=False,
)
print(session.info.range_start, session.info.range_end)
print(session.info.random_seed, session.info.account_timezone)Cycle de vie d'une session
buy(qty, price, time, stop_loss=None, take_profit=None, note=None)etsell(...)ouvrent une position longue ou courte. Une seule position peut être ouverte à la fois.close(price, time)clôture la position, ajoute le trade à un tampon local, puis l'envoie à l'API par lots de 500 au maximum. Utilisezflush()pour forcer l'envoi.finish(break_even_threshold=0)vide le tampon, termine la session de manière idempotente et renvoie les statistiques.stats(break_even_threshold=0)les recalcule avec la même bande break-even exprimée dans la devise du compte.- Les statistiques d'une session terminée incluent
ideal_r_analysis: Ideal Average/Max RR sur sept jours, couverture par trade et « could have profit/BE » au seuil strict de 1,2R. L'analyse restenot-finalpendant une session active afin qu'aucun prix postérieur ne fuite dans le replay. - La session apparaît ensuite dans l'application web avec les étiquettes
api/sdk, les mêmes graphiques et les mêmes statistiques qu'une session de replay manuel.
Erreurs
Toutes les erreurs de l'API déclenchent des exceptions typées provenant de
openbacktest.errors : AuthenticationError (401), ProRequiredError (403),
NotFoundError (404), SessionNotActiveError (409), ValidationError (400),
RateLimitError (429, avec le nombre de secondes dans retry_after ; les
requêtes GET sont automatiquement retentées jusqu'à trois fois) et
ServerError (5xx).