I need your expertise for a code

 
Hello everyone, I spent several sleepless nights on this code, I can not find the errors.
The trading robot is designed to trade between 3:30pm and 10:00pm using the pivot points of H4, D1 and W1, as well as support and resistance levels. Each time one of these levels is reached, a position is opened in the opposite direction of the price, with a take profit of 2 points and a stop loss of 10 points.

I know that among you there are people who have a lot of mastery of the mql5.

Thank you for your help.

#include <Trade/Trade.mqh>

//Paramètres du trade
double takeProfit = 2.0;
double stopLoss = 10.0;
int tradeHourStart = 1530;
int tradeHourEnd = 2200;

//Fonction pour vérifier si le temps actuel est dans la plage de négociation
bool isTradingTime()
{
  int currentHour = TimeHour(TimeCurrent());
  int currentMinute = TimeMinute(TimeCurrent());
  int currentTime = currentHour * 100 + currentMinute;

  if (currentTime >= tradeHourStart && currentTime <= tradeHourEnd)
    return true;
  else
    return false;
}

//Point pivot H4
double h4PivotPoint;
void OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const int &spread[], const double &real_volume[])
{
  if (prev_calculated != 0)
    return;

  h4PivotPoint = (High(0, PERIOD_H4) + Low(0, PERIOD_H4) + Close(0, PERIOD_H4)) / 3;
}

//Point pivot D1
double d1PivotPoint;
void OnInit()
{
  d1PivotPoint = (High(0, PERIOD_D1) + Low(0, PERIOD_D1) + Close(0, PERIOD_D1)) / 3;
}

//Point pivot W1
double w1PivotPoint;
void OnStart()
{
  w1PivotPoint = (High(0, PERIOD_W1) + Low(0, PERIOD_W1) + Close(0, PERIOD_W1)) / 3;

  //Inscrire une tâche pour vérifier les points pivots
  EventSetTimer(1);
}

void OnTimer()
{
  //Vérifiez si le temps actuel est dans la plage de négociation
  if (!isTradingTime())
    return;

  //Récupérez les niveaux de support et de résistance
  double supportLevel = iCustom(NULL, 0, "Support and Resistance", 0, 0, 0);
  double resistanceLevel = iCustom(NULL, 0, "Support and Resistance", 0, 1, 0);

  double price = Close[0];

  //Ouvrez une position si le prix touche un point pivot ou un niveau de support / résistance
  if (price >= h4PivotPoint || price >= d1PivotPoint || price >= w1PivotPoint || price >= resistanceLevel)
  {
    OrderSend(Symbol(), OP_SELL, 1, price, 3, price - stopLoss * Point, price + takeProfit * Point, "SELL", 123456, 0, clrNONE);
  }
  else if (price <= h4PivotPoint || price <= d1PivotPoint || price <= w1PivotPoint || price <= supportLevel)
  {
    OrderSend(Symbol(), OP_BUY, 1, price, 3, price + stopLoss * Point, price - takeProfit * Point, "BUY", 123456, 0, clrNONE);
  }
}
 

Merci de poster en français sur ce forum.

Ce code n'est pas du mql5 mais du mql4. Il faut utiliser la section MT4/mql4 du forum si vous voulez des réponses.

Vous dites ne pas trouver les erreurs, mais quel est le problème avec ce code ? Quelles erreurs ?

 
Alain Verleyen #:

Merci de poster en français sur ce forum.

Ce code n'est pas du mql5 mais du mql4. Il faut utiliser la section MT4/mql4 du forum si vous voulez des réponses.

Vous dites ne pas trouver les erreurs, mais quel est le problème avec ce code ? Quelles erreurs ?

Merci de votre reponse.

Je suis sur sur MT5 j'ai essayé de coder en MQL5 malheuresement je suis très loin d'être un expert en code, est ce que vous savez comment je pourrais convertir ce code en mql5 ?

 

Bonjour, vous avez mélangé du mql4 et mql5 dans votre code j'ai l'impression.

Vous vous êtes compliqué la tâche selon moi!  Il faudrait limite tout reprendre. Avant tout générez un Expert simple sans rien.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

Ensuite commencez dans l'ordre avec ce dont vous avez besoin.

 

Par Exemple pour vos Jours, mois, minutes... 

input bool Tradelundi=true;
input bool TradeMardi=true;
input bool TradeMercredi=true;
input bool TradeJeudi=true;
input bool TradeVendredi=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//par exemple pour vos horaire de commerce
   MqlDateTime dtpresent;
   TimeToStruct(iTime(_Symbol,_Period,0),dtpresent);
   
   if(dtpresent.hour>=15 && dtpresent.hour<22)
   {
    Print("ok nous sommes dans les bonnes heures de trade");
   }
   
   //Verification si on doit trader aujourd'hui
   bool JourOk=false;
   if(dtpresent.day_of_week==1&&Tradelundi==true){JourOk=true;}
   if(dtpresent.day_of_week==2&&TradeMardi==true){JourOk=true;}
   if(dtpresent.day_of_week==3&&TradeMercredi==true){JourOk=true;}
   if(dtpresent.day_of_week==4&&TradeJeudi==true){JourOk=true;}
   if(dtpresent.day_of_week==5&&TradeVendredi==true){JourOk=true;}
   
   if(JourOk==true&&dtpresent.hour>=15 && dtpresent.hour<22)
   {
     Print("ok nous sommes dans les bonnes heures et une bonne journée pour le trade");
   }
   
  }
//+------------------------------------------------------------------+
 

Ensuite il vous faudra forcément l'indicateur de support et résistance et pourquoi pas celui des points pivots.

Quand vous les aurez trouvés, je vous montrerais comment vous pourrez les utiliser pour enfin ouvrir des positions.

Je viens de remarquer les calculs pour les points pivots.

h4PivotPoint = (High(0, PERIOD_H4) + Low(0, PERIOD_H4) + Close(0, PERIOD_H4)) / 3;

Donc vous calculez vos point pivots sur quelle bougie ?  La précédente ? (plus haut+Plusbas+close) tout ceci divisé par 3 .

Il faudra donc faire:

input bool Tradelundi=true;
input bool TradeMardi=true;
input bool TradeMercredi=true;
input bool TradeJeudi=true;
input bool TradeVendredi=true;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double PlusBasH4=iLow(_Symbol,PERIOD_H4,1);
   double PlusHautH4=iHigh(_Symbol,PERIOD_H4,1);
   double ClotureH4=iClose(_Symbol,PERIOD_H4,1);
   double PlusBasD1=iLow(_Symbol,PERIOD_D1,1);
   double PlusHautD1=iHigh(_Symbol,PERIOD_D1,1);
   double ClotureD1=iClose(_Symbol,PERIOD_D1,1);
   double PlusBasW1=iLow(_Symbol,PERIOD_W1,1);
   double PlusHautW1=iHigh(_Symbol,PERIOD_W1,1);
   double ClotureW1=iClose(_Symbol,PERIOD_W1,1);

   double PivotH4=(PlusBasH4+PlusBasH4+ClotureH4)/3;
   double PivotD1=(PlusBasD1+PlusBasD1+ClotureD1)/3;
   double PivotW1=(PlusBasW1+PlusBasW1+ClotureW1)/3;
   
//par exemple pour vos horaire de commerce
   MqlDateTime dtpresent;
   TimeToStruct(iTime(_Symbol,_Period,0),dtpresent);
   
   if(dtpresent.hour>=15 && dtpresent.hour<22)
   {
    Print("ok nous sommes dans les bonnes heures de trade");
   }
   
   //Verification si on doit trader aujourd'hui
   bool JourOk=false;
   if(dtpresent.day_of_week==1&&Tradelundi==true){JourOk=true;}
   if(dtpresent.day_of_week==2&&TradeMardi==true){JourOk=true;}
   if(dtpresent.day_of_week==3&&TradeMercredi==true){JourOk=true;}
   if(dtpresent.day_of_week==4&&TradeJeudi==true){JourOk=true;}
   if(dtpresent.day_of_week==5&&TradeVendredi==true){JourOk=true;}
   
   if(JourOk==true&&dtpresent.hour>=15 && dtpresent.hour<22)
   {
     Print("ok nous sommes dans les bonnes heures et une bonne journée pour le trade");
   }
   
  }
//+------------------------------------------------------------------+

Je n'ai pas testé mais cela ressemblerait à ceci.

 
ALAIN MICHEL AUGE #:

Ensuite il vous faudra forcément l'indicateur de support et résistance et pourquoi pas celui des points pivots.

Quand vous les aurez trouvés, je vous montrerais comment vous pourrez les utiliser pour enfin ouvrir des positions.

Je viens de remarquer les calculs pour les points pivots.

Donc vous calculez vos point pivots sur quelle bougie ?  La précédente ? (plus haut+Plusbas+close) tout ceci divisé par 3 .

Il faudra donc faire:

Je n'ai pas testé mais cela ressemblerait à ceci.

Merci beaucoup Alain Michel ! j'ai passé plusieurs mois à faire des nuits blanches à essayer d'apprendre le MQL5 et de creer cet algorythme, ça me fais plaisir de voir que des gens qui partagent la même passion que moi sont prêt à concacrer du temp pour aider.

Votre code marche parfaitement bien ! Comment pourrais-je, chaque fois qu’un de ces niveaux est atteint ouvrir une position dans la direction opposée des point pivot ou support resistance, avec un TP 2 points et un SL de 10 points.

Par exemple si le cours touche un s1H4 à la hausse, l'algorythme ouvre une position vendeuse. 

Je pause beaucoup de question car je vois que vous avez fais en quelque minutes ce que j'ai mis plusieurs mois à faire...

 

De rien, j'ai un peu de temps en ce moment et comme vous l'avez si bien dit, c'est une passion. J'ai quelques questions en plus. Nous allons commencer par prendre un achat ou une vente avec seulement les point pivots calculés. 

Tenez moi informé de la façon dont vous voudriez calculer vos support ou résistances (avec indicateur(façon simple) ou en le codant vous même (plus dur mais entièrement personnalisable et gratifiant).

Vous avez écrit "avec un TP 2 points et un SL de 10 points". Un take profit à 2 pips ? Un stop à 10? Il faut savoir que les brokers on souvent des minimum concernant les stop et take (corrigez moi si je me trompe mais j'ai souvent vu un minimum de 20 pips). 

Malgré cela, c'est tout à fait possible de fermer une position à partir de n'importe quelle perte ou gain( c'est une autre technique qui demande par contre que votre expert reste connecté pour fermer, si il y a coupure il ne fermera pas).

Ensuite vous écrivez " Par exemple si le cours touche un s1H4 à la hausse, l'algorythme ouvre une position vendeuse. " s1H4 ? Le support 1 du H4 ? Si c'est le cas, un support est censé rebondir à la hausse et une résistance c'est l'inverse. ou je comprend mal ou vous allez contre tendance! 

Ensuite nous pouvons demander à l'expert d'analyser les choses uniquement à l'ouverture d'une bougie ou à chaque tick. Dans votre cas (puisque vous pouvez utiliser votre expert en n'importe quel TimeFrime, vu que les calculs se feront quand même) je pense qu'il serait judicieux de le faire

à chaque ouverture (ce qui nous ferais calculer comme ceci = Si ouverture au dessus ou en dessous de (pointPivotH4 ou pointpivotD1 ou pointPivotW1)) alors ouverture d'achat/vente).

Vous gagnerais en vitesse lors des tests, sinon les calcul seront : Si prix dernier tick inferieur/superieur à (pointPivotH4 ou pointpivotD1 ou pointPivotW1) et prix tick actuel inferieur/superieur à (pointPivotH4 ou pointpivotD1 ou pointPivotW1) alors achat/vente.

Pour finir, nous allons voir pas mal de chose, alors il faudra être attentif et sérieux si possible.

 

Commencez à analyser ce code, si vous bossez un samedi soir. Il devrait faire les calculs à chaque tick, si le cour passe une de vos barrières (PivotH4, D1 ou W1), il devrait prendre une position inverse (si j'ai bien compris).

//Avant toute chose on ajoute les includes qui vont servirent
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>

COrderInfo m_orderinfo;
CPositionInfo  m_position;
CTrade m_trade;
CSymbolInfo m_symbol;
CAccountInfo m_account;

//On defini un Magic Number 
#define _Magic 11032023

//On ajoute le lot, le stop, le take profit et autres....
input double _Lots=0.01;//Taille lot
input int _StopLoss=20;//Stop loss en pips, si 0 est désactivé
input int _TakeProfit=20;//Take profit, si 0 est désactivé
input int MaxOrder=1;//Maximum d'ordre en même temps

input bool Tradelundi=true;
input bool TradeMardi=true;
input bool TradeMercredi=true;
input bool TradeJeudi=true;
input bool TradeVendredi=true;

int digits_adjust=1;//Pour ajuster après la virgule.
int StopLoss, TakeProfit, Magic;
double PrixSauv;//Sauvegarde du prix
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits()==3 || Digits()==5){digits_adjust=10;}//Si 3 ou 5 chiffres après la virgule
   Magic=_Magic;
   m_trade.SetExpertMagicNumber(Magic);
   StopLoss=_StopLoss*digits_adjust;
   TakeProfit=_TakeProfit*digits_adjust;
   PrixSauv=SymbolInfoDouble(_Symbol, SYMBOL_BID);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double PlusBasH4=iLow(_Symbol,PERIOD_H4,1);
   double PlusHautH4=iHigh(_Symbol,PERIOD_H4,1);
   double ClotureH4=iClose(_Symbol,PERIOD_H4,1);
   double PlusBasD1=iLow(_Symbol,PERIOD_D1,1);
   double PlusHautD1=iHigh(_Symbol,PERIOD_D1,1);
   double ClotureD1=iClose(_Symbol,PERIOD_D1,1);
   double PlusBasW1=iLow(_Symbol,PERIOD_W1,1);
   double PlusHautW1=iHigh(_Symbol,PERIOD_W1,1);
   double ClotureW1=iClose(_Symbol,PERIOD_W1,1);

   double PivotH4=(PlusBasH4+PlusBasH4+ClotureH4)/3;
   double PivotD1=(PlusBasD1+PlusBasD1+ClotureD1)/3;
   double PivotW1=(PlusBasW1+PlusBasW1+ClotureW1)/3;
   
   bool TradeBuy=false, TradeSell=false;
   double PrixActuel=SymbolInfoDouble(_Symbol, SYMBOL_BID);
   if(PrixSauv!=PrixActuel)
   {
   if((PrixSauv<PivotH4 && PrixActuel>=PivotH4)||(PrixSauv<PivotD1 && PrixActuel>=PivotD1)||(PrixSauv<PivotW1 && PrixActuel>=PivotW1)) {TradeSell=true;}
   if((PrixSauv>PivotH4 && PrixActuel<=PivotH4)||(PrixSauv>PivotD1 && PrixActuel<=PivotD1)||(PrixSauv>PivotW1 && PrixActuel<=PivotW1)) {TradeBuy=true;}
   }
    
//par exemple pour vos horaire de commerce
   MqlDateTime dtpresent;
   TimeToStruct(iTime(_Symbol,_Period,0),dtpresent);
   
   if(dtpresent.hour>=15 && dtpresent.hour<22&&PositionsTotal()<MaxOrder)
   {
    Print("ok nous sommes dans les bonnes heures de trade");
    if(TradeBuy==true)
      {
         double SL,TP;
         int Ticket;
         double ask=SymbolInfoDouble(_Symbol, SYMBOL_ASK);
         if(StopLoss>0){SL=ask-StopLoss*Point();}else {SL=0;}
         if(TakeProfit>0){TP=ask+TakeProfit*Point();}else {TP=0;}
         Ticket=m_trade.Buy(_Lots,NULL,ask,SL,TP,_Magic);
      }
    if(TradeSell==true)
      {
         double SL,TP;
         int Ticket;
         double bid=SymbolInfoDouble(_Symbol, SYMBOL_BID);
         if(StopLoss>0){SL=bid+StopLoss*Point();}else {SL=0;}
         if(TakeProfit>0){TP=bid-TakeProfit*Point();}else {TP=0;}
         Ticket=m_trade.Sell(_Lots,NULL,bid,SL,TP,_Magic);
      }
   }
   
   //Verification si on doit trader aujourd'hui
   bool JourOk=false;
   if(dtpresent.day_of_week==1&&Tradelundi==true){JourOk=true;}
   if(dtpresent.day_of_week==2&&TradeMardi==true){JourOk=true;}
   if(dtpresent.day_of_week==3&&TradeMercredi==true){JourOk=true;}
   if(dtpresent.day_of_week==4&&TradeJeudi==true){JourOk=true;}
   if(dtpresent.day_of_week==5&&TradeVendredi==true){JourOk=true;}
   
   if(JourOk==true&&dtpresent.hour>=15 && dtpresent.hour<22)
   {
     Print("ok nous sommes dans les bonnes heures et une bonne journée pour le trade");
   }
   
  }
//+------------------------------------------------------------------+
 
ALAIN MICHEL AUGE #:

Commencez à analyser ce code, si vous bossez un samedi soir. Il devrait faire les calculs à chaque tick, si le cour passe une de vos barrières (PivotH4, D1 ou W1), il devrait prendre une position inverse (si j'ai bien compris).

ALAIN MICHEL je vous ai envoyé un message en pv.

Oui l'expert traderait à contre tendance et sur les indices, j'aimerai que l'expert analyse les choses à chaque tick : si prix dernier tick inferieur/superieur à (pointPivotH4 ou pointpivotD1 ou pointPivotW1) et prix tick actuel inferieur/superieur à (pointPivotH4 ou pointpivotD1 ou pointPivotW1) alors achat/vente.