erreur: '{' - unbalanced parenthèses. aider moi par pitié !!

 

Bonjour, je rencontre actuellement une erreur que je n’arrive pas à résoudre, et j’ai besoin d’aide.


Lorsque je compile le code, une erreur apparaît au niveau de la ligne dans la fonction OnTick() :


Voici le code erreur:

'{' - unbalanced parenthèses



Mon analyse :

-Le code est correctement structuré et les parenthèses semblent bien placées.

-Toutes les accolades et parenthèses sont ouvertes et fermées correctement selon la logique de mon code.

-Pourtant, l’erreur persiste, et le compilateur indique qu’il y a un déséquilibre dans les parenthèses, spécifiquement autour de la ligne où la fonction OnTick() est définie.



Ce que j’ai essayé :

-Vérification des parenthèses et accolades dans la fonction.

-Test de modifications de formulation en séparant les appels CopyBuffer dans des variables distinctes.

-Tentatives d’auto-indentation, mais le problème persiste.


Je sollicite donc votre aide pour m’expliquer pourquoi cette erreur persiste et, surtout, comment la résoudre. Est-ce lié à la manière dont la fonction est définie ou à un autre problème dans l’utilisation de CopyBuffer ou la déclaration des variables ? Tout conseil ou suggestion serait grandement apprécié.

Voici la parti du code qui pose problème:

// Fonction de tick

void OnTick() {   

       // Récupération des données des indicateurs EMA

       if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)

       {

           Print("Erreur lors de la lecture des valeurs EMA");

           return;

       }

même quand je met juste la parti  "void OnTick() {" sans le reste du code, l'erreur reste présent...


et voici mon codage entier jusqu'a la fonction OnTick

#include <Trade\Trade.mqh>  // Inclut les fonctions de trading de la bibliothèque MetaTrader


CTrade trade;  // Déclare l'objet trade pour utiliser les méthodes de CTrade


// Déclaration des paramètres personnalisables

input double riskPercent = 1.0;    // Pourcentage de risque par trade

input int stopLossPoints = 100;    // Exemple de valeur pour le Stop Loss (en pips)

input int takeProfitPoints = 200;  // Exemple de valeur pour le Take Profit (en pips)

input int magicNumber = 123456;    // Magic number pour identifier les trades


// Déclaration des handles EMA

int handleFast = INVALID_HANDLE, handleSlow = INVALID_HANDLE;


// Déclaration des variables pour les valeurs EMA

double emaFast[], emaSlow[];


// Fonction d'initialisation

 int OnInit(){

 handleFast = iMA(_Symbol, _Period, 9, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA rapide

 handleSlow = iMA(_Symbol, _Period, 21, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA lente


 // Vérification de l'initialisation des indicateurs

 if (handleFast == INVALID_HANDLE || handleSlow == INVALID_HANDLE) {

     Print("Erreur lors de l'initialisation des indicateurs EMA");

     return INIT_FAILED;

 }

 return INIT_SUCCEEDED;

}


// Fonction de désinitialisation

void OnDeinit(const int reason) {

 // Libération des handles lors de la déinitialisation

 IndicatorRelease(handleFast);

 IndicatorRelease(handleSlow);

}

// Fonction de tick

void OnTick() {   

       // Récupération des données des indicateurs EMA

       if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)

       {

           Print("Erreur lors de la lecture des valeurs EMA");

           return;

       }

Aider moi par pitié... en tout cas d’avance pour  !

 
William Yamindi:

Bonjour, je rencontre actuellement une erreur que je n’arrive pas à résoudre, et j’ai besoin d’aide.


Lorsque je compile le code, une erreur apparaît au niveau de la ligne dans la fonction OnTick() :


Voici le code erreur:

'{' - unbalanced parenthèses



Mon analyse :

-Le code est correctement structuré et les parenthèses semblent bien placées.

-Toutes les accolades et parenthèses sont ouvertes et fermées correctement selon la logique de mon code.

-Pourtant, l’erreur persiste, et le compilateur indique qu’il y a un déséquilibre dans les parenthèses, spécifiquement autour de la ligne où la fonction OnTick() est définie.



Ce que j’ai essayé :

-Vérification des parenthèses et accolades dans la fonction.

-Test de modifications de formulation en séparant les appels CopyBuffer dans des variables distinctes.

-Tentatives d’auto-indentation, mais le problème persiste.


Je sollicite donc votre aide pour m’expliquer pourquoi cette erreur persiste et, surtout, comment la résoudre. Est-ce lié à la manière dont la fonction est définie ou à un autre problème dans l’utilisation de CopyBuffer ou la déclaration des variables ? Tout conseil ou suggestion serait grandement apprécié.

Voici la parti du code qui pose problème:

// Fonction de tick

void OnTick() {   

       // Récupération des données des indicateurs EMA

       if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)

       {

           Print("Erreur lors de la lecture des valeurs EMA");

           return;

       }

même quand je met juste la parti  "void OnTick() {" sans le reste du code, l'erreur reste présent...


et voici mon codage entier jusqu'a la fonction OnTick

#include <Trade\Trade.mqh>  // Inclut les fonctions de trading de la bibliothèque MetaTrader


CTrade trade;  // Déclare l'objet trade pour utiliser les méthodes de CTrade


// Déclaration des paramètres personnalisables

input double riskPercent = 1.0;    // Pourcentage de risque par trade

input int stopLossPoints = 100;    // Exemple de valeur pour le Stop Loss (en pips)

input int takeProfitPoints = 200;  // Exemple de valeur pour le Take Profit (en pips)

input int magicNumber = 123456;    // Magic number pour identifier les trades


// Déclaration des handles EMA

int handleFast = INVALID_HANDLE, handleSlow = INVALID_HANDLE;


// Déclaration des variables pour les valeurs EMA

double emaFast[], emaSlow[];


// Fonction d'initialisation

 int OnInit(){

 handleFast = iMA(_Symbol, _Period, 9, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA rapide

 handleSlow = iMA(_Symbol, _Period, 21, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA lente


 // Vérification de l'initialisation des indicateurs

 if (handleFast == INVALID_HANDLE || handleSlow == INVALID_HANDLE) {

     Print("Erreur lors de l'initialisation des indicateurs EMA");

     return INIT_FAILED;

 }

 return INIT_SUCCEEDED;

}


// Fonction de désinitialisation

void OnDeinit(const int reason) {

 // Libération des handles lors de la déinitialisation

 IndicatorRelease(handleFast);

 IndicatorRelease(handleSlow);

}

// Fonction de tick

void OnTick() {   

       // Récupération des données des indicateurs EMA

       if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)

       {

           Print("Erreur lors de la lecture des valeurs EMA");

           return;

       }

Aider moi par pitié... en tout cas d’avance pour  !

Bonjour William !

Espérant que tu vas bien...

En fait, juste avec un petit regard, j'ai dû rapidement repérer ton problème. En effet, justement comme le message du compilateur Mql te le suggère bien : il te manque l'accolade fermante pour ta fonction Ontick.

void OnTick() {   

       // Récupération des données des indicateurs EMA

       if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)

       {

           Print("Erreur lors de la lecture des valeurs EMA");

           return;

       }

  }  // VOILÀ ! C'EST ICI QUE RÉSIDAIT TON PROBLÈME : IL TE MANQUAIT DONC CETTE ACCOLADE FERMANTE POUR LA FONCTION OnTick. Merci
 
J M #:

Bonjour William !

Espérant que tu vas bien...

En fait, juste avec un petit regard, j'ai dû rapidement repérer ton problème. En effet, justement comme le message du compilateur Mql te le suggère bien : il te manque l'accolade fermante pour ta fonction Ontick.

Quelqu'un connait un raccourci clavier pour aller d'accolade ouverte en accolade fermée?
ChatGPT suggère ctr+shift+] mais ca ne marche pas chez moi

 
Christophe Pa Trouillas #:

Quelqu'un connait un raccourci clavier pour aller d'accolade ouverte en accolade fermée?
ChatGPT suggère ctr+shift+] mais ca ne marche pas chez moi

Malheureusement, un tel raccourci clavier, je ne le connais pas personnellement. Par ailleurs, ce que je sais, c'est le fait qu'il est possible d'activer le "surlignage des parenthèses/accolades correspondantes". Et cette option est présente sous l'onglet "Outils → Options → Général" de MetaEditor (Et après activation de cette option, il suffirait juste de placer son curseur devant une parenthèse/accolade et le système va t'indiquer sa correspondante). Et ceci est très intéressant pour visualiser le début et la fin d'un bloc de code... et repérer ainsi facilement le scénario où une parenthèses/accolade viendrait à manquer dans notre structure de code... (Comme c'est fût justement le cas ici pour notre ami William).

 
J M #:

Bonjour William !

Espérant que tu vas bien...

En fait, juste avec un petit regard, j'ai dû rapidement repérer ton problème. En effet, justement comme le message du compilateur Mql te le suggère bien : il te manque l'accolade fermante pour ta fonction Ontick.

Merci beaucoup pour ta réponse et ta suggestion. J’ai ajouté l’accolade fermante pour la fonction OnTick() comme tu me l’as conseillé, mais après cette modification, de nouvelles erreurs apparaissent :


'if' - expressions are not allowed on a global scope

'declaration of 'stopLossPoints' hides global variable

'AccountBalance' - undeclared identifier

')' - expression expected

Warning signalé: declaration of 'stopLossPoints' hides global variable


Je te serais très reconnaissant si tu pouvais me donner quelques éclaircissements supplémentaires pour résoudre ces problèmes. Je voudrais m’assurer que les variables sont correctement définies, que les fonctions sont bien placées


Merci beaucoup pour ton aide et ton soutien.

 
William Yamindi #:

Merci beaucoup pour ta réponse et ta suggestion. J’ai ajouté l’accolade fermante pour la fonction OnTick() comme tu me l’as conseillé, mais après cette modification, de nouvelles erreurs apparaissent :


'if' - expressions are not allowed on a global scope

'declaration of 'stopLossPoints' hides global variable

'AccountBalance' - undeclared identifier

')' - expression expected

Warning signalé: declaration of 'stopLossPoints' hides global variable


Je te serais très reconnaissant si tu pouvais me donner quelques éclaircissements supplémentaires pour résoudre ces problèmes. Je voudrais m’assurer que les variables sont correctement définies, que les fonctions sont bien placées


Merci beaucoup pour ton aide et ton soutien.

Pourtant, chez moi, j'ai dû compiler l'ensemble de ton code et ça fonctionne plutôt correctement.

Du coup, il me semble que tu dois avoir ajouté d'autres lignes de code qui ne figurent pas dans l'ensemble du code que tu as partagé précédemment. Parce qu'après vérification, ton dernier message d'erreur évoqué parle notamment de "AccountBalance", une variable qui n'existe pas dans le code que tu as partagé.


Solution : Tu peux encore repartager l'ensemble de l'état actuel de ton code pour qu'on ressaie de voir ce qui cloche...

(N.B.: Lorsque tu publies du code, veuilles à utiliser un bouton spécifique présent dans l'éditeur de message ici dédié justement à l'insertion de bloc de code. Ça rend beaucoup plus lisible celui-ci. Un peu comme je l'ai fait dans mon commentaire précédent. Merci)


Widget permettant d'insérer du code

 
J M #:

Pourtant, chez moi, j'ai dû compiler l'ensemble de ton code et ça fonctionne plutôt correctement.

Du coup, il me semble que tu dois avoir ajouté d'autres lignes de code qui ne figurent pas dans l'ensemble du code que tu as partagé précédemment. Parce qu'après vérification, ton dernier message d'erreur évoqué parle notamment de "AccountBalance", une variable qui n'existe pas dans le code que tu as partagé.


Solution : Tu peux encore repartager l'ensemble de l'état actuel de ton code pour qu'on ressaie de voir ce qui cloche...

(N.B.: Lorsque tu publies du code, veuilles à utiliser un bouton spécifique présent dans l'éditeur de message ici dédié justement à l'insertion de bloc de code. Ça rend beaucoup plus lisible celui-ci. Un peu comme je l'ai fait dans mon commentaire précédent. Merci)



Merci beaucoup pour ta réponse et pour avoir pris le temps d’examiner le problème.


Effectivement, comme tu l’as mentionné, je n’avais partagé que la première partie du code, jusqu’à la fonction OnTick(). Pour que tu puisses mieux comprendre la situation et les erreurs rencontrées, je vais maintenant te partager l’intégralité du code, Cela permettra d’avoir une vision complète du problème.

#include <Trade\Trade.mqh>  // Inclut les fonctions de trading de la bibliothèque MetaTrader

CTrade trade;  // Déclare l'objet trade pour utiliser les méthodes de CTrade

// Déclaration des paramètres personnalisables
input double riskPercent = 1.0;    // Pourcentage de risque par trade
input int stopLossPoints = 100;    // Exemple de valeur pour le Stop Loss (en pips)
input int takeProfitPoints = 200;  // Exemple de valeur pour le Take Profit (en pips)
input int magicNumber = 123456;    // Magic number pour identifier les trades

// Déclaration des handles EMA
int handleFast = INVALID_HANDLE, handleSlow = INVALID_HANDLE;

// Déclaration des variables pour les valeurs EMA
double emaFast[], emaSlow[];

// Fonction d'initialisation
 int OnInit(){
 handleFast = iMA(_Symbol, _Period, 9, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA rapide
 handleSlow = iMA(_Symbol, _Period, 21, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA lente

 // Vérification de l'initialisation des indicateurs
 if (handleFast == INVALID_HANDLE || handleSlow == INVALID_HANDLE) {
     Print("Erreur lors de l'initialisation des indicateurs EMA");
     return INIT_FAILED;
 }
 return INIT_SUCCEEDED;
}

// Fonction de désinitialisation
void OnDeinit(const int reason) {
 // Libération des handles lors de la déinitialisation
 IndicatorRelease(handleFast);
 IndicatorRelease(handleSlow);
}
// Fonction de tick
void OnTick() {   

       // Récupération des données des indicateurs EMA

       if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)

       {

           Print("Erreur lors de la lecture des valeurs EMA");

           return;
       }
    

       // Récupération des valeurs actuelles et précédentes des EMA
       double emaFastPrev = emaFast[1];
       double emaFastNow = emaFast[0];
       double emaSlowPrev = emaSlow[1];
       double emaSlowNow = emaSlow[0];
   
       // Vérification des conditions d'achat : EMA rapide croise au-dessus de l'EMA lente
       if (emaFastPrev < emaSlowPrev && emaFastNow > emaSlowNow)
       {
           // Calcul du lot en fonction du stop loss
           double lotSize = CalculateLotSize(stopLossPoints);
           // Passer un ordre d'achat avec stop loss et take profit
           trade.Buy(lotSize, _Symbol, 0, stopLossPoints * Point, takeProfitPoints * Point, "Shallow Buy");
       }
   
       // Vérification des conditions de vente : EMA rapide croise en-dessous de l'EMA lente
       if (emaFastPrev > emaSlowPrev && emaFastNow < emaSlowNow)
       {
           // Calcul du lot en fonction du stop loss
           double lotSize = CalculateLotSize(stopLossPoints);
           // Passer un ordre de vente avec stop loss et take profit
           trade.Sell(lotSize, _Symbol, 0, stopLossPoints * Point, takeProfitPoints * Point, "Shallow Sell");
       } 
    // Fonction de calcul de la taille du lot
       double CalculateLotSize(double stopLossPoints)
    {
       double riskAmount = AccountBalance() * (riskPercent / 100.0);  // Calcul du montant à risquer par trade
       double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); // Valeur d'un tick
       double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); // Taille du tick
   
       if (tickValue == 0 || tickSize == 0)
           return 0;
   
       double lotSize = riskAmount / ((stopLossPoints * tickValue) / tickSize); // Calcul du lot
       return NormalizeDouble(lotSize, 2);  // Arrondi à 2 décimales
    }
 

En ajoutant l’accolade que tu m’avais suggéré, il y a les 4 erreurs que j’avais envoyé précédemment, on enlevant cette l’accolade, il y a toujours cette erreur qui se présente ('{' - unbalanced parentheses)


Je te remercie à nouveau pour ton aide et j’attends avec impatience tes suggestions pour résoudre ces problèmes !

 

tu devrais apprendre les bases, car tu n'ira pas loin sans
Des erreurs de débutants graves

j'ai pas testé ton code, j'ai fait en sorte qu'il n'y ai pas d'erreur de compilation


#include <Trade\Trade.mqh>  // Inclut les fonctions de trading de la bibliothèque MetaTrader

CTrade trade;  // Déclare l'objet trade pour utiliser les méthodes de CTrade

// Déclaration des paramètres personnalisables
input double riskPercent = 1.0;    // Pourcentage de risque par trade
input int stopLossPoints = 100;    // Exemple de valeur pour le Stop Loss (en pips)
input int takeProfitPoints = 200;  // Exemple de valeur pour le Take Profit (en pips)
input int magicNumber = 123456;    // Magic number pour identifier les trades

// Déclaration des handles EMA
int handleFast = INVALID_HANDLE, handleSlow = INVALID_HANDLE;

// Déclaration des variables pour les valeurs EMA
double emaFast[], emaSlow[];

// Fonction d'initialisation
int OnInit() {
  handleFast = iMA(_Symbol, _Period, 9, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA rapide
  handleSlow = iMA(_Symbol, _Period, 21, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA lente

// Vérification de l'initialisation des indicateurs
  if (handleFast == INVALID_HANDLE || handleSlow == INVALID_HANDLE) {
    Print("Erreur lors de l'initialisation des indicateurs EMA");
    return INIT_FAILED;
  }
  return INIT_SUCCEEDED;
}

// Fonction de désinitialisation
void OnDeinit(const int reason) {
// Libération des handles lors de la déinitialisation
  IndicatorRelease(handleFast);
  IndicatorRelease(handleSlow);
}


// Fonction de tick
void OnTick() {

  // Récupération des données des indicateurs EMA

  if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0) {

    Print("Erreur lors de la lecture des valeurs EMA");

    return;
  }


  // Récupération des valeurs actuelles et précédentes des EMA
  double emaFastPrev = emaFast[1];
  double emaFastNow = emaFast[0];
  double emaSlowPrev = emaSlow[1];
  double emaSlowNow = emaSlow[0];

  // Vérification des conditions d'achat : EMA rapide croise au-dessus de l'EMA lente
  if (emaFastPrev < emaSlowPrev && emaFastNow > emaSlowNow) {
    // Calcul du lot en fonction du stop loss
    double lotSize = CalculateLotSize();
    // Passer un ordre d'achat avec stop loss et take profit
    trade.Buy(lotSize, _Symbol, 0, stopLossPoints * _Point, takeProfitPoints * _Point, "Shallow Buy");
  }

  // Vérification des conditions de vente : EMA rapide croise en-dessous de l'EMA lente
  if (emaFastPrev > emaSlowPrev && emaFastNow < emaSlowNow) {
    // Calcul du lot en fonction du stop loss
    double lotSize = CalculateLotSize();
    // Passer un ordre de vente avec stop loss et take profit
    trade.Sell(lotSize, _Symbol, 0, stopLossPoints * _Point, takeProfitPoints * _Point, "Shallow Sell");
  }
  return;
}


// Fonction de calcul de la taille du lot
double CalculateLotSize() {
double AccountBalance = AccountInfoDouble( ACCOUNT_BALANCE );
  double riskAmount = AccountBalance * (riskPercent / 100.0);  // Calcul du montant à risquer par trade
  double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); // Valeur d'un tick
  double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); // Taille du tick

  if (tickValue == 0 || tickSize == 0)
    return 0;

  double lotSize = riskAmount / ((stopLossPoints * tickValue) / tickSize); // Calcul du lot
  return NormalizeDouble(lotSize, 2);  // Arrondi à 2 décimales
}


 
William Yamindi #:

Merci beaucoup pour ta réponse et pour avoir pris le temps d’examiner le problème.


Effectivement, comme tu l’as mentionné, je n’avais partagé que la première partie du code, jusqu’à la fonction OnTick(). Pour que tu puisses mieux comprendre la situation et les erreurs rencontrées, je vais maintenant te partager l’intégralité du code, Cela permettra d’avoir une vision complète du problème.

En ajoutant l’accolade que tu m’avais suggéré, il y a les 4 erreurs que j’avais envoyé précédemment, on enlevant cette l’accolade, il y a toujours cette erreur qui se présente ('{' - unbalanced parentheses)


Je te remercie à nouveau pour ton aide et j’attends avec impatience tes suggestions pour résoudre ces problèmes !

Bonjour William !

Alors, après réexamen de ton code, j'ai de nouveau réussi à identifier tous les points qui posaient problème, et je vais essayer de te les détailler un à un:

1] Tu sembles confondre du code python au code Mql5. En python, tu peux sans aucun problème utiliser les Opérateurs Conditionnel If-Else dans la portée globale de ton code, c'est-à-dire en  dehors d'une fonction, ce qui n'est pas possible en Mql5/4. En Mql4/5 donc, les Opérateurs Conditionnel If-Else ne peuvent être utilisés qu'à l'intérieur d'une fonction, pas en dehors. Ce qui posait problème avec tout l'ensemble de ton bloc de code ci-dessous:

  double emaFastPrev = emaFast[1];
  double emaFastNow = emaFast[0];
  double emaSlowPrev = emaSlow[1];
  double emaSlowNow = emaSlow[0];
       // Vérification des conditions d'achat : EMA rapide croise au-dessus de l'EMA lente
  
// ICI, LES if SONT UTILISÉS EN DEHORS D'UNE FONCTION, CE QUI EST POSSIBLE EN Python, pas en MQL5/4
  
if (emaFastPrev < emaSlowPrev && emaFastNow > emaSlowNow)
    {
     // Calcul du lot en fonction du stop loss
     double lotSize = CalculateLotSize(stopLossPoints);
     // Passer un ordre d'achat avec stop loss et take profit
     trade.Buy(lotSize, _Symbol, 0, stopLossPoints * Point, takeProfitPoints * Point, "Shallow Buy");
    }
   
    // Vérification des conditions de vente : EMA rapide croise en-dessous de l'EMA lente
  if (emaFastPrev > emaSlowPrev && emaFastNow < emaSlowNow)
    {
     // Calcul du lot en fonction du stop loss
     double lotSize = CalculateLotSize(stopLossPoints);
     // Passer un ordre de vente avec stop loss et take profit
     trade.Sell(lotSize, _Symbol, 0, stopLossPoints * Point, takeProfitPoints * Point, "Shallow Sell");
    } 

2] En Mql4/5, lors de la déclaration d'une fonction, tu ne peux pas directement lui passer comme argument par défaut une variable définie à la portée globale comme input. Ce qui posait donc un deuxième problème ici :

// Ici, la variable stopLossPoints est définie comme input à la portée globale, et de ce fait, ne peut être directement passé comme argument ici.

double CalculateLotSize(double stopLossPoints)
 {
  // (...)
 }

3] Tu procédais mal pour pouvoir récupérer la balance du compte, à ce niveau:

double CalculateLotSize() 
{
 // CETTE SYNTAXE (AccountBalance) N'EST PAS LA BONNE
  double riskAmount = AccountBalance * (riskPercent / 100.0);  // Calcul du montant à risquer par trade

// VOICI DONC LA BONNE:
  double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (riskPercent / 100.0);
}

4] Tu confonds les fonctions Mql5 "_Point et Point()": La première notation, avec un underscore, s'appelle sans les parenthèses, alors que la deuxième, sans underscore donc, s'appelle, quant à elle, avec les parenthèses. Ce qui posait donc problème à ce niveau ici:

