62 lines
5.1 KiB
Markdown
62 lines
5.1 KiB
Markdown
|
|
# OVSFDCe0v2 - Standards de Codage & Syntaxe (Le Code de Loi)
|
||
|
|
|
||
|
|
Ce document définit les lois strictes de structure pour le projet. Chaque membre du système doit s'y conformer pour garantir une lecture fluide de l'architecture ATAC. La matière doit être claire, sans ambiguïté.
|
||
|
|
|
||
|
|
## 1. Langues et Communication
|
||
|
|
- **Code :** 100% Anglais (Variables, Fonctions, Classes) ;
|
||
|
|
- **Commentaires :** 100% Français. Expliquent le "Pourquoi" (logique interne, amortissement,...), le code exprime le "Comment" ;
|
||
|
|
- **Notes de travail :** Préfixer par `// TODO :` pour toute tâche ou réflexion à finaliser plus tard.
|
||
|
|
|
||
|
|
## 2. Conventions de Nommage
|
||
|
|
- **Fichiers :** Nom de l'entité pur. (ex: `Level.mqh`, `BarsManager.mqh`) ;
|
||
|
|
- **Classes :** Préfixe 'C' + PascalCase. (ex: `class CLevel`, `class CBarsManager`) ;
|
||
|
|
- **Variables Membres (Privées/Protégées) :** Préfixe 'm_' + camelCase. (ex: `double m_priceValue;`). Toujours accédés via `this.` ;
|
||
|
|
- **Méthodes :** PascalCase. Tout appel à une méthode interne à l'instance DOIT se faire via this. (ex: `this.ComputeMatiere();`) ;
|
||
|
|
- **Variables Locales & Paramètres :** camelCase pur. (ex: double `currentPrice`;) ;
|
||
|
|
- **Paramètres de Sortie (Out) :** Passage par référence obligatoire (`&`). Préfixe 'out_' suivi de camelCase (ex: `bool ComputeZone(double currentPrice, double &out_consolidatedPrice`);) ;
|
||
|
|
- **Pointeurs :** Tout descripteur d'objet (pointeur `*`) DOIT inclure le préfixe `p_` pour signaler visuellement le danger d'un accès mémoire :
|
||
|
|
- Pointeur local : `p_` + camelCase *(ex: `CLevel* p_currentLevel;`)*,
|
||
|
|
- Pointeur membre : `m_p_` + camelCase *(ex: `CLevel* m_p_lastLevel;`)*,
|
||
|
|
- Pointeur en paramètre de sortie : `out_p_` + camelCase *(ex: `void GetLevel(CLevel* &out_p_level);`)*;
|
||
|
|
- **Constantes & Macros :** MAJUSCULES_AVEC_UNDERSCORE. (ex: `LEVEL_UNDEFINED`) ;
|
||
|
|
- **Getters :** Nom de la propriété brute (ex: `Value()`).
|
||
|
|
*Note : Utiliser `LevelType()` si collision avec `CObject::Type()`.*
|
||
|
|
|
||
|
|
## 3. Accesseurs et Syntaxe d'Objet
|
||
|
|
- **Pointeur `this.` :** L'accès aux membres internes DOIT être précédé de `this.` pour un repérage visuel immédiat (*"programmation défensive visuelle"*) ;
|
||
|
|
- **Pas de Flèche (`->`) :** MQL5 déréférence automatiquement. On utilise toujours le point `.`, même sur des pointeurs.
|
||
|
|
|
||
|
|
## 4. Architecture des Constructeurs
|
||
|
|
- **Délégation :** Utiliser la délégation de constructeurs pour éviter la redondance (DRY) ;
|
||
|
|
*Exemple : `CLevel(double v) : CLevel() { this.m_value = v; }`*
|
||
|
|
- **Initialisation :** Interdite dans la déclaration. Tout se passe dans le constructeur.
|
||
|
|
|
||
|
|
## 5. Sécurité, Pointeurs, Mémoire et Polymorphisme
|
||
|
|
En MQL5, un pointeur n'est pas une adresse mémoire, mais un descripteur (handle).
|
||
|
|
- **Interdiction du `&` pour l'adressage :** L'opérateur `&` est STRICTEMENT et UNIQUEMENT réservé au passage par référence dans les paramètres de fonction. Pour obtenir le pointeur d'un objet, utiliser exclusivement `GetPointer()` ;
|
||
|
|
- **Vérification :** Toujours vérifier `CheckPointer(ptr) != POINTER_INVALID` avant usage.
|
||
|
|
- **Destruction :** Un objet ne doit subir un 'delete' QUE s'il a été créé via 'new' et que 'CheckPointer(ptr) == POINTER_DYNAMIC'.
|
||
|
|
Pour faciliter le codage et la relecture les *MACROS* suivantes sont définies dans `Common\Defines.mqh` :
|
||
|
|
- `#define IS_VALID(ptr) (CheckPointer(ptr) != POINTER_INVALID)`,
|
||
|
|
- `#define IS_DYNAMIC(ptr) (CheckPointer(ptr) == POINTER_DYNAMIC)`,
|
||
|
|
- `#define SAFE_DELETE(ptr) if(IS_DYNAMIC(ptr)) { delete ptr; ptr = NULL; }` ;
|
||
|
|
- **Signature Compare :** Pour le tri (`CArrayObj`), la signature doit être STRICTEMENT `virtual int Compare(const CObject* node, const int mode=0) const` ;
|
||
|
|
- **Casting :** Utiliser exclusivement `dynamic_cast<T*>` pour descendre d'un parent à un enfant. C'est la seule protection contre les crashs de descripteurs invalides.
|
||
|
|
|
||
|
|
## 6. Temps et Synchronisation
|
||
|
|
- Pour la création d'objets, préférer l'horloge de l'Aiguilleur (`CMarketClock`) ou, à défaut, `TimeTradeServer()` pour éviter le gel des données hors-ticks.
|
||
|
|
|
||
|
|
## 7. Structure et Headers
|
||
|
|
Chaque fichier commence par un bloc d'en-tête de très exactement 80 caractères, aligné à droite.
|
||
|
|
```cpp
|
||
|
|
//+----------------------------------------------------------------------------+
|
||
|
|
//| File: OVSFDCe0v2\Topography\Level.mqh |
|
||
|
|
//| Copyright: 2024, t00n Corp. |
|
||
|
|
//| URL: https://heretik666.free.fr/brousoufs |
|
||
|
|
//+----------------------------------------------------------------------------+
|
||
|
|
```
|
||
|
|
## 8. Mise en Forme et Alignement
|
||
|
|
- **Alignement Vertical :** Les blocs de variables et les définitions de méthodes consécutives (sans ligne vide entre elles) DOIVENT être alignés verticalement (Types, Noms, Assignations) pour former une grille lisible ;
|
||
|
|
- **One-Liners :** Autorisés et encouragés pour les méthodes triviales (Getters, surcharges d'opérateurs) ;
|
||
|
|
- **Regions :** Utiliser '#region Name' / '#endregion' pour grouper les blocs de code ;
|
||
|
|
- **Include Guards :** Toujours utiliser '#ifndef... #define... #endif' pour éviter les inclusions multiples.
|