Backtester une stratégie Pine depuis Claude Code en 90 secondes
Pas à pas avec le serveur @pineforge/codegen-mcp : installation en une commande npx, demande à Claude de transpiler votre Pine, exécutez un backtest Docker et relisez la liste des trades. Vos OHLCV restent sur la machine.
Le codegen PineForge vivait derrière un curl depuis plusieurs mois ; cette semaine, il vit aussi derrière un serveur Model Context Protocol — vous pouvez enchaîner un backtest depuis n’importe quel client compatible MCP : Claude Desktop, Claude Code, Cursor, Continue.dev, et la liste s’allonge.
Voici la traversée de bout en bout. Du dépôt vide au rapport JSON de backtest : environ 90 secondes horloge murale, plus le premier docker pull une fois pour toutes.
Ce que fait réellement le serveur
Le paquet npm @pineforge/codegen-mcp est un pont stdio local très fin. Il expose quatre outils à votre client IA :
La surface vie privée mérite une pause. Le source Pine part vers le codegen hébergé (codegen.pineforge.dev). Le CSV OHLCV ne part pas. backtest_pine exécute le strategy.cpp produit contre le fichier que vous indiquez via votre Docker local, monté en lecture seule dans le conteneur. Pas d’accès réseau sortant depuis le runtime. Vos données restent sur votre machine.
Installation (une commande)
npx -y @pineforge/codegen-mcpC’est tout. Au premier lancement le paquet se télécharge, TypeScript se compile à la volée, et le serveur parle MCP sur stdio. Pas d’installation globale ni d’étape de build.
Il vous faut trois choses :
- Node ≥ 20
- Un démon Docker local actif (
backtest_pineappelledocker run) - Une clé API PineForge
pf_…obtenue via la file d’attente pineforge.dev
Brancher Claude Desktop
Ouvrez le fichier de configuration :
- macOS :
~/Library/Application Support/Claude/claude_desktop_config.json - Windows :
%APPDATA%\Claude\claude_desktop_config.json
Ajoutez sous mcpServers :
{
"mcpServers": {
"pineforge-codegen": {
"command": "npx",
"args": ["-y", "@pineforge/codegen-mcp"],
"env": {
"PINEFORGE_API_KEY": "pf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}Redémarrez Claude Desktop. Le serveur apparaît sous « Outils disponibles ». Le premier appel touche le codegen hébergé et déclenche docker pull pour l’image runtime — ~250 Mo, une seule fois.
Claude Code (CLI)
Si vous êtes déjà dans un terminal, c’est plus court :
claude mcp add pineforge-codegen \
--transport stdio \
--env PINEFORGE_API_KEY=pf_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
-- npx -y @pineforge/codegen-mcpRelancez la session : les quatre outils sont là.
Cursor
Réglages → MCP → Nouveau serveur MCP → collez le même bloc JSON. Cursor gère le cycle de vie.
Piloter en langage naturel
Une fois câblé, le modèle d’interaction, ce sont des prompts en français ou en anglais. Exemple (légèrement compressé) :
Vous : J’ai une stratégie Pine v6 dans
./strategy.pineet 7 jours de ETHUSDT en 15 minutes dans./eth_15m.csv. Backteste-la et donne-moi le Sharpe et le drawdown max.
Claude : J’exécute
backtest_pinesur ces fichiers…
[appel d’outil ~3 s]
Terminé. 49 trades sur la fenêtre. PnL net −190,85 $, Sharpe 0,21, drawdown max 312 $. La stratégie passe short après la 3e perte et ne se relève pas — on inspecte le déclencheur d’entrée ou on balaie le seuil ?
C’est la surface productive : le modèle connaît les descriptions d’outils et la forme de retour de backtest_pine, et enchaîne sans que vous tapiez le curl. La friction « éditer Pine → TradingView → recharger → lire les chiffres → retour éditeur » se replie dans une seule conversation.
À quoi ressemble le rapport
backtest_pine renvoie la même forme JSON que l’image Docker autonome. Bloc résumé :
{
"engine": "pineforge",
"summary": {
"total_trades": 49,
"net_pnl": -190.85,
"max_drawdown": 312.0,
"sharpe": 0.21,
"profit_factor": 0.78,
"win_rate": 0.43
},
"trades": [
/* 49 entrées avec horodatages, prix, PnL */
],
"elapsed_seconds": 0.0042,
"_meta": {
"strategy_cpp_bytes": 5079,
"image": "ghcr.io/pineforge-4pass/pineforge-engine:latest"
}
}Le modèle voit la structure complète. Pour « quel était le pire trade ? », il peut scanner trades[] lui-même — souvent sans second appel d’outil.
Conscience du quota
Toute conversation qui utilise l’API codegen compte dans votre quota. L’outil get_quota sert à vérifier avant une grille de paramètres coûteuse. Le tier gratuit : 100 transpilations par mois — largement suffisant pour du hobby et des smokes CI, plus juste si vous bouclez une optimisation intensive.
Bon réflexe : dans CLAUDE.md, indiquez par exemple
« Si on demande d’optimiser une stratégie, appelle get_quota avant plus de 5 transpiles et annonce le budget restant. »
Ce qui est volontairement hors du serveur
- Pas d’ordres live. Le serveur est en lecture seule sur stratégie et données ; pas de courtier. Le trading réel est un autre sujet.
- Pas de téléchargement de données. Vous apportez l’OHLCV. Pas d’appels exchanges ou fournisseurs — vous contrôlez l’origine des octets.
- Pas d’état entre les appels. Chaque
backtest_pineest un conteneur neuf. Pas de cache persistant ni de session partagée.
Ce sont des limites de périmètre volontaires : surface auditable, modes de défaillance simples.
Où ça devient intéressant
Quelques motifs pénibles à la main, naturels ici :
- « Resserre le stop et relance. » Le modèle change un nombre dans le Pine, rappelle
backtest_pine, compare le Sharpe. - « Essaie les 30 derniers jours au lieu de 7. » Autre CSV, même flux — pas d’UI de filtres à parcourir.
- « Sensibilité du paramètre ? » Balayage, Sharpe par valeur, petit tableau Markdown.
- « Compare à mon autre stratégie. » Deux appels
backtest_pine, deux rapports côte à côte.
Pas d’infrastructure nouvelle : modèle + quatre outils + votre prose.
Essayez
- Obtenir une clé codegen gratuite (inscription liste d’attente, clé par email)
- Page
/aicomplète (config Claude Desktop / Claude Code / Cursor) - Paquet npm
Le paquet est open source. Le serveur est assez petit pour être lu d’une traite si vous voulez auditer ce qui traverse le fil.