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

 

Bonjour, pouvez-vous me dire pourquoi ça ne fonctionne pas ? Aucune erreur, mais les commandes ne s'ouvrent pas dans le testeur. J'essaie d'écrire un EA pour la rupture du haut et du bas d'un chandelier quotidien comme outil d'entraînement.


extern int      TimeCandle   = 1440;      //таймфрейм свечи, которую пробиваем 
extern int      HourStart=10; // час начала торговли
extern double   Lots=0.1;     // лот торговли   
extern int      StopLoss=100; // стоплосс
extern int      TakeProfit=100; // тайкпрофит
extern int      znak=5;     // количество знаков котировки
extern int      magik=54321;     // магик 

double minprice; // минимальная цена
double maxprice;// максимальная цена


void OnTick()
  {
  double SL, TP;
  int ticket;
 
   minprice = iLow(Symbol(),TimeCandle,1);
   maxprice = iHigh(Symbol(),TimeCandle,1);   
   
   if (TimeHour(TimeCurrent()==HourStart))
   { 
    if (BuyLimitCount()==0 && BuyCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(maxprice - StopLoss*Point,znak);
    TP = NormalizeDouble(maxprice + TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_BUYLIMIT,Lots,maxprice, 10, SL,TP,"", magik,0,Blue);
    
    if (ticket <0)
    Print ("Не удалось открыть ордер на покупку");
    }
    
    
     if (SellLimitCount()==0 && SellCount()==0) //если нет ордера то пытаться открыть
    { 
    SL = NormalizeDouble(minprice + StopLoss*Point,znak);
    TP = NormalizeDouble(minprice - TakeProfit*Point,znak);
    ticket = OrderSend(Symbol(), OP_SELLLIMIT,Lots,minprice,10, SL,TP,"", magik,0,Red);
        
    if (ticket <0)
    Print ("Не удалось открыть ордер на продажу");
    }
    
    }
    Comment ("Минимальная цена:" + DoubleToStr(minprice,znak) + "\n" + "Максимальная цена:"+ DoubleToStr(maxprice, znak)); 
  }
   
  // проверяем есть ли байлимит ордера с конца
  int BuyLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUYLIMIT )                        
        {
        count ++;
        }
    }
    return(count);  
    
  }
   // проверяем есть ли селллимит ордера с конца
  int SellLimitCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELLLIMIT )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
   // проверяем есть ли бай ордера с конца
  int BuyCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true && 
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_BUY )                        
        {
        count ++;
        }
    }
    return(count);      
  }
  
  // проверяем есть ли селл ордера с конца
  int SellCount()
  {
  int count = 0;
  for (int i=OrdersTotal()-1;i>=0;i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES) == true &&         
        OrderMagicNumber()== magik &&                        
        OrderType() == OP_SELL )                        
        {
        count ++;
        }
    }
    return(count);      
  }
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 (MQL5), среда разработки MetaEditor и инструменты тестирования стратегий. Любую информацию о разработке торговых стратегий на языке MQL5 можно найти на официальном сайте MQL5.community. На этом же сайте в разделе Code Base могут быть...
 
nelenaby:

Bonjour, pouvez-vous me dire pourquoi ça ne fonctionne pas ? Aucune erreur, mais les commandes ne s'ouvrent pas dans le testeur. J'essaie d'écrire un EA pour la rupture du haut et du bas d'un chandelier quotidien comme outil d'entraînement.


Il ne s'ouvre pas, c'est-à-dire qu'il n'essaie pas ou qu'il essaie mais échoue ? Que disent-ils dans le journal ?

 
nelenaby:

Bonjour, pouvez-vous me dire pourquoi ça ne fonctionne pas ? Aucune erreur, mais les commandes ne s'ouvrent pas dans le testeur. J'essaie d'écrire un EA pour la décomposition du haut et du bas d'un chandelier quotidien comme outil d'entraînement.


Analysez cette expression de la vôtre

if (TimeHour(TimeCurrent()==HourStart))
        {
          ........
        }

Je ne comprends pas le sens de cette expression et je me trompe peut-être, mais vous devriez au moins remplacer "(TimeCurrent()==HourStart)" par "(TimeCurrent() - HourStart)".

 

Ensuite, si je vous comprends bien, vous essayez de placer un ordre d'achat limite s'il n'y a pas d'ordre d'achat limite et de position d'achat. Notez le "ET" exact. C'est-à-dire que la présence de n'importe lequel d'entre eux séparément vous convient, ainsi, à une position souhaitée du prix actuel, vous obtiendrez un nombre infini de ByLimits, un à chaque tick, jusqu'à ce qu'au moins l'un d'entre eux se déclenche et que la première position s'ouvre. De plus, vous ne vous souciez pas du prix actuel. Dès que la condition étrange sur le temps est remplie (juste au-dessus du poste), je pense qu'il y a une erreur, mais peu importe. Quoi qu'il en soit, si vous ne tenez pas compte de cela, l'EA commencera à placer des ordres erronés dès le premier tick, jusqu'à ce que le prix atteigne le haut d'hier, parce que vous utilisez le haut d'hier comme prix pour placer l'ordre. La limite d'achat est fixée en dessous du prix actuel, ce qui signifie que le prix actuel doit être supérieur au sommet d'hier, mais en attendant, l'ordre échoue.

Ainsi, la seule situation qui vous convient est celle où le prix a dépassé le sommet de la veille, où il n'y a pas de limite de temps et où il n'y a pas de transactions ouvertes. C'est une combinaison rare. En outre, il n'affectera pas le breakout, mais rebondira après le breakout (parce qu'il y a une bylimit), et il vous enverra beaucoup d'erreurs, à partir du premier tick au-dessus du maximum d'hier (c'est une autre erreur). La condition est déjà remplie, le conseiller expert lance l'ordre, mais il y a aussi un spread, la distance minimale autorisée par rapport au marché, etc.

 
Sergey Voytsekhovsky:

J'ai du mal à comprendre le sens de cette expression, je me trompe peut-être, mais remplacez au moins "(TimeCurrent()==HourStart)" par "(TimeCurrent() - HourStart)".

C'est vrai, il y a une erreur ici. Vous avez besoin de si (TimeHour(TimeCurrent())==HourStart)

Maintenant, l'ordre s'ouvre parfois, mais il génère davantage d'erreurs (erreur OrderSend 130).

L'erreur ici n'est pas correcte en ce qui concerne les ordres limités.

 
nelenaby:

C'est vrai, il y a une erreur ici. Il faut que si (TimeHour(TimeCurrent())==HourStart)

Maintenant, il ouvre parfois les transactions, mais il envoie plus d'erreurs (erreur 130 de OrderSend).

Il n'a pas raison en ce qui concerne les ordres limités.

Voici un script pour travailler avec le temps.

Il est vieux mais il fonctionne correctement.

Dossiers :
 

Bonjour.

Veuillez m'aider à comprendre comment travailler avec des fichiers.

Lorsque le programme est en cours d'exécution, je sauvegarde les données reçues dans un fichier et je lis le CSV.

Le fichier augmente, la vitesse diminue. J'ai essayé de mettre à jour (écraser) certains des éléments des lignes. Pas question !

Vous ne pouvez pas supprimer une ligne sélectionnée ! Je ne peux pas ajouter un nouvel élément à une ancienne ligne !

C'est très étrange ! Vous pouvez facilement supprimer un fichier ou un objet graphique, etc. Mais lorsqu'il s'agit de travailler avec un fichier créé, c'est une impasse absolue !

Sur les forums, il n'y a qu'une seule recommandation : "Lire le fichier en mémoire, modifier ou supprimer la ligne et enregistrer le nouveau fichier sous l'ancien nom".

Cela ne me semble pas être la bonne solution. J'ai dû rater quelque chose. Aidez-moi à résoudre ce problème.

 
im-zvv:

Ça ne me semble pas être la bonne décision. Je rate probablement quelque chose. Aidez-moi à résoudre ce problème.

Vous devriez être engagé de toute urgence par Microsoft pour corriger enfin cette"mauvaise solution" pour la gestion des fichiers.


Le traitement des fichiers n'est pas comme l'édition d'un fichier dans un éditeur de fichiers, c'est plutôt comme la fabrication d'un mot à partir de dés avec des lettres individuelles.
Si vous devez insérer une nouvelle lettre, tous les cubes qui la suivent doivent être déplacés vers la droite.
Si vous voulez supprimer une ancienne lettre, tous les dés qui la suivent doivent être déplacés vers la gauche.
Par conséquent, si le fichier n'est pas volumineux et que le travail ne nécessite pas l'accès au fichier, il est en effet plus facile d'écrire les données dans un nouveau fichier, de supprimer l'ancien et de renommer le nouveau fichier au nom de l'ancien.

Si je ne me trompe pas, la seule chose qui manque à MQL pour travailler avec des fichiers est la possibilité de réduire la longueur du fichier à la taille requise.


 
Alekseu Fedotov:

Voici un script pour travailler avec le temps.

Il est vieux, mais il fonctionne correctement.

J'utilisais aussi la fonction de Kim, puis j'ai trouvé le temps d'écrire la mienne :

//_______________________________________________________________________
class CWorkTime
  {
private:
   int               mday,mstarthour,mstophour,mstartmin,mstopmin;
   datetime          mstarttime,mstoptime;
   bool              UseThisSession;
   void inittime()
     {
      mday=Day();
      MqlDateTime dtstart,dtstop;
      TimeToStruct(TimeCurrent(),dtstart);
      dtstop=dtstart;
      dtstart.hour= mstarthour;
      dtstart.min = mstartmin;
      dtstop.hour = mstophour;
      dtstop.min = mstopmin;
      mstarttime = StructToTime(dtstart);
      mstoptime=StructToTime(dtstop);
     }
public:
   void              CWorkTime(void){};
   void              ~CWorkTime(void){};
   void              CWorkTime(int hstart,int mstart,int hstop,int mstop)
     {
      mstarthour=hstart;
      mstartmin = mstart;
      mstophour=hstop;
      mstopmin=mstop;
      UseThisSession=(mstarthour<0 || mstophour<0 || mstarthour>23 || mstophour>23) ? false : true;
      UseThisSession=(mstartmin<0 || mstopmin<0 || mstartmin>59 || mstopmin>59) ? false : true;
      if(UseThisSession) inittime(); else Print("Время работы советника не используется");
     };

   bool              Disable()
     {
      bool result=false;
      if(UseThisSession)
        {
         if(mday!=Day()) inittime();
         datetime t=TimeCurrent();
         result=t>=mstarttime && t<=mstoptime ? false : true;
        }
      return(result);
     };
  }
*Work;


.....

int OnInit()
{
   Work=new CWorkTime(StartHour,StartMinute,StopHour,StopMinute);
}

.....


void OnTick()
  {

if(Work.Disable())
{
 Comment("Не торговое время!!! Сопровождение открытых ордеров");
 }
else
{......
désactivation de l'exécution - vous devez entrer des données invalides lors de l'initialisation du constructeur, par exemple 25 heures ou 70 minutes
 
Sergey Dzyublik:

Vous devez être engagé de toute urgence par Microsoft pour qu'ils corrigent enfin cette"mauvaise solution" pour la gestion des fichiers.


Travailler avec des fichiers n'est pas comme éditer un fichier dans un éditeur de fichiers, c'est plutôt comme fabriquer un mot à partir de dés avec des lettres individuelles.
Si vous devez insérer une nouvelle lettre, tous les cubes qui la suivent doivent être déplacés vers la droite.
Si vous voulez supprimer une ancienne lettre, tous les dés qui la suivent doivent être déplacés vers la gauche.
Par conséquent, si le fichier n'est pas volumineux et que le travail ne nécessite pas l'accès au fichier, il est en effet plus facile d'écrire les données dans un nouveau fichier, de supprimer l'ancien et de renommer le nouveau fichier au nom de l'ancien.

Si je ne me trompe pas, la seule chose qui manque à MQL pour travailler avec des fichiers est la possibilité de réduire la longueur du fichier à la taille requise.


Merci. Bonne clarification. Malheureusement, mon fichier est très volumineux et je vais donc devoir travailler avec des "cubes".