Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 11

 
greeng2016:
Comment puis-je savoir à partir de l'EA qu'un indicateur d'alerte est arrivé ?

Avez-vous besoin d'une alerte ?

Habituellement, avec une alerte, un signal est écrit dans le tampon. Si c'est le cas, vous devez lire la valeur du tampon.

Mais vous devez voir le code pour le savoir exactement. Ou fenêtre de données ctrl+D avec les valeurs des indicateurs sur la barre avec alerte.

 
kosmo13:

Dans l'annexe de cet article, il s'appelle sHistoryExport.mq5. Mon compilateur n'accepte pas les fonctions dont le nom commence par "HistoryDeal..." et les identifiants par "DEAL_...". Voici le code :

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input bool     UseDateFrom = false; // Указывать дату начала
input datetime DateFrom=0; // Дата начала
input bool     UseDateTo=false; // Указывать дату окончания
input datetime DateTo=0; // Дата окончания



//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){

   datetime from,to;
  
   if(UseDateFrom){
      from=DateFrom;
   }
   else{
      from=0;
   }
  
   if(UseDateTo){
      to=DateTo;
   }
   else{
      to=TimeCurrent();
   }  
  
   if(!HistorySelect(from,to)){
      Alert("Ошибка выделение истории");
      return;
   }
  
   string FileName="history.csv";
  
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_CSV,";");
  
   if(h==INVALID_HANDLE){
      Alert("Ошибка открытия файла");
      return;
   }
  
   // первая строка, что бы знать, где что находится
  
   FileWrite(h,"Time","Deal","Order","Symbol","Type","Direction","Volume","Price","Comission","Swap","Profit","Comment");    
   // по всем сделкам

   for(int i=0;i<HistoryDealsTotal();i++){
      ulong ticket=HistoryDealGetTicket(i);
      if(ticket!=0){
        
         long type=HistoryDealGetInteger(ticket,DEAL_TYPE);
        
         if(type==DEAL_TYPE_BUY || type==DEAL_TYPE_SELL){
      
            long entry=HistoryDealGetInteger(ticket,DEAL_ENTRY);
      
            FileWrite(h,(datetime)HistoryDealGetInteger(ticket,DEAL_TIME),
                        ticket,
                        HistoryDealGetInteger(ticket,DEAL_ORDER),
                        HistoryDealGetString(ticket,DEAL_SYMBOL),
                        (type==DEAL_TYPE_BUY?"buy":"sell"),
                        (entry==DEAL_ENTRY_IN?"in":(entry==DEAL_ENTRY_OUT?"out":"in/out")),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_VOLUME),2),
                        HistoryDealGetDouble(ticket,DEAL_PRICE),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_COMMISSION),2),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_SWAP),2),
                        DoubleToString(HistoryDealGetDouble(ticket,DEAL_PROFIT),2),
                        HistoryDealGetString(ticket,DEAL_COMMENT)                    
            );
         }
      }
      else{
         Alert("Ошибка выделения сделки, повторите попытку");
         FileClose(h);
         return;
      }
   }

   FileClose(h);

   Alert("Сохранение выполнено, см. файл "+FileName);  
  
}
//+------------------------------------------------------------------+

Pour être honnête, je ne l'ai pas du tout vérifié - je n'ai pas l'historique MT4 avec les transactions sous la main - je l'ai juste écrit "à genoux" en regardant le script de Dmitry...

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property script_show_inputs

