Algo Trading
L'outil Algo Trading exécute un algorithme de trading que vous écrivez en JavaScript. Le code reçoit les données de marché une date à la fois, envoie des ordres d'achat et de vente, et obtient les mêmes résultats que l'outil Portefeuille.
Champs :
- Symboles - Les actifs que l'algorithme peut négocier. Utilisez n'importe quel type de symbole, jusqu'à 10.
- Solde - Les liquidités initiales, dans la devise sélectionnée en haut de la page.
- Période - Les dates de début et de fin de la simulation.
- Effet de levier - Lorsqu'il est activé, autorise la vente à découvert : l'algorithme peut vendre des actifs qu'il ne détient pas, dans les limites de marge ci-dessous. Le produit d'une vente à découvert n'est pas ajouté aux liquidités. À utiliser avec prudence, car cela augmente à la fois les rendements potentiels et les risques.
- Marge initiale - Un pourcentage (50% par défaut) qui limite les nouvelles positions courtes : la valeur courte totale peut aller jusqu'à (liquidités + positions longues) / Marge initiale. Par exemple, 50% autorise des positions courtes jusqu'à 2 fois les liquidités plus les positions longues.
- Marge minimale - Un pourcentage (30% par défaut) de la valeur courte qui doit rester disponible comme marge. Si la marge descend en dessous, la simulation s'arrête avec une erreur. Il n'y a pas d'appel de marge automatique.
- Code - Le code JavaScript de l'algorithme (voir ci-dessous).
Code (AlgoWorkspace) :
Le code s'exécute comme le corps d'une fonction async, avec this lié à l'AlgoWorkspace. Enregistrez les écouteurs d'événements, puis appelez start() à la fin du code pour lancer la simulation. Le code doit avoir exactement un écouteur data, et chaque écouteur doit appeler next() quand il a terminé.
Événements disponibles :
this.on('start', async (next, timeseries) => { ... })- S'exécute une fois avant la première date. timeseries contient toutes les données de prix, indexées par date (Record<string, AssetDataFlat[]>). this.assets et this.portfolio ne sont pas encore définis.this.on('data', async (next) => { ... })- S'exécute une fois pour chaque date avec des données. Les ordres sont exécutés après l'appel de next() par l'écouteur, au prix de cette date.this.on('end', async (next, result) => { ... })- S'exécute après la dernière date, avec le résultat final. result.summary.alpha et beta sont des Promises.this.on('error', async (next, errors) => { ... })- S'exécute lorsque des ordres d'une date sont annulés, ex : liquidités ou marge insuffisantes. errors est un string[]. Une exception dans votre code arrête la simulation et apparaît dans l'onglet Avertissements.
Propriétés et méthodes :
this.date- La date actuelle.this.assets- Les prix de la date actuelle (AssetDataFlat[] : assetCode, date, value, currency). Seuls les symboles avec des données à cette date sont inclus.this.portfolio- Une copie du portefeuille actuel (cash, assets, total, longValue, shortValue, totalProfit, realizedProfit, margin). La modifier n'a aucun effet, utilisez les méthodes ci-dessous.this.index- Le numéro de la date actuelle, de 1 à this.length.this.length- Le nombre de dates avec des données.this.inputs- Les entrées de la simulation.this.state- Un objet pour stocker vos propres données entre les événements.this.buy(assetCode: string, quantity: number): void- Envoie un ordre d'achat. La quantité doit être un nombre fini différent de zéro.this.sell(assetCode: string, quantity: number): void- Envoie un ordre de vente. Vendre plus que la position ouvre une position courte, si l'Effet de levier est activé.this.print(...msgs: any[]): void- Ajoute un message, avec la date actuelle, à l'onglet Messages.this.depositCash(amount: number): void- Ajoute des liquidités au portefeuille.this.loadScript(url: string): Promise<number>- Charge une bibliothèque JavaScript externe. Les scripts chargés sont supprimés après l'exécution.this.download(obj: any, name?: string): Promise<void>- Télécharge obj sous forme de fichier JSON nommé name.json (invest-tester.json par défaut).
Le code par défaut de la page Algo Trading est un exemple complet. Il charge une bibliothèque, passe des ordres aléatoires et effectue des dépôts mensuels.