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

 
Karputov Vladimir:
Dans un indicateur ou dans un EA/script ?
Dans un indicateur.
 

Yuri Evseenkov:

de moi à toi:

Une autre question : comment faire pression sur le développeur de l'environnement d'exécution du code MT4 et MQL, pour qu'il mette son esprit et sa main à développer un langage permettant de gérer les exceptions, comme dans mon exemple ou dans un sens similaire ?


Contactez servesdesk, créez un fil de discussion/sondage sur le forum.

Il n'y a pas si longtemps, MT4 était enterré. Ils n'ont pas une vision claire du marché, ils ont une vision claire de la régulation du marché.

Voir le post de Renat d'aujourd'hui :

Renat Fatkhullin:

...

Le développement de MT4 est arrêté et il n'y aura que des corrections et des cosmétiques.

 
Alex:

Bonjour. Pouvez-vous m'indiquer comment résoudre ce problème ? J'ai besoin de trouver les prix ouverts des barres à un certain moment, par exemple à 01:00, en analysant par exemple les 50 dernières barres. Je ne suis pas sûr de la façon de procéder pour cette tâche dans mql5.


Que ce soit en calculant la date actuelle + en y ajoutant le temps nécessaire puis en ajoutant vingt-quatre heures, cette méthode a fonctionné sur mql4.

D'après ce que j'ai compris, mql5 a des structures spéciales avec une sortie de temps, mais pour une raison quelconque, je ne peux pas les utiliser.

Merci d'avance pour la réponse.

Je serais très reconnaissant si quelqu'un pouvait me lancer un peu de code pour comprendre le processus de réflexion.
Alex:
Dans l'indicateur.

Ici, pour une meilleure compréhension, je conseille de regarder d'abord la numérotation des barres. Tout d'abord, nous devons comprendre comment est numérotée la barre la plus à droite de l'indicateur MQL5.

Pour ce faire, mettez le commentaire suivant dans l'indicateur de OnCalculate :

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property  indicator_type1   DRAW_LINE
#property  indicator_color1  Blue
//--- indicator buffers
double Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);
//---
   ArrayInitialize(Buffer,1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int 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 long &volume[],
                const int &spread[])
  {
//---
   Comment("rates_total=",IntegerToString(rates_total),
           ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Ce code produira ce résultat :

Numérotation dans les tableaux d'indicateurs MQL5, par défaut

C'est-à-dire que, par défaut, la barre la plus à droite dans les tableaux d'indicateurs MQL5 a un index égal à "rates_total-1".

Pour en revenir à votre question - vous devez prendre les 50 dernières mesures et les traverser. Et analyser le temps d'ouverture de la barre (le tableau time[]), si le temps de la barre est égal à celui spécifié, retenir l'index de la barre. Ensuite, obtenez le prix ouvert du tableau open[] en utilisant cet indice.

Ça ressemble à ça :

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots   0
//--- input parameters
input datetime time_open=D'01:00';     // время искомого бара
//--- parameters
int open_hour;                         // время искомого бара (часы)
int open_min;                          // время искомого бара (минуты)
bool first_start=false;                // false - значит бары ещё не искались
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   MqlDateTime str1;
   TimeToStruct(time_open,str1);
   open_hour=str1.hour;
   open_min=str1.min;
//---
   first_start=false;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int 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 long &volume[],
                const int &spread[])
  {
//---
//Comment("rates_total=",IntegerToString(rates_total),
//        ", time[rates_total-1]=",TimeToString(time[rates_total-1],TIME_DATE|TIME_MINUTES|TIME_SECONDS));
   if(!first_start)
     {
      int index=-1;
      for(int i=rates_total-1;i>rates_total-1-50;i--)
        {
         MqlDateTime str2;
         TimeToStruct(time[i],str2);
         if(str2.hour==open_hour && str2.min==open_min)
           {
            index=i;
            first_start=true;
            Print("Бар ",IntegerToString(i)," имеет время открытия ",TimeToString(time[i],TIME_DATE|TIME_MINUTES|TIME_SECONDS),
                  " и цену открытия ",DoubleToString(open[i],Digits()));
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:

Ici, pour que vous puissiez mieux comprendre par la suite, je vous conseille de commencer par regarder la numérotation des barres. C'est-à-dire que vous devez d'abord comprendre exactement comment est numérotée la barre la plus à droite dans l'indicateur MQL5.

Pour ce faire, mettez le commentaire suivant dans l'indicateur de OnCalculate :

Ce code produira ce résultat :


C'est-à-dire que, par défaut, la barre la plus à droite dans les tableaux d'indicateurs MQL5 a un index égal à "rates_total-1".

Pour en revenir à votre question - vous devez prendre les 50 dernières mesures et les traverser. Et analyser le temps d'ouverture de la barre (le tableau time[]), si le temps de la barre est égal à celui spécifié, retenir l'index de la barre. Ensuite, obtenez le prix ouvert du tableau open[] en utilisant cet indice.

Cela ressemble approximativement à ceci

Karputov Vladimir, merci beaucoup. Je vais m'en occuper. Je pense que mql5 a un accès plus flexible aux séries temporelles, mais c'est un peu compliqué pour les programmeurs "débutants". :))
 
Alex:
Karputov Vladimir, merci beaucoup. Je l'apprécie vraiment. Je pense que mql5 a un accès plus flexible aux séries temporelles, mais c'est un peu compliqué pour les programmeurs "débutants". :))
Il s'agit de s'y habituer. Vous comprendrez alors que tout est structuré, facile et correct.
 
Karputov Vladimir:
C'est une question d'habitude. Vous constaterez alors que tout est structuré, facile et correct.

Une autre question. Les paramètres

const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])