input bool     UseDateFrom = false; // Указывать дату начала
input datetime DateFrom=0; // Дата начала
input bool     UseDateTo=false; // Указывать дату окончания
input datetime DateTo=0; // Дата окончания

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
   //---
   datetime from,to;
   if(UseDateFrom) from=DateFrom;
   else from=0;
   if(UseDateTo) to=DateTo;
   else to=TimeCurrent();
   //---
   string FileName="history.csv";
   int h=FileOpen(FileName,FILE_WRITE|FILE_ANSI|FILE_CSV,";");
   if(h==INVALID_HANDLE){
      Alert("Ошибка открытия файла");
      return;
      }
   //--- первая строка, что бы знать, где что находится
   FileWrite(h,"OpenTime","CloseTime","Ticket","Symbol","Type","Volume","OpenPrice","ClosePrice","Comission","Swap","Profit","Comment");    
   //--- по всем сделкам
   for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
         if(OrderOpenTime()<from)   continue;
         if(OrderOpenTime()>to)     break;
         int type=OrderType();
         if(type>OP_SELL)           continue;
         int dg=(int)SymbolInfoInteger(OrderSymbol(),SYMBOL_DIGITS);
         int ticket=OrderTicket();
         FileWrite(h,(datetime)OrderOpenTime(),
                     (datetime)OrderCloseTime(),
                     ticket,
                     OrderSymbol(),
                     (type==OP_BUY?"buy":"sell"),
                     DoubleToString(OrderLots(),2),
                     DoubleToString(OrderOpenPrice(),dg),
                     DoubleToString(OrderClosePrice(),dg),
                     DoubleToString(OrderCommission(),2),
                     DoubleToString(OrderSwap(),2),
                     DoubleToString(OrderProfit(),2),
                     OrderComment()                  
                   );
         }
      else{
         Alert("Ошибка выделения сделки, повторите попытку");
         FileClose(h);
         return;
         }
      }
   //---
   FileClose(h);
   Alert("Сохранение выполнено, см. файл "+FileName);  
}
//+------------------------------------------------------------------+
 

Merci pour cette précision, Artem !

Mais il y a une autre question.

Parfois, un EA ouvre un ordre immédiatement après le déclenchement du SL. Ainsi, il peut drainer la totalité du dépôt en une seule bougie.

Comment spécifier correctement le délai d'ouverture de l'ordre suivant après la fermeture de l'ordre en cours ? Le temps de retard doit être égal au temps du chandelier et être calculé automatiquement.

Merci !

 
Viachaslau Baiko:

Merci pour cette précision, Artem !

Mais il y a une autre question.

Parfois, un EA ouvre un ordre immédiatement après le déclenchement du SL. Ainsi, nous pouvons laisser la totalité du dépôt être drainée sur une seule bougie.

Comment spécifier correctement le délai pour l'ouverture de l'ordre suivant après la fermeture de l'ordre en cours ? Le temps de retard doit être égal au temps du chandelier et être calculé automatiquement.

Merci !

La logique est la suivante :

  1. trouver le dernier ordre clôturé par son type et l'heure de sa clôture
  2. Nous trouvons la barre à laquelle il était fermé au moment où cette commande a été fermée.
  3. Si la valeur obtenue de la barre est supérieure à zéro, une nouvelle position peut être ouverte, sinon, non.
 
Artyom Trishkin:

Pour être honnête, je ne l'ai pas vérifié du tout - je n'ai pas l'historique des transactions de MT4 à portée de main - je l'ai juste écrit "à genoux" en regardant le script de Dimitri...

Ça marche. Il semble être Ok, mais l'ouverture/fermeture a une mauvaise date, mais je sais comment le réparer. Merci beaucoup.
 
kosmo13:
Ça marche. A première vue, tout semble correct, l'ouverture/fermeture n'écrit que la date, mais je sais comment résoudre ce problème. Merci beaucoup.
 
Aide avec ce conseiller sur la construction précédente a travaillé, mais pas maintenant !!!!
Dossiers :
 
zhas89:
Aide avec ce conseiller sur la construction précédente a travaillé et maintenant il ne fait pas !!!!

En quoi avez-vous besoin d'aide ? Y a-t-il quelque chose que vous ne pouvez pas faire vous-même ?

Il est possible d'aider et de discuter ici, mais pas de réaliser des souhaits gratuits.

 
Artyom Trishkin:

En quoi avez-vous besoin d'aide ? Y a-t-il quelque chose que vous ne pouvez pas faire vous-même ?

Aide et discussion ici, mais pas de réalisation gratuite de souhaits.

Je ne comprends pas ce qui ne va pas ?
 
zhas89:
Je ne comprends pas quelle est l'erreur ?
Où avez-vous cherché, qu'avez-vous fait, et qu'en avez-vous retiré ?
Raison: