# Historique du projet — bot de trading + home lab

> Résumé de tout ce qu'on a fait ensemble, du 11 au 15 octobre 2026.
> Le détail technique est dans `PLAN.md`, les règles de suivi sont dans `REGLES.md`.

---

## 1. Ce que tu voulais au départ (11/10)

- Un bot inspiré de l'**ICT** (FVG, zones de liquidité), avec tes règles par jour de la semaine :
  - si le haut du vendredi est sous le haut du jeudi, le bas du vendredi est revisité le lundi ;
  - si le haut du mercredi est sous le haut du lundi, le bas du mercredi est revisité le jeudi.
- Marchés : Nasdaq et EUR/USD, entre **14h et 17h** (heure de Paris), en M1/M5/M15, avec le biais pris sur les grandes unités de temps.
- Courtier : **Capital.com, compte démo**. 1 000 €, 1 % de risque par trade.
- Le bot tourne sur ton PC.

Ensuite tu as demandé d'**améliorer le modèle** : chercher ce qui marche vraiment sur crypto, EUR/USD et Nasdaq, garder le meilleur, et faire un **bot autonome** qui surveille le marché en boucle et réagit tout seul aux problèmes.

---

## 2. Ce que les tests ont montré (backtests 2010–2026, frais Capital.com inclus)

Méthode : réglage sur 2010–2020, puis vérification sur 2021–2026, que la stratégie n'a jamais vue.

**Ce qui ne marche pas (rejeté) :**

| Idée | Résultat |
|---|---|
| ICT sur le Nasdaq | aucune configuration gagnante |
| ICT sur l'EUR/USD | petit avantage : +0,16 R par trade, environ +1 %/an une fois le glissement compté |
| Tes règles jour/semaine | biais réels mais faibles ; sur 14h–17h, le niveau n'est atteint que 13 à 29 % du temps |
| EUR/USD (toutes stratégies) | tout perd, en intraday comme en swing (les frais de nuit écrasent tout) |
| Crypto intraday | l'avantage brut est plus petit que le spread |
| ORB 5 min, régression logistique | fragile, ou pas mieux qu'acheter et garder |

**Ce qui marche (retenu) :**

| Stratégie | Sharpe 2010–2020 | Sharpe 2021–2026 |
|---|---|---|
| Nasdaq — momentum intraday « Noise Area » (papier de recherche 2024, réglages d'origine) | 0,84 | 0,87 |
| S&P 500 — même stratégie | 0,70 | 0,64 |
| Nasdaq — RSI(2), retour à la moyenne | 0,51 | 0,96 |
| Bitcoin — tendance (11 signaux) | 1,98 | 0,46 |
| Ethereum — tendance | 1,48 | 0,69 |
| **Portefeuille combiné** (volatilité cible 12 %) | **1,32** | **1,27** |

- Portefeuille : environ +16 %/an puis +13 %/an. Pire baisse : −16 %, puis −11 %. Environ 6 % de chances d'une année perdante.
- **ICT EUR/USD** ajouté à ta demande (12/10) : 14h–17h, jamais la nuit, 0,5 % de risque par trade.
- 12/10, recherche v2 : 46 nouveaux essais (indices Europe et Asie, or, pétrole, autres cryptos). Le momentum intraday ne marche qu'aux États-Unis. Rien n'a été ajouté, pour éviter le sur-ajustement.
- ⚠️ À surveiller : le **S&P 500 intraday** traverse sa pire période historique. Il était déjà dans ce cas en 2016–2017, et 2018 a ensuite été une très bonne année.

**Erreurs trouvées et corrigées :**
- heure des données HistData fausse dans leur documentation ;
- bougies EUR/USD de Yahoo corrompues ;
- information du futur dans les tests (ICT et séances) ;
- bug du changement d'heure dans le bot ;
- stops de sécurité mal placés (S&P intraday : plancher passé à 2 % ; RSI2 : stop passé à 15 %).

---

## 3. Le bot (en marche sur le compte démo depuis le 12/10 à 14h02)

- Service `ictbot` : un tour toutes les 10 s, redémarrage automatique s'il plante, lancement au démarrage du PC.
- **Stop garanti obligatoire** en France (AMF) : il est posé sur chaque position, et facturé seulement s'il est touché.
- Il agit tout seul :
  - arrêt d'urgence à −15 % depuis le plus haut ;
  - plus aucune nouvelle position à −3 % dans la journée ;
  - pause s'il détecte un mouvement anormal, un spread trop large, une marge trop faible ou une panne de l'API ;
  - reprise propre après un plantage ;
  - **il ne touche jamais aux positions que tu ouvres à la main**.
- Compte réel : **impossible sans ta décision explicite** (double verrou : `env = "live"` + `ICTBOT_ALLOW_LIVE=1`).
- 39 tests automatiques. Le rejeu du bot complet donne exactement le même résultat que le backtest.

**Suivi :**
- `REGLES.md` : règles écrites à l'avance (fourchettes de résultats attendues, quand réduire ou couper une stratégie, conditions pour passer en réel : au moins 3 mois de démo, etc.).
- Rapport automatique **chaque samedi à 9h** dans `reports/weekly/`. Le premier sort le 17/10.
- Telegram (alertes sur le téléphone + commande `/statut`) : **le code est prêt, il reste à l'activer** (voir la section 6).
- **Tableau de bord** (15/10) : http://arch-unowhy.tailacce8b.ts.net:8080/ — capital et fourchette attendue du backtest, constats automatiques, positions en direct (gain latent, distance au stop), jauges de risque, fiche de chaque stratégie (ce qu'elle fait, combien de temps elle garde, prochaine décision), historique des trades lu chez Capital.com (gain réel, frais de nuit), programme de la journée, santé du bot (arrêts détectés) et journal filtrable. Positions rafraîchies toutes les 10 s, analyses toutes les 5 min.

---

## 4. Incidents

| Date | Quoi | Suite |
|---|---|---|
| 12/10 | ordres refusés (stop garanti exigé) | corrigé |
| 12/10 16h40 → 14/10 23h49 | la touche de mise en veille a été pressée : bot arrêté environ 2 jours | PC passé en « home lab », la veille est maintenant impossible |
| 13/10 22h03 | la vente Nasdaq du 12/10 a été fermée avec la source « USER » (environ +2,6 $) | c'était toi ? question restée sans réponse |
| 15/10 3h30 → 4h30 | la Freebox a coupé son Wi-Fi ; le PC a attendu 1 h avant de se reconnecter | corrigé (voir la section 5). Le bot a mis ses entrées en pause, les stops étaient chez le courtier |

Capital au 15/10 : environ 990 €. Positions : Bitcoin et Ethereum à l'achat.

---

## 5. Home lab (14–15/10)

Le PC (Unowhy Y13) **tourne 24 h/24 et ne s'arrête jamais** :
- mise en veille et hibernation bloquées au niveau du système, capot fermé sans effet (`deploy/homelab_setup.sh`) ;
- SSH actif, Tailscale connecté (`100.113.243.15` / `arch-unowhy.tailacce8b.ts.net`) ;
- **Wi-Fi** : reconnexion sans limite + surveillance chaque minute (`wifi-watchdog.timer`) ;
- **écran** : horloge après 3 min, écran éteint après 10 min. Seul l'écran s'éteint, le PC continue de tourner ;
- indexation de fichiers KDE (Baloo) désactivée : elle plantait toutes les 5 s (pour la remettre : `balooctl6 enable`).

**Tableau de bord « terminal » (16/10)** : page refaite façon terminal de salle de marché, en 6 onglets (touches 1 à 6) :
- **Synthèse** : chiffres clés, courbe du capital avec chaque entrée ▲▼ et chaque sortie ●, fourchette du backtest, baisse depuis le plus haut, positions en direct, résultat par stratégie ;
- **Trades** : tous les trades. Clique un trade pour sa **fiche** : graphique en bougies avec l'entrée, la sortie et le stop, **pourquoi le bot est entré**, **pourquoi il est sorti**, et **d'où vient le gain ou la perte** (mouvement du marché, spread, frais de nuit, meilleur et pire moment, R, comparaison avec le backtest) ;
- **Marchés** : bougies 15 min / 1 h / 1 jour de chaque marché, avec les achats, les ventes, le stop et la zone de bruit du jour ;
- **Risque** : perte si tous les stops sont touchés, marge, exposition, coupe-circuits, disponibilité du PC ;
- **Stratégies** et **Journal**.
Tout est calculé par `scripts/dashboard.py` toutes les 5 min (lecture seule, aucun ordre). Graphiques : TradingView Lightweight Charts, copié sur le PC (`reports/vendor/`). L'ancienne page reste sur `index_ancien.html`.

**Batterie et 80/20 :** ce modèle ne peut pas limiter sa charge par logiciel. Tout est prêt pour une prise **Shelly** (`scripts/charge_control.py`, `config/charge.toml`, désactivé pour l'instant). Mais le cycle 80 → 20 ne fait **pas** économiser d'électricité : il en fait perdre un peu à la recharge et use la batterie. Le plus économe, c'est de laisser le PC branché, comme maintenant (batterie pleine, qui ne charge plus). Le PC consomme environ 4 W, soit 6 à 8 € par an.

---

## 6. Ce qu'il te reste à faire (si tu veux)

1. **Connexion automatique au démarrage** : **non, ta décision du 17/10.** Le mot de passe reste demandé au démarrage. Le bot n'en a pas besoin : il démarre seul, même sans session ouverte.
2. **Verrouillage d'écran** : le garder ou le désactiver ? À toi de décider.
3. **Telegram** : créer un bot avec @BotFather, mettre `TELEGRAM_BOT_TOKEN=...` dans `.env`, envoyer `/start` à ton bot, puis lancer
   `uv run python scripts/telegram_setup.py` et `systemctl --user restart ictbot`.
4. ~~Chantier « une position par stratégie »~~ : **fait le 16/10** (avancé à ta demande). Chaque stratégie a sa propre position et son propre stop. Le hedging a été essayé puis remis à « non », parce que Capital.com refuse alors le stop garanti. Rappel de samedi annulé.
5. À décider plus tard : sauvegarde Git privée, VPS (environ 5 €/mois), « incubateur » pour tester Dogecoin, Cardano et Nasdaq tendance sans argent.

---

## 6 bis. Amélioration du 16/10 : positions par stratégie, levier, scalping

- **Une position par stratégie** : fait et en marche depuis 9h57. Chaque stratégie a sa propre position et son propre stop (avant, sur le Nasdaq, le stop le plus large de RSI2 s'appliquait aussi à l'intraday). Le hedging a été essayé puis remis à « non » : Capital.com refuse alors le stop garanti, qui est obligatoire. Quand deux stratégies s'opposent sur un marché, seule la différence est gardée, et le bot n'envoie jamais un ordre opposé à une position ouverte (vérifié sur l'or avec quelques centimes).
- **Levier** : tu as choisi de garder 12 % de volatilité visée. Le levier reste dynamique (plus gros quand le marché est calme). Backtest 2018–2026 : 15 % donnerait environ +20 %/an pour une pire baisse de −14 % ; 20 % donnerait environ +27 %/an pour une pire baisse de −19 % (l'arrêt d'urgence à −15 % se serait déclenché).
- **Rééquilibrages moins chers** : le bot ne vend plus que la différence quand il réduit une position (elle garde son stop). Backtest : frais de trading divisés par 3 sur le Bitcoin et l'Ethereum. Zone sans échange gardée à 15 %.
- **Incubateur lancé** : Dogecoin, Cardano et Nasdaq tendance sont simulés sans aucun ordre jusqu'au 16/01/2027, puis tu décideras avec les chiffres.
- **Qualité d'exécution** mesurée (prix affiché contre prix obtenu), **sauvegarde quotidienne** à 12h30 vers ton PC Windows, et un onglet **7 LABO** dans le tableau de bord pour tout ça.
- **Scalping** : 48 essais sur 8 marchés (bougies 5 min, frais réels, stop garanti à sa distance minimale). **Aucun n'est gagnant** : l'avantage avant frais est de 0 à 1,6 point de base par trade, alors que chaque aller-retour coûte 1 à 2 points de base (10 sur les cryptos). Rien n'est ajouté. Détail : `reports/research_scalping.md`.
- **Scalping, 2e recherche (16/10 après-midi)** : 16 essais sur des **effets horaires publiés** (et non plus des indicateurs techniques) : la dernière demi-heure qui suit la première (Nasdaq, S&P, DAX), l'euro et la livre qui baissent pendant les heures de bureau européennes, l'or qui monte pendant la nuit asiatique, la même demi-heure qui se répète d'un jour à l'autre. **Aucun ne passe** (il fallait un Sharpe ≥ 0,3 sur 2010–2020 ET sur 2021–2026). L'EUR/USD gagnait jusqu'en 2020 puis perd depuis : l'effet a disparu après sa publication. L'or « nuit asiatique » garde un petit avantage (+1,6 à +2 pb par trade), mais les frais Capital.com (1,7 pb) l'annulent. Même avec des frais 3 fois plus bas, il serait trop faible (Sharpe 0,34) et trop irrégulier (il perd en 2018, 2020 et 2022). Rien n'est ajouté au bot. Détail : `reports/research_scalping2.md`.
- **Scalping, 3e recherche (16/10, « avec le levier, les actualités et le nombre d'ordres »)** : 26 essais. (1) **Levier** : il multiplie le résultat de chaque trade, gains comme pertes, mais ne change pas son signe. Le meilleur candidat (l'or la nuit) fait −0,5 %/an à 1×, −7,5 %/an à 5× (pire baisse −59 %) et −68 %/an à 20× (compte vidé). (2) **Annonces** (144 réunions de la Fed, 196 chiffres de l'emploi US) : acheter avant la Fed, suivre ou contrer la réaction des 5 premières minutes, sur Nasdaq, S&P, EUR/USD et or. **Rien ne tient sur les deux périodes**, le signe s'inverse d'une période à l'autre. (3) **Nombre d'ordres** (Bitcoin et Ethereum, données Binance : acheteurs contre vendeurs agressifs, rafales de transactions) : tout perd après frais. Capital.com ne donne pas de carnet d'ordres (c'est un teneur de marché). Détail : `reports/research_scalping3.md`.
- **Scalping, 4e recherche (16/10, stratégies choisies par toi)** : cassure du range asiatique à l'ouverture de Londres (EUR/USD, GBP/USD), croisement EMA 9/21 + VWAP (1 et 5 min) et retour au VWAP (Nasdaq, EUR/USD, GBP/USD). 16 essais. **Aucun ne passe.** Le plus proche : **EMA 9/21 + VWAP en 5 min sur le Nasdaq**, légèrement gagnant (+0,4 pb par trade, Sharpe 0,27 puis 0,23). Mais il perd 4 années de suite (2023 à 2026) et ressemble en partie au momentum Nasdaq déjà dans le bot (corrélation 0,34). Il montre aussi le piège du levier : +2 %/an à 1×, −3,5 %/an à 5×, −92 %/an à 20×, parce qu'une stratégie à peine gagnante est détruite par trop de levier. Le forex perd partout. Détail : `reports/research_scalping4.md`.
- **Scalping, 5e recherche (16/10, ICT / FVG, taille de position, annonces)** : les réglages ICT (480 par marché, 1 et 5 min, FVG, Silver Bullet compris) avaient déjà été testés le 11/10. Cette fois, j'ai testé tes deux idées sur les trades ICT et sur l'EMA Nasdaq. (1) **Augmenter le risque après un gain et le baisser après une perte** : un trade gagnant n'annonce pas un autre gain (pas de lien mesurable entre un trade et le suivant), donc la méthode ne crée aucun avantage. Elle baisse un peu les pertes maximales, mais elle baisse encore plus les gains : sur l'ICT EUR/USD du bot, on passe de +2,7 %/an à 0 %/an sur 2021–2026. Rejeté. (2) **Ne pas trader les jours d'annonce (Fed, emploi US)** : aucun effet sur l'ICT (ses trades ces jours-là gagnent plutôt). En revanche, ce filtre améliore l'EMA 9/21 + VWAP Nasdaq : Sharpe 0,35 et 0,36 sur les deux périodes. Mais elle perd toujours en 2023, 2024 et 2026, et cette combinaison a été trouvée après environ 450 essais : c'est un candidat fragile. Détail : `reports/research_scalping5.md`.
- **Conclusion sur le scalping** : avec un courtier CFD comme Capital.com, chaque aller-retour coûte à peu près autant que ce qu'un trade de quelques minutes peut rapporter en moyenne. Les stratégies du bot gagnent parce qu'elles tiennent des heures, des jours ou des semaines : le mouvement attendu y est 10 à 100 fois plus grand que les frais.

## 6 ter. Revue complète du bot (16/10, après-midi)

Trois relectures indépendantes (code, stratégies, risque et exploitation), toutes revérifiées : `reports/revue_2026-10-16.md`.
- **4 vrais bugs** :
  - les jours fériés et demi-séances US sont tradés, alors que le backtest les écarte (urgent avant Thanksgiving, le 26/11) ;
  - le détecteur de mouvement anormal est inactif ;
  - une fermeture refusée par le courtier est comptée comme réussie ;
  - le RSI2 tourne sur d'autres données que son backtest.
  - S'y ajoutent des pauses qui s'écrasent entre elles et l'ICT sans plafond de levier.
- **Exploitation** :
  - pas d'alertes sur le téléphone ;
  - la Freebox coupe son Wi-Fi à 3h30 (planification sur la box) ;
  - disque plein à 92 % ;
  - le bot n'a tourné que 37 % du temps depuis le 12/10.
- **Constat majeur** : le portefeuille backtesté est **à plat depuis janvier 2025**. Le Sharpe de 1,2 est un plafond ; une attente réaliste est de 0,6 à 0,9.

## 6 quater. Corrections après la revue (16/10, midi)

- **Corrigé** : les 4 bugs (jours fériés, détecteur de mouvement anormal, fermeture refusée, données du RSI2) et les défauts (pauses écrasées, levier de l'ICT, décisions perdues sur une erreur passagère, alertes en rafale, fichier d'état sans copie de secours). 70 tests passent ; rejeu identique au backtest.
- **Ajouté** : les positions sont divisées par 2 si le capital perd 8 % depuis son plus haut ; la perte maximale si tous les stops étaient touchés est plafonnée à 25 %.
- **Disque** : les données de recherche sont déplacées sur l'autre partition (/home passe de 92 % à 79 %).
- **Python** : le bot passe ce soir à 22h30 sur un Python que les mises à jour d'Arch ne toucheront plus (avec retour automatique à l'ancien en cas de problème).
- **Testé et rejeté** : un panier de tendance sur l'or, le pétrole et 7 indices hors US. Il perd sur les deux périodes et dégrade le portefeuille.

## 6 quinquies. Machine learning : le bot peut-il apprendre de ses erreurs ? (17/10)

- **Ta question** : le bot n'a pas de machine learning, c'est voulu. Il s'adapte (taille selon la volatilité, pauses après un stop, risque divisé par 2 à −8 %), mais il ne change jamais ses règles tout seul. Ses améliorations passent par toi : rapport du samedi, recherche, backtest sur les 2 périodes, incubateur, puis ta décision.
- **Le test que tu as demandé** : 10 essais, avec des modèles ré-entraînés chaque 1er janvier qui ne voient jamais l'année qu'ils prédisent. Les critères ont été fixés avant de lancer.
  - **Prédire le sens du lendemain** (régression logistique et « gradient boosting », 25 indicateurs + VIX, sur le Nasdaq, le DAX et le Bitcoin) : le modèle a raison 50 à 56 % du temps. Le seul qui gagne sur les 2 périodes (logistique Nasdaq) est en fait à l'achat 80 % du temps : il a surtout appris que le Nasdaq monte en moyenne, il ressemble à « acheter et garder » et fait moins bien depuis 2024.
  - **Apprendre quand les stratégies du bot se trompent** (« méta-modèle », RSI2 Nasdaq et tendance Bitcoin / Ethereum) : le modèle ne sait pas reconnaître les mauvais trades. Les trades qu'il voulait éviter gagnaient encore 62 % du temps. Avec lui, les stratégies font un peu moins bien.
  - **Baisser le poids d'une stratégie après 6 ou 12 mois de pertes** : la pire baisse est un peu moins forte (−9 % au lieu de −13 %), mais on gagne moins, et le Sharpe ne s'améliore pas.
- **Résultat : aucun essai ne passe, rien n'est ajouté au bot.** Avec des données journalières (environ 250 par an), il n'y a pas assez d'exemples pour qu'un modèle apprenne quelque chose qui tienne. Les fonds qui réussissent en ML ont des milliards de points de données. Détail : `reports/research_ml.md`.
- **Premier rapport du samedi (17/10)** : le bot a pris 100 % des mêmes décisions que le backtest (58 décisions vérifiées). Trois défauts du rapport ont été corrigés : la vérification du Nasdaq et du S&P plantait sur les heures de week-end (marché fermé), « OK » s'affichait avant les 30 jours nécessaires pour juger, et un coût d'exécution de « −18 %/an » était extrapolé à partir de 3 jours seulement (le vrai chiffre : −0,15 % du capital sur ces 3 jours).
- **Fausse alerte corrigée (17/10)** : le samedi, le marché est si calme qu'une baisse de 0,11 % du Bitcoin en une minute passait pour un mouvement anormal et mettait le marché en pause. Il faut maintenant aussi un mouvement d'au moins 0,5 %. Bot relancé à 15h43.
- **Erreur de capital trouvée par toi (19/10)** : pour Capital.com, le « solde » comprend déjà les positions ouvertes, et le bot les ajoutait une deuxième fois. Le tableau de bord affichait donc 1 007,86 € au lieu de 1 003,15 €. Corrigé et testé ; les registres passés sont corrigés aussi. Le vrai départ était 1 000 €, et le vrai plus haut 1 005,60 € (et non 1 013,20 €). Relance du bot à 22h10 le 19/10.
- **Tableau de bord, 21/10 (ta demande)** : nouvel onglet **8 POSITIONS**. Pour chaque position : pourquoi le bot l'a ouverte, quand il compte la vendre (avec les prix exacts) et pourquoi il ne l'a pas encore vendue. Dans **MARCHÉS**, un encadré **« Pourquoi ça bouge »** donne l'ampleur du mouvement comparée à d'habitude, les marchés qui bougent en même temps, les réunions de la Fed et les derniers titres de presse. Le bot, lui, ne lit pas l'actualité. L'onglet QUANT passe à la touche 9.

## 6 sexies. Page « QUANT » : les maths plutôt qu'un 6e backtest (18/10)

> Résumé aussi dans `C:\projets_claude\journal-sessions-claude.md` (18/10).

- **Ta demande** : améliorer le bot en regardant ce qui marche en scalping, tableau de bord pro « type Renaissance », tout calculer.
- **Pas de nouveau backtest de scalping** : après ~484 essais, le meilleur Sharpe dû au **seul hasard** sur 2010–2020 vaut environ **0,92** (formule de Bailey et López de Prado). Tester encore fabriquerait un faux gagnant.
- **Nouvelle page** http://arch-unowhy.tailacce8b.ts.net:8080/quant.html (`scripts/quant.py`, Python pur, lecture seule, aucun ordre ; lancer `python scripts/quant.py`) :
  1. **Mur des frais** : taux de trades gagnants minimum pour ne pas perdre, selon la durée du trade (σ mesuré sur les bougies récentes contre les coûts de `costs.py`). Nasdaq : 63,6 % en 1 min, 55,9 % en 5 min, 51,0 % sur 4 h à 1 jour. Bitcoin et Ethereum : impossible sous 5 min. Renaissance a raison environ **50,75 %** du temps : même avec leur signal, le scalping chez Capital.com donnerait un Sharpe de −34 en 5 min sur le Nasdaq. La zone gagnable va de quelques heures à un jour, là où sont déjà les stratégies du bot.
  2. **Essais multiples** : les stratégies du bot gardent 87 à 100 % de chances d'avoir un vrai avantage sur 2021–2026 (Bitcoin tendance la plus faible : 87 %).
  3. **Compte démo** : 5 jours ne prouvent rien (marge d'erreur du Sharpe ± 17). Pour prouver un Sharpe de 0,8, il faut environ **4,2 ans** de réel (1,7 an si le vrai Sharpe vaut 1,27). Les 3 mois de `REGLES.md` vérifient la concordance avec le backtest, pas l'avantage.
  4. **Kelly** : 12 % de volatilité, c'est environ **15 % du Kelly** si le vrai Sharpe vaut 0,8. Au Kelly calculé sur le backtest (127 %), un vrai Sharpe de 0,5 ferait **perdre** de l'argent. Le levier actuel est raisonnable.
- **Rien n'a changé dans le bot** (le superviseur et les stratégies ne sont pas touchés).
- **Reliée au tableau de bord** (dimanche 18/10 vers 15h, marchés actions fermés, à ta demande « hors séance ») : onglet **8 QUANT ↗** dans `reports/index.html` (touche 8), et recalcul toutes les 5 min à la fin de `scripts/dashboard.py` (dans un `try/except` : une erreur de la page QUANT ne peut pas casser le tableau de bord). Aucun changement systemd.

## 6 septies. Bugs, 2 nouvelles stratégies, auto-amélioration encadrée (18/10, après-midi)

- **Tests sous Windows** : environnement Python hors du dossier synchronisé (`C:\Users\fauch\AppData\Local\Temp\ictbot-venv`). 66/71 au départ : 2 échecs, dus à l'encodage.
- **3 vrais bugs corrigés** (chacun avec un test qui échoue sur l'ancien code, sauf indication) :
  1. `state.py` : `save()` renommait `state.json` en `.bak` **puis** posait le nouveau fichier. Une coupure entre les deux faisait disparaître `state.json`, et le bot repartait **sans ses positions**. Maintenant : copie, puis remplacement atomique.
  2. `state.py` : un `state.json` contenant des octets non UTF-8 (disque abîmé) faisait planter le bot **en boucle au démarrage** au lieu de reprendre la copie `.bak` (`UnicodeDecodeError` n'était pas rattrapée). Ce test n'échoue sur l'ancien code que sous Linux.
  3. `weekly_report.py` : le compteur « semaines sous surveillance » augmentait **à chaque lancement** du rapport (relancé 3 fois le 17/10). Il compte maintenant une fois par semaine ISO.
  - Aussi : encodage UTF-8 explicite pour l'état, le journal et les registres (sans effet sous Linux, bot sûr si la langue du système change). Git local : `core.autocrlf=false`, `core.fileMode=false`.
- **2 nouvelles stratégies testées** (`scripts/research_overnight_tom.py`, `reports/research_overnight_tom.md`, protocole fixé avant, 4 essais, cumul ≈ 488). **Toutes rejetées** :
  - **nuit du Nasdaq** : +4,2 pb brut par nuit pour 4,2 pb de frais (Sharpe 0,00 / −0,07) ;
  - **tournant du mois sur le Nasdaq** : +49 pb brut par trade pour 14 pb de frais, Sharpe 0,50 sur 2010–2020 mais 0,15 sur 2021–2026 (effet affaibli depuis sa publication) ;
  - S&P : 0,28 / 0,12 (tournant du mois) et −0,95 / −0,50 (nuit).
- **Auto-amélioration encadrée** (ton choix) :
  - le rapport du samedi applique **seul** la règle de `REGLES.md` §3 (3 mois sous surveillance -> poids × 0,5, une fois) via `data/live/auto_weights.json` ;
  - le bot lit ce fichier à chaque tour (borné entre 0 et 1 : il ne peut que réduire le risque ; fichier illisible -> ignoré) et note « POIDS » dans le journal ;
  - restent des **propositions** : couper une stratégie, revenir au poids normal, sortir de l'incubateur (nouvelle section 6 du rapport : après 90 jours, « candidate » si le résultat simulé est positif) ;
  - 76 tests passent.
- **Relecture de `capital.py` et `broker.py`** (18/10, vers 15h45) : **1 faille de plus**, de la même famille que l'ordre en double du 15/10.
  - Le problème : une réponse « 200 » inattendue à une ouverture (page HTML, JSON sans `dealReference`, ou ordre accepté sans identifiant de position) faisait croire à un ordre **refusé**. Le bot effaçait l'ordre en suspens ; si la position était bien ouverte, elle devenait « manuelle » et le bot rouvrait 10 min plus tard (**exposition doublée**).
  - La correction : ces cas sont maintenant « incertains ». L'ordre est gardé en suspens et retrouvé parmi les positions (ou abandonné après 3 min).
  - 3 tests, qui échouent sur l'ancien code ; 79 tests au total. Le reste est sain : jamais de renvoi d'une ouverture, fermeture ou stop refusés = erreur, limites de débit, reconnexion.
  - Bot redémarré par toi à 15h41, vérifié par Z: (3 positions, aucune erreur, tours réguliers).
- **Bot redémarré** par toi le 18/10 à 15h31 (arrêt propre, 3 positions reprises avec leurs stops, aucune erreur ; `state.json` et sa copie `.bak` vérifiés). Commit `26d25cb`.

## 7. Revue « méthode Renaissance / Jim Simons » (15/10)

- Tu m'as donné un cahier des charges avec 9 règles (R1 à R9), tirées de la recherche publique sur Renaissance.
- La plupart sont **déjà dans le bot** : momentum intraday, ciblage de volatilité, parité de risque, frais réels, validation sur 2 périodes, coupe-circuits.
- R2, R3 et R1 sur 100 actions ne sont **pas adaptés** à Capital.com avec 1 000 € (il faudrait beaucoup d'actions et la vente à découvert).
- **Filtre VIX sur le RSI2 testé : rejeté.** Il ne fait pas mieux sur 2010–2020, et il fait même moins bien sur 2000–2009. Le bot ne change pas.
- **Bug corrigé** : lors d'un retournement (passer de l'achat à la vente), si la fermeture était refusée, le bot ouvrait quand même la vente, et la position se retrouvait doublée. Maintenant, il n'ouvre rien tant que la fermeture n'a pas réussi. Un test le vérifie. Le bot redémarre avec la correction **ce soir à 22h30**, après la séance.
- **Audit de Gemini (15/10), vérifié point par point** :
  - ✅ **2 vrais bugs corrigés** : (1) après une coupure réseau pendant un ordre, le bot pouvait acheter **deux fois** ; (2) avec une position EUR/USD ouverte à la main, l'ICT pouvait **rouvrir son trade en boucle** après l'objectif. Les deux cas sont maintenant testés.
  - ⚠️ 1 point vrai mais limité (le stop le plus large s'applique quand l'intraday et le RSI2 sont tous les deux sur le Nasdaq) : noté, à étudier.
  - ❌ 2 points faux ou sans effet (stop suiveur, VWAP).
- Le projet est sous **Git** depuis le 15/10 : chaque changement peut être vu et annulé.

---

## 8. Aide-mémoire

| Pour… | Faire |
|---|---|
| Tableau de bord (PC Windows, téléphone) | **http://arch-unowhy.tailacce8b.ts.net:8080/** (Tailscale doit être connecté) |
| Fiche d'un trade / un marché en lien direct | `…:8080/#trd&t=<numéro du deal>` · `…:8080/#mkt&m=US100` |
| Ancienne page de statut | http://arch-unowhy.tailacce8b.ts.net:8080/live_status.html |
| Statut rapide en SSH | `ssh thomasf@100.113.243.15` puis `cd ~/Projets/trading && uv run python scripts/status.py` |
| Logs du bot en direct | `journalctl --user -u ictbot -f` |
| Redémarrer le bot | `systemctl --user restart ictbot` |
| Après un arrêt d'urgence | `uv run python scripts/run_bot.py --reset-halt` |
| Restaurer une sauvegarde | `tar xzf ~/Projets/sauvegardes-bot/bot-AAAA-MM-JJ.tar.gz -C ~/Projets/trading` (+ `git clone …bundle`) |
| Batterie / prise | `.venv/bin/python scripts/charge_control.py --status` |

**Règles de sécurité :** compte démo seulement ; on ne partage jamais la clé API ni le fichier `.env` ; on ne publie jamais le bot ; on ne ferme pas à la main les positions du bot ; on ne change pas les réglages pendant une séance.