Je pense qu'ils sont responsables de la paire à laquelle l'indicateur est appliqué. Donc, il est impossible d'obtenir les mêmes informations sur une autre paire de devises ? En d'autres termes, la solution la plus universelle est de créer les mêmes tableaux de OCHL, uniquement par le biais de la fonction Copy... ?
 
Alex:

Une autre question. Paramètres

Je comprends qu'ils sont responsables de la paire à laquelle l'indicateur est appliqué. Et sortir avec leur aide les mêmes informations sur une autre paire de devises est impossible... Donc, la solution la plus universelle est de créer les mêmes tableaux OCHL uniquement par la fonction Copy... ?
Lorsque vous accédez aux symboles d'autrui, il existe des nuances que vous devez comprendre et connaître : l'organisation de l'accès aux données. En d'autres termes, si vous demandez des données de séries chronologiques du symbole de quelqu'un d'autre, vous devez d'abord vous assurer que ces données sont préparées et existent. C'est la seule façon d'être sûr que les données demandées à partir du symbole d'une autre personne sont correctes.
 
Karputov Vladimir:
Lorsque vous accédez aux caractères d'autres personnes, il existe des nuances que vous devez comprendre et connaître :Organiser l'accès aux données. En d'autres termes, si vous demandez les données de séries chronologiques de symboles de quelqu'un d'autre, vous devez d'abord vous assurer que ces données ont été préparées et existent. Ce n'est que de cette façon que vous pouvez être sûr que les données que vous demandez au personnage étranger sont correctes.

Je l'ai. Merci.

Une autre question est de savoir si vous convertissez toujours les valeurs en type chaîne de caractères dans la fonction Print(). Quel est le but de cette démarche ? Sans traduction, les types int, double, etc. sont affichés dans la fonction Print() exactement de la même manière.

 
Alex:

Je l'ai. Merci.

Autre question : convertissez-vous toujours les valeurs en chaînes de caractères dans la fonction Print() ? Quel est le but de cette démarche ? Sans traduction, les types int, double, etc. sont affichés dans Print() exactement de la même manière.

La façon dont un nombre est stocké dans la mémoire de l'ordinateur et la façon dont il est sorti sont deux grandes différences. En particulier avec les nombres à virgule flottante, il est toujours préférable de limiter le nombre de décimales.

C'est pourquoi j'essaie toujours de formater correctement la sortie - en utilisantIntegerToString etDoubleToString.

 
Karputov Vladimir:

La façon dont un nombre est stocké dans la mémoire de l'ordinateur et la façon dont il est sorti sont deux grandes différences. En particulier avec les nombres à virgule flottante, il est toujours préférable de limiter le nombre de décimales.

C'est pourquoi j'essaie toujours de formater correctement la sortie des nombres en utilisantIntegerToString etDoubleToString.

Merci pour vos réponses et votre patience.


Vladimir, je suis probablement fatigué de toi :) Mais les progrès dans les domaines de base sont très lents. J'ai essayé de faire une tâche de test avec la fonction Copy... L'indicateur n'est pas dessiné, bien qu'il y ait des chiffres à Printe... Je ne comprends rien.


//+------------------------------------------------------------------+
//|                                                        Bars.mq5 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot UpBar
#property  indicator_label1  "UpBar"
#property  indicator_type1   DRAW_HISTOGRAM
#property  indicator_color1  clrGreen
#property  indicator_style1  STYLE_SOLID
#property  indicator_width1  6
//--- plot DnBar
#property  indicator_label2  "DnBar"
#property  indicator_type2   DRAW_HISTOGRAM
#property  indicator_color2  clrRed
#property  indicator_style2  STYLE_SOLID
#property  indicator_width2  6
//--- input parameters
input int   Histori=30;
input ENUM_TIMEFRAMES TimeFrame=0; 
input string  Simvol="EURUSD";
//--- indicator buffers
double         UpBar[];
double         DnBar[];
double         O_Price[];
double         C_Price[];



  
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,UpBar,INDICATOR_DATA);
   SetIndexBuffer(1,UpBar,INDICATOR_DATA);
   SetIndexBuffer(2,O_Price,INDICATOR_CALCULATIONS);
   SetIndexBuffer(3,C_Price,INDICATOR_CALCULATIONS);



   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int 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 long &volume[],
                const int &spread[])
 {
ArraySetAsSeries(O_Price,true);
ArraySetAsSeries(C_Price,true);
CopyOpen(Simvol,TimeFrame,0,Histori,O_Price);
CopyClose(Simvol,TimeFrame,0,Histori,C_Price);

     for (int t=3; t<Histori; t++) 
       {
          UpBar[t]=MathAbs(NormalizeDouble((O_Price[t]-C_Price[t]),Digits()));   
          Print(DoubleToString(UpBar[t],Digits()));
       }

   return(rates_total);
  }
Raison: