← Retour aux projets
Marketplaces et FinTech Étude de cas

Tendex — Plateforme d'investissement pour le marché des actifs numériques

Développement et évolution de la plateforme d'investissement du fonds suisse Tendex: refonte complète, gestion des plans d'investissement, système d'utilisateurs et de parrainage. Stack : Symfony, ElasticSearch, RabbitMQ, Redis, Twig.

Technologies 7
PHP
Symfony
JavaScript
PostgreSQL
Redis
Elasticsearch
RabbitMQ
Tendex — Plateforme d'investissement pour le marché des actifs numériques
Projet en vedette ↗

À propos du projet

Tendex est un fonds d'investissement suisse régulé par la FINMA qui, depuis 2019, utilise l'analyse quantitative et des algorithmes propriétaires pour générer des rendements stables et non corrélés sur le marché des actifs numériques. La plateforme traite plus de 100 milliards de paramètres de marché et assure une gestion automatisée des transactions et des risques en mode 24/7.

J'ai participé au projet en tant que développeur full-stack (Symfony + Twig) : responsable de la refonte complète du frontend et de l'évolution des processus métier clés — gestion des plans d'investissement, gel et démarrage différé, résiliation forcée, suppression d'utilisateurs et modification de la structure de parrainage. J'ai travaillé avec une architecture à forte charge basée sur ElasticSearch, RabbitMQ et Redis.

Tendex — Plateforme d'investissement pour le marché des actifs numériques

Tendex est un fonds d'investissement suisse régulé par la FINMA qui, depuis 2019, utilise des technologies de pointe et l'analyse quantitative pour générer des rendements stables et non corrélés sur le marché des actifs numériques.

L'avantage clé du fonds réside dans une surveillance approfondie du marché basée sur plus de 100 milliards de paramètres et des algorithmes propriétaires assurant une gestion automatisée des transactions et des risques en mode 24/7. L'objectif de la plateforme est de minimiser les risques et d'offrir aux investisseurs un fort potentiel de croissance — avec des solutions fiables de diversification et de protection du capital dans un monde plein d'incertitudes.

Mon rôle dans le projet

Développeur full-stack : Symfony (backend), Twig (templates). Responsable de la refonte de l'espace client et du frontend, ainsi que de l'évolution des processus métier clés de la plateforme d'investissement.

Stack technologique

  • Backend : Symfony (PHP)
  • Frontend : Twig
  • Recherche et analytique : ElasticSearch
  • Files d'attente : RabbitMQ
  • Cache et sessions : Redis
  • Infrastructure : workers en arrière-plan pour le traitement asynchrone des événements d'investissement

Tâches clés

  • Refonte complète du site et de l'espace client investisseur
  • Mécanique de résiliation forcée d'un plan d'investissement
  • Suppression correcte d'un utilisateur tout en préservant l'intégrité des données financières
  • Fonctionnalité de gel des plans d'investissement
  • Fonctionnalité de démarrage différé d'un plan d'investissement
  • Modification de la structure de parrainage
  • Traitement asynchrone des événements via RabbitMQ
  • Indexation et recherche via ElasticSearch

Résultat

La plateforme a bénéficié d'une interface moderne et actualisée ainsi que d'un ensemble élargi d'outils de gestion des plans d'investissement. Cela a amélioré l'expérience des investisseurs et réduit la charge du support. L'architecture asynchrone basée sur RabbitMQ et ElasticSearch a assuré un fonctionnement stable sous charge et un accès rapide à l'analytique.

Ce que j'ai livré

01

L'interface existante de la plateforme était obsolète, peu pratique pour les investisseurs...

Le défi

L'interface existante de la plateforme était obsolète, peu pratique pour les investisseurs et ne reflétait pas le statut d'un fonds suisse régulé. Il fallait renouveler la partie visuelle et l'UX sans perdre de fonctionnalités et sans perturber les processus métier en cours.

Solution

  • Audit des templates Twig existants et identification des composants réutilisables.
  • Développement d'un nouveau design system : grille, typographie, composants UI.
  • Réimplémentation des pages clés avec Twig et intégration de composants Vue pour les zones interactives (graphiques, tableaux, formulaires).
  • Assurance de la responsivité et du rendu correct sur les appareils mobiles.

Résultats

  • Interface moderne et actualisée, conforme au positionnement du fonds.
  • UX améliorée dans l'espace client investisseur.
  • Réduction du nombre de demandes au support liées à la navigation.

02

Les investisseurs ou les administrateurs devaient pouvoir résilier un plan d'investissemen...

Le défi

Les investisseurs ou les administrateurs devaient pouvoir résilier un plan d'investissement de manière anticipée, avec un recalcul correct de la rentabilité, des frais et du remboursement. Il fallait éviter toute désynchronisation des données lors d'opérations parallèles.

Solution

  • Conception d'un modèle de domaine pour la résiliation du plan couvrant tous les états (actif, gelé, en file d'attente).
  • Implémentation d'un service de calcul de la rentabilité finale et des frais.
  • Déport des opérations lourdes vers des tâches asynchrones via RabbitMQ.
  • Ajout de l'idempotence des opérations et de verrous via Redis.

Résultats

  • Résiliation correcte et prévisible des plans dans n'importe quel état.
  • Absence de doubles débits et de désynchronisation des données.
  • Historique des opérations transparent pour l'investisseur.

03

La simple suppression d'un utilisateur cassait les entités liées (plans d'investissement,...

Le défi

La simple suppression d'un utilisateur cassait les entités liées (plans d'investissement, transactions, parrainages). Il fallait implémenter une suppression sécurisée préservant l'historique financier et les exigences réglementaires.

Solution

  • Introduction d'un mécanisme de soft-delete pour les utilisateurs tout en préservant les relations.
  • Conception d'un traitement en cascade : anonymisation des données personnelles, préservation de l'historique des transactions.
  • Implémentation d'une tâche en arrière-plan pour le nettoyage des entités liées via RabbitMQ.
  • Ajout de la journalisation et de l'audit des opérations de suppression.

Résultats

  • Suppression sécurisée sans violation de l'intégrité des données.
  • Conformité aux exigences réglementaires de conservation de l'historique financier.
  • Réduction du risque d'erreurs lors d'interventions manuelles.

04

Les investisseurs avaient besoin de pouvoir suspendre temporairement l'accumulation de ren...

Le défi

Les investisseurs avaient besoin de pouvoir suspendre temporairement l'accumulation de rendement d'un plan sans le clôturer — par exemple en cas d'instabilité du marché. Ces périodes devaient être correctement prises en compte dans les calculs.

Solution

  • Ajout de l'état « gelé » dans le cycle de vie du plan d'investissement.
  • Implémentation de la logique de pause des accumulations et de reprise correcte.
  • Mise à jour du calcul de rentabilité pour tenir compte des périodes de gel.
  • Ajout de notifications à l'investisseur sur le statut du plan.

Résultats

  • Gestion flexible des plans sans perte d'historique.
  • Calculs de rentabilité précis tenant compte des périodes de gel.
  • Confiance accrue des investisseurs dans l'instrument.

05

Les investisseurs souhaitaient créer un plan à l'avance avec un lancement automatique à un...

Le défi

Les investisseurs souhaitaient créer un plan à l'avance avec un lancement automatique à une date donnée. Une planification fiable des tâches était nécessaire, robuste aux pannes et aux redémarrages de services.

Solution

  • Implémentation du démarrage différé via le scheduler Symfony + RabbitMQ delayed messages.
  • Ajout d'un traitement idempotent du démarrage (protection contre le double démarrage).
  • Mise en place du monitoring des tâches différées et de la journalisation.
  • Implémentation de notifications à l'investisseur sur le démarrage.

Résultats

  • Démarrage différé fiable sans intervention manuelle.
  • Absence de doublons et de lancements manqués.
  • Outil de planification pratique pour les investisseurs.

06

Le système de parrainage nécessitait de la flexibilité : les administrateurs devaient pouv...

Le défi

Le système de parrainage nécessitait de la flexibilité : les administrateurs devaient pouvoir modifier l'attribution des parrainages, et les investisseurs voir la structure actuelle. L'implémentation existante ne permettait pas de modifier les attributions sans perdre l'historique des accumulations.

Solution

  • Conception d'un modèle de relations de parrainage avec versioning.
  • Implémentation d'une interface de modification des parrainages pour les administrateurs.
  • Préservation de l'historique des accumulations lors des changements d'attribution.
  • Ajout d'une validation contre les dépendances cycliques.

Résultats

  • Gestion flexible de la structure de parrainage.
  • Préservation de l'historique et exactitude des accumulations.
  • Réduction du travail manuel du support.

07

La croissance de la charge et du nombre d'opérations (accumulations, démarrage/arrêt de pl...

Le défi

La croissance de la charge et du nombre d'opérations (accumulations, démarrage/arrêt de plans, notifications) exigeait de sortir les opérations lourdes du cycle HTTP synchrone afin de ne pas bloquer les requêtes utilisateurs.

Solution

  • Conception d'une file d'événements pour les opérations de domaine clés.
  • Implémentation de workers avec Symfony Messenger + RabbitMQ.
  • Ajout de politiques de retry, d'une dead-letter queue et du monitoring.
  • Assurance de l'idempotence des handlers.

Résultats

  • Réponse rapide de l'interface indépendamment des opérations en arrière-plan.
  • Tolérance aux pannes grâce au retry et à la DLQ.
  • Traitement scalable sous charge.

08

La recherche rapide sur de grands volumes de données (transactions, plans, utilisateurs) e...

Le défi

La recherche rapide sur de grands volumes de données (transactions, plans, utilisateurs) et la construction d'analytiques nécessitaient un moteur de recherche spécialisé plutôt que des requêtes SQL lourdes.

Solution

  • Configuration des index ElasticSearch pour les entités clés.
  • Implémentation de la synchronisation des données via des événements RabbitMQ.
  • Ajout de requêtes de recherche avec filtres et agrégations pour l'analytique.
  • Optimisation des mappings et de la réindexation.

Résultats

  • Recherche rapide sur de grands volumes de données.
  • Analytique flexible pour les administrateurs et les investisseurs.
  • Réduction de la charge sur la base de données principale.

09

La fréquence élevée d'accès aux données fréquemment utilisées et la nécessité de se protég...

Le défi

La fréquence élevée d'accès aux données fréquemment utilisées et la nécessité de se protéger contre les race conditions lors d'opérations parallèles exigeaient un cache fiable et un mécanisme de verrous.

Solution

  • Introduction du caching des données chaudes et des agrégats dans Redis.
  • Implémentation de verrous distribués pour les opérations critiques (démarrage/résiliation de plans).
  • Configuration de l'invalidation du cache via des événements.
  • Ajout du monitoring hit/miss et des temps de réponse.

Résultats

  • Réduction du temps de réponse des pages clés.
  • Protection contre les race conditions et les doubles opérations.
  • Charge réduite sur la base de données.

10

Un fonds régulé exige un audit complet de toutes les opérations financières : qui, quand,...

Le défi

Un fonds régulé exige un audit complet de toutes les opérations financières : qui, quand, quoi et sur quelle base. Il fallait construire un système d'audit qui ne ralentit pas les processus principaux.

Solution

  • Conception d'un schéma d'audit log lié à l'utilisateur, au plan et à la transaction.
  • Implémentation de l'écriture asynchrone de l'audit via RabbitMQ.
  • Ajout d'outils de recherche et d'export des audit logs pour les administrateurs (ElasticSearch).
  • Assurance de l'immuabilité des enregistrements.

Résultats

  • Audit complet des opérations financières.
  • Conformité aux exigences réglementaires.
  • Accès rapide à l'historique via la recherche.

11

La plateforme d'investissement fonctionne 24/7, et tout retard dans le traitement des évén...

Le défi

La plateforme d'investissement fonctionne 24/7, et tout retard dans le traitement des événements ou toute panne de worker est critique. Un système de monitoring des métriques clés et d'alertes était nécessaire.

Solution

  • Mise en place de la collecte de métriques sur les files d'attente (RabbitMQ), Redis, ElasticSearch et les événements métier clés.
  • Implémentation d'alertes sur anomalies (croissance de la DLQ, retards, erreurs de workers).
  • Ajout de dashboards pour l'équipe.
  • Intégration de la journalisation des opérations critiques.

Résultats

  • Détection et réaction rapides aux incidents.
  • Réduction des temps d'arrêt.
  • Transparence de l'état de la plateforme pour l'équipe.

Technologies et sujets

Tags du projet

#Symfony #PHP #Twig #ElasticSearch #RabbitMQ #Redis #Fintech #Plateforme d'investissement #Crypto #REST API #Symfony Messenger #High Load #Traitement asynchrone #Refonte #Système de parrainage #Audit Logging
04
Démarrer un projet

Vous cherchez une approche technique similaire ?

Discutons de votre projet, de l'architecture et de la meilleure stack technologique pour celui-ci.

Parlons-en ↗