Tutoriel MQL5 pour Debutant

 

Bonjour tout le monde, j'espère que vous allez bien 😊


Auriez-vous de bons liens tutoriel vidéo ou site web(pas la doc officiel), idéalement en français sinon anglais en deuxième choix,


J'ai trouvé cette chaîne YouTube française pour débutants qui a l'air sympa et j'ai l'impression qu'il n'y a plus de mises à jour mais c'est déjà très bien pour moi :

 

Il y a quelques années j'ai déjà programmé (appris par moi-même) les languages : HTML, PHP, CSS, SQL, AJAX, j'ai tout abandonné depuis longtemps car je n'avais plus l'utilité,


Aujourd'hui je souhaite programmer sure le language MQL5


Il avance pour toutes vos lumières 😊

 
Voici un lien YouTube très intéressant. Même si le monsieur ne publie plus depuis pas mal de temps, tu y trouveras du moins 3 tutos très intéressants qui vont sans nul doute faciliter ton décollage en MQL5. Lien : https://www.youtube.com/watch?v=EKXH9HEr3b0
Tuto 001 | Comment coder un robot de trading en MQL5 pour MT5
Tuto 001 | Comment coder un robot de trading en MQL5 pour MT5
  • 2020.11.05
  • www.youtube.com
Premier tuto destiné à la création d'un robot de trading en MQL5 pour MetaTrader MT5 :1: L'environnement du codeur MQL5Lien vers mon site : http://www.jp-med...
 

Merci @ J M 😊,

Que pensez-vous de ce livre : Expert Advisor Programming for MetaTrader 5 ?

J M
J M
  • 2020.10.05
  • www.mql5.com
Profil du trader
 
ZeroCafeine #:

Merci @ J M 😊,

Que pensez-vous de ce livre : Expert Advisor Programming for MetaTrader 5 ?

C’est un livre assez connu, plutôt bon et complet. Toutefois, je pense qu’il n’est pas nécessaire pour bien commencer, tu trouveras facilement énormément de ressources sur le forum et dans la documentation !
 
Zaky Hamdoun #:
C’est un livre assez connu, plutôt bon et complet. Toutefois, je pense qu’il n’est pas nécessaire pour bien commencer, tu trouveras facilement énormément de ressources sur le forum et dans la documentation !
Merci à toi, où je peux trouver sur le site internet officiel des exemples simple de robot de trading avec explication si possible, ça va peut être aussi m'aider ☺️

J'ai cru voir les sections Articles ?
 
ZeroCafeine #:
Merci à toi, où je peux trouver sur le site internet officiel des exemples simple de robot de trading avec explication si possible, ça va peut être aussi m'aider ☺️

J'ai cru voir les sections Articles ?

Oui, tu peux jeter un œil à la section "Articles", mais surtout la section "Codebase" (bases de code) si tu souhaites avoir des exemples.

 
Merci a tous pour vos lumières, si d'autres propositions je suis preneur 😊
 

Hello tout le monde

@ J M

J'ai retaper le code du toutou numéro deux et trois et le voici en résumé sur les commentaires, je suis pendant une erreur : "Envoi OrderSend erreur 4756", savez-vous d'où ça peut provenir ?

//+------------------------------------------------------------------+
//|                                                       Tuto02.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                           https://www.Google.com |
//+------------------------------------------------------------------+
#property copyright     "Hello ZeroCafeine"
#property link          "www.Google.com"
#property version       "1.00"
#property description   "Mon 1er EA de Trading"

input group    "Moy.Mobiles"        
input int      moyMobRapide = 20;         
input int      moyMobLente  = 200;             

input group    "Stop Loss / Take Profit"       
input int      valeurSL = 100;                 
input int      valeurTP = 200;                

input group    "Numéro Série MGICMA"          
input int      nombreMagique = 22052023;       

#define MAGICMA nombreMagique

bool     signalAchat = false;       
bool     signalVente = false;                
double   prixAsk;                             
double   prixBid;
double   spread;                             
double   valeurPoint;                        
long     decimales;                        
double   volumeMin;                          
double   volumeMax;                      
double   capitalDebutSession;                 

int      indicMmLente;        
int      indicMmRapide;                         

//+------------------------------------------------------------------+
//|                      OnInit() event handler                      |
//+------------------------------------------------------------------+
int OnInit()
{
   valeurPoint = SymbolInfoDouble (Symbol(), SYMBOL_POINT);    
   decimales   = SymbolInfoInteger(Symbol(), SYMBOL_DIGITS);  
   volumeMin   = SymbolInfoDouble (Symbol(), SYMBOL_VOLUME_MIN);  
   volumeMax   = SymbolInfoDouble (Symbol(), SYMBOL_VOLUME_MAX); 
   capitalDebutSession = AccountInfoDouble(ACCOUNT_BALANCE); 
   indicMmLente = iMA(_Symbol,_Period, moyMobLente, 1, MODE_SMA, PRICE_CLOSE);
   indicMmRapide = iMA(_Symbol,_Period, moyMobRapide, 1, MODE_SMA, PRICE_CLOSE);

   if(indicMmLente == INVALID_HANDLE || indicMmRapide == INVALID_HANDLE)
   {
      printf("Erreur de création des buffers des Moyennes Mobiles");
      return(INIT_FAILED); 
   }
   
   printf("Initialisation du robot effectuée avec succés");
   Print("indicMmRapide : ", indicMmRapide, " / indicMmLente : ", indicMmLente);
   
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//|                      OnTick() event handler                      |
//+------------------------------------------------------------------+
void OnTick()
  {
   prixAsk = SymbolInfoDouble(Symbol(), SYMBOL_ASK); 
   prixBid = SymbolInfoDouble(Symbol(), SYMBOL_BID); 
   spread  = prixAsk - prixBid;                      

   for(int a=0; a < PositionsTotal(); a++)
   {
      ulong ordre = PositionGetTicket(a); 
      if(PositionGetInteger(POSITION_MAGIC) == MAGICMA)
      {
         if(testerSignalCloture() == true) cloturer(ordre);
      }
   }

   if(testerPremierTick() == false) return;

   if(testerSignalAchat() == true && PositionsTotal() < 1) acheter();
   else
   {
       if(testerSignalVente() == true && PositionsTotal() < 1 ) vendre();
   }
   
   double profit = AccountInfoDouble(ACCOUNT_BALANCE) - capitalDebutSession;
   
   string ligne1 = "Spread = " + DoubleToString(spread,decimales);
   string ligne2 = "Point = "  + DoubleToString(valeurPoint,decimales);
   string ligne3 = "Profit = " + DoubleToString(profit,2) + "€";
   Comment(ligne1 + "\n" + ligne2 + "\n" + ligne3);
   
  }
  
//+------------------------------------------------------------------+
//|                         My Fonctions                             |
//+------------------------------------------------------------------+
bool testerSignalCloture() {  return false;  }

void cloturer(long ticket) {  }

bool testerPremierTick()
  {
   MqlRates bufferPrix[2];
   int nbreBougies = CopyRates(_Symbol, _Period, 0, 2, bufferPrix);
   if(nbreBougies == 2 && bufferPrix[1].tick_volume == 1) {return true; }              
   return false;                  
  }

bool testerSignalAchat()
{
   MqlRates prix[5]; 

   int nbreBougies = CopyRates(_Symbol, _Period, 0, 5, prix);

   if(nbreBougies != 5)
   {
      Print("Erreur : sur la Récupération Tableau de bougie");
      return false;
   }
   
   double tableauMmRapide[5];
   if(CopyBuffer(indicMmRapide, 0, 0, 5, tableauMmRapide) != 5)
   {
      Print("Erreur : Pas de donnée de Moyenne Mobile Rapide");
      return false;
   }
   
   double tableauMmLente[5];
   if(CopyBuffer(indicMmLente, 0, 0, 5, tableauMmLente) != 5)
   {
      Print("Erreur : Pas de donnée de Moyenne Mobile Lente");
      return false; 
   }

   if(   tableauMmLente[3]  > tableauMmLente[0]
      && tableauMmRapide[3] > tableauMmRapide[0]
      && prix[3].close      > tableauMmRapide[3]
      && prix[3].open       > tableauMmRapide[3])
   {  return true;   }

   return false;
}

void acheter()
  {
      double prixSL = calculerSLAchat();
      double prixTP = calculerTPAchat();        

      MqlTradeRequest parametresOrdre={}; 
      MqlTradeResult  resultat={0}; 

      parametresOrdre.action     = TRADE_ACTION_DEAL;    
      parametresOrdre.symbol     = Symbol();             
      parametresOrdre.volume     = 0.1;                
      parametresOrdre.type       = ORDER_TYPE_BUY;        
      parametresOrdre.price      = prixAsk;            
      parametresOrdre.deviation  = 5;              
      parametresOrdre.magic      = MAGICMA;              
      parametresOrdre.sl         = prixSL;   
      parametresOrdre.tp         = prixTP;       

      bool envoi = false;    
      int essais = 0;           
      while(envoi == false && essais <= 3) 
      {
         envoi = OrderSend(parametresOrdre,resultat); 
         if(envoi == false)
         {
            PrintFormat("Envoi OrderSend erreur %d", GetLastError()); 
            essais++;
         }
      }
  }
  
bool testerSignalVente()  
{  
   MqlRates prix[5];
   int nbreBougies = CopyRates(_Symbol, _Period, 0, 5, prix);

   if(nbreBougies != 5)
   { 
      Print("Erreur : sur la Récupération Tableau de bougie");
      return false;
   }

   double tableauMmRapide[5];
   if(CopyBuffer(indicMmRapide, 0, 0, 5, tableauMmRapide) != 5)
   {
      Print("Erreur : Pas de donnée de Moyenne Mobile Rapide");
      return false;
   }

   double tableauMmLente[5];
   if(CopyBuffer(indicMmLente, 0, 0, 5, tableauMmLente) != 5)
   {
      Print("Erreur : Pas de donnée de Moyenne Mobile Lente");
      return false;
   }

   if(   tableauMmLente[3]  < tableauMmLente[0]
      && tableauMmRapide[3] < tableauMmRapide[0]
      && prix[3].open  > tableauMmRapide[3]
      && prix[3].close < tableauMmRapide[3])
   {  return true; }

   return false;
} 

void vendre()
   {
      double prixSL  = calculerSLVente();     
      double prixTP  = calculerTPVente();    
      
      MqlTradeRequest parametresOrdre={};  
      MqlTradeResult  resultat{0};
      
      parametresOrdre.action     = TRADE_ACTION_DEAL;   
      parametresOrdre.symbol     = Symbol();         
      parametresOrdre.volume     = 0.1;              
      parametresOrdre.type       = ORDER_TYPE_SELL;       
      parametresOrdre.price      = prixAsk;            
      parametresOrdre.deviation  = 5;                  
      parametresOrdre.magic      = MAGICMA;              
      parametresOrdre.sl         = prixSL;            
      parametresOrdre.tp         = prixTP;                
      
      bool envoi   = false;
      int  essais  = 0;
      while(envoi == false && essais <= 3)
      {
         envoi = OrderSend(parametresOrdre, resultat); 
         if(envoi == false)
         {
             PrintFormat("Envoi OrderSend erreur %d", GetLastError()); 
         }
      }
      
   }  
  
double calculerSLAchat()   {  return prixAsk - (valeurSL * valeurPoint);    }

double calculerSLVente()   {  return prixBid + (valeurSL * valeurPoint);   }

double calculerTPAchat()   {  return prixAsk + (valeurSL * valeurPoint);   }   
 
double calculerTPVente()   {  return prixBid - (valeurSL * valeurPoint);   }


Bien à vous,
ZeroCafeine

J M
J M
  • 2020.10.05
  • www.mql5.com
Profil du trader
 
ZeroCafeine #:

Hello tout le monde

@ J M

J'ai retaper le code du toutou numéro deux et trois et le voici en résumé sur les commentaires, je suis pendant une erreur : "Envoi OrderSend erreur 4756", savez-vous d'où ça peut provenir ?


Bien à vous,
ZeroCafeine

Il y a une erreur dans ta requête.

Je t’invite à toujours garder cette page en favori qui contient la liste des codes d’erreurs possibles :


Par ailleurs, jette un coup d’œil à la librairie CTrade, qui te permet d’éviter tout le code de requête, et de simplement appeler une fonction « Buy() » ou « Sell() ».


Regarde le groupe « Additional Methods ».


 

Je te remercie infiniment, je sais qu'il faut passer par la création d'un objet avec la classe CTrade,

Mais dans un souci d'amélioration et de savoir ce que je suis en train de faire avec mon argent et surtout d'essayer de gagner ma vie avec ça alors je vais pas me contenter juste de l'utiliser mais de bien voir ce qu'il y a à l'intérieur et ça me permettra aussi de me remettre en programmation avec ce fabuleux langage MQL5,

Si tu penses qu'il n'est pas trop compliqué de corriger l'erreur de la roquette alors ça serait sympa sinon ne t'embête pas j'y reviendrai quand j'aurai testé et trouver ce qu'il ne va pas 😊


encore merci à toi @ Zaky Hamdoun

Zaky Hamdoun
Zaky Hamdoun
  • 2023.05.25
  • www.mql5.com
Profil du trader
 
ZeroCafeine #:

Je te remercie infiniment, je sais qu'il faut passer par la création d'un objet avec la classe CTrade,

Mais dans un souci d'amélioration et de savoir ce que je suis en train de faire avec mon argent et surtout d'essayer de gagner ma vie avec ça alors je vais pas me contenter juste de l'utiliser mais de bien voir ce qu'il y a à l'intérieur et ça me permettra aussi de me remettre en programmation avec ce fabuleux langage MQL5,

Si tu penses qu'il n'est pas trop compliqué de corriger l'erreur de la roquette alors ça serait sympa sinon ne t'embête pas j'y reviendrai quand j'aurai testé et trouver ce qu'il ne va pas 😊


encore merci à toi @ Zaky Hamdoun

À première vue, cela semble être une erreur au niveau des prix.

Tu essaies d’envoyer ton sell au prix Ask, alors qu’il se fait au Bid.

D’ailleurs, je te conseillerais de ne pas stocker le prix actuel dans une variable, mais plutôt de directement appeler * lorsque tu set le prix de ta requête.

Et sinon je conseille vraiment l’utilisation de CTrade, même si le but est de devenir professionnel. 

* = SymbolInfoDouble(Symbol(),SYMBOL_BID)