// Ici, tu as appelée la fonction Point sans les parenthèses ouvrante et fermante

trade.Buy(lotSize, _Symbol, 0, stopLossPoints * Point, takeProfitPoints * Point, "Shallow Buy");

trade.Sell(lotSize, _Symbol, 0, stopLossPoints * Point, takeProfitPoints * Point, "Shallow Sell");

5] Et voilà ! Apres donc toutes ces remarques, voici donc la version corrigée complète que je te propose (tu remarqueras que j'ai dû ajouter des séparateurs (_____) pour renforcer la visualité de tes blocs de code. Et pour le bloc où tu utilisais les operateurs If-Else en dehors d'une fonction, j'ai dû créer pour toi une fonction que j'ai nommée arbitrairement "TesterSignal()" et j'y ai placée tout ce bloc de code là. Et cette nouvelle fonction, TesterSignal() donc, devrait être appelée en permanence dans la fonction OnTick(). Tu noteras également que, dans la version de code corrigée que je te propose, j'ai dû aussi réviser le style d'indentation des accolades. Je les ai donc bien alignées verticalement !. Et cela, toujours dans le souci de rendre rapidement repérable le début et la fin de tes  blocs de code pour encore une fois renforcer sa lisibilité. Enfin, tu n'as donc qu'à bien observer ce code pour identifier tous les amendements que j'ai dû y apporter par rapport à ta version. Merci. :

 
 #include <Trade\Trade.mqh>  // Inclut les fonctions de trading de la bibliothèque MetaTrader

 CTrade trade;  // Déclare l'objet trade pour utiliser les méthodes de CTrade

 // Déclaration des paramètres personnalisables
 input double riskPercent = 1.0;    // Pourcentage de risque par trade
 input int stopLossPoints = 100;    // Exemple de valeur pour le Stop Loss (en pips)
 input int takeProfitPoints = 200;  // Exemple de valeur pour le Take Profit (en pips)
 input int magicNumber = 123456;    // Magic number pour identifier les trades

 // Déclaration des handles EMA
 int handleFast = INVALID_HANDLE, handleSlow = INVALID_HANDLE;

 // Déclaration des variables pour les valeurs EMA
 double emaFast[], emaSlow[];

 // ________________________________________________________

 // Fonction d'initialisation
 int OnInit()
 {
  handleFast = iMA(_Symbol, _Period, 9, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA rapide
  handleSlow = iMA(_Symbol, _Period, 21, 0, MODE_EMA, PRICE_CLOSE); // Calcul de l'EMA lente

 // Vérification de l'initialisation des indicateurs
  if (handleFast == INVALID_HANDLE || handleSlow == INVALID_HANDLE)
    {
     Print("Erreur lors de l'initialisation des indicateurs EMA");
     return INIT_FAILED;
    }
  return INIT_SUCCEEDED;
 }

 // ________________________________________________________    

 // Fonction de désinitialisation
 void OnDeinit(const int reason)
 {
  // Libération des handles lors de la déinitialisation
  IndicatorRelease(handleFast);
  IndicatorRelease(handleSlow);
 }

// ________________________________________________________    

 // Fonction de tick
 void OnTick()
 {   
  // Récupération des données des indicateurs EMA
  if (CopyBuffer(handleFast, 0, 0, 2, emaFast) < 0 || CopyBuffer(handleSlow, 0, 0, 2, emaSlow) < 0)
    {
     Print("Erreur lors de la lecture des valeurs EMA");
     return;
    }
    
  TesterSignal();   // LA FAMEUSE FONCTION QUE J'AI DÛ FABRIQUER POUR TOI...
 }

// ________________________________________________________   
 
 void TesterSignal()
 {      // Récupération des valeurs actuelles et précédentes des EMA
  double emaFastPrev = emaFast[1];
  double emaFastNow = emaFast[0];
  double emaSlowPrev = emaSlow[1];
  double emaSlowNow = emaSlow[0];
       // Vérification des conditions d'achat : EMA rapide croise au-dessus de l'EMA lente
  if (emaFastPrev < emaSlowPrev && emaFastNow > emaSlowNow)
    {
     // Calcul du lot en fonction du stop loss
     double lotSize = CalculateLotSize(stopLossPoints);
     // Passer un ordre d'achat avec stop loss et take profit
     trade.Buy(lotSize, _Symbol, 0, stopLossPoints * Point(), takeProfitPoints * Point(), "Shallow Buy");
    }
   
    // Vérification des conditions de vente : EMA rapide croise en-dessous de l'EMA lente
  if (emaFastPrev > emaSlowPrev && emaFastNow < emaSlowNow)
    {
     // Calcul du lot en fonction du stop loss
     double lotSize = CalculateLotSize(stopLossPoints);
     // Passer un ordre de vente avec stop loss et take profit
     trade.Sell(lotSize, _Symbol, 0, stopLossPoints * _Point, takeProfitPoints * _Point, "Shallow Sell");
    } 
 }
 
 // ________________________________________________________
 
  // Fonction de calcul de la taille du lot
 double CalculateLotSize(double stop_Loss_Points)
 {
  double riskAmount = AccountInfoDouble(ACCOUNT_BALANCE) * (riskPercent / 100.0);  // Calcul du montant à risquer par trade
  double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE); // Valeur d'un tick
  double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); // Taille du tick
   
  if (tickValue == 0 || tickSize == 0) return 0;
   
  double lotSize = riskAmount / ((stop_Loss_Points * tickValue) / tickSize); // Calcul du lot
  return NormalizeDouble(lotSize, 2);  // Arrondi à 2 décimales
 }
 
J M #:
#include <Trade\Trade.mqh>  // Inclut les fonctions de trading de la bibliothèque MetaTrader CTrade trade;  // Déclare l'objet trade pour utiliser les méthodes de CTrade // Déclaration des paramètres personnalisables input double riskPercent = 1.0;    // Pourcentage de risque par trade input int stopLossPoints = 100;    // Exemple de valeur pour le Stop Loss (en pips) input int takeProfitPoints = 200;  // Exemple de valeur pour le Take Profit (en pips) input int magicNumber = 123456;    // Magic number pour identifier les trades // Déclaration des handles EMA int handleFast = INVALID_HANDLE, handleSlow = INVALID_HANDLE; // Déclaration des variables pour les valeurs EMA double emaFast[], emaSlow[]; // ________________________________________________________

Un immense merci pour ton aide, c’est vraiment très gentil de ta part ! Grâce à toi. Tous tes conseils sont désormais bien ancrés dans ma tête, et je sais que je pourrai les appliquer pour les prochaines fois avec beaucoup plus de facilité. C’est rare de rencontrer des gens aussi généreux dans leur partage de connaissances.


Si tu as un peu de temps, j’aimerais bien avoir ton avis sur le codage que j’ai réalisé jusqu’à maintenant. Je travaille dessus pour l’améliorer, mais ton regard extérieur serait vraiment le bienvenu afin de m’assurer que je vais dans la bonne direction…

 
De rien....

Ton codage... Faut rester positif. Tu as une grande marge de progression