Questions des débutants MQL5 MT5 MetaTrader 5 - page 1115

 
J'ai trouvé, c'est juste un fichier cassé, mais l'exécutable est intact, donc ça marche...
 
xxz:

......
EA fonctionne, mais lorsque j'essaie de l'ouvrir dans l'éditeur

......

xxz:

ce n'est pas un exécutable, c'est un fichier mq5...

voici mon code...

Formulez donc vos phrases correctement.

Sur le sujet. J'ai l'habitude d'ouvrir les documents problématiques dans Notepad++. Cela aide. Mais pas toujours ;))

 
Сергей Таболин:

Formulez donc vos phrases correctement.

Sur le sujet. J'ai l'habitude d'ouvrir les documents problématiques dans Notepad++. Cela aide. Mais pas toujours ))))

J'ai également décidé de le parcourir avec Notepad++ et il n'y avait presque que des zéros, bien que le fichier ait une taille normale comme il devrait l'être...

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL4 MT4 MetaTrader 4".
 

J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.

La fonction OnTick()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   
   GetData();
   CheckForOpen();
   CheckForCloseCP();
   CheckForCloseAll();

}
//+------------------------------------------------------------------+

Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :

enum opp_mode {
   DoClose,       // Close and reverse with initial lot
   DoReverse,     // Close and reverse (continue Martingale last lot)
   DoHedge,       // No closing reversal (Hedge mode)
};

// Trade & MM Section
input opp_mode Mode_opp    = DoHedge;     // Trading Mode

//+------------------------------------------------------------------+
//| Check for Open function                                          |
//+------------------------------------------------------------------+
void CheckForOpen() {

   if (!IsBarNew) return;

double lot=0;
positions=Positions();

   if (Signal==OP_BUY) {
      if (longs>0) return;
      if (shorts==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
      }
      if (shorts>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode SELL by opposite signal."); 
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing SELL by opposite signal.");
            lot=GetMaxLot(ORDER_TYPE_SELL);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging SELL by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
         }
      }
   }
   if (Signal==OP_SELL) {
      if (shorts>0) return;
      if (longs==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
      }
      if (longs>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode BUY by opposite signal."); 
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing BUY by opposite signal."); 
            lot=GetMaxLot(ORDER_TYPE_BUY);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging BUY by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
         }
      }
   }
}
//+------------------------------------------------------------------+

La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.

//+------------------------------------------------------------------+
//| Place Market Order function                                      |
//+------------------------------------------------------------------+
bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) {   //  mn - Magic Number

double d_sl=0, d_tp=0;

   MqlTick stTick;
   if (SymbolInfoTick(_Symbol,stTick)==false) {
      Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
   }

   Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
         ", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));

   if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
     
   if (oper==OP_BUY)  {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _ask=stTick.ask;
         d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
         d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
         if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
   if (oper==OP_SELL) {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _bid=stTick.bid;
         d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
         d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
         if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
     
   return(false);
     
}
//+------------------------------------------------------------------+

La fonction de contrôle de l'ouverture d'un nouveau bar :

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
bool   IsBarNew=false;


//+------------------------------------------------------------------+
//| Bar refreshing function                                          |
//| true - new bar opened, false - not opened                        |
//+------------------------------------------------------------------+
bool IsNewBar() {

static datetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
       datetime curTime  =iTime(NULL,PERIOD_CURRENT,0);

   if (curTime>SavedTime) {
         SavedTime=curTime;
         return(true);
   }
   else return(false);
}
//+------------------------------------------------------------------+

La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.


L'ensemble de l'EA.

Dossiers :
 
Grigori.S.B:

J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.

La fonction OnTick()

Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :

La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.

La fonction de contrôle de l'ouverture d'un nouveau bar :

La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.


L'ensemble de l'EA.

J'utilise cette fonction pour contrôler la nouvelle barre - parfois il y a des erreurs lors de la copie de la date de la barre.

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
     {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
     }
   else
     {
      if(prevBarTime!=tm[0])
        {
         prevBarTime=tm[0];
         return true;
        }
      return false;
     }
   return true;
  }
 
Aleksey Vyazmikin:

J'utilise une telle fonction pour contrôler une nouvelle barre - il arrive que des erreurs se produisent lors de la copie de la date de la barre.

Merci. Je vais essayer de le remplacer. Bien que jusqu'à présent, la fonction que j'ai utilisée a bien fonctionné aussi. J'ai une idée pour imprimer l'heure d'ouverture de la barre et le prix, alors il serait clairement vu que l'erreur est dans ce cas particulier.

Cependant, je suis confus par le fait que les duplots n'apparaissent qu'à l'ouverture de la première position alors que les positions suivantes sont ouvertes correctement et que l'EA fonctionne pendant des heures en en générant des dizaines. Et la fonction de contrôle de l'ouverture du bar fonctionne à chaque fois. Et selon les conditions, le conseiller expert ouvre la première position lorsqu'il n'y en a pas et les suivantes seulement lorsque le prix a suffisamment bougé après l'ouverture de la première position.

 
Grigori.S.B:

J'ai écrit un EA. La personne à qui je l'ai écrit, au premier passage, ouvre deux postes l'un après l'autre. Je ne parviens pas à reproduire ce problème sur moi-même. Je voudrais vous demander de l'aide.

La fonction OnTick()

Seule la fonction CheckForOpen() est responsable de l'ouverture des positions :

La fonction qui envoie une demande d'ouverture de position depuis le marché. J'y ai ajouté une relecture différée lorsque le serveur se bloque car j'obtiens souvent des requotes/offquotes lorsque je teste avec la démo MetaQuotes MT5.

La fonction de contrôle de l'ouverture d'un nouveau bar :

La deuxième position s'ouvre immédiatement après la première, dans la même seconde, les ticks diffèrent d'une unité. J'ai d'abord pensé qu'il y avait une deuxième copie de l'EA sur le deuxième graphique. J'ai demandé de les fermer tous et de laisser un seul graphique et d'exécuter l'EA, mais selon le client et à en juger par la capture d'écran, ce n'est pas la raison. Les postes suivants sont ouverts un par un, il n'y a plus de doublons. Je ne peux pas le reproduire, je me suis déjà creusé les méninges. Je l'ai testé sur ma démo MT5 ICMarkets hedge ainsi que sur l'orderer. Capture d'écran du doublet.


L'ensemble de l'EA.

Et comment vérifier qu'une position n'a pas déjà été ouverte sur cette barre ?

 
Artyom Trishkin:

Et comment vérifier qu'aucune position n'a encore été ouverte sur cette barre ?

Non, ce contrôle n'existe pas.

Il existe de tels contrôles :

  • Si une nouvelle barre s'est ouverte, avec son premier tick, une position peut être ouverte,
  • S'il n'y a pas de position, la première position peut être ouverte.
En d'autres termes, pour une raison quelconque, deux positions s'ouvrent en même temps sur le premier tick d'une nouvelle barre. Et seuls les premiers postes sont ouverts. Par ailleurs, un tel phénomène n'est pas observé.
 
Grigori.S.B:

Non, ce contrôle n'existe pas.

Il existe de tels contrôles :

  • Si une nouvelle barre s'est ouverte, avec son premier tick, une position peut être ouverte,
  • S'il n'y a pas de position, la première position peut être ouverte.
C'est-à-dire que pour une raison quelconque, deux positions s'ouvrent en même temps sur le premier tick d'une nouvelle barre. Et seuls les premiers postes sont ouverts. Par ailleurs, un tel phénomène n'est pas observé.

Je n'ai pas le temps d'analyser ce qui se passe là-bas. Mais essayez de vérifier le nombre de positions ouvertes sur la nouvelle barre. Sinon, ouvrez.

Raison: