MENA Trade
SaaS de signaux de trading par IA avec cours, abonnements par paliers et interface EN + darija en RTL


En bref
- Plateforme
- Application web responsive (navigateur sur ordinateur et mobile)
- Calendrier
- Juin 2025 à février 2026
- Rôle
- Lead développeur full-stack
- Commits
- 189 sur 196 écrits par moi
- Langues
- Anglais et darija marocaine (RTL)
- Actifs couverts par les signaux
- EURUSD, XAUUSD, NASDAQ 100, S&P 500
Vue d'ensemble
MENA Trade est une plateforme de formation au trading et de signaux destinée aux traders particuliers marocains et de la région MENA. Elle combine des signaux de trading générés par IA sur l'EURUSD, l'or, le NASDAQ 100 et le S&P 500 avec un coach de trading IA, des analyses de marché, un calendrier économique, un journal de trading et des cours, le tout vendu en formules Free, Advanced et Ultra. J'étais le lead développeur full-stack et j'ai construit l'application Next.js, le panneau d'administration, les parcours de paiement et le worker de signaux sur AWS.
Le défi
Le produit devait produire des signaux de trading selon un planning, et pas seulement à la demande d'un utilisateur, puis les distribuer à chaque utilisateur dans la limite du quota de sa formule. Les appels à Claude, à Gemini et aux API de données de marché sont facturés à la requête : un signal ne valait donc la peine d'être généré que lorsque le marché était ouvert et que la configuration était solide. L'application devait aussi fonctionner en anglais et en darija marocaine avec une mise en page de droite à gauche. Elle avait besoin de moyens de paiement adaptés à un public marocain (virement bancaire et USDT) en plus de Stripe. L'application web est hébergée sur Netlify, dont les timeouts des fonctions serverless excluent les tâches longues comme une analyse multi-timeframe suivie d'un appel à Claude.
Mon rôle
Entre juin 2025 et février 2026, j'ai écrit la quasi-totalité du code (189 commits sur 196). J'ai construit l'application Next.js 15 App Router : environ 180 route handlers d'API couvrant l'authentification, les signaux, le coach IA, l'analyse forex/actions, les actualités, le calendrier, la formation, les notes, les abonnements et le parrainage, plus 40 modèles Mongoose. J'ai aussi écrit l'authentification JWT/session sur mesure avec double authentification TOTP, le panneau d'administration basé sur les rôles (utilisateurs, abonnements, demandes de paiement, retraits des affiliés, support, statistiques) et les traductions EN/darija avec next-intl. Côté signaux, j'ai construit le moteur de signaux à score de confluence et le worker dockerisé, et écrit les scripts de configuration AWS pour ECS Fargate et EventBridge. Le diffuseur web push et e-mail, le checkout et les webhooks Stripe, la vérification des paiements par virement bancaire et en USDT, et le système de commissions d'affiliation étaient aussi de mon ressort.
Architecture
Clients
Application web
Next.js 15, React 19, Tailwind CSS, Radix UI, GSAP
Tableau de bord, signaux, coach IA, analyses, calendrier, notes et cours, avec la direction du document basculée en RTL lorsque la locale darija est active.
Panneau d'administration
Next.js App Router
Écrans restreints par rôle pour les utilisateurs, les abonnements, les demandes et justificatifs de paiement, les affiliés et les retraits, les tickets de support et les statistiques.
Edge/Diffusion
Hébergement et middleware
Netlify, Next.js middleware
Next.js déployé sur Netlify, avec un middleware qui protège les routes du tableau de bord et sert un mode maintenance contrôlé depuis l'administration.
Services
Routes d'API
Next.js route handlers, Zod
Environ 180 handlers couvrant l'authentification, les signaux, le coach IA, les données de marché, les actualités, la formation, les notes, les abonnements et le parrainage.
Worker de signaux
Node.js, Docker, AWS ECS Fargate
Conteneur autonome qui vérifie quels marchés sont ouverts, génère les signaux et confirme que les nouveaux signaux sont bien persistés en base avant de les diffuser.
Planificateur
AWS EventBridge
Quatre règles cron lancent le worker toutes les 30 minutes : trois couvrent le forex et l'or du dimanche 22:00 au vendredi 22:00 UTC, et une couvre les indices américains pendant les heures de cotation américaines en semaine.
Moteur de confluence
TypeScript
Note sur 100 les indicateurs techniques et la structure de marché en daily, 4H et 1H, ajoute des bonus plafonnés de kill zone et d'actualité calme, et rejette toute configuration sous 70.
Données
Base de données principale et cache
MongoDB, Mongoose
Utilisateurs, signaux, abonnements, paiements, parrainages et journaux de notifications, plus un cache adossé à MongoDB avec des TTL par clé.
Stockage de fichiers
AWS S3 (presigned URLs)
Médias des cours, pièces jointes des notes et justificatifs de paiement par virement, envoyés directement depuis le navigateur.
Services tiers
Fournisseurs d'IA
Anthropic Claude, Google Gemini
Claude rédige les signaux, le coaching et les analyses ; Gemini sert au sentiment de marché et au filtrage des actualités.
Données de marché
Yahoo Finance, Alpha Vantage, Twelve Data
Données OHLCV multi-timeframe, avec une table de correspondance des symboles par actif pour chaque fournisseur et un repli sur un autre fournisseur en cas d'échec.
Paiements
Stripe, BNB Smart Chain RPC
Checkout, webhooks, remboursements et annulations Stripe depuis l'administration, plus une vérification on-chain des paiements USDT auprès de plusieurs endpoints RPC publics et un parcours manuel de virement bancaire.
Notifications
Web Push (VAPID), Resend
Notifications push navigateur et modèles d'e-mails bilingues pour les signaux, avec désactivation automatique des abonnements push expirés.
Décisions clés
- 01
Sortir la génération des signaux de Netlify vers Fargate
Une exécution de signal récupère les données sur trois timeframes, les note puis appelle Claude avec la recherche web, ce qui se heurtait aux timeouts des fonctions Netlify et provoquait des erreurs 504 que j'ai dû corriger. J'ai packagé le générateur et le diffuseur dans un worker Docker distinct qu'EventBridge lance sur ECS Fargate. La contrepartie est une deuxième cible de déploiement (builds d'images de conteneur), en échange de l'absence de timeout de requête et d'un calcul facturé à l'exécution.
- 02
Ne tourner que lorsque le marché est ouvert
Les règles EventBridge suivent les horaires de cotation de chaque classe d'actifs, et le worker revérifie les heures de marché avant de générer quoi que ce soit : aucun appel d'IA ni de données de marché n'est donc effectué quand les marchés sont fermés. Le prix à payer est de maintenir la logique de planification correcte à deux endroits.
- 03
Score déterministe d'abord, LLM ensuite
Un moteur de confluence à base de règles note chaque configuration sur 100 : biais daily 25, confirmation 4H 25, entrée 1H 20, indicateurs 15 et structure 15. Les bonus de kill zone et d'actualité calme ne s'appliquent qu'au-dessus d'un score de base de 65 et sont plafonnés à 10 points : ils ne peuvent donc pas faire passer une configuration faible dans un palier supérieur. Les configurations sous 70 sont rejetées avant tout appel à un modèle ; celles qui obtiennent 80 ou plus sont rédigées par Claude Sonnet 4 et les autres par Claude Haiku, si bien que le modèle le plus coûteux n'est utilisé que pour les signaux les plus solides.
- 04
Une authentification sur mesure plutôt qu'un fournisseur hébergé
J'ai construit une authentification JWT et par cookie de session avec double authentification TOTP et codes de secours, trois rôles (user, admin, super_admin) et un interrupteur de mode maintenance dans le middleware. Cela a permis de garder les données d'utilisateur, de formule d'abonnement et de rôle dans un seul modèle MongoDB. En contrepartie, je dois maintenir moi-même la gestion des sessions et le code de 2FA qu'un fournisseur d'authentification hébergé fournirait autrement.
- 05
Limites de débit en couches et cache persistant
Des limites par service (par exemple Yahoo 1 requête par 60 secondes, Claude 30 et Gemini 40 par 60 secondes) protègent les API en amont. Le chat du coach IA ajoute des limites par utilisateur en rafale, par minute et par heure selon la formule, en plus des quotas quotidiens par formule (5, 10 ou 20 messages au coach IA par jour). Un cache à TTL stocké dans MongoDB continue de fonctionner malgré les cold starts serverless, contrairement à un cache en mémoire.
- 06
Des moyens de paiement locaux en plus de Stripe
Beaucoup d'utilisateurs ciblés ne paient pas par carte : j'ai donc ajouté le virement bancaire avec codes de référence et justificatif envoyé sur S3 pour validation par un administrateur. J'ai aussi ajouté une vérification USDT qui lit directement la blockchain via une liste d'endpoints RPC publics de BNB Smart Chain, avec repli, plutôt qu'une API d'explorateur à clé.
Résultats
- J'ai livré une plateforme de trading bilingue (anglais et darija, RTL) avec signaux, coach IA, analyses forex et actions, calendrier économique, journal de trading avec pièces jointes et cours.
- J'ai déplacé la génération planifiée des signaux de Netlify vers Fargate, facturé à l'exécution, ce qui a éliminé les timeouts 504.
- J'ai diffusé les signaux par web push, dans la limite du quota quotidien de chaque formule (1, 2 ou 5 notifications push par jour), et par e-mail bilingue sur les formules payantes.
- J'ai rendu les formules Free, Advanced et Ultra payables par Stripe, virement bancaire ou USDT on-chain, le tout géré depuis le panneau d'administration.
- J'ai construit un programme d'affiliation qui suit les parrainages et crédite une commission lorsqu'un utilisateur parrainé passe à une formule supérieure, avec des retraits validés par un administrateur.
Stack
- Frontend
- Next.js 15 (App Router)React 19TypeScriptTailwind CSSRadix UIGSAPFramer Motionnext-intlreact-hook-formZodTradingView widgetsRechartslightweight-charts
- Backend
- Next.js route handlersMongoDBMongooseJWT + session cookiesspeakeasy (TOTP 2FA)web-pushResendNodemailer
- IA
- Anthropic Claude (Sonnet 4, Haiku 3.5)Google Gemini
- Infrastructure
- NetlifyDockerAWS ECS FargateAWS ECRAWS EventBridgeAWS S3AWS Secrets Manager
- Paiements
- Stripe Checkout and webhooksUSDT on BNB Smart Chain (public RPC)Bank transfer with proof upload
