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

 
Artyom Trishkin:
En quelque sorte (solution de @fxsaber) :

//+------------------------------------------------------------------+
//| Возвращает смещение бара по времени                              |
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=-1;
   datetime last_bar;
   if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
      if(time>last_bar) res=0;
      else {
         const int shift=Bars(symbol_name,timeframe,time,last_bar);
         if(shift>0) res=shift-1;
         }
      }
   return(res);
}
//+------------------------------------------------------------------+
Quelqu'un a écrit quelque part que dans la ligne sélectionnée vous devriez faire ceci : if (time>=last_bar) res=0 ;

Je ne l'ai pas vérifié, pour être honnête - je ne le reçois pas tout le temps. Vérifiez-le et écrivez le résultat, s'il vous plaît.
Je l'ai écrit. Et c'est logique, car si l'heure coïncide avec l'heure d'ouverture de la barre actuelle, son indice sera également de 0. Oui, la solution fxsaber pure fonctionnera avec des erreurs.
 
Alexey Kozitsyn:
Je ne sais pas si ma solution est "plus facile", mais essayez celle-ci : https://www.mql5.com/ru/forum/160945#comment_4053382.

Il n'y a pas de fonction standard dans la langue et chacun doit construire son propre vélo et ensuite mesurer ses performances?

Il semble que j'ai trouvé toutes les solutions sauf celle-ci, mais après avoir examiné les différentes solutions, il est évident qu'il s'agit de "qui peut faire quoi".

 
Vitaly Muzichenko:

Il n'y a pas de fonction standard dans la langue et chacun doit construire son propre vélo et ensuite mesurer ses performances?

Il me semble avoir trouvé toutes les solutions sauf celle-ci, mais après avoir examiné les différentes solutions, il est évident qu'il s'agit de "qui peut faire quoi".

Il n'y en a pas de standard. Vous avez fourni une variante de l'article https://www.mql5.com/ru/articles/81. La "béquille" y est également décrite.
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 

Une dernière question. Aujourd'hui dans la base de code j'ai vu un code d'un "master", donc il utilise ceci :

   double open_1=iOpen(1);
   double open_2=iOpen(2);
   double high_0=iHigh(0);
   double high_1=iHigh(1);
   double high_2=iHigh(2);
   double high_3=iHigh(3);
   double low_0=iLow(0);
   double low_1=iLow(1);
   double low_2=iLow(2);
   double low_3=iLow(3);
   double close_1=iClose(1);
   double close_2=iClose(2);


Hier encore, j'en ai écrit une semblable, mais de cette façon :

ArraySetAsSeries(Tick,true);
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
  open1 = Tick[0].open;  open2 = Tick[1].open;  open3 = Tick[2].open;
  high1 = Tick[0].high;  high2 = Tick[1].high;  high3 = Tick[2].high;
  low1  = Tick[0].low;   low2  = Tick[1].low;   low3  = Tick[2].low;
  close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;


Après ce que j'ai vu aujourd'hui, j'ai commencé à douter de la justesse de ma décision.

Question : Quelle option est la meilleure, car je suis en train d'apprendre ?

 
Vitaly Muzichenko:

Une dernière question. Aujourd'hui dans la base de code j'ai vu un code d'un "master", donc il utilise ceci :

   double open_1=iOpen(1);
   double open_2=iOpen(2);
   double high_0=iHigh(0);
   double high_1=iHigh(1);
   double high_2=iHigh(2);
   double high_3=iHigh(3);
   double low_0=iLow(0);
   double low_1=iLow(1);
   double low_2=iLow(2);
   double low_3=iLow(3);
   double close_1=iClose(1);
   double close_2=iClose(2);


Hier encore, j'ai écrit une chose similaire, mais de cette façon :

ArraySetAsSeries(Tick,true);
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
  open1 = Tick[0].open;  open2 = Tick[1].open;  open3 = Tick[2].open;
  high1 = Tick[0].high;  high2 = Tick[1].high;  high3 = Tick[2].high;
  low1  = Tick[0].low;   low2  = Tick[1].low;   low3  = Tick[2].low;
  close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;


Après ce que j'ai vu aujourd'hui, j'ai commencé à douter de la justesse de ma décision.

Question : Quelle variante est la meilleure, car je suis en train d'apprendre ?

Dans ce cas, votre implémentation devrait fonctionner plus rapidement - car il y a moins d'appels à la copie - vous copiez trois valeurs à la fois au lieu d'une.

Bien que personne ne vous empêche de convertir le code pour obtenir une valeur à la fois :

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }

en code pour obtenir plusieurs valeurs à la fois. Je suis juste paresseux :)

 
Vladimir Karputov:

Dans ce cas, votre implémentation devrait fonctionner plus rapidement - car il y a moins d'appels de copie - vous copiez trois valeurs à la fois au lieu d'une à la fois.

Bien que personne ne vous empêche de convertir le code pour obtenir une valeur à la fois :

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  }

en code pour obtenir plusieurs valeurs à la fois. Je suis juste paresseux :)

Merci pour la réponse !

Donc, il vaut mieux appliquer la solution que j'ai postée ? Il suffit d'un contrôle, il n'y aura pas d'erreurs ?

 
Vitaly Muzichenko:

Merci pour la réponse !

Alors, est-il préférable d'appliquer la solution que j'ai postée ? Un seul contrôle suffit, il n'y aura pas d'erreurs ?

CopyRates a besoin d'au moins deux contrôles :

  1. contrôle d'erreur (si ... <0)
  2. vérifier si la fonction a retourné la bonne quantité (que faire si vous avez demandé trois et que vous avez retourné seulement deux ?)
Également très souhaitable : vérifier les prix des déchets (il est possible que cela renvoie "0" au lieu du prix).

 
Vitaly Muzichenko:

Merci pour la réponse !

Alors, est-il préférable d'appliquer la solution que j'ai postée ? Un seul contrôle suffit, il n'y aura pas d'erreurs ?

Votre solution n'est pas optimale non plus, car vous initialisez un tas de variables avec les valeurs du tableau que vous avez déjà. La question est : pourquoi ? Quand seul un tableau peut être utilisé ? Nommez-le Bars et vous serez heureux :

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
 
Vasiliy Sokolov:

Votre solution n'est pas non plus optimale, car vous initialisez un tas de variables avec des valeurs provenant d'un tableau déjà dérivé. La question est : pourquoi ? Quand seul un tableau peut être utilisé ? Appelez-le Bars et vous serez heureux :

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...

Vous l'appelezBars et le compilateur vous donne une tape sur les doigts. Avez-vous vérifié cette construction ou avez-vous simplement supposé qu'elle devait fonctionner, ou est-ce que je fais quelque chose de mal ?

 
Vitaly Muzichenko:

AppeléBars, le compilateur est grondé comme l'enfer. Avez-vous testé cette conception, ou avez-vous simplement supposé qu'elle devait fonctionner ?

bars[]